@sbb-esta/lyne-elements-dev 4.9.0-dev.1774376412 → 4.9.0-dev.1774507634

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.
@@ -194,6 +194,9 @@ $theme: 'standard' !default;
194
194
  @use '../../signet/signet.global' as signet with (
195
195
  $theme: $theme
196
196
  );
197
+ @use '../../slider/slider.global' as slider with (
198
+ $theme: $theme
199
+ );
197
200
  @use '../../status/status.global' as status with (
198
201
  $theme: $theme
199
202
  );
@@ -273,6 +276,7 @@ $theme: 'standard' !default;
273
276
  @include selection-action-panel.base;
274
277
  @include selection-expansion-panel.base;
275
278
  @include signet.base;
279
+ @include slider.base;
276
280
  @include status.base;
277
281
  @include tab-group-common.base;
278
282
  @include tab-label-common.base;
@@ -292,6 +296,7 @@ $theme: 'standard' !default;
292
296
  @include visual-checkbox.base-forced-colors;
293
297
  @include radio-button-common.base-forced-colors;
294
298
  @include signet.base-forced-colors;
299
+ @include slider.base-forced-colors;
295
300
  }
296
301
 
297
302
  // Train formation
package/core.css CHANGED
@@ -1632,6 +1632,27 @@ slot[name=error]::slotted(*) {
1632
1632
  --sbb-signet-panel-color: var(--sbb-color-brand);
1633
1633
  --sbb-signet-icon-color: var(--sbb-color-white);
1634
1634
  --sbb-signet-aspect-ratio: 2 / 1;
1635
+ --sbb-slider-line-height: 0.25rem;
1636
+ --sbb-slider-knob-size: 1.75rem;
1637
+ --sbb-slider-knob-size-active: 1.9375rem;
1638
+ --sbb-slider-knob-border-size: 0.1875rem;
1639
+ --sbb-slider-knob-border-style: solid;
1640
+ --sbb-slider-knob-color: var(--sbb-background-color-1);
1641
+ --sbb-slider-knob-border-color: var(--sbb-color-primary);
1642
+ --sbb-slider-icon-color: var(--sbb-color-1);
1643
+ --sbb-slider-selected-line-disabled-color: var(--sbb-color-smoke);
1644
+ --sbb-slider-selected-line-disabled-color: light-dark(
1645
+ var(--sbb-color-smoke),
1646
+ var(--sbb-color-cement)
1647
+ );
1648
+ --sbb-slider-line-color: var(--sbb-border-color-5);
1649
+ --sbb-slider-selected-line-color: var(--sbb-color-primary);
1650
+ --sbb-slider-line-disabled-color: var(--sbb-color-graphite);
1651
+ --sbb-slider-line-disabled-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-granite));
1652
+ --sbb-slider-width: 25rem;
1653
+ --sbb-slider-min-width: 9.375rem;
1654
+ --sbb-slider-gap: var(--sbb-spacing-fixed-2x);
1655
+ --sbb-slider-padding-block: 0.125rem;
1635
1656
  --sbb-status-color: var(--sbb-color-4);
1636
1657
  --sbb-status-gap: var(--sbb-spacing-fixed-1x);
1637
1658
  --sbb-status-font-size: var(--sbb-text-font-size-s);
@@ -1709,6 +1730,8 @@ slot[name=error]::slotted(*) {
1709
1730
  --sbb-signet-background-color: ButtonText !important;
1710
1731
  --sbb-signet-panel-color: ButtonText !important;
1711
1732
  --sbb-signet-icon-color: Canvas !important;
1733
+ --sbb-slider-selected-line-color: Highlight;
1734
+ --sbb-slider-line-color: CanvasText;
1712
1735
  }
1713
1736
  }
