@sbb-esta/lyne-elements-dev 4.11.0-dev.1776724561 → 4.11.0-dev.1776867495

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 (130) hide show
  1. package/{block-link-common-DzGY49Xc.js → block-link-common-BwXob5QE.js} +1 -1
  2. package/core/styles/core.scss +37 -4
  3. package/core/styles/mixins/helpers.scss +3 -3
  4. package/core.css +70 -5
  5. package/custom-elements.json +4074 -4074
  6. package/development/{block-link-common-GckvjULA.js → block-link-common-Dh1NOKxB.js} +2 -2
  7. package/development/form-field/form-field/form-field.component.js +1 -1
  8. package/development/form-field/form-field.js +1 -1
  9. package/development/{form-field.component-D0NJclvI.js → form-field.component-CWVzymTX.js} +2 -2
  10. package/development/form-field.js +1 -1
  11. package/development/form-field.pure.js +1 -1
  12. package/development/link/common/block-link-common.js +1 -1
  13. package/development/link/common.js +1 -1
  14. package/development/link.js +1 -1
  15. package/development/link.pure.js +1 -1
  16. package/development/slider/slider.component.js +1 -1
  17. package/development/{slider.component-BjfLnUvP.js → slider.component-C3qZB6ar.js} +2 -2
  18. package/development/slider.js +1 -1
  19. package/development/slider.pure.js +1 -1
  20. package/development/step-label.component-DjA-3IGs.js +131 -0
  21. package/development/stepper/step-label/step-label.component.js +1 -1
  22. package/development/stepper/step-label.js +1 -1
  23. package/development/stepper.js +1 -1
  24. package/development/stepper.pure.js +1 -1
  25. package/development/teaser-hero/teaser-hero.component.js +1 -1
  26. package/development/{teaser-hero.component-DNlc8Tbl.js → teaser-hero.component-BIOpoGME.js} +2 -2
  27. package/development/teaser-hero.js +1 -1
  28. package/development/teaser-hero.pure.js +1 -1
  29. package/development/timetable-form/timetable-form/timetable-form.component.js +1 -1
  30. package/development/timetable-form/timetable-form-details/timetable-form-details.component.js +1 -1
  31. package/development/timetable-form/timetable-form-details.js +1 -1
  32. package/development/timetable-form/timetable-form-field/timetable-form-field.component.js +1 -1
  33. package/development/timetable-form/timetable-form-field.js +1 -1
  34. package/development/timetable-form/timetable-form.js +1 -1
  35. package/development/timetable-form-details.component-DJl5Qt9y.js +26 -0
  36. package/development/timetable-form-field.component-DQ_TzcF4.js +44 -0
  37. package/development/timetable-form.component-N8h4JBlH.js +27 -0
  38. package/development/timetable-form.js +3 -3
  39. package/development/timetable-form.pure.js +3 -3
  40. package/development/timetable-occupancy/timetable-occupancy.component.js +1 -1
  41. package/development/timetable-occupancy.component-dhpPJEaI.js +124 -0
  42. package/development/timetable-occupancy.js +1 -1
  43. package/development/timetable-occupancy.pure.js +1 -1
  44. package/development/toggle/toggle/toggle.component.d.ts.map +1 -1
  45. package/development/toggle/toggle/toggle.component.js +1 -1
  46. package/development/toggle/toggle-option/toggle-option.component.d.ts.map +1 -1
  47. package/development/toggle/toggle-option/toggle-option.component.js +1 -1
  48. package/development/toggle/toggle-option.js +1 -1
  49. package/development/toggle/toggle.js +1 -1
  50. package/development/toggle-check/toggle-check.component.js +1 -1
  51. package/development/toggle-check.component-_fDAuLob.js +159 -0
  52. package/development/toggle-check.js +1 -1
  53. package/development/toggle-check.pure.js +1 -1
  54. package/development/toggle-option.component-DTS3a603.js +167 -0
  55. package/development/toggle.component-CKug5pF7.js +249 -0
  56. package/development/toggle.js +2 -2
  57. package/development/toggle.pure.js +2 -2
  58. package/development/tooltip/tooltip.component.js +1 -1
  59. package/development/tooltip.component-epXOY5vO.js +378 -0
  60. package/development/tooltip.js +1 -1
  61. package/development/tooltip.pure.js +1 -1
  62. package/form-field/form-field/form-field.component.js +1 -1
  63. package/form-field/form-field.js +1 -1
  64. package/{form-field.component-Bqw-VgJF.js → form-field.component-Cc_siKrq.js} +1 -1
  65. package/form-field.js +1 -1
  66. package/form-field.pure.js +1 -1
  67. package/link/common/block-link-common.js +1 -1
  68. package/link/common.js +1 -1
  69. package/link.js +1 -1
  70. package/link.pure.js +1 -1
  71. package/off-brand-theme.css +70 -5
  72. package/package.json +2 -2
  73. package/safety-theme.css +70 -5
  74. package/slider/slider.component.js +1 -1
  75. package/{slider.component-CoqCppCq.js → slider.component-BlRVR6iU.js} +1 -1
  76. package/slider.js +1 -1
  77. package/slider.pure.js +1 -1
  78. package/standard-theme.css +70 -5
  79. package/{step-label.component-DnQBwnL8.js → step-label.component-dzcNc12A.js} +1 -1
  80. package/stepper/step-label/step-label.component.js +1 -1
  81. package/stepper/step-label.js +1 -1
  82. package/stepper.js +1 -1
  83. package/stepper.pure.js +1 -1
  84. package/teaser-hero/teaser-hero.component.js +1 -1
  85. package/{teaser-hero.component-CHy82SKQ.js → teaser-hero.component-D8yj-N5n.js} +1 -1
  86. package/teaser-hero.js +1 -1
  87. package/teaser-hero.pure.js +1 -1
  88. package/timetable-form/timetable-form/timetable-form.component.js +1 -1
  89. package/timetable-form/timetable-form-details/timetable-form-details.component.js +1 -1
  90. package/timetable-form/timetable-form-details.js +1 -1
  91. package/timetable-form/timetable-form-field/timetable-form-field.component.js +1 -1
  92. package/timetable-form/timetable-form-field.js +1 -1
  93. package/timetable-form/timetable-form.js +1 -1
  94. package/timetable-form-details.component-mWKaBW_9.js +16 -0
  95. package/timetable-form-field.component-Cv_lv8vf.js +32 -0
  96. package/{timetable-form.component-CU1FXAZH.js → timetable-form.component-YcvKAlfz.js} +1 -1
  97. package/timetable-form.js +3 -3
  98. package/timetable-form.pure.js +3 -3
  99. package/timetable-occupancy/timetable-occupancy.component.js +1 -1
  100. package/{timetable-occupancy.component-Db9SfiyD.js → timetable-occupancy.component-BDmxFVKK.js} +1 -1
  101. package/timetable-occupancy.js +1 -1
  102. package/timetable-occupancy.pure.js +1 -1
  103. package/toggle/toggle/toggle.component.js +1 -1
  104. package/toggle/toggle-option/toggle-option.component.js +1 -1
  105. package/toggle/toggle-option.js +1 -1
  106. package/toggle/toggle.js +1 -1
  107. package/toggle-check/toggle-check.component.js +1 -1
  108. package/toggle-check.component-DvoslSRr.js +119 -0
  109. package/toggle-check.js +1 -1
  110. package/toggle-check.pure.js +1 -1
  111. package/{toggle-option.component-Bw-GXUQK.js → toggle-option.component-pX3tNwjE.js} +5 -7
  112. package/{toggle.component-BPpsMMPG.js → toggle.component-Cwc-TJ-a.js} +6 -10
  113. package/toggle.js +2 -2
  114. package/toggle.pure.js +2 -2
  115. package/tooltip/tooltip.component.js +1 -1
  116. package/{tooltip.component-BY9mV5Sw.js → tooltip.component-B3XLLpLg.js} +1 -1
  117. package/tooltip.js +1 -1
  118. package/tooltip.pure.js +1 -1
  119. package/development/step-label.component-CJFPHIZa.js +0 -131
  120. package/development/timetable-form-details.component-C8awcdP5.js +0 -26
  121. package/development/timetable-form-field.component-BI24VjkC.js +0 -44
  122. package/development/timetable-form.component-CUG86CSN.js +0 -27
  123. package/development/timetable-occupancy.component-D_PXXvI9.js +0 -124
  124. package/development/toggle-check.component-BG4w_sE8.js +0 -159
  125. package/development/toggle-option.component-DRodFwFk.js +0 -169
  126. package/development/toggle.component-BFYLRN8o.js +0 -254
  127. package/development/tooltip.component-DzSd9VjW.js +0 -378
  128. package/timetable-form-details.component-CBZ7QSAx.js +0 -16
  129. package/timetable-form-field.component-BKxQQqt7.js +0 -32
  130. package/toggle-check.component-B6Ww5pLD.js +0 -119
