@redvars/peacock 3.6.1 → 3.6.3

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 (120) hide show
  1. package/dist/assets/components.css.map +1 -1
  2. package/dist/assets/styles.css +1 -1
  3. package/dist/assets/styles.css.map +1 -1
  4. package/dist/assets/tokens.css +1 -1
  5. package/dist/assets/tokens.css.map +1 -1
  6. package/dist/{button-colors-Ccys3hvS.js → button-colors-Cg6oxiz-.js} +126 -116
  7. package/dist/{button-colors-Ccys3hvS.js.map → button-colors-Cg6oxiz-.js.map} +1 -1
  8. package/dist/button-group.js +2 -2
  9. package/dist/button.js +18 -16
  10. package/dist/button.js.map +1 -1
  11. package/dist/canvas.js +126 -107
  12. package/dist/canvas.js.map +1 -1
  13. package/dist/card.js +1 -1
  14. package/dist/card.js.map +1 -1
  15. package/dist/code-highlighter.js +34 -9
  16. package/dist/code-highlighter.js.map +1 -1
  17. package/dist/custom-elements-jsdocs.json +4306 -3215
  18. package/dist/custom-elements.json +8344 -7173
  19. package/dist/{flow-designer-node-BWrPuxAR.js → flow-designer-node-9Bqyn6qx.js} +2 -1
  20. package/dist/flow-designer-node-9Bqyn6qx.js.map +1 -0
  21. package/dist/flow-designer-node.js +1 -1
  22. package/dist/flow-designer.js +1402 -8
  23. package/dist/flow-designer.js.map +1 -1
  24. package/dist/icon-CueRR7wx.js +260 -0
  25. package/dist/icon-CueRR7wx.js.map +1 -0
  26. package/dist/{icon-button-CK1ZuE-2.js → icon-button-AdJBEoNy.js} +34 -30
  27. package/dist/icon-button-AdJBEoNy.js.map +1 -0
  28. package/dist/index.js +10 -9
  29. package/dist/index.js.map +1 -1
  30. package/dist/modal.js +11 -11
  31. package/dist/modal.js.map +1 -1
  32. package/dist/{navigation-rail-DTTkqohi.js → navigation-rail-DAUuJ_Yp.js} +975 -486
  33. package/dist/navigation-rail-DAUuJ_Yp.js.map +1 -0
  34. package/dist/peacock-loader.js +33 -30
  35. package/dist/peacock-loader.js.map +1 -1
  36. package/dist/{popover-NC7b1lTq.js → popover-DUPmMVWS.js} +9 -4
  37. package/dist/{popover-NC7b1lTq.js.map → popover-DUPmMVWS.js.map} +1 -1
  38. package/dist/popover-content.js +1 -1
  39. package/dist/popover-content.js.map +1 -1
  40. package/dist/popover.js +1 -1
  41. package/dist/search.js +11 -14
  42. package/dist/search.js.map +1 -1
  43. package/dist/src/__controllers/floating-controller.d.ts +1 -0
  44. package/dist/src/avatar/avatar.d.ts +1 -1
  45. package/dist/src/breadcrumb/breadcrumb/breadcrumb.d.ts +0 -1
  46. package/dist/src/canvas/canvas.d.ts +3 -3
  47. package/dist/src/chip/chip/chip.d.ts +14 -11
  48. package/dist/src/chip/chip-set/chip-set.d.ts +20 -0
  49. package/dist/src/chip/chip-set/index.d.ts +1 -0
  50. package/dist/src/code-highlighter/code-highlighter.d.ts +4 -0
  51. package/dist/src/field/field.d.ts +1 -0
  52. package/dist/src/flow-designer/flow-designer-node.d.ts +1 -0
  53. package/dist/src/image/image.d.ts +2 -2
  54. package/dist/src/index.d.ts +2 -0
  55. package/dist/src/input/input.d.ts +1 -3
  56. package/dist/src/item/index.d.ts +1 -0
  57. package/dist/src/item/item.d.ts +48 -0
  58. package/dist/src/menu/menu/menu.d.ts +1 -0
  59. package/dist/src/menu/menu-item/menu-item.d.ts +8 -9
  60. package/dist/src/menu/sub-menu/sub-menu.d.ts +1 -0
  61. package/dist/src/modal/modal.d.ts +1 -1
  62. package/dist/src/navigation-rail/navigation-rail.d.ts +2 -6
  63. package/dist/src/popover/popover-content.d.ts +1 -1
  64. package/dist/src/search/search.d.ts +2 -6
  65. package/dist/test/chip.test.d.ts +1 -0
  66. package/dist/test/item.test.d.ts +1 -0
  67. package/dist/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +1 -1
  69. package/readme.md +2 -2
  70. package/scss/mixin.scss +23 -0
  71. package/scss/styles.scss +3 -3
  72. package/scss/tokens.css +1 -1
  73. package/src/__controllers/floating-controller.ts +9 -3
  74. package/src/avatar/avatar.scss +4 -4
  75. package/src/avatar/avatar.ts +1 -1
  76. package/src/breadcrumb/breadcrumb/breadcrumb.ts +0 -1
  77. package/src/button/button/button-sizes.scss +11 -11
  78. package/src/button/button/button.scss +96 -122
  79. package/src/button/button/button.ts +38 -36
  80. package/src/button/icon-button/icon-button-sizes.scss +8 -8
  81. package/src/button/icon-button/icon-button.ts +23 -20
  82. package/src/canvas/canvas.scss +18 -6
  83. package/src/canvas/canvas.ts +125 -103
  84. package/src/card/card.ts +1 -1
  85. package/src/chip/chip/chip.scss +120 -46
  86. package/src/chip/chip/chip.ts +97 -38
  87. package/src/chip/chip-set/chip-set.scss +13 -0
  88. package/src/chip/chip-set/chip-set.ts +25 -0
  89. package/src/chip/chip-set/index.ts +1 -0
  90. package/src/code-highlighter/code-highlighter.ts +33 -6
  91. package/src/empty-state/empty-state.scss +1 -0
  92. package/src/field/field.scss +1 -1
  93. package/src/field/field.ts +6 -0
  94. package/src/flow-designer/flow-designer-node.ts +1 -0
  95. package/src/image/image.scss +21 -16
  96. package/src/image/image.ts +13 -14
  97. package/src/index.ts +2 -0
  98. package/src/input/input.ts +16 -25
  99. package/src/item/index.ts +1 -0
  100. package/src/item/item.scss +184 -0
  101. package/src/item/item.ts +340 -0
  102. package/src/menu/menu/menu.ts +16 -9
  103. package/src/menu/menu-item/menu-item.scss +30 -108
  104. package/src/menu/menu-item/menu-item.ts +89 -129
  105. package/src/menu/sub-menu/sub-menu.ts +6 -2
  106. package/src/modal/modal.scss +10 -10
  107. package/src/modal/modal.ts +1 -1
  108. package/src/navigation-rail/navigation-rail.ts +2 -6
  109. package/src/peacock-loader.ts +28 -22
  110. package/src/popover/popover-content.ts +1 -1
  111. package/src/search/search.ts +11 -16
  112. package/src/select/option.ts +1 -1
  113. package/src/select/select.scss +1 -10
  114. package/src/select/select.ts +2 -0
  115. package/dist/flow-designer-DvTUrDp5.js +0 -1656
  116. package/dist/flow-designer-DvTUrDp5.js.map +0 -1
  117. package/dist/flow-designer-node-BWrPuxAR.js.map +0 -1
  118. package/dist/icon-button-CK1ZuE-2.js.map +0 -1
  119. package/dist/navigation-rail-DTTkqohi.js.map +0 -1
  120. package/src/chip/chip/chip-colors.scss +0 -31