1714
1737
  :root {
@@ -1,2 +1,2 @@
1
- import { t as SbbSliderElement } from "../slider.component-w_WtVNx-.js";
1
+ import { t as SbbSliderElement } from "../slider.component-QzF7A8Yl.js";
2
2
  export { SbbSliderElement };
@@ -0,0 +1,456 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { css, html, nothing } from "lit";
3
+ import { property } from "lit/decorators.js";
4
+ import { SbbElement } from "./core/base-elements.js";
5
+ import { forceType, hostAttributes } from "./core/decorators.js";
6
+ import { SbbDisabledMixin, SbbFormAssociatedMixin, SbbReadonlyMixin } from "./core/mixins.js";
7
+ import { boxSizingStyles } from "./core/styles.js";
8
+ import "./icon.js";
9
+ import { ref } from "lit/directives/ref.js";
10
+ //#region src/elements/slider/slider.scss?lit&inline
11
+ var slider_default = css`@charset "UTF-8";
12
+ :host {
13
+ --_sbb-slider-value-fraction: 0;
14
+ outline: none !important;
15
+ display: inline-block;
16
+ min-width: var(--sbb-slider-min-width);
17
+ width: min(var(--sbb-slider-width), 100%);
18
+ }
19
+
20
+ :host(:disabled) {
21
+ --sbb-slider-icon-color: var(--sbb-color-graphite);
22
+ --sbb-slider-icon-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-smoke));
23
+ --sbb-slider-knob-border-color: var(--sbb-border-color-5);
24
+ --sbb-slider-knob-border-size: var(--sbb-border-width-2x);
25
+ --sbb-slider-knob-border-style: dashed;
26
+ }
27
+
28
+ :host([readonly]) {
29
+ --sbb-slider-icon-color: var(--sbb-color-5);
30
+ --sbb-slider-knob-border-color: var(--sbb-slider-selected-line-disabled-color);
31
+ }
32
+
33
+ :host(:disabled),
34
+ :host([readonly]) {
35
+ --sbb-slider-line-color: var(--sbb-slider-line-disabled-color);
36
+ --sbb-slider-selected-line-color: var(--sbb-slider-selected-line-disabled-color);
37
+ }
38
+ @media (forced-colors: active) {
39
+ :host(:disabled),
40
+ :host([readonly]) {
41
+ --sbb-slider-icon-color: GrayText;
42
+ --sbb-slider-selected-line-disabled-color: GrayText;
43
+ --sbb-slider-line-disabled-color: GrayText;
44
+ }
45
+ }
46
+
47
+ .sbb-slider__height-container {
48
+ display: flex;
49
+ flex-direction: column;
50
+ }
51
+ .sbb-slider__height-container::before {
52
+ content: "​";
53
+ user-select: none;
54
+ width: 0;
55
+ height: 0;
56
+ }
57
+
58
+ .sbb-slider__wrapper {
59
+ display: flex;
60
+ gap: var(--sbb-slider-gap);
61
+ padding-block: var(--sbb-slider-padding-block);
62
+ color: var(--sbb-slider-icon-color);
63
+ }
64
+
65
+ .sbb-slider__container {
66
+ position: relative;
67
+ min-height: var(--sbb-size-icon-ui-small);
68
+ flex-grow: 1;
69
+ }
70
+
71
+ .sbb-slider__range-input {
72
+ position: absolute;
73
+ width: 100%;
74
+ inset: 0;
75
+ opacity: 0;
76
+ margin: 0;
77
+ }
78
+
79
+ .sbb-slider__line {
80
+ position: absolute;
81
+ top: 50%;
82
+ transform: translateY(-50%);
83
+ height: var(--sbb-slider-line-height);
84
+ width: 100%;
85
+ background-color: var(--sbb-slider-line-color);
86
+ border-radius: var(--sbb-slider-line-height);
87
+ overflow: hidden;
88
+ pointer-events: none;
89
+ }
90
+
91
+ .sbb-slider__selected-line {
92
+ position: relative;
93
+ height: 100%;
94
+ background-color: var(--sbb-slider-selected-line-color);
95
+ width: calc(var(--_sbb-slider-value-fraction) * 100%);
96
+ }
97
+
98
+ .sbb-slider__knob {
99
+ position: absolute;
100
+ top: 50%;
101
+ transform: translateY(-50%);
102
+ box-shadow: var(--sbb-box-shadow-level-5-hard);
103
+ width: var(--sbb-slider-knob-size);
104
+ height: var(--sbb-slider-knob-size);
105
+ inset-inline-start: calc(var(--_sbb-slider-value-fraction) * 100% - var(--sbb-slider-knob-size) * var(--_sbb-slider-value-fraction));
106
+ transition-property: width, height;
107
+ transition-duration: var(--sbb-disable-animation-duration, var(--sbb-animation-duration-1x));
108
+ transition-timing-function: ease-in;
109
+ background-color: var(--sbb-slider-knob-color);
110
+ border: var(--sbb-slider-knob-border-size) var(--sbb-slider-knob-border-style) var(--sbb-slider-knob-border-color);
111
+ border-radius: 50%;
112
+ pointer-events: none;
113
+ }
114
+ :host(:focus-visible) .sbb-slider__knob {
115
+ outline-offset: var(--sbb-focus-outline-offset);
116
+ outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);
117
+ --sbb-slider-knob-size: var(--sbb-slider-knob-size-active);
118
+ }
119
+ :host(:not(:is(:disabled, [readonly]))) .sbb-slider__range-input:active ~ .sbb-slider__knob {
120
+ --sbb-slider-knob-size: var(--sbb-slider-knob-size-active);
121
+ }`;
122
+ //#endregion
123
+ //#region src/elements/slider/slider.component.ts
124
+ /**
125
+ * It displays an input knob that can be moved in a range.
126
+ *
127
+ * @slot prefix - Use this slot to render an icon on the left side of the input.
128
+ * @slot suffix - Use this slot to render an icon on the right side of the input.
129
+ * @event {InputEvent} input - The input event fires when the value has been changed as a direct result of a user action.
130
+ */
131
+ var SbbSliderElement = (() => {
132
+ let _classDecorators = [hostAttributes({ tabindex: "0" })];
133
+ let _classDescriptor;
134
+ let _classExtraInitializers = [];
135
+ let _classThis;
136
+ let _classSuper = SbbDisabledMixin(SbbReadonlyMixin(SbbFormAssociatedMixin(SbbElement)));
137
+ let _instanceExtraInitializers = [];
138
+ let _set_value_decorators;
139
+ let _set_valueAsNumber_decorators;
140
+ let _set_min_decorators;
141
+ let _set_max_decorators;
142
+ let _startIcon_decorators;
143
+ let _startIcon_initializers = [];
144
+ let _startIcon_extraInitializers = [];
145
+ let _endIcon_decorators;
146
+ let _endIcon_initializers = [];
147
+ let _endIcon_extraInitializers = [];
148
+ var SbbSliderElement = class extends _classSuper {
149
+ static {
150
+ _classThis = this;
151
+ }
152
+ static {
153
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
154
+ _set_value_decorators = [property()];
155
+ _set_valueAsNumber_decorators = [property({
156
+ attribute: "value-as-number",
157
+ type: Number
158
+ })];
159
+ _set_min_decorators = [property()];
160
+ _set_max_decorators = [property()];
161
+ _startIcon_decorators = [forceType(), property({ attribute: "start-icon" })];
162
+ _endIcon_decorators = [forceType(), property({ attribute: "end-icon" })];
163
+ __esDecorate(this, null, _set_value_decorators, {
164
+ kind: "setter",
165
+ name: "value",
166
+ static: false,
167
+ private: false,
168
+ access: {
169
+ has: (obj) => "value" in obj,
170
+ set: (obj, value) => {
171
+ obj.value = value;
172
+ }
173
+ },
174
+ metadata: _metadata
175
+ }, null, _instanceExtraInitializers);
176
+ __esDecorate(this, null, _set_valueAsNumber_decorators, {
177
+ kind: "setter",
178
+ name: "valueAsNumber",
179
+ static: false,
180
+ private: false,
181
+ access: {
182
+ has: (obj) => "valueAsNumber" in obj,
183
+ set: (obj, value) => {
184
+ obj.valueAsNumber = value;
185
+ }
186
+ },
187
+ metadata: _metadata
188
+ }, null, _instanceExtraInitializers);
189
+ __esDecorate(this, null, _set_min_decorators, {
190
+ kind: "setter",
191
+ name: "min",
192
+ static: false,
193
+ private: false,
194
+ access: {
195
+ has: (obj) => "min" in obj,
196
+ set: (obj, value) => {
197
+ obj.min = value;
198
+ }
199
+ },
200
+ metadata: _metadata
201
+ }, null, _instanceExtraInitializers);
202
+ __esDecorate(this, null, _set_max_decorators, {
203
+ kind: "setter",
204
+ name: "max",
205
+ static: false,
206
+ private: false,
207
+ access: {
208
+ has: (obj) => "max" in obj,
209
+ set: (obj, value) => {
210
+ obj.max = value;
211
+ }
212
+ },
213
+ metadata: _metadata
214
+ }, null, _instanceExtraInitializers);
215
+ __esDecorate(this, null, _startIcon_decorators, {
216
+ kind: "accessor",
217
+ name: "startIcon",
218
+ static: false,
219
+ private: false,
220
+ access: {
221
+ has: (obj) => "startIcon" in obj,
222
+ get: (obj) => obj.startIcon,
223
+ set: (obj, value) => {
224
+ obj.startIcon = value;
225
+ }
226
+ },
227
+ metadata: _metadata
228
+ }, _startIcon_initializers, _startIcon_extraInitializers);
229
+ __esDecorate(this, null, _endIcon_decorators, {
230
+ kind: "accessor",
231
+ name: "endIcon",
232
+ static: false,
233
+ private: false,
234
+ access: {
235
+ has: (obj) => "endIcon" in obj,
236
+ get: (obj) => obj.endIcon,
237
+ set: (obj, value) => {
238
+ obj.endIcon = value;
239
+ }
240
+ },
241
+ metadata: _metadata
242
+ }, _endIcon_initializers, _endIcon_extraInitializers);
243
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, {
244
+ kind: "class",
245
+ name: _classThis.name,
246
+ metadata: _metadata
247
+ }, null, _classExtraInitializers);
248
+ SbbSliderElement = _classThis = _classDescriptor.value;
249
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, {
250
+ enumerable: true,
251
+ configurable: true,
252
+ writable: true,
253
+ value: _metadata
254
+ });
255
+ }
256
+ static {
257
+ this.elementName = "sbb-slider";
258
+ }
259
+ static {
260
+ this.role = "slider";
261
+ }
262
+ static {
263
+ this.styles = [boxSizingStyles, slider_default];
264
+ }
265
+ static {
266
+ this.events = { didChange: "didChange" };
267
+ }
268
+ /**
269
+ * Value of the form element.
270
+ * If no value is provided, default is the middle point between min and max.
271
+ */
272
+ set value(value) {
273
+ if (this._isValidNumber(value)) this._value = this._boundBetweenMinMax(value);
274
+ else this._value = null;
275
+ this.internals.ariaValueNow = this.value;
276
+ }
277
+ get value() {
278
+ return this._value ?? this._defaultValue();
279
+ }
280
+ /** Numeric value for the inner HTMLInputElement. */
281
+ set valueAsNumber(value) {
282
+ this.value = value?.toString() ?? null;
283
+ }
284
+ get valueAsNumber() {
285
+ return Number(this.value);
286
+ }
287
+ /** Minimum acceptable value for the inner HTMLInputElement. */
288
+ set min(value) {
289
+ if (!this._isValidNumber(value)) return;
290
+ this._min = value;
291
+ this.internals.ariaValueMin = this.min;
292
+ const boundValue = this._boundBetweenMinMax(this.value);
293
+ if (this.value !== boundValue) this.value = boundValue;
294
+ }
295
+ get min() {
296
+ return this._min;
297
+ }
298
+ /** Maximum acceptable value for the inner HTMLInputElement. */
299
+ set max(value) {
300
+ if (!this._isValidNumber(value)) return;
301
+ this._max = value;
302
+ this.internals.ariaValueMax = this.max;
303
+ const boundValue = this._boundBetweenMinMax(this.value);
304
+ if (this.value !== boundValue) this.value = boundValue;
305
+ }
306
+ get max() {
307
+ return this._max;
308
+ }
309
+ #startIcon_accessor_storage;
310
+ /** Name of the icon at component's start, which will be forward to the nested `sbb-icon`. */
311
+ get startIcon() {
312
+ return this.#startIcon_accessor_storage;
313
+ }
314
+ set startIcon(value) {
315
+ this.#startIcon_accessor_storage = value;
316
+ }
317
+ #endIcon_accessor_storage;
318
+ /** Name of the icon at component's end, which will be forward to the nested `sbb-icon`. */
319
+ get endIcon() {
320
+ return this.#endIcon_accessor_storage;
321
+ }
322
+ set endIcon(value) {
323
+ this.#endIcon_accessor_storage = value;
324
+ }
325
+ /**
326
+ * Form type of element.
327
+ * @default 'range'
328
+ */
329
+ get type() {
330
+ return "range";
331
+ }
332
+ constructor() {
333
+ super();
334
+ this._value = (__runInitializers(this, _instanceExtraInitializers), null);
335
+ this._min = "0";
336
+ this._max = "100";
337
+ this.#startIcon_accessor_storage = __runInitializers(this, _startIcon_initializers, "");
338
+ this.#endIcon_accessor_storage = (__runInitializers(this, _startIcon_extraInitializers), __runInitializers(this, _endIcon_initializers, ""));
339
+ /** Reference to the inner HTMLInputElement with type='range'. */
340
+ this._rangeInput = __runInitializers(this, _endIcon_extraInitializers);
341
+ this.addEventListener?.("keydown", (e) => this._handleKeydown(e));
342
+ }
343
+ willUpdate(changedProperties) {
344
+ super.willUpdate(changedProperties);
345
+ if (changedProperties.has("readOnly")) this.internals.ariaReadOnly = Boolean(this.readOnly).toString();
346
+ this.style?.setProperty("--_sbb-slider-value-fraction", this._valueFraction().toString());
347
+ }
348
+ /**
349
+ * The reset value is the attribute value (the setup value). If not present, calculates the default.
350
+ * @internal
351
+ */
352
+ formResetCallback() {
353
+ this.value = this.getAttribute("value") ?? this._defaultValue();
354
+ }
355
+ /**
356
+ * @internal
357
+ */
358
+ formStateRestoreCallback(state, _reason) {
359
+ this.value = state;
360
+ }
361
+ /**
362
+ * If no value is provided, default is the middle point between min and max
363
+ * (see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/range#value)
364
+ */
365
+ _defaultValue() {
366
+ return (+this.min + (+this.max - +this.min) / 2).toString();
367
+ }
368
+ _isValidNumber(value) {
369
+ return !!value && !isNaN(Number(value));
370
+ }
371
+ /**
372
+ * Restrains the value between the min and max
373
+ */
374
+ _boundBetweenMinMax(value) {
375
+ return Math.max(+this.min, Math.min(+this.max, +value)).toString();
376
+ }
377
+ _valueFraction() {
378
+ const value = this.valueAsNumber;
379
+ const min = +this.min;
380
+ const max = +this.max;
381
+ const mathFraction = (value - min) / (max - min);
382
+ return isNaN(mathFraction) ? 0 : Math.max(0, Math.min(1, mathFraction));
383
+ }
384
+ async _handleKeydown(event) {
385
+ if (event.key !== "Tab") event.preventDefault();
386
+ if (this.readOnly) return;
387
+ if (event.key === "Home") this._rangeInput.value = this.min;
388
+ else if (event.key === "End") this._rangeInput.value = this.max;
389
+ else if (event.key === "ArrowLeft" || event.key === "ArrowDown") this._rangeInput.stepDown();
390
+ else if (event.key === "ArrowRight" || event.key === "ArrowUp") this._rangeInput.stepUp();
391
+ else if (event.key === "PageDown") this._rangeInput.stepDown((+this.max - +this.min) / 10);
392
+ else if (event.key === "PageUp") this._rangeInput.stepUp((+this.max - +this.min) / 10);
393
+ else return;
394
+ this._rangeInput.dispatchEvent(new InputEvent("input", {
395
+ bubbles: true,
396
+ cancelable: true,
397
+ composed: true
398
+ }));
399
+ this._rangeInput.dispatchEvent(new Event("change", { bubbles: true }));
400
+ }
401
+ /** Emits the change event. */
402
+ _dispatchChangeEvent() {
403
+ /**
404
+ * The change event is fired when the user modifies the element's value.
405
+ * Unlike the input event, the change event is not necessarily fired
406
+ * for each alteration to an element's value.
407
+ */
408
+ this.dispatchEvent(new Event("change", { bubbles: true }));
409
+ /**
410
+ * Deprecated. Mirrors change event for React. Will be removed once React properly supports change events.
411
+ * @deprecated
412
+ */
413
+ this.dispatchEvent(new Event("didChange", { bubbles: true }));
414
+ }
415
+ render() {
416
+ return html`
417
+ <div class="sbb-slider__height-container">
418
+ <div class="sbb-slider__wrapper">
419
+ <slot name="prefix">
420
+ ${this.startIcon ? html`<sbb-icon name="${this.startIcon}"></sbb-icon>` : nothing}
421
+ </slot>
422
+ <div class="sbb-slider__container">
423
+ <input
424
+ tabindex="-1"
425
+ min=${this.min}
426
+ max=${this.max}
427
+ ?disabled=${this.disabled || this.formDisabled || this.readOnly}
428
+ value=${this.value || nothing}
429
+ class="sbb-slider__range-input"
430
+ type="range"
431
+ @change=${() => this._dispatchChangeEvent()}
432
+ @input=${() => this.value = this._rangeInput.value}
433
+ ${ref((input) => this._rangeInput = input)}
434
+ />
435
+ <div class="sbb-slider__line">
436
+ <div class="sbb-slider__selected-line"></div>
437
+ </div>
438
+ <div class="sbb-slider__knob"></div>
439
+ </div>
440
+ <slot name="suffix">
441
+ ${this.endIcon ? html`<sbb-icon name="${this.endIcon}"></sbb-icon>` : nothing}
442
+ </slot>
443
+ </div>
444
+ </div>
445
+ `;
446
+ }
447
+ static {
448
+ __runInitializers(_classThis, _classExtraInitializers);
449
+ }
450
+ };
451
+ return _classThis;
452
+ })();
453
+ //#endregion
454
+ export { SbbSliderElement as t };
455
+
456
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC1RekY3QThZbC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2xpZGVyL3NsaWRlci5zY3NzP2xpdCZpbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2xpZGVyL3NsaWRlci5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLV9zYmItc2xpZGVyLXZhbHVlLWZyYWN0aW9uOiAwO1xuXG4gIC8vIFVzZSAhaW1wb3J0YW50IGhlcmUgdG8gbm90IGludGVyZmVyZSB3aXRoIEZpcmVmb3ggZm9jdXMgcmluZyBkZWZpbml0aW9uXG4gIC8vIHdoaWNoIGFwcGVhcnMgaW4gbm9ybWFsaXplIENTUyBvZiBzZXZlcmFsIGZyYW1ld29ya3MuXG4gIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtaW4td2lkdGg6IHZhcigtLXNiYi1zbGlkZXItbWluLXdpZHRoKTtcbiAgd2lkdGg6IG1pbih2YXIoLS1zYmItc2xpZGVyLXdpZHRoKSwgMTAwJSk7XG59XG5cbjpob3N0KDpkaXNhYmxlZCkge1xuICAtLXNiYi1zbGlkZXItaWNvbi1jb2xvcjogbGlnaHQtZGFyayh2YXIoLS1zYmItY29sb3ItZ3JhcGhpdGUpLCB2YXIoLS1zYmItY29sb3Itc21va2UpKTtcbiAgLS1zYmItc2xpZGVyLWtub2ItYm9yZGVyLWNvbG9yOiB2YXIoLS1zYmItYm9yZGVyLWNvbG9yLTUpO1xuICAtLXNiYi1zbGlkZXIta25vYi1ib3JkZXItc2l6ZTogdmFyKC0tc2JiLWJvcmRlci13aWR0aC0yeCk7XG4gIC0tc2JiLXNsaWRlci1rbm9iLWJvcmRlci1zdHlsZTogZGFzaGVkO1xufVxuXG46aG9zdChbcmVhZG9ubHldKSB7XG4gIC0tc2JiLXNsaWRlci1pY29uLWNvbG9yOiB2YXIoLS1zYmItY29sb3ItNSk7XG4gIC0tc2JiLXNsaWRlci1rbm9iLWJvcmRlci1jb2xvcjogdmFyKC0tc2JiLXNsaWRlci1zZWxlY3RlZC1saW5lLWRpc2FibGVkLWNvbG9yKTtcbn1cblxuOmhvc3QoOmRpc2FibGVkKSxcbjpob3N0KFtyZWFkb25seV0pIHtcbiAgLS1zYmItc2xpZGVyLWxpbmUtY29sb3I6IHZhcigtLXNiYi1zbGlkZXItbGluZS1kaXNhYmxlZC1jb2xvcik7XG4gIC0tc2JiLXNsaWRlci1zZWxlY3RlZC1saW5lLWNvbG9yOiB2YXIoLS1zYmItc2xpZGVyLXNlbGVjdGVkLWxpbmUtZGlzYWJsZWQtY29sb3IpO1xuXG4gIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICAtLXNiYi1zbGlkZXItaWNvbi1jb2xvcjogR3JheVRleHQ7XG4gICAgLS1zYmItc2xpZGVyLXNlbGVjdGVkLWxpbmUtZGlzYWJsZWQtY29sb3I6IEdyYXlUZXh0O1xuICAgIC0tc2JiLXNsaWRlci1saW5lLWRpc2FibGVkLWNvbG9yOiBHcmF5VGV4dDtcbiAgfVxufVxuXG4uc2JiLXNsaWRlcl9faGVpZ2h0LWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgQGluY2x1ZGUgc2JiLnplcm8td2lkdGgtc3BhY2U7XG59XG5cbi5zYmItc2xpZGVyX193cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiB2YXIoLS1zYmItc2xpZGVyLWdhcCk7XG4gIHBhZGRpbmctYmxvY2s6IHZhcigtLXNiYi1zbGlkZXItcGFkZGluZy1ibG9jayk7XG4gIGNvbG9yOiB2YXIoLS1zYmItc2xpZGVyLWljb24tY29sb3IpO1xufVxuXG4uc2JiLXNsaWRlcl9fY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtaW4taGVpZ2h0OiB2YXIoLS1zYmItc2l6ZS1pY29uLXVpLXNtYWxsKTtcbiAgZmxleC1ncm93OiAxO1xufVxuXG4uc2JiLXNsaWRlcl9fcmFuZ2UtaW5wdXQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxMDAlO1xuICBpbnNldDogMDtcbiAgb3BhY2l0eTogMDtcbiAgbWFyZ2luOiAwO1xufVxuXG4uc2JiLXNsaWRlcl9fbGluZSB7XG4gIEBpbmNsdWRlIHNiYi5hYnNvbHV0ZS1jZW50ZXIteTtcblxuICBoZWlnaHQ6IHZhcigtLXNiYi1zbGlkZXItbGluZS1oZWlnaHQpO1xuICB3aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLXNsaWRlci1saW5lLWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLXNsaWRlci1saW5lLWhlaWdodCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uc2JiLXNsaWRlcl9fc2VsZWN0ZWQtbGluZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItc2xpZGVyLXNlbGVjdGVkLWxpbmUtY29sb3IpO1xuICB3aWR0aDogY2FsYyh2YXIoLS1fc2JiLXNsaWRlci12YWx1ZS1mcmFjdGlvbikgKiAxMDAlKTtcbn1cblxuLnNiYi1zbGlkZXJfX2tub2Ige1xuICBAaW5jbHVkZSBzYmIuYWJzb2x1dGUtY2VudGVyLXk7XG5cbiAgYm94LXNoYWRvdzogdmFyKC0tc2JiLWJveC1zaGFkb3ctbGV2ZWwtNS1oYXJkKTtcbiAgd2lkdGg6IHZhcigtLXNiYi1zbGlkZXIta25vYi1zaXplKTtcbiAgaGVpZ2h0OiB2YXIoLS1zYmItc2xpZGVyLWtub2Itc2l6ZSk7XG4gIGluc2V0LWlubGluZS1zdGFydDogY2FsYyhcbiAgICBjYWxjKHZhcigtLV9zYmItc2xpZGVyLXZhbHVlLWZyYWN0aW9uKSAqIDEwMCUpIC0gdmFyKC0tc2JiLXNsaWRlci1rbm9iLXNpemUpICpcbiAgICAgIHZhcigtLV9zYmItc2xpZGVyLXZhbHVlLWZyYWN0aW9uKVxuICApO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB3aWR0aCwgaGVpZ2h0O1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1zYmItZGlzYWJsZS1hbmltYXRpb24tZHVyYXRpb24sIHZhcigtLXNiYi1hbmltYXRpb24tZHVyYXRpb24tMXgpKTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1zbGlkZXIta25vYi1jb2xvcik7XG4gIGJvcmRlcjogdmFyKC0tc2JiLXNsaWRlci1rbm9iLWJvcmRlci1zaXplKSB2YXIoLS1zYmItc2xpZGVyLWtub2ItYm9yZGVyLXN0eWxlKVxuICAgIHZhcigtLXNiYi1zbGlkZXIta25vYi1ib3JkZXItY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gIDpob3N0KDpmb2N1cy12aXNpYmxlKSAmIHtcbiAgICBAaW5jbHVkZSBzYmIuZm9jdXMtb3V0bGluZTtcblxuICAgIC0tc2JiLXNsaWRlci1rbm9iLXNpemU6IHZhcigtLXNiYi1zbGlkZXIta25vYi1zaXplLWFjdGl2ZSk7XG4gIH1cblxuICAvLyBzbGlkZXIga25vYiByZXNpemUgb24gY2xpY2sgKGFjdGl2ZSAvIGZvY3VzKVxuICA6aG9zdCg6bm90KDppcyg6ZGlzYWJsZWQsIFtyZWFkb25seV0pKSkgLnNiYi1zbGlkZXJfX3JhbmdlLWlucHV0OmFjdGl2ZSB+ICYge1xuICAgIC0tc2JiLXNsaWRlci1rbm9iLXNpemU6IHZhcigtLXNiYi1zbGlkZXIta25vYi1zaXplLWFjdGl2ZSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAsIFByb3BlcnR5VmFsdWVzLCBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBodG1sLCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcblxuaW1wb3J0IHsgU2JiRWxlbWVudCB9IGZyb20gJy4uL2NvcmUvYmFzZS1lbGVtZW50cy50cyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUsIGhvc3RBdHRyaWJ1dGVzIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLnRzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybVJlc3RvcmVSZWFzb24sXG4gIHR5cGUgRm9ybVJlc3RvcmVTdGF0ZSxcbiAgU2JiRGlzYWJsZWRNaXhpbixcbiAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbixcbiAgU2JiUmVhZG9ubHlNaXhpbixcbn0gZnJvbSAnLi4vY29yZS9taXhpbnMudHMnO1xuaW1wb3J0IHsgYm94U2l6aW5nU3R5bGVzIH0gZnJvbSAnLi4vY29yZS9zdHlsZXMudHMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9zbGlkZXIuc2Nzcz9saXQmaW5saW5lJztcblxuaW1wb3J0ICcuLi9pY29uLnRzJztcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhbiBpbnB1dCBrbm9iIHRoYXQgY2FuIGJlIG1vdmVkIGluIGEgcmFuZ2UuXG4gKlxuICogQHNsb3QgcHJlZml4IC0gVXNlIHRoaXMgc2xvdCB0byByZW5kZXIgYW4gaWNvbiBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbnB1dC5cbiAqIEBzbG90IHN1ZmZpeCAtIFVzZSB0aGlzIHNsb3QgdG8gcmVuZGVyIGFuIGljb24gb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGlucHV0LlxuICogQGV2ZW50IHtJbnB1dEV2ZW50fSBpbnB1dCAtIFRoZSBpbnB1dCBldmVudCBmaXJlcyB3aGVuIHRoZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGFzIGEgZGlyZWN0IHJlc3VsdCBvZiBhIHVzZXIgYWN0aW9uLlxuICovXG5leHBvcnRcbkBob3N0QXR0cmlidXRlcyh7XG4gIHRhYmluZGV4OiAnMCcsXG59KVxuY2xhc3MgU2JiU2xpZGVyRWxlbWVudCBleHRlbmRzIFNiYkRpc2FibGVkTWl4aW4oXG4gIFNiYlJlYWRvbmx5TWl4aW4oU2JiRm9ybUFzc29jaWF0ZWRNaXhpbihTYmJFbGVtZW50KSksXG4pIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi1zbGlkZXInO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IHJvbGUgPSAnc2xpZGVyJztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgc3R5bGVdO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICBkaWRDaGFuZ2U6ICdkaWRDaGFuZ2UnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBvZiB0aGUgZm9ybSBlbGVtZW50LlxuICAgKiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgZGVmYXVsdCBpcyB0aGUgbWlkZGxlIHBvaW50IGJldHdlZW4gbWluIGFuZCBtYXguXG4gICAqL1xuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuX2lzVmFsaWROdW1iZXIodmFsdWUpKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2JvdW5kQmV0d2Vlbk1pbk1heCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5pbnRlcm5hbHMuYXJpYVZhbHVlTm93ID0gdGhpcy52YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8/IHRoaXMuX2RlZmF1bHRWYWx1ZSgpO1xuICB9XG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogTnVtZXJpYyB2YWx1ZSBmb3IgdGhlIGlubmVyIEhUTUxJbnB1dEVsZW1lbnQuICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ZhbHVlLWFzLW51bWJlcicsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgc2V0IHZhbHVlQXNOdW1iZXIodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU/LnRvU3RyaW5nKCkgPz8gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlQXNOdW1iZXIoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8qKiBNaW5pbXVtIGFjY2VwdGFibGUgdmFsdWUgZm9yIHRoZSBpbm5lciBIVE1MSW5wdXRFbGVtZW50LiAqL1xuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgc2V0IG1pbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLl9pc1ZhbGlkTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFWYWx1ZU1pbiA9IHRoaXMubWluO1xuICAgIGNvbnN0IGJvdW5kVmFsdWUgPSB0aGlzLl9ib3VuZEJldHdlZW5NaW5NYXgodGhpcy52YWx1ZSk7XG4gICAgaWYgKHRoaXMudmFsdWUgIT09IGJvdW5kVmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBib3VuZFZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IG1pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cbiAgcHJpdmF0ZSBfbWluOiBzdHJpbmcgPSAnMCc7XG5cbiAgLyoqIE1heGltdW0gYWNjZXB0YWJsZSB2YWx1ZSBmb3IgdGhlIGlubmVyIEhUTUxJbnB1dEVsZW1lbnQuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbWF4KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWROdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4ID0gdmFsdWU7XG4gICAgdGhpcy5pbnRlcm5hbHMuYXJpYVZhbHVlTWF4ID0gdGhpcy5tYXg7XG4gICAgY29uc3QgYm91bmRWYWx1ZSA9IHRoaXMuX2JvdW5kQmV0d2Vlbk1pbk1heCh0aGlzLnZhbHVlKTtcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gYm91bmRWYWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGJvdW5kVmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgbWF4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuICBwcml2YXRlIF9tYXg6IHN0cmluZyA9ICcxMDAnO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBpY29uIGF0IGNvbXBvbmVudCdzIHN0YXJ0LCB3aGljaCB3aWxsIGJlIGZvcndhcmQgdG8gdGhlIG5lc3RlZCBgc2JiLWljb25gLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc3RhcnQtaWNvbicgfSlcbiAgcHVibGljIGFjY2Vzc29yIHN0YXJ0SWNvbjogc3RyaW5nID0gJyc7XG5cbiAgLyoqIE5hbWUgb2YgdGhlIGljb24gYXQgY29tcG9uZW50J3MgZW5kLCB3aGljaCB3aWxsIGJlIGZvcndhcmQgdG8gdGhlIG5lc3RlZCBgc2JiLWljb25gLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZW5kLWljb24nIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBlbmRJY29uOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogRm9ybSB0eXBlIG9mIGVsZW1lbnQuXG4gICAqIEBkZWZhdWx0ICdyYW5nZSdcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAncmFuZ2UnO1xuICB9XG5cbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgaW5uZXIgSFRNTElucHV0RWxlbWVudCB3aXRoIHR5cGU9J3JhbmdlJy4gKi9cbiAgcHJpdmF0ZSBfcmFuZ2VJbnB1dCE6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5faGFuZGxlS2V5ZG93bihlKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3JlYWRPbmx5JykpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFSZWFkT25seSA9IEJvb2xlYW4odGhpcy5yZWFkT25seSkudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tX3NiYi1zbGlkZXItdmFsdWUtZnJhY3Rpb24nLCB0aGlzLl92YWx1ZUZyYWN0aW9uKCkudG9TdHJpbmcoKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlc2V0IHZhbHVlIGlzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKHRoZSBzZXR1cCB2YWx1ZSkuIElmIG5vdCBwcmVzZW50LCBjYWxjdWxhdGVzIHRoZSBkZWZhdWx0LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgPz8gdGhpcy5fZGVmYXVsdFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHN0YXRlIGFzIHN0cmluZyB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCBkZWZhdWx0IGlzIHRoZSBtaWRkbGUgcG9pbnQgYmV0d2VlbiBtaW4gYW5kIG1heFxuICAgKiAgKHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQvcmFuZ2UjdmFsdWUpXG4gICAqL1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKCt0aGlzLm1pbiArICgrdGhpcy5tYXggLSArdGhpcy5taW4pIC8gMikudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWROdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2YWx1ZSBpcyBzdHJpbmcge1xuICAgIHJldHVybiAhIXZhbHVlICYmICFpc05hTihOdW1iZXIodmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0cmFpbnMgdGhlIHZhbHVlIGJldHdlZW4gdGhlIG1pbiBhbmQgbWF4XG4gICAqL1xuICBwcml2YXRlIF9ib3VuZEJldHdlZW5NaW5NYXgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE1hdGgubWF4KCt0aGlzLm1pbiwgTWF0aC5taW4oK3RoaXMubWF4LCArdmFsdWUpKS50b1N0cmluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmFsdWVGcmFjdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZUFzTnVtYmVyITtcbiAgICBjb25zdCBtaW4gPSArdGhpcy5taW47XG4gICAgY29uc3QgbWF4ID0gK3RoaXMubWF4O1xuXG4gICAgY29uc3QgbWF0aEZyYWN0aW9uOiBudW1iZXIgPSAodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gICAgcmV0dXJuIGlzTmFOKG1hdGhGcmFjdGlvbikgPyAwIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgbWF0aEZyYWN0aW9uKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ1RhYicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnSG9tZScpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQudmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VuZCcpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQudmFsdWUgPSB0aGlzLm1heDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgdGhpcy5fcmFuZ2VJbnB1dC5zdGVwRG93bigpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQuc3RlcFVwKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdQYWdlRG93bicpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQuc3RlcERvd24oKCt0aGlzLm1heCAtICt0aGlzLm1pbikgLyAxMCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdQYWdlVXAnKSB7XG4gICAgICB0aGlzLl9yYW5nZUlucHV0LnN0ZXBVcCgoK3RoaXMubWF4IC0gK3RoaXMubWluKSAvIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgZmlyZSBldmVudHMgYmVjYXVzZSBwcm9ncmFtbWF0aWMgY2hhbmdlcyBkb24ndCB0cmlnZ2VyIHRoZW1cbiAgICB0aGlzLl9yYW5nZUlucHV0LmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgSW5wdXRFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlIH0pLFxuICAgICk7XG4gICAgdGhpcy5fcmFuZ2VJbnB1dC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgY2hhbmdlIGV2ZW50LiAqL1xuICBwcml2YXRlIF9kaXNwYXRjaENoYW5nZUV2ZW50KCk6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGFuZ2UgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgdXNlciBtb2RpZmllcyB0aGUgZWxlbWVudCdzIHZhbHVlLlxuICAgICAqIFVubGlrZSB0aGUgaW5wdXQgZXZlbnQsIHRoZSBjaGFuZ2UgZXZlbnQgaXMgbm90IG5lY2Vzc2FyaWx5IGZpcmVkXG4gICAgICogZm9yIGVhY2ggYWx0ZXJhdGlvbiB0byBhbiBlbGVtZW50J3MgdmFsdWUuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcblxuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIE1pcnJvcnMgY2hhbmdlIGV2ZW50IGZvciBSZWFjdC4gV2lsbCBiZSByZW1vdmVkIG9uY2UgUmVhY3QgcHJvcGVybHkgc3VwcG9ydHMgY2hhbmdlIGV2ZW50cy5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2RpZENoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19oZWlnaHQtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX193cmFwcGVyXCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInByZWZpeFwiPlxuICAgICAgICAgICAgJHt0aGlzLnN0YXJ0SWNvbiA/IGh0bWxgPHNiYi1pY29uIG5hbWU9XCIke3RoaXMuc3RhcnRJY29ufVwiPjwvc2JiLWljb24+YCA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9zbG90PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgbWluPSR7dGhpcy5taW59XG4gICAgICAgICAgICAgIG1heD0ke3RoaXMubWF4fVxuICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkIHx8IHRoaXMucmVhZE9ubHl9XG4gICAgICAgICAgICAgIHZhbHVlPSR7dGhpcy52YWx1ZSB8fCBub3RoaW5nfVxuICAgICAgICAgICAgICBjbGFzcz1cInNiYi1zbGlkZXJfX3JhbmdlLWlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgQGNoYW5nZT0keygpID0+IHRoaXMuX2Rpc3BhdGNoQ2hhbmdlRXZlbnQoKX1cbiAgICAgICAgICAgICAgQGlucHV0PSR7KCkgPT4gKHRoaXMudmFsdWUgPSB0aGlzLl9yYW5nZUlucHV0LnZhbHVlKX1cbiAgICAgICAgICAgICAgJHtyZWYoKGlucHV0PzogRWxlbWVudCkgPT4gKHRoaXMuX3JhbmdlSW5wdXQgPSBpbnB1dCBhcyBIVE1MSW5wdXRFbGVtZW50KSl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zbGlkZXJfX2xpbmVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zbGlkZXJfX3NlbGVjdGVkLWxpbmVcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zbGlkZXJfX2tub2JcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwic3VmZml4XCI+XG4gICAgICAgICAgICAke3RoaXMuZW5kSWNvbiA/IGh0bWxgPHNiYi1pY29uIG5hbWU9XCIke3RoaXMuZW5kSWNvbn1cIj48L3NiYi1pY29uPmAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItc2xpZGVyJzogU2JiU2xpZGVyRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDK0JNLDBCQUFnQjt5QkFIckIsZUFBZSxFQUNkLFVBQVUsS0FDWCxDQUFDLENBQUE7Ozs7bUJBQzZCLGlCQUM3QixpQkFBaUIsdUJBQXVCLFdBQVcsQ0FBQyxDQUNyRDs7Ozs7Ozs7Ozs7O3NDQUY4QixZQUU5Qjs7Ozs7OzRCQVlF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
@@ -1,4 +1,4 @@
1
- import { t as SbbSliderElement } from "./slider.component-w_WtVNx-.js";
1
+ import { t as SbbSliderElement } from "./slider.component-QzF7A8Yl.js";
2
2
  import "./slider.pure.js";
