@sbb-esta/lyne-elements 1.11.3 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/_index.scss +1 -1
  2. package/core/i18n/i18n.d.ts +5 -0
  3. package/core/i18n/i18n.d.ts.map +1 -1
  4. package/core/i18n.js +85 -55
  5. package/core/styles/lists.scss +4 -0
  6. package/core/styles/mixins/lists.scss +128 -76
  7. package/custom-elements.json +774 -76
  8. package/development/core/i18n/i18n.d.ts +5 -0
  9. package/development/core/i18n/i18n.d.ts.map +1 -1
  10. package/development/core/i18n.js +36 -1
  11. package/development/paginator/index.d.ts +2 -0
  12. package/development/paginator/index.d.ts.map +1 -0
  13. package/development/paginator/paginator.d.ts +91 -0
  14. package/development/paginator/paginator.d.ts.map +1 -0
  15. package/development/paginator.d.ts +2 -0
  16. package/development/paginator.d.ts.map +1 -0
  17. package/development/paginator.js +526 -0
  18. package/development/radio-button/radio-button-group/radio-button-group.d.ts +1 -1
  19. package/development/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  20. package/development/radio-button/radio-button-group.js +16 -12
  21. package/development/select/select.d.ts +6 -0
  22. package/development/select/select.d.ts.map +1 -1
  23. package/development/select.js +22 -2
  24. package/development/slider/slider.d.ts +35 -16
  25. package/development/slider/slider.d.ts.map +1 -1
  26. package/development/slider.js +102 -81
  27. package/index.d.ts +2 -0
  28. package/index.js +2 -0
  29. package/lists.css +102 -36
  30. package/package.json +6 -1
  31. package/paginator/index.d.ts +2 -0
  32. package/paginator/index.d.ts.map +1 -0
  33. package/paginator/paginator.d.ts +91 -0
  34. package/paginator/paginator.d.ts.map +1 -0
  35. package/paginator.d.ts +2 -0
  36. package/paginator.d.ts.map +1 -0
  37. package/paginator.js +263 -0
  38. package/radio-button/radio-button-group/radio-button-group.d.ts +1 -1
  39. package/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  40. package/radio-button/radio-button-group.js +11 -7
  41. package/select/select.d.ts +6 -0
  42. package/select/select.d.ts.map +1 -1
  43. package/select.js +40 -24
  44. package/slider/slider.d.ts +35 -16
  45. package/slider/slider.d.ts.map +1 -1
  46. package/slider.js +111 -78
  47. package/standard-theme.css +102 -36
@@ -4,9 +4,8 @@ import { ref } from "lit/directives/ref.js";
4
4
  import { styleMap } from "lit/directives/style-map.js";
5
5
  import { SbbConnectedAbortController } from "./core/controllers.js";
6
6
  import { hostAttributes } from "./core/decorators.js";
7
- import { setOrRemoveAttribute } from "./core/dom.js";
8
7
  import { EventEmitter, forwardEventToHost } from "./core/eventing.js";
9
- import { SbbDisabledMixin } from "./core/mixins.js";
8
+ import { SbbDisabledMixin, SbbFormAssociatedMixin } from "./core/mixins.js";
10
9
  import "./icon.js";
11
10
  const style = css`@charset "UTF-8";
12
11
  /** This mixin can be used to avoid spacing problems by inserting an invisible space as pseudo element. */
@@ -48,7 +47,7 @@ const style = css`@charset "UTF-8";
48
47
  }
49
48
  }
50
49
 
