@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.
Files changed (107) hide show
  1. package/calendar/calendar.component.d.ts +2 -1
  2. package/calendar/calendar.component.d.ts.map +1 -1
  3. package/core/controllers/escapable-overlay-controller.d.ts +3 -0
  4. package/core/controllers/escapable-overlay-controller.d.ts.map +1 -1
  5. package/core/controllers/overlay-position-controller.d.ts +60 -0
  6. package/core/controllers/overlay-position-controller.d.ts.map +1 -0
  7. package/core/controllers/overlay-position-controller.js +224 -0
  8. package/core/controllers.d.ts +1 -0
  9. package/core/controllers.d.ts.map +1 -1
  10. package/core/controllers.js +12 -10
  11. package/core/styles/core.scss +27 -2
  12. package/core.css +21 -2
  13. package/custom-elements.json +1996 -544
  14. package/development/calendar/calendar.component.d.ts +2 -1
  15. package/development/calendar/calendar.component.d.ts.map +1 -1
  16. package/development/calendar/calendar.component.js +1 -1
  17. package/development/core/controllers/escapable-overlay-controller.d.ts +3 -0
  18. package/development/core/controllers/escapable-overlay-controller.d.ts.map +1 -1
  19. package/development/core/controllers/escapable-overlay-controller.js +1 -1
  20. package/development/core/controllers/overlay-position-controller.d.ts +60 -0
  21. package/development/core/controllers/overlay-position-controller.d.ts.map +1 -0
  22. package/development/core/controllers/overlay-position-controller.js +306 -0
  23. package/development/core/controllers.d.ts +1 -0
  24. package/development/core/controllers.d.ts.map +1 -1
  25. package/development/core/controllers.js +3 -1
  26. package/development/mini-calendar/mini-calendar/mini-calendar.component.d.ts +35 -0
  27. package/development/mini-calendar/mini-calendar/mini-calendar.component.d.ts.map +1 -0
  28. package/development/mini-calendar/mini-calendar/mini-calendar.component.js +201 -0
  29. package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts +23 -0
  30. package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts.map +1 -0
  31. package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +181 -0
  32. package/development/mini-calendar/mini-calendar-day.d.ts +5 -0
  33. package/development/mini-calendar/mini-calendar-day.d.ts.map +1 -0
  34. package/development/mini-calendar/mini-calendar-day.js +5 -0
  35. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts +25 -0
  36. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts.map +1 -0
  37. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +123 -0
  38. package/development/mini-calendar/mini-calendar-month.d.ts +5 -0
  39. package/development/mini-calendar/mini-calendar-month.d.ts.map +1 -0
  40. package/development/mini-calendar/mini-calendar-month.js +5 -0
  41. package/development/mini-calendar/mini-calendar.d.ts +5 -0
  42. package/development/mini-calendar/mini-calendar.d.ts.map +1 -0
  43. package/development/mini-calendar/mini-calendar.js +5 -0
  44. package/development/mini-calendar.d.ts +7 -0
  45. package/development/mini-calendar.d.ts.map +1 -0
  46. package/development/mini-calendar.js +9 -0
  47. package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts +4 -1
  48. package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts.map +1 -1
  49. package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.js +5 -1
  50. package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts +4 -1
  51. package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts.map +1 -1
  52. package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.js +5 -1
  53. package/development/tabs/tab/tab.component.d.ts +9 -0
  54. package/development/tabs/tab/tab.component.d.ts.map +1 -1
  55. package/development/tabs/tab/tab.component.js +48 -7
  56. package/development/tabs/tab-group/tab-group.component.d.ts +7 -3
  57. package/development/tabs/tab-group/tab-group.component.d.ts.map +1 -1
  58. package/development/tabs/tab-group/tab-group.component.js +19 -39
  59. package/development/tabs/tab-label/tab-label.component.d.ts.map +1 -1
  60. package/development/tabs/tab-label/tab-label.component.js +4 -3
  61. package/development/tooltip/tooltip.component.d.ts +11 -4
  62. package/development/tooltip/tooltip.component.d.ts.map +1 -1
  63. package/development/tooltip/tooltip.component.js +57 -78
  64. package/index.d.ts +6 -0
  65. package/index.js +6 -0
  66. package/mini-calendar/mini-calendar/mini-calendar.component.d.ts +35 -0
  67. package/mini-calendar/mini-calendar/mini-calendar.component.d.ts.map +1 -0
  68. package/mini-calendar/mini-calendar/mini-calendar.component.js +133 -0
  69. package/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts +23 -0
  70. package/mini-calendar/mini-calendar-day/mini-calendar-day.component.d.ts.map +1 -0
  71. package/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +66 -0
  72. package/mini-calendar/mini-calendar-day.d.ts +5 -0
  73. package/mini-calendar/mini-calendar-day.d.ts.map +1 -0
  74. package/mini-calendar/mini-calendar-day.js +4 -0
  75. package/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts +25 -0
  76. package/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts.map +1 -0
  77. package/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +59 -0
  78. package/mini-calendar/mini-calendar-month.d.ts +5 -0
  79. package/mini-calendar/mini-calendar-month.d.ts.map +1 -0
  80. package/mini-calendar/mini-calendar-month.js +4 -0
  81. package/mini-calendar/mini-calendar.d.ts +5 -0
  82. package/mini-calendar/mini-calendar.d.ts.map +1 -0
  83. package/mini-calendar/mini-calendar.js +4 -0
  84. package/mini-calendar.d.ts +7 -0
  85. package/mini-calendar.d.ts.map +1 -0
  86. package/mini-calendar.js +8 -0
  87. package/off-brand-theme.css +21 -2
  88. package/package.json +21 -1
  89. package/safety-theme.css +21 -2
  90. package/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts +4 -1
  91. package/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts.map +1 -1
  92. package/sidebar/icon-sidebar-button/icon-sidebar-button.component.js +9 -6
  93. package/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts +4 -1
  94. package/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts.map +1 -1
  95. package/sidebar/icon-sidebar-link/icon-sidebar-link.component.js +13 -10
  96. package/standard-theme.css +21 -2
  97. package/tabs/tab/tab.component.d.ts +9 -0
  98. package/tabs/tab/tab.component.d.ts.map +1 -1
  99. package/tabs/tab/tab.component.js +37 -18
  100. package/tabs/tab-group/tab-group.component.d.ts +7 -3
  101. package/tabs/tab-group/tab-group.component.d.ts.map +1 -1
  102. package/tabs/tab-group/tab-group.component.js +51 -52
  103. package/tabs/tab-label/tab-label.component.d.ts.map +1 -1
  104. package/tabs/tab-label/tab-label.component.js +12 -12
  105. package/tooltip/tooltip.component.d.ts +11 -4
  106. package/tooltip/tooltip.component.d.ts.map +1 -1
  107. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNjYXBhYmxlLW92ZXJsYXktY29udHJvbGxlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2NvcmUvY29udHJvbGxlcnMvZXNjYXBhYmxlLW92ZXJsYXktY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1NlcnZlciwgdHlwZSBSZWFjdGl2ZUNvbnRyb2xsZXIsIHR5cGUgUmVhY3RpdmVDb250cm9sbGVySG9zdCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB0eXBlIHsgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9iYXNlLWVsZW1lbnRzL29wZW4tY2xvc2UtYmFzZS1lbGVtZW50LmpzJztcblxuY29uc3Qgb3ZlcmxheVN0YWNrID0gbmV3IEFycmF5PFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50PigpO1xuXG5pZiAoIWlzU2VydmVyKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBvdmVybGF5U3RhY2suYXQoLTEpPy5lc2NhcGVTdHJhdGVneSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlciBpbXBsZW1lbnRzIFJlYWN0aXZlQ29udHJvbGxlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9ob3N0OiBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0ICYgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQsXG4gICAgcHJpdmF0ZSBfb3ZlcmxheVN0YWNrOiBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudFtdID0gb3ZlcmxheVN0YWNrLFxuICApIHtcbiAgICB0aGlzLl9ob3N0LmFkZENvbnRyb2xsZXI/Lih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBob3N0RGlzY29ubmVjdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBvdmVybGF5IGlzIG9wZW5lZFxuICBwdWJsaWMgY29ubmVjdCgpOiB2b2lkIHtcbiAgICAvLyBEdWUgdG8gY29ubmVjdCgpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIGhvc3QsXG4gICAgLy8gd2UgaGF2ZSB0byByZW1vdmUgYSBwb3RlbnRpYWwgZW50cnkgb2YgdGhlIGhvc3QgZnJvbSB0aGUgc3RhY2suXG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5fb3ZlcmxheVN0YWNrLnB1c2godGhpcy5faG9zdCk7XG4gIH1cblxuICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIG92ZXJsYXkgaXMgY2xvc2VkXG4gIHB1YmxpYyBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9vdmVybGF5U3RhY2subGVuZ3RoKSB7XG4gICAgICBjb25zdCBmaW5kRWxJbmRleCA9IHRoaXMuX292ZXJsYXlTdGFjay5maW5kSW5kZXgoKGUpID0+IGUgPT09IHRoaXMuX2hvc3QpO1xuICAgICAgaWYgKGZpbmRFbEluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLl9vdmVybGF5U3RhY2suc3BsaWNlKGZpbmRFbEluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBSUEsTUFBTSxlQUFlLElBQUksTUFBQTtBQUV6QixJQUFJLENBQUMsVUFBVTtBQUNiLFNBQU8saUJBQWlCLFdBQVcsQ0FBQyxVQUF3QjtBQUMxRCxRQUFJLE1BQU0sUUFBUSxZQUFZLENBQUMsTUFBTSxrQkFBa0I7QUFDckQsWUFBTSxlQUFBO0FBQ04sbUJBQWEsR0FBRyxFQUFFLEdBQUcsZUFBQTtBQUFBLElBQ3ZCO0FBQUEsRUFDRixDQUFDO0FBQ0g7TUFFYSw4QkFBNkI7QUFBQSxFQUN4QyxZQUNVLE9BQ0EsZ0JBQTJDLGNBQVk7QUFEdkQsU0FBQSxRQUFBO0FBQ0EsU0FBQSxnQkFBQTtBQUVSLFNBQUssTUFBTSxnQkFBZ0IsSUFBSTtBQUFBLEVBQ2pDO0FBQUEsRUFFTyxtQkFBZ0I7QUFDckIsU0FBSyxXQUFBO0FBQUEsRUFDUDtBQUFBO0FBQUEsRUFHTyxVQUFPO0FBR1osU0FBSyxXQUFBO0FBQ0wsU0FBSyxjQUFjLEtBQUssS0FBSyxLQUFLO0FBQUEsRUFDcEM7QUFBQTtBQUFBLEVBR08sYUFBVTtBQUNmLFFBQUksS0FBSyxjQUFjLFFBQVE7QUFDN0IsWUFBTSxjQUFjLEtBQUssY0FBYyxVQUFVLENBQUMsTUFBTSxNQUFNLEtBQUssS0FBSztBQUN4RSxVQUFJLGdCQUFnQixJQUFJO0FBQ3RCLGFBQUssY0FBYyxPQUFPLGFBQWEsQ0FBQztBQUFBLE1BQzFDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRDsifQ==
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlcnMuanMiLCJzb3VyY2VzIjpbXSwic291cmNlc0NvbnRlbnQiOltdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7In0=
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"}