3
3
  //#region src/elements/slider.ts
4
4
  /** @entrypoint */
@@ -1,2 +1,2 @@
1
- import { t as SbbSliderElement } from "./slider.component-w_WtVNx-.js";
1
+ import { t as SbbSliderElement } from "./slider.component-QzF7A8Yl.js";
2
2
  export { SbbSliderElement };
@@ -1736,6 +1736,27 @@ slot[name=error]::slotted(*) {
1736
1736
  --sbb-signet-panel-color: var(--sbb-color-brand);
1737
1737
  --sbb-signet-icon-color: var(--sbb-color-white);
1738
1738
  --sbb-signet-aspect-ratio: 2 / 1;
1739
+ --sbb-slider-line-height: 0.25rem;
1740
+ --sbb-slider-knob-size: 1.75rem;
1741
+ --sbb-slider-knob-size-active: 1.9375rem;
1742
+ --sbb-slider-knob-border-size: 0.1875rem;
1743
+ --sbb-slider-knob-border-style: solid;
1744
+ --sbb-slider-knob-color: var(--sbb-background-color-1);
1745
+ --sbb-slider-knob-border-color: var(--sbb-color-primary);
1746
+ --sbb-slider-icon-color: var(--sbb-color-1);
1747
+ --sbb-slider-selected-line-disabled-color: var(--sbb-color-smoke);
1748
+ --sbb-slider-selected-line-disabled-color: light-dark(
1749
+ var(--sbb-color-smoke),
1750
+ var(--sbb-color-cement)
1751
+ );
1752
+ --sbb-slider-line-color: var(--sbb-border-color-5);
1753
+ --sbb-slider-selected-line-color: var(--sbb-color-primary);
1754
+ --sbb-slider-line-disabled-color: var(--sbb-color-graphite);
1755
+ --sbb-slider-line-disabled-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-granite));
1756
+ --sbb-slider-width: 25rem;
1757
+ --sbb-slider-min-width: 9.375rem;
1758
+ --sbb-slider-gap: var(--sbb-spacing-fixed-2x);
1759
+ --sbb-slider-padding-block: 0.125rem;
1739
1760
  --sbb-status-color: var(--sbb-color-4);
