@api-client/ui 0.2.10 → 0.2.11

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 (141) hide show
  1. package/build/src/md/UiElement.d.ts +5 -0
  2. package/build/src/md/UiElement.d.ts.map +1 -1
  3. package/build/src/md/UiElement.js +7 -0
  4. package/build/src/md/UiElement.js.map +1 -1
  5. package/build/src/md/button/ui-elevated-button.d.ts +1 -1
  6. package/build/src/md/button/ui-elevated-button.js +1 -1
  7. package/build/src/md/button/ui-elevated-button.js.map +1 -1
  8. package/build/src/md/button/ui-filled-button.d.ts +1 -1
  9. package/build/src/md/button/ui-filled-button.js +1 -1
  10. package/build/src/md/button/ui-filled-button.js.map +1 -1
  11. package/build/src/md/button/ui-filled-tonal-button.d.ts +3 -3
  12. package/build/src/md/button/ui-filled-tonal-button.d.ts.map +1 -1
  13. package/build/src/md/button/ui-filled-tonal-button.js +6 -6
  14. package/build/src/md/button/ui-filled-tonal-button.js.map +1 -1
  15. package/build/src/md/button/ui-outlined-button.d.ts +1 -1
  16. package/build/src/md/button/ui-outlined-button.js +1 -1
  17. package/build/src/md/button/ui-outlined-button.js.map +1 -1
  18. package/build/src/md/button/ui-text-button.d.ts +1 -1
  19. package/build/src/md/button/ui-text-button.js +1 -1
  20. package/build/src/md/button/ui-text-button.js.map +1 -1
  21. package/build/src/md/checkbox/internals/Checkbox.styles.d.ts.map +1 -1
  22. package/build/src/md/checkbox/internals/Checkbox.styles.js +55 -216
  23. package/build/src/md/checkbox/internals/Checkbox.styles.js.map +1 -1
  24. package/build/src/md/checkbox/internals/CheckboxElement.d.ts +10 -7
  25. package/build/src/md/checkbox/internals/CheckboxElement.d.ts.map +1 -1
  26. package/build/src/md/checkbox/internals/CheckboxElement.js +39 -32
  27. package/build/src/md/checkbox/internals/CheckboxElement.js.map +1 -1
  28. package/build/src/md/checkbox/internals/CheckedElement.d.ts.map +1 -1
  29. package/build/src/md/checkbox/internals/CheckedElement.js +1 -0
  30. package/build/src/md/checkbox/internals/CheckedElement.js.map +1 -1
  31. package/build/src/md/dropdown-list/internals/UiDropdownList.d.ts +13 -2
  32. package/build/src/md/dropdown-list/internals/UiDropdownList.d.ts.map +1 -1
  33. package/build/src/md/dropdown-list/internals/UiDropdownList.js +59 -20
  34. package/build/src/md/dropdown-list/internals/UiDropdownList.js.map +1 -1
  35. package/build/src/md/icon-button/internals/IconButton.d.ts +8 -24
  36. package/build/src/md/icon-button/internals/IconButton.d.ts.map +1 -1
  37. package/build/src/md/icon-button/internals/IconButton.js +35 -63
  38. package/build/src/md/icon-button/internals/IconButton.js.map +1 -1
  39. package/build/src/md/icon-button/internals/{IconButton.styles.d.ts → base.styles.d.ts} +1 -1
  40. package/build/src/md/icon-button/internals/base.styles.d.ts.map +1 -0
  41. package/build/src/md/icon-button/internals/base.styles.js +93 -0
  42. package/build/src/md/icon-button/internals/base.styles.js.map +1 -0
  43. package/build/src/md/icon-button/internals/filled-tonal.styles.d.ts +3 -0
  44. package/build/src/md/icon-button/internals/filled-tonal.styles.d.ts.map +1 -0
  45. package/build/src/md/icon-button/internals/filled-tonal.styles.js +30 -0
  46. package/build/src/md/icon-button/internals/filled-tonal.styles.js.map +1 -0
  47. package/build/src/md/icon-button/internals/filled.styles.d.ts +3 -0
  48. package/build/src/md/icon-button/internals/filled.styles.d.ts.map +1 -0
  49. package/build/src/md/icon-button/internals/filled.styles.js +36 -0
  50. package/build/src/md/icon-button/internals/filled.styles.js.map +1 -0
  51. package/build/src/md/icon-button/internals/outlined.styles.d.ts +3 -0
  52. package/build/src/md/icon-button/internals/outlined.styles.d.ts.map +1 -0
  53. package/build/src/md/icon-button/internals/outlined.styles.js +31 -0
  54. package/build/src/md/icon-button/internals/outlined.styles.js.map +1 -0
  55. package/build/src/md/icon-button/internals/standard.styles.d.ts +3 -0
  56. package/build/src/md/icon-button/internals/standard.styles.d.ts.map +1 -0
  57. package/build/src/md/icon-button/internals/standard.styles.js +18 -0
  58. package/build/src/md/icon-button/internals/standard.styles.js.map +1 -0
  59. package/build/src/md/icon-button/ui-filled-icon-button.d.ts +11 -0
  60. package/build/src/md/icon-button/ui-filled-icon-button.d.ts.map +1 -0
  61. package/build/src/md/icon-button/ui-filled-icon-button.js +28 -0
  62. package/build/src/md/icon-button/ui-filled-icon-button.js.map +1 -0
  63. package/build/src/md/icon-button/ui-filled-tonal-icon-button.d.ts +11 -0
  64. package/build/src/md/icon-button/ui-filled-tonal-icon-button.d.ts.map +1 -0
  65. package/build/src/md/icon-button/ui-filled-tonal-icon-button.js +28 -0
  66. package/build/src/md/icon-button/ui-filled-tonal-icon-button.js.map +1 -0
  67. package/build/src/md/icon-button/ui-icon-button.d.ts.map +1 -1
  68. package/build/src/md/icon-button/ui-icon-button.js +3 -2
  69. package/build/src/md/icon-button/ui-icon-button.js.map +1 -1
  70. package/build/src/md/icon-button/ui-outlined-icon-button.d.ts +11 -0
  71. package/build/src/md/icon-button/ui-outlined-icon-button.d.ts.map +1 -0
  72. package/build/src/md/icon-button/ui-outlined-icon-button.js +28 -0
  73. package/build/src/md/icon-button/ui-outlined-icon-button.js.map +1 -0
  74. package/build/src/md/icons/internals/Icon.d.ts +1 -0
  75. package/build/src/md/icons/internals/Icon.d.ts.map +1 -1
  76. package/build/src/md/icons/internals/Icon.js +13 -0
  77. package/build/src/md/icons/internals/Icon.js.map +1 -1
  78. package/build/src/md/icons/internals/Icon.styles.d.ts.map +1 -1
  79. package/build/src/md/icons/internals/Icon.styles.js +31 -2
  80. package/build/src/md/icons/internals/Icon.styles.js.map +1 -1
  81. package/build/src/md/list/internals/ListItem.d.ts +4 -3
  82. package/build/src/md/list/internals/ListItem.d.ts.map +1 -1
  83. package/build/src/md/list/internals/ListItem.js +20 -18
  84. package/build/src/md/list/internals/ListItem.js.map +1 -1
  85. package/build/src/md/list/internals/ListItem.styles.d.ts.map +1 -1
  86. package/build/src/md/list/internals/ListItem.styles.js +6 -2
  87. package/build/src/md/list/internals/ListItem.styles.js.map +1 -1
  88. package/build/src/md/ripple/internals/ripple.d.ts +2 -1
  89. package/build/src/md/ripple/internals/ripple.d.ts.map +1 -1
  90. package/build/src/md/ripple/internals/ripple.js +42 -12
  91. package/build/src/md/ripple/internals/ripple.js.map +1 -1
  92. package/build/src/md/segmented-button/internals/SegmentedButton.d.ts +1 -1
  93. package/build/src/md/segmented-button/internals/SegmentedButton.d.ts.map +1 -1
  94. package/build/src/md/segmented-button/internals/SegmentedButton.js +1 -1
  95. package/build/src/md/segmented-button/internals/SegmentedButton.js.map +1 -1
  96. package/demo/md/buttons/{button.html → index.html} +1 -1
  97. package/demo/md/{inputs/checkbox.html → checkbox/index.html} +1 -1
  98. package/demo/md/{list/dropdown-list.html → dropdown-list/index.html} +1 -1
  99. package/demo/md/{buttons/icon-button.html → icon-button/index.html} +5 -1
  100. package/demo/md/icon-button/index.ts +236 -0
  101. package/demo/md/index.html +36 -29
  102. package/demo/md/listbox/listbox.html +31 -0
  103. package/demo/md/listbox/listbox.ts +27 -0
  104. package/demo/md/{buttons/segmented-buttons.html → segmented-button/index.html} +1 -1
  105. package/package.json +1 -1
  106. package/src/md/UiElement.ts +8 -0
  107. package/src/md/button/ui-elevated-button.ts +1 -1
  108. package/src/md/button/ui-filled-button.ts +1 -1
  109. package/src/md/button/ui-filled-tonal-button.ts +3 -3
  110. package/src/md/button/ui-outlined-button.ts +1 -1
  111. package/src/md/button/ui-text-button.ts +1 -1
  112. package/src/md/checkbox/internals/Checkbox.styles.ts +55 -216
  113. package/src/md/checkbox/internals/CheckboxElement.ts +39 -26
  114. package/src/md/checkbox/internals/CheckedElement.ts +1 -0
  115. package/src/md/dropdown-list/internals/UiDropdownList.ts +60 -21
  116. package/src/md/icon-button/internals/IconButton.ts +29 -46
  117. package/src/md/icon-button/internals/base.styles.ts +93 -0
  118. package/src/md/icon-button/internals/filled-tonal.styles.ts +30 -0
  119. package/src/md/icon-button/internals/filled.styles.ts +36 -0
  120. package/src/md/icon-button/internals/outlined.styles.ts +31 -0
  121. package/src/md/icon-button/internals/standard.styles.ts +18 -0
  122. package/src/md/icon-button/ui-filled-icon-button.ts +16 -0
  123. package/src/md/icon-button/ui-filled-tonal-icon-button.ts +16 -0
  124. package/src/md/icon-button/ui-icon-button.ts +3 -2
  125. package/src/md/icon-button/ui-outlined-icon-button.ts +16 -0
  126. package/src/md/icons/internals/Icon.styles.ts +31 -2
  127. package/src/md/icons/internals/Icon.ts +14 -0
  128. package/src/md/list/internals/ListItem.styles.ts +6 -2
  129. package/src/md/list/internals/ListItem.ts +16 -21
  130. package/src/md/ripple/internals/ripple.ts +47 -13
  131. package/src/md/segmented-button/internals/SegmentedButton.ts +2 -2
  132. package/test/ui/button/UiIconButton.test.ts +1 -8
  133. package/build/src/md/icon-button/internals/IconButton.styles.d.ts.map +0 -1
  134. package/build/src/md/icon-button/internals/IconButton.styles.js +0 -614
  135. package/build/src/md/icon-button/internals/IconButton.styles.js.map +0 -1
  136. package/demo/md/buttons/icon-button.ts +0 -184
  137. package/src/md/icon-button/internals/IconButton.styles.ts +0 -614
  138. /package/demo/md/buttons/{button.ts → index.ts} +0 -0
  139. /package/demo/md/{inputs/checkbox.ts → checkbox/index.ts} +0 -0
  140. /package/demo/md/{list/dropdown-list.ts → dropdown-list/index.ts} +0 -0
  141. /package/demo/md/{buttons/segmented-buttons.ts → segmented-button/index.ts} +0 -0
