diff --git a/packages/fiori/src/ViewSettingsDialog.hbs b/packages/fiori/src/ViewSettingsDialog.hbs index abdf133fbe84..cf78a800049b 100644 --- a/packages/fiori/src/ViewSettingsDialog.hbs +++ b/packages/fiori/src/ViewSettingsDialog.hbs @@ -34,12 +34,12 @@
diff --git a/packages/main/src/SegmentedButton.ts b/packages/main/src/SegmentedButton.ts index 2ea8677eb894..e3ce5877e250 100644 --- a/packages/main/src/SegmentedButton.ts +++ b/packages/main/src/SegmentedButton.ts @@ -28,7 +28,7 @@ import SegmentedButtonCss from "./generated/themes/SegmentedButton.css.js"; */ interface ISegmentedButtonItem extends UI5Element, ITabbable { disabled: boolean, - pressed: boolean, + selected: boolean, } type SegmentedButtonSelectionChangeEventDetail = { @@ -44,7 +44,6 @@ type SegmentedButtonSelectionChangeEventDetail = { * one of the items, it stays in a pressed state. It automatically resizes the items * to fit proportionally within the component. When no width is set, the component uses the available width. * - * **Note:** There can be just one selected `item` at a time. * * ### ES6 Module Import * @@ -172,7 +171,7 @@ class SegmentedButton extends UI5Element { switch (this.selectionMode) { case SegmentedButtonSelectionMode.Multiple: if (e instanceof KeyboardEvent) { - target.pressed = !target.pressed; + target.selected = !target.selected; } break; default: @@ -184,16 +183,15 @@ class SegmentedButton extends UI5Element { }); this._itemNavigation.setCurrentItem(target); - target.focus(); return this; } _applySingleSelection(item: ISegmentedButtonItem) { this.items.forEach(currentItem => { - currentItem.pressed = false; + currentItem.selected = false; }); - item.pressed = true; + item.selected = true; this._selectedItem = item; } @@ -236,8 +234,8 @@ class SegmentedButton extends UI5Element { // If the component is focused for the first time // focus the selected item if such is present if (this.selectedItems.length) { - this.selectedItems[0].focus(); this._itemNavigation.setCurrentItem(this.selectedItems[0]); + this.selectedItems[0].focus(); this.hasPreviouslyFocusedItem = true; } } @@ -249,7 +247,7 @@ class SegmentedButton extends UI5Element { * @default [] */ get selectedItems(): Array { - return this.items.filter(item => item.pressed); + return this.items.filter(item => item.selected); } get ariaDescribedBy() { diff --git a/packages/main/src/SegmentedButtonItem.hbs b/packages/main/src/SegmentedButtonItem.hbs index 22206138cc49..f6a50a1ad3ff 100644 --- a/packages/main/src/SegmentedButtonItem.hbs +++ b/packages/main/src/SegmentedButtonItem.hbs @@ -3,39 +3,29 @@ aria-roledescription="{{ariaDescription}}" aria-posinset="{{posInSet}}" aria-setsize="{{sizeOfSet}}" - aria-selected="{{pressed}}" - class="ui5-button-root" + aria-selected="{{selected}}" + class="ui5-segmented-button-item-root" aria-disabled="{{disabled}}" data-sap-focus-ref - {{> ariaPressed}} - @focusout={{_onfocusout}} - @focusin={{_onfocusin}} @click={{_onclick}} - @mousedown={{_onmousedown}} - @mouseup={{_onmouseup}} - @keydown={{_onkeydown}} @keyup={{_onkeyup}} - @touchstart="{{_ontouchstart}}" - @touchend="{{_ontouchend}}" tabindex={{tabIndexValue}} aria-label="{{ariaLabelText}}" title="{{tooltip}}" > {{#if icon}} {{/if}} - + - -{{#*inline "ariaPressed"}}{{/inline}} diff --git a/packages/main/src/SegmentedButtonItem.ts b/packages/main/src/SegmentedButtonItem.ts index 20592f43fd80..ae6e10171c8d 100644 --- a/packages/main/src/SegmentedButtonItem.ts +++ b/packages/main/src/SegmentedButtonItem.ts @@ -1,19 +1,23 @@ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js"; import property from "@ui5/webcomponents-base/dist/decorators/property.js"; - +import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js"; +import I18nBundle, { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js"; +import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js"; +import { isSpaceShift } from "@ui5/webcomponents-base/dist/Keys.js"; +import { getEffectiveAriaLabelText } from "@ui5/webcomponents-base/dist/util/AriaLabelHelper.js"; +import willShowContent from "@ui5/webcomponents-base/dist/util/willShowContent.js"; +import slot from "@ui5/webcomponents-base/dist/decorators/slot.js"; +import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js"; import Integer from "@ui5/webcomponents-base/dist/types/Integer.js"; + +import { SEGMENTEDBUTTONITEM_ARIA_DESCRIPTION } from "./generated/i18n/i18n-defaults.js"; import type { ISegmentedButtonItem } from "./SegmentedButton.js"; import SegmentedButtonItemTemplate from "./generated/templates/SegmentedButtonItemTemplate.lit.js"; -import ToggleButton from "./ToggleButton.js"; -import ButtonDesign from "./types/ButtonDesign.js"; -import ButtonType from "./types/ButtonType.js"; -import ButtonAccessibleRole from "./types/ButtonAccessibleRole.js"; -import { AccessibilityAttributes } from "./Button.js"; +import { IButton } from "./Button.js"; import Icon from "./Icon.js"; -import { SEGMENTEDBUTTONITEM_ARIA_DESCRIPTION } from "./generated/i18n/i18n-defaults.js"; - +import segmentedButtonItemCss from "./generated/themes/SegmentedButtonItem.css.js"; /** * @class * @@ -21,7 +25,7 @@ import { SEGMENTEDBUTTONITEM_ARIA_DESCRIPTION } from "./generated/i18n/i18n-defa * * Users can use the `ui5-segmented-button-item` as part of a `ui5-segmented-button`. * - * Clicking or tapping on a `ui5-segmented-button-item` changes its state to `pressed`. + * Clicking or tapping on a `ui5-segmented-button-item` changes its state to `selected`. * The item returns to its initial state when the user clicks or taps on it again. * By applying additional custom CSS-styling classes, apps can give a different style to any * `ui5-segmented-button-item`. @@ -30,63 +34,72 @@ import { SEGMENTEDBUTTONITEM_ARIA_DESCRIPTION } from "./generated/i18n/i18n-defa * * `import "@ui5/webcomponents/dist/SegmentedButtonItem.js";` * @constructor - * @extends ToggleButton - * @implements { ISegmentedButtonItem } + * @extends UI5Element + * @implements { ISegmentedButtonItem, IButton } * @public */ @customElement({ tag: "ui5-segmented-button-item", + renderer: litRender, template: SegmentedButtonItemTemplate, + styles: segmentedButtonItemCss, dependencies: [Icon], }) -class SegmentedButtonItem extends ToggleButton implements ISegmentedButtonItem { +class SegmentedButtonItem extends UI5Element implements IButton, ISegmentedButtonItem { /** - * **Note:** The property is inherited and not supported. If set, it won't take any effect. - * @default "Default" + * Defines whether the component is disabled. + * A disabled component can't be selected or + * focused, and it is not in the tab chain. + * @default false * @public */ - @property({ type: ButtonDesign, defaultValue: ButtonDesign.Default }) - declare design: `${ButtonDesign}`; + @property({ type: Boolean }) + disabled!: boolean; /** - * **Note:** The property is inherited and not supported. If set, it won't take any effect. + * Determines whether the component is displayed as selected. * @default false * @public */ @property({ type: Boolean }) - declare iconEnd: boolean; + selected!: boolean; /** - * **Note:** The property is inherited and not supported. If set, it won't take any effect. - * @default false + * Defines the tooltip of the component. + * + * **Note:** A tooltip attribute should be provided for icon-only buttons, in order to represent their exact meaning/function. + * @default "" * @public + * @since 1.2.0 */ - @property({ type: Boolean }) - declare submits: boolean; + @property() + tooltip!: string; /** - * **Note:** The property is inherited and not supported. If set, it won't take any effect. - * @default {} + * Defines the icon, displayed as graphical element within the component. + * The SAP-icons font provides numerous options. + * + * Example: + * See all the available icons within the [Icon Explorer](https://sdk.openui5.org/test-resources/sap/m/demokit/iconExplorer/webapp/index.html). + * @default "" * @public */ - @property({ type: Object }) - declare accessibilityAttributes: AccessibilityAttributes; + @property() + icon!: string; /** - * **Note:** The property is inherited and not supported. If set, it won't take any effect. - * @default "Button" - * @public + * Indicates if the element is focusable + * @private */ - @property({ type: ButtonType, defaultValue: ButtonType.Button }) - declare type: `${ButtonType}`; + @property({ type: Boolean }) + nonInteractive!: boolean; /** - * **Note:** The property is inherited and not supported. If set, it won't take any effect. - * @default "Button" - * @public + * Defines the tabIndex of the component. + * @private */ - @property({ type: ButtonAccessibleRole, defaultValue: ButtonAccessibleRole.Button }) - declare accessibleRole: `${ButtonAccessibleRole}`; + @property({ type: String, defaultValue: "0", noAttribute: true }) + forcedTabIndex!: string; /** * Defines the index of the item inside of the SegmentedButton. @@ -104,9 +117,66 @@ class SegmentedButtonItem extends ToggleButton implements ISegmentedButtonItem { @property({ validator: Integer, defaultValue: 0 }) sizeOfSet!: number; + /** + * Defines the text of the component. + * + * **Note:** Although this slot accepts HTML Elements, it is strongly recommended that you only use text in order to preserve the intended design. + * @public + */ + @slot({ type: Node, "default": true }) + text!: Array; + + static i18nBundle: I18nBundle; + get ariaDescription() { return SegmentedButtonItem.i18nBundle.getText(SEGMENTEDBUTTONITEM_ARIA_DESCRIPTION); } + + constructor() { + super(); + } + + _onclick() { + this.selected = !this.selected; + } + + onEnterDOM() { + if (isDesktop()) { + this.setAttribute("desktop", ""); + } + } + + _onkeyup(e: KeyboardEvent) { + if (isSpaceShift(e)) { + e.preventDefault(); + } + } + + get isIconOnly() { + return !willShowContent(this.text); + } + + get tabIndexValue() { + const tabindex = this.getAttribute("tabindex"); + + if (tabindex) { + return tabindex; + } + + return this.forcedTabIndex; + } + + get ariaLabelText() { + return getEffectiveAriaLabelText(this); + } + + get showIconTooltip() { + return this.isIconOnly && !this.tooltip; + } + + static async onDefine() { + SegmentedButtonItem.i18nBundle = await getI18nBundle("@ui5/webcomponents"); + } } SegmentedButtonItem.define(); diff --git a/packages/main/src/TimePickerInternals.ts b/packages/main/src/TimePickerInternals.ts index cc38607bedcb..252431b526fe 100644 --- a/packages/main/src/TimePickerInternals.ts +++ b/packages/main/src/TimePickerInternals.ts @@ -34,7 +34,7 @@ type TimePickerComponentIndexMap = { type TimeSelectionPeriodProperties = { label: string, - pressed: boolean, + selected: boolean, } type TimeSelectionChangeEventDetail = { @@ -421,7 +421,7 @@ class TimePickerInternals extends UI5Element { this.periodsArray.forEach(item => { this._periods.push({ "label": item, - "pressed": this._period === item, + "selected": this._period === item, }); }); } diff --git a/packages/main/src/TimeSelectionClocks.hbs b/packages/main/src/TimeSelectionClocks.hbs index 85e598f85737..561e87f87d7f 100644 --- a/packages/main/src/TimeSelectionClocks.hbs +++ b/packages/main/src/TimeSelectionClocks.hbs @@ -38,7 +38,7 @@ > {{#each _periods}} {{this.label}} diff --git a/packages/main/src/TimeSelectionClocks.ts b/packages/main/src/TimeSelectionClocks.ts index a78496026944..74f77f72a958 100644 --- a/packages/main/src/TimeSelectionClocks.ts +++ b/packages/main/src/TimeSelectionClocks.ts @@ -212,8 +212,8 @@ class TimeSelectionClocks extends TimePickerInternals { // A/P selects AM/PM segmented button item const buttonAmPm = this._buttonAmPm(); if (buttonAmPm) { - buttonAmPm.items[0].pressed = isKeyA(evt); - buttonAmPm.items[1].pressed = isKeyP(evt); + buttonAmPm.items[0].selected = isKeyA(evt); + buttonAmPm.items[1].selected = isKeyP(evt); const period = isKeyA(evt) ? buttonAmPm.items[0].textContent : buttonAmPm.items[1].textContent; period && this._calculatePeriodChange(period); } diff --git a/packages/main/src/TimeSelectionInputs.hbs b/packages/main/src/TimeSelectionInputs.hbs index 52693d720604..ca214ab16890 100644 --- a/packages/main/src/TimeSelectionInputs.hbs +++ b/packages/main/src/TimeSelectionInputs.hbs @@ -31,7 +31,7 @@ > {{#each _periods}} {{this.label}} diff --git a/packages/main/src/themes/SegmentedButton.css b/packages/main/src/themes/SegmentedButton.css index d640c6427e01..dfc585393a8c 100644 --- a/packages/main/src/themes/SegmentedButton.css +++ b/packages/main/src/themes/SegmentedButton.css @@ -36,14 +36,14 @@ background-color: var(--sapButton_Hover_Background); } -::slotted([ui5-segmented-button-item][pressed]), +::slotted([ui5-segmented-button-item][selected]), ::slotted([ui5-segmented-button-item][active]) { border-color: var(--sapButton_Selected_BorderColor); background-color: var(--sapButton_Selected_Background); color: var(--sapButton_Selected_TextColor); } -::slotted([ui5-segmented-button-item][pressed]:hover) { +::slotted([ui5-segmented-button-item][selected]:hover) { border-color: var(--sapButton_Selected_Hover_BorderColor); background-color: var(--sapButton_Selected_Hover_Background); color: var(--sapButton_Selected_TextColor); diff --git a/packages/main/src/themes/SegmentedButtonItem.css b/packages/main/src/themes/SegmentedButtonItem.css new file mode 100644 index 000000000000..19736b8543f6 --- /dev/null +++ b/packages/main/src/themes/SegmentedButtonItem.css @@ -0,0 +1,158 @@ +@import "./FormComponents.css"; + +:host(:not([hidden])) { + display: inline-block; +} + +:host { + min-width: var(--_ui5_button_base_min_width); + height: var(--_ui5_button_base_height); + line-height: normal; + font-family: var(--_ui5_button_fontFamily); + font-size: var(--sapFontSize); + text-shadow: var(--_ui5_button_text_shadow); + border-radius: var(--_ui5_button_border_radius); + cursor: pointer; + background-color: var(--sapButton_Background); + border: var(--sapButton_BorderWidth) solid var(--sapButton_BorderColor); + color: var(--sapButton_TextColor); + box-sizing: border-box; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.ui5-segmented-button-item-root { + min-width: inherit; + cursor: inherit; + height: 100%; + width: 100%; + box-sizing: border-box; + display: flex; + justify-content: center; + align-items: center; + outline: none; + padding: 0 var(--_ui5_button_base_padding); + position: relative; + background: transparent; + border: none; + color: inherit; + text-shadow: inherit; + font: inherit; + white-space: inherit; + overflow: inherit; + text-overflow: inherit; + letter-spacing: inherit; + word-spacing: inherit; + line-height: inherit; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +:host(:not([active]):not([non-interactive]):not([_is-touch]):not([disabled]):hover), +:host(:not([hidden]):not([disabled]).ui5_hovered) { + background: var(--sapButton_Hover_Background); + border: 0.0625rem solid var(--sapButton_Hover_BorderColor); + color: var(--sapButton_Hover_TextColor); +} + +.ui5-segmented-button-item-icon { + color: inherit; + flex-shrink: 0; +} + +:host([icon-end]) .ui5-segmented-button-item-root { + flex-direction: row-reverse; +} + +:host([icon-end]) .ui5-segmented-button-item-icon { + margin-inline-start: var(--_ui5_button_base_icon_margin); +} + +:host([icon-only]) .ui5-segmented-button-item-root { + min-width: auto; + padding: 0; +} + +:host([icon-only]) .ui5-segmented-button-item-text { + display: none; +} + +.ui5-segmented-button-item-text { + outline: none; + position: relative; + white-space: inherit; + overflow: inherit; + text-overflow: inherit; +} + +:host([has-icon]:not([icon-end])) .ui5-segmented-button-item-text { + margin-inline-start: var(--_ui5_button_base_icon_margin); +} + +:host([has-icon][icon-end]) .ui5-segmented-button-item-text { + margin-inline-start: 0; +} + +:host([disabled]) { + opacity: var(--sapContent_DisabledOpacity); + pointer-events: unset; + cursor: default; +} + +:host([has-icon]:not([icon-only])) .ui5-segmented-button-item-text{ + /* calculating the minimum width by removing the icon size */ + min-width: calc(var(--_ui5_button_base_min_width) - var(--_ui5_button_base_icon_margin) - 1rem); +} +:host([disabled]:active) { + pointer-events: none; +} + +:host([desktop]:not([active])) .ui5-segmented-button-item-root:focus-within:after, +:host(:not([active])) .ui5-segmented-button-item-root:focus-visible:after, +:host([desktop][active]) .ui5-segmented-button-item-root:focus-within:before, +:host([active]) .ui5-segmented-button-item-root:focus-visible:before { + content: ""; + position: absolute; + box-sizing: border-box; + inset: 0.0625rem; + border: var(--_ui5_button_focused_border); + border-radius: var(--_ui5_button_focused_border_radius); +} + +:host([desktop][active]) .ui5-segmented-button-item-root:focus-within:before, +:host([active]) .ui5-segmented-button-item-root:focus-visible:before { + border-color: var(--_ui5_button_pressed_focused_border_color); +} + +.ui5-segmented-button-item-root::-moz-focus-inner { + border: 0; +} + +bdi { + display: block; + white-space: inherit; + overflow: inherit; + text-overflow: inherit; +} + +:host([active][desktop]) .ui5-segmented-button-item-root:focus-within:after, +:host([active]) .ui5-segmented-button-item-root:focus-visible:after, +:host([selected][desktop]) .ui5-segmented-button-item-root:focus-within:after, +:host([selected]) .ui5-segmented-button-item-root:focus-visible:after { + border-color: var(--_ui5_button_pressed_focused_border_color); + outline: none; +} + +:host([desktop]:not(:last-child)) .ui5-segmented-button-item-root:focus-within:after, +:host(:not(:last-child)) .ui5-segmented-button-item-root:focus-visible:after { + border-start-end-radius: var(--_ui5_button_focused_inner_border_radius); + border-end-end-radius: var(--_ui5_button_focused_inner_border_radius); +} + +:host([desktop]:not(:first-child)) .ui5-segmented-button-item-root:focus-within:after, +:host(:not(:first-child)) .ui5-segmented-button-item-root:focus-visible:after { + border-start-start-radius: var(--_ui5_button_focused_inner_border_radius); + border-end-start-radius: var(--_ui5_button_focused_inner_border_radius); +} \ No newline at end of file diff --git a/packages/main/src/themes/base/SegmentedButtonItem-parameters.css b/packages/main/src/themes/base/SegmentedButtonItem-parameters.css new file mode 100644 index 000000000000..37254a0b2a87 --- /dev/null +++ b/packages/main/src/themes/base/SegmentedButtonItem-parameters.css @@ -0,0 +1 @@ +@import "./Button-parameters.css"; \ No newline at end of file diff --git a/packages/main/src/themes/sap_fiori_3/SegmentedButtonItem-parameters.css b/packages/main/src/themes/sap_fiori_3/SegmentedButtonItem-parameters.css new file mode 100644 index 000000000000..37254a0b2a87 --- /dev/null +++ b/packages/main/src/themes/sap_fiori_3/SegmentedButtonItem-parameters.css @@ -0,0 +1 @@ +@import "./Button-parameters.css"; \ No newline at end of file diff --git a/packages/main/src/themes/sap_fiori_3/parameters-bundle.css b/packages/main/src/themes/sap_fiori_3/parameters-bundle.css index ac8f732a1868..500a2475eb87 100644 --- a/packages/main/src/themes/sap_fiori_3/parameters-bundle.css +++ b/packages/main/src/themes/sap_fiori_3/parameters-bundle.css @@ -33,6 +33,7 @@ @import "../base/RadioButton-parameters.css"; @import "../base/RatingIndicator-parameters.css"; @import "../base/SegmentedButtton-parameters.css"; +@import "./SegmentedButtonItem-parameters.css"; @import "../base/Select-parameters.css"; @import "../base/SplitButton-parameters.css"; @import "../base/Switch-parameters.css"; diff --git a/packages/main/src/themes/sap_fiori_3_dark/SegmentedButtonItem-parameters.css b/packages/main/src/themes/sap_fiori_3_dark/SegmentedButtonItem-parameters.css new file mode 100644 index 000000000000..37254a0b2a87 --- /dev/null +++ b/packages/main/src/themes/sap_fiori_3_dark/SegmentedButtonItem-parameters.css @@ -0,0 +1 @@ +@import "./Button-parameters.css"; \ No newline at end of file diff --git a/packages/main/src/themes/sap_fiori_3_dark/parameters-bundle.css b/packages/main/src/themes/sap_fiori_3_dark/parameters-bundle.css index b3c51102e972..7e35512b8dc6 100644 --- a/packages/main/src/themes/sap_fiori_3_dark/parameters-bundle.css +++ b/packages/main/src/themes/sap_fiori_3_dark/parameters-bundle.css @@ -33,6 +33,7 @@ @import "../base/RadioButton-parameters.css"; @import "../base/RatingIndicator-parameters.css"; @import "../base/SegmentedButtton-parameters.css"; +@import "./SegmentedButtonItem-parameters.css"; @import "../base/Select-parameters.css"; @import "../base/SplitButton-parameters.css"; @import "../base/Switch-parameters.css"; diff --git a/packages/main/src/themes/sap_fiori_3_hcb/SegmentedButtonItem-parameters.css b/packages/main/src/themes/sap_fiori_3_hcb/SegmentedButtonItem-parameters.css new file mode 100644 index 000000000000..37254a0b2a87 --- /dev/null +++ b/packages/main/src/themes/sap_fiori_3_hcb/SegmentedButtonItem-parameters.css @@ -0,0 +1 @@ +@import "./Button-parameters.css"; \ No newline at end of file diff --git a/packages/main/src/themes/sap_fiori_3_hcb/parameters-bundle.css b/packages/main/src/themes/sap_fiori_3_hcb/parameters-bundle.css index 281e71d3b2b9..c3c75b40450b 100644 --- a/packages/main/src/themes/sap_fiori_3_hcb/parameters-bundle.css +++ b/packages/main/src/themes/sap_fiori_3_hcb/parameters-bundle.css @@ -35,6 +35,7 @@ @import "./RadioButton-parameters.css"; @import "../base/RatingIndicator-parameters.css"; @import "../base/SegmentedButtton-parameters.css"; +@import "./SegmentedButtonItem-parameters.css"; @import "./Select-parameters.css"; @import "./SplitButton-parameters.css"; @import "./Switch-parameters.css"; diff --git a/packages/main/src/themes/sap_fiori_3_hcw/SegmentedButtonItem-parameters.css b/packages/main/src/themes/sap_fiori_3_hcw/SegmentedButtonItem-parameters.css new file mode 100644 index 000000000000..37254a0b2a87 --- /dev/null +++ b/packages/main/src/themes/sap_fiori_3_hcw/SegmentedButtonItem-parameters.css @@ -0,0 +1 @@ +@import "./Button-parameters.css"; \ No newline at end of file diff --git a/packages/main/src/themes/sap_fiori_3_hcw/parameters-bundle.css b/packages/main/src/themes/sap_fiori_3_hcw/parameters-bundle.css index a3e7b00046e1..e32fd2a22a0e 100644 --- a/packages/main/src/themes/sap_fiori_3_hcw/parameters-bundle.css +++ b/packages/main/src/themes/sap_fiori_3_hcw/parameters-bundle.css @@ -34,6 +34,7 @@ @import "./RadioButton-parameters.css"; @import "../base/RatingIndicator-parameters.css"; @import "../base/SegmentedButtton-parameters.css"; +@import "./SegmentedButtonItem-parameters.css"; @import "./Select-parameters.css"; @import "./SplitButton-parameters.css"; @import "./Switch-parameters.css"; diff --git a/packages/main/src/themes/sap_horizon/SegmentedButtonItem-parameters.css b/packages/main/src/themes/sap_horizon/SegmentedButtonItem-parameters.css new file mode 100644 index 000000000000..37254a0b2a87 --- /dev/null +++ b/packages/main/src/themes/sap_horizon/SegmentedButtonItem-parameters.css @@ -0,0 +1 @@ +@import "./Button-parameters.css"; \ No newline at end of file diff --git a/packages/main/src/themes/sap_horizon/parameters-bundle.css b/packages/main/src/themes/sap_horizon/parameters-bundle.css index e7f91d64aacb..988cce34f753 100644 --- a/packages/main/src/themes/sap_horizon/parameters-bundle.css +++ b/packages/main/src/themes/sap_horizon/parameters-bundle.css @@ -37,6 +37,7 @@ @import "../base/RadioButton-parameters.css"; @import "./RatingIndicator-parameters.css"; @import "./SegmentedButtton-parameters.css"; +@import "./SegmentedButtonItem-parameters.css"; @import "./RadioButton-parameters.css"; @import "./Switch-parameters.css"; @import "./Select-parameters.css"; diff --git a/packages/main/src/themes/sap_horizon_dark/SegmentedButtonItem-parameters.css b/packages/main/src/themes/sap_horizon_dark/SegmentedButtonItem-parameters.css new file mode 100644 index 000000000000..37254a0b2a87 --- /dev/null +++ b/packages/main/src/themes/sap_horizon_dark/SegmentedButtonItem-parameters.css @@ -0,0 +1 @@ +@import "./Button-parameters.css"; \ No newline at end of file diff --git a/packages/main/src/themes/sap_horizon_dark/parameters-bundle.css b/packages/main/src/themes/sap_horizon_dark/parameters-bundle.css index 14e048dd8509..83addf25b1ea 100644 --- a/packages/main/src/themes/sap_horizon_dark/parameters-bundle.css +++ b/packages/main/src/themes/sap_horizon_dark/parameters-bundle.css @@ -36,8 +36,9 @@ @import "../sap_horizon/ProgressIndicator-parameters.css"; @import "../base/RadioButton-parameters.css"; @import "./RatingIndicator-parameters.css"; -@import "./SegmentedButtton-parameters.css"; @import "./RadioButton-parameters.css"; +@import "./SegmentedButtton-parameters.css"; +@import "./SegmentedButtonItem-parameters.css"; @import "./Switch-parameters.css"; @import "./Select-parameters.css"; @import "./SelectPopover-parameters.css"; diff --git a/packages/main/src/themes/sap_horizon_hcb/SegmentedButtonItem-parameters.css b/packages/main/src/themes/sap_horizon_hcb/SegmentedButtonItem-parameters.css new file mode 100644 index 000000000000..37254a0b2a87 --- /dev/null +++ b/packages/main/src/themes/sap_horizon_hcb/SegmentedButtonItem-parameters.css @@ -0,0 +1 @@ +@import "./Button-parameters.css"; \ No newline at end of file diff --git a/packages/main/src/themes/sap_horizon_hcb/parameters-bundle.css b/packages/main/src/themes/sap_horizon_hcb/parameters-bundle.css index 73a4ad916d4c..0d827e2a3919 100644 --- a/packages/main/src/themes/sap_horizon_hcb/parameters-bundle.css +++ b/packages/main/src/themes/sap_horizon_hcb/parameters-bundle.css @@ -35,6 +35,7 @@ @import "./RadioButton-parameters.css"; @import "./RatingIndicator-parameters.css"; @import "./SegmentedButtton-parameters.css"; +@import "./SegmentedButtonItem-parameters.css"; @import "./Select-parameters.css"; @import "./SplitButton-parameters.css"; @import "./Switch-parameters.css"; diff --git a/packages/main/src/themes/sap_horizon_hcw/SegmentedButtonItem-parameters.css b/packages/main/src/themes/sap_horizon_hcw/SegmentedButtonItem-parameters.css new file mode 100644 index 000000000000..37254a0b2a87 --- /dev/null +++ b/packages/main/src/themes/sap_horizon_hcw/SegmentedButtonItem-parameters.css @@ -0,0 +1 @@ +@import "./Button-parameters.css"; \ No newline at end of file diff --git a/packages/main/src/themes/sap_horizon_hcw/parameters-bundle.css b/packages/main/src/themes/sap_horizon_hcw/parameters-bundle.css index de77a4c91b77..9ba243f90da2 100644 --- a/packages/main/src/themes/sap_horizon_hcw/parameters-bundle.css +++ b/packages/main/src/themes/sap_horizon_hcw/parameters-bundle.css @@ -35,6 +35,7 @@ @import "./RadioButton-parameters.css"; @import "./RatingIndicator-parameters.css"; @import "./SegmentedButtton-parameters.css"; +@import "./SegmentedButtonItem-parameters.css"; @import "./Select-parameters.css"; @import "./SplitButton-parameters.css"; @import "./Switch-parameters.css"; diff --git a/packages/main/test/pages/FormComponents.html b/packages/main/test/pages/FormComponents.html index 07ff8364afea..c7855478308e 100644 --- a/packages/main/test/pages/FormComponents.html +++ b/packages/main/test/pages/FormComponents.html @@ -25,7 +25,7 @@ ui5-segmented-button Map - Satellite + Satellite Terrain ui5-split-button diff --git a/packages/main/test/pages/RTL.html b/packages/main/test/pages/RTL.html index 14b7b34183f5..68c97a451a2e 100644 --- a/packages/main/test/pages/RTL.html +++ b/packages/main/test/pages/RTL.html @@ -11,7 +11,7 @@
- EN + EN DE BG ES diff --git a/packages/main/test/pages/SegmentedButton.html b/packages/main/test/pages/SegmentedButton.html index c9b44803686d..9afc7c4197ee 100644 --- a/packages/main/test/pages/SegmentedButton.html +++ b/packages/main/test/pages/SegmentedButton.html @@ -88,7 +88,7 @@

Segmentedbutton example

- + SegmentedButtonItem Item @@ -101,7 +101,7 @@

Example with 4 items

Item Item Click - Pressed SegmentedButtonItem + selected SegmentedButtonItem
@@ -109,11 +109,11 @@

Example with 4 items

Example with 5 items

- Word - Pressed SegmentedButtonItem With Bigger Text - Item - Pressed SegmentedButtonItem - A + Word + selected SegmentedButtonItem With Bigger Text + Item + selected SegmentedButtonItem + A @@ -122,7 +122,7 @@

Example with Icons and custom width

- + @@ -131,7 +131,7 @@

Example with Icons and custom width

SegmentedButton with 100% width

- Pressed SegmentedButtonItem + selected SegmentedButtonItem SegmentedButtonItem SegmentedButtonItem @@ -141,7 +141,7 @@

SegmentedButton with 100% width

SegmentedButton wrapped in a container with set width

- + @@ -163,7 +163,7 @@

Initial focus test

Press - + @@ -171,33 +171,34 @@

Initial focus test

Programatical change test

- First + First Second Third Press second item Press multiple items - Press pressed item + Press selected item Press first item
diff --git a/packages/main/test/specs/SegmentedButton.spec.js b/packages/main/test/specs/SegmentedButton.spec.js index ab749d279174..75e8b743e7a3 100644 --- a/packages/main/test/specs/SegmentedButton.spec.js +++ b/packages/main/test/specs/SegmentedButton.spec.js @@ -5,17 +5,17 @@ describe("SegmentedButton general interaction", () => { await browser.url(`test/pages/SegmentedButton.html`); }); - it("tests if pressed and tooltip attributes are applied", async () => { + it("tests if selected and tooltip attributes are applied", async () => { const segmentedButtonItem = await browser.$("#segButton1 > ui5-segmented-button-item:first-child"); - const segmentedButtonItemInner = await segmentedButtonItem.shadow$(".ui5-button-root"); + const segmentedButtonItemInner = await segmentedButtonItem.shadow$(".ui5-segmented-button-item-root"); - assert.ok(await segmentedButtonItem.getProperty("pressed"), "SegmentedButtonItem has property pressed"); + assert.ok(await segmentedButtonItem.getProperty("selected"), "SegmentedButtonItem has property selected"); assert.strictEqual(await segmentedButtonItemInner.getProperty("title"), "Employee", "SegmentedButtonItem root element has property title"); }); - it("tests if pressed attribute is switched to the newly pressed item when selected with enter key", async () => { + it("tests if selected attribute is switched to the newly selected item when selected with enter key", async () => { const firstSegmentedButtonItem = await browser.$("#segButton1 > ui5-segmented-button-item:first-child"); const secondSegmentedButtonItem = await browser.$("#segButton1 > ui5-segmented-button-item:nth-child(2)"); @@ -23,42 +23,42 @@ describe("SegmentedButton general interaction", () => { await firstSegmentedButtonItem.keys("ArrowRight"); await browser.keys("Enter"); - assert.notOk(await firstSegmentedButtonItem.getProperty("pressed"), "First SegmentedButtonItem should not be pressed anymore"); - assert.ok(await secondSegmentedButtonItem.getProperty("pressed"), "Second SegmentedButtonItem has property pressed"); + assert.notOk(await firstSegmentedButtonItem.getProperty("selected"), "First SegmentedButtonItem should not be selected anymore"); + assert.ok(await secondSegmentedButtonItem.getProperty("selected"), "Second SegmentedButtonItem has property selected"); }); - it("tests if pressed attribute is switched to the newly pressed item when selected with space key", async () => { + it("tests if selected attribute is switched to the newly selected item when selected with space key", async () => { const secondSegmentedButtonItem = await browser.$("#segButton1 > ui5-segmented-button-item:nth-child(2)"); const lastSegmentedButtonItem = await browser.$("#segButton1 > ui5-segmented-button-item:last-child"); await secondSegmentedButtonItem.keys("ArrowRight"); await browser.keys("Space"); - assert.notOk(await secondSegmentedButtonItem.getProperty("pressed"), "Second SegmentedButtonItem should not be pressed anymore"); - assert.ok(await lastSegmentedButtonItem.getProperty("pressed"), "Last SegmentedButtonItem has property pressed"); + assert.notOk(await secondSegmentedButtonItem.getProperty("selected"), "Second SegmentedButtonItem should not be selected anymore"); + assert.ok(await lastSegmentedButtonItem.getProperty("selected"), "Last SegmentedButtonItem has property selected"); }); - it("tests if pressed attribute is switched to the newly pressed item when selected with mouse", async () => { + it("tests if selected attribute is switched to the newly selected item when selected with mouse", async () => { const firstSegmentedButtonItem = await browser.$("#segButton1 > ui5-segmented-button-item:first-child"); const lastSegmentedButtonItem = await browser.$("#segButton1 > ui5-segmented-button-item:last-child"); await firstSegmentedButtonItem.click(); - assert.ok(await firstSegmentedButtonItem.getProperty("pressed"), "First SegmentedButtonItem has property pressed"); - assert.notOk(await lastSegmentedButtonItem.getProperty("pressed"), "Last SegmentedButtonItem should not be pressed anymore"); + assert.ok(await firstSegmentedButtonItem.getProperty("selected"), "First SegmentedButtonItem has property selected"); + assert.notOk(await lastSegmentedButtonItem.getProperty("selected"), "Last SegmentedButtonItem should not be selected anymore"); }); - it("tests if pressed attribute is applied only to last child when all items are pressed", async () => { + it("tests if selected attribute is applied only to last child when all items are selected", async () => { const segmentedButtonItem1 = await browser.$("#segButton2 > ui5-segmented-button-item:first-child"); const segmentedButtonItem2 = await browser.$("#segButton2 > ui5-segmented-button-item:nth-child(2)"); const segmentedButtonItem3 = await browser.$("#segButton2 > ui5-segmented-button-item:nth-child(3)"); const segmentedButtonItem4 = await browser.$("#segButton2 > ui5-segmented-button-item:last-child"); - // only last item should be pressed - assert.notOk(await segmentedButtonItem1.getProperty("pressed"), "SegmentedButtonItem should not be pressed"); - assert.notOk(await segmentedButtonItem2.getProperty("pressed"), "SegmentedButtonItem should not be pressed"); - assert.notOk(await segmentedButtonItem3.getProperty("pressed"), "SegmentedButtonItem should not be pressed"); - assert.ok(await segmentedButtonItem4.getProperty("pressed"), "SegmentedButtonItem has property pressed"); + // only last item should be selected + assert.notOk(await segmentedButtonItem1.getProperty("selected"), "SegmentedButtonItem should not be selected"); + assert.notOk(await segmentedButtonItem2.getProperty("selected"), "SegmentedButtonItem should not be selected"); + assert.notOk(await segmentedButtonItem3.getProperty("selected"), "SegmentedButtonItem should not be selected"); + assert.ok(await segmentedButtonItem4.getProperty("selected"), "SegmentedButtonItem has property selected"); }); @@ -70,11 +70,11 @@ describe("SegmentedButton general interaction", () => { await button1.click(); await button1.keys("Tab"); - assert.ok(await segmentedButtonItem1.isFocused(), "The first SegmentedButtonItem should be focused."); + assert.ok(await segmentedButtonItem1.matches(":focus"), "The first SegmentedButtonItem should be focused."); await button2.click(); await button2.keys("Tab"); - assert.ok(await segmentedButtonItem2.isFocused(), "The selected SegmentedButtonItem should be focused."); + assert.ok(await segmentedButtonItem2.matches(":focus"), "The selected SegmentedButtonItem should be focused."); }); it("tests programatical item pressing", async () => { @@ -87,42 +87,42 @@ describe("SegmentedButton general interaction", () => { const segmentedButtonItem3 = await browser.$("#sbpItem3"); await button1.click(); - assert.notOk(await segmentedButtonItem1.getProperty("pressed"), "[step 1] The first SegmentedButtonItem should not be pressed."); - assert.ok(await segmentedButtonItem2.getProperty("pressed"), "[step 1] The first SegmentedButtonItem should be pressed."); - assert.notOk(await segmentedButtonItem3.getProperty("pressed"), "[step 1] The first SegmentedButtonItem should not be pressed."); + assert.notOk(await segmentedButtonItem1.getProperty("selected"), "[step 1] The first SegmentedButtonItem should not be selected."); + assert.ok(await segmentedButtonItem2.getProperty("selected"), "[step 1] The first SegmentedButtonItem should be selected."); + assert.notOk(await segmentedButtonItem3.getProperty("selected"), "[step 1] The first SegmentedButtonItem should not be selected."); await button2.click(); - assert.notOk(await segmentedButtonItem1.getProperty("pressed"), "[step 2] The first SegmentedButtonItem should not be pressed."); - assert.notOk(await segmentedButtonItem2.getProperty("pressed"), "[step 2] The first SegmentedButtonItem should not be pressed."); - assert.ok(await segmentedButtonItem3.getProperty("pressed"), "[step 2] The first SegmentedButtonItem should be pressed."); + assert.notOk(await segmentedButtonItem1.getProperty("selected"), "[step 2] The first SegmentedButtonItem should not be selected."); + assert.notOk(await segmentedButtonItem2.getProperty("selected"), "[step 2] The first SegmentedButtonItem should not be selected."); + assert.ok(await segmentedButtonItem3.getProperty("selected"), "[step 2] The first SegmentedButtonItem should be selected."); await button4.click(); - assert.ok(await segmentedButtonItem1.getProperty("pressed"), "[step 3] The first SegmentedButtonItem should be pressed."); - assert.notOk(await segmentedButtonItem2.getProperty("pressed"), "[step 3] The first SegmentedButtonItem should not be pressed."); - assert.notOk(await segmentedButtonItem3.getProperty("pressed"), "[step 3] The first SegmentedButtonItem should not be pressed."); + assert.ok(await segmentedButtonItem1.getProperty("selected"), "[step 3] The first SegmentedButtonItem should be selected."); + assert.notOk(await segmentedButtonItem2.getProperty("selected"), "[step 3] The first SegmentedButtonItem should not be selected."); + assert.notOk(await segmentedButtonItem3.getProperty("selected"), "[step 3] The first SegmentedButtonItem should not be selected."); await button1.click(); - assert.notOk(await segmentedButtonItem1.getProperty("pressed"), "[step 4] The first SegmentedButtonItem should not be pressed."); - assert.ok(await segmentedButtonItem2.getProperty("pressed"), "[step 4] The first SegmentedButtonItem should be pressed."); - assert.notOk(await segmentedButtonItem3.getProperty("pressed"), "[step 4] The first SegmentedButtonItem should not be pressed."); + assert.notOk(await segmentedButtonItem1.getProperty("selected"), "[step 4] The first SegmentedButtonItem should not be selected."); + assert.ok(await segmentedButtonItem2.getProperty("selected"), "[step 4] The first SegmentedButtonItem should be selected."); + assert.notOk(await segmentedButtonItem3.getProperty("selected"), "[step 4] The first SegmentedButtonItem should not be selected."); await button3.click(); - assert.notOk(await segmentedButtonItem1.getProperty("pressed"), "[step 5] The first SegmentedButtonItem should not be pressed."); - assert.ok(await segmentedButtonItem2.getProperty("pressed"), "[step 5] The first SegmentedButtonItem should not be pressed."); - assert.notOk(await segmentedButtonItem3.getProperty("pressed"), "[step 5] The first SegmentedButtonItem should be pressed."); + assert.notOk(await segmentedButtonItem1.getProperty("selected"), "[step 5] The first SegmentedButtonItem should not be selected."); + assert.ok(await segmentedButtonItem2.getProperty("selected"), "[step 5] The first SegmentedButtonItem should not be selected."); + assert.notOk(await segmentedButtonItem3.getProperty("selected"), "[step 5] The first SegmentedButtonItem should be selected."); }); - it("tests if a pressed item could be deselected", async () => { + it("tests if a selected item could be deselected", async () => { const firstSegmentedButtonItem = await browser.$("#segButtonMulti > ui5-segmented-button-item:first-child"); await firstSegmentedButtonItem.click(); - assert.ok(await firstSegmentedButtonItem.getProperty("pressed"), "First SegmentedButtonItem should be pressed"); + assert.ok(await firstSegmentedButtonItem.getProperty("selected"), "First SegmentedButtonItem should be selected"); await firstSegmentedButtonItem.click(); - assert.notOk(await firstSegmentedButtonItem.getProperty("pressed"), "First SegmentedButtonItem should be deselected"); + assert.notOk(await firstSegmentedButtonItem.getProperty("selected"), "First SegmentedButtonItem should be deselected"); }); - it("tests if multiple items could be pressed", async () => { + it("tests if multiple items could be selected", async () => { const firstSegmentedButtonItem = await browser.$("#segButtonMulti > ui5-segmented-button-item:first-child"); const secondSegmentedButtonItem = await browser.$("#segButtonMulti > ui5-segmented-button-item:nth-child(1)"); @@ -130,7 +130,7 @@ describe("SegmentedButton general interaction", () => { await secondSegmentedButtonItem.keys("ArrowRight"); await browser.keys("Space"); - assert.ok(await firstSegmentedButtonItem.getProperty("pressed"), "First SegmentedButtonItem should be pressed"); - assert.ok(await secondSegmentedButtonItem.getProperty("pressed"), "Second SegmentedButtonItem should be pressed"); + assert.ok(await firstSegmentedButtonItem.getProperty("selected"), "First SegmentedButtonItem should be selected"); + assert.ok(await secondSegmentedButtonItem.getProperty("selected"), "Second SegmentedButtonItem should be selected"); }); }); diff --git a/packages/main/test/specs/TimeSelectionClocks.spec.js b/packages/main/test/specs/TimeSelectionClocks.spec.js index e9a596d63458..33de783e7b7f 100644 --- a/packages/main/test/specs/TimeSelectionClocks.spec.js +++ b/packages/main/test/specs/TimeSelectionClocks.spec.js @@ -70,16 +70,16 @@ describe("Interactions", () => { await buttons[0].click(); - assert.notOk(await amButtonItem.getProperty("pressed"), "AM should not be pressed"); - assert.ok(await pmButtonItem.getProperty("pressed"), "PM should be pressed"); + assert.notOk(await amButtonItem.getProperty("selected"), "AM should not be selected"); + assert.ok(await pmButtonItem.getProperty("selected"), "PM should be selected"); await browser.keys("a"); - assert.ok(await amButtonItem.getProperty("pressed"), "AM should be pressed"); - assert.notOk(await pmButtonItem.getProperty("pressed"), "PM should not be pressed"); + assert.ok(await amButtonItem.getProperty("selected"), "AM should be selected"); + assert.notOk(await pmButtonItem.getProperty("selected"), "PM should not be selected"); await browser.keys("p"); - assert.notOk(await amButtonItem.getProperty("pressed"), "AM should not be pressed"); - assert.ok(await pmButtonItem.getProperty("pressed"), "PM should be pressed"); + assert.notOk(await amButtonItem.getProperty("selected"), "AM should not be selected"); + assert.ok(await pmButtonItem.getProperty("selected"), "PM should be selected"); }); it("arrow keys", async () => { diff --git a/packages/playground/_stories/main/SegmentedButton/SegmentedButton.stories.ts b/packages/playground/_stories/main/SegmentedButton/SegmentedButton.stories.ts index 87937c903746..632746600156 100644 --- a/packages/playground/_stories/main/SegmentedButton/SegmentedButton.stories.ts +++ b/packages/playground/_stories/main/SegmentedButton/SegmentedButton.stories.ts @@ -24,14 +24,14 @@ const Template: UI5StoryArgs = (args) => html`< export const Basic = Template.bind({}); Basic.args = { default: `Map -Satellite +Satellite Terrain`, accessibleName: "Geographic location", }; export const WithIcons = Template.bind({}); WithIcons.args = { - default: ` + default: ` `, }; diff --git a/packages/playground/_stories/main/SegmentedButton/SegmentedButtonItem/SegmentedButtonItem.stories.ts b/packages/playground/_stories/main/SegmentedButton/SegmentedButtonItem/SegmentedButtonItem.stories.ts index f8f329c1bbc0..af8f4faae335 100644 --- a/packages/playground/_stories/main/SegmentedButton/SegmentedButtonItem/SegmentedButtonItem.stories.ts +++ b/packages/playground/_stories/main/SegmentedButton/SegmentedButtonItem/SegmentedButtonItem.stories.ts @@ -19,17 +19,10 @@ const Template: UI5StoryArgs = (args) => ht Map ${unsafeHTML(args.default)} Terrain `; @@ -38,5 +31,5 @@ export const Basic = Template.bind({}); Basic.tags = ["_hidden_"]; Basic.args = { default: "Current item", - pressed: true, + selected: true, }; \ No newline at end of file diff --git a/packages/website/docs/_samples/main/SegmentedButton/Basic/sample.html b/packages/website/docs/_samples/main/SegmentedButton/Basic/sample.html index 51c70b0dc3d2..cf186ce47da5 100644 --- a/packages/website/docs/_samples/main/SegmentedButton/Basic/sample.html +++ b/packages/website/docs/_samples/main/SegmentedButton/Basic/sample.html @@ -13,7 +13,7 @@ - + @@ -22,7 +22,7 @@ Map - Satellite + Satellite Terrain diff --git a/packages/website/docs/_samples/main/SegmentedButton/SelectionModes/sample.html b/packages/website/docs/_samples/main/SegmentedButton/SelectionModes/sample.html index 505852c170b5..7e99a54f0fa7 100644 --- a/packages/website/docs/_samples/main/SegmentedButton/SelectionModes/sample.html +++ b/packages/website/docs/_samples/main/SegmentedButton/SelectionModes/sample.html @@ -13,7 +13,7 @@ - + @@ -22,7 +22,7 @@ Map - Satellite + Satellite Terrain