Skip to content

Commit f9ff5ee

Browse files
authored
fix(ui5-tokenizer, ui5-multi-input,ui5-multi-combobox): Improve stylisation (#13314)
* fix(ui5-tokenizer, ui5-multi-input,ui5-multi-combobox): Improve stylisation * fix(ui5-tokenizer, ui5-multi-input,ui5-multi-combobox): reflect code review * fix(ui5-tokenizer, ui5-multi-input, ui5-multi-combobox): fix failing tests
1 parent 49f5afc commit f9ff5ee

13 files changed

Lines changed: 66 additions & 12 deletions

packages/ai/src/InputTemplate.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export default function InputTemplate(this: Input, hooks?: { preContent: Templat
4242
style={this.styles.innerInput}
4343
type={this.inputNativeType}
4444
inner-input
45-
inner-input-with-icon={!!this.icon.length}
45+
inner-input-with-icon={this.iconsCount > 0}
4646
disabled={this.disabled}
4747
readonly={this._readonly || this.loading}
4848
value={this.value}

packages/main/cypress/specs/MultiComboBox.cy.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4027,7 +4027,7 @@ describe("Keyboard Handling", () => {
40274027

40284028
it("Should select/deselect a token with CTRL+SPACE", () => {
40294029
cy.mount(
4030-
<MultiComboBox noValidation={true}>
4030+
<MultiComboBox style={{ width: "300px" }} noValidation={true}>
40314031
<MultiComboBoxItem selected={true} text="Item 1"></MultiComboBoxItem>
40324032
<MultiComboBoxItem selected={true} text="Item 2"></MultiComboBoxItem>
40334033
</MultiComboBox>

packages/main/src/InputTemplate.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export default function InputTemplate(this: Input, hooks?: { preContent: Templat
3030
style={this.styles.innerInput}
3131
type={this.inputNativeType}
3232
inner-input
33-
inner-input-with-icon={!!this.icon.length}
33+
inner-input-with-icon={this.iconsCount > 0}
3434
disabled={this.disabled}
3535
readonly={this._readonly}
3636
value={this.value}

packages/main/src/MultiComboBoxTemplate.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export default function MultiComboBoxTemplate(this: MultiComboBox) {
6565
id="ui5-multi-combobox-input"
6666
value={this.value}
6767
inner-input
68+
inner-input-with-icon={this._effectiveShowClearIcon || !!this.icon || !this.readonly}
6869
placeholder={this._getPlaceholder}
6970
disabled={this.disabled}
7071
readonly={this.readonly}

packages/main/src/MultiInput.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,9 @@ class MultiInput extends Input implements IFormInputElement {
359359

360360
if (this.tokenizer) {
361361
this.tokenizer.readonly = this.readonly;
362+
363+
// Set the CSS variable on the tokenizer element so it's available in the shadow DOM
364+
this.tokenizer.style.setProperty("--_ui5-input-icons-count", `${this.iconsCount}`);
362365
}
363366
}
364367

packages/main/src/Token.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ class Token extends UI5Element implements IToken {
127127
@property({ type: Boolean })
128128
toBeDeleted = false;
129129

130+
/**
131+
* Set by the tokenizer to mark the last visible token before overflow.
132+
* @default false
133+
* @private
134+
*/
135+
@property({ type: Boolean })
136+
lastVisibleToken = false;
137+
130138
/**
131139
* Defines the tabIndex of the component.
132140
* @private

packages/main/src/Tokenizer.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,10 @@ class Tokenizer extends UI5Element implements IFormInputElement {
422422
this._tokens.forEach(token => {
423423
token.singleToken = (tokensLength === 1) || this.multiLine;
424424
token.readonly = this.readonly;
425+
// Clear lastVisibleToken when expanding
426+
if (this.expanded && token.lastVisibleToken) {
427+
token.lastVisibleToken = false;
428+
}
425429
});
426430
}
427431

@@ -513,6 +517,27 @@ class Tokenizer extends UI5Element implements IFormInputElement {
513517

514518
this._scrollToEndIfNeeded();
515519
this._tokenDeleting = false;
520+
521+
// Update lastVisibleToken after rendering is complete to avoid render loops
522+
renderFinished().then(() => {
523+
this._updateLastVisibleTokenAttribute();
524+
});
525+
}
526+
527+
/**
528+
* Updates the lastVisibleToken property on tokens.
529+
* When collapsed with overflow, marks the last visible token for proper spacing to the n-more indicator.
530+
* @private
531+
*/
532+
_updateLastVisibleTokenAttribute() {
533+
const tokensArray = this._tokens;
534+
const hasOverflow = this._nMoreCount > 0;
535+
const visibleTokens = tokensArray.filter(token => !token.overflows);
536+
const lastVisibleToken = visibleTokens.length > 0 ? visibleTokens[visibleTokens.length - 1] : undefined;
537+
538+
tokensArray.forEach(token => {
539+
token.lastVisibleToken = (!this.expanded && hasOverflow && token === lastVisibleToken);
540+
});
516541
}
517542

518543
/**

packages/main/src/themes/ComboBox.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@
88
width: 100%;
99
height: 100%;
1010
border-radius: var(--_ui5_input_border_radius);
11+
}
12+
13+
:host(:not([readonly])) [inner-input] {
14+
padding: var(--_ui5_input_inner_padding_with_icon);
1115
}

packages/main/src/themes/MultiComboBox.css

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
.ui5-multi-combobox-tokenizer {
2727
min-width: var(--_ui5_input_tokenizer_min_width);
28-
max-width: calc(100% - 3rem - var(--_ui5-input-icons-count) * var(--_ui5_input_icon_min_width));
28+
max-width: calc(100% - var(--_ui5_input_min_width_tokenizer_available) - var(--_ui5-input-icons-count) * var(--_ui5_input_icon_min_width));
2929
border: none;
3030
width: auto;
3131
height: 100%;
@@ -48,7 +48,9 @@
4848
}
4949

5050
:host([tokenizer-available]) [inner-input] {
51-
padding-inline-start: var(--_ui5_input_inner_space_to_tokenizer);
51+
padding-inline-start: 0;
52+
padding-inline-end: var(--_ui5_input_inner_with_tokenizer_padding_inline_end);
53+
min-width: var(--_ui5_input_min_width_tokenizer_available);
5254
}
5355

5456
:host(:not([tokenizer-available])) .ui5-multi-combobox-tokenizer {

packages/main/src/themes/MultiInput.css

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
.ui5-multi-input-tokenizer {
1212
min-width: var(--_ui5_input_tokenizer_min_width);
13-
max-width: calc(100% - 3rem - var(--_ui5-input-icons-count) * var(--_ui5_input_icon_min_width));
13+
max-width: calc(100% - var(--_ui5_input_min_width_tokenizer_available) - var(--_ui5-input-icons-count) * var(--_ui5_input_icon_min_width));
1414
border: none;
1515
width: auto;
1616
height: 100%;
@@ -29,7 +29,9 @@
2929
}
3030

3131
:host([tokenizer-available]) [inner-input] {
32-
padding-inline-start: var(--_ui5_input_inner_space_to_tokenizer);
32+
padding-inline-start: 0;
33+
padding-inline-end: var(--_ui5_input_inner_with_tokenizer_padding_inline_end);
34+
min-width: var(--_ui5_input_min_width_tokenizer_available);
3335
}
3436

3537
:host(:not([tokenizer-available])) .ui5-multi-input-tokenizer {

0 commit comments

Comments
 (0)