@@ -6,6 +6,8 @@ import { BeginPressConfig, EndPressConfig } from '../../../controllers/ActionCon
6
6
  import UiRipple from '../../ripple/internals/ripple.js'
7
7
  import { setDisabled } from '../../../lib/disabled.js'
8
8
  import { ripple } from '../../effects/rippleDirective.js'
9
+
10
+ import '@material/web/focus/md-focus-ring.js'
9
11
  import '../../ripple/ui-ripple.js'
10
12
 
11
13
  export enum ListItemLines {
@@ -60,6 +62,8 @@ export default class UiListItem extends UiElement {
60
62
  */
61
63
  @property({ type: Boolean, reflect: true }) accessor static = false
62
64
 
65
+ @property({ type: Number, reflect: true }) override accessor tabIndex = -1
66
+
63
67
  constructor() {
64
68
  super()
65
69
 
@@ -71,11 +75,17 @@ export default class UiListItem extends UiElement {
71
75
  this.addEventListener('pointerup', this.handlePointerUp.bind(this))
72
76
  this.addEventListener('pointercancel', this.handlePointerCancel.bind(this))
73
77
  this.addEventListener('pointerleave', this.handlePointerLeave.bind(this))
78
+ this.addEventListener('pointerenter', this.handlePointerEnter.bind(this))
74
79
  this.addEventListener('contextmenu', this.handleContextMenu.bind(this))
75
80
  this.addEventListener('keydown', this.handleKeyDown.bind(this))
76
81
  this.addEventListener('keyup', this.handleKeyUp.bind(this))
77
- this.addEventListener('focus', this.handleFocus.bind(this))
78
- this.addEventListener('blur', this.handleBlur.bind(this))
82
+ }
83
+
84
+ protected override updated(changedProperties: PropertyValues<this>): void {
85
+ super.updated(changedProperties)
86
+ if (changedProperties.has('tabIndex') && (this.tabIndex === -1 || this.tabIndex === null)) {
87
+ this.ripple?.endPress()
88
+ }
79
89
  }
80
90
 
81
91
  override connectedCallback(): void {
@@ -98,8 +108,7 @@ export default class UiListItem extends UiElement {
98
108
  return
99
109
  }
100
110
  if (e.key !== ' ' && e.key !== 'Enter') return
101
-
102
- e.preventDefault()
111
+ // do not prevent default, so that parent elements can handle the key event
103
112
  this.beginPress({ positionEvent: e })
104
113
  }
105
114
 
@@ -111,7 +120,7 @@ export default class UiListItem extends UiElement {
111
120
  }
112
121
  if (e.key !== ' ' && e.key !== 'Enter') return
113
122
 
114
- e.preventDefault()
123
+ // do not prevent default, so that parent elements can handle the key event
115
124
  this.endPress({ cancelled: false, actionData: { item: this } })
116
125
  }
117
126
 
@@ -131,7 +140,7 @@ export default class UiListItem extends UiElement {
131
140
  this.ripple.endPress()
132
141
  }
133
142
 
134
- protected handlePointerEnter(e: PointerEvent): void {
143
+ override handlePointerEnter(e: PointerEvent): void {
135
144
  if (this.disabled || this.static) {
136
145
  e.stopPropagation()
137
146
  e.preventDefault()
@@ -151,20 +160,6 @@ export default class UiListItem extends UiElement {
151
160
  this.ripple.endHover()
152
161
  }
153
162
 
154
- protected handleFocus(): void {
155
- if (this.disabled || this.static) {
156
- return
157
- }
158
- this.ripple.beginFocus()
159
- }
160
-
161
- protected handleBlur(): void {
162
- if (this.disabled || this.static) {
163
- return
164
- }
165
- this.ripple.endFocus()
166
- }
167
-
168
163
  /**
169
164
  * Focuses list item and makes list item focusable via keyboard.
170
165
  */
@@ -174,7 +169,6 @@ export default class UiListItem extends UiElement {
174
169
  }
175
170
  this.setAttribute('tabindex', '0')
176
171
  this.focus()
177
- this.ripple.beginFocus()
178
172
  }
179
173
 
180
174
  /**
@@ -209,6 +203,7 @@ export default class UiListItem extends UiElement {
209
203
  })
210
204
 
211
205
  return html`
206
+ <md-focus-ring part="focus-ring" .control="${this as HTMLElement}" inward></md-focus-ring>
212
207
  <div class="${surfaceClasses}" ${ripple(() => this.ripple)}>
213
208
  <div class="container"></div>
214
209
  <div class="state"></div>
@@ -7,10 +7,10 @@
7
7
  import { html, LitElement, PropertyValues, TemplateResult } from 'lit'
8
8
  import { property, query, state } from 'lit/decorators.js'
9
9
  import { ClassInfo, classMap } from 'lit/directives/class-map.js'
10
- import { createAnimationSignal, Easing } from '../../motion/animation.js'
10
+ import { Easing } from '../../motion/animation.js'
11
11
 
12
12
  const PRESS_GROW_MS = 450
13
- const MINIMUM_PRESS_MS = 225
13
+ const MINIMUM_PRESS_MS = 80
14
14
  const INITIAL_ORIGIN_SCALE = 0.2
15
15
  const PADDING = 10
16
16
  const SOFT_EDGE_MINIMUM_SIZE = 75
@@ -52,7 +52,9 @@ export default class UiRipple extends LitElement {
52
52
 
53
53
  protected initialSize = 0
54
54
 
55
- protected pressAnimationSignal = createAnimationSignal()
55
+ private rippleStartEvent?: Event | null
56
+
57
+ // protected pressAnimationSignal = createAnimationSignal()
56
58
 
57
59
  protected growAnimation: Animation | null = null
58
60
 
@@ -147,13 +149,14 @@ export default class UiRipple extends LitElement {
147
149
  if (!mdRoot) {
148
150
  return
149
151
  }
150
-
152
+ this.pressed = true
153
+ this.growAnimation?.cancel()
151
154
  this.determineRippleSize()
152
155
  const { startPoint, endPoint } = this.getTranslationCoordinates(positionEvent)
153
156
  const translateStart = `${startPoint.x}px, ${startPoint.y}px`
154
157
  const translateEnd = `${endPoint.x}px, ${endPoint.y}px`
155
158
 
156
- const signal = this.pressAnimationSignal.start()
159
+ // const signal = this.pressAnimationSignal.start()
157
160
 
158
161
  const growAnimation = mdRoot.animate(
159
162
  {
@@ -171,19 +174,48 @@ export default class UiRipple extends LitElement {
171
174
  }
172
175
  )
173
176
 
174
- growAnimation.addEventListener('finish', () => {
175
- this.pressAnimationSignal.finish()
176
- this.growAnimation = null
177
- })
177
+ // growAnimation.addEventListener('finish', () => {
178
+ // this.pressAnimationSignal.finish()
179
+ // this.growAnimation = null
180
+ // })
178
181
 
179
- signal.addEventListener('abort', () => {
180
- growAnimation.cancel()
181
- this.growAnimation = null
182
- })
182
+ // signal.addEventListener('abort', () => {
183
+ // growAnimation.cancel()
184
+ // this.growAnimation = null
185
+ // })
183
186
 
184
187
  this.growAnimation = growAnimation
185
188
  }
186
189
 
190
+ private async endPressAnimation() {
191
+ this.rippleStartEvent = undefined
192
+ // this.state = State.INACTIVE
193
+ const animation = this.growAnimation
194
+ let pressAnimationPlayState = Infinity
195
+ if (typeof animation?.currentTime === 'number') {
196
+ pressAnimationPlayState = animation.currentTime
197
+ } else if (animation?.currentTime) {
198
+ pressAnimationPlayState = animation.currentTime.to('ms').value
199
+ }
200
+
201
+ if (pressAnimationPlayState >= MINIMUM_PRESS_MS) {
202
+ this.pressed = false
203
+ return
204
+ }
205
+
206
+ await new Promise((resolve) => {
207
+ setTimeout(resolve, MINIMUM_PRESS_MS - pressAnimationPlayState)
208
+ })
209
+
210
+ if (this.growAnimation !== animation) {
211
+ // A new press animation was started. The old animation was canceled and
212
+ // should not finish the pressed state.
213
+ return
214
+ }
215
+
216
+ this.pressed = false
217
+ }
218
+
187
219
  beginHover(hoverEvent?: Event): void {
188
220
  if ((hoverEvent as PointerEvent)?.pointerType !== 'touch') {
189
221
  this.hovered = true
@@ -204,6 +236,7 @@ export default class UiRipple extends LitElement {
204
236
 
205
237
  beginPress(positionEvent?: Event | null): void {
206
238
  this.pressed = true
239
+ this.rippleStartEvent = positionEvent
207
240
  if (this.delayedEndPressHandle !== null) {
208
241
  clearTimeout(this.delayedEndPressHandle)
209
242
  this.delayedEndPressHandle = null
@@ -221,5 +254,6 @@ export default class UiRipple extends LitElement {
221
254
  this.delayedEndPressHandle = null
222
255
  }, MINIMUM_PRESS_MS - pressAnimationPlayState) as unknown as number
223
256
  }
257
+ this.endPressAnimation()
224
258
  }
225
259
  }
@@ -42,7 +42,6 @@ export default class SegmentedButton extends UiElement {
42
42
 
43
43
  constructor() {
44
44
  super()
45
- this.addEventListener('pointerenter', this.handlePointerEnter.bind(this))
46
45
  this.actionController.cancelKeyboardEvents = true
47
46
  this.addEventListener('keydown', this.handleKeyDown.bind(this))
48
47
  this.addEventListener('keyup', this.handleKeyUp.bind(this))
@@ -50,6 +49,7 @@ export default class SegmentedButton extends UiElement {
50
49
  this.addEventListener('pointerdown', this.handlePointerDown.bind(this))
51
50
  this.addEventListener('pointerup', this.handlePointerUp.bind(this))
52
51
  this.addEventListener('pointercancel', this.handlePointerCancel.bind(this))
52
+ this.addEventListener('pointerenter', this.handlePointerEnter.bind(this))
53
53
  this.addEventListener('pointerleave', this.handlePointerLeave.bind(this))
54
54
  this.addEventListener('contextmenu', this.handleContextMenu.bind(this))
55
55
  }
@@ -78,7 +78,7 @@ export default class SegmentedButton extends UiElement {
78
78
  }
79
79
  }
80
80
 
81
- protected handlePointerEnter(e: PointerEvent): void {
81
+ override handlePointerEnter(e: PointerEvent): void {
82
82
  this.ripple.beginHover(e)
83
83
  }
84
84
 
@@ -1,6 +1,6 @@
1
1
  import { assert, fixture, html, nextFrame, oneEvent } from '@open-wc/testing'
2
2
  import sinon from 'sinon'
3
- import UiIconButton, { IconButtonType } from '../../../src/md/icon-button/internals/IconButton.js'
3
+ import UiIconButton from '../../../src/md/icon-button/internals/IconButton.js'
4
4
  import { UiMock } from '../../helpers/UiMock.js'
5
5
  import { IconType } from '../../../src/md/icons/Icons.js'
6
6
 
@@ -37,13 +37,6 @@ describe('md', () => {
37
37
  )
38
38
  }
39
39
 
40
- describe('defaults', () => {
41
- it('sets the default type', async () => {
42
- const button = await basicFixture('add')
43
- assert.equal(button.type, IconButtonType.standard)
44
- })
45
- })
46
-
47
40
  describe('toggle button', () => {
48
41
  it('sets button active when pressing the button with space', async () => {
49
42
  const button = await toggleFixture('add')
@@ -1 +0,0 @@
1
- {"version":3,"file":"IconButton.styles.d.ts","sourceRoot":"","sources":["../../../../../src/md/icon-button/internals/IconButton.styles.ts"],"names":[],"mappings":";AAEA,wBAmmBC"}