51
- :host([disabled]) {
50
+ :host(:disabled) {
52
51
  --sbb-slider-icon-color: var(--sbb-color-graphite);
53
52
  --sbb-slider-knob-border-color: var(--sbb-color-smoke);
54
53
  --sbb-slider-knob-border-size: var(--sbb-border-width-2x);
@@ -60,13 +59,13 @@ const style = css`@charset "UTF-8";
60
59
  --sbb-slider-knob-border-color: var(--sbb-slider-selected-line-disabled-color);
61
60
  }
62
61
 
63
- :host([disabled]),
62
+ :host(:disabled),
64
63
  :host([readonly]) {
65
64
  --sbb-slider-line-color: var(--sbb-slider-line-disabled-color);
66
65
  --sbb-slider-selected-line-color: var(--sbb-slider-selected-line-disabled-color);
67
66
  }
68
67
  @media (forced-colors: active) {
69
- :host([disabled]),
68
+ :host(:disabled),
70
69
  :host([readonly]) {
71
70
  --sbb-slider-icon-color: GrayText;
72
71
  --sbb-slider-selected-line-disabled-color: GrayText;
@@ -146,7 +145,7 @@ const style = css`@charset "UTF-8";
146
145
  outline: var(--sbb-focus-outline-color) solid var(--sbb-focus-outline-width);
147
146
  --sbb-slider-knob-size: var(--sbb-slider-knob-size-active);
148
147
  }
149
- :host(:not(:is([disabled], [readonly]))) .sbb-slider__range-input:active ~ .sbb-slider__knob {
148
+ :host(:not(:is(:disabled, [readonly]))) .sbb-slider__range-input:active ~ .sbb-slider__knob {
150
149
  --sbb-slider-knob-size: var(--sbb-slider-knob-size-active);
151
150
  }`;
152
151
  var __defProp = Object.defineProperty;
@@ -159,13 +158,11 @@ var __decorateClass = (decorators, target, key, kind) => {
159
158
  if (kind && result) __defProp(target, key, result);
160
159
  return result;
161
160
  };
162
- let SbbSliderElement = class extends SbbDisabledMixin(LitElement) {
161
+ let SbbSliderElement = class extends SbbDisabledMixin(SbbFormAssociatedMixin(LitElement)) {
163
162
  constructor() {
164
- super(...arguments);
165
- this.value = "";
166
- this.name = "";
167
- this.min = "0";
168
- this.max = "100";
163
+ super();
164
+ this._min = "0";
165
+ this._max = "100";
169
166
  this.readonly = false;
170
167
  this._valueFraction = 0;
171
168
  this._didChange = new EventEmitter(this, SbbSliderElement.events.didChange, {
@@ -173,96 +170,128 @@ let SbbSliderElement = class extends SbbDisabledMixin(LitElement) {
173
170
  cancelable: true
174
171
  });
175
172
  this._abort = new SbbConnectedAbortController(this);
173
+ this.internals.role = "slider";
174
+ }
175
+ set value(value) {
176
+ if (this._isValidNumber(value)) {
177
+ super.value = this._boundBetweenMinMax(value);
178
+ } else {
179
+ super.value = this._getDefaultValue();
180
+ }
181
+ this.internals.ariaValueNow = this.value;
182
+ this._calculateValueFraction();
183
+ }
184
+ get value() {
185
+ return super.value;
186
+ }
187
+ set valueAsNumber(value) {
188
+ this.value = value == null ? void 0 : value.toString();
189
+ }
190
+ get valueAsNumber() {
191
+ return Number(this.value);
192
+ }
193
+ set min(value) {
194
+ if (!this._isValidNumber(value)) {
195
+ return;
196
+ }
197
+ this._min = value;
198
+ this.value = this._boundBetweenMinMax(this.value);
199
+ }
200
+ get min() {
201
+ return this._min;
202
+ }
203
+ set max(value) {
204
+ if (!this._isValidNumber(value)) {
205
+ return;
206
+ }
207
+ this._max = value;
208
+ this.value = this._boundBetweenMinMax(this.value);
209
+ }
210
+ get max() {
211
+ return this._max;
176
212
  }
177
213
  connectedCallback() {
178
214
  super.connectedCallback();
179
215
  const signal = this._abort.signal;
180
216
  this.addEventListener("keydown", (e) => this._handleKeydown(e), { signal });
181
- this._handleChange();
217
+ if (!this.value) {
218
+ this.value = this._getDefaultValue();
219
+ }
182
220
  }
183
221
  willUpdate(changedProperties) {
184
222
  super.willUpdate(changedProperties);
185
- if (changedProperties.has("value")) {
186
- this._handleChange(Number(this.value));
187
- } else if (changedProperties.has("valueAsNumber")) {
188
- this._handleChange(Number(this.valueAsNumber));
189
- }
190
223
  if (changedProperties.has("min")) {
191
- setOrRemoveAttribute(this, "aria-valuemin", this.min ?? null);
224
+ this.internals.ariaValueMin = this.min;
192
225
  }
193
226
  if (changedProperties.has("max")) {
194
- setOrRemoveAttribute(this, "aria-valuemax", this.max ?? null);
227
+ this.internals.ariaValueMax = this.max;
195
228
  }
196
229
  if (changedProperties.has("readonly")) {
197
- setOrRemoveAttribute(this, "aria-readonly", this.readonly ? "true" : null);
198
- }
199
- if (changedProperties.has("disabled")) {
200
- if (this.disabled) {
201
- this.setAttribute("aria-disabled", "true");
202
- this.removeAttribute("tabindex");
203
- } else {
204
- this.removeAttribute("aria-disabled");
205
- this.setAttribute("tabindex", "0");
206
- }
230
+ this.internals.ariaReadOnly = Boolean(this.readonly).toString();
207
231
  }
208
232
  }
209
- _syncValues(newValue) {
210
- if (newValue == null) {
211
- return;
212
- } else if (newValue && typeof newValue !== "number") {
213
- newValue = +newValue;
214
- }
215
- this.value = newValue.toString();
216
- this.valueAsNumber = newValue;
217
- setOrRemoveAttribute(this, "aria-valuenow", this.value || null);
233
+ /**
234
+ * The reset value is the attribute value (the setup value). If not present, calculates the default.
235
+ * @internal
236
+ */
237
+ formResetCallback() {
238
+ this.value = this.getAttribute("value") ?? this._getDefaultValue();
218
239
  }
219
240
  /**
220
- * Recalculates the `_valueFraction` on change to correctly display the slider knob and lines.
221
- * The first calculation happens in connectedCallback(...), so since `_rangeInput` is not yet available,
222
- * the `min` and `max` values are used; if `value` is not provided, the default value is halfway between min and max
223
- * (see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/range#value).
241
+ * @internal
224
242
  */
225
- _handleChange(value = ((_a) => (_a = this._rangeInput) == null ? void 0 : _a.valueAsNumber)()) {
226
- let min, max;
227
- if (this._rangeInput) {
228
- min = +this._rangeInput.min;
229
- max = +this._rangeInput.max;
230
- } else {
231
- min = +this.min;
232
- max = +this.max;
233
- value = this.value && this.value !== "" ? +this.value : this.valueAsNumber ? this.valueAsNumber : +this.min + (+this.max - +this.min) / 2;
234
- }
243
+ formStateRestoreCallback(state2, _reason) {
244
+ this.value = state2;
245
+ }
246
+ /**
247
+ * If no value is provided, default is the middle point between min and max
248
+ * (see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/range#value)
249
+ */
250
+ _getDefaultValue() {
251
+ return (+this.min + (+this.max - +this.min) / 2).toString();
252
+ }
253
+ _isValidNumber(value) {
254
+ return !!value && !isNaN(Number(value));
255
+ }
256
+ /**
257
+ * Restrains the value between the min and max
258
+ */
259
+ _boundBetweenMinMax(value) {
260
+ return Math.max(+this.min, Math.min(+this.max, +value)).toString();
261
+ }
262
+ _calculateValueFraction() {
263
+ const value = this.valueAsNumber;
264
+ const min = +this.min;
265
+ const max = +this.max;
235
266
  const mathFraction = (value - min) / (max - min);
236
- this._valueFraction = isNaN(mathFraction) || mathFraction < 0 ? 0 : mathFraction > 1 ? 1 : mathFraction;
237
- this._syncValues(value);
267
+ this._valueFraction = isNaN(mathFraction) ? 0 : Math.max(0, Math.min(1, mathFraction));
238
268
  }
239
269
  async _handleKeydown(event) {
240
270
  if (event.key !== "Tab") {
241
271
  event.preventDefault();
242
272
  }
243
- if (this.disabled || this.readonly) {
273
+ if (this.readonly) {
244
274
  return;
245
275
  }
246
276
  if (event.key === "Home") {
247
- this._rangeInput.value = this._rangeInput.min;
277
+ this._rangeInput.value = this.min;
248
278
  } else if (event.key === "End") {
249
- this._rangeInput.value = this._rangeInput.max;
279
+ this._rangeInput.value = this.max;
250
280
  } else if (event.key === "ArrowLeft" || event.key === "ArrowDown") {
251
281
  this._rangeInput.stepDown();
252
282
  } else if (event.key === "ArrowRight" || event.key === "ArrowUp") {
253
283
  this._rangeInput.stepUp();
254
284
  } else if (event.key === "PageDown") {
255
- this._rangeInput.stepDown((+this._rangeInput.max - +this._rangeInput.min) / 10);
285
+ this._rangeInput.stepDown((+this.max - +this.min) / 10);
256
286
  } else if (event.key === "PageUp") {
257
- this._rangeInput.stepUp((+this._rangeInput.max - +this._rangeInput.min) / 10);
287
+ this._rangeInput.stepUp((+this.max - +this.min) / 10);
258
288
  } else {
259
289
  return;
260
290
  }
261
- this._handleChange();
262
- this.dispatchEvent(
291
+ this._rangeInput.dispatchEvent(
263
292
  new InputEvent("input", { bubbles: true, cancelable: true, composed: true })
264
293
  );
265
- this._emitChange(new Event("change", { bubbles: true, cancelable: true, composed: true }));
294
+ this._rangeInput.dispatchEvent(new Event("change", { bubbles: true }));
266
295
  }
267
296
  /** Emits the change event. */
268
297
  _emitChange(event) {
@@ -282,16 +311,14 @@ let SbbSliderElement = class extends SbbDisabledMixin(LitElement) {
282
311
  >
283
312
  <input
284
313
  tabindex="-1"
285
- name=${this.name || nothing}
286
- min=${this.min || nothing}
287
- max=${this.max || nothing}
288
- ?disabled=${this.disabled || this.readonly || nothing}
289
- .valueAsNumber=${this.valueAsNumber || nothing}
314
+ min=${this.min}
315
+ max=${this.max}
316
+ ?disabled=${this.disabled || this.formDisabled || this.readonly}
290
317
  value=${this.value || nothing}
291
318
  class="sbb-slider__range-input"
292
319
  type="range"
293
320
  @change=${(event) => this._emitChange(event)}
294
- @input=${() => this._handleChange()}
321
+ @input=${() => this.value = this._rangeInput.value}
295
322
  ${ref((input) => this._rangeInput = input)}
296
323
  />
297
324
  <div class="sbb-slider__line">
@@ -313,22 +340,16 @@ SbbSliderElement.events = {
313
340
  };
314
341
  __decorateClass([
315
342
  property()
316
- ], SbbSliderElement.prototype, "value", 2);
343
+ ], SbbSliderElement.prototype, "value", 1);
317
344
  __decorateClass([
318
345
  property({ attribute: "value-as-number", type: Number })
319
- ], SbbSliderElement.prototype, "valueAsNumber", 2);
320
- __decorateClass([
321
- property({ reflect: true })
322
- ], SbbSliderElement.prototype, "name", 2);
323
- __decorateClass([
324
- property()
325
- ], SbbSliderElement.prototype, "form", 2);
346
+ ], SbbSliderElement.prototype, "valueAsNumber", 1);
326
347
  __decorateClass([
327
348
  property()
328
- ], SbbSliderElement.prototype, "min", 2);
349
+ ], SbbSliderElement.prototype, "min", 1);
329
350
  __decorateClass([
330
351
  property()
331
- ], SbbSliderElement.prototype, "max", 2);
352
+ ], SbbSliderElement.prototype, "max", 1);
332
353
  __decorateClass([
333
354
  property({ type: Boolean })
334
355
  ], SbbSliderElement.prototype, "readonly", 2);
@@ -344,10 +365,10 @@ __decorateClass([
344
365
  SbbSliderElement = __decorateClass([
345
366
  customElement("sbb-slider"),
346
367
  hostAttributes({
347
- role: "slider"
368
+ tabindex: "0"
348
369
  })
349
370
  ], SbbSliderElement);
350
371
  export {
351
372
  SbbSliderElement
352
373
  };
353
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2xpZGVyL3NsaWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyByZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuXG5pbXBvcnQgeyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIgfSBmcm9tICcuLi9jb3JlL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGhvc3RBdHRyaWJ1dGVzIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHNldE9yUmVtb3ZlQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9kb20uanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBmb3J3YXJkRXZlbnRUb0hvc3QgfSBmcm9tICcuLi9jb3JlL2V2ZW50aW5nLmpzJztcbmltcG9ydCB7IFNiYkRpc2FibGVkTWl4aW4gfSBmcm9tICcuLi9jb3JlL21peGlucy5qcyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3NsaWRlci5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJy4uL2ljb24uanMnO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGFuIGlucHV0IGtub2IgdGhhdCBjYW4gYmUgbW92ZWQgaW4gYSByYW5nZS5cbiAqXG4gKiBAc2xvdCBwcmVmaXggLSBVc2UgdGhpcyBzbG90IHRvIHJlbmRlciBhbiBpY29uIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGlucHV0LlxuICogQHNsb3Qgc3VmZml4IC0gVXNlIHRoaXMgc2xvdCB0byByZW5kZXIgYW4gaWNvbiBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5wdXQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBkaWRDaGFuZ2UgLSBEZXByZWNhdGVkLiB1c2VkIGZvciBSZWFjdC4gV2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIG9uY2UgUmVhY3QgMTkgaXMgYXZhaWxhYmxlLlxuICovXG5AY3VzdG9tRWxlbWVudCgnc2JiLXNsaWRlcicpXG5AaG9zdEF0dHJpYnV0ZXMoe1xuICByb2xlOiAnc2xpZGVyJyxcbn0pXG5leHBvcnQgY2xhc3MgU2JiU2xpZGVyRWxlbWVudCBleHRlbmRzIFNiYkRpc2FibGVkTWl4aW4oTGl0RWxlbWVudCkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgZGlkQ2hhbmdlOiAnZGlkQ2hhbmdlJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVmFsdWUgZm9yIHRoZSBpbm5lciBIVE1MSW5wdXRFbGVtZW50LiAqL1xuICBAcHJvcGVydHkoKSBwdWJsaWMgdmFsdWU/OiBzdHJpbmcgPSAnJztcblxuICAvKiogTnVtZXJpYyB2YWx1ZSBmb3IgdGhlIGlubmVyIEhUTUxJbnB1dEVsZW1lbnQuICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ZhbHVlLWFzLW51bWJlcicsIHR5cGU6IE51bWJlciB9KSBwdWJsaWMgdmFsdWVBc051bWJlcj86IG51bWJlcjtcblxuICAvKiogTmFtZSBvZiB0aGUgaW5uZXIgSFRNTElucHV0RWxlbWVudC4gKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSB9KSBwdWJsaWMgbmFtZT86IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBUaGUgPGZvcm0+IGVsZW1lbnQgdG8gYXNzb2NpYXRlIHRoZSBpbm5lciBIVE1MSW5wdXRFbGVtZW50IHdpdGguICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyBmb3JtPzogc3RyaW5nO1xuXG4gIC8qKiBNaW5pbXVtIGFjY2VwdGFibGUgdmFsdWUgZm9yIHRoZSBpbm5lciBIVE1MSW5wdXRFbGVtZW50LiAqL1xuICBAcHJvcGVydHkoKSBwdWJsaWMgbWluPzogc3RyaW5nID0gJzAnO1xuXG4gIC8qKiBNYXhpbXVtIGFjY2VwdGFibGUgdmFsdWUgZm9yIHRoZSBpbm5lciBIVE1MSW5wdXRFbGVtZW50LiAqL1xuICBAcHJvcGVydHkoKSBwdWJsaWMgbWF4Pzogc3RyaW5nID0gJzEwMCc7XG5cbiAgLyoqXG4gICAqIFJlYWRvbmx5IHN0YXRlIGZvciB0aGUgaW5uZXIgSFRNTElucHV0RWxlbWVudC5cbiAgICogU2luY2UgdGhlIGlucHV0IHJhbmdlIGRvZXMgbm90IGFsbG93IHRoaXMgYXR0cmlidXRlLCBpdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSBgZGlzYWJsZWRgIG9uZS5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgcHVibGljIHJlYWRvbmx5PzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBpY29uIGF0IGNvbXBvbmVudCdzIHN0YXJ0LCB3aGljaCB3aWxsIGJlIGZvcndhcmQgdG8gdGhlIG5lc3RlZCBgc2JiLWljb25gLiAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzdGFydC1pY29uJyB9KSBwdWJsaWMgc3RhcnRJY29uPzogc3RyaW5nO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBpY29uIGF0IGNvbXBvbmVudCdzIGVuZCwgd2hpY2ggd2lsbCBiZSBmb3J3YXJkIHRvIHRoZSBuZXN0ZWQgYHNiYi1pY29uYC4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZW5kLWljb24nIH0pIHB1YmxpYyBlbmRJY29uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gYmV0d2VlbiB0aGUgYWJzb2x1dGUgdmFsdWUgYW5kIHRoZSB2YWxpZGl0eSBpbnRlcnZhbC5cbiAgICogRS5nLiBnaXZlbiBgbWluPTBgLCBgbWF4PTEwMGAgYW5kIGB2YWx1ZT01MGAsIHRoZW4gYF92YWx1ZUZyYWN0aW9uPTAuNWBcbiAgICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgX3ZhbHVlRnJhY3Rpb24gPSAwO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBvbmx5IHVzZWQgZm9yIFJlYWN0LiBXaWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgb25jZSBSZWFjdCAxOSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBwcml2YXRlIF9kaWRDaGFuZ2U6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIodGhpcywgU2JiU2xpZGVyRWxlbWVudC5ldmVudHMuZGlkQ2hhbmdlLCB7XG4gICAgYnViYmxlczogdHJ1ZSxcbiAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICB9KTtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBpbm5lciBIVE1MSW5wdXRFbGVtZW50IHdpdGggdHlwZT0ncmFuZ2UnLiAqL1xuICBwcml2YXRlIF9yYW5nZUlucHV0ITogSFRNTElucHV0RWxlbWVudDtcblxuICBwcml2YXRlIF9hYm9ydCA9IG5ldyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIodGhpcyk7XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fYWJvcnQuc2lnbmFsO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGUpLCB7IHNpZ25hbCB9KTtcbiAgICB0aGlzLl9oYW5kbGVDaGFuZ2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygndmFsdWUnKSkge1xuICAgICAgdGhpcy5faGFuZGxlQ2hhbmdlKE51bWJlcih0aGlzLnZhbHVlKSk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ZhbHVlQXNOdW1iZXInKSkge1xuICAgICAgdGhpcy5faGFuZGxlQ2hhbmdlKE51bWJlcih0aGlzLnZhbHVlQXNOdW1iZXIpKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdtaW4nKSkge1xuICAgICAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUodGhpcywgJ2FyaWEtdmFsdWVtaW4nLCB0aGlzLm1pbiA/PyBudWxsKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbWF4JykpIHtcbiAgICAgIHNldE9yUmVtb3ZlQXR0cmlidXRlKHRoaXMsICdhcmlhLXZhbHVlbWF4JywgdGhpcy5tYXggPz8gbnVsbCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3JlYWRvbmx5JykpIHtcbiAgICAgIHNldE9yUmVtb3ZlQXR0cmlidXRlKHRoaXMsICdhcmlhLXJlYWRvbmx5JywgdGhpcy5yZWFkb25seSA/ICd0cnVlJyA6IG51bGwpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Rpc2FibGVkJykpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpO1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNWYWx1ZXMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChuZXdWYWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChuZXdWYWx1ZSAmJiB0eXBlb2YgbmV3VmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICBuZXdWYWx1ZSA9ICtuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKTtcbiAgICB0aGlzLnZhbHVlQXNOdW1iZXIgPSBuZXdWYWx1ZSBhcyBudW1iZXI7XG4gICAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUodGhpcywgJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlIHx8IG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlcyB0aGUgYF92YWx1ZUZyYWN0aW9uYCBvbiBjaGFuZ2UgdG8gY29ycmVjdGx5IGRpc3BsYXkgdGhlIHNsaWRlciBrbm9iIGFuZCBsaW5lcy5cbiAgICogVGhlIGZpcnN0IGNhbGN1bGF0aW9uIGhhcHBlbnMgaW4gY29ubmVjdGVkQ2FsbGJhY2soLi4uKSwgc28gc2luY2UgYF9yYW5nZUlucHV0YCBpcyBub3QgeWV0IGF2YWlsYWJsZSxcbiAgICogdGhlIGBtaW5gIGFuZCBgbWF4YCB2YWx1ZXMgYXJlIHVzZWQ7IGlmIGB2YWx1ZWAgaXMgbm90IHByb3ZpZGVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBoYWxmd2F5IGJldHdlZW4gbWluIGFuZCBtYXhcbiAgICogKHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQvcmFuZ2UjdmFsdWUpLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ2hhbmdlKHZhbHVlOiBudW1iZXIgPSB0aGlzLl9yYW5nZUlucHV0Py52YWx1ZUFzTnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcjtcbiAgICBpZiAodGhpcy5fcmFuZ2VJbnB1dCkge1xuICAgICAgbWluID0gK3RoaXMuX3JhbmdlSW5wdXQubWluO1xuICAgICAgbWF4ID0gK3RoaXMuX3JhbmdlSW5wdXQubWF4O1xuICAgIH0gZWxzZSB7XG4gICAgICBtaW4gPSArKHRoaXMubWluIGFzIHN0cmluZyk7XG4gICAgICBtYXggPSArKHRoaXMubWF4IGFzIHN0cmluZyk7XG4gICAgICB2YWx1ZSA9XG4gICAgICAgIHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZSAhPT0gJydcbiAgICAgICAgICA/ICt0aGlzLnZhbHVlXG4gICAgICAgICAgOiB0aGlzLnZhbHVlQXNOdW1iZXJcbiAgICAgICAgICAgID8gdGhpcy52YWx1ZUFzTnVtYmVyXG4gICAgICAgICAgICA6ICsodGhpcy5taW4gYXMgc3RyaW5nKSArICgrKHRoaXMubWF4IGFzIHN0cmluZykgLSArKHRoaXMubWluIGFzIHN0cmluZykpIC8gMjtcbiAgICB9XG4gICAgY29uc3QgbWF0aEZyYWN0aW9uOiBudW1iZXIgPSAodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gICAgdGhpcy5fdmFsdWVGcmFjdGlvbiA9XG4gICAgICBpc05hTihtYXRoRnJhY3Rpb24pIHx8IG1hdGhGcmFjdGlvbiA8IDAgPyAwIDogbWF0aEZyYWN0aW9uID4gMSA/IDEgOiBtYXRoRnJhY3Rpb247XG4gICAgdGhpcy5fc3luY1ZhbHVlcyh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ1RhYicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdIb21lJykge1xuICAgICAgdGhpcy5fcmFuZ2VJbnB1dC52YWx1ZSA9IHRoaXMuX3JhbmdlSW5wdXQubWluO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRW5kJykge1xuICAgICAgdGhpcy5fcmFuZ2VJbnB1dC52YWx1ZSA9IHRoaXMuX3JhbmdlSW5wdXQubWF4O1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICB0aGlzLl9yYW5nZUlucHV0LnN0ZXBEb3duKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgdGhpcy5fcmFuZ2VJbnB1dC5zdGVwVXAoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ1BhZ2VEb3duJykge1xuICAgICAgdGhpcy5fcmFuZ2VJbnB1dC5zdGVwRG93bigoK3RoaXMuX3JhbmdlSW5wdXQubWF4IC0gK3RoaXMuX3JhbmdlSW5wdXQubWluKSAvIDEwKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ1BhZ2VVcCcpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQuc3RlcFVwKCgrdGhpcy5fcmFuZ2VJbnB1dC5tYXggLSArdGhpcy5fcmFuZ2VJbnB1dC5taW4pIC8gMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlQ2hhbmdlKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IElucHV0RXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KSxcbiAgICApO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlIH0pKTtcbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgY2hhbmdlIGV2ZW50LiAqL1xuICBwcml2YXRlIF9lbWl0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGZvcndhcmRFdmVudFRvSG9zdChldmVudCwgdGhpcyk7XG4gICAgdGhpcy5fZGlkQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zbGlkZXJfX2hlaWdodC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zbGlkZXJfX3dyYXBwZXJcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwicHJlZml4XCI+XG4gICAgICAgICAgICAke3RoaXMuc3RhcnRJY29uID8gaHRtbGA8c2JiLWljb24gbmFtZT1cIiR7dGhpcy5zdGFydEljb259XCI+PC9zYmItaWNvbj5gIDogbm90aGluZ31cbiAgICAgICAgICA8L3Nsb3Q+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzYmItc2xpZGVyX19jb250YWluZXJcIlxuICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7ICctLXNiYi1zbGlkZXItdmFsdWUtZnJhY3Rpb24nOiB0aGlzLl92YWx1ZUZyYWN0aW9uLnRvU3RyaW5nKCkgfSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBuYW1lPSR7dGhpcy5uYW1lIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgIG1pbj0ke3RoaXMubWluIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgIG1heD0ke3RoaXMubWF4IHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSB8fCBub3RoaW5nfVxuICAgICAgICAgICAgICAudmFsdWVBc051bWJlcj0ke3RoaXMudmFsdWVBc051bWJlciB8fCBub3RoaW5nfVxuICAgICAgICAgICAgICB2YWx1ZT0ke3RoaXMudmFsdWUgfHwgbm90aGluZ31cbiAgICAgICAgICAgICAgY2xhc3M9XCJzYmItc2xpZGVyX19yYW5nZS1pbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgIEBjaGFuZ2U9JHsoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLl9lbWl0Q2hhbmdlKGV2ZW50KX1cbiAgICAgICAgICAgICAgQGlucHV0PSR7KCkgPT4gdGhpcy5faGFuZGxlQ2hhbmdlKCl9XG4gICAgICAgICAgICAgICR7cmVmKChpbnB1dD86IEVsZW1lbnQpID0+ICh0aGlzLl9yYW5nZUlucHV0ID0gaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19saW5lXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19zZWxlY3RlZC1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19rbm9iXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInN1ZmZpeFwiPlxuICAgICAgICAgICAgJHt0aGlzLmVuZEljb24gPyBodG1sYDxzYmItaWNvbiBuYW1lPVwiJHt0aGlzLmVuZEljb259XCI+PC9zYmItaWNvbj5gIDogbm90aGluZ31cbiAgICAgICAgICA8L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNsaWRlcic6IFNiYlNsaWRlckVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJCTyxJQUFNLG1CQUFOLGNBQStCLGlCQUFpQixVQUFVLEVBQUU7QUFBQSxFQUE1RCxjQUFBO0FBQUEsVUFBQSxHQUFBLFNBQUE7QUFPTyxTQUFPLFFBQWlCO0FBTVAsU0FBTyxPQUFnQjtBQU14QyxTQUFPLE1BQWU7QUFHdEIsU0FBTyxNQUFlO0FBTUwsU0FBTyxXQUFxQjtBQVloRCxTQUFRLGlCQUFpQjtBQUtsQyxTQUFRLGFBQTJCLElBQUksYUFBYSxNQUFNLGlCQUFpQixPQUFPLFdBQVc7QUFBQSxNQUMzRixTQUFTO0FBQUEsTUFDVCxZQUFZO0FBQUEsSUFBQSxDQUNiO0FBS08sU0FBQSxTQUFTLElBQUksNEJBQTRCLElBQUk7QUFBQSxFQUFBO0FBQUEsRUFFckMsb0JBQTBCO0FBQ3hDLFVBQU0sa0JBQWtCO0FBQ2xCLFVBQUEsU0FBUyxLQUFLLE9BQU87QUFDdEIsU0FBQSxpQkFBaUIsV0FBVyxDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQUEsQ0FBUTtBQUMxRSxTQUFLLGNBQWM7QUFBQSxFQUNyQjtBQUFBLEVBRW1CLFdBQVcsbUJBQStDO0FBQzNFLFVBQU0sV0FBVyxpQkFBaUI7QUFFOUIsUUFBQSxrQkFBa0IsSUFBSSxPQUFPLEdBQUc7QUFDbEMsV0FBSyxjQUFjLE9BQU8sS0FBSyxLQUFLLENBQUM7QUFBQSxJQUM1QixXQUFBLGtCQUFrQixJQUFJLGVBQWUsR0FBRztBQUNqRCxXQUFLLGNBQWMsT0FBTyxLQUFLLGFBQWEsQ0FBQztBQUFBLElBQy9DO0FBRUksUUFBQSxrQkFBa0IsSUFBSSxLQUFLLEdBQUc7QUFDaEMsMkJBQXFCLE1BQU0saUJBQWlCLEtBQUssT0FBTyxJQUFJO0FBQUEsSUFDOUQ7QUFDSSxRQUFBLGtCQUFrQixJQUFJLEtBQUssR0FBRztBQUNoQywyQkFBcUIsTUFBTSxpQkFBaUIsS0FBSyxPQUFPLElBQUk7QUFBQSxJQUM5RDtBQUNJLFFBQUEsa0JBQWtCLElBQUksVUFBVSxHQUFHO0FBQ3JDLDJCQUFxQixNQUFNLGlCQUFpQixLQUFLLFdBQVcsU0FBUyxJQUFJO0FBQUEsSUFDM0U7QUFFSSxRQUFBLGtCQUFrQixJQUFJLFVBQVUsR0FBRztBQUNyQyxVQUFJLEtBQUssVUFBVTtBQUNaLGFBQUEsYUFBYSxpQkFBaUIsTUFBTTtBQUN6QyxhQUFLLGdCQUFnQixVQUFVO0FBQUEsTUFBQSxPQUMxQjtBQUNMLGFBQUssZ0JBQWdCLGVBQWU7QUFDL0IsYUFBQSxhQUFhLFlBQVksR0FBRztBQUFBLE1BQ25DO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLFlBQVksVUFBaUM7QUFDbkQsUUFBSSxZQUFZLE1BQU07QUFDcEI7QUFBQSxJQUNTLFdBQUEsWUFBWSxPQUFPLGFBQWEsVUFBVTtBQUNuRCxpQkFBVyxDQUFDO0FBQUEsSUFDZDtBQUVLLFNBQUEsUUFBUSxTQUFTO0FBQ3RCLFNBQUssZ0JBQWdCO0FBQ3JCLHlCQUFxQixNQUFNLGlCQUFpQixLQUFLLFNBQVMsSUFBSTtBQUFBLEVBQ2hFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRUSxjQUFjLFNBQWdCLG1CQUFLLGdCQUFMLG1CQUFrQixrQkFBcUI7QUFDM0UsUUFBSSxLQUFhO0FBQ2pCLFFBQUksS0FBSyxhQUFhO0FBQ2QsWUFBQSxDQUFDLEtBQUssWUFBWTtBQUNsQixZQUFBLENBQUMsS0FBSyxZQUFZO0FBQUEsSUFBQSxPQUNuQjtBQUNMLFlBQU0sQ0FBRSxLQUFLO0FBQ2IsWUFBTSxDQUFFLEtBQUs7QUFFWCxjQUFBLEtBQUssU0FBUyxLQUFLLFVBQVUsS0FDekIsQ0FBQyxLQUFLLFFBQ04sS0FBSyxnQkFDSCxLQUFLLGdCQUNMLENBQUUsS0FBSyxPQUFrQixDQUFFLEtBQUssTUFBaUIsQ0FBRSxLQUFLLE9BQWtCO0FBQUEsSUFDcEY7QUFDTSxVQUFBLGdCQUF3QixRQUFRLFFBQVEsTUFBTTtBQUMvQyxTQUFBLGlCQUNILE1BQU0sWUFBWSxLQUFLLGVBQWUsSUFBSSxJQUFJLGVBQWUsSUFBSSxJQUFJO0FBQ3ZFLFNBQUssWUFBWSxLQUFLO0FBQUEsRUFDeEI7QUFBQSxFQUVBLE1BQWMsZUFBZSxPQUFxQztBQUM1RCxRQUFBLE1BQU0sUUFBUSxPQUFPO0FBQ3ZCLFlBQU0sZUFBZTtBQUFBLElBQ3ZCO0FBRUksUUFBQSxLQUFLLFlBQVksS0FBSyxVQUFVO0FBQ2xDO0FBQUEsSUFDRjtBQUVJLFFBQUEsTUFBTSxRQUFRLFFBQVE7QUFDbkIsV0FBQSxZQUFZLFFBQVEsS0FBSyxZQUFZO0FBQUEsSUFBQSxXQUNqQyxNQUFNLFFBQVEsT0FBTztBQUN6QixXQUFBLFlBQVksUUFBUSxLQUFLLFlBQVk7QUFBQSxJQUFBLFdBQ2pDLE1BQU0sUUFBUSxlQUFlLE1BQU0sUUFBUSxhQUFhO0FBQ2pFLFdBQUssWUFBWTtJQUFTLFdBQ2pCLE1BQU0sUUFBUSxnQkFBZ0IsTUFBTSxRQUFRLFdBQVc7QUFDaEUsV0FBSyxZQUFZO0lBQU8sV0FDZixNQUFNLFFBQVEsWUFBWTtBQUM5QixXQUFBLFlBQVksVUFBVSxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsS0FBSyxZQUFZLE9BQU8sRUFBRTtBQUFBLElBQUEsV0FDckUsTUFBTSxRQUFRLFVBQVU7QUFDNUIsV0FBQSxZQUFZLFFBQVEsQ0FBQyxLQUFLLFlBQVksTUFBTSxDQUFDLEtBQUssWUFBWSxPQUFPLEVBQUU7QUFBQSxJQUFBLE9BQ3ZFO0FBQ0w7QUFBQSxJQUNGO0FBRUEsU0FBSyxjQUFjO0FBQ2QsU0FBQTtBQUFBLE1BQ0gsSUFBSSxXQUFXLFNBQVMsRUFBRSxTQUFTLE1BQU0sWUFBWSxNQUFNLFVBQVUsTUFBTTtBQUFBLElBQUE7QUFFN0UsU0FBSyxZQUFZLElBQUksTUFBTSxVQUFVLEVBQUUsU0FBUyxNQUFNLFlBQVksTUFBTSxVQUFVLEtBQUssQ0FBQyxDQUFDO0FBQUEsRUFDM0Y7QUFBQTtBQUFBLEVBR1EsWUFBWSxPQUFvQjtBQUN0Qyx1QkFBbUIsT0FBTyxJQUFJO0FBQzlCLFNBQUssV0FBVztFQUNsQjtBQUFBLEVBRW1CLFNBQXlCO0FBQ25DLFdBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQUlHLEtBQUssWUFBWSx1QkFBdUIsS0FBSyxTQUFTLGtCQUFrQixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBSXpFLFNBQVMsRUFBRSwrQkFBK0IsS0FBSyxlQUFlLFNBQVMsRUFBQSxDQUFHLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFJMUUsS0FBSyxRQUFRLE9BQU87QUFBQSxvQkFDckIsS0FBSyxPQUFPLE9BQU87QUFBQSxvQkFDbkIsS0FBSyxPQUFPLE9BQU87QUFBQSwwQkFDYixLQUFLLFlBQVksS0FBSyxZQUFZLE9BQU87QUFBQSwrQkFDcEMsS0FBSyxpQkFBaUIsT0FBTztBQUFBLHNCQUN0QyxLQUFLLFNBQVMsT0FBTztBQUFBO0FBQUE7QUFBQSx3QkFHbkIsQ0FBQyxVQUFpQixLQUFLLFlBQVksS0FBSyxDQUFDO0FBQUEsdUJBQzFDLE1BQU0sS0FBSyxlQUFlO0FBQUEsZ0JBQ2pDLElBQUksQ0FBQyxVQUFxQixLQUFLLGNBQWMsS0FBMEIsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FRMUUsS0FBSyxVQUFVLHVCQUF1QixLQUFLLE9BQU8sa0JBQWtCLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS3ZGO0FBQ0Y7QUE5TWEsaUJBQ1ksU0FBeUI7QUFEckMsaUJBRVksU0FBUztBQUFBLEVBQzlCLFdBQVc7QUFDYjtBQUdtQixnQkFBQTtBQUFBLEVBQWxCLFNBQVM7QUFBQSxHQVBDLGlCQU9RLFdBQUEsU0FBQSxDQUFBO0FBRzhDLGdCQUFBO0FBQUEsRUFBaEUsU0FBUyxFQUFFLFdBQVcsbUJBQW1CLE1BQU0sUUFBUTtBQUFBLEdBVjdDLGlCQVVzRCxXQUFBLGlCQUFBLENBQUE7QUFHN0IsZ0JBQUE7QUFBQSxFQUFuQyxTQUFTLEVBQUUsU0FBUyxNQUFNO0FBQUEsR0FiaEIsaUJBYXlCLFdBQUEsUUFBQSxDQUFBO0FBR2pCLGdCQUFBO0FBQUEsRUFBbEIsU0FBUztBQUFBLEdBaEJDLGlCQWdCUSxXQUFBLFFBQUEsQ0FBQTtBQUdBLGdCQUFBO0FBQUEsRUFBbEIsU0FBUztBQUFBLEdBbkJDLGlCQW1CUSxXQUFBLE9BQUEsQ0FBQTtBQUdBLGdCQUFBO0FBQUEsRUFBbEIsU0FBUztBQUFBLEdBdEJDLGlCQXNCUSxXQUFBLE9BQUEsQ0FBQTtBQU1pQixnQkFBQTtBQUFBLEVBQW5DLFNBQVMsRUFBRSxNQUFNLFNBQVM7QUFBQSxHQTVCaEIsaUJBNEJ5QixXQUFBLFlBQUEsQ0FBQTtBQUdVLGdCQUFBO0FBQUEsRUFBN0MsU0FBUyxFQUFFLFdBQVcsY0FBYztBQUFBLEdBL0IxQixpQkErQm1DLFdBQUEsYUFBQSxDQUFBO0FBR0YsZ0JBQUE7QUFBQSxFQUEzQyxTQUFTLEVBQUUsV0FBVyxZQUFZO0FBQUEsR0FsQ3hCLGlCQWtDaUMsV0FBQSxXQUFBLENBQUE7QUFNM0IsZ0JBQUE7QUFBQSxFQUFoQixNQUFNO0FBQUEsR0F4Q0ksaUJBd0NNLFdBQUEsa0JBQUEsQ0FBQTtBQXhDTixtQkFBTixnQkFBQTtBQUFBLEVBSk4sY0FBYyxZQUFZO0FBQUEsRUFDMUIsZUFBZTtBQUFBLElBQ2QsTUFBTTtBQUFBLEVBQUEsQ0FDUDtBQUFBLEdBQ1ksZ0JBQUE7In0=
374
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2xpZGVyL3NsaWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyByZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuXG5pbXBvcnQgeyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIgfSBmcm9tICcuLi9jb3JlL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGhvc3RBdHRyaWJ1dGVzIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgZm9yd2FyZEV2ZW50VG9Ib3N0IH0gZnJvbSAnLi4vY29yZS9ldmVudGluZy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIFNiYkRpc2FibGVkTWl4aW4sXG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4sXG59IGZyb20gJy4uL2NvcmUvbWl4aW5zLmpzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vc2xpZGVyLnNjc3M/bGl0JmlubGluZSc7XG5cbmltcG9ydCAnLi4vaWNvbi5qcyc7XG5cbi8qKlxuICogSXQgZGlzcGxheXMgYW4gaW5wdXQga25vYiB0aGF0IGNhbiBiZSBtb3ZlZCBpbiBhIHJhbmdlLlxuICpcbiAqIEBzbG90IHByZWZpeCAtIFVzZSB0aGlzIHNsb3QgdG8gcmVuZGVyIGFuIGljb24gb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgaW5wdXQuXG4gKiBAc2xvdCBzdWZmaXggLSBVc2UgdGhpcyBzbG90IHRvIHJlbmRlciBhbiBpY29uIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbnB1dC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGRpZENoYW5nZSAtIERlcHJlY2F0ZWQuIHVzZWQgZm9yIFJlYWN0LiBXaWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgb25jZSBSZWFjdCAxOSBpcyBhdmFpbGFibGUuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdzYmItc2xpZGVyJylcbkBob3N0QXR0cmlidXRlcyh7XG4gIHRhYmluZGV4OiAnMCcsXG59KVxuZXhwb3J0IGNsYXNzIFNiYlNsaWRlckVsZW1lbnQgZXh0ZW5kcyBTYmJEaXNhYmxlZE1peGluKFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4oTGl0RWxlbWVudCkpIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGU7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRpZENoYW5nZTogJ2RpZENoYW5nZScsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRoZSBmb3JtIGVsZW1lbnQuXG4gICAqIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCBkZWZhdWx0IGlzIHRoZSBtaWRkbGUgcG9pbnQgYmV0d2VlbiBtaW4gYW5kIG1heC5cbiAgICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBvdmVycmlkZSBzZXQgdmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNWYWxpZE51bWJlcih2YWx1ZSkpIHtcbiAgICAgIHN1cGVyLnZhbHVlID0gdGhpcy5fYm91bmRCZXR3ZWVuTWluTWF4KHZhbHVlISk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLnZhbHVlID0gdGhpcy5fZ2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgfVxuICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFWYWx1ZU5vdyA9IHRoaXMudmFsdWU7XG4gICAgdGhpcy5fY2FsY3VsYXRlVmFsdWVGcmFjdGlvbigpO1xuICB9XG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudmFsdWUhO1xuICB9XG5cbiAgLyoqIE51bWVyaWMgdmFsdWUgZm9yIHRoZSBpbm5lciBIVE1MSW5wdXRFbGVtZW50LiAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd2YWx1ZS1hcy1udW1iZXInLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIHNldCB2YWx1ZUFzTnVtYmVyKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU/LnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZUFzTnVtYmVyKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiBOdW1iZXIodGhpcy52YWx1ZSk7XG4gIH1cblxuICAvKiogTWluaW11bSBhY2NlcHRhYmxlIHZhbHVlIGZvciB0aGUgaW5uZXIgSFRNTElucHV0RWxlbWVudC4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBtaW4odmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5faXNWYWxpZE51bWJlcih2YWx1ZSEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuX2JvdW5kQmV0d2Vlbk1pbk1heCh0aGlzLnZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cbiAgcHJpdmF0ZSBfbWluOiBzdHJpbmcgPSAnMCc7XG5cbiAgLyoqIE1heGltdW0gYWNjZXB0YWJsZSB2YWx1ZSBmb3IgdGhlIGlubmVyIEhUTUxJbnB1dEVsZW1lbnQuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbWF4KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWROdW1iZXIodmFsdWUhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLl9ib3VuZEJldHdlZW5NaW5NYXgodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBtYXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG4gIHByaXZhdGUgX21heDogc3RyaW5nID0gJzEwMCc7XG5cbiAgLyoqXG4gICAqIFJlYWRvbmx5IHN0YXRlIGZvciB0aGUgaW5uZXIgSFRNTElucHV0RWxlbWVudC5cbiAgICogU2luY2UgdGhlIGlucHV0IHJhbmdlIGRvZXMgbm90IGFsbG93IHRoaXMgYXR0cmlidXRlLCBpdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSBgZGlzYWJsZWRgIG9uZS5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgcHVibGljIHJlYWRvbmx5PzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBpY29uIGF0IGNvbXBvbmVudCdzIHN0YXJ0LCB3aGljaCB3aWxsIGJlIGZvcndhcmQgdG8gdGhlIG5lc3RlZCBgc2JiLWljb25gLiAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzdGFydC1pY29uJyB9KSBwdWJsaWMgc3RhcnRJY29uPzogc3RyaW5nO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBpY29uIGF0IGNvbXBvbmVudCdzIGVuZCwgd2hpY2ggd2lsbCBiZSBmb3J3YXJkIHRvIHRoZSBuZXN0ZWQgYHNiYi1pY29uYC4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZW5kLWljb24nIH0pIHB1YmxpYyBlbmRJY29uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gYmV0d2VlbiB0aGUgYWJzb2x1dGUgdmFsdWUgYW5kIHRoZSB2YWxpZGl0eSBpbnRlcnZhbC5cbiAgICogRS5nLiBnaXZlbiBgbWluPTBgLCBgbWF4PTEwMGAgYW5kIGB2YWx1ZT01MGAsIHRoZW4gYF92YWx1ZUZyYWN0aW9uPTAuNWBcbiAgICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgX3ZhbHVlRnJhY3Rpb24gPSAwO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBvbmx5IHVzZWQgZm9yIFJlYWN0LiBXaWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgb25jZSBSZWFjdCAxOSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBwcml2YXRlIF9kaWRDaGFuZ2U6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIodGhpcywgU2JiU2xpZGVyRWxlbWVudC5ldmVudHMuZGlkQ2hhbmdlLCB7XG4gICAgYnViYmxlczogdHJ1ZSxcbiAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICB9KTtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBpbm5lciBIVE1MSW5wdXRFbGVtZW50IHdpdGggdHlwZT0ncmFuZ2UnLiAqL1xuICBwcml2YXRlIF9yYW5nZUlucHV0ITogSFRNTElucHV0RWxlbWVudDtcblxuICBwcml2YXRlIF9hYm9ydCA9IG5ldyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIodGhpcyk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuaW50ZXJuYWxzLnJvbGUgPSAnc2xpZGVyJztcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX2Fib3J0LnNpZ25hbDtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5faGFuZGxlS2V5ZG93bihlKSwgeyBzaWduYWwgfSk7XG5cbiAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9nZXREZWZhdWx0VmFsdWUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ21pbicpKSB7XG4gICAgICB0aGlzLmludGVybmFscy5hcmlhVmFsdWVNaW4gPSB0aGlzLm1pbjtcbiAgICB9XG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbWF4JykpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFWYWx1ZU1heCA9IHRoaXMubWF4O1xuICAgIH1cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdyZWFkb25seScpKSB7XG4gICAgICB0aGlzLmludGVybmFscy5hcmlhUmVhZE9ubHkgPSBCb29sZWFuKHRoaXMucmVhZG9ubHkpLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXNldCB2YWx1ZSBpcyB0aGUgYXR0cmlidXRlIHZhbHVlICh0aGUgc2V0dXAgdmFsdWUpLiBJZiBub3QgcHJlc2VudCwgY2FsY3VsYXRlcyB0aGUgZGVmYXVsdC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZm9ybVJlc2V0Q2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpID8/IHRoaXMuX2dldERlZmF1bHRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGZvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjayhcbiAgICBzdGF0ZTogRm9ybVJlc3RvcmVTdGF0ZSB8IG51bGwsXG4gICAgX3JlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBzdGF0ZSBhcyBzdHJpbmcgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqICBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgZGVmYXVsdCBpcyB0aGUgbWlkZGxlIHBvaW50IGJldHdlZW4gbWluIGFuZCBtYXhcbiAgICogIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0L3JhbmdlI3ZhbHVlKVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGVmYXVsdFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICgrdGhpcy5taW4gKyAoK3RoaXMubWF4IC0gK3RoaXMubWluKSAvIDIpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIF9pc1ZhbGlkTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdmFsdWUgJiYgIWlzTmFOKE51bWJlcih2YWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyYWlucyB0aGUgdmFsdWUgYmV0d2VlbiB0aGUgbWluIGFuZCBtYXhcbiAgICovXG4gIHByaXZhdGUgX2JvdW5kQmV0d2Vlbk1pbk1heCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoK3RoaXMubWluLCBNYXRoLm1pbigrdGhpcy5tYXgsICt2YWx1ZSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIF9jYWxjdWxhdGVWYWx1ZUZyYWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZUFzTnVtYmVyITtcbiAgICBjb25zdCBtaW4gPSArdGhpcy5taW47XG4gICAgY29uc3QgbWF4ID0gK3RoaXMubWF4O1xuXG4gICAgY29uc3QgbWF0aEZyYWN0aW9uOiBudW1iZXIgPSAodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gICAgdGhpcy5fdmFsdWVGcmFjdGlvbiA9IGlzTmFOKG1hdGhGcmFjdGlvbikgPyAwIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgbWF0aEZyYWN0aW9uKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ1RhYicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnSG9tZScpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQudmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VuZCcpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQudmFsdWUgPSB0aGlzLm1heDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgdGhpcy5fcmFuZ2VJbnB1dC5zdGVwRG93bigpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQuc3RlcFVwKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdQYWdlRG93bicpIHtcbiAgICAgIHRoaXMuX3JhbmdlSW5wdXQuc3RlcERvd24oKCt0aGlzLm1heCAtICt0aGlzLm1pbikgLyAxMCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdQYWdlVXAnKSB7XG4gICAgICB0aGlzLl9yYW5nZUlucHV0LnN0ZXBVcCgoK3RoaXMubWF4IC0gK3RoaXMubWluKSAvIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgZmlyZSBldmVudHMgYmVjYXVzZSBwcm9ncmFtbWF0aWMgY2hhbmdlcyBkb24ndCB0cmlnZ2VyIHRoZW1cbiAgICB0aGlzLl9yYW5nZUlucHV0LmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgSW5wdXRFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlIH0pLFxuICAgICk7XG4gICAgdGhpcy5fcmFuZ2VJbnB1dC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgY2hhbmdlIGV2ZW50LiAqL1xuICBwcml2YXRlIF9lbWl0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGZvcndhcmRFdmVudFRvSG9zdChldmVudCwgdGhpcyk7XG4gICAgdGhpcy5fZGlkQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zbGlkZXJfX2hlaWdodC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zbGlkZXJfX3dyYXBwZXJcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwicHJlZml4XCI+XG4gICAgICAgICAgICAke3RoaXMuc3RhcnRJY29uID8gaHRtbGA8c2JiLWljb24gbmFtZT1cIiR7dGhpcy5zdGFydEljb259XCI+PC9zYmItaWNvbj5gIDogbm90aGluZ31cbiAgICAgICAgICA8L3Nsb3Q+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzYmItc2xpZGVyX19jb250YWluZXJcIlxuICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7ICctLXNiYi1zbGlkZXItdmFsdWUtZnJhY3Rpb24nOiB0aGlzLl92YWx1ZUZyYWN0aW9uLnRvU3RyaW5nKCkgfSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBtaW49JHt0aGlzLm1pbn1cbiAgICAgICAgICAgICAgbWF4PSR7dGhpcy5tYXh9XG4gICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWQgfHwgdGhpcy5mb3JtRGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seX1cbiAgICAgICAgICAgICAgdmFsdWU9JHt0aGlzLnZhbHVlIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgIGNsYXNzPVwic2JiLXNsaWRlcl9fcmFuZ2UtaW5wdXRcIlxuICAgICAgICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICBAY2hhbmdlPSR7KGV2ZW50OiBFdmVudCkgPT4gdGhpcy5fZW1pdENoYW5nZShldmVudCl9XG4gICAgICAgICAgICAgIEBpbnB1dD0keygpID0+ICh0aGlzLnZhbHVlID0gdGhpcy5fcmFuZ2VJbnB1dC52YWx1ZSl9XG4gICAgICAgICAgICAgICR7cmVmKChpbnB1dD86IEVsZW1lbnQpID0+ICh0aGlzLl9yYW5nZUlucHV0ID0gaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19saW5lXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19zZWxlY3RlZC1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2xpZGVyX19rbm9iXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInN1ZmZpeFwiPlxuICAgICAgICAgICAgJHt0aGlzLmVuZEljb24gPyBodG1sYDxzYmItaWNvbiBuYW1lPVwiJHt0aGlzLmVuZEljb259XCI+PC9zYmItaWNvbj5gIDogbm90aGluZ31cbiAgICAgICAgICA8L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNsaWRlcic6IFNiYlNsaWRlckVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJzdGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCTyxJQUFNLG1CQUFOLGNBQStCLGlCQUFpQix1QkFBdUIsVUFBVSxDQUFDLEVBQUU7QUFBQSxFQThGbEYsY0FBYztBQUNiO0FBakRSLFNBQVEsT0FBZTtBQWV2QixTQUFRLE9BQWU7QUFNTSxTQUFPLFdBQXFCO0FBWWhELFNBQVEsaUJBQWlCO0FBS2xDLFNBQVEsYUFBMkIsSUFBSSxhQUFhLE1BQU0saUJBQWlCLE9BQU8sV0FBVztBQUFBLE1BQzNGLFNBQVM7QUFBQSxNQUNULFlBQVk7QUFBQSxJQUFBLENBQ2I7QUFLTyxTQUFBLFNBQVMsSUFBSSw0QkFBNEIsSUFBSTtBQUtuRCxTQUFLLFVBQVUsT0FBTztBQUFBLEVBQ3hCO0FBQUEsRUF2RkEsSUFBb0IsTUFBTSxPQUFzQjtBQUMxQyxRQUFBLEtBQUssZUFBZSxLQUFLLEdBQUc7QUFDeEIsWUFBQSxRQUFRLEtBQUssb0JBQW9CLEtBQU07QUFBQSxJQUFB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
package/index.d.ts CHANGED
@@ -89,6 +89,7 @@ import { SbbNotificationElement } from "./notification.js";
89
89
  import { SbbOptGroupElement } from "./option/optgroup.js";
90
90
  import { SbbOptionElement } from "./option/option.js";
91
91
  import { SbbOverlayElement } from "./overlay.js";
92
+ import { SbbPaginatorElement } from "./paginator.js";
92
93
  import { SbbPopoverElement } from "./popover/popover.js";
93
94
  import { SbbPopoverTriggerElement } from "./popover/popover-trigger.js";
94
95
  import { SbbRadioButtonElement } from "./radio-button/radio-button.js";
@@ -220,6 +221,7 @@ declare global {
220
221
  var SbbOptGroupElement: SbbOptGroupElement;
221
222
  var SbbOptionElement: SbbOptionElement;
222
223
  var SbbOverlayElement: SbbOverlayElement;
224
+ var SbbPaginatorElement: SbbPaginatorElement;
223
225
  var SbbPopoverElement: SbbPopoverElement;
224
226
  var SbbPopoverTriggerElement: SbbPopoverTriggerElement;
225
227
  var SbbRadioButtonElement: SbbRadioButtonElement;
package/index.js CHANGED
@@ -89,6 +89,7 @@ import { SbbNotificationElement } from "./notification.js";
89
89
  import { SbbOptGroupElement } from "./option/optgroup.js";
90
90
  import { SbbOptionElement } from "./option/option.js";
91
91
  import { SbbOverlayElement } from "./overlay.js";
92
+ import { SbbPaginatorElement } from "./paginator.js";
92
93
  import { SbbPopoverElement } from "./popover/popover.js";
93
94
  import { SbbPopoverTriggerElement } from "./popover/popover-trigger.js";
94
95
  import { SbbRadioButtonElement } from "./radio-button/radio-button.js";
@@ -219,6 +220,7 @@ globalThis.SbbNotificationElement = SbbNotificationElement;
219
220
  globalThis.SbbOptGroupElement = SbbOptGroupElement;
220
221
  globalThis.SbbOptionElement = SbbOptionElement;
221
222
  globalThis.SbbOverlayElement = SbbOverlayElement;
223
+ globalThis.SbbPaginatorElement = SbbPaginatorElement;
222
224
  globalThis.SbbPopoverElement = SbbPopoverElement;
223
225
  globalThis.SbbPopoverTriggerElement = SbbPopoverTriggerElement;
224
226
  globalThis.SbbRadioButtonElement = SbbRadioButtonElement;
package/lists.css CHANGED
@@ -66,24 +66,56 @@
66
66
  }
67
67
 
68
68
  .sbb-step-list {
69
- --sbb-step-list-marker-dimensions: 2.125rem;
70
- --sbb-step-list-padding-block: var(--sbb-spacing-fixed-3x);
69
+ /* stylelint-disable-next-line no-descending-specificity */
70
+ }
71
+ .sbb-step-list {
72
+ --sbb-step-list-dimensions: 2.125rem;
71
73
  --sbb-step-list-padding-inline: var(--sbb-spacing-responsive-xxs);
72
- --sbb-step-list-marker-to-text-gap: var(--sbb-spacing-responsive-xxxs);
73
- --sbb-step-list-border-radius: var(--sbb-border-radius-4x);
74
- --sbb-step-list-text-to-marker-block-offset: calc(
75
- 0.5 *
76
- (
77
- var(--sbb-step-list-marker-dimensions) - var(--sbb-typo-line-height-body-text) *
78
- var(--sbb-text-font-size)
79
- )
80
- );
81
- --sbb-step-list-vertical-gap: var(--sbb-spacing-fixed-1x);
74
+ --sbb-step-list-to-text-gap: var(--sbb-spacing-responsive-xxxs);
75
+ --sbb-step-list-text-to-marker-block-offset: calc(0.5 * (var(--sbb-step-list-dimensions) - var(--sbb-typo-line-height-body-text) * var(--sbb-text-font-size)));
82
76
  list-style: none;
83
77
  margin: 0;
84
78
  padding: 0;
79
+ }
80
+ @media (min-width: calc(52.5rem)) {
81
+ .sbb-step-list:where(.sbb-text-xl) {
82
+ --sbb-step-list-dimensions: 2.5625rem;
83
+ }
84
+ }
85
+ .sbb-step-list > li {
86
+ position: relative;
87
+ padding-inline: calc(var(--sbb-step-list-padding-inline) + var(--sbb-step-list-dimensions) + var(--sbb-step-list-to-text-gap)) var(--sbb-step-list-padding-inline);
88
+ min-height: var(--sbb-step-list-dimensions);
89
+ }
90
+ .sbb-step-list > li::before {
91
+ --sbb-text-font-size: var(--sbb-font-size-text-xxs);
92
+ font-family: var(--sbb-typo-font-family);
93
+ font-weight: normal;
94
+ line-height: var(--sbb-typo-line-height-body-text);
95
+ letter-spacing: var(--sbb-typo-letter-spacing-body-text);
96
+ font-size: var(--sbb-text-font-size);
97
+ font-weight: bold;
98
+ position: absolute;
99
+ height: var(--sbb-step-list-dimensions);
100
+ width: var(--sbb-step-list-dimensions);
101
+ margin-block-start: calc(-1 * var(--sbb-step-list-text-to-marker-block-offset));
102
+ inset-inline-start: var(--sbb-step-list-padding-inline);
103
+ border-radius: 50%;
104
+ }
105
+ .sbb-step-list > li + li {
106
+ margin-block-start: var(--sbb-step-list-vertical-gap);
107
+ }
108
+ .sbb-step-list > li p {
109
+ margin-block: 0;
110
+ }
111
+ .sbb-step-list > li > * + p {
112
+ margin-block-start: var(--sbb-spacing-responsive-xxxs);
113
+ }
114
+ .sbb-step-list {
115
+ --sbb-step-list-padding-block: var(--sbb-spacing-fixed-3x);
116
+ --sbb-step-list-vertical-gap: var(--sbb-spacing-fixed-1x);
117
+ --sbb-step-list-border-radius: var(--sbb-border-radius-4x);
85
118
  counter-reset: steps;
86
- /* stylelint-disable-next-line no-descending-specificity */
87
119
  }
88
120
  .sbb-step-list:where(.sbb-text-s) {
89
121
  --sbb-step-list-padding-block: var(--sbb-spacing-fixed-4x);
@@ -91,18 +123,20 @@
91
123
  .sbb-step-list:where(.sbb-text-m, .sbb-text-l, .sbb-text-xl) {
92
124
  --sbb-step-list-padding-block: var(--sbb-spacing-fixed-5x);
93
125
  }
94
- @media (min-width: calc(52.5rem)) {
95
- .sbb-step-list:where(.sbb-text-xl) {
96
- --sbb-step-list-marker-dimensions: 2.5625rem;
97
- }
98
- }
99
126
  .sbb-step-list > li {
100
- position: relative;
101
127
  counter-increment: steps;
102
128
  background-color: var(--sbb-color-milk);
103
129
  padding-block: calc(var(--sbb-step-list-padding-block) + var(--sbb-step-list-text-to-marker-block-offset)) var(--sbb-step-list-padding-block);
104
- padding-inline: calc(var(--sbb-step-list-padding-inline) + var(--sbb-step-list-marker-dimensions) + var(--sbb-step-list-marker-to-text-gap)) var(--sbb-step-list-padding-inline);
105
- min-height: calc(var(--sbb-step-list-marker-dimensions) + 2 * var(--sbb-step-list-padding-block));
130
+ padding-inline: calc(var(--sbb-step-list-padding-inline) + var(--sbb-step-list-dimensions) + var(--sbb-step-list-to-text-gap)) var(--sbb-step-list-padding-inline);
131
+ min-height: calc(var(--sbb-step-list-dimensions) + 2 * var(--sbb-step-list-padding-block));
132
+ }
133
+ .sbb-step-list > li::before {
134
+ content: counter(steps);
135
+ display: flex;
136
+ align-items: center;
137
+ justify-content: center;
138
+ border: var(--sbb-border-width-1x) solid var(--sbb-color-cement);
139
+ color: var(--sbb-color-charcoal);
106
140
  }
107
141
  .sbb-step-list > li:first-of-type {
108
142
  border-start-start-radius: var(--sbb-step-list-border-radius);
@@ -112,7 +146,30 @@
112
146
  border-end-start-radius: var(--sbb-step-list-border-radius);
113
147
  border-end-end-radius: var(--sbb-step-list-border-radius);
114
148
  }
115
- .sbb-step-list > li::before {
149
+
150
+ .sbb-icon-list {
151
+ /* stylelint-disable-next-line no-descending-specificity */
152
+ }
153
+ .sbb-icon-list {
154
+ --sbb-icon-list-dimensions: 2.125rem;
155
+ --sbb-icon-list-padding-inline: var(--sbb-spacing-responsive-xxs);
156
+ --sbb-icon-list-to-text-gap: var(--sbb-spacing-responsive-xxxs);
157
+ --sbb-icon-list-text-to-marker-block-offset: calc(0.5 * (var(--sbb-icon-list-dimensions) - var(--sbb-typo-line-height-body-text) * var(--sbb-text-font-size)));
158
+ list-style: none;
159
+ margin: 0;
160
+ padding: 0;
161
+ }
162
+ @media (min-width: calc(52.5rem)) {
163
+ .sbb-icon-list:where(.sbb-text-xl) {
164
+ --sbb-icon-list-dimensions: 2.5625rem;
165
+ }
166
+ }
167
+ .sbb-icon-list > li {
168
+ position: relative;
169
+ padding-inline: calc(var(--sbb-icon-list-padding-inline) + var(--sbb-icon-list-dimensions) + var(--sbb-icon-list-to-text-gap)) var(--sbb-icon-list-padding-inline);
170
+ min-height: var(--sbb-icon-list-dimensions);
171
+ }
172
+ .sbb-icon-list > li::before {
116
173
  --sbb-text-font-size: var(--sbb-font-size-text-xxs);
117
174
  font-family: var(--sbb-typo-font-family);
118
175
  font-weight: normal;
@@ -120,25 +177,34 @@
120
177
  letter-spacing: var(--sbb-typo-letter-spacing-body-text);
121
178
  font-size: var(--sbb-text-font-size);
122
179
  font-weight: bold;
123
- content: counter(steps);
124
180
  position: absolute;
125
- display: flex;
126
- align-items: center;
127
- justify-content: center;
128
- height: var(--sbb-step-list-marker-dimensions);
129
- width: var(--sbb-step-list-marker-dimensions);
130
- margin-block-start: calc(-1 * var(--sbb-step-list-text-to-marker-block-offset));
131
- inset-inline-start: var(--sbb-step-list-padding-inline);
132
- border: var(--sbb-border-width-1x) solid var(--sbb-color-cement);
181
+ height: var(--sbb-icon-list-dimensions);
182
+ width: var(--sbb-icon-list-dimensions);
183
+ margin-block-start: calc(-1 * var(--sbb-icon-list-text-to-marker-block-offset));
184
+ inset-inline-start: var(--sbb-icon-list-padding-inline);
133
185
  border-radius: 50%;
134
- color: var(--sbb-color-charcoal);
135
186
  }
136
- .sbb-step-list > li + li {
137
- margin-block-start: var(--sbb-step-list-vertical-gap);
187
+ .sbb-icon-list > li + li {
188
+ margin-block-start: var(--sbb-icon-list-vertical-gap);
138
189
  }
139
- .sbb-step-list > li p {
190
+ .sbb-icon-list > li p {
140
191
  margin-block: 0;
141
192
  }
142
- .sbb-step-list > li > * + p {
193
+ .sbb-icon-list > li > * + p {
143
194
  margin-block-start: var(--sbb-spacing-responsive-xxxs);
195
+ }
196
+ .sbb-icon-list {
197
+ --sbb-icon-list-marker-icon: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="%23000" fill-rule="evenodd" d="M3 12a9 9 0 0 1 9-9 9 9 0 0 1 9 9 9 9 0 0 1-9 9 9 9 0 0 1-9-9m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m-1.104 13.305 5-6.5-.792-.61-4.69 6.096-2.102-1.681-.624.78 2.5 2 .398.319z" clip-rule="evenodd"></path></svg>');
198
+ --sbb-icon-list-marker-icon-color: currentcolor;
199
+ --sbb-icon-list-vertical-gap: var(--sbb-spacing-fixed-2x);
200
+ --sbb-icon-list-dimensions: var(--sbb-size-icon-ui-small);
201
+ --sbb-icon-list-to-text-gap: var(--sbb-spacing-fixed-2x);
202
+ }
203
+ .sbb-icon-list > li::before {
204
+ content: "";
205
+ background-color: var(--sbb-icon-list-marker-icon-color);
206
+ mask-image: var(--sbb-icon-list-marker-icon);
207
+ mask-repeat: no-repeat;
208
+ mask-position: center;
209
+ mask-size: 100%;
144
210
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sbb-esta/lyne-elements",
3
- "version": "1.11.3",
3
+ "version": "1.12.0",
4
4
  "description": "Lyne Design System",
5
5
  "keywords": [
6
6
  "design system",
@@ -735,6 +735,11 @@
735
735
  "development": "./development/overlay.js",
736
736
  "default": "./overlay.js"
737
737
  },
738
+ "./paginator.js": {
739
+ "types": "./development/paginator.d.ts",
740
+ "development": "./development/paginator.js",
741
+ "default": "./paginator.js"
742
+ },
738
743
  "./popover.js": {
739
744
  "types": "./development/popover.d.ts",
740
745
  "development": "./development/popover.js",
@@ -0,0 +1,2 @@
1
+ export * from './paginator.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/paginator/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}