@@ -235,9 +235,7 @@ export class Menu extends LitElement {
235
235
  private _isEventFromThisMenu(event: Event) {
236
236
  const path = event.composedPath();
237
237
  const sourceMenu = path.find(
238
- target =>
239
- target instanceof HTMLElement &&
240
- target.tagName.toLowerCase() === 'wc-menu',
238
+ target => target instanceof Menu,
241
239
  );
242
240
 
243
241
  return sourceMenu === this;
@@ -252,12 +250,10 @@ export class Menu extends LitElement {
252
250
  const ownedItems = this.items;
253
251
 
254
252
  for (const target of path) {
255
- if (target instanceof HTMLElement) {
256
- if (target.tagName.toLowerCase() === 'wc-menu-item') {
257
- const ownedItem = ownedItems.find(item => item === target);
258
- if (ownedItem) {
259
- return ownedItem;
260
- }
253
+ if (target instanceof MenuItem) {
254
+ const ownedItem = ownedItems.find(item => item === target);
255
+ if (ownedItem) {
256
+ return ownedItem;
261
257
  }
262
258
  }
263
259
  }
@@ -276,6 +272,16 @@ export class Menu extends LitElement {
276
272
  this._syncRovingTabIndex();
277
273
  }
278
274
 
275
+ private _dispatchItemActivate(item: MenuItem) {
276
+ this.dispatchEvent(
277
+ new CustomEvent('menu-item-activate', {
278
+ bubbles: true,
279
+ composed: true,
280
+ detail: { item },
281
+ }),
282
+ );
283
+ }
284
+
279
285
  private _onClick = (event: Event) => {
280
286
  if (!this.open) {
281
287
  return;
@@ -287,6 +293,7 @@ export class Menu extends LitElement {
287
293
  }
288
294
 
289
295
  this._setActiveItem(item);
296
+ this._dispatchItemActivate(item);
290
297
  if (item.keepOpen) {
291
298
  return;
292
299
  }
@@ -3,118 +3,40 @@
3
3
  @include mixin.base-styles;
4
4
 
5
5
  :host {
6
- padding-inline: var(--spacing-050);
7
6
  outline: none;
8
- }
9
-
10
- .menu-item {
11
- position: relative;
12
- height: 3rem;
13
- display: flex;
14
- align-items: center;
15
- padding-inline: 0.75rem;
16
- outline: 0;
17
- text-decoration: none;
18
-
19
- @include mixin.get-typography(label-large);
20
-
21
- .menu-item-content {
22
- display: flex;
23
- align-items: center;
24
- z-index: 1;
25
- width: 100%;
26
- gap: var(--spacing-100);
27
-
28
- color: var(--_label-text-color);
29
- opacity: var(--_label-text-opacity, 1);
30
- --icon-size: var(--button-icon-size, var(--_button-icon-size));
31
- --icon-color: var(--_label-text-color);
32
-
33
- .slot-container {
34
- flex: 1;
35
- }
36
- }
37
-
38
-
39
- .background {
40
- display: block;
41
- position: absolute;
42
- left: 0;
43
- top: 0;
44
- width: 100%;
45
- height: 100%;
46
- background-color: var(--_container-color);
47
- opacity: var(--_container-opacity, 1);
48
7
 
49
- border-start-start-radius: var(--_container-shape-start-start);
50
- border-start-end-radius: var(--_container-shape-start-end);
51
- border-end-start-radius: var(--_container-shape-end-start);
52
- border-end-end-radius: var(--_container-shape-end-end);
53
- corner-shape: var(--_container-corner-shape-variant);
54
- pointer-events: none;
55
- }
56
-
57
- /*
58
- Background layers
59
- */
60
- .focus-ring {
61
- z-index: 2;
62
- --focus-ring-container-shape-start-start: var(--_container-shape-start-start);
63
- --focus-ring-container-shape-start-end: var(--_container-shape-start-end);
64
- --focus-ring-container-shape-end-start: var(--_container-shape-end-start);
65
- --focus-ring-container-shape-end-end: var(--_container-shape-end-end);
66
- --focus-ring-container-shape-variant: var(--_container-corner-shape-variant);
67
- }
68
-
69
- .ripple {
70
- --ripple-state-opacity: var(--_container-state-opacity, 0);
71
- --ripple-pressed-color: var(--_container-state-color);
72
- border-start-start-radius: var(--_container-shape-start-start);
73
- border-start-end-radius: var(--_container-shape-start-end);
74
- border-end-start-radius: var(--_container-shape-end-start);
75
- border-end-end-radius: var(--_container-shape-end-end);
76
- corner-shape: var(--_container-corner-shape-variant);
77
- }
8
+ --menu-item-container-shape-start-start: var(--shape-corner-extra-small);
9
+ --menu-item-container-shape-start-end: var(--shape-corner-extra-small);
10
+ --menu-item-container-shape-end-start: var(--shape-corner-extra-small);
11
+ --menu-item-container-shape-end-end: var(--shape-corner-extra-small);
78
12
  }
79
13
 
80
-
81
14
  .menu-item {
15
+ width: 100%;
16
+ --item-height: 3rem;
17
+ --item-container-shape-start-start: var(--menu-item-container-shape-start-start);
18
+ --item-container-shape-start-end: var(--menu-item-container-shape-start-end);
19
+ --item-container-shape-end-start: var(--menu-item-container-shape-end-start);
20
+ --item-container-shape-end-end: var(--menu-item-container-shape-end-end);
21
+ --item-container-shape-variant: none;
22
+
23
+ --item-label-font-family: var(--typography-label-large-font-family);
24
+ --item-label-font-size: var(--typography-label-large-font-size);
25
+ --item-label-font-weight: var(--typography-label-large-font-weight);
26
+ --item-label-line-height: var(--typography-label-large-line-height);
27
+ --item-label-letter-spacing: var(--typography-label-large-letter-spacing);
28
+
29
+ --item-label-text-color: var(--menu-item-label-color);
30
+ --item-leading-trailing-color: var(--menu-item-label-color);
31
+ --item-supporting-text-color: var(--menu-item-label-color);
32
+ --item-container-selected-color: var(--menu-item-container-selected-color);
33
+ --item-label-text-selected-color: var(--menu-item-label-selected-color);
34
+ --item-icon-size: var(--button-icon-size, var(--_button-icon-size));
35
+ }
82
36
 
83
- --_container-shape-start-start: var(--menu-item-container-shape-start-start, var(--shape-corner-extra-small));
84
- --_container-shape-start-end: var(--menu-item-container-shape-start-end, var(--shape-corner-extra-small));
85
- --_container-shape-end-start: var(--menu-item-container-shape-end-start, var(--shape-corner-extra-small));
86
- --_container-shape-end-end: var(--menu-item-container-shape-end-end, var(--shape-corner-extra-small));
87
- --_container-corner-shape-variant: none;
88
- --_label-text-color: var(--menu-item-label-color);
89
- --_container-state-color: var(--_label-text-color);
90
-
91
- &:hover:not(:where(.disabled, .selected)) {
92
- --_container-state-opacity: 0.08;
93
- }
94
-
95
- &.pressed:not(:where(.disabled)) {
96
- --_container-state-opacity: 0.12;
97
- }
98
-
99
- &.selected {
100
- --_container-color: var(--menu-item-container-selected-color);
101
- --_label-text-color: var(--menu-item-label-selected-color);
102
- --_container-shape-start-start: var(--shape-corner-large);
103
- --_container-shape-start-end: var(--shape-corner-large);
104
- --_container-shape-end-start: var(--shape-corner-large);
105
- --_container-shape-end-end: var(--shape-corner-large);
106
- --_container-corner-shape-variant: none;
107
- }
108
-
109
- &.disabled {
110
- cursor: not-allowed;
111
- --_container-color: var(--color-on-surface);
112
- --_container-opacity: 0.1;
113
- --_label-text-color: var(--color-on-surface);
114
- --_label-text-opacity: 0.38;
115
-
116
- .ripple {
117
- display: none;
118
- }
119
- }
37
+ :host([selected]) {
38
+ --menu-item-container-shape-start-start: var(--shape-corner-large);
39
+ --menu-item-container-shape-start-end: var(--shape-corner-large);
40
+ --menu-item-container-shape-end-start: var(--shape-corner-large);
41
+ --menu-item-container-shape-end-end: var(--shape-corner-large);
120
42
  }
@@ -1,11 +1,11 @@
1
1
  import { html, LitElement, nothing } from 'lit';
2
- import { property, query, state } from 'lit/decorators.js';
3
- import { classMap } from 'lit/directives/class-map.js';
2
+ import { property, query } from 'lit/decorators.js';
3
+ import { ifDefined } from 'lit/directives/if-defined.js';
4
4
  import styles from './menu-item.scss';
5
5
  import colorStyles from './menu-item-colors.scss';
6
6
  import BaseButtonMixin from '@/__mixins/BaseButtonMixin.js';
7
7
  import BaseHyperlinkMixin from '@/__mixins/BaseHyperlinkMixin.js';
8
- import { dispatchActivationClick, isActivationClick } from '@/__utils/dispatch-event-utils.js';
8
+ import { Item } from '@/item/item.js';
9
9
 
10
10
  /**
11
11
  * @label Menu Item
@@ -21,7 +21,6 @@ import { dispatchActivationClick, isActivationClick } from '@/__utils/dispatch-e
21
21
  * ```
22
22
  */
23
23
  export class MenuItem extends BaseButtonMixin(BaseHyperlinkMixin(LitElement)) {
24
-
25
24
  @property({ type: String }) value = '';
26
25
 
27
26
  @property({ type: Boolean, reflect: true }) selected = false;
@@ -37,31 +36,40 @@ export class MenuItem extends BaseButtonMixin(BaseHyperlinkMixin(LitElement)) {
37
36
 
38
37
  static styles = [styles, colorStyles];
39
38
 
40
- @query('#item') readonly itemElement!: HTMLElement | null;
39
+ @query('wc-item') readonly itemElement!: Item | null;
41
40
 
42
- /**
43
- * States
44
- */
45
- @state()
46
- isPressed = false;
41
+ private readonly _contentObserver = new MutationObserver(() => {
42
+ this.requestUpdate();
43
+ });
44
+
45
+ private _rovingTabIndex = -1;
47
46
 
48
47
  connectedCallback() {
49
48
  // eslint-disable-next-line wc/guard-super-call
50
49
  super.connectedCallback();
51
- if (!this.hasAttribute('role')) {
52
- this.setAttribute('role', 'menuitem');
53
- }
54
-
55
- this.addEventListener('click', this.__dispatchClickWithThrottle);
56
- window.addEventListener('mouseup', this.__handlePress);
50
+ this._contentObserver.observe(this, {
51
+ subtree: true,
52
+ childList: true,
53
+ characterData: true,
54
+ attributes: true,
55
+ attributeFilter: ['slot'],
56
+ });
57
57
  }
58
58
 
59
59
  disconnectedCallback() {
60
- window.removeEventListener('mouseup', this.__handlePress);
61
- this.removeEventListener('click', this.__dispatchClickWithThrottle);
60
+ this._contentObserver.disconnect();
62
61
  super.disconnectedCallback();
63
62
  }
64
63
 
64
+ override get tabIndex() {
65
+ return this._rovingTabIndex;
66
+ }
67
+
68
+ override set tabIndex(value: number) {
69
+ this._rovingTabIndex = value;
70
+ this.requestUpdate();
71
+ }
72
+
65
73
  override focus() {
66
74
  this.itemElement?.focus();
67
75
  }
@@ -70,129 +78,81 @@ export class MenuItem extends BaseButtonMixin(BaseHyperlinkMixin(LitElement)) {
70
78
  this.itemElement?.blur();
71
79
  }
72
80
 
73
- __dispatchClickWithThrottle: (event: MouseEvent | KeyboardEvent) => void =
74
- event => {
75
- this.__dispatchClick(event);
76
- };
77
-
78
- __dispatchClick = (event: MouseEvent | KeyboardEvent) => {
79
- // If the button is soft-disabled or a disabled link, we need to explicitly
80
- // prevent the click from propagating to other event listeners as well as
81
- // prevent the default action.
82
- if (this.softDisabled || (this.disabled && this.href)) {
83
- event.stopImmediatePropagation();
84
- event.preventDefault();
85
- return;
86
- }
87
-
88
- if (!isActivationClick(event) || !this.itemElement) {
89
- return;
90
- }
91
-
92
- this.focus();
93
- dispatchActivationClick(this.itemElement);
94
- };
95
-
96
- __handleKeyDown = (event: KeyboardEvent) => {
97
- this.__handlePress(event);
98
-
99
- if (this.disabled || this.softDisabled || !this.itemElement) {
100
- return;
101
- }
102
-
103
- if (event.key === ' ') {
104
- event.preventDefault();
105
- this.itemElement.click();
106
- return;
107
- }
108
-
109
- if (event.key === 'Enter' && !this.__isLink()) {
110
- event.preventDefault();
111
- this.itemElement.click();
112
- }
113
- };
114
-
115
- __handlePress = (event: KeyboardEvent | MouseEvent) => {
116
- if (this.disabled || this.softDisabled) return;
117
- if (
118
- event instanceof KeyboardEvent &&
119
- event.type === 'keydown' &&
120
- (event.key === 'Enter' || event.key === ' ')
121
- ) {
122
- this.isPressed = true;
123
- } else if (event.type === 'mousedown') {
124
- this.isPressed = true;
125
- } else {
126
- this.isPressed = false;
127
- }
128
- };
129
-
130
- render() {
131
- const isLink = this.__isLink();
81
+ private _hasNamedSlot(...names: string[]) {
82
+ return names.some(name =>
83
+ Array.from(this.children).some(child => child.getAttribute('slot') === name),
84
+ );
85
+ }
132
86
 
133
- const cssClasses = {
134
- 'menu-item': true,
135
- disabled: this.disabled,
136
- selected: this.selected,
137
- pressed: this.isPressed,
138
- };
87
+ private _hasDefaultSlot() {
88
+ return Array.from(this.childNodes).some(node => {
89
+ if (node.nodeType === Node.TEXT_NODE) {
90
+ return Boolean(node.textContent?.trim());
91
+ }
92
+
93
+ return (
94
+ node.nodeType === Node.ELEMENT_NODE &&
95
+ !(node as Element).hasAttribute('slot')
96
+ );
97
+ });
98
+ }
139
99
 
100
+ render() {
140
101
  const controls = this.getAttribute('aria-controls');
141
102
 
142
- if (isLink) {
143
- return html`<a
103
+ return html`
104
+ <wc-item
144
105
  id="item"
145
- class=${classMap(cssClasses)}
146
- href=${this.href}
147
- target=${this.target}
148
- tabindex=${this.disabled ? '-1' : '0'}
149
-
150
- @click=${this.__dispatchClickWithThrottle}
151
- @mousedown=${this.__handlePress}
152
- @keydown=${this.__handleKeyDown}
153
- @keyup=${this.__handlePress}
154
-
155
- aria-disabled=${String(this.disabled)}
106
+ class="menu-item"
107
+ role="menuitem"
108
+ tabindex=${String(this.tabIndex)}
109
+ ?selected=${this.selected}
110
+ ?disabled=${this.disabled}
111
+ .softDisabled=${this.softDisabled}
112
+ .htmlType=${this.htmlType}
113
+ .href=${this.href}
114
+ .target=${this.target}
115
+ .rel=${this.rel}
116
+ .download=${this.download}
156
117
  aria-haspopup=${this.hasSubmenu ? 'menu' : nothing}
157
- aria-controls=${this.hasSubmenu && controls ? controls : nothing}
158
- aria-expanded=${this.hasSubmenu ? String(this.submenuOpen) : nothing}
118
+ aria-controls=${ifDefined(this.hasSubmenu && controls ? controls : undefined)}
119
+ aria-expanded=${ifDefined(this.hasSubmenu ? String(this.submenuOpen) : undefined)}
159
120
  >
160
121
  ${this.renderContent()}
161
- </a> `;
162
- }
163
-
164
- return html`<div
165
- id="item"
166
- class=${classMap(cssClasses)}
167
- tabindex=${this.disabled ? '-1' : '0'}
168
-
169
- @click=${this.__dispatchClick}
170
- @mousedown=${this.__handlePress}
171
- @keydown=${this.__handleKeyDown}
172
- @keyup=${this.__handlePress}
173
-
174
- aria-disabled=${String(this.disabled)}
175
- aria-haspopup=${this.hasSubmenu ? 'menu' : nothing}
176
- aria-controls=${this.hasSubmenu && controls ? controls : nothing}
177
- aria-expanded=${this.hasSubmenu ? String(this.submenuOpen) : nothing}
178
- >
179
- ${this.renderContent()}
180
- </div>`;
122
+ </wc-item>
123
+ `;
181
124
  }
182
125
 
183
126
  renderContent() {
127
+ const hasStart = this._hasNamedSlot('start');
128
+ const hasOverline = this._hasNamedSlot('overline');
129
+ const hasHeadline = this._hasNamedSlot('headline');
130
+ const hasDefault = this._hasDefaultSlot();
131
+ const hasSupportingText = this._hasNamedSlot('supporting-text');
132
+ const hasTrailingSupportingText = this._hasNamedSlot(
133
+ 'trailing-supporting-text',
134
+ );
135
+ const hasEnd = this._hasNamedSlot('end');
136
+
184
137
  return html`
185
- <wc-focus-ring class="focus-ring" for='item'></wc-focus-ring>
186
- <div class="background"></div>
187
- <wc-ripple class="ripple"></wc-ripple>
188
-
189
- <div class="menu-item-content" data-variant=${this.variant}>
190
- <slot name="leading-icon"></slot>
191
- <div class="slot-container">
192
- <slot></slot>
193
- </div>
194
- <slot name="trailing-supporting-text"></slot>
195
- </div>
138
+ ${hasStart ? html`<slot name="start" slot="start"></slot>` : nothing}
139
+ ${hasOverline
140
+ ? html`<slot name="overline" slot="overline"></slot>`
141
+ : nothing}
142
+ ${hasHeadline ? html`<slot name="headline" slot="headline"></slot>` : nothing}
143
+ ${hasDefault ? html`<slot></slot>` : nothing}
144
+ ${hasSupportingText
145
+ ? html`<slot name="supporting-text" slot="supporting-text"></slot>`
146
+ : nothing}
147
+ ${hasTrailingSupportingText
148
+ ? html`
149
+ <slot
150
+ name="trailing-supporting-text"
151
+ slot="trailing-supporting-text"
152
+ ></slot>
153
+ `
154
+ : nothing}
155
+ ${hasEnd ? html`<slot name="end" slot="end"></slot>` : nothing}
196
156
  `;
197
157
  }
198
158
  }
@@ -38,6 +38,10 @@ export class SubMenu extends LitElement {
38
38
 
39
39
  private _closeTimeout?: number;
40
40
 
41
+ private _resolveAnchorElement(item: MenuItem) {
42
+ return item.itemElement?.itemElement ?? item.itemElement ?? item;
43
+ }
44
+
41
45
  private readonly _onChildMenuOpened = () => {
42
46
  const { item } = this;
43
47
  if (!item) {
@@ -91,7 +95,7 @@ export class SubMenu extends LitElement {
91
95
  return;
92
96
  }
93
97
 
94
- menu.anchorElement = item;
98
+ menu.anchorElement = this._resolveAnchorElement(item);
95
99
  menu.isSubmenu = true;
96
100
  menu.show();
97
101
 
@@ -152,7 +156,7 @@ export class SubMenu extends LitElement {
152
156
  menu.addEventListener('closed', this._onChildMenuClosed);
153
157
 
154
158
  menu.isSubmenu = true;
155
- menu.anchorElement = item;
159
+ menu.anchorElement = this._resolveAnchorElement(item);
156
160
  menu.placement =
157
161
  getComputedStyle(this).direction === 'rtl' ? 'left-start' : 'right-start';
158
162
  menu.offset = 4;
@@ -5,19 +5,19 @@
5
5
  :host {
6
6
  display: contents;
7
7
 
8
- --modal-container-color: var(--color-surface-container-high, #ece6f0);
9
- --modal-scrim-color: rgba(0, 0, 0, 0.32);
10
- --modal-shape: var(--shape-corner-extra-large, 28px);
8
+ --modal-container-color: var(--color-surface-container-high);
9
+ --modal-scrim-color: color-mix(in srgb, var(--color-scrim), transparent 32%);
10
+ --modal-shape: var(--shape-corner-extra-large);
11
11
  --modal-min-width: 280px;
12
12
  --modal-max-width: 560px;
13
13
  --modal-max-height: 90dvh;
14
- --modal-transition-duration: var(--duration-medium2, 300ms);
15
- --modal-transition-easing: var(--easing-emphasized, cubic-bezier(0.2, 0, 0, 1));
16
- --modal-heading-color: var(--color-on-surface, #1c1b1f);
17
- --modal-subheading-color: var(--color-on-surface-variant, #49454f);
18
- --modal-content-color: var(--color-on-surface-variant, #49454f);
19
- --modal-divider-color: var(--color-outline-variant, #cac4d0);
20
- --modal-elevation: var(--elevation-level3, 0 4px 8px 3px rgba(0, 0, 0, 0.15), 0 1px 3px rgba(0, 0, 0, 0.3));
14
+ --modal-transition-duration: var(--duration-medium2);
15
+ --modal-transition-easing: var(--easing-emphasized);
16
+ --modal-heading-color: var(--color-on-surface);
17
+ --modal-subheading-color: var(--color-on-surface-variant);
18
+ --modal-content-color: var(--color-on-surface-variant);
19
+ --modal-divider-color: var(--color-outline-variant);
20
+ --modal-elevation: var(--elevation-level3);
21
21
  }
22
22
 
23
23
  /* Scrim backdrop */
@@ -9,7 +9,7 @@ type ModalSize = 'xs' | 'sm' | 'md' | 'lg' | 'fullscreen';
9
9
  /**
10
10
  * @label Modal
11
11
  * @tag wc-modal
12
- * @rawTag modal-wc
12
+ * @rawTag modal
13
13
  * @summary A Material Design 3 dialog/modal for displaying content in a layer above the page, with optional header, body, and footer slots.
14
14
  *
15
15
  * @cssprop --modal-container-color - Background color of the dialog container.
@@ -32,17 +32,13 @@ import { NavigationRailItem } from './navigation-rail-item.js';
32
32
  * ```html
33
33
  * <wc-navigation-rail>
34
34
  * <wc-navigation-rail-item active>
35
- * <wc-icon slot="icon">home</wc-icon>
35
+ * <wc-icon slot="icon" name="home"></wc-icon>
36
36
  * Home
37
37
  * </wc-navigation-rail-item>
38
38
  * <wc-navigation-rail-item>
39
- * <wc-icon slot="icon">search</wc-icon>
39
+ * <wc-icon slot="icon" name="search"></wc-icon>
40
40
  * Search
41
41
  * </wc-navigation-rail-item>
42
- * <wc-navigation-rail-item>
43
- * <wc-icon slot="icon">settings</wc-icon>
44
- * Settings
45
- * </wc-navigation-rail-item>
46
42
  * </wc-navigation-rail>
47
43
  * ```
48
44
  * @tags navigation