@sbb-esta/lyne-elements-dev 4.11.0-dev.1777283963 → 4.12.0-dev.1777289332
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/core/styles/core.scss +4 -0
- package/core.css +12 -0
- package/development/toast/toast.component.js +1 -1
- package/development/toast.component-IhHx0Qt3.js +275 -0
- package/development/toast.js +1 -1
- package/development/toast.pure.js +1 -1
- package/off-brand-theme.css +12 -0
- package/package.json +2 -2
- package/safety-theme.css +12 -0
- package/standard-theme.css +12 -0
- package/toast/toast.component.js +1 -1
- package/{toast.component-CGVqkd0_.js → toast.component-CORnf2Tl.js} +1 -1
- package/toast.js +1 -1
- package/toast.pure.js +1 -1
- package/development/toast.component-Cgr5ZGOr.js +0 -275
package/core/styles/core.scss
CHANGED
|
@@ -280,6 +280,9 @@ $theme: 'standard' !default;
|
|
|
280
280
|
@use '../../tooltip/tooltip.global' as tooltip with (
|
|
281
281
|
$theme: $theme
|
|
282
282
|
);
|
|
283
|
+
@use '../../toast/toast.global' as toast with (
|
|
284
|
+
$theme: $theme
|
|
285
|
+
);
|
|
283
286
|
@use '../../visual-checkbox/visual-checkbox.global' as visual-checkbox with (
|
|
284
287
|
$theme: $theme
|
|
285
288
|
);
|
|
@@ -372,6 +375,7 @@ $theme: 'standard' !default;
|
|
|
372
375
|
@include toggle.base;
|
|
373
376
|
@include toggle-option.base;
|
|
374
377
|
@include tooltip.base;
|
|
378
|
+
@include toast.base;
|
|
375
379
|
@include visual-checkbox.base;
|
|
376
380
|
|
|
377
381
|
@include a11y.if-forced-colors {
|
package/core.css
CHANGED
|
@@ -1855,6 +1855,18 @@ slot[name=error]::slotted(*) {
|
|
|
1855
1855
|
--sbb-overlay-position-try-fallbacks:
|
|
1856
1856
|
block-start span-inline-end, block-start span-inline-start, block-end,
|
|
1857
1857
|
block-end span-inline-end, block-end span-inline-start;
|
|
1858
|
+
--sbb-toast-max-width: 25rem;
|
|
1859
|
+
--sbb-toast-animation-timing-function: ease;
|
|
1860
|
+
--sbb-toast-text-color: var(--sbb-color-3-inverted);
|
|
1861
|
+
--sbb-toast-background-color: var(--sbb-background-color-1-inverted);
|
|
1862
|
+
--sbb-toast-margin: var(--sbb-spacing-responsive-s);
|
|
1863
|
+
--sbb-toast-padding-block: var(--sbb-spacing-responsive-xxxs);
|
|
1864
|
+
--sbb-toast-padding-inline: var(--sbb-spacing-responsive-xs);
|
|
1865
|
+
--sbb-toast-border-radius: var(--sbb-border-radius-4x);
|
|
1866
|
+
--sbb-toast-container-position: fixed;
|
|
1867
|
+
--sbb-toast-horizontal-position: initial;
|
|
1868
|
+
--sbb-toast-vertical-position: initial;
|
|
1869
|
+
--sbb-toast-gap: var(--sbb-spacing-fixed-2x);
|
|
1858
1870
|
--sbb-visual-checkbox-dimension: var(--sbb-checkbox-dimension-m);
|
|
1859
1871
|
--sbb-visual-checkbox-selection-color: var(--sbb-color-primary);
|
|
1860
1872
|
--sbb-visual-checkbox-selection-color-negative: var(--sbb-color-primary85);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as SbbToastElement } from "../toast.component-
|
|
1
|
+
import { t as SbbToastElement } from "../toast.component-IhHx0Qt3.js";
|
|
2
2
|
export { SbbToastElement };
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
+
import { html, nothing, unsafeCSS } from "lit";
|
|
3
|
+
import { property } from "lit/decorators.js";
|
|
4
|
+
import { SbbOpenCloseBaseElement } from "./core/base-elements.js";
|
|
5
|
+
import { forceType } from "./core/decorators.js";
|
|
6
|
+
import { isLean, isZeroAnimationDuration } from "./core/dom.js";
|
|
7
|
+
import { composedPathHasAttribute } from "./core/eventing.js";
|
|
8
|
+
import { SbbReadonlyMixin } from "./core/mixins.js";
|
|
9
|
+
import { boxSizingStyles } from "./core/styles.js";
|
|
10
|
+
import { SbbTransparentButtonElement } from "./button.pure.js";
|
|
11
|
+
import { SbbDarkModeController, SbbLanguageController } from "./core/controllers.js";
|
|
12
|
+
import { i18nCloseAlert } from "./core/i18n.js";
|
|
13
|
+
import { SbbIconNameMixin } from "./icon.js";
|
|
14
|
+
import "./divider.js";
|
|
15
|
+
//#region src/elements/toast/toast.scss?inline
|
|
16
|
+
var toast_default = ":host {\n --sbb-toast-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n display: none;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n --sbb-toast-container-display: flex;\n display: block;\n}\n\n:host([position=bottom-left]),\n:host([position=bottom-start]) {\n --sbb-toast-horizontal-position: flex-start;\n --sbb-toast-vertical-position: flex-end;\n}\n\n:host([position=bottom-center]) {\n --sbb-toast-horizontal-position: center;\n --sbb-toast-vertical-position: flex-end;\n}\n\n:host([position=bottom-right]),\n:host([position=bottom-end]) {\n --sbb-toast-horizontal-position: flex-end;\n --sbb-toast-vertical-position: flex-end;\n}\n\n:host([position=top-left]),\n:host([position=top-start]) {\n --sbb-toast-horizontal-position: flex-start;\n --sbb-toast-vertical-position: flex-start;\n}\n\n:host([position=top-center]) {\n --sbb-toast-horizontal-position: center;\n --sbb-toast-vertical-position: flex-start;\n}\n\n:host([position=top-right]),\n:host([position=top-end]) {\n --sbb-toast-horizontal-position: flex-end;\n --sbb-toast-vertical-position: flex-start;\n}\n\n:host(:is(:state(dark),[state--dark])) {\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-default);\n}\n\n.sbb-toast__overlay-container {\n position: var(--sbb-toast-container-position);\n pointer-events: none;\n inset: 0;\n display: var(--sbb-toast-container-display, none);\n justify-content: var(--sbb-toast-horizontal-position);\n align-items: var(--sbb-toast-vertical-position);\n}\n\n.sbb-toast {\n z-index: var(--sbb-toast-z-index, var(--sbb-overlay-default-z-index));\n pointer-events: auto;\n margin: var(--sbb-toast-margin);\n border-radius: var(--sbb-toast-border-radius);\n max-width: var(--sbb-toast-max-width);\n display: flex;\n color: var(--sbb-toast-text-color);\n background-color: var(--sbb-toast-background-color);\n}\n:host(:is(:state(state-opening),[state--state-opening])) .sbb-toast {\n animation-name: open;\n animation-duration: var(--sbb-toast-animation-duration);\n animation-timing-function: var(--sbb-toast-animation-timing-function);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-toast {\n animation-name: close;\n animation-duration: var(--sbb-toast-animation-duration);\n animation-timing-function: var(--sbb-toast-animation-timing-function);\n}\n\n.sbb-toast-wrapper {\n display: flex;\n align-items: center;\n gap: var(--sbb-toast-gap);\n padding-block: var(--sbb-toast-padding-block);\n padding-inline: var(--sbb-toast-padding-inline);\n}\n\nslot:not([name=icon]),\n.sbb-toast__close {\n color-scheme: only light;\n}\n\n.sbb-toast__content {\n --sbb-title-font-size: var(--sbb-title-font-size-level-6-lean, var(--sbb-heading-font-size-6));\n --sbb-title-line-height: var(--sbb-typo-line-height-text);\n margin-block: var(--sbb-title-margin-block, 0);\n margin-inline: 0;\n font-family: var(--sbb-typo-font-family);\n font-weight: bold;\n font-size: var(--sbb-title-font-size);\n letter-spacing: var(--sbb-typo-letter-spacing-heading);\n line-height: var(--sbb-title-line-height, var(--sbb-typo-line-height-heading));\n flex: 1 1 0;\n}\n\n.sbb-toast__close {\n display: flex;\n align-items: center;\n}\n\n.sbb-toast__close-divider {\n padding-block: var(--sbb-toast-padding-block);\n}\n\n.sbb-toast__close-button {\n margin-inline: var(--sbb-spacing-responsive-xxxs);\n}\n\n@keyframes open {\n from {\n visibility: hidden;\n opacity: 0;\n translate: 0 var(--sbb-spacing-fixed-2x);\n }\n to {\n visibility: visible;\n opacity: 1;\n translate: 0;\n }\n}\n@keyframes close {\n from {\n visibility: visible;\n opacity: 1;\n translate: 0;\n }\n to {\n visibility: hidden;\n opacity: 0;\n translate: 0 var(--sbb-spacing-fixed-2x);\n }\n}";
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/elements/toast/toast.component.ts
|
|
19
|
+
SbbTransparentButtonElement.define();
|
|
20
|
+
var toastRefs = /* @__PURE__ */ new Set();
|
|
21
|
+
/**
|
|
22
|
+
* It displays a toast notification.
|
|
23
|
+
*
|
|
24
|
+
* @slot - Use the unnamed slot to add content to the `sbb-toast`.
|
|
25
|
+
* @slot icon - Assign a custom icon via slot.
|
|
26
|
+
* @slot action - Provide a custom action for this toast.
|
|
27
|
+
* @cssprop [--sbb-toast-z-index=var(--sbb-overlay-default-z-index)] - To specify a custom stack order,
|
|
28
|
+
* the `z-index` can be overridden by defining this CSS variable. The default `z-index` of the
|
|
29
|
+
* component is set to `var(--sbb-overlay-default-z-index)` with a value of `1000`.
|
|
30
|
+
*/
|
|
31
|
+
var SbbToastElement = (() => {
|
|
32
|
+
let _classSuper = SbbIconNameMixin(SbbReadonlyMixin(SbbOpenCloseBaseElement));
|
|
33
|
+
let _timeout_decorators;
|
|
34
|
+
let _timeout_initializers = [];
|
|
35
|
+
let _timeout_extraInitializers = [];
|
|
36
|
+
let _position_decorators;
|
|
37
|
+
let _position_initializers = [];
|
|
38
|
+
let _position_extraInitializers = [];
|
|
39
|
+
let _politeness_decorators;
|
|
40
|
+
let _politeness_initializers = [];
|
|
41
|
+
let _politeness_extraInitializers = [];
|
|
42
|
+
return class SbbToastElement extends _classSuper {
|
|
43
|
+
static {
|
|
44
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
45
|
+
_timeout_decorators = [forceType(), property({ type: Number })];
|
|
46
|
+
_position_decorators = [property({ reflect: true })];
|
|
47
|
+
_politeness_decorators = [property()];
|
|
48
|
+
__esDecorate(this, null, _timeout_decorators, {
|
|
49
|
+
kind: "accessor",
|
|
50
|
+
name: "timeout",
|
|
51
|
+
static: false,
|
|
52
|
+
private: false,
|
|
53
|
+
access: {
|
|
54
|
+
has: (obj) => "timeout" in obj,
|
|
55
|
+
get: (obj) => obj.timeout,
|
|
56
|
+
set: (obj, value) => {
|
|
57
|
+
obj.timeout = value;
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
metadata: _metadata
|
|
61
|
+
}, _timeout_initializers, _timeout_extraInitializers);
|
|
62
|
+
__esDecorate(this, null, _position_decorators, {
|
|
63
|
+
kind: "accessor",
|
|
64
|
+
name: "position",
|
|
65
|
+
static: false,
|
|
66
|
+
private: false,
|
|
67
|
+
access: {
|
|
68
|
+
has: (obj) => "position" in obj,
|
|
69
|
+
get: (obj) => obj.position,
|
|
70
|
+
set: (obj, value) => {
|
|
71
|
+
obj.position = value;
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
metadata: _metadata
|
|
75
|
+
}, _position_initializers, _position_extraInitializers);
|
|
76
|
+
__esDecorate(this, null, _politeness_decorators, {
|
|
77
|
+
kind: "accessor",
|
|
78
|
+
name: "politeness",
|
|
79
|
+
static: false,
|
|
80
|
+
private: false,
|
|
81
|
+
access: {
|
|
82
|
+
has: (obj) => "politeness" in obj,
|
|
83
|
+
get: (obj) => obj.politeness,
|
|
84
|
+
set: (obj, value) => {
|
|
85
|
+
obj.politeness = value;
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
metadata: _metadata
|
|
89
|
+
}, _politeness_initializers, _politeness_extraInitializers);
|
|
90
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
configurable: true,
|
|
93
|
+
writable: true,
|
|
94
|
+
value: _metadata
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
static {
|
|
98
|
+
this.elementName = "sbb-toast";
|
|
99
|
+
}
|
|
100
|
+
static {
|
|
101
|
+
this.styles = [boxSizingStyles, unsafeCSS(toast_default)];
|
|
102
|
+
}
|
|
103
|
+
#timeout_accessor_storage;
|
|
104
|
+
/**
|
|
105
|
+
* The length of time in milliseconds to wait before automatically dismissing the toast.
|
|
106
|
+
* If 0 (default), it stays open indefinitely.
|
|
107
|
+
* From accessibility perspective, it is recommended to set a timeout of at least 20 seconds.
|
|
108
|
+
*/
|
|
109
|
+
get timeout() {
|
|
110
|
+
return this.#timeout_accessor_storage;
|
|
111
|
+
}
|
|
112
|
+
set timeout(value) {
|
|
113
|
+
this.#timeout_accessor_storage = value;
|
|
114
|
+
}
|
|
115
|
+
#position_accessor_storage;
|
|
116
|
+
/** The position where to place the toast. */
|
|
117
|
+
get position() {
|
|
118
|
+
return this.#position_accessor_storage;
|
|
119
|
+
}
|
|
120
|
+
set position(value) {
|
|
121
|
+
this.#position_accessor_storage = value;
|
|
122
|
+
}
|
|
123
|
+
#politeness_accessor_storage;
|
|
124
|
+
/**
|
|
125
|
+
* The ARIA politeness level.
|
|
126
|
+
* Check https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions#live_regions for further info
|
|
127
|
+
*/
|
|
128
|
+
get politeness() {
|
|
129
|
+
return this.#politeness_accessor_storage;
|
|
130
|
+
}
|
|
131
|
+
set politeness(value) {
|
|
132
|
+
this.#politeness_accessor_storage = value;
|
|
133
|
+
}
|
|
134
|
+
constructor() {
|
|
135
|
+
super();
|
|
136
|
+
this.#timeout_accessor_storage = __runInitializers(this, _timeout_initializers, 0);
|
|
137
|
+
this.#position_accessor_storage = (__runInitializers(this, _timeout_extraInitializers), __runInitializers(this, _position_initializers, "bottom-center"));
|
|
138
|
+
this.#politeness_accessor_storage = (__runInitializers(this, _position_extraInitializers), __runInitializers(this, _politeness_initializers, "polite"));
|
|
139
|
+
this._closeTimeout = __runInitializers(this, _politeness_extraInitializers);
|
|
140
|
+
this._language = new SbbLanguageController(this);
|
|
141
|
+
this._darkModeController = new SbbDarkModeController(this, () => {
|
|
142
|
+
this._syncSlottedElements();
|
|
143
|
+
this.requestUpdate();
|
|
144
|
+
});
|
|
145
|
+
this.addEventListener?.("click", (e) => this._onClick(e));
|
|
146
|
+
}
|
|
147
|
+
connectedCallback() {
|
|
148
|
+
this.popover = "manual";
|
|
149
|
+
super.connectedCallback();
|
|
150
|
+
toastRefs.add(this);
|
|
151
|
+
}
|
|
152
|
+
disconnectedCallback() {
|
|
153
|
+
super.disconnectedCallback();
|
|
154
|
+
clearTimeout(this._closeTimeout);
|
|
155
|
+
toastRefs.delete(this);
|
|
156
|
+
}
|
|
157
|
+
willUpdate(changedProperties) {
|
|
158
|
+
super.willUpdate(changedProperties);
|
|
159
|
+
if (changedProperties.has("politeness")) this.internals.ariaLive = this.politeness;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Open the toast.
|
|
163
|
+
* If there are other opened toasts in the page, close them first.
|
|
164
|
+
*/
|
|
165
|
+
open() {
|
|
166
|
+
if (this.state === "opened" || this.state === "opening" || !this.dispatchBeforeOpenEvent()) return;
|
|
167
|
+
this._closeOtherToasts();
|
|
168
|
+
this.showPopover?.();
|
|
169
|
+
this.state = "opening";
|
|
170
|
+
if (this._isZeroAnimationDuration()) this._handleOpening();
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Close the toast.
|
|
174
|
+
*/
|
|
175
|
+
close() {
|
|
176
|
+
if (this.state === "closed" || this.state === "closing" || !this.dispatchBeforeCloseEvent()) return;
|
|
177
|
+
clearTimeout(this._closeTimeout);
|
|
178
|
+
this.state = "closing";
|
|
179
|
+
if (this._isZeroAnimationDuration()) this._handleClosing();
|
|
180
|
+
}
|
|
181
|
+
_handleClosing() {
|
|
182
|
+
this.state = "closed";
|
|
183
|
+
this.hidePopover?.();
|
|
184
|
+
this.dispatchCloseEvent();
|
|
185
|
+
}
|
|
186
|
+
_handleOpening() {
|
|
187
|
+
this.state = "opened";
|
|
188
|
+
this.dispatchOpenEvent();
|
|
189
|
+
if (this.timeout) {
|
|
190
|
+
const global = globalThis;
|
|
191
|
+
const setTimeout = global[global.Zone?.__symbol__?.("setTimeout")] ?? global.setTimeout;
|
|
192
|
+
this._closeTimeout = setTimeout(() => this.close(), this.timeout);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
_onClick(event) {
|
|
196
|
+
const closeElement = composedPathHasAttribute(event, "sbb-toast-close", this);
|
|
197
|
+
if (closeElement && !closeElement.hasAttribute("disabled")) this.close();
|
|
198
|
+
}
|
|
199
|
+
_isZeroAnimationDuration() {
|
|
200
|
+
return isZeroAnimationDuration(this, "--sbb-toast-animation-duration");
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Slotted text nodes are not read correctly by screen readers on Chrome.
|
|
204
|
+
* To address the problem, if there is at least a root text node,
|
|
205
|
+
* we wrap the whole content in a <span> tag
|
|
206
|
+
*/
|
|
207
|
+
_onContentSlotChange(event) {
|
|
208
|
+
const slotNodes = event.target.assignedNodes();
|
|
209
|
+
if (slotNodes.some((el) => el.nodeType === Node.TEXT_NODE)) {
|
|
210
|
+
const span = document.createElement("span");
|
|
211
|
+
this.prepend(span);
|
|
212
|
+
span.append(...slotNodes);
|
|
213
|
+
}
|
|
214
|
+
this._syncSlottedElements();
|
|
215
|
+
}
|
|
216
|
+
_syncSlottedElements() {
|
|
217
|
+
this.querySelectorAll("sbb-transparent-button, sbb-transparent-button-link").forEach((btn) => {
|
|
218
|
+
btn.negative = this._isLightMode();
|
|
219
|
+
btn.size = isLean() ? "s" : "m";
|
|
220
|
+
});
|
|
221
|
+
this.querySelectorAll("sbb-link, sbb-link-button, sbb-link-static").forEach((link) => {
|
|
222
|
+
link.negative = this._isLightMode();
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
_onToastAnimationEnd(event) {
|
|
226
|
+
if (event.animationName === "open" && this.state === "opening") this._handleOpening();
|
|
227
|
+
else if (event.animationName === "close" && this.state === "closing") this._handleClosing();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Since we do not stack toasts, we force the closing on other existing opened ones
|
|
231
|
+
*/
|
|
232
|
+
_closeOtherToasts() {
|
|
233
|
+
toastRefs.forEach((t) => {
|
|
234
|
+
if (t.state === "opened" || t.state === "opening") t.close();
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
_isLightMode() {
|
|
238
|
+
return !this._darkModeController.matches();
|
|
239
|
+
}
|
|
240
|
+
render() {
|
|
241
|
+
return html`
|
|
242
|
+
<div class="sbb-toast__overlay-container">
|
|
243
|
+
<div class="sbb-toast" @animationend=${this._onToastAnimationEnd}>
|
|
244
|
+
<div class="sbb-toast-wrapper">
|
|
245
|
+
${this.renderIconSlot()}
|
|
246
|
+
<div class="sbb-toast__content">
|
|
247
|
+
<slot @slotchange=${this._onContentSlotChange}></slot>
|
|
248
|
+
</div>
|
|
249
|
+
<slot name="action" @slotchange=${this._syncSlottedElements}></slot>
|
|
250
|
+
</div>
|
|
251
|
+
<div class="sbb-toast__close">
|
|
252
|
+
<sbb-divider
|
|
253
|
+
class="sbb-toast__close-divider"
|
|
254
|
+
orientation="vertical"
|
|
255
|
+
?negative=${this._isLightMode()}
|
|
256
|
+
></sbb-divider>
|
|
257
|
+
${!this.readOnly ? html`<sbb-transparent-button
|
|
258
|
+
class="sbb-toast__close-button"
|
|
259
|
+
icon-name="cross-small"
|
|
260
|
+
?negative=${this._isLightMode()}
|
|
261
|
+
size="m"
|
|
262
|
+
aria-label=${i18nCloseAlert[this._language.current]}
|
|
263
|
+
sbb-toast-close
|
|
264
|
+
></sbb-transparent-button>` : nothing}
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
`;
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
})();
|
|
272
|
+
//#endregion
|
|
273
|
+
export { SbbToastElement as t };
|
|
274
|
+
|
|
275
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LUloSHgwUXQzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90b2FzdC90b2FzdC5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90b2FzdC90b2FzdC5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi10b2FzdC1hbmltYXRpb24tZHVyYXRpb246IHZhcihcbiAgICAtLXNiYi1kaXNhYmxlLWFuaW1hdGlvbi1kdXJhdGlvbixcbiAgICB2YXIoLS1zYmItYW5pbWF0aW9uLWR1cmF0aW9uLTZ4KVxuICApO1xuICAtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yOiB2YXIoLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvci1kYXJrKTtcblxuICBkaXNwbGF5OiBub25lO1xufVxuXG46aG9zdCg6aXMoOnN0YXRlKHN0YXRlLW9wZW5pbmcpLCA6c3RhdGUoc3RhdGUtb3BlbmVkKSwgOnN0YXRlKHN0YXRlLWNsb3NpbmcpKSkge1xuICAtLXNiYi10b2FzdC1jb250YWluZXItZGlzcGxheTogZmxleDtcblxuICBkaXNwbGF5OiBibG9jaztcbn1cblxuOmhvc3QoW3Bvc2l0aW9uPSdib3R0b20tbGVmdCddKSxcbjpob3N0KFtwb3NpdGlvbj0nYm90dG9tLXN0YXJ0J10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogZmxleC1zdGFydDtcbiAgLS1zYmItdG9hc3QtdmVydGljYWwtcG9zaXRpb246IGZsZXgtZW5kO1xufVxuXG46aG9zdChbcG9zaXRpb249J2JvdHRvbS1jZW50ZXInXSkge1xuICAtLXNiYi10b2FzdC1ob3Jpem9udGFsLXBvc2l0aW9uOiBjZW50ZXI7XG4gIC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uOiBmbGV4LWVuZDtcbn1cblxuOmhvc3QoW3Bvc2l0aW9uPSdib3R0b20tcmlnaHQnXSksXG46aG9zdChbcG9zaXRpb249J2JvdHRvbS1lbmQnXSkge1xuICAtLXNiYi10b2FzdC1ob3Jpem9udGFsLXBvc2l0aW9uOiBmbGV4LWVuZDtcbiAgLS1zYmItdG9hc3QtdmVydGljYWwtcG9zaXRpb246IGZsZXgtZW5kO1xufVxuXG46aG9zdChbcG9zaXRpb249J3RvcC1sZWZ0J10pLFxuOmhvc3QoW3Bvc2l0aW9uPSd0b3Atc3RhcnQnXSkge1xuICAtLXNiYi10b2FzdC1ob3Jpem9udGFsLXBvc2l0aW9uOiBmbGV4LXN0YXJ0O1xuICAtLXNiYi10b2FzdC12ZXJ0aWNhbC1wb3NpdGlvbjogZmxleC1zdGFydDtcbn1cblxuOmhvc3QoW3Bvc2l0aW9uPSd0b3AtY2VudGVyJ10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogY2VudGVyO1xuICAtLXNiYi10b2FzdC12ZXJ0aWNhbC1wb3NpdGlvbjogZmxleC1zdGFydDtcbn1cblxuOmhvc3QoW3Bvc2l0aW9uPSd0b3AtcmlnaHQnXSksXG46aG9zdChbcG9zaXRpb249J3RvcC1lbmQnXSkge1xuICAtLXNiYi10b2FzdC1ob3Jpem9udGFsLXBvc2l0aW9uOiBmbGV4LWVuZDtcbiAgLS1zYmItdG9hc3QtdmVydGljYWwtcG9zaXRpb246IGZsZXgtc3RhcnQ7XG59XG5cbjpob3N0KDpzdGF0ZShkYXJrKSkge1xuICAtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yOiB2YXIoLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvci1kZWZhdWx0KTtcbn1cblxuLnNiYi10b2FzdF9fb3ZlcmxheS1jb250YWluZXIge1xuICBwb3NpdGlvbjogdmFyKC0tc2JiLXRvYXN0LWNvbnRhaW5lci1wb3NpdGlvbik7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBpbnNldDogMDtcbiAgZGlzcGxheTogdmFyKC0tc2JiLXRvYXN0LWNvbnRhaW5lci1kaXNwbGF5LCBub25lKTtcbiAganVzdGlmeS1jb250ZW50OiB2YXIoLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbik7XG4gIGFsaWduLWl0ZW1zOiB2YXIoLS1zYmItdG9hc3QtdmVydGljYWwtcG9zaXRpb24pO1xufVxuXG4uc2JiLXRvYXN0IHtcbiAgei1pbmRleDogdmFyKC0tc2JiLXRvYXN0LXotaW5kZXgsIHZhcigtLXNiYi1vdmVybGF5LWRlZmF1bHQtei1pbmRleCkpO1xuICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgbWFyZ2luOiB2YXIoLS1zYmItdG9hc3QtbWFyZ2luKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLXRvYXN0LWJvcmRlci1yYWRpdXMpO1xuICBtYXgtd2lkdGg6IHZhcigtLXNiYi10b2FzdC1tYXgtd2lkdGgpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBjb2xvcjogdmFyKC0tc2JiLXRvYXN0LXRleHQtY29sb3IpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItdG9hc3QtYmFja2dyb3VuZC1jb2xvcik7XG5cbiAgOmhvc3QoOnN0YXRlKHN0YXRlLW9wZW5pbmcpKSAmIHtcbiAgICBhbmltYXRpb246IHtcbiAgICAgIG5hbWU6IG9wZW47XG4gICAgICBkdXJhdGlvbjogdmFyKC0tc2JiLXRvYXN0LWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gICAgICB0aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi10b2FzdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uKTtcbiAgICB9XG4gIH1cblxuICA6aG9zdCg6c3RhdGUoc3RhdGUtY2xvc2luZykpICYge1xuICAgIGFuaW1hdGlvbjoge1xuICAgICAgbmFtZTogY2xvc2U7XG4gICAgICBkdXJhdGlvbjogdmFyKC0tc2JiLXRvYXN0LWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gICAgICB0aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi10b2FzdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uKTtcbiAgICB9XG4gIH1cbn1cblxuLnNiYi10b2FzdC13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiB2YXIoLS1zYmItdG9hc3QtZ2FwKTtcbiAgcGFkZGluZy1ibG9jazogdmFyKC0tc2JiLXRvYXN0LXBhZGRpbmctYmxvY2spO1xuICBwYWRkaW5nLWlubGluZTogdmFyKC0tc2JiLXRvYXN0LXBhZGRpbmctaW5saW5lKTtcbn1cblxuc2xvdDpub3QoW25hbWU9J2ljb24nXSksXG4uc2JiLXRvYXN0X19jbG9zZSB7XG4gIC8vIEFzIHRoZSBzbG90dGVkIGNvbnRlbnQgaXMgZGlzcGxheWVkIG9uIGEgd2hpdGUgYmFja2dyb3VuZCwgd2UgbmVlZCB0byBmb3JjZSBsaWdodCBtb2RlIGZvciB0aGVtLlxuICBjb2xvci1zY2hlbWU6IG9ubHkgbGlnaHQ7XG59XG5cbi5zYmItdG9hc3RfX2NvbnRlbnQge1xuICBAaW5jbHVkZSBzYmIudGl0bGUtNigkZXhjbHVkZS1zcGFjaW5nOiB0cnVlKTtcblxuICBmbGV4OiAxIDEgMDtcbn1cblxuLnNiYi10b2FzdF9fY2xvc2Uge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uc2JiLXRvYXN0X19jbG9zZS1kaXZpZGVyIHtcbiAgcGFkZGluZy1ibG9jazogdmFyKC0tc2JiLXRvYXN0LXBhZGRpbmctYmxvY2spO1xufVxuXG4uc2JiLXRvYXN0X19jbG9zZS1idXR0b24ge1xuICBtYXJnaW4taW5saW5lOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXh4eHMpO1xufVxuXG5Aa2V5ZnJhbWVzIG9wZW4ge1xuICBmcm9tIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2xhdGU6IDAgdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpO1xuICB9XG5cbiAgdG8ge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2xhdGU6IDA7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBjbG9zZSB7XG4gIGZyb20ge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2xhdGU6IDA7XG4gIH1cblxuICB0byB7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNsYXRlOiAwIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaHRtbCxcbiAgbm90aGluZyxcbiAgdW5zYWZlQ1NTLFxuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICB0eXBlIFByb3BlcnR5VmFsdWVzLFxuICB0eXBlIFRlbXBsYXRlUmVzdWx0LFxufSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIFNiYlRyYW5zcGFyZW50QnV0dG9uRWxlbWVudCxcbiAgdHlwZSBTYmJUcmFuc3BhcmVudEJ1dHRvbkxpbmtFbGVtZW50LFxufSBmcm9tICcuLi9idXR0b24ucHVyZS50cyc7XG5pbXBvcnQgeyBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCB9IGZyb20gJy4uL2NvcmUvYmFzZS1lbGVtZW50cy50cyc7XG5pbXBvcnQgeyBTYmJEYXJrTW9kZUNvbnRyb2xsZXIsIFNiYkxhbmd1YWdlQ29udHJvbGxlciB9IGZyb20gJy4uL2NvcmUvY29udHJvbGxlcnMudHMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLnRzJztcbmltcG9ydCB7IGlzTGVhbiwgaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24gfSBmcm9tICcuLi9jb3JlL2RvbS50cyc7XG5pbXBvcnQgeyBjb21wb3NlZFBhdGhIYXNBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL2V2ZW50aW5nLnRzJztcbmltcG9ydCB7IGkxOG5DbG9zZUFsZXJ0IH0gZnJvbSAnLi4vY29yZS9pMThuLnRzJztcbmltcG9ydCB7IFNiYlJlYWRvbmx5TWl4aW4gfSBmcm9tICcuLi9jb3JlL21peGlucy50cyc7XG5pbXBvcnQgeyBib3hTaXppbmdTdHlsZXMgfSBmcm9tICcuLi9jb3JlL3N0eWxlcy50cyc7XG5pbXBvcnQgeyBTYmJJY29uTmFtZU1peGluIH0gZnJvbSAnLi4vaWNvbi50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYkxpbmtCdXR0b25FbGVtZW50LCBTYmJMaW5rRWxlbWVudCwgU2JiTGlua1N0YXRpY0VsZW1lbnQgfSBmcm9tICcuLi9saW5rLnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vdG9hc3Quc2Nzcz9pbmxpbmUnO1xuXG5pbXBvcnQgJy4uL2RpdmlkZXIudHMnO1xuXG4vLyBUT0RPKGJyZWFraW5nLWNoYW5nZSk6IFJlbW92ZSBjYWxsIHRvIGRlZmluZS5cblNiYlRyYW5zcGFyZW50QnV0dG9uRWxlbWVudC5kZWZpbmUoKTtcblxudHlwZSBTYmJUb2FzdFBvc2l0aW9uVmVydGljYWwgPSAndG9wJyB8ICdib3R0b20nO1xudHlwZSBTYmJUb2FzdFBvc2l0aW9uSG9yaXpvbnRhbCA9ICdsZWZ0JyB8ICdzdGFydCcgfCAnY2VudGVyJyB8ICdyaWdodCcgfCAnZW5kJztcbmV4cG9ydCB0eXBlIFNiYlRvYXN0UG9zaXRpb24gPSBgJHtTYmJUb2FzdFBvc2l0aW9uVmVydGljYWx9LSR7U2JiVG9hc3RQb3NpdGlvbkhvcml6b250YWx9YDtcblxuLy8gQSBnbG9iYWwgY29sbGVjdGlvbiBvZiBleGlzdGluZyB0b2FzdHNcbmNvbnN0IHRvYXN0UmVmcyA9IG5ldyBTZXQ8U2JiVG9hc3RFbGVtZW50PigpO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgdG9hc3Qgbm90aWZpY2F0aW9uLlxuICpcbiAqIEBzbG90IC0gVXNlIHRoZSB1bm5hbWVkIHNsb3QgdG8gYWRkIGNvbnRlbnQgdG8gdGhlIGBzYmItdG9hc3RgLlxuICogQHNsb3QgaWNvbiAtIEFzc2lnbiBhIGN1c3RvbSBpY29uIHZpYSBzbG90LlxuICogQHNsb3QgYWN0aW9uIC0gUHJvdmlkZSBhIGN1c3RvbSBhY3Rpb24gZm9yIHRoaXMgdG9hc3QuXG4gKiBAY3NzcHJvcCBbLS1zYmItdG9hc3Qtei1pbmRleD12YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpXSAtIFRvIHNwZWNpZnkgYSBjdXN0b20gc3RhY2sgb3JkZXIsXG4gKiB0aGUgYHotaW5kZXhgIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nIHRoaXMgQ1NTIHZhcmlhYmxlLiBUaGUgZGVmYXVsdCBgei1pbmRleGAgb2YgdGhlXG4gKiBjb21wb25lbnQgaXMgc2V0IHRvIGB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpYCB3aXRoIGEgdmFsdWUgb2YgYDEwMDBgLlxuICovXG5leHBvcnQgY2xhc3MgU2JiVG9hc3RFbGVtZW50IGV4dGVuZHMgU2JiSWNvbk5hbWVNaXhpbihTYmJSZWFkb25seU1peGluKFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50KSkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXRvYXN0JztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgdW5zYWZlQ1NTKHN0eWxlKV07XG5cbiAgLyoqXG4gICAqIFRoZSBsZW5ndGggb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgYXV0b21hdGljYWxseSBkaXNtaXNzaW5nIHRoZSB0b2FzdC5cbiAgICogSWYgMCAoZGVmYXVsdCksIGl0IHN0YXlzIG9wZW4gaW5kZWZpbml0ZWx5LlxuICAgKiBGcm9tIGFjY2Vzc2liaWxpdHkgcGVyc3BlY3RpdmUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHNldCBhIHRpbWVvdXQgb2YgYXQgbGVhc3QgMjAgc2Vjb25kcy5cbiAgICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIHRpbWVvdXQ6IG51bWJlciA9IDA7XG5cbiAgLyoqIFRoZSBwb3NpdGlvbiB3aGVyZSB0byBwbGFjZSB0aGUgdG9hc3QuICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUgfSkgcHVibGljIGFjY2Vzc29yIHBvc2l0aW9uOiBTYmJUb2FzdFBvc2l0aW9uID0gJ2JvdHRvbS1jZW50ZXInO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJJQSBwb2xpdGVuZXNzIGxldmVsLlxuICAgKiBDaGVjayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BY2Nlc3NpYmlsaXR5L0FSSUEvQVJJQV9MaXZlX1JlZ2lvbnMjbGl2ZV9yZWdpb25zIGZvciBmdXJ0aGVyIGluZm9cbiAgICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyBhY2Nlc3NvciBwb2xpdGVuZXNzOiAncG9saXRlJyB8ICdhc3NlcnRpdmUnIHwgJ29mZicgPSAncG9saXRlJztcblxuICBwcml2YXRlIF9jbG9zZVRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9kYXJrTW9kZUNvbnRyb2xsZXIgPSBuZXcgU2JiRGFya01vZGVDb250cm9sbGVyKHRoaXMsICgpID0+IHtcbiAgICB0aGlzLl9zeW5jU2xvdHRlZEVsZW1lbnRzKCk7XG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gIH0pO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdjbGljaycsIChlKSA9PiB0aGlzLl9vbkNsaWNrKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnBvcG92ZXIgPSAnbWFudWFsJztcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgLy8gQWRkIHRoaXMgdG9hc3QgdG8gdGhlIGdsb2JhbCBjb2xsZWN0aW9uXG4gICAgdG9hc3RSZWZzLmFkZCh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVvdXQpO1xuXG4gICAgLy8gUmVtb3ZlIHRoaXMgaW5zdGFuY2VcbiAgICB0b2FzdFJlZnMuZGVsZXRlKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdwb2xpdGVuZXNzJykpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFMaXZlID0gdGhpcy5wb2xpdGVuZXNzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSB0b2FzdC5cbiAgICogSWYgdGhlcmUgYXJlIG90aGVyIG9wZW5lZCB0b2FzdHMgaW4gdGhlIHBhZ2UsIGNsb3NlIHRoZW0gZmlyc3QuXG4gICAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnIHx8ICF0aGlzLmRpc3BhdGNoQmVmb3JlT3BlbkV2ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jbG9zZU90aGVyVG9hc3RzKCk7XG4gICAgdGhpcy5zaG93UG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuaW5nJztcblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBvcGVuZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB0b2FzdC5cbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2Nsb3NlZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnIHx8ICF0aGlzLmRpc3BhdGNoQmVmb3JlQ2xvc2VFdmVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2Nsb3NlVGltZW91dCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zaW5nJztcblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBjbG9zZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2xvc2luZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgdGhpcy5oaWRlUG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5kaXNwYXRjaENsb3NlRXZlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuZWQnO1xuICAgIHRoaXMuZGlzcGF0Y2hPcGVuRXZlbnQoKTtcblxuICAgIC8vIFN0YXJ0IHRoZSBjb3VudGRvd24gdG8gY2xvc2UgaXRcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vc2JiLWRlc2lnbi1zeXN0ZW1zL2x5bmUtYW5ndWxhci9pc3N1ZXMvMTkwXG4gICAgICAvLyBJZiB6b25lLmpzIGlzIGxvYWRlZCwgc2V0VGltZW91dCBpcyB3cmFwcGVkIGFuZCB0cmFja2VkIHdoaWNoIHdpbGwgbWFya1xuICAgICAgLy8gYW55dGhpbmcgaW4gQW5ndWxhciBhcyB1bnN0YWJsZSBhcyBsb25nIGFzIHNldFRpbWVvdXQgaXMgbm90IGZpbmlzaGVkLlxuICAgICAgLy8gVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGZpeGVkIGluIHBsYWNlcyB3aGVyZSB3ZSBhY3R1YWxseSB3YW50IHRvIHdhaXQgYVxuICAgICAgLy8gc3BlY2lmaWMgYW1vdW50IG9mIHRpbWUgd2l0aG91dCBhbiBpbnRlcmFjdGlvbiAoZS5nLiBmb3IgdGhpcyBjYXNlKS5cbiAgICAgIGNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXMgYXMgYW55O1xuICAgICAgY29uc3Qgc2V0VGltZW91dDogdHlwZW9mIGdsb2JhbFRoaXMuc2V0VGltZW91dCA9XG4gICAgICAgIGdsb2JhbFtnbG9iYWwuWm9uZT8uX19zeW1ib2xfXz8uKCdzZXRUaW1lb3V0JykgYXMgc3RyaW5nXSA/PyBnbG9iYWwuc2V0VGltZW91dDtcblxuICAgICAgdGhpcy5fY2xvc2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmNsb3NlKCksIHRoaXMudGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2xvc2UgdGhlIHRvYXN0IG9uIGNsaWNrIG9mIGFueSBlbGVtZW50IHRoYXQgaGFzIHRoZSAnc2JiLXRvYXN0LWNsb3NlJyBhdHRyaWJ1dGUuXG4gIHByaXZhdGUgX29uQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2xvc2VFbGVtZW50ID0gY29tcG9zZWRQYXRoSGFzQXR0cmlidXRlKGV2ZW50LCAnc2JiLXRvYXN0LWNsb3NlJywgdGhpcyk7XG5cbiAgICBpZiAoY2xvc2VFbGVtZW50ICYmICFjbG9zZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKHRoaXMsICctLXNiYi10b2FzdC1hbmltYXRpb24tZHVyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTbG90dGVkIHRleHQgbm9kZXMgYXJlIG5vdCByZWFkIGNvcnJlY3RseSBieSBzY3JlZW4gcmVhZGVycyBvbiBDaHJvbWUuXG4gICAqIFRvIGFkZHJlc3MgdGhlIHByb2JsZW0sIGlmIHRoZXJlIGlzIGF0IGxlYXN0IGEgcm9vdCB0ZXh0IG5vZGUsXG4gICAqIHdlIHdyYXAgdGhlIHdob2xlIGNvbnRlbnQgaW4gYSA8c3Bhbj4gdGFnXG4gICAqL1xuICBwcml2YXRlIF9vbkNvbnRlbnRTbG90Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNsb3ROb2RlcyA9IChldmVudC50YXJnZXQgYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCk7XG5cbiAgICBpZiAoc2xvdE5vZGVzLnNvbWUoKGVsKSA9PiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpKSB7XG4gICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgdGhpcy5wcmVwZW5kKHNwYW4pO1xuICAgICAgc3Bhbi5hcHBlbmQoLi4uc2xvdE5vZGVzKTtcbiAgICB9XG4gICAgdGhpcy5fc3luY1Nsb3R0ZWRFbGVtZW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1Nsb3R0ZWRFbGVtZW50cygpOiB2b2lkIHtcbiAgICAvLyBGb3JjZSB0aGUgdmlzdWFsIHN0YXRlIG9uIHNsb3R0ZWQgYnV0dG9uc1xuICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbDxTYmJUcmFuc3BhcmVudEJ1dHRvbkVsZW1lbnQgfCBTYmJUcmFuc3BhcmVudEJ1dHRvbkxpbmtFbGVtZW50PihcbiAgICAgICdzYmItdHJhbnNwYXJlbnQtYnV0dG9uLCBzYmItdHJhbnNwYXJlbnQtYnV0dG9uLWxpbmsnLFxuICAgICkuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICBidG4ubmVnYXRpdmUgPSB0aGlzLl9pc0xpZ2h0TW9kZSgpO1xuICAgICAgYnRuLnNpemUgPSBpc0xlYW4oKSA/ICdzJyA6ICdtJztcbiAgICB9KTtcblxuICAgIC8vIEZvcmNlIG5lZ2F0aXZlIG9uIHNsb3R0ZWQgbGlua3NcbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8U2JiTGlua0VsZW1lbnQgfCBTYmJMaW5rQnV0dG9uRWxlbWVudCB8IFNiYkxpbmtTdGF0aWNFbGVtZW50PihcbiAgICAgICdzYmItbGluaywgc2JiLWxpbmstYnV0dG9uLCBzYmItbGluay1zdGF0aWMnLFxuICAgICkuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgbGluay5uZWdhdGl2ZSA9IHRoaXMuX2lzTGlnaHRNb2RlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBJbiByYXJlIGNhc2VzIGl0IGNhbiBiZSB0aGF0IHRoZSBhbmltYXRpb25FbmQgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlLlxuICAvLyBUbyBhdm9pZCBlbnRlcmluZyBhIGNvcnJ1cHQgc3RhdGUsIGV4aXQgd2hlbiBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQuXG4gIHByaXZhdGUgX29uVG9hc3RBbmltYXRpb25FbmQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgLy8gT24gdG9hc3Qgb3BlbmVkXG4gICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdvcGVuJyAmJiB0aGlzLnN0YXRlID09PSAnb3BlbmluZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZU9wZW5pbmcoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdjbG9zZScgJiYgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpbmNlIHdlIGRvIG5vdCBzdGFjayB0b2FzdHMsIHdlIGZvcmNlIHRoZSBjbG9zaW5nIG9uIG90aGVyIGV4aXN0aW5nIG9wZW5lZCBvbmVzXG4gICAqL1xuICBwcml2YXRlIF9jbG9zZU90aGVyVG9hc3RzKCk6IHZvaWQge1xuICAgIHRvYXN0UmVmcy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodC5zdGF0ZSA9PT0gJ29wZW5lZCcgfHwgdC5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICAgIHQuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzTGlnaHRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fZGFya01vZGVDb250cm9sbGVyLm1hdGNoZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi10b2FzdF9fb3ZlcmxheS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10b2FzdFwiIEBhbmltYXRpb25lbmQ9JHt0aGlzLl9vblRvYXN0QW5pbWF0aW9uRW5kfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXRvYXN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICR7dGhpcy5yZW5kZXJJY29uU2xvdCgpfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10b2FzdF9fY29udGVudFwiPlxuICAgICAgICAgICAgICA8c2xvdCBAc2xvdGNoYW5nZT0ke3RoaXMuX29uQ29udGVudFNsb3RDaGFuZ2V9Pjwvc2xvdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvblwiIEBzbG90Y2hhbmdlPSR7dGhpcy5fc3luY1Nsb3R0ZWRFbGVtZW50c30+PC9zbG90PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdG9hc3RfX2Nsb3NlXCI+XG4gICAgICAgICAgICA8c2JiLWRpdmlkZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzYmItdG9hc3RfX2Nsb3NlLWRpdmlkZXJcIlxuICAgICAgICAgICAgICBvcmllbnRhdGlvbj1cInZlcnRpY2FsXCJcbiAgICAgICAgICAgICAgP25lZ2F0aXZlPSR7dGhpcy5faXNMaWdodE1vZGUoKX1cbiAgICAgICAgICAgID48L3NiYi1kaXZpZGVyPlxuICAgICAgICAgICAgJHshdGhpcy5yZWFkT25seVxuICAgICAgICAgICAgICA/IGh0bWxgPHNiYi10cmFuc3BhcmVudC1idXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXRvYXN0X19jbG9zZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgaWNvbi1uYW1lPVwiY3Jvc3Mtc21hbGxcIlxuICAgICAgICAgICAgICAgICAgP25lZ2F0aXZlPSR7dGhpcy5faXNMaWdodE1vZGUoKX1cbiAgICAgICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtpMThuQ2xvc2VBbGVydFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICAgICAgICAgIHNiYi10b2FzdC1jbG9zZVxuICAgICAgICAgICAgICAgID48L3NiYi10cmFuc3BhcmVudC1idXR0b24+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRvYXN0JzogU2JiVG9hc3RFbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzhCQSw0QkFBNEIsUUFBUTtBQU9wQyxJQUFNLDRCQUFZLElBQUksS0FBc0I7Ozs7Ozs7Ozs7O0lBWS9CLHlCQUFlO21CQUFTLGlCQUFpQixpQkFBaUIsd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Y0FBbkYsd0JBQXdCLFlBQTJEOzs7MEJBUzdGLFdBQVcsRUFDWCxTQUFTLEVBQUUsTUFBTSxRQUFRLENBQUMsQ0FBQTsyQkFJMUIsU0FBUyxFQUFFLFNBQVMsTUFBTSxDQUFDLENBQUE7NkJBTTNCLFVBQVUsQ0FBQTtBQVRYLGdCQUFBLE1BQUEsTUFBQSxxQkFBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLGFBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBTyxNQUFBLEtBQUEsVUFBQTtBQUFBLFVBQVAsVUFBTzs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLHVCQUFBLDJCQUFBO0FBR00sZ0JBQUEsTUFBQSxNQUFBLHNCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsY0FBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFRLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBUixXQUFROztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsd0JBQUEsNEJBQUE7QUFNekMsZ0JBQUEsTUFBQSxNQUFBLHdCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFB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
|
package/development/toast.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as SbbToastElement } from "./toast.component-
|
|
1
|
+
import { t as SbbToastElement } from "./toast.component-IhHx0Qt3.js";
|
|
2
2
|
export { SbbToastElement };
|
package/off-brand-theme.css
CHANGED
|
@@ -1959,6 +1959,18 @@ slot[name=error]::slotted(*) {
|
|
|
1959
1959
|
--sbb-overlay-position-try-fallbacks:
|
|
1960
1960
|
block-start span-inline-end, block-start span-inline-start, block-end,
|
|
1961
1961
|
block-end span-inline-end, block-end span-inline-start;
|
|
1962
|
+
--sbb-toast-max-width: 25rem;
|
|
1963
|
+
--sbb-toast-animation-timing-function: ease;
|
|
1964
|
+
--sbb-toast-text-color: var(--sbb-color-3-inverted);
|
|
1965
|
+
--sbb-toast-background-color: var(--sbb-background-color-1-inverted);
|
|
1966
|
+
--sbb-toast-margin: var(--sbb-spacing-responsive-s);
|
|
1967
|
+
--sbb-toast-padding-block: var(--sbb-spacing-responsive-xxxs);
|
|
1968
|
+
--sbb-toast-padding-inline: var(--sbb-spacing-responsive-xs);
|
|
1969
|
+
--sbb-toast-border-radius: var(--sbb-border-radius-4x);
|
|
1970
|
+
--sbb-toast-container-position: fixed;
|
|
1971
|
+
--sbb-toast-horizontal-position: initial;
|
|
1972
|
+
--sbb-toast-vertical-position: initial;
|
|
1973
|
+
--sbb-toast-gap: var(--sbb-spacing-fixed-2x);
|
|
1962
1974
|
--sbb-visual-checkbox-dimension: var(--sbb-checkbox-dimension-m);
|
|
1963
1975
|
--sbb-visual-checkbox-selection-color: var(--sbb-color-primary);
|
|
1964
1976
|
--sbb-visual-checkbox-selection-color-negative: var(--sbb-color-primary85);
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sbb-esta/lyne-elements-dev",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.12.0-dev.1777289332",
|
|
4
4
|
"description": "Lyne Design System",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"design system",
|
|
7
7
|
"web components",
|
|
8
8
|
"lit",
|
|
9
|
-
"https://github.com/sbb-design-systems/lyne-components/commit/
|
|
9
|
+
"https://github.com/sbb-design-systems/lyne-components/commit/ebb76c66e4dfd356b75a8307023b739fff832cfb"
|
|
10
10
|
],
|
|
11
11
|
"type": "module",
|
|
12
12
|
"exports": {
|
package/safety-theme.css
CHANGED
|
@@ -1959,6 +1959,18 @@ slot[name=error]::slotted(*) {
|
|
|
1959
1959
|
--sbb-overlay-position-try-fallbacks:
|
|
1960
1960
|
block-start span-inline-end, block-start span-inline-start, block-end,
|
|
1961
1961
|
block-end span-inline-end, block-end span-inline-start;
|
|
1962
|
+
--sbb-toast-max-width: 25rem;
|
|
1963
|
+
--sbb-toast-animation-timing-function: ease;
|
|
1964
|
+
--sbb-toast-text-color: var(--sbb-color-3-inverted);
|
|
1965
|
+
--sbb-toast-background-color: var(--sbb-background-color-1-inverted);
|
|
1966
|
+
--sbb-toast-margin: var(--sbb-spacing-responsive-s);
|
|
1967
|
+
--sbb-toast-padding-block: var(--sbb-spacing-responsive-xxxs);
|
|
1968
|
+
--sbb-toast-padding-inline: var(--sbb-spacing-responsive-xs);
|
|
1969
|
+
--sbb-toast-border-radius: var(--sbb-border-radius-4x);
|
|
1970
|
+
--sbb-toast-container-position: fixed;
|
|
1971
|
+
--sbb-toast-horizontal-position: initial;
|
|
1972
|
+
--sbb-toast-vertical-position: initial;
|
|
1973
|
+
--sbb-toast-gap: var(--sbb-spacing-fixed-2x);
|
|
1962
1974
|
--sbb-visual-checkbox-dimension: var(--sbb-checkbox-dimension-m);
|
|
1963
1975
|
--sbb-visual-checkbox-selection-color: var(--sbb-color-primary);
|
|
1964
1976
|
--sbb-visual-checkbox-selection-color-negative: var(--sbb-color-primary85);
|
package/standard-theme.css
CHANGED
|
@@ -1959,6 +1959,18 @@ slot[name=error]::slotted(*) {
|
|
|
1959
1959
|
--sbb-overlay-position-try-fallbacks:
|
|
1960
1960
|
block-start span-inline-end, block-start span-inline-start, block-end,
|
|
1961
1961
|
block-end span-inline-end, block-end span-inline-start;
|
|
1962
|
+
--sbb-toast-max-width: 25rem;
|
|
1963
|
+
--sbb-toast-animation-timing-function: ease;
|
|
1964
|
+
--sbb-toast-text-color: var(--sbb-color-3-inverted);
|
|
1965
|
+
--sbb-toast-background-color: var(--sbb-background-color-1-inverted);
|
|
1966
|
+
--sbb-toast-margin: var(--sbb-spacing-responsive-s);
|
|
1967
|
+
--sbb-toast-padding-block: var(--sbb-spacing-responsive-xxxs);
|
|
1968
|
+
--sbb-toast-padding-inline: var(--sbb-spacing-responsive-xs);
|
|
1969
|
+
--sbb-toast-border-radius: var(--sbb-border-radius-4x);
|
|
1970
|
+
--sbb-toast-container-position: fixed;
|
|
1971
|
+
--sbb-toast-horizontal-position: initial;
|
|
1972
|
+
--sbb-toast-vertical-position: initial;
|
|
1973
|
+
--sbb-toast-gap: var(--sbb-spacing-fixed-2x);
|
|
1962
1974
|
--sbb-visual-checkbox-dimension: var(--sbb-checkbox-dimension-m);
|
|
1963
1975
|
--sbb-visual-checkbox-selection-color: var(--sbb-color-primary);
|
|
1964
1976
|
--sbb-visual-checkbox-selection-color-negative: var(--sbb-color-primary85);
|
package/toast/toast.component.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "../toast.component-
|
|
1
|
+
import { t as e } from "../toast.component-CORnf2Tl.js";
|
|
2
2
|
export { e as SbbToastElement };
|
|
@@ -13,7 +13,7 @@ import { i18nCloseAlert as g } from "./core/i18n.js";
|
|
|
13
13
|
import { SbbIconNameMixin as _ } from "./icon.js";
|
|
14
14
|
import "./divider.js";
|
|
15
15
|
//#region src/elements/toast/toast.scss?inline
|
|
16
|
-
var v = ":host{--sbb-toast-
|
|
16
|
+
var v = ":host{--sbb-toast-animation-duration: var( --sbb-disable-animation-duration, var(--sbb-animation-duration-6x) );--sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);display:none}:host(:is(:is(:state(state-opening),[state--state-opening]),:is(:state(state-opened),[state--state-opened]),:is(:state(state-closing),[state--state-closing]))){--sbb-toast-container-display: flex;display:block}:host([position=bottom-left]),:host([position=bottom-start]){--sbb-toast-horizontal-position: flex-start;--sbb-toast-vertical-position: flex-end}:host([position=bottom-center]){--sbb-toast-horizontal-position: center;--sbb-toast-vertical-position: flex-end}:host([position=bottom-right]),:host([position=bottom-end]){--sbb-toast-horizontal-position: flex-end;--sbb-toast-vertical-position: flex-end}:host([position=top-left]),:host([position=top-start]){--sbb-toast-horizontal-position: flex-start;--sbb-toast-vertical-position: flex-start}:host([position=top-center]){--sbb-toast-horizontal-position: center;--sbb-toast-vertical-position: flex-start}:host([position=top-right]),:host([position=top-end]){--sbb-toast-horizontal-position: flex-end;--sbb-toast-vertical-position: flex-start}:host(:is(:state(dark),[state--dark])){--sbb-focus-outline-color: var(--sbb-focus-outline-color-default)}.sbb-toast__overlay-container{position:var(--sbb-toast-container-position);pointer-events:none;inset:0;display:var(--sbb-toast-container-display, none);justify-content:var(--sbb-toast-horizontal-position);align-items:var(--sbb-toast-vertical-position)}.sbb-toast{z-index:var(--sbb-toast-z-index, var(--sbb-overlay-default-z-index));pointer-events:auto;margin:var(--sbb-toast-margin);border-radius:var(--sbb-toast-border-radius);max-width:var(--sbb-toast-max-width);display:flex;color:var(--sbb-toast-text-color);background-color:var(--sbb-toast-background-color)}:host(:is(:state(state-opening),[state--state-opening])) .sbb-toast{animation-name:open;animation-duration:var(--sbb-toast-animation-duration);animation-timing-function:var(--sbb-toast-animation-timing-function)}:host(:is(:state(state-closing),[state--state-closing])) .sbb-toast{animation-name:close;animation-duration:var(--sbb-toast-animation-duration);animation-timing-function:var(--sbb-toast-animation-timing-function)}.sbb-toast-wrapper{display:flex;align-items:center;gap:var(--sbb-toast-gap);padding-block:var(--sbb-toast-padding-block);padding-inline:var(--sbb-toast-padding-inline)}slot:not([name=icon]),.sbb-toast__close{color-scheme:only light}.sbb-toast__content{--sbb-title-font-size: var(--sbb-title-font-size-level-6-lean, var(--sbb-heading-font-size-6));--sbb-title-line-height: var(--sbb-typo-line-height-text);margin-block:var(--sbb-title-margin-block, 0);margin-inline:0;font-family:var(--sbb-typo-font-family);font-weight:700;font-size:var(--sbb-title-font-size);letter-spacing:var(--sbb-typo-letter-spacing-heading);line-height:var(--sbb-title-line-height, var(--sbb-typo-line-height-heading));flex:1 1 0}.sbb-toast__close{display:flex;align-items:center}.sbb-toast__close-divider{padding-block:var(--sbb-toast-padding-block)}.sbb-toast__close-button{margin-inline:var(--sbb-spacing-responsive-xxxs)}@keyframes open{0%{visibility:hidden;opacity:0;translate:0 var(--sbb-spacing-fixed-2x)}to{visibility:visible;opacity:1;translate:0}}@keyframes close{0%{visibility:visible;opacity:1;translate:0}to{visibility:hidden;opacity:0;translate:0 var(--sbb-spacing-fixed-2x)}}";
|
|
17
17
|
//#endregion
|
|
18
18
|
//#region src/elements/toast/toast.component.ts
|
|
19
19
|
p.define();
|
package/toast.js
CHANGED
package/toast.pure.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "./toast.component-
|
|
1
|
+
import { t as e } from "./toast.component-CORnf2Tl.js";
|
|
2
2
|
export { e as SbbToastElement };
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
-
import { html, nothing, unsafeCSS } from "lit";
|
|
3
|
-
import { property } from "lit/decorators.js";
|
|
4
|
-
import { SbbOpenCloseBaseElement } from "./core/base-elements.js";
|
|
5
|
-
import { forceType } from "./core/decorators.js";
|
|
6
|
-
import { isLean, isZeroAnimationDuration } from "./core/dom.js";
|
|
7
|
-
import { composedPathHasAttribute } from "./core/eventing.js";
|
|
8
|
-
import { SbbReadonlyMixin } from "./core/mixins.js";
|
|
9
|
-
import { boxSizingStyles } from "./core/styles.js";
|
|
10
|
-
import { SbbTransparentButtonElement } from "./button.pure.js";
|
|
11
|
-
import { SbbDarkModeController, SbbLanguageController } from "./core/controllers.js";
|
|
12
|
-
import { i18nCloseAlert } from "./core/i18n.js";
|
|
13
|
-
import { SbbIconNameMixin } from "./icon.js";
|
|
14
|
-
import "./divider.js";
|
|
15
|
-
//#region src/elements/toast/toast.scss?inline
|
|
16
|
-
var toast_default = ":host {\n --sbb-toast-max-width: 25rem;\n --sbb-toast-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n --sbb-toast-animation-timing-function: ease;\n --sbb-toast-text-color: var(--sbb-color-3-inverted);\n --sbb-toast-background-color: var(--sbb-background-color-1-inverted);\n --sbb-toast-margin: var(--sbb-spacing-responsive-s);\n --sbb-toast-padding-block: var(--sbb-spacing-responsive-xxxs);\n --sbb-toast-padding-inline: var(--sbb-spacing-responsive-xs);\n --sbb-toast-border-radius: var(--sbb-border-radius-4x);\n --sbb-toast-container-display: none;\n --sbb-toast-container-position: fixed;\n --sbb-toast-horizontal-position: initial;\n --sbb-toast-vertical-position: initial;\n --sbb-toast-gap: var(--sbb-spacing-fixed-2x);\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n display: none;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n --sbb-toast-container-display: flex;\n display: block;\n}\n\n:host([position=bottom-left]),\n:host([position=bottom-start]) {\n --sbb-toast-horizontal-position: flex-start;\n --sbb-toast-vertical-position: flex-end;\n}\n\n:host([position=bottom-center]) {\n --sbb-toast-horizontal-position: center;\n --sbb-toast-vertical-position: flex-end;\n}\n\n:host([position=bottom-right]),\n:host([position=bottom-end]) {\n --sbb-toast-horizontal-position: flex-end;\n --sbb-toast-vertical-position: flex-end;\n}\n\n:host([position=top-left]),\n:host([position=top-start]) {\n --sbb-toast-horizontal-position: flex-start;\n --sbb-toast-vertical-position: flex-start;\n}\n\n:host([position=top-center]) {\n --sbb-toast-horizontal-position: center;\n --sbb-toast-vertical-position: flex-start;\n}\n\n:host([position=top-right]),\n:host([position=top-end]) {\n --sbb-toast-horizontal-position: flex-end;\n --sbb-toast-vertical-position: flex-start;\n}\n\n:host(:is(:state(dark),[state--dark])) {\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-default);\n}\n\n.sbb-toast__overlay-container {\n position: var(--sbb-toast-container-position);\n pointer-events: none;\n inset: 0;\n display: var(--sbb-toast-container-display);\n justify-content: var(--sbb-toast-horizontal-position);\n align-items: var(--sbb-toast-vertical-position);\n}\n\n.sbb-toast {\n z-index: var(--sbb-toast-z-index, var(--sbb-overlay-default-z-index));\n pointer-events: auto;\n margin: var(--sbb-toast-margin);\n border-radius: var(--sbb-toast-border-radius);\n max-width: var(--sbb-toast-max-width);\n display: flex;\n color: var(--sbb-toast-text-color);\n background-color: var(--sbb-toast-background-color);\n}\n:host(:is(:state(state-opening),[state--state-opening])) .sbb-toast {\n animation-name: open;\n animation-duration: var(--sbb-toast-animation-duration);\n animation-timing-function: var(--sbb-toast-animation-timing-function);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-toast {\n animation-name: close;\n animation-duration: var(--sbb-toast-animation-duration);\n animation-timing-function: var(--sbb-toast-animation-timing-function);\n}\n\n.sbb-toast-wrapper {\n display: flex;\n align-items: center;\n gap: var(--sbb-toast-gap);\n padding-block: var(--sbb-toast-padding-block);\n padding-inline: var(--sbb-toast-padding-inline);\n}\n\nslot:not([name=icon]),\n.sbb-toast__close {\n color-scheme: only light;\n}\n\n.sbb-toast__content {\n --sbb-title-font-size: var(--sbb-title-font-size-level-6-lean, var(--sbb-heading-font-size-6));\n --sbb-title-line-height: var(--sbb-typo-line-height-text);\n margin-block: var(--sbb-title-margin-block, 0);\n margin-inline: 0;\n font-family: var(--sbb-typo-font-family);\n font-weight: bold;\n font-size: var(--sbb-title-font-size);\n letter-spacing: var(--sbb-typo-letter-spacing-heading);\n line-height: var(--sbb-title-line-height, var(--sbb-typo-line-height-heading));\n flex: 1 1 0;\n}\n\n.sbb-toast__close {\n display: flex;\n align-items: center;\n}\n\n.sbb-toast__close-divider {\n padding-block: var(--sbb-toast-padding-block);\n}\n\n.sbb-toast__close-button {\n margin-inline: var(--sbb-spacing-responsive-xxxs);\n}\n\n@keyframes open {\n from {\n visibility: hidden;\n opacity: 0;\n translate: 0 var(--sbb-spacing-fixed-2x);\n }\n to {\n visibility: visible;\n opacity: 1;\n translate: 0;\n }\n}\n@keyframes close {\n from {\n visibility: visible;\n opacity: 1;\n translate: 0;\n }\n to {\n visibility: hidden;\n opacity: 0;\n translate: 0 var(--sbb-spacing-fixed-2x);\n }\n}";
|
|
17
|
-
//#endregion
|
|
18
|
-
//#region src/elements/toast/toast.component.ts
|
|
19
|
-
SbbTransparentButtonElement.define();
|
|
20
|
-
var toastRefs = /* @__PURE__ */ new Set();
|
|
21
|
-
/**
|
|
22
|
-
* It displays a toast notification.
|
|
23
|
-
*
|
|
24
|
-
* @slot - Use the unnamed slot to add content to the `sbb-toast`.
|
|
25
|
-
* @slot icon - Assign a custom icon via slot.
|
|
26
|
-
* @slot action - Provide a custom action for this toast.
|
|
27
|
-
* @cssprop [--sbb-toast-z-index=var(--sbb-overlay-default-z-index)] - To specify a custom stack order,
|
|
28
|
-
* the `z-index` can be overridden by defining this CSS variable. The default `z-index` of the
|
|
29
|
-
* component is set to `var(--sbb-overlay-default-z-index)` with a value of `1000`.
|
|
30
|
-
*/
|
|
31
|
-
var SbbToastElement = (() => {
|
|
32
|
-
let _classSuper = SbbIconNameMixin(SbbReadonlyMixin(SbbOpenCloseBaseElement));
|
|
33
|
-
let _timeout_decorators;
|
|
34
|
-
let _timeout_initializers = [];
|
|
35
|
-
let _timeout_extraInitializers = [];
|
|
36
|
-
let _position_decorators;
|
|
37
|
-
let _position_initializers = [];
|
|
38
|
-
let _position_extraInitializers = [];
|
|
39
|
-
let _politeness_decorators;
|
|
40
|
-
let _politeness_initializers = [];
|
|
41
|
-
let _politeness_extraInitializers = [];
|
|
42
|
-
return class SbbToastElement extends _classSuper {
|
|
43
|
-
static {
|
|
44
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
45
|
-
_timeout_decorators = [forceType(), property({ type: Number })];
|
|
46
|
-
_position_decorators = [property({ reflect: true })];
|
|
47
|
-
_politeness_decorators = [property()];
|
|
48
|
-
__esDecorate(this, null, _timeout_decorators, {
|
|
49
|
-
kind: "accessor",
|
|
50
|
-
name: "timeout",
|
|
51
|
-
static: false,
|
|
52
|
-
private: false,
|
|
53
|
-
access: {
|
|
54
|
-
has: (obj) => "timeout" in obj,
|
|
55
|
-
get: (obj) => obj.timeout,
|
|
56
|
-
set: (obj, value) => {
|
|
57
|
-
obj.timeout = value;
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
metadata: _metadata
|
|
61
|
-
}, _timeout_initializers, _timeout_extraInitializers);
|
|
62
|
-
__esDecorate(this, null, _position_decorators, {
|
|
63
|
-
kind: "accessor",
|
|
64
|
-
name: "position",
|
|
65
|
-
static: false,
|
|
66
|
-
private: false,
|
|
67
|
-
access: {
|
|
68
|
-
has: (obj) => "position" in obj,
|
|
69
|
-
get: (obj) => obj.position,
|
|
70
|
-
set: (obj, value) => {
|
|
71
|
-
obj.position = value;
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
metadata: _metadata
|
|
75
|
-
}, _position_initializers, _position_extraInitializers);
|
|
76
|
-
__esDecorate(this, null, _politeness_decorators, {
|
|
77
|
-
kind: "accessor",
|
|
78
|
-
name: "politeness",
|
|
79
|
-
static: false,
|
|
80
|
-
private: false,
|
|
81
|
-
access: {
|
|
82
|
-
has: (obj) => "politeness" in obj,
|
|
83
|
-
get: (obj) => obj.politeness,
|
|
84
|
-
set: (obj, value) => {
|
|
85
|
-
obj.politeness = value;
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
metadata: _metadata
|
|
89
|
-
}, _politeness_initializers, _politeness_extraInitializers);
|
|
90
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, {
|
|
91
|
-
enumerable: true,
|
|
92
|
-
configurable: true,
|
|
93
|
-
writable: true,
|
|
94
|
-
value: _metadata
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
static {
|
|
98
|
-
this.elementName = "sbb-toast";
|
|
99
|
-
}
|
|
100
|
-
static {
|
|
101
|
-
this.styles = [boxSizingStyles, unsafeCSS(toast_default)];
|
|
102
|
-
}
|
|
103
|
-
#timeout_accessor_storage;
|
|
104
|
-
/**
|
|
105
|
-
* The length of time in milliseconds to wait before automatically dismissing the toast.
|
|
106
|
-
* If 0 (default), it stays open indefinitely.
|
|
107
|
-
* From accessibility perspective, it is recommended to set a timeout of at least 20 seconds.
|
|
108
|
-
*/
|
|
109
|
-
get timeout() {
|
|
110
|
-
return this.#timeout_accessor_storage;
|
|
111
|
-
}
|
|
112
|
-
set timeout(value) {
|
|
113
|
-
this.#timeout_accessor_storage = value;
|
|
114
|
-
}
|
|
115
|
-
#position_accessor_storage;
|
|
116
|
-
/** The position where to place the toast. */
|
|
117
|
-
get position() {
|
|
118
|
-
return this.#position_accessor_storage;
|
|
119
|
-
}
|
|
120
|
-
set position(value) {
|
|
121
|
-
this.#position_accessor_storage = value;
|
|
122
|
-
}
|
|
123
|
-
#politeness_accessor_storage;
|
|
124
|
-
/**
|
|
125
|
-
* The ARIA politeness level.
|
|
126
|
-
* Check https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions#live_regions for further info
|
|
127
|
-
*/
|
|
128
|
-
get politeness() {
|
|
129
|
-
return this.#politeness_accessor_storage;
|
|
130
|
-
}
|
|
131
|
-
set politeness(value) {
|
|
132
|
-
this.#politeness_accessor_storage = value;
|
|
133
|
-
}
|
|
134
|
-
constructor() {
|
|
135
|
-
super();
|
|
136
|
-
this.#timeout_accessor_storage = __runInitializers(this, _timeout_initializers, 0);
|
|
137
|
-
this.#position_accessor_storage = (__runInitializers(this, _timeout_extraInitializers), __runInitializers(this, _position_initializers, "bottom-center"));
|
|
138
|
-
this.#politeness_accessor_storage = (__runInitializers(this, _position_extraInitializers), __runInitializers(this, _politeness_initializers, "polite"));
|
|
139
|
-
this._closeTimeout = __runInitializers(this, _politeness_extraInitializers);
|
|
140
|
-
this._language = new SbbLanguageController(this);
|
|
141
|
-
this._darkModeController = new SbbDarkModeController(this, () => {
|
|
142
|
-
this._syncSlottedElements();
|
|
143
|
-
this.requestUpdate();
|
|
144
|
-
});
|
|
145
|
-
this.addEventListener?.("click", (e) => this._onClick(e));
|
|
146
|
-
}
|
|
147
|
-
connectedCallback() {
|
|
148
|
-
this.popover = "manual";
|
|
149
|
-
super.connectedCallback();
|
|
150
|
-
toastRefs.add(this);
|
|
151
|
-
}
|
|
152
|
-
disconnectedCallback() {
|
|
153
|
-
super.disconnectedCallback();
|
|
154
|
-
clearTimeout(this._closeTimeout);
|
|
155
|
-
toastRefs.delete(this);
|
|
156
|
-
}
|
|
157
|
-
willUpdate(changedProperties) {
|
|
158
|
-
super.willUpdate(changedProperties);
|
|
159
|
-
if (changedProperties.has("politeness")) this.internals.ariaLive = this.politeness;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Open the toast.
|
|
163
|
-
* If there are other opened toasts in the page, close them first.
|
|
164
|
-
*/
|
|
165
|
-
open() {
|
|
166
|
-
if (this.state === "opened" || this.state === "opening" || !this.dispatchBeforeOpenEvent()) return;
|
|
167
|
-
this._closeOtherToasts();
|
|
168
|
-
this.showPopover?.();
|
|
169
|
-
this.state = "opening";
|
|
170
|
-
if (this._isZeroAnimationDuration()) this._handleOpening();
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Close the toast.
|
|
174
|
-
*/
|
|
175
|
-
close() {
|
|
176
|
-
if (this.state === "closed" || this.state === "closing" || !this.dispatchBeforeCloseEvent()) return;
|
|
177
|
-
clearTimeout(this._closeTimeout);
|
|
178
|
-
this.state = "closing";
|
|
179
|
-
if (this._isZeroAnimationDuration()) this._handleClosing();
|
|
180
|
-
}
|
|
181
|
-
_handleClosing() {
|
|
182
|
-
this.state = "closed";
|
|
183
|
-
this.hidePopover?.();
|
|
184
|
-
this.dispatchCloseEvent();
|
|
185
|
-
}
|
|
186
|
-
_handleOpening() {
|
|
187
|
-
this.state = "opened";
|
|
188
|
-
this.dispatchOpenEvent();
|
|
189
|
-
if (this.timeout) {
|
|
190
|
-
const global = globalThis;
|
|
191
|
-
const setTimeout = global[global.Zone?.__symbol__?.("setTimeout")] ?? global.setTimeout;
|
|
192
|
-
this._closeTimeout = setTimeout(() => this.close(), this.timeout);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
_onClick(event) {
|
|
196
|
-
const closeElement = composedPathHasAttribute(event, "sbb-toast-close", this);
|
|
197
|
-
if (closeElement && !closeElement.hasAttribute("disabled")) this.close();
|
|
198
|
-
}
|
|
199
|
-
_isZeroAnimationDuration() {
|
|
200
|
-
return isZeroAnimationDuration(this, "--sbb-toast-animation-duration");
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Slotted text nodes are not read correctly by screen readers on Chrome.
|
|
204
|
-
* To address the problem, if there is at least a root text node,
|
|
205
|
-
* we wrap the whole content in a <span> tag
|
|
206
|
-
*/
|
|
207
|
-
_onContentSlotChange(event) {
|
|
208
|
-
const slotNodes = event.target.assignedNodes();
|
|
209
|
-
if (slotNodes.some((el) => el.nodeType === Node.TEXT_NODE)) {
|
|
210
|
-
const span = document.createElement("span");
|
|
211
|
-
this.prepend(span);
|
|
212
|
-
span.append(...slotNodes);
|
|
213
|
-
}
|
|
214
|
-
this._syncSlottedElements();
|
|
215
|
-
}
|
|
216
|
-
_syncSlottedElements() {
|
|
217
|
-
this.querySelectorAll("sbb-transparent-button, sbb-transparent-button-link").forEach((btn) => {
|
|
218
|
-
btn.negative = this._isLightMode();
|
|
219
|
-
btn.size = isLean() ? "s" : "m";
|
|
220
|
-
});
|
|
221
|
-
this.querySelectorAll("sbb-link, sbb-link-button, sbb-link-static").forEach((link) => {
|
|
222
|
-
link.negative = this._isLightMode();
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
_onToastAnimationEnd(event) {
|
|
226
|
-
if (event.animationName === "open" && this.state === "opening") this._handleOpening();
|
|
227
|
-
else if (event.animationName === "close" && this.state === "closing") this._handleClosing();
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Since we do not stack toasts, we force the closing on other existing opened ones
|
|
231
|
-
*/
|
|
232
|
-
_closeOtherToasts() {
|
|
233
|
-
toastRefs.forEach((t) => {
|
|
234
|
-
if (t.state === "opened" || t.state === "opening") t.close();
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
_isLightMode() {
|
|
238
|
-
return !this._darkModeController.matches();
|
|
239
|
-
}
|
|
240
|
-
render() {
|
|
241
|
-
return html`
|
|
242
|
-
<div class="sbb-toast__overlay-container">
|
|
243
|
-
<div class="sbb-toast" @animationend=${this._onToastAnimationEnd}>
|
|
244
|
-
<div class="sbb-toast-wrapper">
|
|
245
|
-
${this.renderIconSlot()}
|
|
246
|
-
<div class="sbb-toast__content">
|
|
247
|
-
<slot @slotchange=${this._onContentSlotChange}></slot>
|
|
248
|
-
</div>
|
|
249
|
-
<slot name="action" @slotchange=${this._syncSlottedElements}></slot>
|
|
250
|
-
</div>
|
|
251
|
-
<div class="sbb-toast__close">
|
|
252
|
-
<sbb-divider
|
|
253
|
-
class="sbb-toast__close-divider"
|
|
254
|
-
orientation="vertical"
|
|
255
|
-
?negative=${this._isLightMode()}
|
|
256
|
-
></sbb-divider>
|
|
257
|
-
${!this.readOnly ? html`<sbb-transparent-button
|
|
258
|
-
class="sbb-toast__close-button"
|
|
259
|
-
icon-name="cross-small"
|
|
260
|
-
?negative=${this._isLightMode()}
|
|
261
|
-
size="m"
|
|
262
|
-
aria-label=${i18nCloseAlert[this._language.current]}
|
|
263
|
-
sbb-toast-close
|
|
264
|
-
></sbb-transparent-button>` : nothing}
|
|
265
|
-
</div>
|
|
266
|
-
</div>
|
|
267
|
-
</div>
|
|
268
|
-
`;
|
|
269
|
-
}
|
|
270
|
-
};
|
|
271
|
-
})();
|
|
272
|
-
//#endregion
|
|
273
|
-
export { SbbToastElement as t };
|
|
274
|
-
|
|
275
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LUNncjVaR09yLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90b2FzdC90b2FzdC5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90b2FzdC90b2FzdC5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi10b2FzdC1tYXgtd2lkdGg6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCg0MDApfTtcbiAgLS1zYmItdG9hc3QtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoXG4gICAgLS1zYmItZGlzYWJsZS1hbmltYXRpb24tZHVyYXRpb24sXG4gICAgdmFyKC0tc2JiLWFuaW1hdGlvbi1kdXJhdGlvbi02eClcbiAgKTtcbiAgLS1zYmItdG9hc3QtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTtcbiAgLS1zYmItdG9hc3QtdGV4dC1jb2xvcjogdmFyKC0tc2JiLWNvbG9yLTMtaW52ZXJ0ZWQpO1xuICAtLXNiYi10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci0xLWludmVydGVkKTtcbiAgLS1zYmItdG9hc3QtbWFyZ2luOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXMpO1xuICAtLXNiYi10b2FzdC1wYWRkaW5nLWJsb2NrOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXh4eHMpO1xuICAtLXNiYi10b2FzdC1wYWRkaW5nLWlubGluZTogdmFyKC0tc2JiLXNwYWNpbmctcmVzcG9uc2l2ZS14cyk7XG4gIC0tc2JiLXRvYXN0LWJvcmRlci1yYWRpdXM6IHZhcigtLXNiYi1ib3JkZXItcmFkaXVzLTR4KTtcbiAgLS1zYmItdG9hc3QtY29udGFpbmVyLWRpc3BsYXk6IG5vbmU7XG4gIC0tc2JiLXRvYXN0LWNvbnRhaW5lci1wb3NpdGlvbjogZml4ZWQ7XG4gIC0tc2JiLXRvYXN0LWhvcml6b250YWwtcG9zaXRpb246IGluaXRpYWw7XG4gIC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uOiBpbml0aWFsO1xuICAtLXNiYi10b2FzdC1nYXA6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbiAgLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvcjogdmFyKC0tc2JiLWZvY3VzLW91dGxpbmUtY29sb3ItZGFyayk7XG5cbiAgZGlzcGxheTogbm9uZTtcbn1cblxuOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpIHtcbiAgLS1zYmItdG9hc3QtY29udGFpbmVyLWRpc3BsYXk6IGZsZXg7XG5cbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbjpob3N0KFtwb3NpdGlvbj0nYm90dG9tLWxlZnQnXSksXG46aG9zdChbcG9zaXRpb249J2JvdHRvbS1zdGFydCddKSB7XG4gIC0tc2JiLXRvYXN0LWhvcml6b250YWwtcG9zaXRpb246IGZsZXgtc3RhcnQ7XG4gIC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uOiBmbGV4LWVuZDtcbn1cblxuOmhvc3QoW3Bvc2l0aW9uPSdib3R0b20tY2VudGVyJ10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogY2VudGVyO1xuICAtLXNiYi10b2FzdC12ZXJ0aWNhbC1wb3NpdGlvbjogZmxleC1lbmQ7XG59XG5cbjpob3N0KFtwb3NpdGlvbj0nYm90dG9tLXJpZ2h0J10pLFxuOmhvc3QoW3Bvc2l0aW9uPSdib3R0b20tZW5kJ10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogZmxleC1lbmQ7XG4gIC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uOiBmbGV4LWVuZDtcbn1cblxuOmhvc3QoW3Bvc2l0aW9uPSd0b3AtbGVmdCddKSxcbjpob3N0KFtwb3NpdGlvbj0ndG9wLXN0YXJ0J10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogZmxleC1zdGFydDtcbiAgLS1zYmItdG9hc3QtdmVydGljYWwtcG9zaXRpb246IGZsZXgtc3RhcnQ7XG59XG5cbjpob3N0KFtwb3NpdGlvbj0ndG9wLWNlbnRlciddKSB7XG4gIC0tc2JiLXRvYXN0LWhvcml6b250YWwtcG9zaXRpb246IGNlbnRlcjtcbiAgLS1zYmItdG9hc3QtdmVydGljYWwtcG9zaXRpb246IGZsZXgtc3RhcnQ7XG59XG5cbjpob3N0KFtwb3NpdGlvbj0ndG9wLXJpZ2h0J10pLFxuOmhvc3QoW3Bvc2l0aW9uPSd0b3AtZW5kJ10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogZmxleC1lbmQ7XG4gIC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uOiBmbGV4LXN0YXJ0O1xufVxuXG46aG9zdCg6c3RhdGUoZGFyaykpIHtcbiAgLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvcjogdmFyKC0tc2JiLWZvY3VzLW91dGxpbmUtY29sb3ItZGVmYXVsdCk7XG59XG5cbi5zYmItdG9hc3RfX292ZXJsYXktY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHZhcigtLXNiYi10b2FzdC1jb250YWluZXItcG9zaXRpb24pO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgaW5zZXQ6IDA7XG4gIGRpc3BsYXk6IHZhcigtLXNiYi10b2FzdC1jb250YWluZXItZGlzcGxheSk7XG4gIGp1c3RpZnktY29udGVudDogdmFyKC0tc2JiLXRvYXN0LWhvcml6b250YWwtcG9zaXRpb24pO1xuICBhbGlnbi1pdGVtczogdmFyKC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uKTtcbn1cblxuLnNiYi10b2FzdCB7XG4gIHotaW5kZXg6IHZhcigtLXNiYi10b2FzdC16LWluZGV4LCB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpKTtcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gIG1hcmdpbjogdmFyKC0tc2JiLXRvYXN0LW1hcmdpbik7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXNiYi10b2FzdC1ib3JkZXItcmFkaXVzKTtcbiAgbWF4LXdpZHRoOiB2YXIoLS1zYmItdG9hc3QtbWF4LXdpZHRoKTtcbiAgZGlzcGxheTogZmxleDtcbiAgY29sb3I6IHZhcigtLXNiYi10b2FzdC10ZXh0LWNvbG9yKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLXRvYXN0LWJhY2tncm91bmQtY29sb3IpO1xuXG4gIDpob3N0KDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSkgJiB7XG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICBuYW1lOiBvcGVuO1xuICAgICAgZHVyYXRpb246IHZhcigtLXNiYi10b2FzdC1hbmltYXRpb24tZHVyYXRpb24pO1xuICAgICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItdG9hc3QtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbik7XG4gICAgfVxuICB9XG5cbiAgOmhvc3QoOnN0YXRlKHN0YXRlLWNsb3NpbmcpKSAmIHtcbiAgICBhbmltYXRpb246IHtcbiAgICAgIG5hbWU6IGNsb3NlO1xuICAgICAgZHVyYXRpb246IHZhcigtLXNiYi10b2FzdC1hbmltYXRpb24tZHVyYXRpb24pO1xuICAgICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItdG9hc3QtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbik7XG4gICAgfVxuICB9XG59XG5cbi5zYmItdG9hc3Qtd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogdmFyKC0tc2JiLXRvYXN0LWdhcCk7XG4gIHBhZGRpbmctYmxvY2s6IHZhcigtLXNiYi10b2FzdC1wYWRkaW5nLWJsb2NrKTtcbiAgcGFkZGluZy1pbmxpbmU6IHZhcigtLXNiYi10b2FzdC1wYWRkaW5nLWlubGluZSk7XG59XG5cbnNsb3Q6bm90KFtuYW1lPSdpY29uJ10pLFxuLnNiYi10b2FzdF9fY2xvc2Uge1xuICAvLyBBcyB0aGUgc2xvdHRlZCBjb250ZW50IGlzIGRpc3BsYXllZCBvbiBhIHdoaXRlIGJhY2tncm91bmQsIHdlIG5lZWQgdG8gZm9yY2UgbGlnaHQgbW9kZSBmb3IgdGhlbS5cbiAgY29sb3Itc2NoZW1lOiBvbmx5IGxpZ2h0O1xufVxuXG4uc2JiLXRvYXN0X19jb250ZW50IHtcbiAgQGluY2x1ZGUgc2JiLnRpdGxlLTYoJGV4Y2x1ZGUtc3BhY2luZzogdHJ1ZSk7XG5cbiAgZmxleDogMSAxIDA7XG59XG5cbi5zYmItdG9hc3RfX2Nsb3NlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNiYi10b2FzdF9fY2xvc2UtZGl2aWRlciB7XG4gIHBhZGRpbmctYmxvY2s6IHZhcigtLXNiYi10b2FzdC1wYWRkaW5nLWJsb2NrKTtcbn1cblxuLnNiYi10b2FzdF9fY2xvc2UtYnV0dG9uIHtcbiAgbWFyZ2luLWlubGluZTogdmFyKC0tc2JiLXNwYWNpbmctcmVzcG9uc2l2ZS14eHhzKTtcbn1cblxuQGtleWZyYW1lcyBvcGVuIHtcbiAgZnJvbSB7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNsYXRlOiAwIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbiAgfVxuXG4gIHRvIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNsYXRlOiAwO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgY2xvc2Uge1xuICBmcm9tIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNsYXRlOiAwO1xuICB9XG5cbiAgdG8ge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zbGF0ZTogMCB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGh0bWwsXG4gIG5vdGhpbmcsXG4gIHVuc2FmZUNTUyxcbiAgdHlwZSBDU1NSZXN1bHRHcm91cCxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQge1xuICBTYmJUcmFuc3BhcmVudEJ1dHRvbkVsZW1lbnQsXG4gIHR5cGUgU2JiVHJhbnNwYXJlbnRCdXR0b25MaW5rRWxlbWVudCxcbn0gZnJvbSAnLi4vYnV0dG9uLnB1cmUudHMnO1xuaW1wb3J0IHsgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9jb3JlL2Jhc2UtZWxlbWVudHMudHMnO1xuaW1wb3J0IHsgU2JiRGFya01vZGVDb250cm9sbGVyLCBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb3JlL2NvbnRyb2xsZXJzLnRzJztcbmltcG9ydCB7IGZvcmNlVHlwZSB9IGZyb20gJy4uL2NvcmUvZGVjb3JhdG9ycy50cyc7XG5pbXBvcnQgeyBpc0xlYW4sIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uIH0gZnJvbSAnLi4vY29yZS9kb20udHMnO1xuaW1wb3J0IHsgY29tcG9zZWRQYXRoSGFzQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9ldmVudGluZy50cyc7XG5pbXBvcnQgeyBpMThuQ2xvc2VBbGVydCB9IGZyb20gJy4uL2NvcmUvaTE4bi50cyc7XG5pbXBvcnQgeyBTYmJSZWFkb25seU1peGluIH0gZnJvbSAnLi4vY29yZS9taXhpbnMudHMnO1xuaW1wb3J0IHsgYm94U2l6aW5nU3R5bGVzIH0gZnJvbSAnLi4vY29yZS9zdHlsZXMudHMnO1xuaW1wb3J0IHsgU2JiSWNvbk5hbWVNaXhpbiB9IGZyb20gJy4uL2ljb24udHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJMaW5rQnV0dG9uRWxlbWVudCwgU2JiTGlua0VsZW1lbnQsIFNiYkxpbmtTdGF0aWNFbGVtZW50IH0gZnJvbSAnLi4vbGluay50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3RvYXN0LnNjc3M/aW5saW5lJztcblxuaW1wb3J0ICcuLi9kaXZpZGVyLnRzJztcblxuLy8gVE9ETyhicmVha2luZy1jaGFuZ2UpOiBSZW1vdmUgY2FsbCB0byBkZWZpbmUuXG5TYmJUcmFuc3BhcmVudEJ1dHRvbkVsZW1lbnQuZGVmaW5lKCk7XG5cbnR5cGUgU2JiVG9hc3RQb3NpdGlvblZlcnRpY2FsID0gJ3RvcCcgfCAnYm90dG9tJztcbnR5cGUgU2JiVG9hc3RQb3NpdGlvbkhvcml6b250YWwgPSAnbGVmdCcgfCAnc3RhcnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnIHwgJ2VuZCc7XG5leHBvcnQgdHlwZSBTYmJUb2FzdFBvc2l0aW9uID0gYCR7U2JiVG9hc3RQb3NpdGlvblZlcnRpY2FsfS0ke1NiYlRvYXN0UG9zaXRpb25Ib3Jpem9udGFsfWA7XG5cbi8vIEEgZ2xvYmFsIGNvbGxlY3Rpb24gb2YgZXhpc3RpbmcgdG9hc3RzXG5jb25zdCB0b2FzdFJlZnMgPSBuZXcgU2V0PFNiYlRvYXN0RWxlbWVudD4oKTtcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIHRvYXN0IG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIGFkZCBjb250ZW50IHRvIHRoZSBgc2JiLXRvYXN0YC5cbiAqIEBzbG90IGljb24gLSBBc3NpZ24gYSBjdXN0b20gaWNvbiB2aWEgc2xvdC5cbiAqIEBzbG90IGFjdGlvbiAtIFByb3ZpZGUgYSBjdXN0b20gYWN0aW9uIGZvciB0aGlzIHRvYXN0LlxuICogQGNzc3Byb3AgWy0tc2JiLXRvYXN0LXotaW5kZXg9dmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KV0gLSBUbyBzcGVjaWZ5IGEgY3VzdG9tIHN0YWNrIG9yZGVyLFxuICogdGhlIGB6LWluZGV4YCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyB0aGlzIENTUyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgYHotaW5kZXhgIG9mIHRoZVxuICogY29tcG9uZW50IGlzIHNldCB0byBgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KWAgd2l0aCBhIHZhbHVlIG9mIGAxMDAwYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNiYlRvYXN0RWxlbWVudCBleHRlbmRzIFNiYkljb25OYW1lTWl4aW4oU2JiUmVhZG9ubHlNaXhpbihTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCkpIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi10b2FzdCc7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtib3hTaXppbmdTdHlsZXMsIHVuc2FmZUNTUyhzdHlsZSldO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGF1dG9tYXRpY2FsbHkgZGlzbWlzc2luZyB0aGUgdG9hc3QuXG4gICAqIElmIDAgKGRlZmF1bHQpLCBpdCBzdGF5cyBvcGVuIGluZGVmaW5pdGVseS5cbiAgICogRnJvbSBhY2Nlc3NpYmlsaXR5IHBlcnNwZWN0aXZlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBzZXQgYSB0aW1lb3V0IG9mIGF0IGxlYXN0IDIwIHNlY29uZHMuXG4gICAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciB0aW1lb3V0OiBudW1iZXIgPSAwO1xuXG4gIC8qKiBUaGUgcG9zaXRpb24gd2hlcmUgdG8gcGxhY2UgdGhlIHRvYXN0LiAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBwb3NpdGlvbjogU2JiVG9hc3RQb3NpdGlvbiA9ICdib3R0b20tY2VudGVyJztcblxuICAvKipcbiAgICogVGhlIEFSSUEgcG9saXRlbmVzcyBsZXZlbC5cbiAgICogQ2hlY2sgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQWNjZXNzaWJpbGl0eS9BUklBL0FSSUFfTGl2ZV9SZWdpb25zI2xpdmVfcmVnaW9ucyBmb3IgZnVydGhlciBpbmZvXG4gICAqL1xuICBAcHJvcGVydHkoKSBwdWJsaWMgYWNjZXNzb3IgcG9saXRlbmVzczogJ3BvbGl0ZScgfCAnYXNzZXJ0aXZlJyB8ICdvZmYnID0gJ3BvbGl0ZSc7XG5cbiAgcHJpdmF0ZSBfY2xvc2VUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfZGFya01vZGVDb250cm9sbGVyID0gbmV3IFNiYkRhcmtNb2RlQ29udHJvbGxlcih0aGlzLCAoKSA9PiB7XG4gICAgdGhpcy5fc3luY1Nsb3R0ZWRFbGVtZW50cygpO1xuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICB9KTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LignY2xpY2snLCAoZSkgPT4gdGhpcy5fb25DbGljayhlKSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5wb3BvdmVyID0gJ21hbnVhbCc7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIC8vIEFkZCB0aGlzIHRvYXN0IHRvIHRoZSBnbG9iYWwgY29sbGVjdGlvblxuICAgIHRvYXN0UmVmcy5hZGQodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VUaW1lb3V0KTtcblxuICAgIC8vIFJlbW92ZSB0aGlzIGluc3RhbmNlXG4gICAgdG9hc3RSZWZzLmRlbGV0ZSh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncG9saXRlbmVzcycpKSB7XG4gICAgICB0aGlzLmludGVybmFscy5hcmlhTGl2ZSA9IHRoaXMucG9saXRlbmVzcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgdG9hc3QuXG4gICAqIElmIHRoZXJlIGFyZSBvdGhlciBvcGVuZWQgdG9hc3RzIGluIHRoZSBwYWdlLCBjbG9zZSB0aGVtIGZpcnN0LlxuICAgKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJyB8fCAhdGhpcy5kaXNwYXRjaEJlZm9yZU9wZW5FdmVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2xvc2VPdGhlclRvYXN0cygpO1xuICAgIHRoaXMuc2hvd1BvcG92ZXI/LigpO1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmluZyc7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgdG9hc3QuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJyB8fCAhdGhpcy5kaXNwYXRjaEJlZm9yZUNsb3NlRXZlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVvdXQpO1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2luZyc7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgY2xvc2VkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlQ2xvc2luZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNsb3NpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMuaGlkZVBvcG92ZXI/LigpO1xuICAgIHRoaXMuZGlzcGF0Y2hDbG9zZUV2ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmVkJztcbiAgICB0aGlzLmRpc3BhdGNoT3BlbkV2ZW50KCk7XG5cbiAgICAvLyBTdGFydCB0aGUgY291bnRkb3duIHRvIGNsb3NlIGl0XG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL3NiYi1kZXNpZ24tc3lzdGVtcy9seW5lLWFuZ3VsYXIvaXNzdWVzLzE5MFxuICAgICAgLy8gSWYgem9uZS5qcyBpcyBsb2FkZWQsIHNldFRpbWVvdXQgaXMgd3JhcHBlZCBhbmQgdHJhY2tlZCB3aGljaCB3aWxsIG1hcmtcbiAgICAgIC8vIGFueXRoaW5nIGluIEFuZ3VsYXIgYXMgdW5zdGFibGUgYXMgbG9uZyBhcyBzZXRUaW1lb3V0IGlzIG5vdCBmaW5pc2hlZC5cbiAgICAgIC8vIFRoaXMgb25seSBuZWVkcyB0byBiZSBmaXhlZCBpbiBwbGFjZXMgd2hlcmUgd2UgYWN0dWFsbHkgd2FudCB0byB3YWl0IGFcbiAgICAgIC8vIHNwZWNpZmljIGFtb3VudCBvZiB0aW1lIHdpdGhvdXQgYW4gaW50ZXJhY3Rpb24gKGUuZy4gZm9yIHRoaXMgY2FzZSkuXG4gICAgICBjb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIGFzIGFueTtcbiAgICAgIGNvbnN0IHNldFRpbWVvdXQ6IHR5cGVvZiBnbG9iYWxUaGlzLnNldFRpbWVvdXQgPVxuICAgICAgICBnbG9iYWxbZ2xvYmFsLlpvbmU/Ll9fc3ltYm9sX18/Lignc2V0VGltZW91dCcpIGFzIHN0cmluZ10gPz8gZ2xvYmFsLnNldFRpbWVvdXQ7XG5cbiAgICAgIHRoaXMuX2Nsb3NlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbG9zZSgpLCB0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsb3NlIHRoZSB0b2FzdCBvbiBjbGljayBvZiBhbnkgZWxlbWVudCB0aGF0IGhhcyB0aGUgJ3NiYi10b2FzdC1jbG9zZScgYXR0cmlidXRlLlxuICBwcml2YXRlIF9vbkNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNsb3NlRWxlbWVudCA9IGNvbXBvc2VkUGF0aEhhc0F0dHJpYnV0ZShldmVudCwgJ3NiYi10b2FzdC1jbG9zZScsIHRoaXMpO1xuXG4gICAgaWYgKGNsb3NlRWxlbWVudCAmJiAhY2xvc2VFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1plcm9BbmltYXRpb25EdXJhdGlvbih0aGlzLCAnLS1zYmItdG9hc3QtYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogU2xvdHRlZCB0ZXh0IG5vZGVzIGFyZSBub3QgcmVhZCBjb3JyZWN0bHkgYnkgc2NyZWVuIHJlYWRlcnMgb24gQ2hyb21lLlxuICAgKiBUbyBhZGRyZXNzIHRoZSBwcm9ibGVtLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBhIHJvb3QgdGV4dCBub2RlLFxuICAgKiB3ZSB3cmFwIHRoZSB3aG9sZSBjb250ZW50IGluIGEgPHNwYW4+IHRhZ1xuICAgKi9cbiAgcHJpdmF0ZSBfb25Db250ZW50U2xvdENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzbG90Tm9kZXMgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpO1xuXG4gICAgaWYgKHNsb3ROb2Rlcy5zb21lKChlbCkgPT4gZWwubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSkge1xuICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgIHRoaXMucHJlcGVuZChzcGFuKTtcbiAgICAgIHNwYW4uYXBwZW5kKC4uLnNsb3ROb2Rlcyk7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNTbG90dGVkRWxlbWVudHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNTbG90dGVkRWxlbWVudHMoKTogdm9pZCB7XG4gICAgLy8gRm9yY2UgdGhlIHZpc3VhbCBzdGF0ZSBvbiBzbG90dGVkIGJ1dHRvbnNcbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8U2JiVHJhbnNwYXJlbnRCdXR0b25FbGVtZW50IHwgU2JiVHJhbnNwYXJlbnRCdXR0b25MaW5rRWxlbWVudD4oXG4gICAgICAnc2JiLXRyYW5zcGFyZW50LWJ1dHRvbiwgc2JiLXRyYW5zcGFyZW50LWJ1dHRvbi1saW5rJyxcbiAgICApLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgYnRuLm5lZ2F0aXZlID0gdGhpcy5faXNMaWdodE1vZGUoKTtcbiAgICAgIGJ0bi5zaXplID0gaXNMZWFuKCkgPyAncycgOiAnbSc7XG4gICAgfSk7XG5cbiAgICAvLyBGb3JjZSBuZWdhdGl2ZSBvbiBzbG90dGVkIGxpbmtzXG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPFNiYkxpbmtFbGVtZW50IHwgU2JiTGlua0J1dHRvbkVsZW1lbnQgfCBTYmJMaW5rU3RhdGljRWxlbWVudD4oXG4gICAgICAnc2JiLWxpbmssIHNiYi1saW5rLWJ1dHRvbiwgc2JiLWxpbmstc3RhdGljJyxcbiAgICApLmZvckVhY2goKGxpbmspID0+IHtcbiAgICAgIGxpbmsubmVnYXRpdmUgPSB0aGlzLl9pc0xpZ2h0TW9kZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSW4gcmFyZSBjYXNlcyBpdCBjYW4gYmUgdGhhdCB0aGUgYW5pbWF0aW9uRW5kIGV2ZW50IGlzIHRyaWdnZXJlZCB0d2ljZS5cbiAgLy8gVG8gYXZvaWQgZW50ZXJpbmcgYSBjb3JydXB0IHN0YXRlLCBleGl0IHdoZW4gc3RhdGUgaXMgbm90IGV4cGVjdGVkLlxuICBwcml2YXRlIF9vblRvYXN0QW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIC8vIE9uIHRvYXN0IG9wZW5lZFxuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnb3BlbicgJiYgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnY2xvc2UnICYmIHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlQ2xvc2luZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5jZSB3ZSBkbyBub3Qgc3RhY2sgdG9hc3RzLCB3ZSBmb3JjZSB0aGUgY2xvc2luZyBvbiBvdGhlciBleGlzdGluZyBvcGVuZWQgb25lc1xuICAgKi9cbiAgcHJpdmF0ZSBfY2xvc2VPdGhlclRvYXN0cygpOiB2b2lkIHtcbiAgICB0b2FzdFJlZnMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgaWYgKHQuc3RhdGUgPT09ICdvcGVuZWQnIHx8IHQuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgICB0LmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pc0xpZ2h0TW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX2RhcmtNb2RlQ29udHJvbGxlci5tYXRjaGVzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItdG9hc3RfX292ZXJsYXktY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdG9hc3RcIiBAYW5pbWF0aW9uZW5kPSR7dGhpcy5fb25Ub2FzdEFuaW1hdGlvbkVuZH0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10b2FzdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAke3RoaXMucmVuZGVySWNvblNsb3QoKX1cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdG9hc3RfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPHNsb3QgQHNsb3RjaGFuZ2U9JHt0aGlzLl9vbkNvbnRlbnRTbG90Q2hhbmdlfT48L3Nsb3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25cIiBAc2xvdGNoYW5nZT0ke3RoaXMuX3N5bmNTbG90dGVkRWxlbWVudHN9Pjwvc2xvdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXRvYXN0X19jbG9zZVwiPlxuICAgICAgICAgICAgPHNiYi1kaXZpZGVyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2JiLXRvYXN0X19jbG9zZS1kaXZpZGVyXCJcbiAgICAgICAgICAgICAgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXG4gICAgICAgICAgICAgID9uZWdhdGl2ZT0ke3RoaXMuX2lzTGlnaHRNb2RlKCl9XG4gICAgICAgICAgICA+PC9zYmItZGl2aWRlcj5cbiAgICAgICAgICAgICR7IXRoaXMucmVhZE9ubHlcbiAgICAgICAgICAgICAgPyBodG1sYDxzYmItdHJhbnNwYXJlbnQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi10b2FzdF9fY2xvc2UtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGljb24tbmFtZT1cImNyb3NzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICAgID9uZWdhdGl2ZT0ke3RoaXMuX2lzTGlnaHRNb2RlKCl9XG4gICAgICAgICAgICAgICAgICBzaXplPVwibVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSR7aTE4bkNsb3NlQWxlcnRbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19XG4gICAgICAgICAgICAgICAgICBzYmItdG9hc3QtY2xvc2VcbiAgICAgICAgICAgICAgICA+PC9zYmItdHJhbnNwYXJlbnQtYnV0dG9uPmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi10b2FzdCc6IFNiYlRvYXN0RWxlbWVudDtcbiAgfVxufVxuIl0sIm1h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
|