@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.
Files changed (92) hide show
  1. package/build/src/elements/app-bar/internals/AppBar.d.ts +1 -1
  2. package/build/src/elements/app-bar/internals/AppBar.d.ts.map +1 -1
  3. package/build/src/elements/app-bar/internals/AppBar.js +5 -5
  4. package/build/src/elements/app-bar/internals/AppBar.js.map +1 -1
  5. package/build/src/elements/currency/internals/Picker.d.ts +2 -2
  6. package/build/src/elements/currency/internals/Picker.d.ts.map +1 -1
  7. package/build/src/elements/currency/internals/Picker.js +13 -12
  8. package/build/src/elements/currency/internals/Picker.js.map +1 -1
  9. package/build/src/elements/data-table/DataTable.d.ts +1 -3
  10. package/build/src/elements/data-table/DataTable.d.ts.map +1 -1
  11. package/build/src/elements/data-table/DataTable.js +2 -4
  12. package/build/src/elements/data-table/DataTable.js.map +1 -1
  13. package/build/src/elements/file-system/internals/Breadcrumbs.d.ts +1 -2
  14. package/build/src/elements/file-system/internals/Breadcrumbs.d.ts.map +1 -1
  15. package/build/src/elements/file-system/internals/Breadcrumbs.js +2 -3
  16. package/build/src/elements/file-system/internals/Breadcrumbs.js.map +1 -1
  17. package/build/src/elements/navigation/internals/NavigationItem.js +1 -1
  18. package/build/src/elements/navigation/internals/NavigationItem.js.map +1 -1
  19. package/build/src/md/list/internals/List.d.ts +4 -2
  20. package/build/src/md/list/internals/List.d.ts.map +1 -1
  21. package/build/src/md/list/internals/List.js +16 -6
  22. package/build/src/md/list/internals/List.js.map +1 -1
  23. package/build/src/md/list/internals/ListItem.d.ts +10 -1
  24. package/build/src/md/list/internals/ListItem.d.ts.map +1 -1
  25. package/build/src/md/list/internals/ListItem.js +74 -8
  26. package/build/src/md/list/internals/ListItem.js.map +1 -1
  27. package/build/src/md/list/internals/ListItem.styles.d.ts.map +1 -1
  28. package/build/src/md/list/internals/ListItem.styles.js +38 -28
  29. package/build/src/md/list/internals/ListItem.styles.js.map +1 -1
  30. package/build/src/md/menu/internal/MenuItem.js +4 -4
  31. package/build/src/md/menu/internal/MenuItem.js.map +1 -1
  32. package/build/src/md/progress/internals/CircularProgress.d.ts +93 -0
  33. package/build/src/md/progress/internals/CircularProgress.d.ts.map +1 -0
  34. package/build/src/md/progress/internals/CircularProgress.js +156 -0
  35. package/build/src/md/progress/internals/CircularProgress.js.map +1 -0
  36. package/build/src/md/progress/internals/CircularProgress.styles.d.ts +3 -0
  37. package/build/src/md/progress/internals/CircularProgress.styles.d.ts.map +1 -0
  38. package/build/src/md/progress/internals/CircularProgress.styles.js +220 -0
  39. package/build/src/md/progress/internals/CircularProgress.styles.js.map +1 -0
  40. package/build/src/md/progress/internals/Range.d.ts +6 -0
  41. package/build/src/md/progress/internals/Range.d.ts.map +1 -1
  42. package/build/src/md/progress/internals/Range.js +41 -3
  43. package/build/src/md/progress/internals/Range.js.map +1 -1
  44. package/build/src/md/progress/internals/UiProgress.d.ts +0 -7
  45. package/build/src/md/progress/internals/UiProgress.d.ts.map +1 -1
  46. package/build/src/md/progress/internals/UiProgress.js +2 -36
  47. package/build/src/md/progress/internals/UiProgress.js.map +1 -1
  48. package/build/src/md/progress/ui-circular-progress.d.ts +11 -0
  49. package/build/src/md/progress/ui-circular-progress.d.ts.map +1 -0
  50. package/build/src/md/progress/ui-circular-progress.js +27 -0
  51. package/build/src/md/progress/ui-circular-progress.js.map +1 -0
  52. package/build/src/md/select/internals/Option.js +2 -2
  53. package/build/src/md/select/internals/Option.js.map +1 -1
  54. package/build/src/md/select/internals/Option.styles.d.ts.map +1 -1
  55. package/build/src/md/select/internals/Option.styles.js +0 -127
  56. package/build/src/md/select/internals/Option.styles.js.map +1 -1
  57. package/build/src/md/select/internals/Select.d.ts +11 -1
  58. package/build/src/md/select/internals/Select.d.ts.map +1 -1
  59. package/build/src/md/select/internals/Select.js +21 -2
  60. package/build/src/md/select/internals/Select.js.map +1 -1
  61. package/demo/elements/currency/index.html +2 -2
  62. package/demo/elements/navigation/navigation-item.html +4 -0
  63. package/demo/elements/navigation/navigation-item.ts +19 -0
  64. package/demo/md/list/list.ts +9 -3
  65. package/demo/md/progress/progress.ts +24 -1
  66. package/demo/md/select/index.ts +5 -0
  67. package/demo/md/tabs/tabs.ts +0 -4
  68. package/package.json +1 -1
  69. package/src/elements/app-bar/internals/AppBar.ts +5 -5
  70. package/src/elements/currency/internals/Picker.ts +17 -16
  71. package/src/elements/data-table/DataTable.ts +2 -4
  72. package/src/elements/file-system/internals/Breadcrumbs.ts +2 -3
  73. package/src/elements/navigation/internals/NavigationItem.ts +1 -1
  74. package/src/md/list/internals/List.ts +19 -8
  75. package/src/md/list/internals/ListItem.styles.ts +38 -28
  76. package/src/md/list/internals/ListItem.ts +55 -8
  77. package/src/md/menu/internal/MenuItem.ts +4 -4
  78. package/src/md/progress/internals/CircularProgress.styles.ts +220 -0
  79. package/src/md/progress/internals/CircularProgress.ts +129 -0
  80. package/src/md/progress/internals/Range.ts +29 -1
  81. package/src/md/progress/internals/UiProgress.ts +1 -30
  82. package/src/md/progress/ui-circular-progress.ts +15 -0
  83. package/src/md/select/internals/Option.styles.ts +0 -127
  84. package/src/md/select/internals/Option.ts +2 -2
  85. package/src/md/select/internals/Select.ts +13 -1
  86. package/test/elements/currency/CurrencyPicker.accessibility.test.ts +14 -14
  87. package/test/elements/currency/CurrencyPicker.core.test.ts +6 -6
  88. package/test/elements/currency/CurrencyPicker.integration.test.ts +2 -2
  89. package/test/elements/currency/CurrencyPicker.test.ts +10 -10
  90. package/test/elements/data-table/DataTable.browser.test.ts +2 -2
  91. package/test/md/menu/MenuItem.test.ts +2 -3
  92. 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') || cp.has('indeterminate')) {
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: true,
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.handleSlotChange}></slot>
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
- * @default false
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('md-outlined-select')
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('md-outlined-select')
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('md-outlined-select') as HTMLElement
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('md-outlined-select') as HTMLElement
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 md-outlined-select)
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('md-outlined-select') as HTMLElement
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('md-outlined-select') as HTMLElement
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('md-outlined-select')
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('md-select-option')
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('md-outlined-select')
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('md-outlined-select')
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('md-outlined-select')
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('md-outlined-select')
306
- const options = picker.shadowRoot?.querySelectorAll('md-select-option')
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('md-outlined-select')
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('md-select-option')
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('md-select-option[value]')
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('md-outlined-select')
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('md-outlined-select')
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('md-outlined-select')
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('md-outlined-select')
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('md-outlined-select') as HTMLElement
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('md-outlined-select')
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('md-select-option')
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('md-outlined-select') as HTMLElement
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('md-outlined-select') as HTMLElement
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('md-select-option[value="USD"]')
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('md-select-option[value]')
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('md-outlined-select')
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('md-outlined-select')
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('md-outlined-select') as HTMLElement
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('md-outlined-select')
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
- <md-icon
213
+ <ui-icon
214
214
  aria-hidden="true"
215
215
  class="sort-icon"
216
216
  role="presentation"
217
217
  >
218
218
  arrow_downward
219
- </md-icon>`
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.isTrue(event.bubbles)
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.isTrue(dispatchedEvent.bubbles)
567
+ assert.isFalse(dispatchedEvent.bubbles)
569
568
  assert.isTrue(dispatchedEvent.composed)
570
569
  })
571
570
  })