@redvars/peacock 3.8.6 → 3.9.1
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/dist/code-highlighter.js +1 -4
- package/dist/code-highlighter.js.map +1 -1
- package/dist/custom-elements-jsdocs.json +93 -213
- package/dist/custom-elements.json +488 -2149
- package/dist/elevation.js +55 -2
- package/dist/elevation.js.map +1 -1
- package/dist/flow.js +762 -0
- package/dist/flow.js.map +1 -0
- package/dist/index.js +3 -3
- package/dist/loader.js +10 -9
- package/dist/loader.js.map +1 -1
- package/dist/menu-item.js +144 -63
- package/dist/menu-item.js.map +1 -1
- package/dist/menu.js +161 -73
- package/dist/menu.js.map +1 -1
- package/dist/src/flow/flow.d.ts +102 -0
- package/dist/src/flow/index.d.ts +2 -0
- package/dist/src/index.d.ts +3 -4
- package/dist/src/menu/menu/menu.d.ts +10 -9
- package/dist/src/menu/menu-item/menu-item.d.ts +1 -3
- package/dist/src/timeline/index.d.ts +2 -0
- package/dist/src/timeline/timeline-item.d.ts +23 -0
- package/dist/src/timeline/timeline.d.ts +26 -0
- package/dist/sub-menu.js +28 -1
- package/dist/sub-menu.js.map +1 -1
- package/dist/timeline-item.js +163 -0
- package/dist/timeline-item.js.map +1 -0
- package/dist/timeline.js +52 -0
- package/dist/timeline.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/readme.md +2 -2
- package/src/code-highlighter/code-highlighter.scss +1 -7
- package/src/elevation/demo/index.html +52 -0
- package/src/elevation/elevation.scss +52 -5
- package/src/elevation/elevation.ts +8 -1
- package/src/flow/flow.scss +195 -0
- package/src/flow/flow.ts +683 -0
- package/src/flow/index.ts +2 -0
- package/src/index.ts +3 -16
- package/src/loader.ts +10 -9
- package/src/menu/menu/copy-component-files.mjs +47 -0
- package/src/menu/menu/menu.scss +55 -17
- package/src/menu/menu/menu.ts +155 -84
- package/src/menu/menu-item/menu-item-colors.scss +3 -3
- package/src/menu/menu-item/menu-item.scss +118 -24
- package/src/menu/menu-item/menu-item.ts +61 -55
- package/src/menu/sub-menu/sub-menu.scss +30 -1
- package/src/timeline/index.ts +2 -0
- package/src/timeline/timeline-item.scss +98 -0
- package/src/timeline/timeline-item.ts +63 -0
- package/src/timeline/timeline.scss +11 -0
- package/src/timeline/timeline.ts +41 -0
- package/dist/canvas.js +0 -385
- package/dist/canvas.js.map +0 -1
- package/dist/flow-designer-node-CGSm6cUH.js +0 -553
- package/dist/flow-designer-node-CGSm6cUH.js.map +0 -1
- package/dist/flow-designer-node.js +0 -4
- package/dist/flow-designer-node.js.map +0 -1
- package/dist/flow-designer.js +0 -1417
- package/dist/flow-designer.js.map +0 -1
- package/dist/src/canvas/canvas.d.ts +0 -92
- package/dist/src/canvas/index.d.ts +0 -2
- package/dist/src/flow-designer/commands.d.ts +0 -66
- package/dist/src/flow-designer/flow-designer-node.d.ts +0 -46
- package/dist/src/flow-designer/flow-designer.d.ts +0 -133
- package/dist/src/flow-designer/index.d.ts +0 -7
- package/dist/src/flow-designer/layout.d.ts +0 -30
- package/dist/src/flow-designer/types.d.ts +0 -142
- package/dist/src/flow-designer/validation.d.ts +0 -43
- package/dist/src/flow-designer/workflow-utils.d.ts +0 -40
- package/src/canvas/canvas.scss +0 -72
- package/src/canvas/canvas.ts +0 -413
- package/src/canvas/index.ts +0 -2
- package/src/flow-designer/DEMO.md +0 -239
- package/src/flow-designer/commands.ts +0 -278
- package/src/flow-designer/flow-designer-node.ts +0 -172
- package/src/flow-designer/flow-designer.scss +0 -457
- package/src/flow-designer/flow-designer.ts +0 -611
- package/src/flow-designer/index.ts +0 -41
- package/src/flow-designer/layout.ts +0 -357
- package/src/flow-designer/types.ts +0 -166
- package/src/flow-designer/validation.ts +0 -284
- package/src/flow-designer/workflow-utils.ts +0 -282
- /package/dist/test/{flow-designer.test.d.ts → elevation.test.d.ts} +0 -0
|
@@ -6,10 +6,13 @@
|
|
|
6
6
|
outline: none;
|
|
7
7
|
position: relative;
|
|
8
8
|
|
|
9
|
-
--menu-item-container-shape-start-start:
|
|
10
|
-
--menu-item-container-shape-start-end:
|
|
11
|
-
--menu-item-container-shape-end-start:
|
|
12
|
-
--menu-item-container-shape-end-end:
|
|
9
|
+
--menu-item-backdrop-container-shape-start-start: none;
|
|
10
|
+
--menu-item-backdrop-container-shape-start-end: none;
|
|
11
|
+
--menu-item-backdrop-container-shape-end-start: none;
|
|
12
|
+
--menu-item-backdrop-container-shape-end-end: none;
|
|
13
|
+
|
|
14
|
+
--menu-item-backdrop-elevation-level-block-start: none;
|
|
15
|
+
--menu-item-backdrop-elevation-level-block-end: none;
|
|
13
16
|
}
|
|
14
17
|
|
|
15
18
|
/*
|
|
@@ -29,10 +32,50 @@
|
|
|
29
32
|
padding-top: 2px;
|
|
30
33
|
padding-inline: var(--spacing-050);
|
|
31
34
|
|
|
32
|
-
.menu-item-background {
|
|
35
|
+
.menu-item-backdrop-background {
|
|
33
36
|
background-color: var(--menu-item-container-color);
|
|
34
37
|
position: absolute;
|
|
35
38
|
inset: 0px;
|
|
39
|
+
border-start-start-radius: var(
|
|
40
|
+
--menu-item-backdrop-container-shape-start-start
|
|
41
|
+
);
|
|
42
|
+
border-start-end-radius: var(
|
|
43
|
+
--menu-item-backdrop-container-shape-start-end
|
|
44
|
+
);
|
|
45
|
+
border-end-start-radius: var(
|
|
46
|
+
--menu-item-backdrop-container-shape-end-start
|
|
47
|
+
);
|
|
48
|
+
border-end-end-radius: var(--menu-item-backdrop-container-shape-end-end);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.menu-item-backdrop-elevation {
|
|
52
|
+
--elevation-container-shape-start-start: var(
|
|
53
|
+
--menu-item-backdrop-container-shape-start-start
|
|
54
|
+
);
|
|
55
|
+
--elevation-container-shape-start-end: var(
|
|
56
|
+
--menu-item-backdrop-container-shape-start-end
|
|
57
|
+
);
|
|
58
|
+
--elevation-container-shape-end-start: var(
|
|
59
|
+
--menu-item-backdrop-container-shape-end-start
|
|
60
|
+
);
|
|
61
|
+
--elevation-container-shape-end-end: var(
|
|
62
|
+
--menu-item-backdrop-container-shape-end-end
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
--elevation-level-block-start: var(
|
|
66
|
+
--menu-item-backdrop-elevation-level-block-start
|
|
67
|
+
);
|
|
68
|
+
--elevation-level-block-end: var(
|
|
69
|
+
--menu-item-backdrop-elevation-level-block-end
|
|
70
|
+
);
|
|
71
|
+
--elevation-level-inline-start: var(
|
|
72
|
+
--menu-item-backdrop-elevation-level-inline-start,
|
|
73
|
+
1
|
|
74
|
+
);
|
|
75
|
+
--elevation-level-inline-end: var(
|
|
76
|
+
--menu-item-backdrop-elevation-level-inline-end,
|
|
77
|
+
1
|
|
78
|
+
);
|
|
36
79
|
}
|
|
37
80
|
|
|
38
81
|
.menu-item-content {
|
|
@@ -57,24 +100,37 @@
|
|
|
57
100
|
--item-label-line-height: var(--typography-label-large-line-height);
|
|
58
101
|
--item-label-letter-spacing: var(--typography-label-large-letter-spacing);
|
|
59
102
|
|
|
60
|
-
--item-label-text-color: var(--
|
|
61
|
-
--item-leading-trailing-color: var(--
|
|
62
|
-
--item-supporting-text-color: var(--
|
|
63
|
-
--item-
|
|
64
|
-
--item-label-text-selected-color: var(--menu-item-label-selected-color);
|
|
65
|
-
--item-icon-size: var(--button-icon-size, var(--_button-icon-size));
|
|
103
|
+
--item-label-text-color: var(--private-item-label-text-color);
|
|
104
|
+
--item-leading-trailing-color: var(--private-item-label-text-color);
|
|
105
|
+
--item-supporting-text-color: var(--private-item-label-text-color);
|
|
106
|
+
--item-icon-size: var(--menu-item-icon-size, var(--private-item-icon-size));
|
|
66
107
|
|
|
67
108
|
.background {
|
|
68
|
-
background-color: var(--
|
|
109
|
+
background-color: var(--private-item-container-color);
|
|
69
110
|
opacity: var(--_container-opacity, 1);
|
|
70
111
|
border-radius: var(--shape-corner-medium);
|
|
112
|
+
|
|
113
|
+
border-start-start-radius: var(
|
|
114
|
+
--private-item-container-shape-start-start
|
|
115
|
+
);
|
|
116
|
+
border-start-end-radius: var(--private-item-container-shape-start-end);
|
|
117
|
+
border-end-start-radius: var(--private-item-container-shape-end-start);
|
|
118
|
+
border-end-end-radius: var(--private-item-container-shape-end-end);
|
|
71
119
|
}
|
|
72
120
|
|
|
73
121
|
.focus-ring {
|
|
74
|
-
--focus-ring-container-shape-start-start: var(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
--focus-ring-container-shape-
|
|
122
|
+
--focus-ring-container-shape-start-start: var(
|
|
123
|
+
--private-item-container-shape-start-start
|
|
124
|
+
);
|
|
125
|
+
--focus-ring-container-shape-start-end: var(
|
|
126
|
+
--private-item-container-shape-start-start
|
|
127
|
+
);
|
|
128
|
+
--focus-ring-container-shape-end-start: var(
|
|
129
|
+
--private-item-container-shape-start-start
|
|
130
|
+
);
|
|
131
|
+
--focus-ring-container-shape-end-end: var(
|
|
132
|
+
--private-item-container-shape-start-start
|
|
133
|
+
);
|
|
78
134
|
z-index: 2;
|
|
79
135
|
--focus-ring-inset: 0px;
|
|
80
136
|
}
|
|
@@ -88,17 +144,55 @@
|
|
|
88
144
|
.skeleton {
|
|
89
145
|
z-index: 2;
|
|
90
146
|
|
|
91
|
-
--skeleton-container-shape-start-start: var(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
--skeleton-container-shape-
|
|
147
|
+
--skeleton-container-shape-start-start: var(
|
|
148
|
+
--private-item-container-shape-start-start
|
|
149
|
+
);
|
|
150
|
+
--skeleton-container-shape-start-end: var(
|
|
151
|
+
--private-item-container-shape-start-end
|
|
152
|
+
);
|
|
153
|
+
--skeleton-container-shape-end-start: var(
|
|
154
|
+
--private-item-container-shape-end-start
|
|
155
|
+
);
|
|
156
|
+
--skeleton-container-shape-end-end: var(
|
|
157
|
+
--private-item-container-shape-end-end
|
|
158
|
+
);
|
|
95
159
|
}
|
|
96
160
|
}
|
|
97
161
|
}
|
|
98
162
|
|
|
163
|
+
:host {
|
|
164
|
+
--private-item-container-color: var(--menu-item-container-color);
|
|
165
|
+
--private-item-label-text-color: var(--menu-item-label-color);
|
|
166
|
+
--private-item-container-shape-start-start: var(--shape-corner-medium);
|
|
167
|
+
--private-item-container-shape-start-end: var(--shape-corner-medium);
|
|
168
|
+
--private-item-container-shape-end-start: var(--shape-corner-medium);
|
|
169
|
+
--private-item-container-shape-end-end: var(--shape-corner-medium);
|
|
170
|
+
}
|
|
171
|
+
|
|
99
172
|
:host([selected]) {
|
|
100
|
-
--
|
|
101
|
-
--
|
|
102
|
-
--
|
|
103
|
-
--
|
|
173
|
+
--private-item-container-color: var(--menu-item-container-selected-color);
|
|
174
|
+
--private-item-label-text-color: var(--menu-item-label-selected-color);
|
|
175
|
+
--private-item-container-shape-start-start: var(--shape-corner-large);
|
|
176
|
+
--private-item-container-shape-start-end: var(--shape-corner-large);
|
|
177
|
+
--private-item-container-shape-end-start: var(--shape-corner-large);
|
|
178
|
+
--private-item-container-shape-end-end: var(--shape-corner-large);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
:host([disabled]),
|
|
182
|
+
:host([soft-disabled]) {
|
|
183
|
+
cursor: not-allowed;
|
|
184
|
+
--private-item-label-text-color: var(--color-on-surface);
|
|
185
|
+
--_container-opacity: 0.12;
|
|
186
|
+
|
|
187
|
+
.ripple {
|
|
188
|
+
display: none;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
:host-context([variant='standard']) {
|
|
193
|
+
--menu-item-container-color: var(--color-surface-container);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
:host-context([variant='vibrant']) {
|
|
197
|
+
--menu-item-container-color: var(--color-tertiary-container);
|
|
104
198
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { html, LitElement, nothing } from
|
|
2
|
-
import { property, query } from
|
|
3
|
-
import { ifDefined } from
|
|
4
|
-
import styles from
|
|
5
|
-
import colorStyles from
|
|
6
|
-
import NativeButtonMixin from
|
|
7
|
-
import NativeHyperlinkMixin from
|
|
8
|
-
import { isLink } from
|
|
9
|
-
import IndividualComponent from
|
|
10
|
-
import { classMap } from
|
|
1
|
+
import { html, LitElement, nothing } from "lit";
|
|
2
|
+
import { property, query } from "lit/decorators.js";
|
|
3
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
4
|
+
import styles from "./menu-item.scss";
|
|
5
|
+
import colorStyles from "./menu-item-colors.scss";
|
|
6
|
+
import NativeButtonMixin from "@/__internal/mixins/NativeButtonMixin.js";
|
|
7
|
+
import NativeHyperlinkMixin from "@/__internal/mixins/NativeHyperlinkMixin.js";
|
|
8
|
+
import { isLink } from "@/__internal/utils/is-link.js";
|
|
9
|
+
import IndividualComponent from "@/IndividualComponent.js";
|
|
10
|
+
import { classMap } from "lit/directives/class-map.js";
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* @label Menu Item
|
|
@@ -32,27 +32,29 @@ export class MenuItem extends NativeButtonMixin(
|
|
|
32
32
|
// ── Properties ───────────────────────────────────────────────────────────
|
|
33
33
|
|
|
34
34
|
/** The value associated with this menu item, used to identify it on selection. */
|
|
35
|
-
@property({ type: String })
|
|
35
|
+
@property({ type: String })
|
|
36
|
+
value = "";
|
|
36
37
|
|
|
37
38
|
/** Whether this menu item is currently selected/highlighted. */
|
|
38
|
-
@property({ type: Boolean, reflect: true })
|
|
39
|
+
@property({ type: Boolean, reflect: true })
|
|
40
|
+
selected = false;
|
|
39
41
|
|
|
40
42
|
/** When true, the menu stays open after this item is activated. */
|
|
41
|
-
@property({ type: Boolean, attribute:
|
|
43
|
+
@property({ type: Boolean, attribute: "keep-open" })
|
|
44
|
+
keepOpen = false;
|
|
42
45
|
|
|
43
46
|
/** When true, indicates this item has an associated submenu. */
|
|
44
|
-
@property({ type: Boolean, attribute:
|
|
47
|
+
@property({ type: Boolean, attribute: "has-submenu" })
|
|
48
|
+
hasSubmenu = false;
|
|
45
49
|
|
|
46
50
|
/** Whether the associated submenu is currently open. */
|
|
47
|
-
@property({ type: Boolean, attribute:
|
|
48
|
-
|
|
49
|
-
/** Visual variant of the menu item. */
|
|
50
|
-
@property({ type: String, reflect: true }) variant: 'standard' | 'vibrant' =
|
|
51
|
-
'standard';
|
|
51
|
+
@property({ type: Boolean, attribute: "submenu-open" })
|
|
52
|
+
submenuOpen = false;
|
|
52
53
|
|
|
53
54
|
// ── Queries ───────────────────────────────────────────────────────────────
|
|
54
55
|
|
|
55
|
-
@query(
|
|
56
|
+
@query("#menu-item")
|
|
57
|
+
readonly itemElement!: HTMLElement | null;
|
|
56
58
|
|
|
57
59
|
// ── Private fields ────────────────────────────────────────────────────────
|
|
58
60
|
|
|
@@ -72,7 +74,7 @@ export class MenuItem extends NativeButtonMixin(
|
|
|
72
74
|
childList: true,
|
|
73
75
|
characterData: true,
|
|
74
76
|
attributes: true,
|
|
75
|
-
attributeFilter: [
|
|
77
|
+
attributeFilter: ["slot"],
|
|
76
78
|
});
|
|
77
79
|
}
|
|
78
80
|
|
|
@@ -99,56 +101,58 @@ export class MenuItem extends NativeButtonMixin(
|
|
|
99
101
|
}
|
|
100
102
|
|
|
101
103
|
private _hasNamedSlot(...names: string[]) {
|
|
102
|
-
return names.some(name =>
|
|
104
|
+
return names.some((name) =>
|
|
103
105
|
Array.from(this.children).some(
|
|
104
|
-
child => child.getAttribute(
|
|
105
|
-
)
|
|
106
|
+
(child) => child.getAttribute("slot") === name,
|
|
107
|
+
)
|
|
106
108
|
);
|
|
107
109
|
}
|
|
108
110
|
|
|
109
111
|
private _hasDefaultSlot() {
|
|
110
|
-
return Array.from(this.childNodes).some(node => {
|
|
112
|
+
return Array.from(this.childNodes).some((node) => {
|
|
111
113
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
112
114
|
return Boolean(node.textContent?.trim());
|
|
113
115
|
}
|
|
114
116
|
|
|
115
117
|
return (
|
|
116
118
|
node.nodeType === Node.ELEMENT_NODE &&
|
|
117
|
-
!(node as Element).hasAttribute(
|
|
119
|
+
!(node as Element).hasAttribute("slot")
|
|
118
120
|
);
|
|
119
121
|
});
|
|
120
122
|
}
|
|
121
123
|
|
|
122
124
|
render() {
|
|
123
125
|
const isElementLink = isLink(this);
|
|
124
|
-
const controls = this.getAttribute(
|
|
126
|
+
const controls = this.getAttribute("aria-controls");
|
|
125
127
|
|
|
126
128
|
const cssClasses = {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
129
|
+
"menu-item": true,
|
|
130
|
+
"native-button": !isElementLink,
|
|
131
|
+
"native-link": isElementLink,
|
|
130
132
|
};
|
|
131
133
|
|
|
132
134
|
if (isElementLink) {
|
|
133
135
|
return html`
|
|
134
136
|
<a
|
|
135
137
|
id="menu-item"
|
|
136
|
-
class
|
|
138
|
+
class="${classMap(cssClasses)}"
|
|
137
139
|
role="menuitem"
|
|
138
|
-
href
|
|
139
|
-
target
|
|
140
|
-
?rel
|
|
141
|
-
?download
|
|
142
|
-
tabindex
|
|
143
|
-
?selected
|
|
144
|
-
aria-disabled
|
|
145
|
-
|
|
146
|
-
|
|
140
|
+
href="${ifDefined(this.href)}"
|
|
141
|
+
target="${this.target}"
|
|
142
|
+
?rel="${this.rel}"
|
|
143
|
+
?download="${this.download}"
|
|
144
|
+
tabindex="${this.disabled ? "-1" : String(this.tabIndex)}"
|
|
145
|
+
?selected="${this.selected}"
|
|
146
|
+
aria-disabled="${this.disabled || this.softDisabled
|
|
147
|
+
? "true"
|
|
148
|
+
: nothing}"
|
|
149
|
+
aria-haspopup="${this.hasSubmenu ? "menu" : nothing}"
|
|
150
|
+
aria-controls="${ifDefined(
|
|
147
151
|
this.hasSubmenu && controls ? controls : undefined,
|
|
148
|
-
)}
|
|
149
|
-
aria-expanded
|
|
152
|
+
)}"
|
|
153
|
+
aria-expanded="${ifDefined(
|
|
150
154
|
this.hasSubmenu ? String(this.submenuOpen) : undefined,
|
|
151
|
-
)}
|
|
155
|
+
)}"
|
|
152
156
|
>
|
|
153
157
|
${this.renderContent()}
|
|
154
158
|
</a>
|
|
@@ -158,20 +162,20 @@ export class MenuItem extends NativeButtonMixin(
|
|
|
158
162
|
return html`
|
|
159
163
|
<button
|
|
160
164
|
id="menu-item"
|
|
161
|
-
class
|
|
165
|
+
class="${classMap(cssClasses)}"
|
|
162
166
|
role="menuitem"
|
|
163
|
-
type
|
|
164
|
-
?disabled
|
|
165
|
-
tabindex
|
|
166
|
-
?selected
|
|
167
|
-
aria-disabled
|
|
168
|
-
aria-haspopup
|
|
169
|
-
aria-controls
|
|
167
|
+
type="${this.htmlType}"
|
|
168
|
+
?disabled="${this.disabled}"
|
|
169
|
+
tabindex="${String(this.tabIndex)}"
|
|
170
|
+
?selected="${this.selected}"
|
|
171
|
+
aria-disabled="${this.softDisabled ? "true" : nothing}"
|
|
172
|
+
aria-haspopup="${this.hasSubmenu ? "menu" : nothing}"
|
|
173
|
+
aria-controls="${ifDefined(
|
|
170
174
|
this.hasSubmenu && controls ? controls : undefined,
|
|
171
|
-
)}
|
|
172
|
-
aria-expanded
|
|
175
|
+
)}"
|
|
176
|
+
aria-expanded="${ifDefined(
|
|
173
177
|
this.hasSubmenu ? String(this.submenuOpen) : undefined,
|
|
174
|
-
)}
|
|
178
|
+
)}"
|
|
175
179
|
>
|
|
176
180
|
${this.renderContent()}
|
|
177
181
|
</button>
|
|
@@ -180,7 +184,9 @@ export class MenuItem extends NativeButtonMixin(
|
|
|
180
184
|
|
|
181
185
|
renderContent() {
|
|
182
186
|
return html`
|
|
183
|
-
<div class="menu-item-background"></div>
|
|
187
|
+
<div class="menu-item-backdrop-background"></div>
|
|
188
|
+
<wc-elevation class="menu-item-backdrop-elevation"></wc-elevation>
|
|
189
|
+
|
|
184
190
|
<wc-item class="menu-item-content">
|
|
185
191
|
<wc-focus-ring
|
|
186
192
|
class="focus-ring"
|
|
@@ -4,8 +4,37 @@
|
|
|
4
4
|
|
|
5
5
|
:host {
|
|
6
6
|
display: contents;
|
|
7
|
+
--sub-menu-item-backdrop-container-shape-start-start: none;
|
|
8
|
+
--sub-menu-item-backdrop-container-shape-start-end: none;
|
|
9
|
+
--sub-menu-item-backdrop-container-shape-end-start: none;
|
|
10
|
+
--sub-menu-item-backdrop-container-shape-end-end: none;
|
|
11
|
+
|
|
12
|
+
--sub-menu-item-backdrop-elevation-level-block-start: none;
|
|
13
|
+
--sub-menu-item-backdrop-elevation-level-block-end: none;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
slot[name='item']::slotted(wc-menu-item) {
|
|
17
|
+
--menu-item-backdrop-container-shape-start-start: var(
|
|
18
|
+
--sub-menu-item-backdrop-container-shape-start-start
|
|
19
|
+
);
|
|
20
|
+
--menu-item-backdrop-container-shape-start-end: var(
|
|
21
|
+
--sub-menu-item-backdrop-container-shape-start-end
|
|
22
|
+
);
|
|
23
|
+
--menu-item-backdrop-container-shape-end-start: var(
|
|
24
|
+
--sub-menu-item-backdrop-container-shape-end-start
|
|
25
|
+
);
|
|
26
|
+
--menu-item-backdrop-container-shape-end-end: var(
|
|
27
|
+
--sub-menu-item-backdrop-container-shape-end-end
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
--menu-item-backdrop-elevation-level-block-start: var(
|
|
31
|
+
--sub-menu-item-backdrop-elevation-level-block-start
|
|
32
|
+
);
|
|
33
|
+
--menu-item-backdrop-elevation-level-block-end: var(
|
|
34
|
+
--sub-menu-item-backdrop-elevation-level-block-end
|
|
35
|
+
);
|
|
7
36
|
}
|
|
8
37
|
|
|
9
|
-
slot::slotted(wc-menu) {
|
|
38
|
+
slot[name='menu']::slotted(wc-menu) {
|
|
10
39
|
display: contents;
|
|
11
40
|
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: block;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.timeline-item {
|
|
6
|
+
display: grid;
|
|
7
|
+
grid-template-columns: auto 1fr;
|
|
8
|
+
gap: 0.75rem;
|
|
9
|
+
align-items: stretch;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
.marker-column {
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
align-items: center;
|
|
17
|
+
width: var(--timeline-dot-size, 2rem);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
.marker {
|
|
22
|
+
position: relative;
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
justify-content: center;
|
|
26
|
+
width: var(--timeline-dot-size, 2rem);
|
|
27
|
+
height: var(--timeline-dot-size, 2rem);
|
|
28
|
+
flex-shrink: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.marker-dot {
|
|
32
|
+
width: var(--timeline-dot-size, 2rem);
|
|
33
|
+
height: var(--timeline-dot-size, 2rem);
|
|
34
|
+
min-width: var(--timeline-dot-size, 2rem);
|
|
35
|
+
border-radius: 50%;
|
|
36
|
+
display: flex;
|
|
37
|
+
align-items: center;
|
|
38
|
+
justify-content: center;
|
|
39
|
+
background: var(--timeline-dot-bg, var(--color-primary));
|
|
40
|
+
--icon-color: var(--timeline-dot-color, var(--color-on-primary));
|
|
41
|
+
position: relative;
|
|
42
|
+
z-index: 2;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.marker-dot ::slotted(wc-icon) {
|
|
46
|
+
--icon-size: calc(var(--timeline-dot-size, 2rem) * 0.6);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.dot-spinner {
|
|
50
|
+
--progress-height: calc(var(--timeline-dot-size, 2rem) * 0.6);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Flexible connector line that stretches to fill remaining height/width */
|
|
54
|
+
.connector {
|
|
55
|
+
width: 2px;
|
|
56
|
+
background: var(--timeline-line-color, var(--color-outline));
|
|
57
|
+
margin-inline: auto;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.connector--top {
|
|
61
|
+
height: var(--timeline-connector-top-height, 0.75rem);
|
|
62
|
+
flex-shrink: 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.connector--bottom {
|
|
66
|
+
flex: 1;
|
|
67
|
+
min-height: 1.5rem;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
:host(:first-child) .connector--top {
|
|
71
|
+
visibility: hidden;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
:host(:last-child) .connector--bottom {
|
|
75
|
+
display: none;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
.content {
|
|
81
|
+
display: flex;
|
|
82
|
+
flex-direction: column;
|
|
83
|
+
gap: 0.25rem;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.headline {
|
|
87
|
+
padding-top: var(--timeline-connector-top-height, 0.75rem);
|
|
88
|
+
min-height: calc(var(--timeline-dot-size, 2rem) + var(--timeline-connector-top-height, 0.75rem));
|
|
89
|
+
display: flex;
|
|
90
|
+
align-items: center;
|
|
91
|
+
box-sizing: border-box;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
.description {
|
|
96
|
+
color: var(--timeline-description-color, var(--color-on-surface-variant));
|
|
97
|
+
line-height: 1.4;
|
|
98
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { html, LitElement } from 'lit';
|
|
2
|
+
import { property } from 'lit/decorators.js';
|
|
3
|
+
import styles from './timeline-item.scss';
|
|
4
|
+
import IndividualComponent from '@/IndividualComponent.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @label Timeline Item
|
|
8
|
+
* @tag wc-timeline-item
|
|
9
|
+
* @rawTag timeline-item
|
|
10
|
+
*
|
|
11
|
+
* @summary An item for use inside a timeline, with a dot/marker and description.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```html
|
|
15
|
+
* <wc-timeline-item description="Step completed">
|
|
16
|
+
* <span>Step title</span>
|
|
17
|
+
* <wc-icon slot="dot" name="check"></wc-icon>
|
|
18
|
+
* </wc-timeline-item>
|
|
19
|
+
* ```
|
|
20
|
+
* @tags display
|
|
21
|
+
*/
|
|
22
|
+
@IndividualComponent
|
|
23
|
+
export class TimelineItem extends LitElement {
|
|
24
|
+
static styles = [styles];
|
|
25
|
+
|
|
26
|
+
@property({ type: Boolean, reflect: true }) loading = false;
|
|
27
|
+
|
|
28
|
+
connectedCallback() {
|
|
29
|
+
super.connectedCallback();
|
|
30
|
+
if (!this.hasAttribute('role')) {
|
|
31
|
+
this.setAttribute('role', 'listitem');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
render() {
|
|
36
|
+
return html`
|
|
37
|
+
<div class="timeline-item">
|
|
38
|
+
<div class="marker-column">
|
|
39
|
+
<div class="connector connector--top"></div>
|
|
40
|
+
<div class="marker">
|
|
41
|
+
<div class="marker-dot">
|
|
42
|
+
${this.loading
|
|
43
|
+
? html`<wc-circular-progress
|
|
44
|
+
class="dot-spinner"
|
|
45
|
+
indeterminate
|
|
46
|
+
aria-label="Loading"
|
|
47
|
+
></wc-circular-progress>`
|
|
48
|
+
: html`<slot name="dot"></slot>`}
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="connector connector--bottom"></div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div class="content">
|
|
55
|
+
<div class="headline"><slot></slot></div>
|
|
56
|
+
<div class="description">
|
|
57
|
+
<slot name="content"></slot>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { LitElement, html } from 'lit';
|
|
2
|
+
import { property } from 'lit/decorators.js';
|
|
3
|
+
import styles from './timeline.scss';
|
|
4
|
+
import IndividualComponent from '@/IndividualComponent.js';
|
|
5
|
+
import { TimelineItem } from './timeline-item.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @label Timeline
|
|
9
|
+
* @tag wc-timeline
|
|
10
|
+
* @rawTag timeline
|
|
11
|
+
*
|
|
12
|
+
* @summary A vertical timeline layout for a series of timeline items.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```html
|
|
16
|
+
* <wc-timeline>
|
|
17
|
+
* <wc-timeline-item description="Task completed">
|
|
18
|
+
* <span>Task title</span>
|
|
19
|
+
* <wc-icon slot="dot" name="check"></wc-icon>
|
|
20
|
+
* </wc-timeline-item>
|
|
21
|
+
* </wc-timeline>
|
|
22
|
+
* ```
|
|
23
|
+
* @tags display
|
|
24
|
+
*/
|
|
25
|
+
@IndividualComponent
|
|
26
|
+
export class Timeline extends LitElement {
|
|
27
|
+
static styles = [styles];
|
|
28
|
+
|
|
29
|
+
static Item = TimelineItem;
|
|
30
|
+
|
|
31
|
+
connectedCallback() {
|
|
32
|
+
super.connectedCallback();
|
|
33
|
+
if (!this.hasAttribute('role')) {
|
|
34
|
+
this.setAttribute('role', 'list');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
render() {
|
|
39
|
+
return html`<div class="timeline"><slot></slot></div>`;
|
|
40
|
+
}
|
|
41
|
+
}
|