@@ -1,378 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { html, isServer, unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbOpenCloseBaseElement } from "./core/base-elements.js";
5
- import { idReference } from "./core/decorators.js";
6
- import { isAndroid, isIOS, isZeroAnimationDuration, queueDomContentLoaded } from "./core/dom.js";
7
- import { SbbDisabledMixin, appendAriaElements, removeAriaElements } from "./core/mixins.js";
8
- import { boxSizingStyles } from "./core/styles.js";
9
- import { SbbEscapableOverlayController, SbbOverlayPositionController } from "./core/controllers.js";
10
- import { sbbOverlayOutsidePointerEventListener } from "./core/overlay.js";
11
- import { readConfig } from "./core/config.js";
12
- //#region src/elements/tooltip/tooltip.scss?inline
13
- var tooltip_default = ":host {\n --sbb-tooltip-pointer-events: all;\n --sbb-tooltip-min-width: var(--sbb-spacing-fixed-8x);\n --sbb-tooltip-max-width: min(\n 25rem,\n calc(100vw - var(--sbb-spacing-fixed-2x))\n );\n --sbb-tooltip-border-color: var(--sbb-background-color-1-inverted);\n --sbb-tooltip-border-radius: var(--sbb-border-radius-8x);\n --sbb-tooltip-padding: var(--sbb-spacing-fixed-2x) var(--sbb-spacing-fixed-4x);\n --sbb-tooltip-background-color: var(--sbb-background-color-1-inverted);\n --sbb-tooltip-color: var(--sbb-color-2-inverted);\n --sbb-tooltip-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-4x)\n );\n --sbb-tooltip-animation-easing: ease-out;\n --sbb-tooltip-animation-translate: 0 var(--sbb-spacing-fixed-2x);\n --sbb-tooltip-gap: var(--sbb-spacing-fixed-2x);\n --sbb-overlay-position-area: block-start;\n --sbb-overlay-position-try-fallbacks:\n block-start span-inline-end, block-start span-inline-start, block-end,\n block-end span-inline-end, block-end span-inline-start;\n position-area: var(--sbb-overlay-position-area);\n position-try-fallbacks: var(--sbb-overlay-position-try-fallbacks);\n display: none;\n position: fixed;\n background-color: transparent;\n pointer-events: var(--sbb-tooltip-pointer-events);\n z-index: var(--sbb-tooltip-z-index, var(--sbb-overlay-default-z-index));\n animation-name: var(--sbb-tooltip-animation-name);\n animation-duration: var(--sbb-tooltip-animation-duration);\n animation-timing-function: var(--sbb-tooltip-animation-easing);\n border: none;\n inset: initial;\n padding: 0;\n margin: 0;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n display: block;\n --sbb-tooltip-animation-name: open;\n}\n\n:host(:is(:state(state-closing),[state--state-closing])) {\n --sbb-tooltip-animation-name: close;\n --sbb-tooltip-pointer-events: none;\n}\n\n:host(:is([data-position~=block-end], [data-position~=bottom], [data-position^=end])) {\n padding-block-start: var(--sbb-tooltip-gap);\n}\n\n:host(:is([data-position~=block-start], [data-position~=top], [data-position^=start])) {\n padding-block-end: var(--sbb-tooltip-gap);\n}\n\n:host(:is([data-position~=inline-start],\n[data-position~=inline-end],\n[data-position~=left],\n[data-position~=right],\n[data-position$=\" start\"],\n[data-position$=\" end\"])) {\n padding-inline: var(--sbb-tooltip-gap);\n}\n\n.sbb-tooltip {\n box-shadow: var(--sbb-box-shadow-level-5-soft);\n --sbb-text-font-size: var(--sbb-text-font-size-xs);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n border: var(--sbb-border-width-1x) solid var(--sbb-tooltip-border-color);\n border-radius: var(--sbb-tooltip-border-radius);\n padding: var(--sbb-tooltip-padding);\n color: var(--sbb-tooltip-color);\n background-color: var(--sbb-tooltip-background-color);\n min-width: var(--sbb-tooltip-min-width);\n max-width: var(--sbb-tooltip-max-width);\n}\n\n@keyframes open {\n from {\n opacity: 0;\n translate: var(--sbb-tooltip-animation-translate);\n }\n to {\n opacity: 1;\n translate: 0;\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n translate: 0;\n }\n to {\n opacity: 0;\n translate: var(--sbb-tooltip-animation-translate);\n }\n}";
14
- //#endregion
15
- //#region src/elements/tooltip/tooltip.component.ts
16
- /**
17
- * Time between the user putting the pointer on a tooltip
18
- * trigger and the long press event being fired.
19
- */
20
- var LONGPRESS_DELAY = 500;
21
- var isMobile = isAndroid || isIOS;
22
- var tooltipTriggers = /* @__PURE__ */ new WeakMap();
23
- var nextId = 0;
24
- /**
25
- * It displays text content within a tooltip.
26
- *
27
- * @slot - Use the unnamed slot to add the text into the tooltip.
28
- * @cssprop [--sbb-overlay-position-area=block-end] - The primary position for the tooltip.
29
- * @cssprop [--sbb-overlay-position-try-fallbacks=block-end span-inline-end, block-end span-inline-start, block-start, block-start span-inline-end, block-start span-inline-start] -
30
- * The list of fallback positions, separated by ',', for the tooltip
31
- * @cssprop [--sbb-tooltip-z-index=var(--sbb-overlay-default-z-index)] - To specify a custom stack order,
32
- * the `z-index` can be overridden by defining this CSS variable. The default `z-index` of the
33
- * component is set to `var(--sbb-overlay-default-z-index)` with a value of `1000`.
34
- */
35
- var SbbTooltipElement = (() => {
36
- let _classSuper = SbbDisabledMixin(SbbOpenCloseBaseElement);
37
- let _instanceExtraInitializers = [];
38
- let _trigger_decorators;
39
- let _trigger_initializers = [];
40
- let _trigger_extraInitializers = [];
41
- let _set_openDelay_decorators;
42
- let _set_closeDelay_decorators;
43
- let _set_longPressCloseDelay_decorators;
44
- return class SbbTooltipElement extends _classSuper {
45
- static {
46
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
47
- _trigger_decorators = [idReference(), property()];
48
- _set_openDelay_decorators = [property({
49
- attribute: "open-delay",
50
- type: Number
51
- })];
52
- _set_closeDelay_decorators = [property({
53
- attribute: "close-delay",
54
- type: Number
55
- })];
56
- _set_longPressCloseDelay_decorators = [property({
57
- attribute: "long-press-close-delay",
58
- type: Number
59
- })];
60
- __esDecorate(this, null, _trigger_decorators, {
61
- kind: "accessor",
62
- name: "trigger",
63
- static: false,
64
- private: false,
65
- access: {
66
- has: (obj) => "trigger" in obj,
67
- get: (obj) => obj.trigger,
68
- set: (obj, value) => {
69
- obj.trigger = value;
70
- }
71
- },
72
- metadata: _metadata
73
- }, _trigger_initializers, _trigger_extraInitializers);
74
- __esDecorate(this, null, _set_openDelay_decorators, {
75
- kind: "setter",
76
- name: "openDelay",
77
- static: false,
78
- private: false,
79
- access: {
80
- has: (obj) => "openDelay" in obj,
81
- set: (obj, value) => {
82
- obj.openDelay = value;
83
- }
84
- },
85
- metadata: _metadata
86
- }, null, _instanceExtraInitializers);
87
- __esDecorate(this, null, _set_closeDelay_decorators, {
88
- kind: "setter",
89
- name: "closeDelay",
90
- static: false,
91
- private: false,
92
- access: {
93
- has: (obj) => "closeDelay" in obj,
94
- set: (obj, value) => {
95
- obj.closeDelay = value;
96
- }
97
- },
98
- metadata: _metadata
99
- }, null, _instanceExtraInitializers);
100
- __esDecorate(this, null, _set_longPressCloseDelay_decorators, {
101
- kind: "setter",
102
- name: "longPressCloseDelay",
103
- static: false,
104
- private: false,
105
- access: {
106
- has: (obj) => "longPressCloseDelay" in obj,
107
- set: (obj, value) => {
108
- obj.longPressCloseDelay = value;
109
- }
110
- },
111
- metadata: _metadata
112
- }, null, _instanceExtraInitializers);
113
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
114
- enumerable: true,
115
- configurable: true,
116
- writable: true,
117
- value: _metadata
118
- });
119
- }
120
- static {
121
- this.elementName = "sbb-tooltip";
122
- }
123
- static {
124
- this.role = "tooltip";
125
- }
126
- static {
127
- this.styles = [boxSizingStyles, unsafeCSS(tooltip_default)];
128
- }
129
- static {
130
- if (!isServer) queueDomContentLoaded(() => this._initializeTooltipOutlet());
131
- }
132
- #trigger_accessor_storage;
133
- /**
134
- * The element that will trigger the tooltip overlay.
135
- *
136
- * For attribute usage, provide an id reference.
137
- */
138
- get trigger() {
139
- return this.#trigger_accessor_storage;
140
- }
141
- set trigger(value) {
142
- this.#trigger_accessor_storage = value;
143
- }
144
- /**
145
- * Open the tooltip after a given delay in milliseconds.
146
- * Global configuration is used as default, if not set.
147
- *
148
- * @default null
149
- */
150
- set openDelay(value) {
151
- this._openDelay = value;
152
- }
153
- get openDelay() {
154
- return this._openDelay ?? readConfig().tooltip?.openDelay ?? 0;
155
- }
156
- /**
157
- * Close the tooltip after a given delay in milliseconds.
158
- * Global configuration is used as default, if not set.
159
- *
160
- * @default null
161
- */
162
- set closeDelay(value) {
163
- this._closeDelay = value;
164
- }
165
- get closeDelay() {
166
- return this._closeDelay ?? readConfig().tooltip?.closeDelay ?? 0;
167
- }
168
- /**
169
- * Automatically close the tooltip after it has been open by long press.
170
- * Global configuration is used as default, if not set.
171
- *
172
- * @default 1500
173
- */
174
- set longPressCloseDelay(value) {
175
- this._longPressCloseDelay = +value;
176
- }
177
- get longPressCloseDelay() {
178
- return this._longPressCloseDelay ?? readConfig().tooltip?.longPressCloseDelay ?? 1500;
179
- }
180
- constructor() {
181
- super();
182
- this.#trigger_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _trigger_initializers, null));
183
- this._openDelay = (__runInitializers(this, _trigger_extraInitializers), null);
184
- this._closeDelay = null;
185
- this._triggerElement = null;
186
- this._escapableOverlayController = new SbbEscapableOverlayController(this);
187
- this._overlayController = new SbbOverlayPositionController(this);
188
- this.addEventListener("mouseleave", (event) => {
189
- if ((this.state === "opened" || this.state === "opening") && (!event.relatedTarget || !this._triggerElement?.contains(event.relatedTarget))) this._delayedClose();
190
- }, { passive: true });
191
- this.addEventListener("overlayOutsidePointer", () => this.close(), { passive: true });
192
- this.addEventListener("animationend", (e) => this._onTooltipAnimationEnd(e), { passive: true });
193
- }
194
- static _initializeTooltipOutlet() {
195
- this._tooltipOutlet = document.createElement("div");
196
- this._tooltipOutlet.classList.add("sbb-overlay-outlet");
197
- document.body.appendChild(this._tooltipOutlet);
198
- new MutationObserver((mutations) => {
199
- for (const mutation of mutations) if (mutation.type === "attributes") this._handleTooltipTrigger(mutation.target);
200
- else if (mutation.type === "childList") for (const node of [...mutation.addedNodes, ...mutation.removedNodes].filter((n) => n.nodeType === n.ELEMENT_NODE)) {
201
- this._handleTooltipTrigger(node);
202
- this._findAndHandleTooltipTriggers(node);
203
- }
204
- }).observe(document.documentElement, {
205
- attributeFilter: [
206
- "sbb-tooltip",
207
- "sbb-tooltip-open-delay",
208
- "sbb-tooltip-close-delay",
209
- "sbb-tooltip-position"
210
- ],
211
- childList: true,
212
- subtree: true
213
- });
214
- this._findAndHandleTooltipTriggers(document.body);
215
- }
216
- static _findAndHandleTooltipTriggers(root) {
217
- root.querySelectorAll("[sbb-tooltip]").forEach((e) => this._handleTooltipTrigger(e));
218
- }
219
- static _handleTooltipTrigger(triggerElement) {
220
- const tooltipMessage = triggerElement.getAttribute("sbb-tooltip");
221
- let tooltip = tooltipTriggers.get(triggerElement);
222
- if (tooltipMessage && triggerElement.isConnected) {
223
- if (!tooltip) {
224
- tooltip = document.createElement("sbb-tooltip");
225
- tooltipTriggers.set(triggerElement, tooltip);
226
- this._tooltipOutlet.appendChild(tooltip);
227
- tooltip.trigger = triggerElement;
228
- }
229
- tooltip.textContent = tooltipMessage;
230
- tooltip.openDelay = triggerElement.hasAttribute("sbb-tooltip-open-delay") ? +triggerElement.getAttribute("sbb-tooltip-open-delay") : null;
231
- tooltip.closeDelay = triggerElement.hasAttribute("sbb-tooltip-close-delay") ? +triggerElement.getAttribute("sbb-tooltip-close-delay") : null;
232
- const positions = triggerElement.hasAttribute("sbb-tooltip-position") ? triggerElement.getAttribute("sbb-tooltip-position").split(",").map((p) => p.trim()) : triggerElement.tooltipPositions;
233
- if (positions && positions.length > 0) {
234
- tooltip.style.setProperty("--sbb-overlay-position-area", positions[0]);
235
- tooltip.style.setProperty("--sbb-overlay-position-try-fallbacks", positions.slice(1).join(", "));
236
- } else {
237
- tooltip.style.removeProperty("--sbb-overlay-position-area");
238
- tooltip.style.removeProperty("--sbb-overlay-position-try-fallbacks");
239
- }
240
- } else if (tooltip) {
241
- tooltipTriggers.delete(triggerElement);
242
- tooltip._destroy?.();
243
- }
244
- }
245
- connectedCallback() {
246
- super.connectedCallback();
247
- this.popover = "manual";
248
- this.id ||= `sbb-tooltip-${++nextId}`;
249
- this.state = "closed";
250
- sbbOverlayOutsidePointerEventListener.connect(this);
251
- if (this.hasUpdated && this.trigger) this._attach(this.trigger);
252
- }
253
- disconnectedCallback() {
254
- super.disconnectedCallback();
255
- sbbOverlayOutsidePointerEventListener.disconnect(this);
256
- this._detach();
257
- }
258
- requestUpdate(name, oldValue, options) {
259
- super.requestUpdate(name, oldValue, options);
260
- if (isServer) return;
261
- if ((!name || name === "trigger") && this.hasUpdated) this._attach(this.trigger);
262
- }
263
- firstUpdated(changedProperties) {
264
- super.firstUpdated(changedProperties);
265
- this._attach(this.trigger);
266
- }
267
- open() {
268
- this._resetOpenCloseTimeout();
269
- if (this.state !== "closed" && this.state !== "closing" || this.disabled || !this.trigger || !this.dispatchBeforeOpenEvent()) return;
270
- this.showPopover?.();
271
- this.state = "opening";
272
- this._overlayController.connect(this.trigger);
273
- if (this._isZeroAnimationDuration()) this._handleOpening();
274
- }
275
- close() {
276
- this._resetOpenCloseTimeout();
277
- if (this.state !== "opened" && this.state !== "opening") return;
278
- this.dispatchBeforeCloseEvent();
279
- this.state = "closing";
280
- if (this._isZeroAnimationDuration()) this._handleClosing();
281
- }
282
- _delayedOpen() {
283
- this._resetOpenCloseTimeout();
284
- this._openTimeout = setTimeout(() => this.open(), this.openDelay);
285
- }
286
- _handleOpening() {
287
- this.state = "opened";
288
- this._escapableOverlayController.connect();
289
- this.dispatchOpenEvent();
290
- }
291
- _delayedClose() {
292
- this._resetOpenCloseTimeout();
293
- this._closeTimeout = setTimeout(() => this.close(), this.closeDelay);
294
- }
295
- _handleClosing() {
296
- this.state = "closed";
297
- this.hidePopover?.();
298
- this._overlayController.disconnect();
299
- this._escapableOverlayController.disconnect();
300
- this.dispatchCloseEvent();
301
- this._openStateController?.abort();
302
- }
303
- _onTooltipAnimationEnd(event) {
304
- if (event.animationName === "open" && this.state === "opening") this._handleOpening();
305
- else if (event.animationName === "close" && this.state === "closing") this._handleClosing();
306
- }
307
- _attach(trigger) {
308
- if (this._triggerElement) this._detach();
309
- this._triggerElement = trigger;
310
- if (!this._triggerElement) return;
311
- this._triggerElement.ariaDescribedByElements = appendAriaElements(this._triggerElement.ariaDescribedByElements, this);
312
- this._addTriggerEventHandlers();
313
- }
314
- _detach() {
315
- this._triggerAbortController?.abort();
316
- this._openStateController?.abort();
317
- this._resetOpenCloseTimeout();
318
- clearTimeout(this._longPressOpenTimeout);
319
- clearTimeout(this._longPressCloseTimeout);
320
- if (!this._triggerElement) return;
321
- this._triggerElement.ariaDescribedByElements = removeAriaElements(this._triggerElement.ariaDescribedByElements, this);
322
- this._triggerElement = null;
323
- }
324
- _destroy() {
325
- this._detach();
326
- this.remove();
327
- }
328
- _addTriggerEventHandlers() {
329
- const trigger = this._triggerElement;
330
- if (!trigger) return;
331
- this._triggerAbortController?.abort();
332
- this._triggerAbortController = new AbortController();
333
- const options = {
334
- signal: this._triggerAbortController.signal,
335
- passive: true
336
- };
337
- if (!isMobile) {
338
- trigger.addEventListener("mouseenter", () => this._delayedOpen(), options);
339
- trigger.addEventListener("mouseleave", (event) => {
340
- const newTarget = event.relatedTarget;
341
- if (!newTarget || newTarget !== this) this._delayedClose();
342
- }, options);
343
- trigger.addEventListener("blur", () => this.close(), options);
344
- trigger.addEventListener("focus", () => this._delayedOpen(), options);
345
- }
346
- trigger.addEventListener("touchstart", () => {
347
- clearTimeout(this._longPressOpenTimeout);
348
- clearTimeout(this._longPressCloseTimeout);
349
- this._longPressOpenTimeout = setTimeout(() => this.open(), LONGPRESS_DELAY);
350
- }, options);
351
- trigger.addEventListener("touchend", () => {
352
- clearTimeout(this._longPressOpenTimeout);
353
- this._longPressCloseTimeout = setTimeout(() => this.close(), this.longPressCloseDelay);
354
- }, options);
355
- trigger.addEventListener("touchcancel", () => {
356
- clearTimeout(this._longPressOpenTimeout);
357
- }, options);
358
- }
359
- _isZeroAnimationDuration() {
360
- return isZeroAnimationDuration(this, "--sbb-tooltip-animation-duration");
361
- }
362
- _resetOpenCloseTimeout() {
363
- clearTimeout(this._openTimeout);
364
- clearTimeout(this._closeTimeout);
365
- }
366
- render() {
367
- return html`
368
- <div class="sbb-tooltip">
369
- <slot></slot>
370
- </div>
371
- `;
372
- }
373
- };
374
- })();
375
- //#endregion
376
- export { SbbTooltipElement as t };
377
-
378
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5jb21wb25lbnQtRHpTZDlWalcuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3Rvb2x0aXAvdG9vbHRpcC5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90b29sdGlwL3Rvb2x0aXAuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgLS1zYmItdG9vbHRpcC1wb2ludGVyLWV2ZW50czogYWxsO1xuICAtLXNiYi10b29sdGlwLW1pbi13aWR0aDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtOHgpO1xuICAtLXNiYi10b29sdGlwLW1heC13aWR0aDogbWluKFxuICAgICN7c2JiLnB4LXRvLXJlbS1idWlsZCg0MDApfSxcbiAgICBjYWxjKDEwMHZ3IC0gdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpKVxuICApO1xuICAtLXNiYi10b29sdGlwLWJvcmRlci1jb2xvcjogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMS1pbnZlcnRlZCk7XG4gIC0tc2JiLXRvb2x0aXAtYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLWJvcmRlci1yYWRpdXMtOHgpO1xuICAtLXNiYi10b29sdGlwLXBhZGRpbmc6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KSB2YXIoLS1zYmItc3BhY2luZy1maXhlZC00eCk7XG4gIC0tc2JiLXRvb2x0aXAtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMS1pbnZlcnRlZCk7XG4gIC0tc2JiLXRvb2x0aXAtY29sb3I6IHZhcigtLXNiYi1jb2xvci0yLWludmVydGVkKTtcbiAgLS1zYmItdG9vbHRpcC1hbmltYXRpb24tZHVyYXRpb246IHZhcihcbiAgICAtLXNiYi1kaXNhYmxlLWFuaW1hdGlvbi1kdXJhdGlvbixcbiAgICB2YXIoLS1zYmItYW5pbWF0aW9uLWR1cmF0aW9uLTR4KVxuICApO1xuICAtLXNiYi10b29sdGlwLWFuaW1hdGlvbi1lYXNpbmc6IGVhc2Utb3V0O1xuICAtLXNiYi10b29sdGlwLWFuaW1hdGlvbi10cmFuc2xhdGU6IDAgdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpO1xuICAtLXNiYi10b29sdGlwLWdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpO1xuICAtLXNiYi1vdmVybGF5LXBvc2l0aW9uLWFyZWE6IGJsb2NrLXN0YXJ0O1xuICAtLXNiYi1vdmVybGF5LXBvc2l0aW9uLXRyeS1mYWxsYmFja3M6XG4gICAgYmxvY2stc3RhcnQgc3Bhbi1pbmxpbmUtZW5kLCBibG9jay1zdGFydCBzcGFuLWlubGluZS1zdGFydCwgYmxvY2stZW5kLFxuICAgIGJsb2NrLWVuZCBzcGFuLWlubGluZS1lbmQsIGJsb2NrLWVuZCBzcGFuLWlubGluZS1zdGFydDtcblxuICBwb3NpdGlvbi1hcmVhOiB2YXIoLS1zYmItb3ZlcmxheS1wb3NpdGlvbi1hcmVhKTtcbiAgcG9zaXRpb24tdHJ5LWZhbGxiYWNrczogdmFyKC0tc2JiLW92ZXJsYXktcG9zaXRpb24tdHJ5LWZhbGxiYWNrcyk7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIHBvaW50ZXItZXZlbnRzOiB2YXIoLS1zYmItdG9vbHRpcC1wb2ludGVyLWV2ZW50cyk7XG4gIHotaW5kZXg6IHZhcigtLXNiYi10b29sdGlwLXotaW5kZXgsIHZhcigtLXNiYi1vdmVybGF5LWRlZmF1bHQtei1pbmRleCkpO1xuICBhbmltYXRpb24tbmFtZTogdmFyKC0tc2JiLXRvb2x0aXAtYW5pbWF0aW9uLW5hbWUpO1xuICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXNiYi10b29sdGlwLWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi10b29sdGlwLWFuaW1hdGlvbi1lYXNpbmcpO1xuXG4gIC8vIFJlc2V0IFtwb3BvdmVyXSBzdHlsZXNcbiAgYm9yZGVyOiBub25lO1xuICBpbnNldDogaW5pdGlhbDtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAwO1xufVxuXG46aG9zdCg6aXMoOnN0YXRlKHN0YXRlLW9wZW5pbmcpLCA6c3RhdGUoc3RhdGUtb3BlbmVkKSwgOnN0YXRlKHN0YXRlLWNsb3NpbmcpKSkge1xuICBkaXNwbGF5OiBibG9jaztcblxuICAtLXNiYi10b29sdGlwLWFuaW1hdGlvbi1uYW1lOiBvcGVuO1xufVxuXG46aG9zdCg6c3RhdGUoc3RhdGUtY2xvc2luZykpIHtcbiAgLS1zYmItdG9vbHRpcC1hbmltYXRpb24tbmFtZTogY2xvc2U7XG4gIC0tc2JiLXRvb2x0aXAtcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbjpob3N0KDppcyhbZGF0YS1wb3NpdGlvbn49J2Jsb2NrLWVuZCddLCBbZGF0YS1wb3NpdGlvbn49J2JvdHRvbSddLCBbZGF0YS1wb3NpdGlvbl49J2VuZCddKSkge1xuICBwYWRkaW5nLWJsb2NrLXN0YXJ0OiB2YXIoLS1zYmItdG9vbHRpcC1nYXApO1xufVxuXG46aG9zdCg6aXMoW2RhdGEtcG9zaXRpb25+PSdibG9jay1zdGFydCddLCBbZGF0YS1wb3NpdGlvbn49J3RvcCddLCBbZGF0YS1wb3NpdGlvbl49J3N0YXJ0J10pKSB7XG4gIHBhZGRpbmctYmxvY2stZW5kOiB2YXIoLS1zYmItdG9vbHRpcC1nYXApO1xufVxuXG46aG9zdChcbiAgOmlzKFxuICAgIFtkYXRhLXBvc2l0aW9ufj0naW5saW5lLXN0YXJ0J10sXG4gICAgW2RhdGEtcG9zaXRpb25+PSdpbmxpbmUtZW5kJ10sXG4gICAgW2RhdGEtcG9zaXRpb25+PSdsZWZ0J10sXG4gICAgW2RhdGEtcG9zaXRpb25+PSdyaWdodCddLFxuICAgIFtkYXRhLXBvc2l0aW9uJD0nIHN0YXJ0J10sXG4gICAgW2RhdGEtcG9zaXRpb24kPScgZW5kJ11cbiAgKVxuKSB7XG4gIC8vIEFkZCBhIGdhcCBvbiBib3RoIHNpZGVzIHRvIGRpc3RhbmNlIHRoZSB0b29sdGlwIGZyb20gdGhlIHRyaWdnZXIgYW5kIHRoZSBlZGdlIG9mIHRoZSB2aWV3cG9ydC5cbiAgcGFkZGluZy1pbmxpbmU6IHZhcigtLXNiYi10b29sdGlwLWdhcCk7XG59XG5cbi5zYmItdG9vbHRpcCB7XG4gIGJveC1zaGFkb3c6IHZhcigtLXNiYi1ib3gtc2hhZG93LWxldmVsLTUtc29mdCk7XG4gIEBpbmNsdWRlIHNiYi50ZXh0LXhzLS1yZWd1bGFyO1xuXG4gIGJvcmRlcjogdmFyKC0tc2JiLWJvcmRlci13aWR0aC0xeCkgc29saWQgdmFyKC0tc2JiLXRvb2x0aXAtYm9yZGVyLWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLXRvb2x0aXAtYm9yZGVyLXJhZGl1cyk7XG4gIHBhZGRpbmc6IHZhcigtLXNiYi10b29sdGlwLXBhZGRpbmcpO1xuICBjb2xvcjogdmFyKC0tc2JiLXRvb2x0aXAtY29sb3IpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItdG9vbHRpcC1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgbWluLXdpZHRoOiB2YXIoLS1zYmItdG9vbHRpcC1taW4td2lkdGgpO1xuICBtYXgtd2lkdGg6IHZhcigtLXNiYi10b29sdGlwLW1heC13aWR0aCk7XG59XG5cbkBrZXlmcmFtZXMgb3BlbiB7XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNsYXRlOiB2YXIoLS1zYmItdG9vbHRpcC1hbmltYXRpb24tdHJhbnNsYXRlKTtcbiAgfVxuXG4gIHRvIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zbGF0ZTogMDtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIGNsb3NlIHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2xhdGU6IDA7XG4gIH1cblxuICB0byB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2xhdGU6IHZhcigtLXNiYi10b29sdGlwLWFuaW1hdGlvbi10cmFuc2xhdGUpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgdHlwZSBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICB0eXBlIFByb3BlcnR5VmFsdWVzLFxuICB0eXBlIFRlbXBsYXRlUmVzdWx0LFxuICB1bnNhZmVDU1MsXG59IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9jb3JlL2Jhc2UtZWxlbWVudHMudHMnO1xuaW1wb3J0IHsgcmVhZENvbmZpZyB9IGZyb20gJy4uL2NvcmUvY29uZmlnLnRzJztcbmltcG9ydCB7XG4gIFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLFxuICBTYmJPdmVybGF5UG9zaXRpb25Db250cm9sbGVyLFxufSBmcm9tICcuLi9jb3JlL2NvbnRyb2xsZXJzLnRzJztcbmltcG9ydCB7IGlkUmVmZXJlbmNlIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLnRzJztcbmltcG9ydCB7IGlzQW5kcm9pZCwgaXNJT1MsIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uLCBxdWV1ZURvbUNvbnRlbnRMb2FkZWQgfSBmcm9tICcuLi9jb3JlL2RvbS50cyc7XG5pbXBvcnQgeyBhcHBlbmRBcmlhRWxlbWVudHMsIHJlbW92ZUFyaWFFbGVtZW50cywgU2JiRGlzYWJsZWRNaXhpbiB9IGZyb20gJy4uL2NvcmUvbWl4aW5zLnRzJztcbmltcG9ydCB7IHNiYk92ZXJsYXlPdXRzaWRlUG9pbnRlckV2ZW50TGlzdGVuZXIgfSBmcm9tICcuLi9jb3JlL292ZXJsYXkudHMnO1xuaW1wb3J0IHsgYm94U2l6aW5nU3R5bGVzIH0gZnJvbSAnLi4vY29yZS9zdHlsZXMudHMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi90b29sdGlwLnNjc3M/aW5saW5lJztcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHBvc2l0aW9uIGZvciB0aGUgdG9vbHRpcCBpZiB0aGlzIGVsZW1lbnQgaXMgdXNlZCBhcyBhIHRyaWdnZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2JiVG9vbHRpcERlZmF1bHRQb3NpdGlvbnMge1xuICByZWFkb25seSB0b29sdGlwUG9zaXRpb25zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaW1lIGJldHdlZW4gdGhlIHVzZXIgcHV0dGluZyB0aGUgcG9pbnRlciBvbiBhIHRvb2x0aXBcbiAqIHRyaWdnZXIgYW5kIHRoZSBsb25nIHByZXNzIGV2ZW50IGJlaW5nIGZpcmVkLlxuICovXG5jb25zdCBMT05HUFJFU1NfREVMQVkgPSA1MDA7XG5cbmNvbnN0IGlzTW9iaWxlID0gaXNBbmRyb2lkIHx8IGlzSU9TO1xuY29uc3QgdG9vbHRpcFRyaWdnZXJzID0gbmV3IFdlYWtNYXA8SFRNTEVsZW1lbnQsIFNiYlRvb2x0aXBFbGVtZW50PigpO1xubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogSXQgZGlzcGxheXMgdGV4dCBjb250ZW50IHdpdGhpbiBhIHRvb2x0aXAuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgdGhlIHRleHQgaW50byB0aGUgdG9vbHRpcC5cbiAqIEBjc3Nwcm9wIFstLXNiYi1vdmVybGF5LXBvc2l0aW9uLWFyZWE9YmxvY2stZW5kXSAtIFRoZSBwcmltYXJ5IHBvc2l0aW9uIGZvciB0aGUgdG9vbHRpcC5cbiAqIEBjc3Nwcm9wIFstLXNiYi1vdmVybGF5LXBvc2l0aW9uLXRyeS1mYWxsYmFja3M9YmxvY2stZW5kIHNwYW4taW5saW5lLWVuZCwgYmxvY2stZW5kIHNwYW4taW5saW5lLXN0YXJ0LCBibG9jay1zdGFydCwgYmxvY2stc3RhcnQgc3Bhbi1pbmxpbmUtZW5kLCBibG9jay1zdGFydCBzcGFuLWlubGluZS1zdGFydF0gLVxuICogVGhlIGxpc3Qgb2YgZmFsbGJhY2sgcG9zaXRpb25zLCBzZXBhcmF0ZWQgYnkgJywnLCBmb3IgdGhlIHRvb2x0aXBcbiAqIEBjc3Nwcm9wIFstLXNiYi10b29sdGlwLXotaW5kZXg9dmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KV0gLSBUbyBzcGVjaWZ5IGEgY3VzdG9tIHN0YWNrIG9yZGVyLFxuICogdGhlIGB6LWluZGV4YCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyB0aGlzIENTUyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgYHotaW5kZXhgIG9mIHRoZVxuICogY29tcG9uZW50IGlzIHNldCB0byBgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KWAgd2l0aCBhIHZhbHVlIG9mIGAxMDAwYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNiYlRvb2x0aXBFbGVtZW50IGV4dGVuZHMgU2JiRGlzYWJsZWRNaXhpbihTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXRvb2x0aXAnO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IHJvbGUgPSAndG9vbHRpcCc7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtib3hTaXppbmdTdHlsZXMsIHVuc2FmZUNTUyhzdHlsZSldO1xuXG4gIHByaXZhdGUgc3RhdGljIF90b29sdGlwT3V0bGV0OiBFbGVtZW50O1xuXG4gIHN0YXRpYyB7XG4gICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBibG9jayBleGVjdXRpb24gZm9yIGluaXRpYWxpemF0aW9uLFxuICAgICAgLy8gc28gd2UgZGVmZXIgaXQgdW50aWwgdGhlIERPTSBjb250ZW50IGlzIGxvYWRlZC5cbiAgICAgIHF1ZXVlRG9tQ29udGVudExvYWRlZCgoKSA9PiB0aGlzLl9pbml0aWFsaXplVG9vbHRpcE91dGxldCgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIHRvb2x0aXAgb3ZlcmxheS5cbiAgICpcbiAgICogRm9yIGF0dHJpYnV0ZSB1c2FnZSwgcHJvdmlkZSBhbiBpZCByZWZlcmVuY2UuXG4gICAqL1xuICBAaWRSZWZlcmVuY2UoKVxuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgdHJpZ2dlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogT3BlbiB0aGUgdG9vbHRpcCBhZnRlciBhIGdpdmVuIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICogR2xvYmFsIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBhcyBkZWZhdWx0LCBpZiBub3Qgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdvcGVuLWRlbGF5JywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBzZXQgb3BlbkRlbGF5KHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XG4gICAgdGhpcy5fb3BlbkRlbGF5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBvcGVuRGVsYXkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlbkRlbGF5ID8/IHJlYWRDb25maWcoKS50b29sdGlwPy5vcGVuRGVsYXkgPz8gMDtcbiAgfVxuICBwcml2YXRlIF9vcGVuRGVsYXk6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgdG9vbHRpcCBhZnRlciBhIGdpdmVuIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICogR2xvYmFsIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBhcyBkZWZhdWx0LCBpZiBub3Qgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdjbG9zZS1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgc2V0IGNsb3NlRGVsYXkodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9jbG9zZURlbGF5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBjbG9zZURlbGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb3NlRGVsYXkgPz8gcmVhZENvbmZpZygpLnRvb2x0aXA/LmNsb3NlRGVsYXkgPz8gMDtcbiAgfVxuICBwcml2YXRlIF9jbG9zZURlbGF5OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSBjbG9zZSB0aGUgdG9vbHRpcCBhZnRlciBpdCBoYXMgYmVlbiBvcGVuIGJ5IGxvbmcgcHJlc3MuXG4gICAqIEdsb2JhbCBjb25maWd1cmF0aW9uIGlzIHVzZWQgYXMgZGVmYXVsdCwgaWYgbm90IHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgMTUwMFxuICAgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbG9uZy1wcmVzcy1jbG9zZS1kZWxheScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgc2V0IGxvbmdQcmVzc0Nsb3NlRGVsYXkodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2xvbmdQcmVzc0Nsb3NlRGVsYXkgPSArdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBsb25nUHJlc3NDbG9zZURlbGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xvbmdQcmVzc0Nsb3NlRGVsYXkgPz8gcmVhZENvbmZpZygpLnRvb2x0aXA/LmxvbmdQcmVzc0Nsb3NlRGVsYXkgPz8gMTUwMDtcbiAgfVxuICBwcml2YXRlIF9sb25nUHJlc3NDbG9zZURlbGF5PzogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3RyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF90cmlnZ2VyQWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9vcGVuU3RhdGVDb250cm9sbGVyITogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlciA9IG5ldyBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfb3ZlcmxheUNvbnRyb2xsZXIgPSBuZXcgU2JiT3ZlcmxheVBvc2l0aW9uQ29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfb3BlblRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfY2xvc2VUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgX2xvbmdQcmVzc09wZW5UaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgX2xvbmdQcmVzc0Nsb3NlVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gVW50aWwgdGhlIG1vdXNlIGhvdmVycyB0aGUgdG9vbHRpcCwgaXQgc3RheXMgb3Blbi5cbiAgICAvLyBPbiAnbW91c2VsZWF2ZScgKGlmIHRoZSBtb3VzZSBpcyBub3QgbW92ZWQgb250byB0aGUgdHJpZ2dlciBhZ2FpbiksIGNsb3NlIGl0LlxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdtb3VzZWxlYXZlJyxcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykgJiZcbiAgICAgICAgICAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgIXRoaXMuX3RyaWdnZXJFbGVtZW50Py5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLl9kZWxheWVkQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgcGFzc2l2ZTogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICAvLyBBbnkgdXNlciBpbnRlcmFjdGlvbiBvdXRzaWRlIHRoZSB0b29sdGlwIGNsb3NlcyBpdCBpbW1lZGlhdGVseVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignb3ZlcmxheU91dHNpZGVQb2ludGVyJywgKCkgPT4gdGhpcy5jbG9zZSgpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbmVuZCcsIChlKSA9PiB0aGlzLl9vblRvb2x0aXBBbmltYXRpb25FbmQoZSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9pbml0aWFsaXplVG9vbHRpcE91dGxldCgpOiB2b2lkIHtcbiAgICB0aGlzLl90b29sdGlwT3V0bGV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fdG9vbHRpcE91dGxldC5jbGFzc0xpc3QuYWRkKCdzYmItb3ZlcmxheS1vdXRsZXQnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX3Rvb2x0aXBPdXRsZXQpO1xuXG4gICAgLy8gV2UgYXJlIHVzaW5nIE11dGF0aW9uT2JzZXJ2ZXIgZGlyZWN0bHkgaGVyZSwgYXMgaXQgd2lsbCBvbmx5IGJlIGNhbGxlZCBvbiBjbGllbnQgc2lkZSxcbiAgICAvLyBhbmQgd2UgZG8gbm90IG5lZWQgdG8gZGlzY29ubmVjdCBpdCwgYXMgd2Ugd2FudCBpdCB0byB3b3JrIGR1cmluZyB0aGUgZnVsbCBsaWZldGltZVxuICAgIC8vIG9mIHRoZSBwYWdlLlxuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycpIHtcbiAgICAgICAgICB0aGlzLl9oYW5kbGVUb29sdGlwVHJpZ2dlcihtdXRhdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIFsuLi5tdXRhdGlvbi5hZGRlZE5vZGVzLCAuLi5tdXRhdGlvbi5yZW1vdmVkTm9kZXNdLmZpbHRlcihcbiAgICAgICAgICAgIChuKTogbiBpcyBIVE1MRWxlbWVudCA9PiBuLm5vZGVUeXBlID09PSBuLkVMRU1FTlRfTk9ERSxcbiAgICAgICAgICApKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVUb29sdGlwVHJpZ2dlcihub2RlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmRBbmRIYW5kbGVUb29sdGlwVHJpZ2dlcnMobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHtcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogW1xuICAgICAgICAnc2JiLXRvb2x0aXAnLFxuICAgICAgICAnc2JiLXRvb2x0aXAtb3Blbi1kZWxheScsXG4gICAgICAgICdzYmItdG9vbHRpcC1jbG9zZS1kZWxheScsXG4gICAgICAgICdzYmItdG9vbHRpcC1wb3NpdGlvbicsXG4gICAgICBdLFxuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLl9maW5kQW5kSGFuZGxlVG9vbHRpcFRyaWdnZXJzKGRvY3VtZW50LmJvZHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2ZpbmRBbmRIYW5kbGVUb29sdGlwVHJpZ2dlcnMocm9vdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICByb290XG4gICAgICAucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ1tzYmItdG9vbHRpcF0nKVxuICAgICAgLmZvckVhY2goKGUpID0+IHRoaXMuX2hhbmRsZVRvb2x0aXBUcmlnZ2VyKGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9oYW5kbGVUb29sdGlwVHJpZ2dlcih0cmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0b29sdGlwTWVzc2FnZSA9IHRyaWdnZXJFbGVtZW50LmdldEF0dHJpYnV0ZSgnc2JiLXRvb2x0aXAnKTtcbiAgICBsZXQgdG9vbHRpcCA9IHRvb2x0aXBUcmlnZ2Vycy5nZXQodHJpZ2dlckVsZW1lbnQpO1xuXG4gICAgaWYgKHRvb2x0aXBNZXNzYWdlICYmIHRyaWdnZXJFbGVtZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICBpZiAoIXRvb2x0aXApIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNiYi10b29sdGlwIGluIHRoZSBvdXRsZXQgYW5kIGF0dGFjaCBpdCB0byB0aGUgdHJpZ2dlclxuICAgICAgICB0b29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2JiLXRvb2x0aXAnKTtcbiAgICAgICAgdG9vbHRpcFRyaWdnZXJzLnNldCh0cmlnZ2VyRWxlbWVudCwgdG9vbHRpcCk7XG4gICAgICAgIHRoaXMuX3Rvb2x0aXBPdXRsZXQuYXBwZW5kQ2hpbGQodG9vbHRpcCk7XG4gICAgICAgIHRvb2x0aXAudHJpZ2dlciA9IHRyaWdnZXJFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB0b29sdGlwLnRleHRDb250ZW50ID0gdG9vbHRpcE1lc3NhZ2U7XG4gICAgICB0b29sdGlwLm9wZW5EZWxheSA9IHRyaWdnZXJFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnc2JiLXRvb2x0aXAtb3Blbi1kZWxheScpXG4gICAgICAgID8gK3RyaWdnZXJFbGVtZW50LmdldEF0dHJpYnV0ZSgnc2JiLXRvb2x0aXAtb3Blbi1kZWxheScpIVxuICAgICAgICA6IG51bGw7XG4gICAgICB0b29sdGlwLmNsb3NlRGVsYXkgPSB0cmlnZ2VyRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3NiYi10b29sdGlwLWNsb3NlLWRlbGF5JylcbiAgICAgICAgPyArdHJpZ2dlckVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzYmItdG9vbHRpcC1jbG9zZS1kZWxheScpIVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHBvc2l0aW9ucyBmcm9tIHRoZSB0cmlnZ2VyIChlaXRoZXIgZnJvbSB0aGUgYXR0cmlidXRlIG9yIHRoZSBwcm9wZXJ0eSlcbiAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRyaWdnZXJFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnc2JiLXRvb2x0aXAtcG9zaXRpb24nKVxuICAgICAgICA/IHRyaWdnZXJFbGVtZW50XG4gICAgICAgICAgICAuZ2V0QXR0cmlidXRlKCdzYmItdG9vbHRpcC1wb3NpdGlvbicpIVxuICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoKHApID0+IHAudHJpbSgpKVxuICAgICAgICA6ICh0cmlnZ2VyRWxlbWVudCBhcyB1bmtub3duIGFzIFNiYlRvb2x0aXBEZWZhdWx0UG9zaXRpb25zKS50b29sdGlwUG9zaXRpb25zO1xuXG4gICAgICBpZiAocG9zaXRpb25zICYmIHBvc2l0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRvb2x0aXAuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2JiLW92ZXJsYXktcG9zaXRpb24tYXJlYScsIHBvc2l0aW9uc1swXSk7XG4gICAgICAgIHRvb2x0aXAuc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgJy0tc2JiLW92ZXJsYXktcG9zaXRpb24tdHJ5LWZhbGxiYWNrcycsXG4gICAgICAgICAgcG9zaXRpb25zLnNsaWNlKDEpLmpvaW4oJywgJyksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b29sdGlwLnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLXNiYi1vdmVybGF5LXBvc2l0aW9uLWFyZWEnKTtcbiAgICAgICAgdG9vbHRpcC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnLS1zYmItb3ZlcmxheS1wb3NpdGlvbi10cnktZmFsbGJhY2tzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b29sdGlwKSB7XG4gICAgICAvLyBUaGUgdHJpZ2dlciBvciB0aGUgYXR0cmlidXRlIGhhcyBiZWVuIGRlbGV0ZWQgPT4gZGVsZXRlIHRoZSBjb25uZWN0ZWQgdG9vbHRpcFxuICAgICAgdG9vbHRpcFRyaWdnZXJzLmRlbGV0ZSh0cmlnZ2VyRWxlbWVudCk7XG4gICAgICAvLyBJZiBhIGNvbnN1bWVyIG92ZXJyaWRlcyB0aGUgYHNiYi10b29sdGlwYCwgdGhlIGZvbGxvd2luZyBjb2RlIHNob3VsZCBub3QgYmVcbiAgICAgIC8vIGV4ZWN1dGVkIGFzIHdlIGNhbid0IGV4cGVjdCB0aGF0IHByaXZhdGUgbWV0aG9kcyBhcmUgbW9ja2VkLlxuICAgICAgdG9vbHRpcC5fZGVzdHJveT8uKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5wb3BvdmVyID0gJ21hbnVhbCc7XG4gICAgdGhpcy5pZCB8fD0gYHNiYi10b29sdGlwLSR7KytuZXh0SWR9YDtcbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgc2JiT3ZlcmxheU91dHNpZGVQb2ludGVyRXZlbnRMaXN0ZW5lci5jb25uZWN0KHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuaGFzVXBkYXRlZCAmJiB0aGlzLnRyaWdnZXIpIHtcbiAgICAgIHRoaXMuX2F0dGFjaCh0aGlzLnRyaWdnZXIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHNiYk92ZXJsYXlPdXRzaWRlUG9pbnRlckV2ZW50TGlzdGVuZXIuZGlzY29ubmVjdCh0aGlzKTtcbiAgICB0aGlzLl9kZXRhY2goKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgIG5hbWU/OiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICk6IHZvaWQge1xuICAgIHN1cGVyLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgoIW5hbWUgfHwgbmFtZSA9PT0gJ3RyaWdnZXInKSAmJiB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX2F0dGFjaCh0aGlzLnRyaWdnZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9hdHRhY2godGhpcy50cmlnZ2VyKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0T3BlbkNsb3NlVGltZW91dCgpO1xuICAgIGlmIChcbiAgICAgICh0aGlzLnN0YXRlICE9PSAnY2xvc2VkJyAmJiB0aGlzLnN0YXRlICE9PSAnY2xvc2luZycpIHx8XG4gICAgICB0aGlzLmRpc2FibGVkIHx8XG4gICAgICAhdGhpcy50cmlnZ2VyIHx8XG4gICAgICAhdGhpcy5kaXNwYXRjaEJlZm9yZU9wZW5FdmVudCgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zaG93UG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuaW5nJztcbiAgICB0aGlzLl9vdmVybGF5Q29udHJvbGxlci5jb25uZWN0KHRoaXMudHJpZ2dlcik7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXNldE9wZW5DbG9zZVRpbWVvdXQoKTtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29wZW5lZCcgJiYgdGhpcy5zdGF0ZSAhPT0gJ29wZW5pbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaEJlZm9yZUNsb3NlRXZlbnQoKTtcbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuXG4gICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgYGNsb3NlZGAgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZWxheWVkT3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXNldE9wZW5DbG9zZVRpbWVvdXQoKTtcbiAgICB0aGlzLl9vcGVuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vcGVuKCksIHRoaXMub3BlbkRlbGF5KTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuZWQnO1xuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmNvbm5lY3QoKTtcbiAgICB0aGlzLmRpc3BhdGNoT3BlbkV2ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF9kZWxheWVkQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzZXRPcGVuQ2xvc2VUaW1lb3V0KCk7XG4gICAgdGhpcy5fY2xvc2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmNsb3NlKCksIHRoaXMuY2xvc2VEZWxheSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVDbG9zaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB0aGlzLmhpZGVQb3BvdmVyPy4oKTtcbiAgICB0aGlzLl9vdmVybGF5Q29udHJvbGxlci5kaXNjb25uZWN0KCk7XG5cbiAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5kaXNwYXRjaENsb3NlRXZlbnQoKTtcbiAgICB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyPy5hYm9ydCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Ub29sdGlwQW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnb3BlbicgJiYgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnY2xvc2UnICYmIHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlQ2xvc2luZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaCh0cmlnZ2VyOiBIVE1MRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIC8vIEV2ZW50dWFsbHkgZGV0YWNoIGZyb20gdGhlIG9sZCB0cmlnZ2VyXG4gICAgICB0aGlzLl9kZXRhY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCA9IHRyaWdnZXI7XG4gICAgaWYgKCF0aGlzLl90cmlnZ2VyRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5hcmlhRGVzY3JpYmVkQnlFbGVtZW50cyA9IGFwcGVuZEFyaWFFbGVtZW50cyhcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LmFyaWFEZXNjcmliZWRCeUVsZW1lbnRzLFxuICAgICAgdGhpcyxcbiAgICApO1xuICAgIHRoaXMuX2FkZFRyaWdnZXJFdmVudEhhbmRsZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIF9kZXRhY2goKTogdm9pZCB7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLl9vcGVuU3RhdGVDb250cm9sbGVyPy5hYm9ydCgpO1xuXG4gICAgLy8gY2xlYXIgdGltZW91dHNcbiAgICB0aGlzLl9yZXNldE9wZW5DbG9zZVRpbWVvdXQoKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fbG9uZ1ByZXNzT3BlblRpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUHJlc3NDbG9zZVRpbWVvdXQpO1xuXG4gICAgaWYgKCF0aGlzLl90cmlnZ2VyRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5hcmlhRGVzY3JpYmVkQnlFbGVtZW50cyA9IHJlbW92ZUFyaWFFbGVtZW50cyhcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LmFyaWFEZXNjcmliZWRCeUVsZW1lbnRzLFxuICAgICAgdGhpcyxcbiAgICApO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2Rlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGV0YWNoKCk7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZFRyaWdnZXJFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLl90cmlnZ2VyRWxlbWVudDtcbiAgICBpZiAoIXRyaWdnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgb3B0aW9uczogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSB7XG4gICAgICBzaWduYWw6IHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgaWYgKCFpc01vYmlsZSkge1xuICAgICAgdHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy5fZGVsYXllZE9wZW4oKSwgb3B0aW9ucyk7XG4gICAgICB0cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdtb3VzZWxlYXZlJyxcbiAgICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3VGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBOb2RlIHwgbnVsbDtcbiAgICAgICAgICBpZiAoIW5ld1RhcmdldCB8fCBuZXdUYXJnZXQgIT09IHRoaXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlbGF5ZWRDbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICk7XG5cbiAgICAgIC8vICdibHVycycgaW1tZWRpYXRlbHkgY2xvc2UgdGhlIHRvb2x0aXAgYmVjYXVzZSBpdCBpcyBjb25zaWRlcmVkIGFuICdpbnRlcmFjdGlvbiB3aXRoIG90aGVyIGVsZW1lbnRzJ1xuICAgICAgdHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5jbG9zZSgpLCBvcHRpb25zKTtcbiAgICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB0aGlzLl9kZWxheWVkT3BlbigpLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMb25nLXByZXNzIGV2ZW50IGhhbmRsaW5nIChtYWlubHkgZm9yIG1vYmlsZSB1c2VycylcbiAgICB0cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAndG91Y2hzdGFydCcsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUHJlc3NPcGVuVGltZW91dCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUHJlc3NDbG9zZVRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9sb25nUHJlc3NPcGVuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vcGVuKCksIExPTkdQUkVTU19ERUxBWSk7XG4gICAgICB9LFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICd0b3VjaGVuZCcsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUHJlc3NPcGVuVGltZW91dCk7XG4gICAgICAgIHRoaXMuX2xvbmdQcmVzc0Nsb3NlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbG9zZSgpLCB0aGlzLmxvbmdQcmVzc0Nsb3NlRGVsYXkpO1xuICAgICAgfSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICB0cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAndG91Y2hjYW5jZWwnLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fbG9uZ1ByZXNzT3BlblRpbWVvdXQpO1xuICAgICAgfSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1plcm9BbmltYXRpb25EdXJhdGlvbih0aGlzLCAnLS1zYmItdG9vbHRpcC1hbmltYXRpb24tZHVyYXRpb24nKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0T3BlbkNsb3NlVGltZW91dCgpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fb3BlblRpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVvdXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXRvb2x0aXBcIj5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRvb2x0aXAnOiBTYmJUb29sdGlwRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDb0NBLElBQU0sa0JBQWtCO0FBRXhCLElBQU0sV0FBVyxhQUFhO0FBQzlCLElBQU0sa0NBQWtCLElBQUksU0FBeUM7QUFDckUsSUFBSSxTQUFTOzs7Ozs7Ozs7Ozs7SUFhQSwyQkFBaUI7bUJBQVMsaUJBQWlCLHdCQUF3Qjs7Ozs7Ozs7Y0FBbkUsMEJBQTBCLFlBQXlDOzs7MEJBb0I3RSxhQUFhLEVBQ2IsVUFBVSxDQUFBO2dDQVNWLFNBQVM7SUFBRSxXQUFXO0lB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
@@ -1,16 +0,0 @@
1
- import { html as e, unsafeCSS as t } from "lit";
2
- import { SbbElement as n } from "./core/base-elements.js";
3
- //#region src/elements/timetable-form/timetable-form-details/timetable-form-details.scss?inline
4
- var r = ":host{--sbb-timetable-form-details-padding-block: var(--sbb-spacing-fixed-1x);--sbb-timetable-form-details-padding-inline: var(--sbb-spacing-responsive-xxs);--sbb-timetable-form-details-horizontal-divider-height: 1.5rem;display:flex;flex-wrap:wrap;gap:var(--sbb-spacing-fixed-1x);border-block-start:var(--sbb-border-width-1x) solid var(--sbb-border-color-4-inverted);padding-block:var(--sbb-timetable-form-details-padding-block);padding-inline-start:calc(var(--sbb-size-icon-ui-small) + var(--sbb-spacing-responsive-xxxs));align-items:center}::slotted(sbb-form-field){--sbb-form-field-border-radius: var(--sbb-border-radius-6x);--sbb-form-field-outline-offset: -.3125rem}::slotted(sbb-divider[orientation=vertical]){height:var(--sbb-timetable-form-details-horizontal-divider-height)}::slotted(:last-child){margin-inline-end:var(--sbb-timetable-form-details-padding-inline)}", i = class extends n {
5
- static {
6
- this.elementName = "sbb-timetable-form-details";
7
- }
8
- static {
9
- this.styles = t(r);
10
- }
11
- render() {
12
- return e`<slot></slot>`;
13
- }
14
- };
15
- //#endregion
16
- export { i as t };
@@ -1,32 +0,0 @@
1
- import { html as e, isServer as t, unsafeCSS as n } from "lit";
2
- import { SbbFormFieldElement as r } from "./form-field.pure.js";
3
- //#region src/elements/timetable-form/timetable-form-field/timetable-form-field.scss?inline
4
- var i = ":host{display:flex;--sbb-form-field-border-radius: var(--sbb-border-radius-6x);--sbb-form-field-outline-offset: -.3125rem;--sbb-timetable-form-field-route-icon-color: var(--sbb-color-2);--sbb-timetable-form-field-route-icon-background-color: var(--sbb-background-color-1)}:host(:first-of-type){--sbb-timetable-form-field-route-icon-rotate: 90deg}:host(:last-of-type){--sbb-timetable-form-field-route-icon-rotate: -90deg;--sbb-timetable-form-field-route-icon-translate: -.0625rem 0}:host(:where(:not(:last-of-type))) .sbb-form-field__wrapper:after{content:\"\";position:absolute;border-block-end:var(--sbb-border-width-1x) var(--sbb-form-field-border-style) var(--sbb-border-color-4-inverted);inset-inline:var(--sbb-form-field-padding-inline);inset-block-end:0}.sbb-timetable-form-field__start-route-icon{align-self:center;margin-inline-start:var(--sbb-form-field-padding-inline);rotate:var(--sbb-timetable-form-field-route-icon-rotate);translate:var(--sbb-timetable-form-field-route-icon-translate)}.sbb-timetable-form-field__start-route-icon:after{--connecting-line-offset: .1875rem;--connecting-line-width: calc( (var(--sbb-form-field-min-height) - var(--sbb-icon-svg-height)) / 2 + var(--connecting-line-offset) );content:\"\";position:absolute;inset-block-start:50%;border-block-start:var(--sbb-border-width-1x) solid var(--sbb-timetable-form-field-route-icon-color);width:var(--connecting-line-width);margin-left:calc(var(--connecting-line-offset) * -1)}.sbb-timetable-form-field__via-route-icon{align-self:stretch;position:relative;width:var(--sbb-size-icon-ui-small);margin-inline-start:var(--sbb-form-field-padding-inline)}.sbb-timetable-form-field__via-route-icon:before{content:\"\";position:absolute;inset-inline-start:50%;height:100%;margin-inline-start:-.0625rem;border-inline-start:var(--sbb-border-width-1x) solid var(--sbb-timetable-form-field-route-icon-color)}.sbb-timetable-form-field__via-route-icon:after{content:\"\";position:absolute;inset-block-start:50%;inset-inline-start:50%;translate:-50% -50%;width:.4375rem;height:.4375rem;border:var(--sbb-border-width-1x) solid var(--sbb-timetable-form-field-route-icon-color);border-radius:var(--sbb-border-radius-infinity);background-color:var(--sbb-timetable-form-field-route-icon-background-color);margin-inline-start:-.03125rem}.sbb-form-field__space-wrapper{flex-grow:1}";
5
- //#endregion
6
- //#region src/elements/timetable-form/timetable-form-field/timetable-form-field.component.ts
7
- r.define();
8
- var a = class extends r {
9
- static {
10
- this.elementName = "sbb-timetable-form-field";
11
- }
12
- static {
13
- this.styles = [r.styles, n(i)];
14
- }
15
- constructor() {
16
- super(), this._routeIcon = !1, this.borderless = !0, this.floatingLabel = !0, this.width = "collapse", this.size = "l";
17
- }
18
- connectedCallback() {
19
- super.connectedCallback(), !t && this.hydrationComplete.then(() => this._routeIcon = this.matches(":first-of-type, :last-of-type"));
20
- }
21
- render() {
22
- return e`
23
- ${this._routeIcon ? e` <sbb-icon
24
- name="route-circle-start-small"
25
- class="sbb-timetable-form-field__start-route-icon"
26
- ></sbb-icon>` : e` <span class="sbb-timetable-form-field__via-route-icon"></span> `}
27
- ${super.render()}
28
- `;
29
- }
30
- };
31
- //#endregion
32
- export { a as t };
@@ -1,119 +0,0 @@
1
- import { __esDecorate as e, __runInitializers as t } from "tslib";
2
- import { html as n, unsafeCSS as r } from "lit";
3
- import { property as i } from "lit/decorators.js";
4
- import { SbbElement as a } from "./core/base-elements.js";
5
- import { isLean as o } from "./core/dom.js";
6
- import { SbbFormAssociatedCheckboxMixin as s } from "./core/mixins.js";
7
- import { boxSizingStyles as c } from "./core/styles.js";
8
- import { SbbIconNameMixin as l } from "./icon.js";
9
- //#region src/elements/toggle-check/toggle-check.scss?inline
10
- var u = "@charset \"UTF-8\";:host{display:inline-block;outline:none!important;--sbb-toggle-check-color: var(--sbb-color-2);--sbb-toggle-check-checked-color: var(--sbb-color-primary);--sbb-toggle-check-background-color: var(--sbb-background-color-4);--sbb-toggle-check-icon-color: var(--sbb-toggle-check-checked-color);--sbb-toggle-check-icon-opacity: 0;--sbb-toggle-check-circle-background-color: var(--sbb-background-color-1);--sbb-toggle-check-circle-border-color: var(--sbb-border-color-5);--sbb-toggle-check-circle-border-style: solid;--sbb-toggle-check-circle-diameter: 1.75rem;--sbb-toggle-check-overall-height: var(--sbb-toggle-check-circle-diameter);--sbb-toggle-check-circle-transform: translate(0, -50%);--sbb-toggle-check-height: 1.5rem;--sbb-toggle-check-width: calc(2 * var(--sbb-toggle-check-height));--sbb-toggle-check-cursor: var(--sbb-cursor-pointer);--sbb-toggle-check-flex-direction: row-reverse;--sbb-toggle-check-gap: var(--sbb-spacing-fixed-3x);--sbb-toggle-check-animation-duration: var( --sbb-disable-animation-duration, var(--sbb-animation-duration-6x) )}@media(forced-colors:active){:host{--sbb-toggle-check-background-color: CanvasText;--sbb-toggle-check-circle-background-color: Canvas}}:host([size=m]){--sbb-toggle-check-overall-height: calc(1em * var(--sbb-typo-line-height-text))}:host(:is(:state(checked),[state--checked])){--sbb-toggle-check-background-color: var(--sbb-toggle-check-checked-color);--sbb-toggle-check-circle-background-color: var(--sbb-background-color-1-negative-inverted);--sbb-toggle-check-circle-border-color: var(--sbb-toggle-check-background-color);--sbb-toggle-check-icon-opacity: 1;--sbb-toggle-check-circle-transform: translate( calc(100% - 2 * (100% - .5 * var(--sbb-toggle-check-width))), -50% )}@media(forced-colors:active){:host(:is(:state(checked),[state--checked])){--sbb-toggle-check-icon-color: Highlight;--sbb-toggle-check-background-color: Highlight}}:host(:disabled){--sbb-toggle-check-background-color: var(--sbb-background-color-4);--sbb-toggle-check-circle-background-color: var(--sbb-background-color-3);--sbb-toggle-check-circle-border-color: var(--sbb-border-color-5);--sbb-toggle-check-circle-border-style: dashed;--sbb-toggle-check-icon-color: var(--sbb-color-granite);--sbb-toggle-check-icon-color: light-dark(var(--sbb-color-granite), var(--sbb-color-storm));--sbb-toggle-check-cursor: var(--sbb-cursor-default)}@media(forced-colors:active){:host(:disabled){--sbb-toggle-check-icon-color: GrayText;--sbb-toggle-check-background-color: GrayText;--sbb-toggle-check-circle-border-style: solid}}:host([label-position=before]){--sbb-toggle-check-flex-direction: row}.sbb-toggle-check{position:relative;display:flex;color:var(--sbb-toggle-check-color);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;cursor:var(--sbb-toggle-check-cursor)}.sbb-toggle-check:before{content:\"​\";-webkit-user-select:none;user-select:none;width:0;height:0}:host(:focus-visible) .sbb-toggle-check{outline-offset:var(--sbb-focus-outline-offset);outline:var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);border-radius:calc(var(--sbb-border-radius-4x) - var(--sbb-focus-outline-offset))}.sbb-toggle-check__container{--sbb-text-font-size: var(--sbb-text-font-size-s);font-family:var(--sbb-typo-font-family);font-weight:400;line-height:var(--sbb-typo-line-height-text);letter-spacing:var(--sbb-typo-letter-spacing-text);font-size:var(--sbb-text-font-size);display:flex;flex-direction:var(--sbb-toggle-check-flex-direction);gap:var(--sbb-toggle-check-gap);align-items:start;width:100%}:host([size=m]) .sbb-toggle-check__container{--sbb-text-font-size: var(--sbb-text-font-size-m);font-family:var(--sbb-typo-font-family);font-weight:400;line-height:var(--sbb-typo-line-height-text);letter-spacing:var(--sbb-typo-letter-spacing-text);font-size:var(--sbb-text-font-size)}:host([size=xs]) .sbb-toggle-check__container{--sbb-text-font-size: var(--sbb-text-font-size-xs);font-family:var(--sbb-typo-font-family);font-weight:400;line-height:var(--sbb-typo-line-height-text);letter-spacing:var(--sbb-typo-letter-spacing-text);font-size:var(--sbb-text-font-size)}.sbb-toggle-check__label{flex-grow:1;padding-block-start:calc((var(--sbb-toggle-check-circle-diameter) - var(--sbb-typo-line-height-text) * 1em) / 2)}:host(:not(:is(:state(slotted),[state--slotted]))) .sbb-toggle-check__label{display:none}.sbb-toggle-check__track{display:inline-block;position:relative;min-width:var(--sbb-toggle-check-width);height:var(--sbb-toggle-check-height);border-radius:var(--sbb-border-radius-infinity);background-color:var(--sbb-toggle-check-background-color);margin-block:calc((var(--sbb-toggle-check-overall-height) - var(--sbb-toggle-check-height)) / 2)}.sbb-toggle-check__circle{box-shadow:var(--sbb-box-shadow-level-5-hard);position:absolute;top:50%;transform:translateY(-50%);width:var(--sbb-toggle-check-circle-diameter);height:var(--sbb-toggle-check-circle-diameter);border:var(--sbb-border-width-1x) var(--sbb-toggle-check-circle-border-style) var(--sbb-toggle-check-circle-border-color);border-radius:50%;background-color:var(--sbb-toggle-check-circle-background-color);color:var(--sbb-toggle-check-icon-color);will-change:transform;transform:var(--sbb-toggle-check-circle-transform);transition:transform ease var(--sbb-toggle-check-animation-duration)}.sbb-toggle-check__icon{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:var(--sbb-size-icon-ui-small);height:var(--sbb-size-icon-ui-small);opacity:var(--sbb-toggle-check-icon-opacity);transition:opacity ease var(--sbb-toggle-check-animation-duration)}", d = (() => {
11
- let d = l(s(a)), f, p = [], m = [], h, g = [], _ = [], v, y = [], b = [];
12
- return class extends d {
13
- static {
14
- let t = typeof Symbol == "function" && Symbol.metadata ? Object.create(d[Symbol.metadata] ?? null) : void 0;
15
- f = [i()], h = [i({ reflect: !0 })], v = [i({
16
- attribute: "label-position",
17
- reflect: !0
18
- })], e(this, null, f, {
19
- kind: "accessor",
20
- name: "value",
21
- static: !1,
22
- private: !1,
23
- access: {
24
- has: (e) => "value" in e,
25
- get: (e) => e.value,
26
- set: (e, t) => {
27
- e.value = t;
28
- }
29
- },
30
- metadata: t
31
- }, p, m), e(this, null, h, {
32
- kind: "accessor",
33
- name: "size",
34
- static: !1,
35
- private: !1,
36
- access: {
37
- has: (e) => "size" in e,
38
- get: (e) => e.size,
39
- set: (e, t) => {
40
- e.size = t;
41
- }
42
- },
43
- metadata: t
44
- }, g, _), e(this, null, v, {
45
- kind: "accessor",
46
- name: "labelPosition",
47
- static: !1,
48
- private: !1,
49
- access: {
50
- has: (e) => "labelPosition" in e,
51
- get: (e) => e.labelPosition,
52
- set: (e, t) => {
53
- e.labelPosition = t;
54
- }
55
- },
56
- metadata: t
57
- }, y, b), t && Object.defineProperty(this, Symbol.metadata, {
58
- enumerable: !0,
59
- configurable: !0,
60
- writable: !0,
61
- value: t
62
- });
63
- }
64
- static {
65
- this.elementName = "sbb-toggle-check";
66
- }
67
- static {
68
- this.styles = [c, r(u)];
69
- }
70
- #e = t(this, p, null);
71
- get value() {
72
- return this.#e;
73
- }
74
- set value(e) {
75
- this.#e = e;
76
- }
77
- #t = (t(this, m), t(this, g, o() ? "xs" : "s"));
78
- get size() {
79
- return this.#t;
80
- }
81
- set size(e) {
82
- this.#t = e;
83
- }
84
- #n = (t(this, _), t(this, y, "after"));
85
- get labelPosition() {
86
- return this.#n;
87
- }
88
- set labelPosition(e) {
89
- this.#n = e;
90
- }
91
- requestUpdate(e, t, n) {
92
- super.requestUpdate(e, t, n), e === "checked" && (this.internals.ariaChecked = `${this.checked}`, this.toggleState("checked", this.checked));
93
- }
94
- renderIconName() {
95
- return super.renderIconName() || "tick-small";
96
- }
97
- render() {
98
- return n`
99
- <span class="sbb-toggle-check">
100
- <span class="sbb-toggle-check__container">
101
- <span class="sbb-toggle-check__label">
102
- <slot></slot>
103
- </span>
104
- <span class="sbb-toggle-check__track">
105
- <span class="sbb-toggle-check__circle">
106
- <span class="sbb-toggle-check__icon"> ${this.renderIconSlot()} </span>
107
- </span>
108
- </span>
109
- </span>
110
- </span>
111
- `;
112
- }
113
- constructor() {
114
- super(...arguments), t(this, b);
115
- }
116
- };
117
- })();
118
- //#endregion
119
- export { d as t };