@api-client/ui 0.5.26 → 0.5.28
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/build/src/elements/app-bar/internals/AppBar.d.ts +1 -1
- package/build/src/elements/app-bar/internals/AppBar.d.ts.map +1 -1
- package/build/src/elements/app-bar/internals/AppBar.js +5 -5
- package/build/src/elements/app-bar/internals/AppBar.js.map +1 -1
- package/build/src/elements/currency/internals/Picker.d.ts +2 -2
- package/build/src/elements/currency/internals/Picker.d.ts.map +1 -1
- package/build/src/elements/currency/internals/Picker.js +13 -12
- package/build/src/elements/currency/internals/Picker.js.map +1 -1
- package/build/src/elements/data-table/DataTable.d.ts +1 -3
- package/build/src/elements/data-table/DataTable.d.ts.map +1 -1
- package/build/src/elements/data-table/DataTable.js +2 -4
- package/build/src/elements/data-table/DataTable.js.map +1 -1
- package/build/src/elements/file-system/internals/Breadcrumbs.d.ts +1 -2
- package/build/src/elements/file-system/internals/Breadcrumbs.d.ts.map +1 -1
- package/build/src/elements/file-system/internals/Breadcrumbs.js +2 -3
- package/build/src/elements/file-system/internals/Breadcrumbs.js.map +1 -1
- package/build/src/elements/navigation/internals/NavigationItem.js +1 -1
- package/build/src/elements/navigation/internals/NavigationItem.js.map +1 -1
- package/build/src/md/list/internals/List.d.ts +4 -2
- package/build/src/md/list/internals/List.d.ts.map +1 -1
- package/build/src/md/list/internals/List.js +16 -6
- package/build/src/md/list/internals/List.js.map +1 -1
- package/build/src/md/list/internals/ListItem.d.ts +10 -1
- package/build/src/md/list/internals/ListItem.d.ts.map +1 -1
- package/build/src/md/list/internals/ListItem.js +74 -8
- package/build/src/md/list/internals/ListItem.js.map +1 -1
- package/build/src/md/list/internals/ListItem.styles.d.ts.map +1 -1
- package/build/src/md/list/internals/ListItem.styles.js +38 -28
- package/build/src/md/list/internals/ListItem.styles.js.map +1 -1
- package/build/src/md/menu/internal/MenuItem.js +4 -4
- package/build/src/md/menu/internal/MenuItem.js.map +1 -1
- package/build/src/md/progress/internals/CircularProgress.d.ts +93 -0
- package/build/src/md/progress/internals/CircularProgress.d.ts.map +1 -0
- package/build/src/md/progress/internals/CircularProgress.js +156 -0
- package/build/src/md/progress/internals/CircularProgress.js.map +1 -0
- package/build/src/md/progress/internals/CircularProgress.styles.d.ts +3 -0
- package/build/src/md/progress/internals/CircularProgress.styles.d.ts.map +1 -0
- package/build/src/md/progress/internals/CircularProgress.styles.js +220 -0
- package/build/src/md/progress/internals/CircularProgress.styles.js.map +1 -0
- package/build/src/md/progress/internals/Range.d.ts +6 -0
- package/build/src/md/progress/internals/Range.d.ts.map +1 -1
- package/build/src/md/progress/internals/Range.js +41 -3
- package/build/src/md/progress/internals/Range.js.map +1 -1
- package/build/src/md/progress/internals/UiProgress.d.ts +0 -7
- package/build/src/md/progress/internals/UiProgress.d.ts.map +1 -1
- package/build/src/md/progress/internals/UiProgress.js +2 -36
- package/build/src/md/progress/internals/UiProgress.js.map +1 -1
- package/build/src/md/progress/ui-circular-progress.d.ts +11 -0
- package/build/src/md/progress/ui-circular-progress.d.ts.map +1 -0
- package/build/src/md/progress/ui-circular-progress.js +27 -0
- package/build/src/md/progress/ui-circular-progress.js.map +1 -0
- package/build/src/md/select/internals/Option.js +2 -2
- package/build/src/md/select/internals/Option.js.map +1 -1
- package/build/src/md/select/internals/Option.styles.d.ts.map +1 -1
- package/build/src/md/select/internals/Option.styles.js +0 -127
- package/build/src/md/select/internals/Option.styles.js.map +1 -1
- package/build/src/md/select/internals/Select.d.ts +11 -1
- package/build/src/md/select/internals/Select.d.ts.map +1 -1
- package/build/src/md/select/internals/Select.js +21 -2
- package/build/src/md/select/internals/Select.js.map +1 -1
- package/demo/elements/currency/index.html +2 -2
- package/demo/elements/navigation/navigation-item.html +4 -0
- package/demo/elements/navigation/navigation-item.ts +19 -0
- package/demo/md/list/list.ts +9 -3
- package/demo/md/progress/progress.ts +24 -1
- package/demo/md/select/index.ts +5 -0
- package/demo/md/tabs/tabs.ts +0 -4
- package/package.json +1 -1
- package/src/elements/app-bar/internals/AppBar.ts +5 -5
- package/src/elements/currency/internals/Picker.ts +17 -16
- package/src/elements/data-table/DataTable.ts +2 -4
- package/src/elements/file-system/internals/Breadcrumbs.ts +2 -3
- package/src/elements/navigation/internals/NavigationItem.ts +1 -1
- package/src/md/list/internals/List.ts +19 -8
- package/src/md/list/internals/ListItem.styles.ts +38 -28
- package/src/md/list/internals/ListItem.ts +55 -8
- package/src/md/menu/internal/MenuItem.ts +4 -4
- package/src/md/progress/internals/CircularProgress.styles.ts +220 -0
- package/src/md/progress/internals/CircularProgress.ts +129 -0
- package/src/md/progress/internals/Range.ts +29 -1
- package/src/md/progress/internals/UiProgress.ts +1 -30
- package/src/md/progress/ui-circular-progress.ts +15 -0
- package/src/md/select/internals/Option.styles.ts +0 -127
- package/src/md/select/internals/Option.ts +2 -2
- package/src/md/select/internals/Select.ts +13 -1
- package/test/elements/currency/CurrencyPicker.accessibility.test.ts +14 -14
- package/test/elements/currency/CurrencyPicker.core.test.ts +6 -6
- package/test/elements/currency/CurrencyPicker.integration.test.ts +2 -2
- package/test/elements/currency/CurrencyPicker.test.ts +10 -10
- package/test/elements/data-table/DataTable.browser.test.ts +2 -2
- package/test/md/menu/MenuItem.test.ts +2 -3
- package/test/md/progress/UiCircularProgressElement.test.ts +481 -0
|
@@ -30,12 +30,6 @@ export default class UiProgress extends UiRange {
|
|
|
30
30
|
*/
|
|
31
31
|
@property({ type: Number, converter: floatConverter }) accessor secondaryProgress: number | undefined
|
|
32
32
|
|
|
33
|
-
/**
|
|
34
|
-
* Use an indeterminate progress indicator.
|
|
35
|
-
* @attr
|
|
36
|
-
*/
|
|
37
|
-
@property({ reflect: true, type: Boolean }) accessor indeterminate: boolean | undefined
|
|
38
|
-
|
|
39
33
|
/**
|
|
40
34
|
* @returns The ratio of the secondary progress.
|
|
41
35
|
*/
|
|
@@ -43,36 +37,13 @@ export default class UiProgress extends UiRange {
|
|
|
43
37
|
return this.secondaryRatioInternal || 0
|
|
44
38
|
}
|
|
45
39
|
|
|
46
|
-
override connectedCallback(): void {
|
|
47
|
-
super.connectedCallback()
|
|
48
|
-
if (!this.hasAttribute('role')) {
|
|
49
|
-
this.setAttribute('role', 'progressbar')
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
40
|
protected override willUpdate(cp: PropertyValues<this>): void {
|
|
54
41
|
super.willUpdate(cp)
|
|
55
|
-
if (cp.has('secondaryProgress')
|
|
42
|
+
if (cp.has('secondaryProgress')) {
|
|
56
43
|
this.rangeChanged()
|
|
57
44
|
}
|
|
58
45
|
}
|
|
59
46
|
|
|
60
|
-
protected override updated(cp: PropertyValues<this>): void {
|
|
61
|
-
if (cp.has('min')) {
|
|
62
|
-
this.setAttribute('aria-valuemin', String(this.min))
|
|
63
|
-
}
|
|
64
|
-
if (cp.has('max')) {
|
|
65
|
-
this.setAttribute('aria-valuemax', String(this.max))
|
|
66
|
-
}
|
|
67
|
-
if (cp.has('indeterminate') || cp.has('value')) {
|
|
68
|
-
if (this.indeterminate) {
|
|
69
|
-
this.removeAttribute('aria-valuenow')
|
|
70
|
-
} else {
|
|
71
|
-
this.setAttribute('aria-valuenow', String(this.value))
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
47
|
protected override rangeChanged(): void {
|
|
77
48
|
super.rangeChanged()
|
|
78
49
|
const { secondaryProgress: sp } = this
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CSSResultOrNative } from 'lit'
|
|
2
|
+
import { customElement } from 'lit/decorators.js'
|
|
3
|
+
import Element from './internals/CircularProgress.js'
|
|
4
|
+
import styles from './internals/CircularProgress.styles.js'
|
|
5
|
+
|
|
6
|
+
@customElement('ui-circular-progress')
|
|
7
|
+
export class UiCircularProgressElement extends Element {
|
|
8
|
+
static override styles: CSSResultOrNative[] = [styles]
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
declare global {
|
|
12
|
+
interface HTMLElementTagNameMap {
|
|
13
|
+
'ui-circular-progress': UiCircularProgressElement
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,139 +1,12 @@
|
|
|
1
1
|
import { css } from 'lit'
|
|
2
2
|
|
|
3
3
|
export default css`
|
|
4
|
-
:host {
|
|
5
|
-
display: block;
|
|
6
|
-
height: 56px;
|
|
7
|
-
outline: none;
|
|
8
|
-
cursor: default;
|
|
9
|
-
position: relative;
|
|
10
|
-
|
|
11
|
-
--md-focus-ring-shape-end-end: 0px;
|
|
12
|
-
--md-focus-ring-shape-end-start: 0px;
|
|
13
|
-
--md-focus-ring-shape-start-end: 0px;
|
|
14
|
-
--md-focus-ring-shape-start-start: 0px;
|
|
15
|
-
|
|
16
|
-
color: var(--md-sys-color-on-surface);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
:host([disabled]) {
|
|
20
|
-
cursor: not-allowed;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
:host([hidden]) {
|
|
24
|
-
display: none;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
.surface {
|
|
28
|
-
height: inherit;
|
|
29
|
-
box-sizing: border-box;
|
|
30
|
-
|
|
31
|
-
display: flex;
|
|
32
|
-
align-items: center;
|
|
33
|
-
overflow: hidden;
|
|
34
|
-
|
|
35
|
-
padding: 8px 16px 8px 16px;
|
|
36
|
-
gap: 12px;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
4
|
.surface.selected {
|
|
40
5
|
background-color: var(--md-sys-color-secondary-container);
|
|
41
6
|
color: var(--md-sys-color-on-secondary-container);
|
|
42
7
|
}
|
|
43
8
|
|
|
44
|
-
.ripple {
|
|
45
|
-
z-index: 3;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
.headline {
|
|
49
|
-
font-family: var(--md-sys-typescale-body-large-font);
|
|
50
|
-
font-weight: var(--md-sys-typescale-body-large-weight);
|
|
51
|
-
font-size: var(--md-sys-typescale-body-large-size);
|
|
52
|
-
letter-spacing: var(--md-sys-typescale-body-large-tracking);
|
|
53
|
-
line-height: var(--md-sys-typescale-body-large-height);
|
|
54
|
-
|
|
55
|
-
overflow: hidden;
|
|
56
|
-
text-overflow: ellipsis;
|
|
57
|
-
white-space: nowrap;
|
|
58
|
-
|
|
59
|
-
display: flex;
|
|
60
|
-
align-items: center;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
.supporting-text {
|
|
64
|
-
color: var(--md-sys-color-on-surface-variant);
|
|
65
|
-
|
|
66
|
-
font-family: var(--md-sys-typescale-body-medium-font);
|
|
67
|
-
font-weight: var(--md-sys-typescale-body-medium-weight);
|
|
68
|
-
font-size: var(--md-sys-typescale-body-medium-size);
|
|
69
|
-
letter-spacing: var(--md-sys-typescale-body-medium-tracking);
|
|
70
|
-
line-height: var(--md-sys-typescale-body-medium-height);
|
|
71
|
-
|
|
72
|
-
overflow: hidden;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
.supporting-text ::slotted(*),
|
|
76
|
-
slot[name='end-text']::slotted(*) {
|
|
77
|
-
margin: 0;
|
|
78
|
-
padding: 0;
|
|
79
|
-
overflow: hidden;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
slot[name='end-text']::slotted(*) {
|
|
83
|
-
margin-right: 8px;
|
|
84
|
-
margin-left: 16px;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
:host slot[name='end']::slotted(*) {
|
|
88
|
-
color: var(--md-sys-color-on-surface-variant);
|
|
89
|
-
fill: var(--md-sys-color-on-surface-variant);
|
|
90
|
-
margin-left: 16px;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
:host slot[name='start']::slotted(*) {
|
|
94
|
-
display: block;
|
|
95
|
-
margin-right: 16px;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
:host([image='icon']) slot[name='start']::slotted(*) {
|
|
99
|
-
width: 24px;
|
|
100
|
-
height: 24px;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
:host([image='avatar']) slot[name='start']::slotted(*) {
|
|
104
|
-
width: 40px;
|
|
105
|
-
height: 40px;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
:host([image='image']) slot[name='start']::slotted(*) {
|
|
109
|
-
width: 56px;
|
|
110
|
-
height: 56px;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
:host([image='video']) slot[name='start']::slotted(*) {
|
|
114
|
-
width: 114px;
|
|
115
|
-
height: 64px;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.body {
|
|
119
|
-
flex: 1;
|
|
120
|
-
overflow: hidden;
|
|
121
|
-
display: flex;
|
|
122
|
-
flex-direction: column;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.end {
|
|
126
|
-
display: flex;
|
|
127
|
-
align-items: center;
|
|
128
|
-
gap: 8px;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
9
|
.selection-icon {
|
|
132
10
|
color: var(--md-sys-color-on-surface);
|
|
133
11
|
}
|
|
134
|
-
|
|
135
|
-
:host(.highlight) .surface {
|
|
136
|
-
background-color: var(--md-sys-color-tertiary-container);
|
|
137
|
-
color: var(--md-sys-color-on-tertiary-container);
|
|
138
|
-
}
|
|
139
12
|
`
|
|
@@ -169,7 +169,7 @@ export default class UiOption extends UiListItem {
|
|
|
169
169
|
item: this,
|
|
170
170
|
value: this.value,
|
|
171
171
|
},
|
|
172
|
-
bubbles:
|
|
172
|
+
bubbles: false,
|
|
173
173
|
composed: true,
|
|
174
174
|
})
|
|
175
175
|
)
|
|
@@ -202,7 +202,7 @@ export default class UiOption extends UiListItem {
|
|
|
202
202
|
return html`
|
|
203
203
|
<div class="end">
|
|
204
204
|
${this.selected ? html`<ui-icon icon="check" class="selection-icon"></ui-icon>` : ''}
|
|
205
|
-
<slot name="end" @slotchange=${this.
|
|
205
|
+
<slot name="end" @slotchange=${this.handleEndSlotChange}></slot>
|
|
206
206
|
<slot name="end-text" class="trailing-supporting-text"></slot>
|
|
207
207
|
</div>
|
|
208
208
|
`
|
|
@@ -37,6 +37,7 @@ export default class UiSelect extends LitElement {
|
|
|
37
37
|
* The currently selected value. Corresponds to the `value` attribute of the selected `ui-option`.
|
|
38
38
|
* When set programmatically, it will update the selected option if a matching option exists.
|
|
39
39
|
*
|
|
40
|
+
* @attribute
|
|
40
41
|
* @example
|
|
41
42
|
* ```html
|
|
42
43
|
* <ui-select value="apple">
|
|
@@ -61,6 +62,7 @@ export default class UiSelect extends LitElement {
|
|
|
61
62
|
* The name attribute for form submission. This value will be used as the key
|
|
62
63
|
* when the form is submitted.
|
|
63
64
|
*
|
|
65
|
+
* @attribute
|
|
64
66
|
* @example
|
|
65
67
|
* ```html
|
|
66
68
|
* <ui-select name="country" value="us">
|
|
@@ -74,6 +76,7 @@ export default class UiSelect extends LitElement {
|
|
|
74
76
|
* The label text displayed in the select field. Provides accessible labeling
|
|
75
77
|
* and is shown as the floating label in the outlined text field.
|
|
76
78
|
*
|
|
79
|
+
* @attribute
|
|
77
80
|
* @example
|
|
78
81
|
* ```html
|
|
79
82
|
* <ui-select label="Select a country">
|
|
@@ -87,7 +90,7 @@ export default class UiSelect extends LitElement {
|
|
|
87
90
|
* Whether the select is required for form validation. When true, the select
|
|
88
91
|
* must have a value selected for the form to be valid.
|
|
89
92
|
*
|
|
90
|
-
* @
|
|
93
|
+
* @attribute
|
|
91
94
|
* @example
|
|
92
95
|
* ```html
|
|
93
96
|
* <ui-select required label="Required field">
|
|
@@ -101,6 +104,7 @@ export default class UiSelect extends LitElement {
|
|
|
101
104
|
* Whether the select is in an invalid state. This is typically set automatically
|
|
102
105
|
* during validation, but can be set manually to indicate validation errors.
|
|
103
106
|
*
|
|
107
|
+
* @attribute
|
|
104
108
|
* @example
|
|
105
109
|
* ```html
|
|
106
110
|
* <ui-select invalid invalidText="Please select a valid option">
|
|
@@ -114,6 +118,7 @@ export default class UiSelect extends LitElement {
|
|
|
114
118
|
* The error message to display when the select is invalid. This text is shown
|
|
115
119
|
* below the select field when `invalid` is true.
|
|
116
120
|
*
|
|
121
|
+
* @attribute
|
|
117
122
|
* @example
|
|
118
123
|
* ```html
|
|
119
124
|
* <ui-select invalid invalidText="This field is required">
|
|
@@ -123,11 +128,17 @@ export default class UiSelect extends LitElement {
|
|
|
123
128
|
*/
|
|
124
129
|
@property({ type: String }) accessor invalidText: string | undefined
|
|
125
130
|
|
|
131
|
+
/**
|
|
132
|
+
* @attribute
|
|
133
|
+
*/
|
|
134
|
+
@property({ type: String }) accessor supportingText: string | undefined
|
|
135
|
+
|
|
126
136
|
/**
|
|
127
137
|
* Whether the select is disabled. When disabled, the select cannot be interacted
|
|
128
138
|
* with and will not receive focus or respond to user input.
|
|
129
139
|
*
|
|
130
140
|
* @default false
|
|
141
|
+
* @attribute
|
|
131
142
|
* @example
|
|
132
143
|
* ```html
|
|
133
144
|
* <ui-select disabled label="Disabled select">
|
|
@@ -508,6 +519,7 @@ export default class UiSelect extends LitElement {
|
|
|
508
519
|
aria-hidden="true"
|
|
509
520
|
.invalid=${this.invalid}
|
|
510
521
|
.invalidText=${this.invalidText || ''}
|
|
522
|
+
.supportingText=${this.supportingText || ''}
|
|
511
523
|
class="input"
|
|
512
524
|
>
|
|
513
525
|
<ui-icon slot="suffix">arrow_drop_down</ui-icon>
|
|
@@ -51,7 +51,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
51
51
|
picker.clearSelection()
|
|
52
52
|
await picker.updateComplete
|
|
53
53
|
|
|
54
|
-
const select = picker.shadowRoot?.querySelector('
|
|
54
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
55
55
|
assert.equal(select?.getAttribute('aria-invalid'), 'true')
|
|
56
56
|
})
|
|
57
57
|
|
|
@@ -59,7 +59,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
59
59
|
picker.supportingText = 'Choose your preferred currency'
|
|
60
60
|
await picker.updateComplete
|
|
61
61
|
|
|
62
|
-
const select = picker.shadowRoot?.querySelector('
|
|
62
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
63
63
|
assert.exists(select?.getAttribute('aria-describedby'))
|
|
64
64
|
})
|
|
65
65
|
})
|
|
@@ -140,7 +140,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
140
140
|
})
|
|
141
141
|
|
|
142
142
|
it('should be focusable', async () => {
|
|
143
|
-
const select = picker.shadowRoot?.querySelector('
|
|
143
|
+
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
144
144
|
select.focus()
|
|
145
145
|
|
|
146
146
|
// Check if the picker or its select element has focus
|
|
@@ -149,7 +149,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
149
149
|
})
|
|
150
150
|
|
|
151
151
|
it('should support keyboard selection', async () => {
|
|
152
|
-
const select = picker.shadowRoot?.querySelector('
|
|
152
|
+
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
153
153
|
select.focus()
|
|
154
154
|
|
|
155
155
|
// Simulate opening dropdown and selecting
|
|
@@ -165,7 +165,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
165
165
|
press: 'Enter',
|
|
166
166
|
})
|
|
167
167
|
|
|
168
|
-
// Should have some interaction (exact behavior depends on
|
|
168
|
+
// Should have some interaction (exact behavior depends on ui-select)
|
|
169
169
|
assert.exists(select)
|
|
170
170
|
})
|
|
171
171
|
|
|
@@ -196,7 +196,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
196
196
|
})
|
|
197
197
|
|
|
198
198
|
it('should have visible focus indicators', async () => {
|
|
199
|
-
const select = picker.shadowRoot?.querySelector('
|
|
199
|
+
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
200
200
|
select.focus()
|
|
201
201
|
|
|
202
202
|
// Check that focus styles are applied (this may require checking computed styles)
|
|
@@ -208,7 +208,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
208
208
|
picker.selected = ['USD']
|
|
209
209
|
await picker.updateComplete
|
|
210
210
|
|
|
211
|
-
const select = picker.shadowRoot?.querySelector('
|
|
211
|
+
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
212
212
|
select.focus()
|
|
213
213
|
|
|
214
214
|
// Simulate adding another currency
|
|
@@ -229,11 +229,11 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
229
229
|
|
|
230
230
|
it('should render with proper contrast for text', async () => {
|
|
231
231
|
// This test would ideally check computed styles for contrast ratios
|
|
232
|
-
const select = picker.shadowRoot?.querySelector('
|
|
232
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
233
233
|
assert.exists(select)
|
|
234
234
|
|
|
235
235
|
// Basic check that text content is rendered
|
|
236
|
-
const options = picker.shadowRoot?.querySelectorAll('
|
|
236
|
+
const options = picker.shadowRoot?.querySelectorAll('ui-option')
|
|
237
237
|
assert.isAtLeast(options?.length || 0, 1)
|
|
238
238
|
})
|
|
239
239
|
|
|
@@ -244,7 +244,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
244
244
|
await picker.updateComplete
|
|
245
245
|
|
|
246
246
|
const errorElement = picker.shadowRoot?.querySelector('.error')
|
|
247
|
-
const selectElement = picker.shadowRoot?.querySelector('
|
|
247
|
+
const selectElement = picker.shadowRoot?.querySelector('ui-select')
|
|
248
248
|
const isInvalid = !picker.validity.valid
|
|
249
249
|
const hasAriaInvalid = selectElement?.getAttribute('aria-invalid') === 'true'
|
|
250
250
|
|
|
@@ -264,7 +264,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
264
264
|
it('should have proper semantic structure', async () => {
|
|
265
265
|
// Check that component has accessible structure
|
|
266
266
|
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
267
|
-
const select = picker.shadowRoot?.querySelector('
|
|
267
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
268
268
|
|
|
269
269
|
assert.exists(container)
|
|
270
270
|
assert.equal(container?.getAttribute('role'), 'group')
|
|
@@ -293,7 +293,7 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
293
293
|
|
|
294
294
|
it('should have sufficient touch targets', async () => {
|
|
295
295
|
// Check that interactive elements are large enough for touch
|
|
296
|
-
const select = picker.shadowRoot?.querySelector('
|
|
296
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
297
297
|
assert.exists(select)
|
|
298
298
|
|
|
299
299
|
// Material Design select should have proper touch targets
|
|
@@ -302,8 +302,8 @@ describe('CurrencyPicker - Accessibility', () => {
|
|
|
302
302
|
|
|
303
303
|
it('should work without JavaScript enhancements', async () => {
|
|
304
304
|
// Basic HTML structure should be accessible
|
|
305
|
-
const select = picker.shadowRoot?.querySelector('
|
|
306
|
-
const options = picker.shadowRoot?.querySelectorAll('
|
|
305
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
306
|
+
const options = picker.shadowRoot?.querySelectorAll('ui-option')
|
|
307
307
|
|
|
308
308
|
assert.exists(select)
|
|
309
309
|
assert.isAtLeast(options?.length || 0, 1)
|
|
@@ -41,14 +41,14 @@ describe('CurrencyPicker - Core Tests', () => {
|
|
|
41
41
|
})
|
|
42
42
|
|
|
43
43
|
it('should render currency selector', () => {
|
|
44
|
-
const selector = picker.shadowRoot?.querySelector('
|
|
44
|
+
const selector = picker.shadowRoot?.querySelector('ui-select')
|
|
45
45
|
assert.exists(selector)
|
|
46
46
|
assert.equal(selector?.getAttribute('label'), 'Add Currency')
|
|
47
47
|
})
|
|
48
48
|
|
|
49
49
|
it('should populate currency options', async () => {
|
|
50
50
|
await picker.updateComplete
|
|
51
|
-
const options = picker.shadowRoot?.querySelectorAll('
|
|
51
|
+
const options = picker.shadowRoot?.querySelectorAll('ui-option')
|
|
52
52
|
assert.exists(options)
|
|
53
53
|
assert.isAtLeast(options?.length || 0, 25) // Should have popular currencies
|
|
54
54
|
})
|
|
@@ -137,7 +137,7 @@ describe('CurrencyPicker - Core Tests', () => {
|
|
|
137
137
|
it('should filter options based on allowed currencies', async () => {
|
|
138
138
|
await picker.updateComplete
|
|
139
139
|
|
|
140
|
-
const options = picker.shadowRoot?.querySelectorAll('
|
|
140
|
+
const options = picker.shadowRoot?.querySelectorAll('ui-option[value]')
|
|
141
141
|
const optionValues = Array.from(options || [])
|
|
142
142
|
.map((option) => option.getAttribute('value'))
|
|
143
143
|
.filter(Boolean)
|
|
@@ -168,7 +168,7 @@ describe('CurrencyPicker - Core Tests', () => {
|
|
|
168
168
|
await picker.updateComplete
|
|
169
169
|
|
|
170
170
|
const errorElement = picker.shadowRoot?.querySelector('.error')
|
|
171
|
-
const selectElement = picker.shadowRoot?.querySelector('
|
|
171
|
+
const selectElement = picker.shadowRoot?.querySelector('ui-select')
|
|
172
172
|
const isInvalid = !picker.validity.valid
|
|
173
173
|
const hasAriaInvalid = selectElement?.getAttribute('aria-invalid') === 'true'
|
|
174
174
|
|
|
@@ -250,7 +250,7 @@ describe('CurrencyPicker - Core Tests', () => {
|
|
|
250
250
|
await picker.updateComplete
|
|
251
251
|
|
|
252
252
|
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
253
|
-
const select = picker.shadowRoot?.querySelector('
|
|
253
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
254
254
|
|
|
255
255
|
assert.equal(container?.getAttribute('role'), 'group')
|
|
256
256
|
assert.exists(container?.getAttribute('aria-label'))
|
|
@@ -299,7 +299,7 @@ describe('CurrencyPicker - Core Tests', () => {
|
|
|
299
299
|
picker.disabled = true
|
|
300
300
|
await picker.updateComplete
|
|
301
301
|
|
|
302
|
-
const select = picker.shadowRoot?.querySelector('
|
|
302
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
303
303
|
assert.isTrue(select?.hasAttribute('disabled'))
|
|
304
304
|
})
|
|
305
305
|
|
|
@@ -115,7 +115,7 @@ describe('CurrencyPicker - Integration', () => {
|
|
|
115
115
|
|
|
116
116
|
// Check that error state is set (indicating validation failed)
|
|
117
117
|
const isInvalid = !picker.validity.valid
|
|
118
|
-
const selectElement = picker.shadowRoot?.querySelector('
|
|
118
|
+
const selectElement = picker.shadowRoot?.querySelector('ui-select')
|
|
119
119
|
const hasAriaInvalid = selectElement?.getAttribute('aria-invalid') === 'true'
|
|
120
120
|
|
|
121
121
|
assert.isTrue(isInvalid, 'Component should be in invalid state when validation fails')
|
|
@@ -468,7 +468,7 @@ describe('CurrencyPicker - Integration', () => {
|
|
|
468
468
|
it('should maintain focus appropriately during interactions', async () => {
|
|
469
469
|
const { picker } = await accessibilityFixture()
|
|
470
470
|
|
|
471
|
-
const select = picker.shadowRoot?.querySelector('
|
|
471
|
+
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
472
472
|
select.focus()
|
|
473
473
|
|
|
474
474
|
// Simulate selection
|
|
@@ -52,14 +52,14 @@ describe('CurrencyPicker', () => {
|
|
|
52
52
|
})
|
|
53
53
|
|
|
54
54
|
it('should render currency selector', () => {
|
|
55
|
-
const selector = picker.shadowRoot?.querySelector('
|
|
55
|
+
const selector = picker.shadowRoot?.querySelector('ui-select')
|
|
56
56
|
assert.exists(selector)
|
|
57
57
|
assert.equal(selector?.getAttribute('label'), 'Add Currency')
|
|
58
58
|
})
|
|
59
59
|
|
|
60
60
|
it('should populate currency options', async () => {
|
|
61
61
|
await nextFrame()
|
|
62
|
-
const options = picker.shadowRoot?.querySelectorAll('
|
|
62
|
+
const options = picker.shadowRoot?.querySelectorAll('ui-option')
|
|
63
63
|
assert.exists(options)
|
|
64
64
|
assert.isAtLeast(options?.length || 0, 25) // Should have popular currencies
|
|
65
65
|
})
|
|
@@ -73,7 +73,7 @@ describe('CurrencyPicker', () => {
|
|
|
73
73
|
})
|
|
74
74
|
|
|
75
75
|
it('should select a currency', async () => {
|
|
76
|
-
const select = picker.shadowRoot?.querySelector('
|
|
76
|
+
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
77
77
|
assert.exists(select)
|
|
78
78
|
|
|
79
79
|
// Simulate selecting USD
|
|
@@ -95,7 +95,7 @@ describe('CurrencyPicker', () => {
|
|
|
95
95
|
const changePromise = oneEvent(picker, 'change')
|
|
96
96
|
|
|
97
97
|
// Simulate user selecting a currency through the select element
|
|
98
|
-
const select = picker.shadowRoot?.querySelector('
|
|
98
|
+
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
99
99
|
assert.exists(select)
|
|
100
100
|
|
|
101
101
|
const changeEvent = new CustomEvent('change', {
|
|
@@ -197,7 +197,7 @@ describe('CurrencyPicker', () => {
|
|
|
197
197
|
picker.selected = ['USD']
|
|
198
198
|
await nextFrame()
|
|
199
199
|
|
|
200
|
-
const selectableCurrencies = picker.shadowRoot?.querySelectorAll('
|
|
200
|
+
const selectableCurrencies = picker.shadowRoot?.querySelectorAll('ui-option[value="USD"]')
|
|
201
201
|
assert.equal(selectableCurrencies?.length, 0) // USD should not be in options
|
|
202
202
|
})
|
|
203
203
|
})
|
|
@@ -212,7 +212,7 @@ describe('CurrencyPicker', () => {
|
|
|
212
212
|
it('should filter options based on allowed currencies', async () => {
|
|
213
213
|
await nextFrame()
|
|
214
214
|
|
|
215
|
-
const options = picker.shadowRoot?.querySelectorAll('
|
|
215
|
+
const options = picker.shadowRoot?.querySelectorAll('ui-option[value]')
|
|
216
216
|
const optionValues = Array.from(options || [])
|
|
217
217
|
.map((option) => option.getAttribute('value'))
|
|
218
218
|
.filter(Boolean)
|
|
@@ -260,7 +260,7 @@ describe('CurrencyPicker', () => {
|
|
|
260
260
|
picker.clearSelection() // This should trigger required validation error
|
|
261
261
|
await picker.updateComplete
|
|
262
262
|
const errorElement = picker.shadowRoot?.querySelector('.error')
|
|
263
|
-
const selectElement = picker.shadowRoot?.querySelector('
|
|
263
|
+
const selectElement = picker.shadowRoot?.querySelector('ui-select')
|
|
264
264
|
const isInvalid = !picker.validity.valid
|
|
265
265
|
const hasAriaInvalid = selectElement?.getAttribute('aria-invalid') === 'true'
|
|
266
266
|
|
|
@@ -357,7 +357,7 @@ describe('CurrencyPicker', () => {
|
|
|
357
357
|
await nextFrame()
|
|
358
358
|
|
|
359
359
|
const container = picker.shadowRoot?.querySelector('.currency-picker')
|
|
360
|
-
const select = picker.shadowRoot?.querySelector('
|
|
360
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
361
361
|
|
|
362
362
|
assert.equal(container?.getAttribute('role'), 'group')
|
|
363
363
|
assert.exists(container?.getAttribute('aria-label'))
|
|
@@ -386,7 +386,7 @@ describe('CurrencyPicker', () => {
|
|
|
386
386
|
})
|
|
387
387
|
|
|
388
388
|
it('should be keyboard navigable', async () => {
|
|
389
|
-
const select = picker.shadowRoot?.querySelector('
|
|
389
|
+
const select = picker.shadowRoot?.querySelector('ui-select') as HTMLElement
|
|
390
390
|
assert.exists(select)
|
|
391
391
|
|
|
392
392
|
// Focus should work
|
|
@@ -479,7 +479,7 @@ describe('CurrencyPicker', () => {
|
|
|
479
479
|
picker.disabled = true
|
|
480
480
|
await nextFrame()
|
|
481
481
|
|
|
482
|
-
const select = picker.shadowRoot?.querySelector('
|
|
482
|
+
const select = picker.shadowRoot?.querySelector('ui-select')
|
|
483
483
|
assert.isTrue(select?.hasAttribute('disabled'))
|
|
484
484
|
})
|
|
485
485
|
})
|
|
@@ -210,13 +210,13 @@ describe('DataTable', () => {
|
|
|
210
210
|
|
|
211
211
|
const sortedColumn = `<div class="cell-content">
|
|
212
212
|
C1
|
|
213
|
-
<
|
|
213
|
+
<ui-icon
|
|
214
214
|
aria-hidden="true"
|
|
215
215
|
class="sort-icon"
|
|
216
216
|
role="presentation"
|
|
217
217
|
>
|
|
218
218
|
arrow_downward
|
|
219
|
-
</
|
|
219
|
+
</ui-icon>`
|
|
220
220
|
|
|
221
221
|
assert.dom.equal(headerCells[0].querySelector('.cell-content'), sortedColumn)
|
|
222
222
|
assert.equal(headerCells[0].dataset.sort, 'name')
|
|
@@ -155,7 +155,7 @@ describe('md', () => {
|
|
|
155
155
|
const event = (await oneEvent(menuItem, 'submenu-open')) as CustomEvent<{ subMenu: UiSubMenu }>
|
|
156
156
|
|
|
157
157
|
assert.instanceOf(event, CustomEvent)
|
|
158
|
-
assert.
|
|
158
|
+
assert.isFalse(event.bubbles)
|
|
159
159
|
assert.isTrue(event.composed)
|
|
160
160
|
assert.isNotNull(event.detail.subMenu)
|
|
161
161
|
})
|
|
@@ -558,14 +558,13 @@ describe('md', () => {
|
|
|
558
558
|
composed: true,
|
|
559
559
|
})
|
|
560
560
|
|
|
561
|
-
// Access the protected method through type assertion
|
|
562
561
|
element['handleSubMenuSelect'](subMenuEvent)
|
|
563
562
|
|
|
564
563
|
assert.isTrue(selectSpy.calledOnce)
|
|
565
564
|
const dispatchedEvent = selectSpy.args[0][0] as CustomEvent
|
|
566
565
|
assert.equal(dispatchedEvent.detail.item, element)
|
|
567
566
|
assert.equal(dispatchedEvent.detail.index, 0)
|
|
568
|
-
assert.
|
|
567
|
+
assert.isFalse(dispatchedEvent.bubbles)
|
|
569
568
|
assert.isTrue(dispatchedEvent.composed)
|
|
570
569
|
})
|
|
571
570
|
})
|