1740
1761
  --sbb-status-gap: var(--sbb-spacing-fixed-1x);
1741
1762
  --sbb-status-font-size: var(--sbb-text-font-size-s);
@@ -1813,6 +1834,8 @@ slot[name=error]::slotted(*) {
1813
1834
  --sbb-signet-background-color: ButtonText !important;
1814
1835
  --sbb-signet-panel-color: ButtonText !important;
1815
1836
  --sbb-signet-icon-color: Canvas !important;
1837
+ --sbb-slider-selected-line-color: Highlight;
1838
+ --sbb-slider-line-color: CanvasText;
1816
1839
  }
1817
1840
  }
1818
1841
  :root {
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sbb-esta/lyne-elements-dev",
3
- "version": "4.9.0-dev.1774376412",
3
+ "version": "4.9.0-dev.1774507634",
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/d53576000a02b377e56bb0c6dd711d7d1c93dcec"
9
+ "https://github.com/sbb-design-systems/lyne-components/commit/e719ede6b528296fc0f36847302124d52a6f5c1c"
10
10
  ],
11
11
  "type": "module",
12
12
  "exports": {
package/safety-theme.css CHANGED
@@ -1736,6 +1736,27 @@ slot[name=error]::slotted(*) {
1736
1736
  --sbb-signet-panel-color: var(--sbb-color-brand);
1737
1737
  --sbb-signet-icon-color: var(--sbb-color-white);
1738
1738
  --sbb-signet-aspect-ratio: 2 / 1;
1739
+ --sbb-slider-line-height: 0.25rem;
1740
+ --sbb-slider-knob-size: 1.75rem;
1741
+ --sbb-slider-knob-size-active: 1.9375rem;
1742
+ --sbb-slider-knob-border-size: 0.1875rem;
1743
+ --sbb-slider-knob-border-style: solid;
1744
+ --sbb-slider-knob-color: var(--sbb-background-color-1);
1745
+ --sbb-slider-knob-border-color: var(--sbb-color-primary);
1746
+ --sbb-slider-icon-color: var(--sbb-color-1);
1747
+ --sbb-slider-selected-line-disabled-color: var(--sbb-color-smoke);
1748
+ --sbb-slider-selected-line-disabled-color: light-dark(
1749
+ var(--sbb-color-smoke),
1750
+ var(--sbb-color-cement)
1751
+ );
1752
+ --sbb-slider-line-color: var(--sbb-border-color-5);
1753
+ --sbb-slider-selected-line-color: var(--sbb-color-primary);
1754
+ --sbb-slider-line-disabled-color: var(--sbb-color-graphite);
1755
+ --sbb-slider-line-disabled-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-granite));
1756
+ --sbb-slider-width: 25rem;
1757
+ --sbb-slider-min-width: 9.375rem;
1758
+ --sbb-slider-gap: var(--sbb-spacing-fixed-2x);
1759
+ --sbb-slider-padding-block: 0.125rem;
1739
1760
  --sbb-status-color: var(--sbb-color-4);
1740
1761
  --sbb-status-gap: var(--sbb-spacing-fixed-1x);
1741
1762
  --sbb-status-font-size: var(--sbb-text-font-size-s);
@@ -1813,6 +1834,8 @@ slot[name=error]::slotted(*) {
1813
1834
  --sbb-signet-background-color: ButtonText !important;
1814
1835
  --sbb-signet-panel-color: ButtonText !important;
1815
1836
  --sbb-signet-icon-color: Canvas !important;
1837
+ --sbb-slider-selected-line-color: Highlight;
1838
+ --sbb-slider-line-color: CanvasText;
1816
1839
  }
1817
1840
  }
