@sbb-esta/lyne-elements 3.10.0 → 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/calendar/calendar.component.d.ts +2 -1
- package/calendar/calendar.component.d.ts.map +1 -1
- package/core/controllers/escapable-overlay-controller.d.ts +3 -0
- package/core/controllers/escapable-overlay-controller.d.ts.map +1 -1
- package/core/controllers/overlay-position-controller.d.ts +60 -0
- package/core/controllers/overlay-position-controller.d.ts.map +1 -0
- package/core/controllers/overlay-position-controller.js +224 -0
- package/core/controllers.d.ts +1 -0
- package/core/controllers.d.ts.map +1 -1
- package/core/controllers.js +12 -10
- package/core/styles/core.scss +27 -2
- package/core.css +21 -2
- package/custom-elements.json +1996 -544
- package/development/calendar/calendar.component.d.ts +2 -1
- package/development/calendar/calendar.component.d.ts.map +1 -1
- package/development/calendar/calendar.component.js +1 -1
- package/development/core/controllers/escapable-overlay-controller.d.ts +3 -0
- package/development/core/controllers/escapable-overlay-controller.d.ts.map +1 -1
- package/development/core/controllers/escapable-overlay-controller.js +1 -1
- package/development/core/controllers/overlay-position-controller.d.ts +60 -0
- package/development/core/controllers/overlay-position-controller.d.ts.map +1 -0
- package/development/core/controllers/overlay-position-controller.js +306 -0
- package/development/core/controllers.d.ts +1 -0
- package/development/core/controllers.d.ts.map +1 -1
- package/development/core/controllers.js +3 -1
- package/development/mini-calendar/mini-calendar/mini-calendar.component.d.ts +35 -0
- package/development/mini-calendar/mini-calendar/mini-calendar.component.d.ts.map +1 -0
- package/development/mini-calendar/mini-calendar/mini-calendar.component.js +201 -0
- package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts +23 -0
- package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts.map +1 -0
- package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +181 -0
- package/development/mini-calendar/mini-calendar-day.d.ts +5 -0
- package/development/mini-calendar/mini-calendar-day.d.ts.map +1 -0
- package/development/mini-calendar/mini-calendar-day.js +5 -0
- package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts +25 -0
- package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts.map +1 -0
- package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +123 -0
- package/development/mini-calendar/mini-calendar-month.d.ts +5 -0
- package/development/mini-calendar/mini-calendar-month.d.ts.map +1 -0
- package/development/mini-calendar/mini-calendar-month.js +5 -0
- package/development/mini-calendar/mini-calendar.d.ts +5 -0
- package/development/mini-calendar/mini-calendar.d.ts.map +1 -0
- package/development/mini-calendar/mini-calendar.js +5 -0
- package/development/mini-calendar.d.ts +7 -0
- package/development/mini-calendar.d.ts.map +1 -0
- package/development/mini-calendar.js +9 -0
- package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts +4 -1
- package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts.map +1 -1
- package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.js +5 -1
- package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts +4 -1
- package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts.map +1 -1
- package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.js +5 -1
- package/development/tabs/tab/tab.component.d.ts +9 -0
- package/development/tabs/tab/tab.component.d.ts.map +1 -1
- package/development/tabs/tab/tab.component.js +48 -7
- package/development/tabs/tab-group/tab-group.component.d.ts +7 -3
- package/development/tabs/tab-group/tab-group.component.d.ts.map +1 -1
- package/development/tabs/tab-group/tab-group.component.js +19 -39
- package/development/tabs/tab-label/tab-label.component.d.ts.map +1 -1
- package/development/tabs/tab-label/tab-label.component.js +4 -3
- package/development/tooltip/tooltip.component.d.ts +11 -4
- package/development/tooltip/tooltip.component.d.ts.map +1 -1
- package/development/tooltip/tooltip.component.js +57 -78
- package/index.d.ts +6 -0
- package/index.js +6 -0
- package/mini-calendar/mini-calendar/mini-calendar.component.d.ts +35 -0
- package/mini-calendar/mini-calendar/mini-calendar.component.d.ts.map +1 -0
- package/mini-calendar/mini-calendar/mini-calendar.component.js +133 -0
- package/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts +23 -0
- package/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts.map +1 -0
- package/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +66 -0
- package/mini-calendar/mini-calendar-day.d.ts +5 -0
- package/mini-calendar/mini-calendar-day.d.ts.map +1 -0
- package/mini-calendar/mini-calendar-day.js +4 -0
- package/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts +25 -0
- package/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts.map +1 -0
- package/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +59 -0
- package/mini-calendar/mini-calendar-month.d.ts +5 -0
- package/mini-calendar/mini-calendar-month.d.ts.map +1 -0
- package/mini-calendar/mini-calendar-month.js +4 -0
- package/mini-calendar/mini-calendar.d.ts +5 -0
- package/mini-calendar/mini-calendar.d.ts.map +1 -0
- package/mini-calendar/mini-calendar.js +4 -0
- package/mini-calendar.d.ts +7 -0
- package/mini-calendar.d.ts.map +1 -0
- package/mini-calendar.js +8 -0
- package/off-brand-theme.css +21 -2
- package/package.json +21 -1
- package/safety-theme.css +21 -2
- package/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts +4 -1
- package/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts.map +1 -1
- package/sidebar/icon-sidebar-button/icon-sidebar-button.component.js +9 -6
- package/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts +4 -1
- package/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts.map +1 -1
- package/sidebar/icon-sidebar-link/icon-sidebar-link.component.js +13 -10
- package/standard-theme.css +21 -2
- package/tabs/tab/tab.component.d.ts +9 -0
- package/tabs/tab/tab.component.d.ts.map +1 -1
- package/tabs/tab/tab.component.js +37 -18
- package/tabs/tab-group/tab-group.component.d.ts +7 -3
- package/tabs/tab-group/tab-group.component.d.ts.map +1 -1
- package/tabs/tab-group/tab-group.component.js +51 -52
- package/tabs/tab-label/tab-label.component.d.ts.map +1 -1
- package/tabs/tab-label/tab-label.component.js +12 -12
- package/tooltip/tooltip.component.d.ts +11 -4
- package/tooltip/tooltip.component.d.ts.map +1 -1
- package/tooltip/tooltip.component.js +60 -84
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { ReactiveController, ReactiveControllerHost } from 'lit';
|
|
2
2
|
import { SbbOpenCloseBaseElement } from '../base-elements/open-close-base-element.js';
|
|
3
|
+
/**
|
|
4
|
+
* Handles the stack of overlays and closes the last opened one when pressing Escape.
|
|
5
|
+
*/
|
|
3
6
|
export declare class SbbEscapableOverlayController implements ReactiveController {
|
|
4
7
|
private _host;
|
|
5
8
|
private _overlayStack;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escapable-overlay-controller.d.ts","sourceRoot":"","sources":["../../../../../src/elements/core/controllers/escapable-overlay-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,KAAK,CAAC;AAErF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAa3F,qBAAa,6BAA8B,YAAW,kBAAkB;IAEpE,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,aAAa;gBADb,KAAK,EAAE,sBAAsB,GAAG,uBAAuB,EACvD,aAAa,GAAE,uBAAuB,EAAiB;IAK1D,gBAAgB,IAAI,IAAI;IAKxB,OAAO,IAAI,IAAI;IAQf,UAAU,IAAI,IAAI;CAQ1B"}
|
|
1
|
+
{"version":3,"file":"escapable-overlay-controller.d.ts","sourceRoot":"","sources":["../../../../../src/elements/core/controllers/escapable-overlay-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,KAAK,CAAC;AAErF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAa3F;;GAEG;AACH,qBAAa,6BAA8B,YAAW,kBAAkB;IAEpE,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,aAAa;gBADb,KAAK,EAAE,sBAAsB,GAAG,uBAAuB,EACvD,aAAa,GAAE,uBAAuB,EAAiB;IAK1D,gBAAgB,IAAI,IAAI;IAKxB,OAAO,IAAI,IAAI;IAQf,UAAU,IAAI,IAAI;CAQ1B"}
|
|
@@ -35,4 +35,4 @@ class SbbEscapableOverlayController {
|
|
|
35
35
|
export {
|
|
36
36
|
SbbEscapableOverlayController
|
|
37
37
|
};
|
|
38
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNjYXBhYmxlLW92ZXJsYXktY29udHJvbGxlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvY29udHJvbGxlcnMvZXNjYXBhYmxlLW92ZXJsYXktY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1NlcnZlciwgdHlwZSBSZWFjdGl2ZUNvbnRyb2xsZXIsIHR5cGUgUmVhY3RpdmVDb250cm9sbGVySG9zdCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB0eXBlIHsgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9iYXNlLWVsZW1lbnRzL29wZW4tY2xvc2UtYmFzZS1lbGVtZW50LmpzJztcblxuY29uc3Qgb3ZlcmxheVN0YWNrID0gbmV3IEFycmF5PFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50PigpO1xuXG5pZiAoIWlzU2VydmVyKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBvdmVybGF5U3RhY2suYXQoLTEpPy5lc2NhcGVTdHJhdGVneSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgc3RhY2sgb2Ygb3ZlcmxheXMgYW5kIGNsb3NlcyB0aGUgbGFzdCBvcGVuZWQgb25lIHdoZW4gcHJlc3NpbmcgRXNjYXBlLlxuICovXG5leHBvcnQgY2xhc3MgU2JiRXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIgaW1wbGVtZW50cyBSZWFjdGl2ZUNvbnRyb2xsZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfaG9zdDogUmVhY3RpdmVDb250cm9sbGVySG9zdCAmIFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50LFxuICAgIHByaXZhdGUgX292ZXJsYXlTdGFjazogU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnRbXSA9IG92ZXJsYXlTdGFjayxcbiAgKSB7XG4gICAgdGhpcy5faG9zdC5hZGRDb250cm9sbGVyPy4odGhpcyk7XG4gIH1cblxuICBwdWJsaWMgaG9zdERpc2Nvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgb3ZlcmxheSBpcyBvcGVuZWRcbiAgcHVibGljIGNvbm5lY3QoKTogdm9pZCB7XG4gICAgLy8gRHVlIHRvIGNvbm5lY3QoKSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZSBob3N0LFxuICAgIC8vIHdlIGhhdmUgdG8gcmVtb3ZlIGEgcG90ZW50aWFsIGVudHJ5IG9mIHRoZSBob3N0IGZyb20gdGhlIHN0YWNrLlxuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuX292ZXJsYXlTdGFjay5wdXNoKHRoaXMuX2hvc3QpO1xuICB9XG5cbiAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBvdmVybGF5IGlzIGNsb3NlZFxuICBwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fb3ZlcmxheVN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgZmluZEVsSW5kZXggPSB0aGlzLl9vdmVybGF5U3RhY2suZmluZEluZGV4KChlKSA9PiBlID09PSB0aGlzLl9ob3N0KTtcbiAgICAgIGlmIChmaW5kRWxJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVN0YWNrLnNwbGljZShmaW5kRWxJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUlBLE1BQU0sZUFBZSxJQUFJLE1BQUE7QUFFekIsSUFBSSxDQUFDLFVBQVU7QUFDYixTQUFPLGlCQUFpQixXQUFXLENBQUMsVUFBd0I7QUFDMUQsUUFBSSxNQUFNLFFBQVEsWUFBWSxDQUFDLE1BQU0sa0JBQWtCO0FBQ3JELFlBQU0sZUFBQTtBQUNOLG1CQUFhLEdBQUcsRUFBRSxHQUFHLGVBQUE7QUFBQSxJQUN2QjtBQUFBLEVBQ0YsQ0FBQztBQUNIO01BS2EsOEJBQTZCO0FBQUEsRUFDeEMsWUFDVSxPQUNBLGdCQUEyQyxjQUFZO0FBRHZELFNBQUEsUUFBQTtBQUNBLFNBQUEsZ0JBQUE7QUFFUixTQUFLLE1BQU0sZ0JBQWdCLElBQUk7QUFBQSxFQUNqQztBQUFBLEVBRU8sbUJBQWdCO0FBQ3JCLFNBQUssV0FBQTtBQUFBLEVBQ1A7QUFBQTtBQUFBLEVBR08sVUFBTztBQUdaLFNBQUssV0FBQTtBQUNMLFNBQUssY0FBYyxLQUFLLEtBQUssS0FBSztBQUFBLEVBQ3BDO0FBQUE7QUFBQSxFQUdPLGFBQVU7QUFDZixRQUFJLEtBQUssY0FBYyxRQUFRO0FBQzdCLFlBQU0sY0FBYyxLQUFLLGNBQWMsVUFBVSxDQUFDLE1BQU0sTUFBTSxLQUFLLEtBQUs7QUFDeEUsVUFBSSxnQkFBZ0IsSUFBSTtBQUN0QixhQUFLLGNBQWMsT0FBTyxhQUFhLENBQUM7QUFBQSxNQUMxQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Q7In0=
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ReactiveController, ReactiveControllerHost } from 'lit';
|
|
2
|
+
/**
|
|
3
|
+
* Controller for managing overlays positioning. Also acts as a polyfill when native
|
|
4
|
+
* CSS Anchor Positioning is not supported (enough).
|
|
5
|
+
* Applies unique anchor names when using native CSS Anchor Positioning
|
|
6
|
+
* or calculates and applies correct positions in polyfill mode.
|
|
7
|
+
*
|
|
8
|
+
* Also, the controller sets the 'data-overlay-position' attribute on the overlay element.
|
|
9
|
+
* This can be used to apply specific styles based on the current position of the overlay.
|
|
10
|
+
*
|
|
11
|
+
* ### Implementation
|
|
12
|
+
* Define and apply the following CSS variables on the overlay element:
|
|
13
|
+
* ```scss
|
|
14
|
+
* --sbb-overlay-position-area: block-end; // Default
|
|
15
|
+
* --sbb-overlay-position-try-fallbacks: block-start, inline-end, inline-start; // Fallbacks
|
|
16
|
+
*
|
|
17
|
+
* position-area: var(--sbb-overlay-position-area);
|
|
18
|
+
* position-try-fallbacks: var(--sbb-overlay-position-try-fallbacks);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare class SbbOverlayPositionController implements ReactiveController {
|
|
22
|
+
private _usePolyfill;
|
|
23
|
+
private readonly _resizeObserver;
|
|
24
|
+
private readonly _overlay;
|
|
25
|
+
private _abortController?;
|
|
26
|
+
private _anchor?;
|
|
27
|
+
private _overlayStyles?;
|
|
28
|
+
private _frame?;
|
|
29
|
+
private _anchorName;
|
|
30
|
+
private _positions;
|
|
31
|
+
private _lastPosition?;
|
|
32
|
+
/** Get the current position. (e.g. block-end, block-start, etc.) */
|
|
33
|
+
get currentPosition(): string;
|
|
34
|
+
constructor(host: ReactiveControllerHost & HTMLElement, overlay?: HTMLElement, _usePolyfill?: boolean);
|
|
35
|
+
hostConnected(): void;
|
|
36
|
+
hostUpdate(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Connects the overlay to the given trigger element and determines the optimal position.
|
|
39
|
+
* Usually, this is called when the overlay is opened.
|
|
40
|
+
* @param anchor The anchor element.
|
|
41
|
+
*/
|
|
42
|
+
connect(anchor: HTMLElement): void;
|
|
43
|
+
disconnect(): void;
|
|
44
|
+
private _requestCalculatePosition;
|
|
45
|
+
private _calculatePosition;
|
|
46
|
+
/**
|
|
47
|
+
* Calculates the optimal position that fits the overlay.
|
|
48
|
+
* @param positions The list of positions to check.
|
|
49
|
+
* @private
|
|
50
|
+
*/
|
|
51
|
+
private _getOptimalPosition;
|
|
52
|
+
private _applyOverlayPosition;
|
|
53
|
+
/**
|
|
54
|
+
* Only used in polyfill mode.
|
|
55
|
+
* Reads the list of the configured positions from the CSS variables.
|
|
56
|
+
* @private
|
|
57
|
+
*/
|
|
58
|
+
private _readPositionsFromCss;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=overlay-position-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay-position-controller.d.ts","sourceRoot":"","sources":["../../../../../src/elements/core/controllers/overlay-position-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,KAAK,CAAC;AAqDrF;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,4BAA6B,YAAW,kBAAkB;IA0BnE,OAAO,CAAC,YAAY;IAzBtB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAEtB;IACV,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,gBAAgB,CAAC,CAAkB;IAC3C,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAsB;IAC7C,OAAO,CAAC,MAAM,CAAC,CAA2C;IAC1D,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,aAAa,CAAC,CAAS;IAE/B,oEAAoE;IACpE,IAAW,eAAe,IAAI,MAAM,CAOnC;gBAGC,IAAI,EAAE,sBAAsB,GAAG,WAAW,EAC1C,OAAO,CAAC,EAAE,WAAW,EACb,YAAY,UAA8B;IAM7C,aAAa,IAAI,IAAI;IASrB,UAAU,IAAI,IAAI;IAOzB;;;;OAIG;IACI,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAmClC,UAAU,IAAI,IAAI;IAOzB,OAAO,CAAC,yBAAyB;IAOjC,OAAO,CAAC,kBAAkB;IAY1B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAiL3B,OAAO,CAAC,qBAAqB;IAM7B;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;CA6B9B"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { isServer } from "lit";
|
|
2
|
+
const cssAnchorPositionSupported = !isServer && CSS.supports("anchor-name", "--test");
|
|
3
|
+
const physicalSupportedPositions = [
|
|
4
|
+
"top",
|
|
5
|
+
"bottom",
|
|
6
|
+
"left",
|
|
7
|
+
"right",
|
|
8
|
+
"top span-left",
|
|
9
|
+
"top span-right",
|
|
10
|
+
"bottom span-left",
|
|
11
|
+
"bottom span-right",
|
|
12
|
+
"left span-top",
|
|
13
|
+
"left span-bottom",
|
|
14
|
+
"right span-top",
|
|
15
|
+
"right span-bottom"
|
|
16
|
+
];
|
|
17
|
+
const logicalSupportedPositions = [
|
|
18
|
+
"block-start",
|
|
19
|
+
"block-end",
|
|
20
|
+
"inline-start",
|
|
21
|
+
"inline-end",
|
|
22
|
+
"block-start span-inline-start",
|
|
23
|
+
"block-start span-inline-end",
|
|
24
|
+
"block-end span-inline-start",
|
|
25
|
+
"block-end span-inline-end",
|
|
26
|
+
"inline-start span-block-start",
|
|
27
|
+
"inline-start span-block-end",
|
|
28
|
+
"inline-end span-block-start",
|
|
29
|
+
"inline-end span-block-end"
|
|
30
|
+
];
|
|
31
|
+
const rtlPositionMapping = {
|
|
32
|
+
"block-start": "block-start",
|
|
33
|
+
"block-end": "block-end",
|
|
34
|
+
"inline-start": "inline-end",
|
|
35
|
+
"inline-end": "inline-start",
|
|
36
|
+
"block-start span-inline-start": "block-start span-inline-end",
|
|
37
|
+
"block-start span-inline-end": "block-start span-inline-start",
|
|
38
|
+
"block-end span-inline-start": "block-end span-inline-end",
|
|
39
|
+
"block-end span-inline-end": "block-end span-inline-start",
|
|
40
|
+
"inline-start span-block-start": "inline-end span-block-start",
|
|
41
|
+
"inline-start span-block-end": "inline-end span-block-end",
|
|
42
|
+
"inline-end span-block-start": "inline-start span-block-start",
|
|
43
|
+
"inline-end span-block-end": "inline-start span-block-end"
|
|
44
|
+
};
|
|
45
|
+
const supportedPositions = [...physicalSupportedPositions, ...logicalSupportedPositions];
|
|
46
|
+
let nextId = 0;
|
|
47
|
+
class SbbOverlayPositionController {
|
|
48
|
+
/** Get the current position. (e.g. block-end, block-start, etc.) */
|
|
49
|
+
get currentPosition() {
|
|
50
|
+
if (this._usePolyfill) {
|
|
51
|
+
return this._lastPosition ?? this._positions[0] ?? "";
|
|
52
|
+
} else {
|
|
53
|
+
this._overlayStyles ??= getComputedStyle(this._overlay);
|
|
54
|
+
return this._overlayStyles.getPropertyValue("position-area");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
constructor(host, overlay, _usePolyfill = !cssAnchorPositionSupported) {
|
|
58
|
+
this._usePolyfill = _usePolyfill;
|
|
59
|
+
this._resizeObserver = !isServer ? new ResizeObserver(() => this._requestCalculatePosition()) : null;
|
|
60
|
+
this._anchorName = `--sbb-overlay-anchor-${++nextId}`;
|
|
61
|
+
this._positions = [];
|
|
62
|
+
host.addController(this);
|
|
63
|
+
this._overlay = overlay ?? host;
|
|
64
|
+
}
|
|
65
|
+
hostConnected() {
|
|
66
|
+
if (!this._usePolyfill) {
|
|
67
|
+
this._overlay.style.setProperty("position-anchor", this._anchorName);
|
|
68
|
+
} else {
|
|
69
|
+
this._overlay.style.setProperty("position-area", "initial");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
hostUpdate() {
|
|
73
|
+
if (isServer) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this._readPositionsFromCss();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Connects the overlay to the given trigger element and determines the optimal position.
|
|
80
|
+
* Usually, this is called when the overlay is opened.
|
|
81
|
+
* @param anchor The anchor element.
|
|
82
|
+
*/
|
|
83
|
+
connect(anchor) {
|
|
84
|
+
if (isServer) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (this._anchor) {
|
|
88
|
+
this.disconnect();
|
|
89
|
+
}
|
|
90
|
+
this._anchor = anchor;
|
|
91
|
+
if (!this._usePolyfill) {
|
|
92
|
+
this._anchor.style.setProperty("anchor-name", this._anchorName);
|
|
93
|
+
}
|
|
94
|
+
this._readPositionsFromCss();
|
|
95
|
+
this._calculatePosition();
|
|
96
|
+
this._abortController?.abort();
|
|
97
|
+
this._abortController = new AbortController();
|
|
98
|
+
document.addEventListener("scroll", () => this._requestCalculatePosition(), {
|
|
99
|
+
capture: true,
|
|
100
|
+
passive: true,
|
|
101
|
+
signal: this._abortController.signal
|
|
102
|
+
});
|
|
103
|
+
window.addEventListener("resize", () => this._requestCalculatePosition(), {
|
|
104
|
+
passive: true,
|
|
105
|
+
signal: this._abortController.signal
|
|
106
|
+
});
|
|
107
|
+
this._resizeObserver.observe(anchor, { box: "border-box" });
|
|
108
|
+
this._resizeObserver.observe(this._overlay, { box: "border-box" });
|
|
109
|
+
}
|
|
110
|
+
disconnect() {
|
|
111
|
+
this._anchor?.style.removeProperty("anchor-name");
|
|
112
|
+
this._anchor = void 0;
|
|
113
|
+
this._abortController?.abort();
|
|
114
|
+
this._resizeObserver.disconnect();
|
|
115
|
+
}
|
|
116
|
+
_requestCalculatePosition() {
|
|
117
|
+
this._frame ??= requestAnimationFrame(() => {
|
|
118
|
+
this._calculatePosition();
|
|
119
|
+
this._frame = void 0;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
_calculatePosition() {
|
|
123
|
+
if (!this._anchor) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (this._usePolyfill) {
|
|
127
|
+
const position = this._getOptimalPosition(this._positions);
|
|
128
|
+
this._applyOverlayPosition(position.position, position.left, position.top);
|
|
129
|
+
}
|
|
130
|
+
this._overlay.setAttribute("data-position", this.currentPosition);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Calculates the optimal position that fits the overlay.
|
|
134
|
+
* @param positions The list of positions to check.
|
|
135
|
+
* @private
|
|
136
|
+
*/
|
|
137
|
+
_getOptimalPosition(positions) {
|
|
138
|
+
const { offsetHeight: overlayHeight, offsetWidth: overlayWidth } = this._overlay;
|
|
139
|
+
const { innerHeight: viewportHeight, innerWidth: viewportWidth } = window;
|
|
140
|
+
const { top: triggerOffsetTop, left: triggerOffsetLeft, height: triggerHeight, width: triggerWidth } = this._anchor.getBoundingClientRect();
|
|
141
|
+
const isRtl = this._overlay.matches(":dir(rtl)");
|
|
142
|
+
const topSpace = triggerOffsetTop;
|
|
143
|
+
const bottomSpace = viewportHeight - triggerHeight - triggerOffsetTop;
|
|
144
|
+
const leftSpace = triggerOffsetLeft;
|
|
145
|
+
const rightSpace = viewportWidth - triggerWidth - triggerOffsetLeft;
|
|
146
|
+
const overlayWidthNet = overlayWidth - triggerWidth;
|
|
147
|
+
const overlayHeightNet = overlayHeight - triggerHeight;
|
|
148
|
+
const overlayWidthOverlap = overlayWidthNet / 2;
|
|
149
|
+
const overlayHeightOverlap = overlayHeightNet / 2;
|
|
150
|
+
this._overlay.style.setProperty("--sbb-overlay-controller-trigger-height", `${triggerHeight}px`);
|
|
151
|
+
this._overlay.style.setProperty("--sbb-overlay-controller-trigger-width", `${triggerWidth}px`);
|
|
152
|
+
let result = { left: 0, top: 0, position: "" };
|
|
153
|
+
let firstPosition = void 0;
|
|
154
|
+
for (const position of positions) {
|
|
155
|
+
const physicalPosition = isRtl && logicalSupportedPositions.includes(position) ? rtlPositionMapping[position] : position;
|
|
156
|
+
switch (physicalPosition) {
|
|
157
|
+
default:
|
|
158
|
+
case "bottom":
|
|
159
|
+
case "block-end":
|
|
160
|
+
result = {
|
|
161
|
+
position,
|
|
162
|
+
left: triggerOffsetLeft - overlayWidthOverlap,
|
|
163
|
+
top: triggerOffsetTop + triggerHeight,
|
|
164
|
+
fits: overlayHeight <= bottomSpace && overlayWidthOverlap <= leftSpace && overlayWidthOverlap <= rightSpace
|
|
165
|
+
};
|
|
166
|
+
break;
|
|
167
|
+
case "top":
|
|
168
|
+
case "block-start":
|
|
169
|
+
result = {
|
|
170
|
+
position,
|
|
171
|
+
left: triggerOffsetLeft - overlayWidthOverlap,
|
|
172
|
+
top: triggerOffsetTop - overlayHeight,
|
|
173
|
+
fits: overlayHeight <= topSpace && overlayWidthOverlap <= leftSpace && overlayWidthOverlap <= rightSpace
|
|
174
|
+
};
|
|
175
|
+
break;
|
|
176
|
+
case "right":
|
|
177
|
+
case "inline-end":
|
|
178
|
+
result = {
|
|
179
|
+
position,
|
|
180
|
+
left: triggerOffsetLeft + triggerWidth,
|
|
181
|
+
top: triggerOffsetTop - overlayHeightOverlap,
|
|
182
|
+
fits: overlayWidth <= rightSpace && overlayHeightOverlap <= topSpace && overlayHeightOverlap <= bottomSpace
|
|
183
|
+
};
|
|
184
|
+
break;
|
|
185
|
+
case "left":
|
|
186
|
+
case "inline-start":
|
|
187
|
+
result = {
|
|
188
|
+
position,
|
|
189
|
+
left: triggerOffsetLeft - overlayWidth,
|
|
190
|
+
top: triggerOffsetTop - overlayHeightOverlap,
|
|
191
|
+
fits: overlayWidth <= leftSpace && overlayHeightOverlap <= topSpace && overlayHeightOverlap <= bottomSpace
|
|
192
|
+
};
|
|
193
|
+
break;
|
|
194
|
+
case "top span-left":
|
|
195
|
+
case "block-start span-inline-start":
|
|
196
|
+
result = {
|
|
197
|
+
position,
|
|
198
|
+
left: triggerOffsetLeft - overlayWidthNet,
|
|
199
|
+
top: triggerOffsetTop - overlayHeight,
|
|
200
|
+
fits: overlayHeight <= topSpace && overlayWidthNet <= leftSpace
|
|
201
|
+
};
|
|
202
|
+
break;
|
|
203
|
+
case "top span-right":
|
|
204
|
+
case "block-start span-inline-end":
|
|
205
|
+
result = {
|
|
206
|
+
position,
|
|
207
|
+
left: triggerOffsetLeft,
|
|
208
|
+
top: triggerOffsetTop - overlayHeight,
|
|
209
|
+
fits: overlayHeight <= topSpace && overlayWidthNet <= rightSpace
|
|
210
|
+
};
|
|
211
|
+
break;
|
|
212
|
+
case "bottom span-left":
|
|
213
|
+
case "block-end span-inline-start":
|
|
214
|
+
result = {
|
|
215
|
+
position,
|
|
216
|
+
left: triggerOffsetLeft - overlayWidthNet,
|
|
217
|
+
top: triggerOffsetTop + triggerHeight,
|
|
218
|
+
fits: overlayHeight <= bottomSpace && overlayWidthNet <= leftSpace
|
|
219
|
+
};
|
|
220
|
+
break;
|
|
221
|
+
case "bottom span-right":
|
|
222
|
+
case "block-end span-inline-end":
|
|
223
|
+
result = {
|
|
224
|
+
position,
|
|
225
|
+
left: triggerOffsetLeft,
|
|
226
|
+
top: triggerOffsetTop + triggerHeight,
|
|
227
|
+
fits: overlayHeight <= bottomSpace && overlayWidthNet <= rightSpace
|
|
228
|
+
};
|
|
229
|
+
break;
|
|
230
|
+
case "left span-top":
|
|
231
|
+
case "inline-start span-block-start":
|
|
232
|
+
result = {
|
|
233
|
+
position,
|
|
234
|
+
left: triggerOffsetLeft - overlayWidth,
|
|
235
|
+
top: triggerOffsetTop + triggerHeight - overlayHeight,
|
|
236
|
+
fits: overlayWidth <= leftSpace && overlayHeightNet <= topSpace
|
|
237
|
+
};
|
|
238
|
+
break;
|
|
239
|
+
case "left span-bottom":
|
|
240
|
+
case "inline-start span-block-end":
|
|
241
|
+
result = {
|
|
242
|
+
position,
|
|
243
|
+
left: triggerOffsetLeft - overlayWidth,
|
|
244
|
+
top: triggerOffsetTop,
|
|
245
|
+
fits: overlayWidth <= leftSpace && overlayHeightNet <= bottomSpace
|
|
246
|
+
};
|
|
247
|
+
break;
|
|
248
|
+
case "right span-top":
|
|
249
|
+
case "inline-end span-block-start":
|
|
250
|
+
result = {
|
|
251
|
+
position,
|
|
252
|
+
left: triggerOffsetLeft + triggerWidth,
|
|
253
|
+
top: triggerOffsetTop + triggerHeight - overlayHeight,
|
|
254
|
+
fits: overlayWidth <= rightSpace && overlayHeightNet <= topSpace
|
|
255
|
+
};
|
|
256
|
+
break;
|
|
257
|
+
case "right span-bottom":
|
|
258
|
+
case "inline-end span-block-end":
|
|
259
|
+
result = {
|
|
260
|
+
position,
|
|
261
|
+
left: triggerOffsetLeft + triggerWidth,
|
|
262
|
+
top: triggerOffsetTop,
|
|
263
|
+
fits: overlayWidth <= rightSpace && overlayHeightNet <= bottomSpace
|
|
264
|
+
};
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
if (result.fits) {
|
|
268
|
+
return result;
|
|
269
|
+
}
|
|
270
|
+
firstPosition ??= result;
|
|
271
|
+
}
|
|
272
|
+
return firstPosition;
|
|
273
|
+
}
|
|
274
|
+
_applyOverlayPosition(position, left, top) {
|
|
275
|
+
this._lastPosition = position;
|
|
276
|
+
this._overlay.style.left = `${left}px`;
|
|
277
|
+
this._overlay.style.top = `${top}px`;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Only used in polyfill mode.
|
|
281
|
+
* Reads the list of the configured positions from the CSS variables.
|
|
282
|
+
* @private
|
|
283
|
+
*/
|
|
284
|
+
_readPositionsFromCss() {
|
|
285
|
+
if (!this._usePolyfill) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
this._overlayStyles ??= getComputedStyle(this._overlay);
|
|
289
|
+
const positions = [
|
|
290
|
+
this._overlayStyles.getPropertyValue("--sbb-overlay-position-area") || "block-end",
|
|
291
|
+
...this._overlayStyles.getPropertyValue("--sbb-overlay-position-try-fallbacks").split(",").map((f) => f.trim()).filter((f) => !!f)
|
|
292
|
+
];
|
|
293
|
+
if (positions.some((p) => !supportedPositions.includes(p))) {
|
|
294
|
+
const unsupportedPositions = positions.filter((p) => !supportedPositions.includes(p)).sort().join(", ");
|
|
295
|
+
throw new Error(`Unsupported position-try-fallbacks ${unsupportedPositions} (Supported: ${supportedPositions.join(", ")})`);
|
|
296
|
+
}
|
|
297
|
+
this._positions = positions;
|
|
298
|
+
if (this._lastPosition && !this._positions.includes(this._lastPosition)) {
|
|
299
|
+
this._lastPosition = void 0;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
export {
|
|
304
|
+
SbbOverlayPositionController
|
|
305
|
+
};
|
|
306
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wb3NpdGlvbi1jb250cm9sbGVyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvY29yZS9jb250cm9sbGVycy9vdmVybGF5LXBvc2l0aW9uLWNvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNTZXJ2ZXIsIHR5cGUgUmVhY3RpdmVDb250cm9sbGVyLCB0eXBlIFJlYWN0aXZlQ29udHJvbGxlckhvc3QgfSBmcm9tICdsaXQnO1xuXG5jb25zdCBjc3NBbmNob3JQb3NpdGlvblN1cHBvcnRlZCA9ICFpc1NlcnZlciAmJiBDU1Muc3VwcG9ydHMoJ2FuY2hvci1uYW1lJywgJy0tdGVzdCcpO1xuXG5jb25zdCBwaHlzaWNhbFN1cHBvcnRlZFBvc2l0aW9ucyA9IFtcbiAgJ3RvcCcsXG4gICdib3R0b20nLFxuICAnbGVmdCcsXG4gICdyaWdodCcsXG4gICd0b3Agc3Bhbi1sZWZ0JyxcbiAgJ3RvcCBzcGFuLXJpZ2h0JyxcbiAgJ2JvdHRvbSBzcGFuLWxlZnQnLFxuICAnYm90dG9tIHNwYW4tcmlnaHQnLFxuICAnbGVmdCBzcGFuLXRvcCcsXG4gICdsZWZ0IHNwYW4tYm90dG9tJyxcbiAgJ3JpZ2h0IHNwYW4tdG9wJyxcbiAgJ3JpZ2h0IHNwYW4tYm90dG9tJyxcbl07XG5cbi8vIE5vdGU6IGlmIHlvdSBhZGQgbmV3IGxvZ2ljYWwgc3VwcG9ydGVkIHBvc2l0aW9ucywgdXBkYXRlIGFsc28gdGhlICdydGxQb3NpdGlvbk1hcHBpbmcnXG5jb25zdCBsb2dpY2FsU3VwcG9ydGVkUG9zaXRpb25zID0gW1xuICAnYmxvY2stc3RhcnQnLFxuICAnYmxvY2stZW5kJyxcbiAgJ2lubGluZS1zdGFydCcsXG4gICdpbmxpbmUtZW5kJyxcbiAgJ2Jsb2NrLXN0YXJ0IHNwYW4taW5saW5lLXN0YXJ0JyxcbiAgJ2Jsb2NrLXN0YXJ0IHNwYW4taW5saW5lLWVuZCcsXG4gICdibG9jay1lbmQgc3Bhbi1pbmxpbmUtc3RhcnQnLFxuICAnYmxvY2stZW5kIHNwYW4taW5saW5lLWVuZCcsXG4gICdpbmxpbmUtc3RhcnQgc3Bhbi1ibG9jay1zdGFydCcsXG4gICdpbmxpbmUtc3RhcnQgc3Bhbi1ibG9jay1lbmQnLFxuICAnaW5saW5lLWVuZCBzcGFuLWJsb2NrLXN0YXJ0JyxcbiAgJ2lubGluZS1lbmQgc3Bhbi1ibG9jay1lbmQnLFxuXTtcblxuY29uc3QgcnRsUG9zaXRpb25NYXBwaW5nOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAnYmxvY2stc3RhcnQnOiAnYmxvY2stc3RhcnQnLFxuICAnYmxvY2stZW5kJzogJ2Jsb2NrLWVuZCcsXG4gICdpbmxpbmUtc3RhcnQnOiAnaW5saW5lLWVuZCcsXG4gICdpbmxpbmUtZW5kJzogJ2lubGluZS1zdGFydCcsXG4gICdibG9jay1zdGFydCBzcGFuLWlubGluZS1zdGFydCc6ICdibG9jay1zdGFydCBzcGFuLWlubGluZS1lbmQnLFxuICAnYmxvY2stc3RhcnQgc3Bhbi1pbmxpbmUtZW5kJzogJ2Jsb2NrLXN0YXJ0IHNwYW4taW5saW5lLXN0YXJ0JyxcbiAgJ2Jsb2NrLWVuZCBzcGFuLWlubGluZS1zdGFydCc6ICdibG9jay1lbmQgc3Bhbi1pbmxpbmUtZW5kJyxcbiAgJ2Jsb2NrLWVuZCBzcGFuLWlubGluZS1lbmQnOiAnYmxvY2stZW5kIHNwYW4taW5saW5lLXN0YXJ0JyxcbiAgJ2lubGluZS1zdGFydCBzcGFuLWJsb2NrLXN0YXJ0JzogJ2lubGluZS1lbmQgc3Bhbi1ibG9jay1zdGFydCcsXG4gICdpbmxpbmUtc3RhcnQgc3Bhbi1ibG9jay1lbmQnOiAnaW5saW5lLWVuZCBzcGFuLWJsb2NrLWVuZCcsXG4gICdpbmxpbmUtZW5kIHNwYW4tYmxvY2stc3RhcnQnOiAnaW5saW5lLXN0YXJ0IHNwYW4tYmxvY2stc3RhcnQnLFxuICAnaW5saW5lLWVuZCBzcGFuLWJsb2NrLWVuZCc6ICdpbmxpbmUtc3RhcnQgc3Bhbi1ibG9jay1lbmQnLFxufTtcblxuY29uc3Qgc3VwcG9ydGVkUG9zaXRpb25zID0gWy4uLnBoeXNpY2FsU3VwcG9ydGVkUG9zaXRpb25zLCAuLi5sb2dpY2FsU3VwcG9ydGVkUG9zaXRpb25zXTtcbmxldCBuZXh0SWQgPSAwO1xuXG4vKipcbiAqIENvbnRyb2xsZXIgZm9yIG1hbmFnaW5nIG92ZXJsYXlzIHBvc2l0aW9uaW5nLiBBbHNvIGFjdHMgYXMgYSBwb2x5ZmlsbCB3aGVuIG5hdGl2ZVxuICogQ1NTIEFuY2hvciBQb3NpdGlvbmluZyBpcyBub3Qgc3VwcG9ydGVkIChlbm91Z2gpLlxuICogQXBwbGllcyB1bmlxdWUgYW5jaG9yIG5hbWVzIHdoZW4gdXNpbmcgbmF0aXZlIENTUyBBbmNob3IgUG9zaXRpb25pbmdcbiAqIG9yIGNhbGN1bGF0ZXMgYW5kIGFwcGxpZXMgY29ycmVjdCBwb3NpdGlvbnMgaW4gcG9seWZpbGwgbW9kZS5cbiAqXG4gKiBBbHNvLCB0aGUgY29udHJvbGxlciBzZXRzIHRoZSAnZGF0YS1vdmVybGF5LXBvc2l0aW9uJyBhdHRyaWJ1dGUgb24gdGhlIG92ZXJsYXkgZWxlbWVudC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc3BlY2lmaWMgc3R5bGVzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5LlxuICpcbiAqICMjIyBJbXBsZW1lbnRhdGlvblxuICogRGVmaW5lIGFuZCBhcHBseSB0aGUgZm9sbG93aW5nIENTUyB2YXJpYWJsZXMgb24gdGhlIG92ZXJsYXkgZWxlbWVudDpcbiAqIGBgYHNjc3NcbiAqICAgLS1zYmItb3ZlcmxheS1wb3NpdGlvbi1hcmVhOiBibG9jay1lbmQ7IC8vIERlZmF1bHRcbiAqICAgLS1zYmItb3ZlcmxheS1wb3NpdGlvbi10cnktZmFsbGJhY2tzOiBibG9jay1zdGFydCwgaW5saW5lLWVuZCwgaW5saW5lLXN0YXJ0OyAvLyBGYWxsYmFja3NcbiAqXG4gKiAgIHBvc2l0aW9uLWFyZWE6IHZhcigtLXNiYi1vdmVybGF5LXBvc2l0aW9uLWFyZWEpO1xuICogICBwb3NpdGlvbi10cnktZmFsbGJhY2tzOiB2YXIoLS1zYmItb3ZlcmxheS1wb3NpdGlvbi10cnktZmFsbGJhY2tzKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU2JiT3ZlcmxheVBvc2l0aW9uQ29udHJvbGxlciBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc2l6ZU9ic2VydmVyID0gIWlzU2VydmVyXG4gICAgPyBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5fcmVxdWVzdENhbGN1bGF0ZVBvc2l0aW9uKCkpXG4gICAgOiBudWxsITtcbiAgcHJpdmF0ZSByZWFkb25seSBfb3ZlcmxheTogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2Fib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfYW5jaG9yPzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX292ZXJsYXlTdHlsZXM/OiBDU1NTdHlsZURlY2xhcmF0aW9uO1xuICBwcml2YXRlIF9mcmFtZT86IFJldHVyblR5cGU8dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT47XG4gIHByaXZhdGUgX2FuY2hvck5hbWUgPSBgLS1zYmItb3ZlcmxheS1hbmNob3ItJHsrK25leHRJZH1gO1xuICBwcml2YXRlIF9wb3NpdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgX2xhc3RQb3NpdGlvbj86IHN0cmluZztcblxuICAvKiogR2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLiAoZS5nLiBibG9jay1lbmQsIGJsb2NrLXN0YXJ0LCBldGMuKSAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRQb3NpdGlvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl91c2VQb2x5ZmlsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhc3RQb3NpdGlvbiA/PyB0aGlzLl9wb3NpdGlvbnNbMF0gPz8gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX292ZXJsYXlTdHlsZXMgPz89IGdldENvbXB1dGVkU3R5bGUodGhpcy5fb3ZlcmxheSk7XG4gICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdwb3NpdGlvbi1hcmVhJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IFJlYWN0aXZlQ29udHJvbGxlckhvc3QgJiBIVE1MRWxlbWVudCxcbiAgICBvdmVybGF5PzogSFRNTEVsZW1lbnQsXG4gICAgcHJpdmF0ZSBfdXNlUG9seWZpbGwgPSAhY3NzQW5jaG9yUG9zaXRpb25TdXBwb3J0ZWQsXG4gICkge1xuICAgIGhvc3QuYWRkQ29udHJvbGxlcih0aGlzKTtcbiAgICB0aGlzLl9vdmVybGF5ID0gb3ZlcmxheSA/PyBob3N0O1xuICB9XG5cbiAgcHVibGljIGhvc3RDb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl91c2VQb2x5ZmlsbCkge1xuICAgICAgdGhpcy5fb3ZlcmxheS5zdHlsZS5zZXRQcm9wZXJ0eSgncG9zaXRpb24tYW5jaG9yJywgdGhpcy5fYW5jaG9yTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IHRoZSAncG9zaXRpb24tYXJlYScgdmFsdWUgdG8gYXZvaWQgYW55IHVud2FudGVkIHNpZGUgZWZmZWN0IHdoZW4gdXNpbmcgdGhlIHBvbHlmaWxsLlxuICAgICAgdGhpcy5fb3ZlcmxheS5zdHlsZS5zZXRQcm9wZXJ0eSgncG9zaXRpb24tYXJlYScsICdpbml0aWFsJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhvc3RVcGRhdGUoKTogdm9pZCB7XG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlYWRQb3NpdGlvbnNGcm9tQ3NzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdHMgdGhlIG92ZXJsYXkgdG8gdGhlIGdpdmVuIHRyaWdnZXIgZWxlbWVudCBhbmQgZGV0ZXJtaW5lcyB0aGUgb3B0aW1hbCBwb3NpdGlvbi5cbiAgICogVXN1YWxseSwgdGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgb3ZlcmxheSBpcyBvcGVuZWQuXG4gICAqIEBwYXJhbSBhbmNob3IgVGhlIGFuY2hvciBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGNvbm5lY3QoYW5jaG9yOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9hbmNob3IpIHtcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICB0aGlzLl9hbmNob3IgPSBhbmNob3I7XG5cbiAgICBpZiAoIXRoaXMuX3VzZVBvbHlmaWxsKSB7XG4gICAgICB0aGlzLl9hbmNob3Iuc3R5bGUuc2V0UHJvcGVydHkoJ2FuY2hvci1uYW1lJywgdGhpcy5fYW5jaG9yTmFtZSEpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlYWRQb3NpdGlvbnNGcm9tQ3NzKCk7XG4gICAgdGhpcy5fY2FsY3VsYXRlUG9zaXRpb24oKTtcbiAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgLy8gV2UgbmVlZCB0byB1c2UgY2FwdHVyZSBoZXJlIHRvIHJlYWN0IHRvIGFsbCBzY3JvbGwgZXZlbnRzLlxuICAgIC8vIElmIGNhcHR1cmUgd2FzIG5vdCB1c2VkLCB0aGVuIHNjcm9sbCBldmVudHMgaW5zaWRlIHNlcGFyYXRlIHNjcm9sbFxuICAgIC8vIGNvbnRhaW5lcnMgd291bGQgbm90IGJlIGNhdWdodC5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB0aGlzLl9yZXF1ZXN0Q2FsY3VsYXRlUG9zaXRpb24oKSwge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX2Fib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX3JlcXVlc3RDYWxjdWxhdGVQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9hYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoYW5jaG9yLCB7IGJveDogJ2JvcmRlci1ib3gnIH0pO1xuICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5fb3ZlcmxheSwgeyBib3g6ICdib3JkZXItYm94JyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuX2FuY2hvcj8uc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2FuY2hvci1uYW1lJyk7XG4gICAgdGhpcy5fYW5jaG9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0Q2FsY3VsYXRlUG9zaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fZnJhbWUgPz89IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jYWxjdWxhdGVQb3NpdGlvbigpO1xuICAgICAgdGhpcy5fZnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jYWxjdWxhdGVQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FuY2hvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl91c2VQb2x5ZmlsbCkge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9nZXRPcHRpbWFsUG9zaXRpb24odGhpcy5fcG9zaXRpb25zKTtcbiAgICAgIHRoaXMuX2FwcGx5T3ZlcmxheVBvc2l0aW9uKHBvc2l0aW9uLnBvc2l0aW9uLCBwb3NpdGlvbi5sZWZ0LCBwb3NpdGlvbi50b3ApO1xuICAgIH1cbiAgICB0aGlzLl9vdmVybGF5LnNldEF0dHJpYnV0ZSgnZGF0YS1wb3NpdGlvbicsIHRoaXMuY3VycmVudFBvc2l0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBvcHRpbWFsIHBvc2l0aW9uIHRoYXQgZml0cyB0aGUgb3ZlcmxheS5cbiAgICogQHBhcmFtIHBvc2l0aW9ucyBUaGUgbGlzdCBvZiBwb3NpdGlvbnMgdG8gY2hlY2suXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9nZXRPcHRpbWFsUG9zaXRpb24ocG9zaXRpb25zOiBzdHJpbmdbXSk6IHtcbiAgICBsZWZ0OiBudW1iZXI7XG4gICAgdG9wOiBudW1iZXI7XG4gICAgcG9zaXRpb246IHN0cmluZztcbiAgICBmaXRzPzogYm9vbGVhbjtcbiAgfSB7XG4gICAgY29uc3QgeyBvZmZzZXRIZWlnaHQ6IG92ZXJsYXlIZWlnaHQsIG9mZnNldFdpZHRoOiBvdmVybGF5V2lkdGggfSA9IHRoaXMuX292ZXJsYXk7XG4gICAgY29uc3QgeyBpbm5lckhlaWdodDogdmlld3BvcnRIZWlnaHQsIGlubmVyV2lkdGg6IHZpZXdwb3J0V2lkdGggfSA9IHdpbmRvdztcbiAgICBjb25zdCB7XG4gICAgICB0b3A6IHRyaWdnZXJPZmZzZXRUb3AsXG4gICAgICBsZWZ0OiB0cmlnZ2VyT2Zmc2V0TGVmdCxcbiAgICAgIGhlaWdodDogdHJpZ2dlckhlaWdodCxcbiAgICAgIHdpZHRoOiB0cmlnZ2VyV2lkdGgsXG4gICAgfSA9IHRoaXMuX2FuY2hvciEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBpc1J0bCA9IHRoaXMuX292ZXJsYXkubWF0Y2hlcygnOmRpcihydGwpJyk7XG4gICAgY29uc3QgdG9wU3BhY2UgPSB0cmlnZ2VyT2Zmc2V0VG9wO1xuICAgIGNvbnN0IGJvdHRvbVNwYWNlID0gdmlld3BvcnRIZWlnaHQgLSB0cmlnZ2VySGVpZ2h0IC0gdHJpZ2dlck9mZnNldFRvcDtcbiAgICBjb25zdCBsZWZ0U3BhY2UgPSB0cmlnZ2VyT2Zmc2V0TGVmdDtcbiAgICBjb25zdCByaWdodFNwYWNlID0gdmlld3BvcnRXaWR0aCAtIHRyaWdnZXJXaWR0aCAtIHRyaWdnZXJPZmZzZXRMZWZ0O1xuXG4gICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgb3ZlcmxheSBhbmQgdGhlIHRyaWdnZXIgd2lkdGgvaGVpZ2h0LlxuICAgIGNvbnN0IG92ZXJsYXlXaWR0aE5ldCA9IG92ZXJsYXlXaWR0aCAtIHRyaWdnZXJXaWR0aDtcbiAgICBjb25zdCBvdmVybGF5SGVpZ2h0TmV0ID0gb3ZlcmxheUhlaWdodCAtIHRyaWdnZXJIZWlnaHQ7XG5cbiAgICAvLyBUaGUgYW1vdW50IHRoYXQgd291bGQgZXhjZWVkIHRoZSB0cmlnZ2VyIGlmIHRoZSBvdmVybGF5IHdlcmUgY2VudGVyZWQgb24gaXQuXG4gICAgY29uc3Qgb3ZlcmxheVdpZHRoT3ZlcmxhcCA9IG92ZXJsYXlXaWR0aE5ldCAvIDI7XG4gICAgY29uc3Qgb3ZlcmxheUhlaWdodE92ZXJsYXAgPSBvdmVybGF5SGVpZ2h0TmV0IC8gMjtcblxuICAgIHRoaXMuX292ZXJsYXkuc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAnLS1zYmItb3ZlcmxheS1jb250cm9sbGVyLXRyaWdnZXItaGVpZ2h0JyxcbiAgICAgIGAke3RyaWdnZXJIZWlnaHR9cHhgLFxuICAgICk7XG4gICAgdGhpcy5fb3ZlcmxheS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zYmItb3ZlcmxheS1jb250cm9sbGVyLXRyaWdnZXItd2lkdGgnLCBgJHt0cmlnZ2VyV2lkdGh9cHhgKTtcblxuICAgIGxldCByZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuX2dldE9wdGltYWxQb3NpdGlvbj4gPSB7IGxlZnQ6IDAsIHRvcDogMCwgcG9zaXRpb246ICcnIH07XG4gICAgbGV0IGZpcnN0UG9zaXRpb246IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuX2dldE9wdGltYWxQb3NpdGlvbj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBwb3NpdGlvbiBvZiBwb3NpdGlvbnMpIHtcbiAgICAgIC8vIElmIHJ0bCBpcyBlbmFibGVkLCB3ZSBtYXAgdGhlIGxvZ2ljYWwgcG9zaXRpb24gdG8gdGhlaXIgUlRMIGVxdWl2YWxlbnQuIChlLmcuICdpbmxpbmUtc3RhcnQnIC0+ICdpbmxpbmUtZW5kJylcbiAgICAgIGNvbnN0IHBoeXNpY2FsUG9zaXRpb24gPVxuICAgICAgICBpc1J0bCAmJiBsb2dpY2FsU3VwcG9ydGVkUG9zaXRpb25zLmluY2x1ZGVzKHBvc2l0aW9uKVxuICAgICAgICAgID8gcnRsUG9zaXRpb25NYXBwaW5nW3Bvc2l0aW9uXVxuICAgICAgICAgIDogcG9zaXRpb247XG5cbiAgICAgIHN3aXRjaCAocGh5c2ljYWxQb3NpdGlvbikge1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICBjYXNlICdibG9jay1lbmQnOlxuICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgbGVmdDogdHJpZ2dlck9mZnNldExlZnQgLSBvdmVybGF5V2lkdGhPdmVybGFwLFxuICAgICAgICAgICAgdG9wOiB0cmlnZ2VyT2Zmc2V0VG9wICsgdHJpZ2dlckhlaWdodCxcbiAgICAgICAgICAgIGZpdHM6XG4gICAgICAgICAgICAgIG92ZXJsYXlIZWlnaHQgPD0gYm90dG9tU3BhY2UgJiZcbiAgICAgICAgICAgICAgb3ZlcmxheVdpZHRoT3ZlcmxhcCA8PSBsZWZ0U3BhY2UgJiZcbiAgICAgICAgICAgICAgb3ZlcmxheVdpZHRoT3ZlcmxhcCA8PSByaWdodFNwYWNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXN0YXJ0JzpcbiAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIGxlZnQ6IHRyaWdnZXJPZmZzZXRMZWZ0IC0gb3ZlcmxheVdpZHRoT3ZlcmxhcCxcbiAgICAgICAgICAgIHRvcDogdHJpZ2dlck9mZnNldFRvcCAtIG92ZXJsYXlIZWlnaHQsXG4gICAgICAgICAgICBmaXRzOlxuICAgICAgICAgICAgICBvdmVybGF5SGVpZ2h0IDw9IHRvcFNwYWNlICYmXG4gICAgICAgICAgICAgIG92ZXJsYXlXaWR0aE92ZXJsYXAgPD0gbGVmdFNwYWNlICYmXG4gICAgICAgICAgICAgIG92ZXJsYXlXaWR0aE92ZXJsYXAgPD0gcmlnaHRTcGFjZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIGNhc2UgJ2lubGluZS1lbmQnOlxuICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgbGVmdDogdHJpZ2dlck9mZnNldExlZnQgKyB0cmlnZ2VyV2lkdGgsXG4gICAgICAgICAgICB0b3A6IHRyaWdnZXJPZmZzZXRUb3AgLSBvdmVybGF5SGVpZ2h0T3ZlcmxhcCxcbiAgICAgICAgICAgIGZpdHM6XG4gICAgICAgICAgICAgIG92ZXJsYXlXaWR0aCA8PSByaWdodFNwYWNlICYmXG4gICAgICAgICAgICAgIG92ZXJsYXlIZWlnaHRPdmVybGFwIDw9IHRvcFNwYWNlICYmXG4gICAgICAgICAgICAgIG92ZXJsYXlIZWlnaHRPdmVybGFwIDw9IGJvdHRvbVNwYWNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICBjYXNlICdpbmxpbmUtc3RhcnQnOlxuICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgbGVmdDogdHJpZ2dlck9mZnNldExlZnQgLSBvdmVybGF5V2lkdGgsXG4gICAgICAgICAgICB0b3A6IHRyaWdnZXJPZmZzZXRUb3AgLSBvdmVybGF5SGVpZ2h0T3ZlcmxhcCxcbiAgICAgICAgICAgIGZpdHM6XG4gICAgICAgICAgICAgIG92ZXJsYXlXaWR0aCA8PSBsZWZ0U3BhY2UgJiZcbiAgICAgICAgICAgICAgb3ZlcmxheUhlaWdodE92ZXJsYXAgPD0gdG9wU3BhY2UgJiZcbiAgICAgICAgICAgICAgb3ZlcmxheUhlaWdodE92ZXJsYXAgPD0gYm90dG9tU3BhY2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wIHNwYW4tbGVmdCc6XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXN0YXJ0IHNwYW4taW5saW5lLXN0YXJ0JzpcbiAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIGxlZnQ6IHRyaWdnZXJPZmZzZXRMZWZ0IC0gb3ZlcmxheVdpZHRoTmV0LFxuICAgICAgICAgICAgdG9wOiB0cmlnZ2VyT2Zmc2V0VG9wIC0gb3ZlcmxheUhlaWdodCxcbiAgICAgICAgICAgIGZpdHM6IG92ZXJsYXlIZWlnaHQgPD0gdG9wU3BhY2UgJiYgb3ZlcmxheVdpZHRoTmV0IDw9IGxlZnRTcGFjZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3Agc3Bhbi1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXN0YXJ0IHNwYW4taW5saW5lLWVuZCc6XG4gICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICBsZWZ0OiB0cmlnZ2VyT2Zmc2V0TGVmdCxcbiAgICAgICAgICAgIHRvcDogdHJpZ2dlck9mZnNldFRvcCAtIG92ZXJsYXlIZWlnaHQsXG4gICAgICAgICAgICBmaXRzOiBvdmVybGF5SGVpZ2h0IDw9IHRvcFNwYWNlICYmIG92ZXJsYXlXaWR0aE5ldCA8PSByaWdodFNwYWNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSBzcGFuLWxlZnQnOlxuICAgICAgICBjYXNlICdibG9jay1lbmQgc3Bhbi1pbmxpbmUtc3RhcnQnOlxuICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgbGVmdDogdHJpZ2dlck9mZnNldExlZnQgLSBvdmVybGF5V2lkdGhOZXQsXG4gICAgICAgICAgICB0b3A6IHRyaWdnZXJPZmZzZXRUb3AgKyB0cmlnZ2VySGVpZ2h0LFxuICAgICAgICAgICAgZml0czogb3ZlcmxheUhlaWdodCA8PSBib3R0b21TcGFjZSAmJiBvdmVybGF5V2lkdGhOZXQgPD0gbGVmdFNwYWNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSBzcGFuLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYmxvY2stZW5kIHNwYW4taW5saW5lLWVuZCc6XG4gICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICBsZWZ0OiB0cmlnZ2VyT2Zmc2V0TGVmdCxcbiAgICAgICAgICAgIHRvcDogdHJpZ2dlck9mZnNldFRvcCArIHRyaWdnZXJIZWlnaHQsXG4gICAgICAgICAgICBmaXRzOiBvdmVybGF5SGVpZ2h0IDw9IGJvdHRvbVNwYWNlICYmIG92ZXJsYXlXaWR0aE5ldCA8PSByaWdodFNwYWNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQgc3Bhbi10b3AnOlxuICAgICAgICBjYXNlICdpbmxpbmUtc3RhcnQgc3Bhbi1ibG9jay1zdGFydCc6XG4gICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICBsZWZ0OiB0cmlnZ2VyT2Zmc2V0TGVmdCAtIG92ZXJsYXlXaWR0aCxcbiAgICAgICAgICAgIHRvcDogdHJpZ2dlck9mZnNldFRvcCArIHRyaWdnZXJIZWlnaHQgLSBvdmVybGF5SGVpZ2h0LFxuICAgICAgICAgICAgZml0czogb3ZlcmxheVdpZHRoIDw9IGxlZnRTcGFjZSAmJiBvdmVybGF5SGVpZ2h0TmV0IDw9IHRvcFNwYWNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQgc3Bhbi1ib3R0b20nOlxuICAgICAgICBjYXNlICdpbmxpbmUtc3RhcnQgc3Bhbi1ibG9jay1lbmQnOlxuICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgbGVmdDogdHJpZ2dlck9mZnNldExlZnQgLSBvdmVybGF5V2lkdGgsXG4gICAgICAgICAgICB0b3A6IHRyaWdnZXJPZmZzZXRUb3AsXG4gICAgICAgICAgICBmaXRzOiBvdmVybGF5V2lkdGggPD0gbGVmdFNwYWNlICYmIG92ZXJsYXlIZWlnaHROZXQgPD0gYm90dG9tU3BhY2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQgc3Bhbi10b3AnOlxuICAgICAgICBjYXNlICdpbmxpbmUtZW5kIHNwYW4tYmxvY2stc3RhcnQnOlxuICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgbGVmdDogdHJpZ2dlck9mZnNldExlZnQgKyB0cmlnZ2VyV2lkdGgsXG4gICAgICAgICAgICB0b3A6IHRyaWdnZXJPZmZzZXRUb3AgKyB0cmlnZ2VySGVpZ2h0IC0gb3ZlcmxheUhlaWdodCxcbiAgICAgICAgICAgIGZpdHM6IG92ZXJsYXlXaWR0aCA8PSByaWdodFNwYWNlICYmIG92ZXJsYXlIZWlnaHROZXQgPD0gdG9wU3BhY2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQgc3Bhbi1ib3R0b20nOlxuICAgICAgICBjYXNlICdpbmxpbmUtZW5kIHNwYW4tYmxvY2stZW5kJzpcbiAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIGxlZnQ6IHRyaWdnZXJPZmZzZXRMZWZ0ICsgdHJpZ2dlcldpZHRoLFxuICAgICAgICAgICAgdG9wOiB0cmlnZ2VyT2Zmc2V0VG9wLFxuICAgICAgICAgICAgZml0czogb3ZlcmxheVdpZHRoIDw9IHJpZ2h0U3BhY2UgJiYgb3ZlcmxheUhlaWdodE5ldCA8PSBib3R0b21TcGFjZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdC5maXRzKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBmaXJzdFBvc2l0aW9uID8/PSByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gcG9zaXRpb24gZml0cywgd2UgcmV0dXJuIHRoZSBmaXJzdCBvbmUuXG4gICAgcmV0dXJuIGZpcnN0UG9zaXRpb24hO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlPdmVybGF5UG9zaXRpb24ocG9zaXRpb246IHN0cmluZywgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2xhc3RQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIHRoaXMuX292ZXJsYXkuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICAgIHRoaXMuX292ZXJsYXkuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IHVzZWQgaW4gcG9seWZpbGwgbW9kZS5cbiAgICogUmVhZHMgdGhlIGxpc3Qgb2YgdGhlIGNvbmZpZ3VyZWQgcG9zaXRpb25zIGZyb20gdGhlIENTUyB2YXJpYWJsZXMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9yZWFkUG9zaXRpb25zRnJvbUNzcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3VzZVBvbHlmaWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX292ZXJsYXlTdHlsZXMgPz89IGdldENvbXB1dGVkU3R5bGUodGhpcy5fb3ZlcmxheSk7XG4gICAgY29uc3QgcG9zaXRpb25zID0gW1xuICAgICAgdGhpcy5fb3ZlcmxheVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCctLXNiYi1vdmVybGF5LXBvc2l0aW9uLWFyZWEnKSB8fCAnYmxvY2stZW5kJyxcbiAgICAgIC4uLnRoaXMuX292ZXJsYXlTdHlsZXNcbiAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoJy0tc2JiLW92ZXJsYXktcG9zaXRpb24tdHJ5LWZhbGxiYWNrcycpXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoKGYpID0+IGYudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKChmKSA9PiAhIWYpLFxuICAgIF07XG5cbiAgICBpZiAoaW1wb3J0Lm1ldGEuZW52LkRFViAmJiBwb3NpdGlvbnMuc29tZSgocCkgPT4gIXN1cHBvcnRlZFBvc2l0aW9ucy5pbmNsdWRlcyhwKSkpIHtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkUG9zaXRpb25zID0gcG9zaXRpb25zXG4gICAgICAgIC5maWx0ZXIoKHApID0+ICFzdXBwb3J0ZWRQb3NpdGlvbnMuaW5jbHVkZXMocCkpXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbnN1cHBvcnRlZCBwb3NpdGlvbi10cnktZmFsbGJhY2tzICR7dW5zdXBwb3J0ZWRQb3NpdGlvbnN9IChTdXBwb3J0ZWQ6ICR7c3VwcG9ydGVkUG9zaXRpb25zLmpvaW4oJywgJyl9KWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX3Bvc2l0aW9ucyA9IHBvc2l0aW9ucztcbiAgICBpZiAodGhpcy5fbGFzdFBvc2l0aW9uICYmICF0aGlzLl9wb3NpdGlvbnMuaW5jbHVkZXModGhpcy5fbGFzdFBvc2l0aW9uKSkge1xuICAgICAgdGhpcy5fbGFzdFBvc2l0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxNQUFNLDZCQUE2QixDQUFDLFlBQVksSUFBSSxTQUFTLGVBQWUsUUFBUTtBQUVwRixNQUFNLDZCQUE2QjtBQUFBLEVBQ2pDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7O0FBSUYsTUFBTSw0QkFBNEI7QUFBQSxFQUNoQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBOztBQUdGLE1BQU0scUJBQWdEO0FBQUEsRUFDcEQsZUFBZTtBQUFBLEVBQ2YsYUFBYTtBQUFBLEVBQ2IsZ0JBQWdCO0FBQUEsRUFDaEIsY0FBYztBQUFBLEVBQ2QsaUNBQWlDO0FBQUEsRUFDakMsK0JBQStCO0FBQUEsRUFDL0IsK0JBQStCO0FBQUEsRUFDL0IsNkJBQTZCO0FBQUEsRUFDN0IsaUNBQWlDO0FBQUEsRUFDakMsK0JBQStCO0FBQUEsRUFDL0IsK0JBQStCO0FBQUEsRUFDL0IsNkJBQTZCOztBQUcvQixNQUFNLHFCQUFxQixDQUFDLEdBQUcsNEJBQTRCLEdBQUcseUJBQXlCO0FBQ3ZGLElBQUksU0FBUztNQXFCQSw2QkFBNEI7QUFBQTtBQUFBLEVBY3ZDLElBQVcsa0JBQWU7QUFDeEIsUUFBSSxLQUFLLGNBQWM7QUFDckIsYUFBTyxLQUFLLGlCQUFpQixLQUFLLFdBQVcsQ0FBQyxLQUFLO0FBQUEsSUFDckQsT0FBTztBQUNMLFdBQUssbUJBQW1CLGlCQUFpQixLQUFLLFFBQVE7QUFDdEQsYUFBTyxLQUFL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
|
|
@@ -7,4 +7,5 @@ export * from './controllers/inert-controller.js';
|
|
|
7
7
|
export * from './controllers/language-controller.js';
|
|
8
8
|
export * from './controllers/media-matchers-controller.js';
|
|
9
9
|
export * from './controllers/slot-state-controller.js';
|
|
10
|
+
export * from './controllers/overlay-position-controller.js';
|
|
10
11
|
//# sourceMappingURL=controllers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controllers.d.ts","sourceRoot":"","sources":["../../../../src/elements/core/controllers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,+CAA+C,CAAC;AAC9D,cAAc,0CAA0C,CAAC;AACzD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC"}
|
|
1
|
+
{"version":3,"file":"controllers.d.ts","sourceRoot":"","sources":["../../../../src/elements/core/controllers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,+CAA+C,CAAC;AAC9D,cAAc,0CAA0C,CAAC;AACzD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC"}
|
|
@@ -4,6 +4,7 @@ import { SbbInertController } from "./controllers/inert-controller.js";
|
|
|
4
4
|
import { SbbLanguageController } from "./controllers/language-controller.js";
|
|
5
5
|
import { SbbDarkModeController, SbbMediaMatcherController, SbbMediaQueryBreakpointMediumAndAbove, SbbMediaQueryBreakpointMediumAndBelow, SbbMediaQueryBreakpointSmallAndBelow, SbbMediaQueryDarkMode, SbbMediaQueryForcedColors, SbbMediaQueryHover, SbbMediaQueryPointerCoarse } from "./controllers/media-matchers-controller.js";
|
|
6
6
|
import { SbbSlotStateController } from "./controllers/slot-state-controller.js";
|
|
7
|
+
import { SbbOverlayPositionController } from "./controllers/overlay-position-controller.js";
|
|
7
8
|
export {
|
|
8
9
|
SbbDarkModeController,
|
|
9
10
|
SbbEscapableOverlayController,
|
|
@@ -18,6 +19,7 @@ export {
|
|
|
18
19
|
SbbMediaQueryForcedColors,
|
|
19
20
|
SbbMediaQueryHover,
|
|
20
21
|
SbbMediaQueryPointerCoarse,
|
|
22
|
+
SbbOverlayPositionController,
|
|
21
23
|
SbbSlotStateController
|
|
22
24
|
};
|
|
23
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlcnMuanMiLCJzb3VyY2VzIjpbXSwic291cmNlc0NvbnRlbnQiOltdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OyJ9
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CSSResultGroup, TemplateResult, LitElement } from 'lit';
|
|
2
|
+
import { SbbOrientation } from '../../core/interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* It displays a minimal calendar, together with the `sbb-mini-calendar-month` and `sbb-mini-calendar-day`.
|
|
5
|
+
*
|
|
6
|
+
* @slot - Use the unnamed slot to add `sbb-mini-calendar-month` elements.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SbbMiniCalendarElement<T = Date> extends LitElement {
|
|
9
|
+
static styles: CSSResultGroup;
|
|
10
|
+
/** The orientation of days in the calendar. */
|
|
11
|
+
accessor orientation: SbbOrientation;
|
|
12
|
+
private _keydownAbortController;
|
|
13
|
+
private _dateAdapter;
|
|
14
|
+
constructor();
|
|
15
|
+
private _getMiniCalendarMonths;
|
|
16
|
+
private _getMiniCalendarDays;
|
|
17
|
+
private _setMonthsShowYear;
|
|
18
|
+
private _handleKeydownCalendarDay;
|
|
19
|
+
private _navigateByKeyboardDayView;
|
|
20
|
+
private _findDayArrowKeys;
|
|
21
|
+
private _findDaySpecialKeys;
|
|
22
|
+
private _handleSlotchange;
|
|
23
|
+
private _setupKeydownListener;
|
|
24
|
+
/** @internal */
|
|
25
|
+
focus(): void;
|
|
26
|
+
connectedCallback(): void;
|
|
27
|
+
disconnectedCallback(): void;
|
|
28
|
+
protected render(): TemplateResult;
|
|
29
|
+
}
|
|
30
|
+
declare global {
|
|
31
|
+
interface HTMLElementTagNameMap {
|
|
32
|
+
'sbb-mini-calendar': SbbMiniCalendarElement;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=mini-calendar.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mini-calendar.component.d.ts","sourceRoot":"","sources":["../../../../../src/elements/mini-calendar/mini-calendar/mini-calendar.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAC1D,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAOvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM/D;;;;GAIG;AACH,qBAEM,sBAAsB,CAAC,CAAC,GAAG,IAAI,CAAE,SAAQ,UAAU;IACvD,OAAuB,MAAM,EAAE,cAAc,CAAS;IAEtD,+CAA+C;IAC/C,SACgB,WAAW,EAAE,cAAc,CAAgB;IAE3D,OAAO,CAAC,uBAAuB,CAAgC;IAC/D,OAAO,CAAC,YAAY,CAA4E;;IAahG,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,yBAAyB;IAgBjC,OAAO,CAAC,0BAA0B;IAwDlC,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,qBAAqB;IAa7B,gBAAgB;IACA,KAAK,IAAI,IAAI;IAMb,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;cAKzB,MAAM,IAAI,cAAc;CAO5C;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAE7B,mBAAmB,EAAE,sBAAsB,CAAC;KAC7C;CACF"}
|