@sbb-esta/lyne-elements-dev 5.0.0-next-dev.1777019159 → 5.0.0-next-dev.1777034079

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.
@@ -1,411 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { nothing, unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbDisabledMixin, SbbFormAssociatedMixin, SbbLanguageController, forceType, forwardEvent, i18nFileSelectorButtonLabel, i18nFileSelectorButtonLabelMultiple, i18nFileSelectorCurrentlySelected, i18nFileSelectorDeleteFile, isLean, sbbInputModalityDetector, ɵstateController } from "./core.js";
5
- import { html as html$1, unsafeStatic } from "lit/static-html.js";
6
- import { SbbSecondaryButtonElement } from "./button.pure.js";
7
- import { ref } from "lit/directives/ref.js";
8
- //#endregion
9
- //#region src/elements/file-selector/common/file-selector-common.ts
10
- var fileSelectorCommonStyle = unsafeCSS(":host {\n --sbb-file-selector-color: var(--sbb-color-2);\n --sbb-file-selector-subtitle-color: var(--sbb-color-granite);\n --sbb-file-selector-subtitle-color: light-dark(var(--sbb-color-granite), var(--sbb-color-smoke));\n --sbb-file-selector-background-color: var(--sbb-background-color-1);\n --sbb-file-selector-border-color: var(--sbb-border-color-4-inverted);\n --sbb-file-selector-transition-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-2x)\n );\n --sbb-file-selector-transition-easing-function: var(--sbb-animation-easing);\n display: block;\n width: 20rem;\n}\n\n@media (forced-colors: active) {\n :host(:disabled) {\n --sbb-file-selector-color: GrayText;\n --sbb-file-selector-subtitle-color: GrayText;\n --sbb-file-selector-border-color: GrayText;\n }\n}\n\n:host(:is(:state(active),[state--active])) {\n --sbb-file-selector-background-color: var(--sbb-background-color-3);\n --sbb-file-selector-border-color: var(--sbb-color-storm);\n --sbb-file-selector-border-color: light-dark(var(--sbb-color-storm), var(--sbb-color-anthracite));\n}\n@media (forced-colors: active) {\n :host(:is(:state(active),[state--active])) {\n --sbb-file-selector-border-color: Highlight;\n }\n}\n\n.sbb-file-selector__input-container {\n -webkit-tap-highlight-color: transparent;\n display: flex;\n flex-direction: column;\n}\n\n.sbb-file-selector__visually-hidden {\n border: 0;\n clip-path: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.sbb-file-selector__file-list {\n display: flex;\n flex-direction: column;\n row-gap: var(--sbb-spacing-fixed-3x);\n margin-block: 0;\n padding-inline: 0;\n padding-block: var(--sbb-spacing-fixed-6x) var(--sbb-spacing-fixed-1x);\n}\n\n.sbb-file-selector__file {\n --sbb-text-font-size: var(--sbb-text-font-size-s);\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 display: flex;\n gap: var(--sbb-spacing-fixed-4x);\n align-items: center;\n justify-content: space-between;\n}\n\n.sbb-file-selector__file-details {\n display: flex;\n flex: 1;\n justify-content: space-between;\n gap: var(--sbb-spacing-fixed-4x);\n overflow: auto;\n}\n\n.sbb-file-selector__file-name {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.sbb-file-selector__file-size {\n white-space: nowrap;\n color: var(--sbb-color-metal);\n color: light-dark(var(--sbb-color-metal), var(--sbb-color-smoke));\n}\n\n:host(:not(:is(:state(slotted-error),[state--slotted-error]))) .sbb-file-selector__error {\n display: none;\n}");
11
- var SbbFileSelectorCommonElementMixin = (superclass) => {
12
- return (() => {
13
- let _classSuper = SbbDisabledMixin(SbbFormAssociatedMixin(superclass));
14
- let _instanceExtraInitializers = [];
15
- let _size_decorators;
16
- let _size_initializers = [];
17
- let _size_extraInitializers = [];
18
- let _multiple_decorators;
19
- let _multiple_initializers = [];
20
- let _multiple_extraInitializers = [];
21
- let _multipleMode_decorators;
22
- let _multipleMode_initializers = [];
23
- let _multipleMode_extraInitializers = [];
24
- let _accept_decorators;
25
- let _accept_initializers = [];
26
- let _accept_extraInitializers = [];
27
- let _accessibilityLabel_decorators;
28
- let _accessibilityLabel_initializers = [];
29
- let _accessibilityLabel_extraInitializers = [];
30
- let _set_value_decorators;
31
- let _set_files_decorators;
32
- return class SbbFileSelectorCommonElement extends _classSuper {
33
- constructor() {
34
- super(...arguments);
35
- this.#size_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _size_initializers, isLean() ? "s" : "m"));
36
- this.#multiple_accessor_storage = (__runInitializers(this, _size_extraInitializers), __runInitializers(this, _multiple_initializers, false));
37
- this.#multipleMode_accessor_storage = (__runInitializers(this, _multiple_extraInitializers), __runInitializers(this, _multipleMode_initializers, "default"));
38
- this.#accept_accessor_storage = (__runInitializers(this, _multipleMode_extraInitializers), __runInitializers(this, _accept_initializers, ""));
39
- this.#accessibilityLabel_accessor_storage = (__runInitializers(this, _accept_extraInitializers), __runInitializers(this, _accessibilityLabel_initializers, ""));
40
- this._files = (__runInitializers(this, _accessibilityLabel_extraInitializers), []);
41
- this._suffixes = [
42
- "B",
43
- "kB",
44
- "MB",
45
- "GB",
46
- "TB"
47
- ];
48
- this.language = new SbbLanguageController(this);
49
- this._counter = 0;
50
- }
51
- static {
52
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
53
- _size_decorators = [property({ reflect: true })];
54
- _multiple_decorators = [forceType(), property({ type: Boolean })];
55
- _multipleMode_decorators = [property({ attribute: "multiple-mode" })];
56
- _accept_decorators = [forceType(), property()];
57
- _accessibilityLabel_decorators = [forceType(), property({ attribute: "accessibility-label" })];
58
- _set_value_decorators = [property({ attribute: false })];
59
- _set_files_decorators = [property({ attribute: false })];
60
- __esDecorate(this, null, _size_decorators, {
61
- kind: "accessor",
62
- name: "size",
63
- static: false,
64
- private: false,
65
- access: {
66
- has: (obj) => "size" in obj,
67
- get: (obj) => obj.size,
68
- set: (obj, value) => {
69
- obj.size = value;
70
- }
71
- },
72
- metadata: _metadata
73
- }, _size_initializers, _size_extraInitializers);
74
- __esDecorate(this, null, _multiple_decorators, {
75
- kind: "accessor",
76
- name: "multiple",
77
- static: false,
78
- private: false,
79
- access: {
80
- has: (obj) => "multiple" in obj,
81
- get: (obj) => obj.multiple,
82
- set: (obj, value) => {
83
- obj.multiple = value;
84
- }
85
- },
86
- metadata: _metadata
87
- }, _multiple_initializers, _multiple_extraInitializers);
88
- __esDecorate(this, null, _multipleMode_decorators, {
89
- kind: "accessor",
90
- name: "multipleMode",
91
- static: false,
92
- private: false,
93
- access: {
94
- has: (obj) => "multipleMode" in obj,
95
- get: (obj) => obj.multipleMode,
96
- set: (obj, value) => {
97
- obj.multipleMode = value;
98
- }
99
- },
100
- metadata: _metadata
101
- }, _multipleMode_initializers, _multipleMode_extraInitializers);
102
- __esDecorate(this, null, _accept_decorators, {
103
- kind: "accessor",
104
- name: "accept",
105
- static: false,
106
- private: false,
107
- access: {
108
- has: (obj) => "accept" in obj,
109
- get: (obj) => obj.accept,
110
- set: (obj, value) => {
111
- obj.accept = value;
112
- }
113
- },
114
- metadata: _metadata
115
- }, _accept_initializers, _accept_extraInitializers);
116
- __esDecorate(this, null, _accessibilityLabel_decorators, {
117
- kind: "accessor",
118
- name: "accessibilityLabel",
119
- static: false,
120
- private: false,
121
- access: {
122
- has: (obj) => "accessibilityLabel" in obj,
123
- get: (obj) => obj.accessibilityLabel,
124
- set: (obj, value) => {
125
- obj.accessibilityLabel = value;
126
- }
127
- },
128
- metadata: _metadata
129
- }, _accessibilityLabel_initializers, _accessibilityLabel_extraInitializers);
130
- __esDecorate(this, null, _set_value_decorators, {
131
- kind: "setter",
132
- name: "value",
133
- static: false,
134
- private: false,
135
- access: {
136
- has: (obj) => "value" in obj,
137
- set: (obj, value) => {
138
- obj.value = value;
139
- }
140
- },
141
- metadata: _metadata
142
- }, null, _instanceExtraInitializers);
143
- __esDecorate(this, null, _set_files_decorators, {
144
- kind: "setter",
145
- name: "files",
146
- static: false,
147
- private: false,
148
- access: {
149
- has: (obj) => "files" in obj,
150
- set: (obj, value) => {
151
- obj.files = value;
152
- }
153
- },
154
- metadata: _metadata
155
- }, null, _instanceExtraInitializers);
156
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
157
- enumerable: true,
158
- configurable: true,
159
- writable: true,
160
- value: _metadata
161
- });
162
- }
163
- static {
164
- this.elementDependencies = [SbbSecondaryButtonElement];
165
- }
166
- static {
167
- this.events = { filechanged: "filechanged" };
168
- }
169
- #size_accessor_storage;
170
- /**
171
- * Size variant, either s or m.
172
- * @default 'm' / 's' (lean)
173
- */
174
- get size() {
175
- return this.#size_accessor_storage;
176
- }
177
- set size(value) {
178
- this.#size_accessor_storage = value;
179
- }
180
- #multiple_accessor_storage;
181
- /** Whether more than one file can be selected. */
182
- get multiple() {
183
- return this.#multiple_accessor_storage;
184
- }
185
- set multiple(value) {
186
- this.#multiple_accessor_storage = value;
187
- }
188
- #multipleMode_accessor_storage;
189
- /** Whether the newly added files should override the previously added ones. */
190
- get multipleMode() {
191
- return this.#multipleMode_accessor_storage;
192
- }
193
- set multipleMode(value) {
194
- this.#multipleMode_accessor_storage = value;
195
- }
196
- #accept_accessor_storage;
197
- /** A comma-separated list of allowed unique file type specifiers. */
198
- get accept() {
199
- return this.#accept_accessor_storage;
200
- }
201
- set accept(value) {
202
- this.#accept_accessor_storage = value;
203
- }
204
- #accessibilityLabel_accessor_storage;
205
- /** This will be forwarded as aria-label to the native input element. */
206
- get accessibilityLabel() {
207
- return this.#accessibilityLabel_accessor_storage;
208
- }
209
- set accessibilityLabel(value) {
210
- this.#accessibilityLabel_accessor_storage = value;
211
- }
212
- /** The path of the first selected file. Empty string ('') if no file is selected */
213
- set value(value) {
214
- this._hiddenInput.value = value ?? "";
215
- if (!value) this.files = [];
216
- }
217
- get value() {
218
- return this._hiddenInput?.value;
219
- }
220
- /** The list of selected files. */
221
- set files(value) {
222
- this._files = value ?? [];
223
- const dt = new DataTransfer();
224
- this.files.forEach((e) => dt.items.add(e));
225
- this._hiddenInput.files = dt.files;
226
- this.updateFormValue();
227
- }
228
- get files() {
229
- return this._files;
230
- }
231
- /**
232
- * Form type of element.
233
- * @default 'file'
234
- */
235
- get type() {
236
- return "file";
237
- }
238
- formResetCallback() {
239
- this.files = [];
240
- }
241
- formStateRestoreCallback(state, _reason) {
242
- if (!state) return;
243
- this.files = state.getAll(this.name);
244
- }
245
- updateFormValue() {
246
- const formValue = new FormData();
247
- this.files.forEach((file) => formValue.append(this.name, file));
248
- this.internals.setFormValue(formValue);
249
- }
250
- _checkFileEquality(file1, file2) {
251
- return file1.name === file2.name && file1.size === file2.size && file1.lastModified === file2.lastModified;
252
- }
253
- _onFocus() {
254
- if (sbbInputModalityDetector.mostRecentModality === "keyboard") ɵstateController(this.loadButton).add("focus-visible");
255
- }
256
- _onBlur() {
257
- ɵstateController(this.loadButton).delete("focus-visible");
258
- }
259
- _readFiles(event) {
260
- const fileInput = event.target;
261
- if (fileInput.files) this.createFileList(fileInput.files);
262
- forwardEvent(event, this);
263
- }
264
- createFileList(files) {
265
- const fileArray = Array.from(files);
266
- if (!this.multiple && files.length > 1 || this.accept && fileArray.some((file) => !this.accept.split(",").some((a) => file.name.endsWith(a.trim())))) return;
267
- if (!this.multiple || this.multipleMode !== "persistent" || this.files.length === 0) this.files = fileArray;
268
- else this.files = fileArray.filter((newFile) => this.files.findIndex((oldFile) => this._checkFileEquality(newFile, oldFile)) === -1).concat(this.files);
269
- this._updateA11yLiveRegion();
270
- this._dispatchFileChangedEvent();
271
- }
272
- getButtonLabel() {
273
- return this.multiple ? i18nFileSelectorButtonLabelMultiple[this.language.current] : i18nFileSelectorButtonLabel[this.language.current];
274
- }
275
- _removeFile(file) {
276
- this.files = this.files.filter((f) => !this._checkFileEquality(file, f));
277
- this._updateA11yLiveRegion();
278
- /** The input event fires when the value has been changed as a direct result of a user action. */
279
- this.dispatchEvent(new InputEvent("input", {
280
- bubbles: true,
281
- composed: true
282
- }));
283
- /**
284
- * The change event is fired when the user modifies the element's value.
285
- * Unlike the input event, the change event is not necessarily fired
286
- * for each alteration to an element's value.
287
- */
288
- this.dispatchEvent(new Event("change", { bubbles: true }));
289
- this._dispatchFileChangedEvent();
290
- }
291
- _dispatchFileChangedEvent() {
292
- /**
293
- * @type {CustomEvent<Readonly<File>[]>}
294
- * An event which is emitted each time the file list changes.
295
- */
296
- this.dispatchEvent(new CustomEvent("filechanged", {
297
- bubbles: true,
298
- composed: true,
299
- detail: this.files
300
- }));
301
- }
302
- /** Calculates the correct unit for the file's size. */
303
- _formatFileSize(size) {
304
- const i = Math.floor(Math.log(size) / Math.log(1024));
305
- return `${(size / Math.pow(1024, i)).toFixed(0)} ${this._suffixes[i]}`;
306
- }
307
- _updateA11yLiveRegion() {
308
- this._liveRegion.innerText = i18nFileSelectorCurrentlySelected(this.files.map((e) => e.name))[this.language.current];
309
- }
310
- _renderFileList() {
311
- const TAG_NAME = this.files.length > 1 ? {
312
- WRAPPER: "ul",
313
- ELEMENT: "li"
314
- } : {
315
- WRAPPER: "div",
316
- ELEMENT: "span"
317
- };
318
- return html$1`
319
- <${unsafeStatic(TAG_NAME.WRAPPER)} class='sbb-file-selector__file-list'>
320
- ${this.files.map((file) => html$1`
321
- <${unsafeStatic(TAG_NAME.ELEMENT)} class='sbb-file-selector__file'>
322
- <span class='sbb-file-selector__file-details'>
323
- <span class='sbb-file-selector__file-name'>${file.name}</span>
324
- <span class='sbb-file-selector__file-size'>${this._formatFileSize(file.size)}</span>
325
- </span>
326
- <sbb-secondary-button
327
- size='${this.size}'
328
- icon-name='trash-small'
329
- @click='${() => this._removeFile(file)}'
330
- aria-label='${`${i18nFileSelectorDeleteFile[this.language.current]} - ${file.name}`}'
331
- ></sbb-secondary-button>
332
- </${unsafeStatic(TAG_NAME.ELEMENT)}>`)}
333
- </${unsafeStatic(TAG_NAME.WRAPPER)}>
334
- `;
335
- }
336
- _onDragEnter(event) {
337
- this._counter++;
338
- if (!this.disabled && !this.formDisabled) {
339
- this._setDragState(event.target, true);
340
- this._blockEvent(event);
341
- }
342
- }
343
- _onDragLeave(event) {
344
- this._counter--;
345
- if (!this.disabled && !this.formDisabled && event.target === this._dragTarget && this._counter === 0) {
346
- this._setDragState();
347
- this._blockEvent(event);
348
- }
349
- }
350
- _onFileDrop(event) {
351
- this._counter = 0;
352
- if (!this.disabled && !this.formDisabled) {
353
- this._setDragState();
354
- this._blockEvent(event);
355
- this.createFileList(event.dataTransfer.files);
356
- }
357
- }
358
- _blockEvent(event) {
359
- event.stopPropagation();
360
- event.preventDefault();
361
- }
362
- _setDragState(dragTarget = void 0, isDragEnter = false) {
363
- this._dragTarget = dragTarget;
364
- this.toggleState("active", isDragEnter);
365
- ɵstateController(this.loadButton).toggle("active", isDragEnter);
366
- }
367
- render() {
368
- const ariaLabel = this.accessibilityLabel ? `${this.getButtonLabel()} - ${this.accessibilityLabel}` : void 0;
369
- return html$1`
370
- <div class="sbb-file-selector">
371
- <div
372
- class="sbb-file-selector__input-container"
373
- @dragenter=${this._onDragEnter}
374
- @dragover=${this._blockEvent}
375
- @dragleave=${this._onDragLeave}
376
- @drop=${this._onFileDrop}
377
- >
378
- ${this.renderTemplate(html$1`<input
379
- class="sbb-file-selector__visually-hidden"
380
- type="file"
381
- ?disabled="${this.disabled || this.formDisabled}"
382
- ?multiple="${this.multiple}"
383
- accept="${this.accept || nothing}"
384
- aria-label="${ariaLabel || nothing}"
385
- @change="${this._readFiles}"
386
- @focus="${this._onFocus}"
387
- @blur="${this._onBlur}"
388
- ${ref((el) => {
389
- this._hiddenInput = el;
390
- })}
391
- />`)}
392
- </div>
393
- <p
394
- role="status"
395
- class="sbb-file-selector__visually-hidden"
396
- ${ref((p) => this._liveRegion = p)}
397
- ></p>
398
- ${this.files.length > 0 ? this._renderFileList() : nothing}
399
- <div class="sbb-file-selector__error">
400
- <slot name="error"></slot>
401
- </div>
402
- </div>
403
- `;
404
- }
405
- };
406
- })();
407
- };
408
- //#endregion
409
- export { fileSelectorCommonStyle as n, SbbFileSelectorCommonElementMixin as t };
410
-
411
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zZWxlY3Rvci1jb21tb24tREVfalQxZmEuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2ZpbGUtc2VsZWN0b3IvY29tbW9uL2ZpbGUtc2VsZWN0b3ItY29tbW9uLnNjc3M/aW5saW5lIiwiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2ZpbGUtc2VsZWN0b3IvY29tbW9uL2ZpbGUtc2VsZWN0b3ItY29tbW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uLy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgLS1zYmItZmlsZS1zZWxlY3Rvci1jb2xvcjogdmFyKC0tc2JiLWNvbG9yLTIpO1xuICAtLXNiYi1maWxlLXNlbGVjdG9yLXN1YnRpdGxlLWNvbG9yOiBsaWdodC1kYXJrKHZhcigtLXNiYi1jb2xvci1ncmFuaXRlKSwgdmFyKC0tc2JiLWNvbG9yLXNtb2tlKSk7XG4gIC0tc2JiLWZpbGUtc2VsZWN0b3ItYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMSk7XG4gIC0tc2JiLWZpbGUtc2VsZWN0b3ItYm9yZGVyLWNvbG9yOiB2YXIoLS1zYmItYm9yZGVyLWNvbG9yLTQtaW52ZXJ0ZWQpO1xuICAtLXNiYi1maWxlLXNlbGVjdG9yLXRyYW5zaXRpb24tZHVyYXRpb246IHZhcihcbiAgICAtLXNiYi1kaXNhYmxlLWFuaW1hdGlvbi1kdXJhdGlvbixcbiAgICB2YXIoLS1zYmItYW5pbWF0aW9uLWR1cmF0aW9uLTJ4KVxuICApO1xuICAtLXNiYi1maWxlLXNlbGVjdG9yLXRyYW5zaXRpb24tZWFzaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItYW5pbWF0aW9uLWVhc2luZyk7XG5cbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAje3NiYi5weC10by1yZW0tYnVpbGQoMzIwKX07XG59XG5cbjpob3N0KDpkaXNhYmxlZCkge1xuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgLS1zYmItZmlsZS1zZWxlY3Rvci1jb2xvcjogR3JheVRleHQ7XG4gICAgLS1zYmItZmlsZS1zZWxlY3Rvci1zdWJ0aXRsZS1jb2xvcjogR3JheVRleHQ7XG4gICAgLS1zYmItZmlsZS1zZWxlY3Rvci1ib3JkZXItY29sb3I6IEdyYXlUZXh0O1xuICB9XG59XG5cbjpob3N0KDpzdGF0ZShhY3RpdmUpKSB7XG4gIC0tc2JiLWZpbGUtc2VsZWN0b3ItYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMyk7XG4gIC0tc2JiLWZpbGUtc2VsZWN0b3ItYm9yZGVyLWNvbG9yOiBsaWdodC1kYXJrKHZhcigtLXNiYi1jb2xvci1zdG9ybSksIHZhcigtLXNiYi1jb2xvci1hbnRocmFjaXRlKSk7XG5cbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIC0tc2JiLWZpbGUtc2VsZWN0b3ItYm9yZGVyLWNvbG9yOiBIaWdobGlnaHQ7XG4gIH1cbn1cblxuLnNiYi1maWxlLXNlbGVjdG9yX19pbnB1dC1jb250YWluZXIge1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4uc2JiLWZpbGUtc2VsZWN0b3JfX3Zpc3VhbGx5LWhpZGRlbiB7XG4gIEBpbmNsdWRlIHNiYi5zY3JlZW4tcmVhZGVyLW9ubHk7XG59XG5cbi5zYmItZmlsZS1zZWxlY3Rvcl9fZmlsZS1saXN0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgcm93LWdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtM3gpO1xuICBtYXJnaW4tYmxvY2s6IDA7XG4gIHBhZGRpbmctaW5saW5lOiAwO1xuICBwYWRkaW5nLWJsb2NrOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC02eCkgdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMXgpO1xufVxuXG4uc2JiLWZpbGUtc2VsZWN0b3JfX2ZpbGUge1xuICBAaW5jbHVkZSBzYmIudGV4dC1zLS1yZWd1bGFyO1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNHgpO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG5cbi5zYmItZmlsZS1zZWxlY3Rvcl9fZmlsZS1kZXRhaWxzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleDogMTtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBnYXA6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTR4KTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbi5zYmItZmlsZS1zZWxlY3Rvcl9fZmlsZS1uYW1lIHtcbiAgQGluY2x1ZGUgc2JiLmVsbGlwc2lzO1xufVxuXG4uc2JiLWZpbGUtc2VsZWN0b3JfX2ZpbGUtc2l6ZSB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGNvbG9yOiBsaWdodC1kYXJrKHZhcigtLXNiYi1jb2xvci1tZXRhbCksIHZhcigtLXNiYi1jb2xvci1zbW9rZSkpO1xufVxuXG4uc2JiLWZpbGUtc2VsZWN0b3JfX2Vycm9yIHtcbiAgOmhvc3QoOm5vdCg6c3RhdGUoc2xvdHRlZC1lcnJvcikpKSAmIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG4iLCJpbXBvcnQgeyBub3RoaW5nLCB0eXBlIFRlbXBsYXRlUmVzdWx0LCB1bnNhZmVDU1MgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyByZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgaHRtbCwgdW5zYWZlU3RhdGljIH0gZnJvbSAnbGl0L3N0YXRpYy1odG1sLmpzJztcblxuaW1wb3J0IHtcbiAgU2JiU2Vjb25kYXJ5QnV0dG9uRWxlbWVudCxcbiAgdHlwZSBTYmJTZWNvbmRhcnlCdXR0b25TdGF0aWNFbGVtZW50LFxufSBmcm9tICcuLi8uLi9idXR0b24ucHVyZS50cyc7XG5pbXBvcnQge1xuICB0eXBlIEFic3RyYWN0Q29uc3RydWN0b3IsXG4gIGZvcmNlVHlwZSxcbiAgdHlwZSBGb3JtUmVzdG9yZVJlYXNvbixcbiAgdHlwZSBGb3JtUmVzdG9yZVN0YXRlLFxuICBmb3J3YXJkRXZlbnQsXG4gIGkxOG5GaWxlU2VsZWN0b3JCdXR0b25MYWJlbCxcbiAgaTE4bkZpbGVTZWxlY3RvckJ1dHRvbkxhYmVsTXVsdGlwbGUsXG4gIGkxOG5GaWxlU2VsZWN0b3JDdXJyZW50bHlTZWxlY3RlZCxcbiAgaTE4bkZpbGVTZWxlY3RvckRlbGV0ZUZpbGUsXG4gIGlzTGVhbixcbiAgU2JiRGlzYWJsZWRNaXhpbixcbiAgU2JiRWxlbWVudCxcbiAgdHlwZSBTYmJFbGVtZW50Q29uc3RydWN0b3IsXG4gIHR5cGUgU2JiRWxlbWVudFR5cGUsXG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4sXG4gIHNiYklucHV0TW9kYWxpdHlEZXRlY3RvcixcbiAgU2JiTGFuZ3VhZ2VDb250cm9sbGVyLFxuICDJtXN0YXRlQ29udHJvbGxlcixcbn0gZnJvbSAnLi4vLi4vY29yZS50cyc7XG5cbmltcG9ydCBmaWxlU2VsZWN0b3JDb21tb25TdHlsZVN0cmluZyBmcm9tICcuL2ZpbGUtc2VsZWN0b3ItY29tbW9uLnNjc3M/aW5saW5lJztcblxuZXhwb3J0IGNvbnN0IGZpbGVTZWxlY3RvckNvbW1vblN0eWxlID0gdW5zYWZlQ1NTKGZpbGVTZWxlY3RvckNvbW1vblN0eWxlU3RyaW5nKTtcblxuZXhwb3J0IGRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU2JiRmlsZVNlbGVjdG9yQ29tbW9uRWxlbWVudE1peGluVHlwZSBleHRlbmRzIFNiYkRpc2FibGVkTWl4aW4oXG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4oU2JiRWxlbWVudCksXG4pIHtcbiAgcHVibGljIGFjY2Vzc29yIHNpemU6ICdzJyB8ICdtJztcbiAgcHVibGljIGFjY2Vzc29yIG11bHRpcGxlOiBib29sZWFuO1xuICBwdWJsaWMgYWNjZXNzb3IgbXVsdGlwbGVNb2RlOiAnZGVmYXVsdCcgfCAncGVyc2lzdGVudCc7XG4gIHB1YmxpYyBhY2Nlc3NvciBhY2NlcHQ6IHN0cmluZztcbiAgcHVibGljIGFjY2Vzc29yIGFjY2Vzc2liaWxpdHlMYWJlbDogc3RyaW5nO1xuICBwdWJsaWMgYWNjZXNzb3IgZmlsZXM6IFJlYWRvbmx5PEZpbGU+W107XG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgdmFsdWUoKTogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIG92ZXJyaWRlIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk7XG4gIHByb3RlY3RlZCBsb2FkQnV0dG9uOiBTYmJTZWNvbmRhcnlCdXR0b25TdGF0aWNFbGVtZW50O1xuICBwcm90ZWN0ZWQgbGFuZ3VhZ2U6IFNiYkxhbmd1YWdlQ29udHJvbGxlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlbmRlclRlbXBsYXRlKGlucHV0OiBUZW1wbGF0ZVJlc3VsdCk6IFRlbXBsYXRlUmVzdWx0O1xuICBwcm90ZWN0ZWQgY3JlYXRlRmlsZUxpc3QoZmlsZXM6IEZpbGVMaXN0KTogdm9pZDtcbiAgcHJvdGVjdGVkIGdldEJ1dHRvbkxhYmVsKCk6IHN0cmluZztcbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQ7XG4gIHB1YmxpYyBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLCByZWFzb246IEZvcm1SZXN0b3JlUmVhc29uKTogdm9pZDtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYkZpbGVTZWxlY3RvckNvbW1vbkVsZW1lbnRNaXhpbiA9IDxcbiAgVCBleHRlbmRzIEFic3RyYWN0Q29uc3RydWN0b3I8U2JiRWxlbWVudD4gJiBTYmJFbGVtZW50Q29uc3RydWN0b3IsXG4+KFxuICBzdXBlcmNsYXNzOiBULFxuKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxTYmJGaWxlU2VsZWN0b3JDb21tb25FbGVtZW50TWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJGaWxlU2VsZWN0b3JDb21tb25FbGVtZW50XG4gICAgZXh0ZW5kcyBTYmJEaXNhYmxlZE1peGluKFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4oc3VwZXJjbGFzcykpXG4gICAgaW1wbGVtZW50cyBQYXJ0aWFsPFNiYkZpbGVTZWxlY3RvckNvbW1vbkVsZW1lbnRNaXhpblR5cGU+XG4gIHtcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGVsZW1lbnREZXBlbmRlbmNpZXM6IFNiYkVsZW1lbnRUeXBlW10gPSBbU2JiU2Vjb25kYXJ5QnV0dG9uRWxlbWVudF07XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgICBmaWxlY2hhbmdlZDogJ2ZpbGVjaGFuZ2VkJyxcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgLyoqXG4gICAgICogU2l6ZSB2YXJpYW50LCBlaXRoZXIgcyBvciBtLlxuICAgICAqIEBkZWZhdWx0ICdtJyAvICdzJyAobGVhbilcbiAgICAgKi9cbiAgICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBzaXplOiAncycgfCAnbScgPSBpc0xlYW4oKSA/ICdzJyA6ICdtJztcblxuICAgIC8qKiBXaGV0aGVyIG1vcmUgdGhhbiBvbmUgZmlsZSBjYW4gYmUgc2VsZWN0ZWQuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICAgIHB1YmxpYyBhY2Nlc3NvciBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIG5ld2x5IGFkZGVkIGZpbGVzIHNob3VsZCBvdmVycmlkZSB0aGUgcHJldmlvdXNseSBhZGRlZCBvbmVzLiAqL1xuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ211bHRpcGxlLW1vZGUnIH0pXG4gICAgcHVibGljIGFjY2Vzc29yIG11bHRpcGxlTW9kZTogJ2RlZmF1bHQnIHwgJ3BlcnNpc3RlbnQnID0gJ2RlZmF1bHQnO1xuXG4gICAgLyoqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYWxsb3dlZCB1bmlxdWUgZmlsZSB0eXBlIHNwZWNpZmllcnMuICovXG4gICAgQGZvcmNlVHlwZSgpXG4gICAgQHByb3BlcnR5KClcbiAgICBwdWJsaWMgYWNjZXNzb3IgYWNjZXB0OiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBUaGlzIHdpbGwgYmUgZm9yd2FyZGVkIGFzIGFyaWEtbGFiZWwgdG8gdGhlIG5hdGl2ZSBpbnB1dCBlbGVtZW50LiAqL1xuICAgIEBmb3JjZVR5cGUoKVxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FjY2Vzc2liaWxpdHktbGFiZWwnIH0pXG4gICAgcHVibGljIGFjY2Vzc29yIGFjY2Vzc2liaWxpdHlMYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgICAvKiogVGhlIHBhdGggb2YgdGhlIGZpcnN0IHNlbGVjdGVkIGZpbGUuIEVtcHR5IHN0cmluZyAoJycpIGlmIG5vIGZpbGUgaXMgc2VsZWN0ZWQgKi9cbiAgICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgdGhpcy5faGlkZGVuSW5wdXQudmFsdWUgPSB2YWx1ZSA/PyAnJztcblxuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5faGlkZGVuSW5wdXQ/LnZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbGlzdCBvZiBzZWxlY3RlZCBmaWxlcy4gKi9cbiAgICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gICAgcHVibGljIHNldCBmaWxlcyh2YWx1ZTogUmVhZG9ubHk8RmlsZT5bXSkge1xuICAgICAgdGhpcy5fZmlsZXMgPSB2YWx1ZSA/PyBbXTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBpbm5lciBpbnB1dFxuICAgICAgY29uc3QgZHQ6IERhdGFUcmFuc2ZlciA9IG5ldyBEYXRhVHJhbnNmZXIoKTtcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaCgoZTogUmVhZG9ubHk8RmlsZT4pID0+IGR0Lml0ZW1zLmFkZChlKSk7XG4gICAgICB0aGlzLl9oaWRkZW5JbnB1dC5maWxlcyA9IGR0LmZpbGVzO1xuXG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZpbGVzKCk6IFJlYWRvbmx5PEZpbGU+W10ge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVzO1xuICAgIH1cbiAgICBwcml2YXRlIF9maWxlczogUmVhZG9ubHk8RmlsZT5bXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogRm9ybSB0eXBlIG9mIGVsZW1lbnQuXG4gICAgICogQGRlZmF1bHQgJ2ZpbGUnXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ2ZpbGUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hpZGRlbklucHV0ITogSFRNTElucHV0RWxlbWVudDtcbiAgICBwcml2YXRlIF9zdWZmaXhlczogc3RyaW5nW10gPSBbJ0InLCAna0InLCAnTUInLCAnR0InLCAnVEInXTtcbiAgICBwcml2YXRlIF9saXZlUmVnaW9uITogSFRNTFBhcmFncmFwaEVsZW1lbnQ7XG4gICAgcHJvdGVjdGVkIGxvYWRCdXR0b24hOiBTYmJTZWNvbmRhcnlCdXR0b25TdGF0aWNFbGVtZW50O1xuICAgIHByb3RlY3RlZCBsYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgICAvLyBTYWZhcmkgaGFzIGEgcGVjdWxpYXIgYmVoYXZpb3Igd2hlbiBkcmFnZ2luZyBmaWxlcyBvbiB0aGUgaW5uZXIgYnV0dG9uIGluICdkcm9wem9uZScgdmFyaWFudDtcbiAgICAvLyB0aGlzIHdpbGwgcmVxdWlyZSBhIGNvdW50ZXIgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgZHJhZ0VudGVyL2RyYWdMZWF2ZS5cbiAgICBwcml2YXRlIF9jb3VudGVyOiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgX2RyYWdUYXJnZXQ/OiBIVE1MRWxlbWVudDtcblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCByZW5kZXJUZW1wbGF0ZShpbnB1dDogVGVtcGxhdGVSZXN1bHQpOiBUZW1wbGF0ZVJlc3VsdDtcblxuICAgIHB1YmxpYyBvdmVycmlkZSBmb3JtUmVzZXRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZmlsZXMgPSBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgICAgX3JlYXNvbj86IEZvcm1SZXN0b3JlUmVhc29uLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmZpbGVzID0gKHN0YXRlIGFzIEZvcm1EYXRhKS5nZXRBbGwodGhpcy5uYW1lKSBhcyBSZWFkb25seTxGaWxlPltdO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgICBjb25zdCBmb3JtVmFsdWUgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4gZm9ybVZhbHVlLmFwcGVuZCh0aGlzLm5hbWUsIGZpbGUpKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoZWNrRmlsZUVxdWFsaXR5KGZpbGUxOiBSZWFkb25seTxGaWxlPiwgZmlsZTI6IFJlYWRvbmx5PEZpbGU+KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBmaWxlMS5uYW1lID09PSBmaWxlMi5uYW1lICYmXG4gICAgICAgIGZpbGUxLnNpemUgPT09IGZpbGUyLnNpemUgJiZcbiAgICAgICAgZmlsZTEubGFzdE1vZGlmaWVkID09PSBmaWxlMi5sYXN0TW9kaWZpZWRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25Gb2N1cygpOiB2b2lkIHtcbiAgICAgIGlmIChzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IubW9zdFJlY2VudE1vZGFsaXR5ID09PSAna2V5Ym9hcmQnKSB7XG4gICAgICAgIMm1c3RhdGVDb250cm9sbGVyKHRoaXMubG9hZEJ1dHRvbikuYWRkKCdmb2N1cy12aXNpYmxlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25CbHVyKCk6IHZvaWQge1xuICAgICAgybVzdGF0ZUNvbnRyb2xsZXIodGhpcy5sb2FkQnV0dG9uKS5kZWxldGUoJ2ZvY3VzLXZpc2libGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWFkRmlsZXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICBjb25zdCBmaWxlSW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgIGlmIChmaWxlSW5wdXQuZmlsZXMpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVGaWxlTGlzdChmaWxlSW5wdXQuZmlsZXMpO1xuICAgICAgfVxuICAgICAgZm9yd2FyZEV2ZW50KGV2ZW50LCB0aGlzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlRmlsZUxpc3QoZmlsZXM6IEZpbGVMaXN0KTogdm9pZCB7XG4gICAgICBjb25zdCBmaWxlQXJyYXkgPSBBcnJheS5mcm9tKGZpbGVzKTtcbiAgICAgIGlmIChcbiAgICAgICAgKCF0aGlzLm11bHRpcGxlICYmIGZpbGVzLmxlbmd0aCA+IDEpIHx8XG4gICAgICAgICh0aGlzLmFjY2VwdCAmJlxuICAgICAgICAgIGZpbGVBcnJheS5zb21lKFxuICAgICAgICAgICAgKGZpbGUpID0+ICF0aGlzLmFjY2VwdC5zcGxpdCgnLCcpLnNvbWUoKGEpID0+IGZpbGUubmFtZS5lbmRzV2l0aChhLnRyaW0oKSkpLFxuICAgICAgICAgICkpXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgbXVsdGlwbGUgZmlsZXMgYXJlIHNlbGVjdGVkIGJ1dCB0aGUgc2VsZWN0b3IgaXMgbm90IGluIG11bHRpcGxlIG1vZGUsXG4gICAgICAgIC8vIGlnbm9yZSB0aGUgc2VsZWN0aW9uIChsaWtlIG5hdGl2ZSBiZWhhdmlvcikuXG4gICAgICAgIC8vIElmIHRoZSBhY2NlcHQgYXR0cmlidXRlIGlzIHNldCwgY2hlY2sgaWYgdGhlIHNlbGVjdGVkIGZpbGVzIG1hdGNoIHRoZSBhbGxvd2VkIHR5cGVzLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5tdWx0aXBsZSB8fCB0aGlzLm11bHRpcGxlTW9kZSAhPT0gJ3BlcnNpc3RlbnQnIHx8IHRoaXMuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlQXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbGVzID0gZmlsZUFycmF5XG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIC8vIFJlbW92ZSBkdXBsaWNhdGVzXG4gICAgICAgICAgICAobmV3RmlsZTogUmVhZG9ubHk8RmlsZT4pOiBib29sZWFuID0+XG4gICAgICAgICAgICAgIHRoaXMuZmlsZXMhLmZpbmRJbmRleCgob2xkRmlsZTogUmVhZG9ubHk8RmlsZT4pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tGaWxlRXF1YWxpdHkobmV3RmlsZSwgb2xkRmlsZSksXG4gICAgICAgICAgICAgICkgPT09IC0xLFxuICAgICAgICAgIClcbiAgICAgICAgICAuY29uY2F0KHRoaXMuZmlsZXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdXBkYXRlQTExeUxpdmVSZWdpb24oKTtcbiAgICAgIHRoaXMuX2Rpc3BhdGNoRmlsZUNoYW5nZWRFdmVudCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGVcbiAgICAgICAgPyBpMThuRmlsZVNlbGVjdG9yQnV0dG9uTGFiZWxNdWx0aXBsZVt0aGlzLmxhbmd1YWdlLmN1cnJlbnRdXG4gICAgICAgIDogaTE4bkZpbGVTZWxlY3RvckJ1dHRvbkxhYmVsW3RoaXMubGFuZ3VhZ2UuY3VycmVudF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVtb3ZlRmlsZShmaWxlOiBSZWFkb25seTxGaWxlPik6IHZvaWQge1xuICAgICAgdGhpcy5maWxlcyA9IHRoaXMuZmlsZXMuZmlsdGVyKChmOiBSZWFkb25seTxGaWxlPikgPT4gIXRoaXMuX2NoZWNrRmlsZUVxdWFsaXR5KGZpbGUsIGYpKTtcbiAgICAgIHRoaXMuX3VwZGF0ZUExMXlMaXZlUmVnaW9uKCk7XG5cbiAgICAgIC8vIERpc3BhdGNoIG5hdGl2ZSBldmVudHMgYXMgaWYgdGhlIHJlc2V0IGlzIGRvbmUgdmlhIHRoZSBmaWxlIHNlbGVjdGlvbiB3aW5kb3cuXG4gICAgICAvKiogVGhlIGlucHV0IGV2ZW50IGZpcmVzIHdoZW4gdGhlIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgYXMgYSBkaXJlY3QgcmVzdWx0IG9mIGEgdXNlciBhY3Rpb24uICovXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNoYW5nZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSB1c2VyIG1vZGlmaWVzIHRoZSBlbGVtZW50J3MgdmFsdWUuXG4gICAgICAgKiBVbmxpa2UgdGhlIGlucHV0IGV2ZW50LCB0aGUgY2hhbmdlIGV2ZW50IGlzIG5vdCBuZWNlc3NhcmlseSBmaXJlZFxuICAgICAgICogZm9yIGVhY2ggYWx0ZXJhdGlvbiB0byBhbiBlbGVtZW50J3MgdmFsdWUuXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICB0aGlzLl9kaXNwYXRjaEZpbGVDaGFuZ2VkRXZlbnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNwYXRjaEZpbGVDaGFuZ2VkRXZlbnQoKTogdm9pZCB7XG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHtDdXN0b21FdmVudDxSZWFkb25seTxGaWxlPltdPn1cbiAgICAgICAqIEFuIGV2ZW50IHdoaWNoIGlzIGVtaXR0ZWQgZWFjaCB0aW1lIHRoZSBmaWxlIGxpc3QgY2hhbmdlcy5cbiAgICAgICAqL1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8UmVhZG9ubHk8RmlsZT5bXT4oJ2ZpbGVjaGFuZ2VkJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB0aGlzLmZpbGVzLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIENhbGN1bGF0ZXMgdGhlIGNvcnJlY3QgdW5pdCBmb3IgdGhlIGZpbGUncyBzaXplLiAqL1xuICAgIHByaXZhdGUgX2Zvcm1hdEZpbGVTaXplKHNpemU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICBjb25zdCBpOiBudW1iZXIgPSBNYXRoLmZsb29yKE1hdGgubG9nKHNpemUpIC8gTWF0aC5sb2coMTAyNCkpO1xuICAgICAgcmV0dXJuIGAkeyhzaXplIC8gTWF0aC5wb3coMTAyNCwgaSkpLnRvRml4ZWQoMCl9ICR7dGhpcy5fc3VmZml4ZXNbaV19YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF91cGRhdGVBMTF5TGl2ZVJlZ2lvbigpOiB2b2lkIHtcbiAgICAgIHRoaXMuX2xpdmVSZWdpb24uaW5uZXJUZXh0ID0gaTE4bkZpbGVTZWxlY3RvckN1cnJlbnRseVNlbGVjdGVkKHRoaXMuZmlsZXMubWFwKChlKSA9PiBlLm5hbWUpKVtcbiAgICAgICAgdGhpcy5sYW5ndWFnZS5jdXJyZW50XG4gICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlbmRlckZpbGVMaXN0KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICAgIGNvbnN0IFRBR19OQU1FOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID1cbiAgICAgICAgdGhpcy5maWxlcy5sZW5ndGggPiAxXG4gICAgICAgICAgPyB7IFdSQVBQRVI6ICd1bCcsIEVMRU1FTlQ6ICdsaScgfVxuICAgICAgICAgIDogeyBXUkFQUEVSOiAnZGl2JywgRUxFTUVOVDogJ3NwYW4nIH07XG5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIGxpdC9iaW5kaW5nLXBvc2l0aW9ucyAqL1xuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICA8JHt1bnNhZmVTdGF0aWMoVEFHX05BTUUuV1JBUFBFUil9IGNsYXNzPSdzYmItZmlsZS1zZWxlY3Rvcl9fZmlsZS1saXN0Jz5cbiAgICAgICAgJHt0aGlzLmZpbGVzLm1hcChcbiAgICAgICAgICAoZmlsZTogUmVhZG9ubHk8RmlsZT4pID0+IGh0bWxgXG4gICAgICAgICAgICA8JHt1bnNhZmVTdGF0aWMoVEFHX05BTUUuRUxFTUVOVCl9IGNsYXNzPSdzYmItZmlsZS1zZWxlY3Rvcl9fZmlsZSc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J3NiYi1maWxlLXNlbGVjdG9yX19maWxlLWRldGFpbHMnPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J3NiYi1maWxlLXNlbGVjdG9yX19maWxlLW5hbWUnPiR7ZmlsZS5uYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdzYmItZmlsZS1zZWxlY3Rvcl9fZmlsZS1zaXplJz4ke3RoaXMuX2Zvcm1hdEZpbGVTaXplKGZpbGUuc2l6ZSl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICAgICAgICAgICAgc2l6ZT0nJHt0aGlzLnNpemV9J1xuICAgICAgICAgICAgICAgIGljb24tbmFtZT0ndHJhc2gtc21hbGwnXG4gICAgICAgICAgICAgICAgQGNsaWNrPSckeygpID0+IHRoaXMuX3JlbW92ZUZpbGUoZmlsZSl9J1xuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JyR7YCR7aTE4bkZpbGVTZWxlY3RvckRlbGV0ZUZpbGVbdGhpcy5sYW5ndWFnZS5jdXJyZW50XX0gLSAke2ZpbGUubmFtZX1gfSdcbiAgICAgICAgICAgICAgPjwvc2JiLXNlY29uZGFyeS1idXR0b24+XG4gICAgICAgICAgICA8LyR7dW5zYWZlU3RhdGljKFRBR19OQU1FLkVMRU1FTlQpfT5gLFxuICAgICAgICApfVxuICAgICAgPC8ke3Vuc2FmZVN0YXRpYyhUQUdfTkFNRS5XUkFQUEVSKX0+XG4gICAgYDtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgbGl0L2JpbmRpbmctcG9zaXRpb25zICovXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgdGhpcy5fY291bnRlcisrO1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLmZvcm1EaXNhYmxlZCkge1xuICAgICAgICB0aGlzLl9zZXREcmFnU3RhdGUoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgdGhpcy5fYmxvY2tFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgdGhpcy5fY291bnRlci0tO1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5kaXNhYmxlZCAmJlxuICAgICAgICAhdGhpcy5mb3JtRGlzYWJsZWQgJiZcbiAgICAgICAgZXZlbnQudGFyZ2V0ID09PSB0aGlzLl9kcmFnVGFyZ2V0ICYmXG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPT09IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9zZXREcmFnU3RhdGUoKTtcbiAgICAgICAgdGhpcy5fYmxvY2tFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25GaWxlRHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5mb3JtRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5fc2V0RHJhZ1N0YXRlKCk7XG4gICAgICAgIHRoaXMuX2Jsb2NrRXZlbnQoZXZlbnQpO1xuICAgICAgICB0aGlzLmNyZWF0ZUZpbGVMaXN0KGV2ZW50LmRhdGFUcmFuc2ZlciEuZmlsZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2Jsb2NrRXZlbnQoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldERyYWdTdGF0ZShcbiAgICAgIGRyYWdUYXJnZXQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgICAgaXNEcmFnRW50ZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICApOiB2b2lkIHtcbiAgICAgIHRoaXMuX2RyYWdUYXJnZXQgPSBkcmFnVGFyZ2V0O1xuICAgICAgdGhpcy50b2dnbGVTdGF0ZSgnYWN0aXZlJywgaXNEcmFnRW50ZXIpO1xuICAgICAgybVzdGF0ZUNvbnRyb2xsZXIodGhpcy5sb2FkQnV0dG9uKS50b2dnbGUoJ2FjdGl2ZScsIGlzRHJhZ0VudGVyKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICAgIGNvbnN0IGFyaWFMYWJlbCA9IHRoaXMuYWNjZXNzaWJpbGl0eUxhYmVsXG4gICAgICAgID8gYCR7dGhpcy5nZXRCdXR0b25MYWJlbCgpfSAtICR7dGhpcy5hY2Nlc3NpYmlsaXR5TGFiZWx9YFxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWZpbGUtc2VsZWN0b3JcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInNiYi1maWxlLXNlbGVjdG9yX19pbnB1dC1jb250YWluZXJcIlxuICAgICAgICAgICAgQGRyYWdlbnRlcj0ke3RoaXMuX29uRHJhZ0VudGVyfVxuICAgICAgICAgICAgQGRyYWdvdmVyPSR7dGhpcy5fYmxvY2tFdmVudH1cbiAgICAgICAgICAgIEBkcmFnbGVhdmU9JHt0aGlzLl9vbkRyYWdMZWF2ZX1cbiAgICAgICAgICAgIEBkcm9wPSR7dGhpcy5fb25GaWxlRHJvcH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICAke3RoaXMucmVuZGVyVGVtcGxhdGUoXG4gICAgICAgICAgICAgIGh0bWxgPGlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItZmlsZS1zZWxlY3Rvcl9fdmlzdWFsbHktaGlkZGVuXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkfVwiXG4gICAgICAgICAgICAgICAgP211bHRpcGxlPVwiJHt0aGlzLm11bHRpcGxlfVwiXG4gICAgICAgICAgICAgICAgYWNjZXB0PVwiJHt0aGlzLmFjY2VwdCB8fCBub3RoaW5nfVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIiR7YXJpYUxhYmVsIHx8IG5vdGhpbmd9XCJcbiAgICAgICAgICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLl9yZWFkRmlsZXN9XCJcbiAgICAgICAgICAgICAgICBAZm9jdXM9XCIke3RoaXMuX29uRm9jdXN9XCJcbiAgICAgICAgICAgICAgICBAYmx1cj1cIiR7dGhpcy5fb25CbHVyfVwiXG4gICAgICAgICAgICAgICAgJHtyZWYoKGVsPzogRWxlbWVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5faGlkZGVuSW5wdXQgPSBlbCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAvPmAsXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwXG4gICAgICAgICAgICByb2xlPVwic3RhdHVzXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2JiLWZpbGUtc2VsZWN0b3JfX3Zpc3VhbGx5LWhpZGRlblwiXG4gICAgICAgICAgICAke3JlZigocD86IEVsZW1lbnQpID0+ICh0aGlzLl9saXZlUmVnaW9uID0gcCBhcyBIVE1MUGFyYWdyYXBoRWxlbWVudCkpfVxuICAgICAgICAgID48L3A+XG4gICAgICAgICAgJHt0aGlzLmZpbGVzLmxlbmd0aCA+IDAgPyB0aGlzLl9yZW5kZXJGaWxlTGlzdCgpIDogbm90aGluZ31cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWZpbGUtc2VsZWN0b3JfX2Vycm9yXCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwiZXJyb3JcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNiYkZpbGVTZWxlY3RvckNvbW1vbkVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkZpbGVTZWxlY3RvckNvbW1vbkVsZW1lbnRNaXhpblR5cGU+ICZcbiAgICBUO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FDZ0NBLElBQWEsMEJBQTBCLFVBQVUsb3dGQUE4QjtBQXVCL0UsSUFBYSxxQ0FHWCxlQUNrRTtBQThVbEUsZUE3VTJDO29CQUNqQyxpQkFBaUIsdUJBQXVCLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztlQUQvQyxxQ0FDTCxZQUFvRDs7O0FBWWYsVUFBQSx5QkFiaEMsa0JBQUEsTUFBQSwyQkFBNEIsRUFBQSxrQkFBQSxNQUFBLG9CQWFzQixRQUFRLEdBQUcsTUFBTSxJQUFHO0FBS25FLFVBQUEsNkJBQUEsa0JBQUEsTUFBQSx3QkFBQSxFQUFBLGtCQUFBLE1BQUEsd0JBQW9CLE1BQUs7QUFJekIsVUFBQSxpQ0FBQSxrQkFBQSxNQUFBLDRCQUFBLEVBQUEsa0JBQUEsTUFBQSw0QkFBeUMsVUFBUztBQUtsRCxVQUFBLDJCQUFBLGtCQUFBLE1BQUEsZ0NBQUEsRUFBQSxrQkFBQSxNQUFBLHNCQUFpQixHQUFFO0FBS25CLFVBQUEsdUNBQUEsa0JBQUEsTUFBQSwwQkFBQSxFQUFBLGtCQUFBLE1BQUEsa0NBQTZCLEdBQUU7QUE4QnZDLFNBQUEsVUFBTSxrQkFBQSxNQUFBLHNDQUFBLEVBQXFCLEVBQUU7QUFXN0IsU0FBQSxZQUFzQjtLQUFDO0tBQUs7S0FBTTtLQUFNO0tBQU07S0FBSztBQUdqRCxTQUFBLFdBQVcsSUFBSSxzQkFBc0IsS0FBSztBQUk1QyxTQUFBLFdBQW1COzs7O3dCQW5FMUIsU0FBUyxFQUFFLFNBQVMsTUFBTSxDQUFDLENBQUE7NEJBRzNCLFdBQVcsRUFDWCxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUMsQ0FBQTtnQ0FJM0IsU0FBUyxFQUFF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
@@ -1,111 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbElement, boxSizingStyles, forceType, i18nFileSelectorSubtitleLabel, i18nFileSelectorSubtitleLabelMultiple } from "./core.js";
5
- import { html as html$1 } from "lit/static-html.js";
6
- import { SbbSecondaryButtonStaticElement } from "./button.pure.js";
7
- import { SbbIconElement } from "./icon.pure.js";
8
- import { ref } from "lit/directives/ref.js";
9
- import { SbbFileSelectorCommonElementMixin, fileSelectorCommonStyle } from "./file-selector/common/file-selector-common.js";
10
- //#region src/elements/file-selector/file-selector-dropzone/file-selector-dropzone.scss?inline
11
- var file_selector_dropzone_default = ".sbb-file-selector__dropzone-area {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: var(--sbb-spacing-responsive-s);\n background-color: var(--sbb-file-selector-background-color);\n border: var(--sbb-border-width-1x) dashed var(--sbb-file-selector-border-color);\n border-radius: var(--sbb-border-radius-4x);\n transition-duration: var(--sbb-file-selector-transition-duration);\n transition-timing-function: var(--sbb-file-selector-transition-easing-function);\n transition-property: background-color, border-color;\n}\n\n.sbb-file-selector__dropzone-area--icon {\n color: var(--sbb-file-selector-color);\n line-height: 0;\n}\n\n.sbb-file-selector__dropzone-area--title {\n font-weight: bold;\n --sbb-title-font-size: var(--sbb-title-font-size-level-6-lean, var(--sbb-heading-font-size-6));\n --sbb-title-line-height: var(--sbb-typo-line-height-text);\n margin-block: var(--sbb-title-margin-block, 0);\n margin-inline: 0;\n font-family: var(--sbb-typo-font-family);\n font-weight: bold;\n font-size: var(--sbb-title-font-size);\n letter-spacing: var(--sbb-typo-letter-spacing-heading);\n line-height: var(--sbb-title-line-height, var(--sbb-typo-line-height-heading));\n text-align: center;\n color: var(--sbb-file-selector-color);\n}\n\n.sbb-file-selector__dropzone-area--subtitle {\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 text-align: center;\n color: var(--sbb-file-selector-subtitle-color);\n margin-block-end: var(--sbb-spacing-fixed-4x);\n}";
12
- //#endregion
13
- //#region src/elements/file-selector/file-selector-dropzone/file-selector-dropzone.component.ts
14
- /**
15
- * It allows to select one or more file from storage devices via button click or drag and drop, and display them.
16
- *
17
- * @slot error - Use this to provide a `sbb-error` to show an error message.
18
- */
19
- var SbbFileSelectorDropzoneElement = (() => {
20
- let _classSuper = SbbFileSelectorCommonElementMixin(SbbElement);
21
- let _titleContent_decorators;
22
- let _titleContent_initializers = [];
23
- let _titleContent_extraInitializers = [];
24
- return class SbbFileSelectorDropzoneElement extends _classSuper {
25
- static {
26
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
27
- _titleContent_decorators = [forceType(), property({ attribute: "title-content" })];
28
- __esDecorate(this, null, _titleContent_decorators, {
29
- kind: "accessor",
30
- name: "titleContent",
31
- static: false,
32
- private: false,
33
- access: {
34
- has: (obj) => "titleContent" in obj,
35
- get: (obj) => obj.titleContent,
36
- set: (obj, value) => {
37
- obj.titleContent = value;
38
- }
39
- },
40
- metadata: _metadata
41
- }, _titleContent_initializers, _titleContent_extraInitializers);
42
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
43
- enumerable: true,
44
- configurable: true,
45
- writable: true,
46
- value: _metadata
47
- });
48
- }
49
- static {
50
- this.elementName = "sbb-file-selector-dropzone";
51
- }
52
- static {
53
- this.elementDependencies = [SbbIconElement, SbbSecondaryButtonStaticElement];
54
- }
55
- static {
56
- this.styles = [
57
- boxSizingStyles,
58
- fileSelectorCommonStyle,
59
- unsafeCSS(file_selector_dropzone_default)
60
- ];
61
- }
62
- static {
63
- this.events = { filechanged: "filechanged" };
64
- }
65
- #titleContent_accessor_storage = __runInitializers(this, _titleContent_initializers, "");
66
- /** The title displayed in `dropzone` variant. */
67
- get titleContent() {
68
- return this.#titleContent_accessor_storage;
69
- }
70
- set titleContent(value) {
71
- this.#titleContent_accessor_storage = value;
72
- }
73
- renderTemplate(input) {
74
- return html$1`
75
- <label>
76
- <span class="sbb-file-selector__dropzone-area">
77
- <span class="sbb-file-selector__dropzone-area--icon">
78
- <sbb-icon
79
- name=${this.size === "m" ? "folder-open-medium" : "folder-open-small"}
80
- ></sbb-icon>
81
- </span>
82
- <span class="sbb-file-selector__dropzone-area--title">${this.titleContent}</span>
83
- <span class="sbb-file-selector__dropzone-area--subtitle">
84
- ${this.multiple ? i18nFileSelectorSubtitleLabelMultiple[this.language.current] : i18nFileSelectorSubtitleLabel[this.language.current]}
85
- </span>
86
- <span class="sbb-file-selector__dropzone-area--button">
87
- <sbb-secondary-button-static
88
- size=${this.size}
89
- ?disabled=${this.disabled || this.formDisabled}
90
- ${ref((el) => {
91
- this.loadButton = el;
92
- })}
93
- >
94
- ${this.getButtonLabel()}
95
- </sbb-secondary-button-static>
96
- </span>
97
- </span>
98
- ${input}
99
- </label>
100
- `;
101
- }
102
- constructor() {
103
- super(...arguments);
104
- __runInitializers(this, _titleContent_extraInitializers);
105
- }
106
- };
107
- })();
108
- //#endregion
109
- export { SbbFileSelectorDropzoneElement as t };
110
-
111
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zZWxlY3Rvci1kcm9wem9uZS5jb21wb25lbnQtQjFZNXFPamIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2ZpbGUtc2VsZWN0b3IvZmlsZS1zZWxlY3Rvci1kcm9wem9uZS9maWxlLXNlbGVjdG9yLWRyb3B6b25lLnNjc3M/aW5saW5lIiwiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2ZpbGUtc2VsZWN0b3IvZmlsZS1zZWxlY3Rvci1kcm9wem9uZS9maWxlLXNlbGVjdG9yLWRyb3B6b25lLmNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlICcuLi8uLi9jb3JlL3N0eWxlcycgYXMgc2JiO1xuXG4uc2JiLWZpbGUtc2VsZWN0b3JfX2Ryb3B6b25lLWFyZWEge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXMpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItZmlsZS1zZWxlY3Rvci1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgYm9yZGVyOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KSBkYXNoZWQgdmFyKC0tc2JiLWZpbGUtc2VsZWN0b3ItYm9yZGVyLWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLWJvcmRlci1yYWRpdXMtNHgpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1zYmItZmlsZS1zZWxlY3Rvci10cmFuc2l0aW9uLWR1cmF0aW9uKTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi1maWxlLXNlbGVjdG9yLXRyYW5zaXRpb24tZWFzaW5nLWZ1bmN0aW9uKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yO1xufVxuXG4uc2JiLWZpbGUtc2VsZWN0b3JfX2Ryb3B6b25lLWFyZWEtLWljb24ge1xuICBjb2xvcjogdmFyKC0tc2JiLWZpbGUtc2VsZWN0b3ItY29sb3IpO1xuICBsaW5lLWhlaWdodDogMDtcbn1cblxuLnNiYi1maWxlLXNlbGVjdG9yX19kcm9wem9uZS1hcmVhLS10aXRsZSB7XG4gIEBpbmNsdWRlIHNiYi50ZXh0LS1ib2xkO1xuICBAaW5jbHVkZSBzYmIudGl0bGUtNigkZXhjbHVkZS1zcGFjaW5nOiB0cnVlKTtcblxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiB2YXIoLS1zYmItZmlsZS1zZWxlY3Rvci1jb2xvcik7XG59XG5cbi5zYmItZmlsZS1zZWxlY3Rvcl9fZHJvcHpvbmUtYXJlYS0tc3VidGl0bGUge1xuICBAaW5jbHVkZSBzYmIudGV4dC14cy0tcmVndWxhcjtcblxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiB2YXIoLS1zYmItZmlsZS1zZWxlY3Rvci1zdWJ0aXRsZS1jb2xvcik7XG4gIG1hcmdpbi1ibG9jay1lbmQ6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTR4KTtcbn1cbiIsImltcG9ydCB7IHR5cGUgQ1NTUmVzdWx0R3JvdXAsIHR5cGUgVGVtcGxhdGVSZXN1bHQsIHVuc2FmZUNTUyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHJlZiB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlZi5qcyc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0L3N0YXRpYy1odG1sLmpzJztcblxuaW1wb3J0IHsgU2JiU2Vjb25kYXJ5QnV0dG9uU3RhdGljRWxlbWVudCB9IGZyb20gJy4uLy4uL2J1dHRvbi5wdXJlLnRzJztcbmltcG9ydCB7XG4gIGJveFNpemluZ1N0eWxlcyxcbiAgZm9yY2VUeXBlLFxuICBpMThuRmlsZVNlbGVjdG9yU3VidGl0bGVMYWJlbCxcbiAgaTE4bkZpbGVTZWxlY3RvclN1YnRpdGxlTGFiZWxNdWx0aXBsZSxcbiAgU2JiRWxlbWVudCxcbiAgdHlwZSBTYmJFbGVtZW50VHlwZSxcbn0gZnJvbSAnLi4vLi4vY29yZS50cyc7XG5pbXBvcnQgeyBTYmJJY29uRWxlbWVudCB9IGZyb20gJy4uLy4uL2ljb24ucHVyZS50cyc7XG5pbXBvcnQge1xuICBmaWxlU2VsZWN0b3JDb21tb25TdHlsZSxcbiAgU2JiRmlsZVNlbGVjdG9yQ29tbW9uRWxlbWVudE1peGluLFxufSBmcm9tICcuLi9jb21tb24vZmlsZS1zZWxlY3Rvci1jb21tb24udHMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9maWxlLXNlbGVjdG9yLWRyb3B6b25lLnNjc3M/aW5saW5lJztcblxuLyoqXG4gKiBJdCBhbGxvd3MgdG8gc2VsZWN0IG9uZSBvciBtb3JlIGZpbGUgZnJvbSBzdG9yYWdlIGRldmljZXMgdmlhIGJ1dHRvbiBjbGljayBvciBkcmFnIGFuZCBkcm9wLCBhbmQgZGlzcGxheSB0aGVtLlxuICpcbiAqIEBzbG90IGVycm9yIC0gVXNlIHRoaXMgdG8gcHJvdmlkZSBhIGBzYmItZXJyb3JgIHRvIHNob3cgYW4gZXJyb3IgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNiYkZpbGVTZWxlY3RvckRyb3B6b25lRWxlbWVudCBleHRlbmRzIFNiYkZpbGVTZWxlY3RvckNvbW1vbkVsZW1lbnRNaXhpbihTYmJFbGVtZW50KSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZWxlbWVudE5hbWU6IHN0cmluZyA9ICdzYmItZmlsZS1zZWxlY3Rvci1kcm9wem9uZSc7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZWxlbWVudERlcGVuZGVuY2llczogU2JiRWxlbWVudFR5cGVbXSA9IFtcbiAgICBTYmJJY29uRWxlbWVudCxcbiAgICBTYmJTZWNvbmRhcnlCdXR0b25TdGF0aWNFbGVtZW50LFxuICBdO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbXG4gICAgYm94U2l6aW5nU3R5bGVzLFxuICAgIGZpbGVTZWxlY3RvckNvbW1vblN0eWxlLFxuICAgIHVuc2FmZUNTUyhzdHlsZSksXG4gIF07XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGZpbGVjaGFuZ2VkOiAnZmlsZWNoYW5nZWQnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKiBUaGUgdGl0bGUgZGlzcGxheWVkIGluIGBkcm9wem9uZWAgdmFyaWFudC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3RpdGxlLWNvbnRlbnQnIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciB0aXRsZUNvbnRlbnQ6IHN0cmluZyA9ICcnO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXJUZW1wbGF0ZShpbnB1dDogVGVtcGxhdGVSZXN1bHQpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8bGFiZWw+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLWZpbGUtc2VsZWN0b3JfX2Ryb3B6b25lLWFyZWFcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1maWxlLXNlbGVjdG9yX19kcm9wem9uZS1hcmVhLS1pY29uXCI+XG4gICAgICAgICAgICA8c2JiLWljb25cbiAgICAgICAgICAgICAgbmFtZT0ke3RoaXMuc2l6ZSA9PT0gJ20nID8gJ2ZvbGRlci1vcGVuLW1lZGl1bScgOiAnZm9sZGVyLW9wZW4tc21hbGwnfVxuICAgICAgICAgICAgPjwvc2JiLWljb24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLWZpbGUtc2VsZWN0b3JfX2Ryb3B6b25lLWFyZWEtLXRpdGxlXCI+JHt0aGlzLnRpdGxlQ29udGVudH08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItZmlsZS1zZWxlY3Rvcl9fZHJvcHpvbmUtYXJlYS0tc3VidGl0bGVcIj5cbiAgICAgICAgICAgICR7dGhpcy5tdWx0aXBsZVxuICAgICAgICAgICAgICA/IGkxOG5GaWxlU2VsZWN0b3JTdWJ0aXRsZUxhYmVsTXVsdGlwbGVbdGhpcy5sYW5ndWFnZS5jdXJyZW50XVxuICAgICAgICAgICAgICA6IGkxOG5GaWxlU2VsZWN0b3JTdWJ0aXRsZUxhYmVsW3RoaXMubGFuZ3VhZ2UuY3VycmVudF19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLWZpbGUtc2VsZWN0b3JfX2Ryb3B6b25lLWFyZWEtLWJ1dHRvblwiPlxuICAgICAgICAgICAgPHNiYi1zZWNvbmRhcnktYnV0dG9uLXN0YXRpY1xuICAgICAgICAgICAgICBzaXplPSR7dGhpcy5zaXplfVxuICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkfVxuICAgICAgICAgICAgICAke3JlZigoZWw/OiBFbGVtZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkQnV0dG9uID0gZWwgYXMgU2JiU2Vjb25kYXJ5QnV0dG9uU3RhdGljRWxlbWVudDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICR7dGhpcy5nZXRCdXR0b25MYWJlbCgpfVxuICAgICAgICAgICAgPC9zYmItc2Vjb25kYXJ5LWJ1dHRvbi1zdGF0aWM+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgICR7aW5wdXR9XG4gICAgICA8L2xhYmVsPlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1maWxlLXNlbGVjdG9yLWRyb3B6b25lJzogU2JiRmlsZVNlbGVjdG9yRHJvcHpvbmVFbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQzJCYSx3Q0FBOEI7bUJBQVMsa0NBQWtDLFdBQVc7Ozs7Y0FBcEYsdUNBQXVDLFlBQTZDOzs7K0JBZ0I5RixXQUFXLEVBQ1gsU0FBUyxFQUFFLFdBQVcsaUJBQWlCLENBQUMsQ0FBQTtBQUN6QyxnQkFBQSxNQUFBLE1BQUEsMEJBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxrQkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFZLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBWixlQUFZOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsNEJBQUEsZ0NBQUE7Ozs7Ozs7OztBQWpCSSxRQUFBLGNBQXNCOzs7QUFDL0IsUUFBQSxzQkFBd0MsQ0FDN0QsZ0JBQ0EsZ0NBQ0Q7OztBQUNzQixRQUFBLFNBQXlCO0lBQzlDO0lBQ0E7SUFDQSxVQUFVLCtCQUFBO0lBQ1g7OztBQUNzQixRQUFBLFNBQVMsRUFDOUIsYUFBYSxlQUNMOztFQUtWLGlDQUFBLGtCQUFBLE1BQUEsNEJBQXVDLEdBQUU7O0VBQXpDLElBQWdCLGVBQVk7QUFBQSxVQUFBLE1BQUE7O0VBQTVCLElBQWdCLGFBQVksT0FBQTtBQUFBLFNBQUEsZ0NBQUE7O0VBRVQsZUFBZSxPQUFxQjtBQUNyRCxVQUFPLE1BQUk7Ozs7O3FCQUtNLEtBQUssU0FBUyxNQUFNLHVCQUF1QixvQkFBQTs7O2tFQUdFLEtBQUssYUFBWTs7Y0FFckUsS0FBSyxXQUNILHNDQUFzQyxLQUFLLFNBQVMsV0FDcEQsOEJBQThCLEtBQUssU0FBUyxTQUFBOzs7O3FCQUl2QyxLQUFLLEtBQUE7MEJBQ0EsS0FBSyxZQUFZLEtBQUssYUFBQTtnQkFDaEMsS0FBSyxPQUFzQjtBQUMzQixTQUFLLGFBQWE7S0FDbEIsQ0FBQTs7Z0JBRUEsS0FBSyxnQkFBZ0IsQ0FBQTs7OztVQUkzQixNQUFBIn0=