1818
1841
  :root {
@@ -1,2 +1,2 @@
1
- import { t as e } from "../slider.component-MdvM78XU.js";
1
+ import { t as e } from "../slider.component-D-yXlqJY.js";
2
2
  export { e as SbbSliderElement };
@@ -8,7 +8,7 @@ import { boxSizingStyles as f } from "./core/styles.js";
8
8
  import "./icon.js";
9
9
  import { ref as p } from "lit/directives/ref.js";
10
10
  //#region src/elements/slider/slider.scss?lit&inline
11
- var m = n`@charset "UTF-8";:host{outline:none!important;display:inline-block;min-width:9.375rem;width:min(25rem,100%);--sbb-slider-line-height: .25rem;--sbb-slider-value-fraction: 0;--sbb-slider-knob-size: 1.75rem;--sbb-slider-knob-size-active: 1.9375rem;--sbb-slider-knob-border-size: .1875rem;--sbb-slider-knob-border-style: solid;--sbb-slider-knob-color: var(--sbb-background-color-1);--sbb-slider-knob-border-color: var(--sbb-color-primary);--sbb-slider-icon-color: var(--sbb-color-1);--sbb-slider-selected-line-color: var(--sbb-color-primary);--sbb-slider-selected-line-disabled-color: var(--sbb-color-smoke);--sbb-slider-selected-line-disabled-color: light-dark( var(--sbb-color-smoke), var(--sbb-color-cement) );--sbb-slider-line-color: var(--sbb-border-color-5);--sbb-slider-line-disabled-color: var(--sbb-color-graphite);--sbb-slider-line-disabled-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-granite))}@media(forced-colors:active){:host{--sbb-slider-selected-line-color: Highlight;--sbb-slider-line-color: CanvasText}}:host(:disabled){--sbb-slider-icon-color: var(--sbb-color-graphite);--sbb-slider-icon-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-smoke));--sbb-slider-knob-border-color: var(--sbb-border-color-5);--sbb-slider-knob-border-size: var(--sbb-border-width-2x);--sbb-slider-knob-border-style: dashed}:host([readonly]){--sbb-slider-icon-color: var(--sbb-color-5);--sbb-slider-knob-border-color: var(--sbb-slider-selected-line-disabled-color)}:host(:disabled),:host([readonly]){--sbb-slider-line-color: var(--sbb-slider-line-disabled-color);--sbb-slider-selected-line-color: var(--sbb-slider-selected-line-disabled-color)}@media(forced-colors:active){:host(:disabled),:host([readonly]){--sbb-slider-icon-color: GrayText;--sbb-slider-selected-line-disabled-color: GrayText;--sbb-slider-line-disabled-color: GrayText}}.sbb-slider__height-container{display:flex;flex-direction:column}.sbb-slider__height-container:before{content:"​";-webkit-user-select:none;user-select:none;width:0;height:0}.sbb-slider__wrapper{display:flex;gap:var(--sbb-spacing-fixed-2x);padding-block:calc(var(--sbb-spacing-fixed-1x) / 2);color:var(--sbb-slider-icon-color)}.sbb-slider__container{position:relative;min-height:var(--sbb-size-icon-ui-small);flex-grow:1}.sbb-slider__range-input{position:absolute;width:100%;inset:0;opacity:0;margin:0}.sbb-slider__line{position:absolute;top:50%;transform:translateY(-50%);height:var(--sbb-slider-line-height);width:100%;background-color:var(--sbb-slider-line-color);border-radius:var(--sbb-slider-line-height);overflow:hidden;pointer-events:none}.sbb-slider__selected-line{position:relative;height:100%;background-color:var(--sbb-slider-selected-line-color);width:calc(var(--sbb-slider-value-fraction) * 100%)}.sbb-slider__knob{position:absolute;top:50%;transform:translateY(-50%);box-shadow:var(--sbb-box-shadow-level-5-hard);width:var(--sbb-slider-knob-size);height:var(--sbb-slider-knob-size);inset-inline-start:calc(var(--sbb-slider-value-fraction) * 100% - var(--sbb-slider-knob-size) * var(--sbb-slider-value-fraction));transition-property:width,height;transition-duration:var(--sbb-disable-animation-duration, var(--sbb-animation-duration-1x));transition-timing-function:ease-in;background-color:var(--sbb-slider-knob-color);border:var(--sbb-slider-knob-border-size) var(--sbb-slider-knob-border-style) var(--sbb-slider-knob-border-color);border-radius:50%;pointer-events:none}:host(:focus-visible) .sbb-slider__knob{outline-offset:var(--sbb-focus-outline-offset);outline:var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);--sbb-slider-knob-size: var(--sbb-slider-knob-size-active)}:host(:not(:is(:disabled,[readonly]))) .sbb-slider__range-input:active~.sbb-slider__knob{--sbb-slider-knob-size: var(--sbb-slider-knob-size-active)}`, h = (() => {
11
+ var m = n`@charset "UTF-8";:host{--_sbb-slider-value-fraction: 0;outline:none!important;display:inline-block;min-width:var(--sbb-slider-min-width);width:min(var(--sbb-slider-width),100%)}:host(:disabled){--sbb-slider-icon-color: var(--sbb-color-graphite);--sbb-slider-icon-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-smoke));--sbb-slider-knob-border-color: var(--sbb-border-color-5);--sbb-slider-knob-border-size: var(--sbb-border-width-2x);--sbb-slider-knob-border-style: dashed}:host([readonly]){--sbb-slider-icon-color: var(--sbb-color-5);--sbb-slider-knob-border-color: var(--sbb-slider-selected-line-disabled-color)}:host(:disabled),:host([readonly]){--sbb-slider-line-color: var(--sbb-slider-line-disabled-color);--sbb-slider-selected-line-color: var(--sbb-slider-selected-line-disabled-color)}@media(forced-colors:active){:host(:disabled),:host([readonly]){--sbb-slider-icon-color: GrayText;--sbb-slider-selected-line-disabled-color: GrayText;--sbb-slider-line-disabled-color: GrayText}}.sbb-slider__height-container{display:flex;flex-direction:column}.sbb-slider__height-container:before{content:"​";-webkit-user-select:none;user-select:none;width:0;height:0}.sbb-slider__wrapper{display:flex;gap:var(--sbb-slider-gap);padding-block:var(--sbb-slider-padding-block);color:var(--sbb-slider-icon-color)}.sbb-slider__container{position:relative;min-height:var(--sbb-size-icon-ui-small);flex-grow:1}.sbb-slider__range-input{position:absolute;width:100%;inset:0;opacity:0;margin:0}.sbb-slider__line{position:absolute;top:50%;transform:translateY(-50%);height:var(--sbb-slider-line-height);width:100%;background-color:var(--sbb-slider-line-color);border-radius:var(--sbb-slider-line-height);overflow:hidden;pointer-events:none}.sbb-slider__selected-line{position:relative;height:100%;background-color:var(--sbb-slider-selected-line-color);width:calc(var(--_sbb-slider-value-fraction) * 100%)}.sbb-slider__knob{position:absolute;top:50%;transform:translateY(-50%);box-shadow:var(--sbb-box-shadow-level-5-hard);width:var(--sbb-slider-knob-size);height:var(--sbb-slider-knob-size);inset-inline-start:calc(var(--_sbb-slider-value-fraction) * 100% - var(--sbb-slider-knob-size) * var(--_sbb-slider-value-fraction));transition-property:width,height;transition-duration:var(--sbb-disable-animation-duration, var(--sbb-animation-duration-1x));transition-timing-function:ease-in;background-color:var(--sbb-slider-knob-color);border:var(--sbb-slider-knob-border-size) var(--sbb-slider-knob-border-style) var(--sbb-slider-knob-border-color);border-radius:50%;pointer-events:none}:host(:focus-visible) .sbb-slider__knob{outline-offset:var(--sbb-focus-outline-offset);outline:var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);--sbb-slider-knob-size: var(--sbb-slider-knob-size-active)}:host(:not(:is(:disabled,[readonly]))) .sbb-slider__range-input:active~.sbb-slider__knob{--sbb-slider-knob-size: var(--sbb-slider-knob-size-active)}`, h = (() => {
12
12
  let n = [c({ tabindex: "0" })], h, g = [], _, v = l(d(u(o))), y = [], b, x, S, C, w, T = [], E = [], D, O = [], k = [];
13
13
  var A = class extends v {
14
14
  static {
@@ -167,7 +167,7 @@ var m = n`@charset "UTF-8";:host{outline:none!important;display:inline-block;min
167
167
  super(), this._value = (t(this, y), null), this._min = "0", this._max = "100", this.#e = t(this, T, ""), this.#t = (t(this, E), t(this, O, "")), this._rangeInput = t(this, k), this.addEventListener?.("keydown", (e) => this._handleKeydown(e));
168
168
  }
169
169
  willUpdate(e) {
170
- super.willUpdate(e), e.has("readOnly") && (this.internals.ariaReadOnly = (!!this.readOnly).toString()), this.style?.setProperty("--sbb-slider-value-fraction", this._valueFraction().toString());
170
+ super.willUpdate(e), e.has("readOnly") && (this.internals.ariaReadOnly = (!!this.readOnly).toString()), this.style?.setProperty("--_sbb-slider-value-fraction", this._valueFraction().toString());
171
171
  }
172
172
  formResetCallback() {
173
173
  this.value = this.getAttribute("value") ?? this._defaultValue();
package/slider.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e } from "./slider.component-MdvM78XU.js";
1
+ import { t as e } from "./slider.component-D-yXlqJY.js";
2
2
  import "./slider.pure.js";
3
3
  //#region src/elements/slider.ts
4
4
  e.define();
package/slider.pure.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./slider.component-MdvM78XU.js";
1
+ import { t as e } from "./slider.component-D-yXlqJY.js";
2
2
  export { e as SbbSliderElement };
@@ -1736,6 +1736,27 @@ slot[name=error]::slotted(*) {
1736
1736
  --sbb-signet-panel-color: var(--sbb-color-brand);
1737
1737
  --sbb-signet-icon-color: var(--sbb-color-white);
1738
1738
  --sbb-signet-aspect-ratio: 2 / 1;
1739
+ --sbb-slider-line-height: 0.25rem;
1740
+ --sbb-slider-knob-size: 1.75rem;
1741
+ --sbb-slider-knob-size-active: 1.9375rem;
1742
+ --sbb-slider-knob-border-size: 0.1875rem;
1743
+ --sbb-slider-knob-border-style: solid;
1744
+ --sbb-slider-knob-color: var(--sbb-background-color-1);
1745
+ --sbb-slider-knob-border-color: var(--sbb-color-primary);
1746
+ --sbb-slider-icon-color: var(--sbb-color-1);
1747
+ --sbb-slider-selected-line-disabled-color: var(--sbb-color-smoke);
1748
+ --sbb-slider-selected-line-disabled-color: light-dark(
1749
+ var(--sbb-color-smoke),
1750
+ var(--sbb-color-cement)
1751
+ );
1752
+ --sbb-slider-line-color: var(--sbb-border-color-5);
1753
+ --sbb-slider-selected-line-color: var(--sbb-color-primary);
1754
+ --sbb-slider-line-disabled-color: var(--sbb-color-graphite);
1755
+ --sbb-slider-line-disabled-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-granite));
1756
+ --sbb-slider-width: 25rem;
1757
+ --sbb-slider-min-width: 9.375rem;
1758
+ --sbb-slider-gap: var(--sbb-spacing-fixed-2x);
1759
+ --sbb-slider-padding-block: 0.125rem;
1739
1760
  --sbb-status-color: var(--sbb-color-4);
1740
1761
  --sbb-status-gap: var(--sbb-spacing-fixed-1x);
1741
1762
  --sbb-status-font-size: var(--sbb-text-font-size-s);
@@ -1813,6 +1834,8 @@ slot[name=error]::slotted(*) {
1813
1834
  --sbb-signet-background-color: ButtonText !important;
1814
1835
  --sbb-signet-panel-color: ButtonText !important;
1815
1836
  --sbb-signet-icon-color: Canvas !important;
1837
+ --sbb-slider-selected-line-color: Highlight;
1838
+ --sbb-slider-line-color: CanvasText;
1816
1839
  }
1817
1840
  }
1818
1841
  :root {
@@ -1,479 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { css, html, nothing } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbElement } from "./core/base-elements.js";
5
- import { forceType, hostAttributes } from "./core/decorators.js";
6
- import { SbbDisabledMixin, SbbFormAssociatedMixin, SbbReadonlyMixin } from "./core/mixins.js";
7
- import { boxSizingStyles } from "./core/styles.js";
8
- import "./icon.js";
9
- import { ref } from "lit/directives/ref.js";
10
- //#region src/elements/slider/slider.scss?lit&inline
11
- var slider_default = css`@charset "UTF-8";
12
- :host {
13
- outline: none !important;
14
- display: inline-block;
15
- min-width: 9.375rem;
16
- width: min(25rem, 100%);
17
- --sbb-slider-line-height: 0.25rem;
18
- --sbb-slider-value-fraction: 0;
19
- --sbb-slider-knob-size: 1.75rem;
20
- --sbb-slider-knob-size-active: 1.9375rem;
21
- --sbb-slider-knob-border-size: 0.1875rem;
22
- --sbb-slider-knob-border-style: solid;
23
- --sbb-slider-knob-color: var(--sbb-background-color-1);
24
- --sbb-slider-knob-border-color: var(--sbb-color-primary);
25
- --sbb-slider-icon-color: var(--sbb-color-1);
26
- --sbb-slider-selected-line-color: var(--sbb-color-primary);
27
- --sbb-slider-selected-line-disabled-color: var(--sbb-color-smoke);
28
- --sbb-slider-selected-line-disabled-color: light-dark(
29
- var(--sbb-color-smoke),
30
- var(--sbb-color-cement)
31
- );
32
- --sbb-slider-line-color: var(--sbb-border-color-5);
33
- --sbb-slider-line-disabled-color: var(--sbb-color-graphite);
34
- --sbb-slider-line-disabled-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-granite));
35
- }
36
- @media (forced-colors: active) {
37
- :host {
38
- --sbb-slider-selected-line-color: Highlight;
39
- --sbb-slider-line-color: CanvasText;
40
- }
41
- }
42
-
43
- :host(:disabled) {
44
- --sbb-slider-icon-color: var(--sbb-color-graphite);
45
- --sbb-slider-icon-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-smoke));
46
- --sbb-slider-knob-border-color: var(--sbb-border-color-5);
47
- --sbb-slider-knob-border-size: var(--sbb-border-width-2x);
48
- --sbb-slider-knob-border-style: dashed;
49
- }
50
-
51
- :host([readonly]) {
52
- --sbb-slider-icon-color: var(--sbb-color-5);
53
- --sbb-slider-knob-border-color: var(--sbb-slider-selected-line-disabled-color);
54
- }
55
-
56
- :host(:disabled),
57
- :host([readonly]) {
58
- --sbb-slider-line-color: var(--sbb-slider-line-disabled-color);
59
- --sbb-slider-selected-line-color: var(--sbb-slider-selected-line-disabled-color);
60
- }
61
- @media (forced-colors: active) {
62
- :host(:disabled),
63
- :host([readonly]) {
64
- --sbb-slider-icon-color: GrayText;
65
- --sbb-slider-selected-line-disabled-color: GrayText;
66
- --sbb-slider-line-disabled-color: GrayText;
67
- }
68
- }
69
-
70
- .sbb-slider__height-container {
71
- display: flex;
72
- flex-direction: column;
73
- }
74
- .sbb-slider__height-container::before {
75
- content: "​";
76
- user-select: none;
77
- width: 0;
78
- height: 0;
79
- }
80
-
81
- .sbb-slider__wrapper {
82
- display: flex;
83
- gap: var(--sbb-spacing-fixed-2x);
84
- padding-block: calc(var(--sbb-spacing-fixed-1x) / 2);
85
- color: var(--sbb-slider-icon-color);
86
- }
87
-
88
- .sbb-slider__container {
89
- position: relative;
90
- min-height: var(--sbb-size-icon-ui-small);
91
- flex-grow: 1;
92
- }
93
-
94
- .sbb-slider__range-input {
95
- position: absolute;
96
- width: 100%;
97
- inset: 0;
98
- opacity: 0;
99
- margin: 0;
100
- }
101
-
102
- .sbb-slider__line {
103
- position: absolute;
104
- top: 50%;
105
- transform: translateY(-50%);
106
- height: var(--sbb-slider-line-height);
107
- width: 100%;
108
- background-color: var(--sbb-slider-line-color);
109
- border-radius: var(--sbb-slider-line-height);
110
- overflow: hidden;
111
- pointer-events: none;
112
- }
113
-
114
- .sbb-slider__selected-line {
115
- position: relative;
116
- height: 100%;
117
- background-color: var(--sbb-slider-selected-line-color);
118
- width: calc(var(--sbb-slider-value-fraction) * 100%);
119
- }
120
-
121
- .sbb-slider__knob {
122
- position: absolute;
123
- top: 50%;
124
- transform: translateY(-50%);
125
- box-shadow: var(--sbb-box-shadow-level-5-hard);
126
- width: var(--sbb-slider-knob-size);
127
- height: var(--sbb-slider-knob-size);
128
- inset-inline-start: calc(var(--sbb-slider-value-fraction) * 100% - var(--sbb-slider-knob-size) * var(--sbb-slider-value-fraction));
129
- transition-property: width, height;
130
- transition-duration: var(--sbb-disable-animation-duration, var(--sbb-animation-duration-1x));
131
- transition-timing-function: ease-in;
132
- background-color: var(--sbb-slider-knob-color);
133
- border: var(--sbb-slider-knob-border-size) var(--sbb-slider-knob-border-style) var(--sbb-slider-knob-border-color);
134
- border-radius: 50%;
135
- pointer-events: none;
136
- }
137
- :host(:focus-visible) .sbb-slider__knob {
138
- outline-offset: var(--sbb-focus-outline-offset);
139
- outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);
140
- --sbb-slider-knob-size: var(--sbb-slider-knob-size-active);
141
- }
142
- :host(:not(:is(:disabled, [readonly]))) .sbb-slider__range-input:active ~ .sbb-slider__knob {
143
- --sbb-slider-knob-size: var(--sbb-slider-knob-size-active);
144
- }`;
145
- //#endregion
146
- //#region src/elements/slider/slider.component.ts
147
- /**
148
- * It displays an input knob that can be moved in a range.
149
- *
150
- * @slot prefix - Use this slot to render an icon on the left side of the input.
151
- * @slot suffix - Use this slot to render an icon on the right side of the input.
152
- * @event {InputEvent} input - The input event fires when the value has been changed as a direct result of a user action.
153
- */
154
- var SbbSliderElement = (() => {
155
- let _classDecorators = [hostAttributes({ tabindex: "0" })];
156
- let _classDescriptor;
157
- let _classExtraInitializers = [];
158
- let _classThis;
159
- let _classSuper = SbbDisabledMixin(SbbReadonlyMixin(SbbFormAssociatedMixin(SbbElement)));
160
- let _instanceExtraInitializers = [];
161
- let _set_value_decorators;
162
- let _set_valueAsNumber_decorators;
163
- let _set_min_decorators;
164
- let _set_max_decorators;
165
- let _startIcon_decorators;
166
- let _startIcon_initializers = [];
167
- let _startIcon_extraInitializers = [];
168
- let _endIcon_decorators;
169
- let _endIcon_initializers = [];
170
- let _endIcon_extraInitializers = [];
171
- var SbbSliderElement = class extends _classSuper {
172
- static {
173
- _classThis = this;
174
- }
175
- static {
176
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
177
- _set_value_decorators = [property()];
178
- _set_valueAsNumber_decorators = [property({
179
- attribute: "value-as-number",
180
- type: Number
181
- })];
182
- _set_min_decorators = [property()];
183
- _set_max_decorators = [property()];
184
- _startIcon_decorators = [forceType(), property({ attribute: "start-icon" })];
185
- _endIcon_decorators = [forceType(), property({ attribute: "end-icon" })];
186
- __esDecorate(this, null, _set_value_decorators, {
187
- kind: "setter",
188
- name: "value",
189
- static: false,
190
- private: false,
191
- access: {
192
- has: (obj) => "value" in obj,
193
- set: (obj, value) => {
194
- obj.value = value;
195
- }
196
- },
197
- metadata: _metadata
198
- }, null, _instanceExtraInitializers);
199
- __esDecorate(this, null, _set_valueAsNumber_decorators, {
200
- kind: "setter",
201
- name: "valueAsNumber",
202
- static: false,
203
- private: false,
204
- access: {
205
- has: (obj) => "valueAsNumber" in obj,
206
- set: (obj, value) => {
207
- obj.valueAsNumber = value;
208
- }
209
- },
210
- metadata: _metadata
211
- }, null, _instanceExtraInitializers);
212
- __esDecorate(this, null, _set_min_decorators, {
213
- kind: "setter",
214
- name: "min",
215
- static: false,
216
- private: false,
217
- access: {
218
- has: (obj) => "min" in obj,
219
- set: (obj, value) => {
220
- obj.min = value;
221
- }
222
- },
223
- metadata: _metadata
224
- }, null, _instanceExtraInitializers);
225
- __esDecorate(this, null, _set_max_decorators, {
226
- kind: "setter",
227
- name: "max",
228
- static: false,
229
- private: false,
230
- access: {
231
- has: (obj) => "max" in obj,
232
- set: (obj, value) => {
233
- obj.max = value;
234
- }
235
- },
236
- metadata: _metadata
237
- }, null, _instanceExtraInitializers);
238
- __esDecorate(this, null, _startIcon_decorators, {
239
- kind: "accessor",
240
- name: "startIcon",
241
- static: false,
242
- private: false,
243
- access: {
244
- has: (obj) => "startIcon" in obj,
245
- get: (obj) => obj.startIcon,
246
- set: (obj, value) => {
247
- obj.startIcon = value;
248
- }
249
- },
250
- metadata: _metadata
251
- }, _startIcon_initializers, _startIcon_extraInitializers);
252
- __esDecorate(this, null, _endIcon_decorators, {
253
- kind: "accessor",
254
- name: "endIcon",
255
- static: false,
256
- private: false,
257
- access: {
258
- has: (obj) => "endIcon" in obj,
259
- get: (obj) => obj.endIcon,
260
- set: (obj, value) => {
261
- obj.endIcon = value;
262
- }
263
- },
264
- metadata: _metadata
265
- }, _endIcon_initializers, _endIcon_extraInitializers);
266
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, {
267
- kind: "class",
268
- name: _classThis.name,
269
- metadata: _metadata
270
- }, null, _classExtraInitializers);
271
- SbbSliderElement = _classThis = _classDescriptor.value;
272
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, {
273
- enumerable: true,
274
- configurable: true,
275
- writable: true,
276
- value: _metadata
277
- });
278
- }
279
- static {
280
- this.elementName = "sbb-slider";
281
- }
282
- static {
283
- this.role = "slider";
284
- }
285
- static {
286
- this.styles = [boxSizingStyles, slider_default];
287
- }
288
- static {
289
- this.events = { didChange: "didChange" };
290
- }
291
- /**
292
- * Value of the form element.
293
- * If no value is provided, default is the middle point between min and max.
294
- */
295
- set value(value) {
296
- if (this._isValidNumber(value)) this._value = this._boundBetweenMinMax(value);
297
- else this._value = null;
298
- this.internals.ariaValueNow = this.value;
299
- }
300
- get value() {
301
- return this._value ?? this._defaultValue();
302
- }
303
- /** Numeric value for the inner HTMLInputElement. */
304
- set valueAsNumber(value) {
305
- this.value = value?.toString() ?? null;
306
- }
307
- get valueAsNumber() {
308
- return Number(this.value);
309
- }
310
- /** Minimum acceptable value for the inner HTMLInputElement. */
311
- set min(value) {
312
- if (!this._isValidNumber(value)) return;
313
- this._min = value;
314
- this.internals.ariaValueMin = this.min;
315
- const boundValue = this._boundBetweenMinMax(this.value);
316
- if (this.value !== boundValue) this.value = boundValue;
317
- }
318
- get min() {
319
- return this._min;
320
- }
321
- /** Maximum acceptable value for the inner HTMLInputElement. */
322
- set max(value) {
323
- if (!this._isValidNumber(value)) return;
324
- this._max = value;
325
- this.internals.ariaValueMax = this.max;
326
- const boundValue = this._boundBetweenMinMax(this.value);
327
- if (this.value !== boundValue) this.value = boundValue;
328
- }
329
- get max() {
330
- return this._max;
331
- }
332
- #startIcon_accessor_storage;
333
- /** Name of the icon at component's start, which will be forward to the nested `sbb-icon`. */
334
- get startIcon() {
335
- return this.#startIcon_accessor_storage;
336
- }
337
- set startIcon(value) {
338
- this.#startIcon_accessor_storage = value;
339
- }
340
- #endIcon_accessor_storage;
341
- /** Name of the icon at component's end, which will be forward to the nested `sbb-icon`. */
342
- get endIcon() {
343
- return this.#endIcon_accessor_storage;
344
- }
345
- set endIcon(value) {
346
- this.#endIcon_accessor_storage = value;
347
- }
348
- /**
349
- * Form type of element.
350
- * @default 'range'
351
- */
352
- get type() {
353
- return "range";
354
- }
355
- constructor() {
356
- super();
357
- this._value = (__runInitializers(this, _instanceExtraInitializers), null);
358
- this._min = "0";
359
- this._max = "100";
360
- this.#startIcon_accessor_storage = __runInitializers(this, _startIcon_initializers, "");
361
- this.#endIcon_accessor_storage = (__runInitializers(this, _startIcon_extraInitializers), __runInitializers(this, _endIcon_initializers, ""));
362
- /** Reference to the inner HTMLInputElement with type='range'. */
363
- this._rangeInput = __runInitializers(this, _endIcon_extraInitializers);
364
- this.addEventListener?.("keydown", (e) => this._handleKeydown(e));
365
- }
366
- willUpdate(changedProperties) {
367
- super.willUpdate(changedProperties);
368
- if (changedProperties.has("readOnly")) this.internals.ariaReadOnly = Boolean(this.readOnly).toString();
369
- this.style?.setProperty("--sbb-slider-value-fraction", this._valueFraction().toString());
370
- }
371
- /**
372
- * The reset value is the attribute value (the setup value). If not present, calculates the default.
373
- * @internal
374
- */
375
- formResetCallback() {
376
- this.value = this.getAttribute("value") ?? this._defaultValue();
377
- }
378
- /**
379
- * @internal
380
- */
381
- formStateRestoreCallback(state, _reason) {
382
- this.value = state;
383
- }
384
- /**
385
- * If no value is provided, default is the middle point between min and max
386
- * (see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/range#value)
387
- */
388
- _defaultValue() {
389
- return (+this.min + (+this.max - +this.min) / 2).toString();
390
- }
391
- _isValidNumber(value) {
392
- return !!value && !isNaN(Number(value));
393
- }
394
- /**
395
- * Restrains the value between the min and max
396
- */
397
- _boundBetweenMinMax(value) {
398
- return Math.max(+this.min, Math.min(+this.max, +value)).toString();
399
- }
400
- _valueFraction() {
401
- const value = this.valueAsNumber;
402
- const min = +this.min;
403
- const max = +this.max;
404
- const mathFraction = (value - min) / (max - min);
405
- return isNaN(mathFraction) ? 0 : Math.max(0, Math.min(1, mathFraction));
406
- }
407
- async _handleKeydown(event) {
408
- if (event.key !== "Tab") event.preventDefault();
409
- if (this.readOnly) return;
410
- if (event.key === "Home") this._rangeInput.value = this.min;
411
- else if (event.key === "End") this._rangeInput.value = this.max;
412
- else if (event.key === "ArrowLeft" || event.key === "ArrowDown") this._rangeInput.stepDown();
413
- else if (event.key === "ArrowRight" || event.key === "ArrowUp") this._rangeInput.stepUp();
414
- else if (event.key === "PageDown") this._rangeInput.stepDown((+this.max - +this.min) / 10);
415
- else if (event.key === "PageUp") this._rangeInput.stepUp((+this.max - +this.min) / 10);
416
- else return;
417
- this._rangeInput.dispatchEvent(new InputEvent("input", {
418
- bubbles: true,
419
- cancelable: true,
420
- composed: true
421
- }));
422
- this._rangeInput.dispatchEvent(new Event("change", { bubbles: true }));
423
- }
424
- /** Emits the change event. */
425
- _dispatchChangeEvent() {
426
- /**
427
- * The change event is fired when the user modifies the element's value.
428
- * Unlike the input event, the change event is not necessarily fired
429
- * for each alteration to an element's value.
430
- */
431
- this.dispatchEvent(new Event("change", { bubbles: true }));
432
- /**
433
- * Deprecated. Mirrors change event for React. Will be removed once React properly supports change events.
434
- * @deprecated
435
- */
436
- this.dispatchEvent(new Event("didChange", { bubbles: true }));
437
- }
438
- render() {
439
- return html`
440
- <div class="sbb-slider__height-container">
441
- <div class="sbb-slider__wrapper">
442
- <slot name="prefix">
443
- ${this.startIcon ? html`<sbb-icon name="${this.startIcon}"></sbb-icon>` : nothing}
444
- </slot>
445
- <div class="sbb-slider__container">
446
- <input
447
- tabindex="-1"
448
- min=${this.min}
449
- max=${this.max}
450
- ?disabled=${this.disabled || this.formDisabled || this.readOnly}
451
- value=${this.value || nothing}
452
- class="sbb-slider__range-input"
453
- type="range"
454
- @change=${() => this._dispatchChangeEvent()}
455
- @input=${() => this.value = this._rangeInput.value}
456
- ${ref((input) => this._rangeInput = input)}
457
- />
458
- <div class="sbb-slider__line">
459
- <div class="sbb-slider__selected-line"></div>
460
- </div>
461
- <div class="sbb-slider__knob"></div>
462
- </div>
463
- <slot name="suffix">
464
- ${this.endIcon ? html`<sbb-icon name="${this.endIcon}"></sbb-icon>` : nothing}
465
- </slot>
466
- </div>
467
- </div>
468
- `;
469
- }
470
- static {
471
- __runInitializers(_classThis, _classExtraInitializers);
472
- }
473
- };
474
- return _classThis;
475
- })();
476
- //#endregion
477
- export { SbbSliderElement as t };
478
-
479
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC13X1d0Vk54LS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2xpZGVyL3NsaWRlci5zY3NzP2xpdCZpbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2xpZGVyL3NsaWRlci5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAvLyBVc2UgIWltcG9ydGFudCBoZXJlIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBGaXJlZm94IGZvY3VzIHJpbmcgZGVmaW5pdGlvblxuICAvLyB3aGljaCBhcHBlYXJzIGluIG5vcm1hbGl6ZSBDU1Mgb2Ygc2V2ZXJhbCBmcmFtZXdvcmtzLlxuICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWluLXdpZHRoOiAje3NiYi5weC10by1yZW0tYnVpbGQoMTUwKX07XG4gIHdpZHRoOiBtaW4oI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDQwMCl9LCAxMDAlKTtcblxuICAtLXNiYi1zbGlkZXItbGluZS1oZWlnaHQ6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCg0KX07XG4gIC0tc2JiLXNsaWRlci12YWx1ZS1mcmFjdGlvbjogMDtcbiAgLS1zYmItc2xpZGVyLWtub2Itc2l6ZTogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDI4KX07XG4gIC0tc2JiLXNsaWRlci1rbm9iLXNpemUtYWN0aXZlOiAje3NiYi5weC10by1yZW0tYnVpbGQoMzEpfTtcbiAgLS1zYmItc2xpZGVyLWtub2ItYm9yZGVyLXNpemU6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgzKX07XG4gIC0tc2JiLXNsaWRlci1rbm9iLWJvcmRlci1zdHlsZTogc29saWQ7XG4gIC0tc2JiLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci0xKTtcbiAgLS1zYmItc2xpZGVyLWtub2ItYm9yZGVyLWNvbG9yOiB2YXIoLS1zYmItY29sb3ItcHJpbWFyeSk7XG4gIC0tc2JiLXNsaWRlci1pY29uLWNvbG9yOiB2YXIoLS1zYmItY29sb3ItMSk7XG4gIC0tc2JiLXNsaWRlci1zZWxlY3RlZC1saW5lLWNvbG9yOiB2YXIoLS1zYmItY29sb3ItcHJpbWFyeSk7XG4gIC0tc2JiLXNsaWRlci1zZWxlY3RlZC1saW5lLWRpc2FibGVkLWNvbG9yOiBsaWdodC1kYXJrKFxuICAgIHZhcigtLXNiYi1jb2xvci1zbW9rZSksXG4gICAgdmFyKC0tc2JiLWNvbG9yLWNlbWVudClcbiAgKTtcbiAgLS1zYmItc2xpZGVyLWxpbmUtY29sb3I6IHZhcigtLXNiYi1ib3JkZXItY29sb3ItNSk7XG4gIC0tc2JiLXNsaWRlci1saW5lLWRpc2FibGVkLWNvbG9yOiBsaWdodC1kYXJrKHZhcigtLXNiYi1jb2xvci1ncmFwaGl0ZSksIHZhcigtLXNiYi1jb2xvci1ncmFuaXRlKSk7XG5cbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIC0tc2JiLXNsaWRlci1zZWxlY3RlZC1saW5lLWNvbG9yOiBIaWdobGlnaHQ7XG4gICAgLS1zYmItc2xpZGVyLWxpbmUtY29sb3I6IENhbnZhc1RleHQ7XG4gIH1cbn1cblxuOmhvc3QoOmRpc2FibGVkKSB7XG4gIC0tc2JiLXNsaWRlci1pY29uLWNvbG9yOiBsaWdodC1kYXJrKHZhcigtLXNiYi1jb2xvci1ncmFwaGl0ZSksIHZhcigtLXNiYi1jb2xvci1zbW9rZSkpO1xuICAtLXNiYi1zbGlkZXIta25vYi1ib3JkZXItY29sb3I6IHZhcigtLXNiYi1ib3JkZXItY29sb3ItNSk7XG4gIC0tc2JiLXNsaWRlci1rbm9iLWJvcmRlci1zaXplOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTJ4KTtcbiAgLS1zYmItc2xpZGVyLWtub2ItYm9yZGVyLXN0eWxlOiBkYXNoZWQ7XG59XG5cbjpob3N0KFtyZWFkb25seV0pIHtcbiAgLS1zYmItc2xpZGVyLWljb24tY29sb3I6IHZhcigtLXNiYi1jb2xvci01KTtcbiAgLS1zYmItc2xpZGVyLWtub2ItYm9yZGVyLWNvbG9yOiB2YXIoLS1zYmItc2xpZGVyLXNlbGVjdGVkLWxpbmUtZGlzYWJsZWQtY29sb3IpO1xufVxuXG46aG9zdCg6ZGlzYWJsZWQpLFxuOmhvc3QoW3JlYWRvbmx5XSkge1xuICAtLXNiYi1zbGlkZXItbGluZS1jb2xvcjogdmFyKC0tc2JiLXNsaWRlci1saW5lLWRpc2FibGVkLWNvbG9yKTtcbiAgLS1zYmItc2xpZGVyLXNlbGVjdGVkLWxpbmUtY29sb3I6IHZhcigtLXNiYi1zbGlkZXItc2VsZWN0ZWQtbGluZS1kaXNhYmxlZC1jb2xvcik7XG5cbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIC0tc2JiLXNsaWRlci1pY29uLWNvbG9yOiBHcmF5VGV4dDtcbiAgICAtLXNiYi1zbGlkZXItc2VsZWN0ZWQtbGluZS1kaXNhYmxlZC1jb2xvcjogR3JheVRleHQ7XG4gICAgLS1zYmItc2xpZGVyLWxpbmUtZGlzYWJsZWQtY29sb3I6IEdyYXlUZXh0O1xuICB9XG59XG5cbi5zYmItc2xpZGVyX19oZWlnaHQtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICBAaW5jbHVkZSBzYmIuemVyby13aWR0aC1zcGFjZTtcbn1cblxuLnNiYi1zbGlkZXJfX3dyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbiAgcGFkZGluZy1ibG9jazogY2FsYyh2YXIoLS1zYmItc3BhY2luZy1maXhlZC0xeCkgLyAyKTtcbiAgY29sb3I6IHZhcigtLXNiYi1zbGlkZXItaWNvbi1jb2xvcik7XG59XG5cbi5zYmItc2xpZGVyX19jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IHZhcigtLXNiYi1zaXplLWljb24tdWktc21hbGwpO1xuICBmbGV4LWdyb3c6IDE7XG59XG5cbi5zYmItc2xpZGVyX19yYW5nZS1pbnB1dCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGluc2V0OiAwO1xuICBvcGFjaXR5OiAwO1xuICBtYXJnaW46IDA7XG59XG5cbi5zYmItc2xpZGVyX19saW5lIHtcbiAgQGluY2x1ZGUgc2JiLmFic29sdXRlLWNlbnRlci15O1xuXG4gIGhlaWdodDogdmFyKC0tc2JiLXNsaWRlci1saW5lLWhlaWdodCk7XG4gIHdpZHRoOiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItc2xpZGVyLWxpbmUtY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItc2xpZGVyLWxpbmUtaGVpZ2h0KTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5zYmItc2xpZGVyX19zZWxlY3RlZC1saW5lIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1zbGlkZXItc2VsZWN0ZWQtbGluZS1jb2xvcik7XG4gIHdpZHRoOiBjYWxjKHZhcigtLXNiYi1zbGlkZXItdmFsdWUtZnJhY3Rpb24pICogMTAwJSk7XG59XG5cbi5zYmItc2xpZGVyX19rbm9iIHtcbiAgQGluY2x1ZGUgc2JiLmFic29sdXRlLWNlbnRlci15O1xuXG4gIGJveC1zaGFkb3c6IHZhcigtLXNiYi1ib3gtc2hhZG93LWxldmVsLTUtaGFyZCk7XG4gIHdpZHRoOiB2YXIoLS1zYmItc2xpZGVyLWtub2Itc2l6ZSk7XG4gIGhlaWdodDogdmFyKC0tc2JiLXNsaWRlci1rbm9iLXNpemUpO1xuICBpbnNldC1pbmxpbmUtc3RhcnQ6IGNhbGMoXG4gICAgY2FsYyh2YXIoLS1zYmItc2xpZGVyLXZhbHVlLWZyYWN0aW9uKSAqIDEwMCUpIC0gdmFyKC0tc2JiLXNsaWRlci1rbm9iLXNpemUpICpcbiAgICAgIHZhcigtLXNiYi1zbGlkZXItdmFsdWUtZnJhY3Rpb24pXG4gICk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHdpZHRoLCBoZWlnaHQ7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXNiYi1kaXNhYmxlLWFuaW1hdGlvbi1kdXJhdGlvbiwgdmFyKC0tc2JiLWFuaW1hdGlvbi1kdXJhdGlvbi0xeCkpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLXNsaWRlci1rbm9iLWNvbG9yKTtcbiAgYm9yZGVyOiB2YXIoLS1zYmItc2xpZGVyLWtub2ItYm9yZGVyLXNpemUpIHZhcigtLXNiYi1zbGlkZXIta25vYi1ib3JkZXItc3R5bGUpXG4gICAgdmFyKC0tc2JiLXNsaWRlci1rbm9iLWJvcmRlci1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG5cbiAgOmhvc3QoOmZvY3VzLXZpc2libGUpICYge1xuICAgIEBpbmNsdWRlIHNiYi5mb2N1cy1vdXRsaW5lO1xuXG4gICAgLS1zYmItc2xpZGVyLWtub2Itc2l6ZTogdmFyKC0tc2JiLXNsaWRlci1rbm9iLXNpemUtYWN0aXZlKTtcbiAgfVxuXG4gIC8vIHNsaWRlciBrbm9iIHJlc2l6ZSBvbiBjbGljayAoYWN0aXZlIC8gZm9jdXMpXG4gIDpob3N0KDpub3QoOmlzKDpkaXNhYmxlZCwgW3JlYWRvbmx5XSkpKSAuc2JiLXNsaWRlcl9fcmFuZ2UtaW5wdXQ6YWN0aXZlIH4gJiB7XG4gICAgLS1zYmItc2xpZGVyLWtub2Itc2l6ZTogdmFyKC0tc2JiLXNsaWRlci1rbm9iLXNpemUtYWN0aXZlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCwgUHJvcGVydHlWYWx1ZXMsIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyByZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuXG5pbXBvcnQgeyBTYmJFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLnRzJztcbmltcG9ydCB7IGZvcmNlVHlwZSwgaG9zdEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9jb3JlL2RlY29yYXRvcnMudHMnO1xuaW1wb3J0IHtcbiAgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbixcbiAgdHlwZSBGb3JtUmVzdG9yZVN0YXRlLFxuICBTYmJEaXNhYmxlZE1peGluLFxuICBTYmJGb3JtQXNzb2NpYXRlZE1peGluLFxuICBTYmJSZWFkb25seU1peGluLFxufSBmcm9tICcuLi9jb3JlL21peGlucy50cyc7XG5pbXBvcnQgeyBib3hTaXppbmdTdHlsZXMgfSBmcm9tICcuLi9jb3JlL3N0eWxlcy50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3NsaWRlci5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJy4uL2ljb24udHMnO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGFuIGlucHV0IGtub2IgdGhhdCBjYW4gYmUgbW92ZWQgaW4gYSByYW5nZS5cbiAqXG4gKiBAc2xvdCBwcmVmaXggLSBVc2UgdGhpcyBzbG90IHRvIHJlbmRlciBhbiBpY29uIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGlucHV0LlxuICogQHNsb3Qgc3VmZml4IC0gVXNlIHRoaXMgc2xvdCB0byByZW5kZXIgYW4gaWNvbiBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5wdXQuXG4gKiBAZXZlbnQge0lucHV0RXZlbnR9IGlucHV0IC0gVGhlIGlucHV0IGV2ZW50IGZpcmVzIHdoZW4gdGhlIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgYXMgYSBkaXJlY3QgcmVzdWx0IG9mIGEgdXNlciBhY3Rpb24uXG4gKi9cbmV4cG9ydFxuQGhvc3RBdHRyaWJ1dGVzKHtcbiAgdGFiaW5kZXg6ICcwJyxcbn0pXG5jbGFzcyBTYmJTbGlkZXJFbGVtZW50IGV4dGVuZHMgU2JiRGlzYWJsZWRNaXhpbihcbiAgU2JiUmVhZG9ubHlNaXhpbihTYmJGb3JtQXNzb2NpYXRlZE1peGluKFNiYkVsZW1lbnQpKSxcbikge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXNsaWRlcic7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgcm9sZSA9ICdzbGlkZXInO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYm94U2l6aW5nU3R5bGVzLCBzdHlsZV07XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRpZENoYW5nZTogJ2RpZENoYW5nZScsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRoZSBmb3JtIGVsZW1lbnQuXG4gICAqIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCBkZWZhdWx0IGlzIHRoZSBtaWRkbGUgcG9pbnQgYmV0d2VlbiBtaW4gYW5kIG1heC5cbiAgICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNWYWxpZE51bWJlcih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fYm91bmRCZXR3ZWVuTWluTWF4KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmludGVybmFscy5hcmlhVmFsdWVOb3cgPSB0aGlzLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgPz8gdGhpcy5fZGVmYXVsdFZhbHVlKCk7XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBOdW1lcmljIHZhbHVlIGZvciB0aGUgaW5uZXIgSFRNTElucHV0RWxlbWVudC4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndmFsdWUtYXMtbnVtYmVyJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBzZXQgdmFsdWVBc051bWJlcih2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZT8udG9TdHJpbmcoKSA/PyBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWVBc051bWJlcigpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgLyoqIE1pbmltdW0gYWNjZXB0YWJsZSB2YWx1ZSBmb3IgdGhlIGlubmVyIEhUTUxJbnB1dEVsZW1lbnQuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbWluKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWROdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy5pbnRlcm5hbHMuYXJpYVZhbHVlTWluID0gdGhpcy5taW47XG4gICAgY29uc3QgYm91bmRWYWx1ZSA9IHRoaXMuX2JvdW5kQmV0d2Vlbk1pbk1heCh0aGlzLnZhbHVlKTtcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gYm91bmRWYWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGJvdW5kVmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgbWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuICBwcml2YXRlIF9taW46IHN0cmluZyA9ICcwJztcblxuICAvKiogTWF4aW11bSBhY2NlcHRhYmxlIHZhbHVlIGZvciB0aGUgaW5uZXIgSFRNTElucHV0RWxlbWVudC4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBtYXgodmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5faXNWYWxpZE51bWJlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLmludGVybmFscy5hcmlhVmFsdWVNYXggPSB0aGlzLm1heDtcbiAgICBjb25zdCBib3VuZFZhbHVlID0gdGhpcy5fYm91bmRCZXR3ZWVuTWluTWF4KHRoaXMudmFsdWUpO1xuICAgIGlmICh0aGlzLnZhbHVlICE9PSBib3VuZFZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gYm91bmRWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBtYXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG4gIHByaXZhdGUgX21heDogc3RyaW5nID0gJzEwMCc7XG5cbiAgLyoqIE5hbWUgb2YgdGhlIGljb24gYXQgY29tcG9uZW50J3Mgc3RhcnQsIHdoaWNoIHdpbGwgYmUgZm9yd2FyZCB0byB0aGUgbmVzdGVkIGBzYmItaWNvbmAuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzdGFydC1pY29uJyB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc3RhcnRJY29uOiBzdHJpbmcgPSAnJztcblxuICAvKiogTmFtZSBvZiB0aGUgaWNvbiBhdCBjb21wb25lbnQncyBlbmQsIHdoaWNoIHdpbGwgYmUgZm9yd2FyZCB0byB0aGUgbmVzdGVkIGBzYmItaWNvbmAuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdlbmQtaWNvbicgfSlcbiAgcHVibGljIGFjY2Vzc29yIGVuZEljb246IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBGb3JtIHR5cGUgb2YgZWxlbWVudC5cbiAgICogQGRlZmF1bHQgJ3JhbmdlJ1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdyYW5nZSc7XG4gIH1cblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBpbm5lciBIVE1MSW5wdXRFbGVtZW50IHdpdGggdHlwZT0ncmFuZ2UnLiAqL1xuICBwcml2YXRlIF9yYW5nZUlucHV0ITogSFRNTElucHV0RWxlbWVudDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Ligna2V5ZG93bicsIChlKSA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGUpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncmVhZE9ubHknKSkge1xuICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYVJlYWRPbmx5ID0gQm9vbGVhbih0aGlzLnJlYWRPbmx5KS50b1N0cmluZygpO1xuICAgIH1cbiAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2xpZGVyLXZhbHVlLWZyYWN0aW9uJywgdGhpcy5fdmFsdWVGcmFjdGlvbigpLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXNldCB2YWx1ZSBpcyB0aGUgYXR0cmlidXRlIHZhbHVlICh0aGUgc2V0dXAgdmFsdWUpLiBJZiBub3QgcHJlc2VudCwgY2FsY3VsYXRlcyB0aGUgZGVmYXVsdC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpID8/IHRoaXMuX2RlZmF1bHRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgX3JlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBzdGF0ZSBhcyBzdHJpbmcgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqICBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgZGVmYXVsdCBpcyB0aGUgbWlkZGxlIHBvaW50IGJldHdlZW4gbWluIGFuZCBtYXhcbiAgICogIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0L3JhbmdlI3ZhbHVlKVxuICAgKi9cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICgrdGhpcy5taW4gKyAoK3RoaXMubWF4IC0gK3RoaXMubWluKSAvIDIpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIF9pc1ZhbGlkTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAhaXNOYU4oTnVtYmVyKHZhbHVlKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdHJhaW5zIHRoZSB2YWx1ZSBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heFxuICAgKi9cbiAgcHJpdmF0ZSBfYm91bmRCZXR3ZWVuTWluTWF4KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBNYXRoLm1heCgrdGhpcy5taW4sIE1hdGgubWluKCt0aGlzLm1heCwgK3ZhbHVlKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbHVlRnJhY3Rpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVBc051bWJlciE7XG4gICAgY29uc3QgbWluID0gK3RoaXMubWluO1xuICAgIGNvbnN0IG1heCA9ICt0aGlzLm1heDtcblxuICAgIGNvbnN0IG1hdGhGcmFjdGlvbjogbnVtYmVyID0gKHZhbHVlIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICAgIHJldHVybiBpc05hTihtYXRoRnJhY3Rpb24pID8gMCA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG1hdGhGcmFjdGlvbikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChldmVudC5rZXkgIT09ICdUYWInKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICB0aGlzLl9yYW5nZUlucHV0LnZhbHVlID0gdGhpcy5taW47XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbmQnKSB7XG4gICAgICB0aGlzLl9yYW5nZUlucHV0LnZhbHVlID0gdGhpcy5tYXg7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQuc3RlcERvd24oKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICB0aGlzLl9yYW5nZUlucHV0LnN0ZXBVcCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnUGFnZURvd24nKSB7XG4gICAgICB0aGlzLl9yYW5nZUlucHV0LnN0ZXBEb3duKCgrdGhpcy5tYXggLSArdGhpcy5taW4pIC8gMTApO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnUGFnZVVwJykge1xuICAgICAgdGhpcy5fcmFuZ2VJbnB1dC5zdGVwVXAoKCt0aGlzLm1heCAtICt0aGlzLm1pbikgLyAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXZSBoYXZlIHRvIG1hbnVhbGx5IGZpcmUgZXZlbnRzIGJlY2F1c2UgcHJvZ3JhbW1hdGljIGNoYW5nZXMgZG9uJ3QgdHJpZ2dlciB0aGVtXG4gICAgdGhpcy5fcmFuZ2VJbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IElucHV0RXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KSxcbiAgICApO1xuICAgIHRoaXMuX3JhbmdlSW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gIH1cblxuICAvKiogRW1pdHMgdGhlIGNoYW5nZSBldmVudC4gKi9cbiAgcHJpdmF0ZSBfZGlzcGF0Y2hDaGFuZ2VFdmVudCgpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hhbmdlIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHVzZXIgbW9kaWZpZXMgdGhlIGVsZW1lbnQncyB2YWx1ZS5cbiAgICAgKiBVbmxpa2UgdGhlIGlucHV0IGV2ZW50LCB0aGUgY2hhbmdlIGV2ZW50IGlzIG5vdCBuZWNlc3NhcmlseSBmaXJlZFxuICAgICAqIGZvciBlYWNoIGFsdGVyYXRpb24gdG8gYW4gZWxlbWVudCdzIHZhbHVlLlxuICAgICAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBNaXJyb3JzIGNoYW5nZSBldmVudCBmb3IgUmVhY3QuIFdpbGwgYmUgcmVtb3ZlZCBvbmNlIFJlYWN0IHByb3Blcmx5IHN1cHBvcnRzIGNoYW5nZSBldmVudHMuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdkaWRDaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNsaWRlcl9faGVpZ2h0LWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNsaWRlcl9fd3JhcHBlclwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJwcmVmaXhcIj5cbiAgICAgICAgICAgICR7dGhpcy5zdGFydEljb24gPyBodG1sYDxzYmItaWNvbiBuYW1lPVwiJHt0aGlzLnN0YXJ0SWNvbn1cIj48L3NiYi1pY29uPmAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvc2xvdD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNsaWRlcl9fY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIG1pbj0ke3RoaXMubWlufVxuICAgICAgICAgICAgICBtYXg9JHt0aGlzLm1heH1cbiAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1EaXNhYmxlZCB8fCB0aGlzLnJlYWRPbmx5fVxuICAgICAgICAgICAgICB2YWx1ZT0ke3RoaXMudmFsdWUgfHwgbm90aGluZ31cbiAgICAgICAgICAgICAgY2xhc3M9XCJzYmItc2xpZGVyX19yYW5nZS1pbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgIEBjaGFuZ2U9JHsoKSA9PiB0aGlzLl9kaXNwYXRjaENoYW5nZUV2ZW50KCl9XG4gICAgICAgICAgICAgIEBpbnB1dD0keygpID0+ICh0aGlzLnZhbHVlID0gdGhpcy5fcmFuZ2VJbnB1dC52YWx1ZSl9XG4gICAgICAgICAgICAgICR7cmVmKChpbnB1dD86IEVsZW1lbnQpID0+ICh0aGlzLl9yYW5nZUlucHV0ID0gaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19saW5lXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19zZWxlY3RlZC1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19rbm9iXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInN1ZmZpeFwiPlxuICAgICAgICAgICAgJHt0aGlzLmVuZEljb24gPyBodG1sYDxzYmItaWNvbiBuYW1lPVwiJHt0aGlzLmVuZEljb259XCI+PC9zYmItaWNvbj5gIDogbm90aGluZ31cbiAgICAgICAgICA8L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNsaWRlcic6IFNiYlNsaWRlckVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDK0JNLDBCQUFnQjt5QkFIckIsZUFBZSxFQUNkLFVBQVUsS0FDWCxDQUFDLENBQUE7Ozs7bUJBQzZCLGlCQUM3QixpQkFBaUIsdUJB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