@ng-matero/extensions 11.3.4 → 11.5.1

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 (99) hide show
  1. package/alert/_alert-theme.scss +5 -9
  2. package/alert/alert.component.d.ts +6 -4
  3. package/alert/alert.component.scss +2 -1
  4. package/alert/mtxAlert.metadata.json +1 -1
  5. package/bundles/mtxAlert.umd.js +22 -12
  6. package/bundles/mtxAlert.umd.js.map +1 -1
  7. package/bundles/mtxAlert.umd.min.js +1 -1
  8. package/bundles/mtxAlert.umd.min.js.map +1 -1
  9. package/bundles/{ng-matero-extensions-button.umd.js → mtxButton.umd.js} +1 -1
  10. package/bundles/mtxButton.umd.js.map +1 -0
  11. package/bundles/{ng-matero-extensions-button.umd.min.js → mtxButton.umd.min.js} +1 -1
  12. package/bundles/{ng-matero-extensions-button.umd.min.js.map → mtxButton.umd.min.js.map} +0 -0
  13. package/bundles/mtxCheckboxGroup.umd.js +41 -10
  14. package/bundles/mtxCheckboxGroup.umd.js.map +1 -1
  15. package/bundles/mtxCheckboxGroup.umd.min.js +1 -1
  16. package/bundles/mtxCheckboxGroup.umd.min.js.map +1 -1
  17. package/bundles/mtxColorPicker.umd.js +14 -1
  18. package/bundles/mtxColorPicker.umd.js.map +1 -1
  19. package/bundles/mtxColorPicker.umd.min.js +1 -1
  20. package/bundles/mtxColorPicker.umd.min.js.map +1 -1
  21. package/bundles/mtxFormGroup.umd.js.map +1 -1
  22. package/bundles/mtxFormGroup.umd.min.js.map +1 -1
  23. package/bundles/mtxGrid.umd.js +14 -14
  24. package/bundles/mtxGrid.umd.js.map +1 -1
  25. package/bundles/mtxGrid.umd.min.js.map +1 -1
  26. package/bundles/mtxLoader.umd.js +27 -7
  27. package/bundles/mtxLoader.umd.js.map +1 -1
  28. package/bundles/mtxLoader.umd.min.js +1 -1
  29. package/bundles/mtxLoader.umd.min.js.map +1 -1
  30. package/bundles/mtxPopover.umd.js +177 -129
  31. package/bundles/mtxPopover.umd.js.map +1 -1
  32. package/bundles/mtxPopover.umd.min.js +1 -1
  33. package/bundles/mtxPopover.umd.min.js.map +1 -1
  34. package/bundles/mtxProgress.umd.js +28 -4
  35. package/bundles/mtxProgress.umd.js.map +1 -1
  36. package/bundles/mtxProgress.umd.min.js +1 -1
  37. package/bundles/mtxProgress.umd.min.js.map +1 -1
  38. package/bundles/mtxSelect.umd.js.map +1 -1
  39. package/bundles/mtxSelect.umd.min.js.map +1 -1
  40. package/button/{ng-matero-extensions-button.d.ts → mtxButton.d.ts} +0 -0
  41. package/button/{ng-matero-extensions-button.metadata.json → mtxButton.metadata.json} +0 -0
  42. package/button/package.json +7 -7
  43. package/checkbox-group/checkbox-group.component.d.ts +13 -6
  44. package/checkbox-group/mtxCheckboxGroup.metadata.json +1 -1
  45. package/color-picker/color-picker.component.d.ts +5 -0
  46. package/color-picker/mtxColorPicker.metadata.json +1 -1
  47. package/data-grid/grid.component.d.ts +2 -2
  48. package/esm2015/alert/alert.component.js +16 -9
  49. package/esm2015/button/mtxButton.js +5 -0
  50. package/esm2015/checkbox-group/checkbox-group.component.js +35 -8
  51. package/esm2015/color-picker/color-picker.component.js +11 -2
  52. package/esm2015/data-grid/grid.component.js +15 -15
  53. package/esm2015/form-group/form-group.component.js +1 -1
  54. package/esm2015/loader/loader.component.js +17 -4
  55. package/esm2015/popover/popover-errors.js +15 -15
  56. package/esm2015/popover/popover-interfaces.js +1 -1
  57. package/esm2015/popover/popover-trigger.js +95 -64
  58. package/esm2015/popover/popover-types.js +1 -1
  59. package/esm2015/popover/popover.js +68 -51
  60. package/esm2015/popover/public-api.js +2 -1
  61. package/esm2015/progress/progress.component.js +18 -1
  62. package/esm2015/select/select.component.js +1 -1
  63. package/fesm2015/mtxAlert.js +15 -8
  64. package/fesm2015/mtxAlert.js.map +1 -1
  65. package/fesm2015/{ng-matero-extensions-button.js → mtxButton.js} +1 -1
  66. package/fesm2015/mtxButton.js.map +1 -0
  67. package/fesm2015/mtxCheckboxGroup.js +34 -7
  68. package/fesm2015/mtxCheckboxGroup.js.map +1 -1
  69. package/fesm2015/mtxColorPicker.js +10 -1
  70. package/fesm2015/mtxColorPicker.js.map +1 -1
  71. package/fesm2015/mtxFormGroup.js.map +1 -1
  72. package/fesm2015/mtxGrid.js +14 -14
  73. package/fesm2015/mtxGrid.js.map +1 -1
  74. package/fesm2015/mtxLoader.js +16 -3
  75. package/fesm2015/mtxLoader.js.map +1 -1
  76. package/fesm2015/mtxPopover.js +174 -126
  77. package/fesm2015/mtxPopover.js.map +1 -1
  78. package/fesm2015/mtxProgress.js +17 -0
  79. package/fesm2015/mtxProgress.js.map +1 -1
  80. package/fesm2015/mtxSelect.js.map +1 -1
  81. package/form-group/form-group.component.d.ts +2 -0
  82. package/loader/loader.component.d.ts +9 -2
  83. package/loader/mtxLoader.metadata.json +1 -1
  84. package/package.json +2 -2
  85. package/popover/_popover-theme.scss +17 -7
  86. package/popover/mtxPopover.metadata.json +1 -1
  87. package/popover/popover-errors.d.ts +6 -6
  88. package/popover/popover-interfaces.d.ts +9 -9
  89. package/popover/popover-types.d.ts +3 -2
  90. package/popover/popover.d.ts +23 -17
  91. package/popover/popover.scss +117 -20
  92. package/popover/public-api.d.ts +1 -0
  93. package/progress/mtxProgress.metadata.json +1 -1
  94. package/progress/progress.component.d.ts +9 -2
  95. package/select/mtxSelect.metadata.json +1 -1
  96. package/select/select.component.d.ts +9 -5
  97. package/bundles/ng-matero-extensions-button.umd.js.map +0 -1
  98. package/esm2015/button/ng-matero-extensions-button.js +0 -5
  99. package/fesm2015/ng-matero-extensions-button.js.map +0 -1
@@ -14,27 +14,27 @@ import { takeUntil } from 'rxjs/operators';
14
14
  * Throws an exception for the case when popover trigger doesn't have a valid mtx-popover instance
15
15
  */
16
16
  function throwMtxPopoverMissingError() {
17
- throw Error(`mtx-popover-trigger: must pass in an mtx-popover instance.
18
-
19
- Example:
20
- <mtx-popover #popover="mtxPopover"></mtx-popover>
17
+ throw Error(`mtx-popover-trigger: must pass in an mtx-popover instance.
18
+
19
+ Example:
20
+ <mtx-popover #popover="mtxPopover"></mtx-popover>
21
21
  <button [mtxPopoverTriggerFor]="popover"></button>`);
22
22
  }
23
23
  /**
24
- * Throws an exception for the case when popover's mtxPopoverPositionX value isn't valid.
25
- * In other words, it doesn't match 'before' or 'after'.
24
+ * Throws an exception for the case when popover's mtxPopoverPosition[0] value isn't valid.
25
+ * In other words, it doesn't match 'above', 'below', 'before' or 'after'.
26
26
  */
27
- function throwMtxPopoverInvalidPositionX() {
28
- throw Error(`mtxPopoverPositionX value must be either 'before', 'center' or after'.
29
- Example: <mtx-popover mtxPopoverPositionX="before" #popover="mtxPopover"></mtx-popover>`);
27
+ function throwMtxPopoverInvalidPositionStart() {
28
+ throw Error(`mtxPopoverPosition[0] value must be either 'above', 'below', 'before' or 'after'.
29
+ Example: <mtx-popover [position]="['below', 'after']" #popover="mtxPopover"></mtx-popover>`);
30
30
  }
31
31
  /**
32
- * Throws an exception for the case when popover's mtxPopoverPositionY value isn't valid.
33
- * In other words, it doesn't match 'above' or 'below'.
32
+ * Throws an exception for the case when popover's mtxPopoverPosition[1] value isn't valid.
33
+ * In other words, it doesn't match 'above', 'below', 'before', 'after' or 'center'.
34
34
  */
35
- function throwMtxPopoverInvalidPositionY() {
36
- throw Error(`mtxPopoverPositionY value must be either 'above' or below'.
37
- Example: <mtx-popover mtxPopoverPositionY="above" #popover="mtxPopover"></mtx-popover>`);
35
+ function throwMtxPopoverInvalidPositionEnd() {
36
+ throw Error(`mtxPopoverPosition[1] value must be either 'above', 'below', 'before', 'after' or 'center'.
37
+ Example: <mtx-popover [position]="['below', 'after']" #popover="mtxPopover"></mtx-popover>`);
38
38
  }
39
39
 
40
40
  /**
@@ -71,26 +71,25 @@ class MtxPopover {
71
71
  this.zone = zone;
72
72
  this.role = 'dialog';
73
73
  /** Settings for popover, view setters and getters for more detail */
74
- this._xPosition = 'after';
75
- this._yPosition = 'below';
74
+ this._position = ['below', 'after'];
76
75
  this._triggerEvent = 'hover';
77
76
  this._scrollStrategy = 'reposition';
78
77
  this._enterDelay = 100;
79
78
  this._leaveDelay = 100;
80
- this._overlapTrigger = false;
81
- this._disableAnimation = false;
82
79
  this._panelOffsetX = 0;
83
80
  this._panelOffsetY = 0;
84
81
  this._closeOnPanelClick = false;
85
82
  this._closeOnBackdropClick = true;
83
+ this._disableAnimation = false;
86
84
  this._focusTrapEnabled = true;
87
85
  this._focusTrapAutoCaptureEnabled = true;
88
86
  this._arrowOffsetX = 20;
87
+ this._arrowOffsetY = 20;
89
88
  this._arrowWidth = 16;
89
+ this._arrowHeight = 16;
90
90
  /** Config object to be passed into the popover's ngClass */
91
91
  this._classList = {};
92
- // TODO: Write comment description
93
- /** */
92
+ /** Whether popover's `targetElement` is defined */
94
93
  this.containerPositioning = false;
95
94
  /** Closing disabled on popover */
96
95
  this.closeDisabled = false;
@@ -100,26 +99,18 @@ class MtxPopover {
100
99
  this.closed = new EventEmitter();
101
100
  this.setPositionClasses();
102
101
  }
103
- /** Position of the popover in the X axis. */
104
- get xPosition() {
105
- return this._xPosition;
102
+ /** Position of the popover. */
103
+ get position() {
104
+ return this._position;
106
105
  }
107
- set xPosition(value) {
108
- if (value !== 'before' && value !== 'after' && value !== 'center') {
109
- throwMtxPopoverInvalidPositionX();
106
+ set position(value) {
107
+ if (!['before', 'after', 'above', 'below'].includes(value[0])) {
108
+ throwMtxPopoverInvalidPositionStart();
110
109
  }
111
- this._xPosition = value;
112
- this.setPositionClasses();
113
- }
114
- /** Position of the popover in the Y axis. */
115
- get yPosition() {
116
- return this._yPosition;
117
- }
118
- set yPosition(value) {
119
- if (value !== 'above' && value !== 'below') {
120
- throwMtxPopoverInvalidPositionY();
110
+ if (!['before', 'after', 'above', 'below', 'center'].includes(value[1])) {
111
+ throwMtxPopoverInvalidPositionEnd();
121
112
  }
122
- this._yPosition = value;
113
+ this._position = value;
123
114
  this.setPositionClasses();
124
115
  }
125
116
  /** Popover trigger event */
@@ -150,13 +141,6 @@ class MtxPopover {
150
141
  set leaveDelay(value) {
151
142
  this._leaveDelay = value;
152
143
  }
153
- /** Popover overlap trigger */
154
- get overlapTrigger() {
155
- return this._overlapTrigger;
156
- }
157
- set overlapTrigger(value) {
158
- this._overlapTrigger = value;
159
- }
160
144
  /** Popover target offset x */
161
145
  get xOffset() {
162
146
  return this._panelOffsetX;
@@ -178,6 +162,13 @@ class MtxPopover {
178
162
  set arrowOffsetX(value) {
179
163
  this._arrowOffsetX = value;
180
164
  }
165
+ /** Popover arrow offset y */
166
+ get arrowOffsetY() {
167
+ return this._arrowOffsetY;
168
+ }
169
+ set arrowOffsetY(value) {
170
+ this._arrowOffsetY = value;
171
+ }
181
172
  /** Popover arrow width */
182
173
  get arrowWidth() {
183
174
  return this._arrowWidth;
@@ -185,6 +176,13 @@ class MtxPopover {
185
176
  set arrowWidth(value) {
186
177
  this._arrowWidth = value;
187
178
  }
179
+ /** Popover arrow height */
180
+ get arrowHeight() {
181
+ return this._arrowHeight;
182
+ }
183
+ set arrowHeight(value) {
184
+ this._arrowHeight = value;
185
+ }
188
186
  /** Popover close on container click */
189
187
  get closeOnPanelClick() {
190
188
  return this._closeOnPanelClick;
@@ -294,39 +292,58 @@ class MtxPopover {
294
292
  // TODO: Refactor how styles are set and updated on the component, use best practices.
295
293
  // TODO: If arrow left and right positioning is requested, see if flex direction can be used to work with order.
296
294
  /** Sets the current styles for the popover to allow for dynamically changing settings */
297
- setCurrentStyles() {
298
- const left = this.xPosition === 'after'
295
+ setCurrentStyles(pos = this.position) {
296
+ const left = pos[1] === 'after'
299
297
  ? `${this.arrowOffsetX - this.arrowWidth / 2}px`
300
- : this.xPosition === 'center'
298
+ : pos[1] === 'center'
301
299
  ? `calc(50% - ${this.arrowWidth / 2}px)`
302
300
  : '';
303
- const right = this.xPosition === 'before' ? `${this.arrowOffsetX - this.arrowWidth / 2}px` : '';
304
- this.popoverArrowStyles = {
305
- left: this._dir.value === 'ltr' ? left : right,
306
- right: this._dir.value === 'ltr' ? right : left,
307
- };
301
+ const right = pos[1] === 'before' ? `${this.arrowOffsetX - this.arrowWidth / 2}px` : '';
302
+ const bottom = pos[1] === 'above'
303
+ ? `${this.arrowOffsetY - this.arrowHeight / 2}px`
304
+ : pos[1] === 'center'
305
+ ? `calc(50% - ${this.arrowHeight / 2}px)`
306
+ : '';
307
+ const top = pos[1] === 'below' ? `${this.arrowOffsetY - this.arrowHeight / 2}px` : '';
308
+ this.popoverArrowStyles =
309
+ pos[0] === 'above' || pos[0] === 'below'
310
+ ? {
311
+ left: this._dir.value === 'ltr' ? left : right,
312
+ right: this._dir.value === 'ltr' ? right : left,
313
+ }
314
+ : {
315
+ top,
316
+ bottom,
317
+ };
308
318
  }
309
319
  /**
310
320
  * It's necessary to set position-based classes to ensure the popover panel animation
311
321
  * folds out from the correct direction.
312
322
  */
313
- setPositionClasses(posX = this.xPosition, posY = this.yPosition) {
314
- this._classList['mtx-popover-before'] = posX === 'before';
315
- this._classList['mtx-popover-center'] = posX === 'center';
316
- this._classList['mtx-popover-after'] = posX === 'after';
317
- this._classList['mtx-popover-above'] = posY === 'above';
318
- this._classList['mtx-popover-below'] = posY === 'below';
323
+ setPositionClasses(pos = this.position) {
324
+ this._classList['mtx-popover-before-above'] = pos[0] === 'before' && pos[1] === 'above';
325
+ this._classList['mtx-popover-before-center'] = pos[0] === 'before' && pos[1] === 'center';
326
+ this._classList['mtx-popover-before-below'] = pos[0] === 'before' && pos[1] === 'below';
327
+ this._classList['mtx-popover-after-above'] = pos[0] === 'after' && pos[1] === 'above';
328
+ this._classList['mtx-popover-after-center'] = pos[0] === 'after' && pos[1] === 'center';
329
+ this._classList['mtx-popover-after-below'] = pos[0] === 'after' && pos[1] === 'below';
330
+ this._classList['mtx-popover-above-before'] = pos[0] === 'above' && pos[1] === 'before';
331
+ this._classList['mtx-popover-above-center'] = pos[0] === 'above' && pos[1] === 'center';
332
+ this._classList['mtx-popover-above-after'] = pos[0] === 'above' && pos[1] === 'after';
333
+ this._classList['mtx-popover-below-before'] = pos[0] === 'below' && pos[1] === 'before';
334
+ this._classList['mtx-popover-below-center'] = pos[0] === 'below' && pos[1] === 'center';
335
+ this._classList['mtx-popover-below-after'] = pos[0] === 'below' && pos[1] === 'after';
319
336
  }
320
337
  }
321
338
  MtxPopover.decorators = [
322
339
  { type: Component, args: [{
323
340
  selector: 'mtx-popover',
324
- template: "<ng-template>\r\n <div class=\"mtx-popover-panel mat-elevation-z8\" role=\"dialog\"\r\n [class.mtx-popover-overlap]=\"overlapTrigger\"\r\n [ngClass]=\"_classList\"\r\n [ngStyle]=\"popoverPanelStyles\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (click)=\"onClick()\"\r\n (mouseover)=\"onMouseOver()\"\r\n (mouseleave)=\"onMouseLeave()\"\r\n [@.disabled]=\"disableAnimation\"\r\n [@transformPopover]=\"'enter'\">\r\n <div class=\"mtx-popover-direction-arrow\" [ngStyle]=\"popoverArrowStyles\" *ngIf=\"!overlapTrigger\">\r\n </div>\r\n <div class=\"mtx-popover-content\"\r\n [ngStyle]=\"popoverContentStyles\"\r\n [cdkTrapFocus]=\"focusTrapEnabled\"\r\n [cdkTrapFocusAutoCapture]=\"focusTrapAutoCaptureEnabled\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n</ng-template>\r\n",
341
+ template: "<ng-template>\r\n <div class=\"mtx-popover-panel mat-elevation-z8\" role=\"dialog\"\r\n [ngClass]=\"_classList\"\r\n [ngStyle]=\"popoverPanelStyles\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (click)=\"onClick()\"\r\n (mouseover)=\"onMouseOver()\"\r\n (mouseleave)=\"onMouseLeave()\"\r\n [@.disabled]=\"disableAnimation\"\r\n [@transformPopover]=\"'enter'\">\r\n <div class=\"mtx-popover-direction-arrow\" [ngStyle]=\"popoverArrowStyles\"></div>\r\n <div class=\"mtx-popover-content\"\r\n [ngStyle]=\"popoverContentStyles\"\r\n [cdkTrapFocus]=\"focusTrapEnabled\"\r\n [cdkTrapFocusAutoCapture]=\"focusTrapAutoCaptureEnabled\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n</ng-template>\r\n",
325
342
  changeDetection: ChangeDetectionStrategy.OnPush,
326
343
  encapsulation: ViewEncapsulation.None,
327
344
  animations: [transformPopover],
328
345
  exportAs: 'mtxPopover',
329
- styles: [".mtx-popover-panel{max-height:calc(100vh - 48px);padding:8px;border-radius:4px}.mtx-popover-panel.mtx-popover-below{margin-top:10px}.mtx-popover-panel.mtx-popover-above{margin-bottom:10px}.mtx-popover-panel.mtx-popover-overlap{margin:0}.mtx-popover-direction-arrow{position:absolute;width:16px}.mtx-popover-direction-arrow:after,.mtx-popover-direction-arrow:before{position:absolute;display:inline-block;content:\"\"}.mtx-popover-direction-arrow:before{border:8px solid transparent}.mtx-popover-direction-arrow:after{border:7px solid transparent;left:1px}[dir=rtl] .mtx-popover-direction-arrow:after{right:1px;left:auto}.mtx-popover-below .mtx-popover-direction-arrow{top:0}.mtx-popover-below .mtx-popover-direction-arrow:after,.mtx-popover-below .mtx-popover-direction-arrow:before{bottom:0;border-top-width:0}.mtx-popover-above .mtx-popover-direction-arrow{bottom:0}.mtx-popover-above .mtx-popover-direction-arrow:after,.mtx-popover-above .mtx-popover-direction-arrow:before{top:0;border-bottom-width:0}"]
346
+ styles: [".mtx-popover-panel{max-height:calc(100vh - 48px);padding:8px;border-radius:4px;font-size:16px}.mtx-popover-panel[class*=mtx-popover-below]{margin-top:calc(.5em + 2px)}.mtx-popover-panel[class*=mtx-popover-above]{margin-bottom:calc(.5em + 2px)}.mtx-popover-panel[class*=mtx-popover-before]{margin-right:calc(.5em + 2px)}[dir=rtl] .mtx-popover-panel[class*=mtx-popover-before]{margin-right:auto;margin-left:calc(.5em + 2px)}.mtx-popover-panel[class*=mtx-popover-after]{margin-left:calc(.5em + 2px)}[dir=rtl] .mtx-popover-panel[class*=mtx-popover-after]{margin-left:auto;margin-right:calc(.5em + 2px)}.mtx-popover-direction-arrow{position:absolute}.mtx-popover-direction-arrow:after,.mtx-popover-direction-arrow:before{position:absolute;display:inline-block;content:\"\";border-width:.5em;border-style:solid}.mtx-popover-direction-arrow:after{border-width:calc(.5em - 1px)}[class*=mtx-popover-above] .mtx-popover-direction-arrow,[class*=mtx-popover-below] .mtx-popover-direction-arrow{width:1em}[class*=mtx-popover-above] .mtx-popover-direction-arrow:after,[class*=mtx-popover-below] .mtx-popover-direction-arrow:after{left:1px}[dir=rtl] [class*=mtx-popover-above] .mtx-popover-direction-arrow:after,[dir=rtl] [class*=mtx-popover-below] .mtx-popover-direction-arrow:after{right:1px;left:auto}[class*=mtx-popover-below] .mtx-popover-direction-arrow{top:0}[class*=mtx-popover-below] .mtx-popover-direction-arrow:after,[class*=mtx-popover-below] .mtx-popover-direction-arrow:before{bottom:0;border-top-width:0}[class*=mtx-popover-above] .mtx-popover-direction-arrow{bottom:0}[class*=mtx-popover-above] .mtx-popover-direction-arrow:after,[class*=mtx-popover-above] .mtx-popover-direction-arrow:before{top:0;border-bottom-width:0}[class*=mtx-popover-after] .mtx-popover-direction-arrow,[class*=mtx-popover-before] .mtx-popover-direction-arrow{height:1em}[class*=mtx-popover-after] .mtx-popover-direction-arrow:after,[class*=mtx-popover-before] .mtx-popover-direction-arrow:after{top:1px}[class*=mtx-popover-before] .mtx-popover-direction-arrow{right:0}[class*=mtx-popover-before] .mtx-popover-direction-arrow:after,[class*=mtx-popover-before] .mtx-popover-direction-arrow:before{left:0;border-right-width:0}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow{right:auto;left:0}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:after,[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:before{left:auto;right:0;border-left-width:0}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:before{border-right-width:.5em}[dir=rtl] [class*=mtx-popover-before] .mtx-popover-direction-arrow:after{border-right-width:calc(.5em - 1px)}[class*=mtx-popover-after] .mtx-popover-direction-arrow{left:0}[class*=mtx-popover-after] .mtx-popover-direction-arrow:after,[class*=mtx-popover-after] .mtx-popover-direction-arrow:before{right:0;border-left-width:0}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow{left:auto;right:0}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:after,[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:before{right:auto;left:0;border-right-width:0}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:before{border-left-width:.5em}[dir=rtl] [class*=mtx-popover-after] .mtx-popover-direction-arrow:after{border-left-width:calc(.5em - 1px)}"]
330
347
  },] }
331
348
  ];
332
349
  /** @nocollapse */
@@ -337,17 +354,17 @@ MtxPopover.ctorParameters = () => [
337
354
  ];
338
355
  MtxPopover.propDecorators = {
339
356
  role: [{ type: HostBinding, args: ['attr.role',] }],
340
- xPosition: [{ type: Input }],
341
- yPosition: [{ type: Input }],
357
+ position: [{ type: Input }],
342
358
  triggerEvent: [{ type: Input }],
343
359
  scrollStrategy: [{ type: Input }],
344
360
  enterDelay: [{ type: Input }],
345
361
  leaveDelay: [{ type: Input }],
346
- overlapTrigger: [{ type: Input }],
347
362
  xOffset: [{ type: Input }],
348
363
  yOffset: [{ type: Input }],
349
364
  arrowOffsetX: [{ type: Input }],
365
+ arrowOffsetY: [{ type: Input }],
350
366
  arrowWidth: [{ type: Input }],
367
+ arrowHeight: [{ type: Input }],
351
368
  closeOnPanelClick: [{ type: Input }],
352
369
  closeOnBackdropClick: [{ type: Input }],
353
370
  disableAnimation: [{ type: Input }],
@@ -576,7 +593,7 @@ class MtxPopoverTrigger {
576
593
  overlayState.hasBackdrop = true;
577
594
  overlayState.backdropClass = 'cdk-overlay-transparent-backdrop';
578
595
  }
579
- overlayState.direction = this.dir;
596
+ overlayState.direction = this._dir;
580
597
  overlayState.scrollStrategy = this._getOverlayScrollStrategy(this.popover.scrollStrategy);
581
598
  return overlayState;
582
599
  }
@@ -603,19 +620,24 @@ class MtxPopoverTrigger {
603
620
  */
604
621
  _subscribeToPositions(position) {
605
622
  this._positionSubscription = position.positionChanges.subscribe(change => {
606
- const posisionX = change.connectionPair.overlayX === 'start'
623
+ const posX = change.connectionPair.overlayX === 'start'
607
624
  ? 'after'
608
625
  : change.connectionPair.overlayX === 'end'
609
626
  ? 'before'
610
627
  : 'center';
611
- const posisionY = change.connectionPair.overlayY === 'top' ? 'below' : 'above';
628
+ const posY = change.connectionPair.overlayY === 'top'
629
+ ? 'below'
630
+ : change.connectionPair.overlayY === 'bottom'
631
+ ? 'above'
632
+ : 'center';
633
+ const pos = this.popover.position[0] === 'above' || this.popover.position[0] === 'below'
634
+ ? [posY, posX]
635
+ : [posX, posY];
612
636
  // required for ChangeDetectionStrategy.OnPush
613
637
  this._changeDetectorRef.markForCheck();
614
638
  this.popover.zone.run(() => {
615
- this.popover.xPosition = posisionX;
616
- this.popover.yPosition = posisionY;
617
- this.popover.setCurrentStyles();
618
- this.popover.setPositionClasses(posisionX, posisionY);
639
+ this.popover.setCurrentStyles(pos);
640
+ this.popover.setPositionClasses(pos);
619
641
  });
620
642
  });
621
643
  }
@@ -625,24 +647,36 @@ class MtxPopoverTrigger {
625
647
  * @returns ConnectedPositionStrategy
626
648
  */
627
649
  _getPosition() {
628
- const [originX, origin2ndX, origin3rdX] = this.popover.xPosition === 'before'
629
- ? ['end', 'start', 'center']
630
- : this.popover.xPosition === 'after'
631
- ? ['start', 'end', 'center']
650
+ const [originX, origin2ndX, origin3rdX] = this.popover.position[0] === 'before' || this.popover.position[1] === 'after'
651
+ ? ['start', 'center', 'end']
652
+ : this.popover.position[0] === 'after' || this.popover.position[1] === 'before'
653
+ ? ['end', 'center', 'start']
632
654
  : ['center', 'start', 'end'];
633
- const [overlayY, overlayFallbackY] = this.popover.yPosition === 'above' ? ['bottom', 'top'] : ['top', 'bottom'];
634
- /** Reverse overlayY and fallbackOverlayY when overlapTrigger is false */
635
- const originY = this.popover.overlapTrigger ? overlayY : overlayFallbackY;
636
- const originFallbackY = this.popover.overlapTrigger ? overlayFallbackY : overlayY;
637
- const overlayX = originX;
655
+ const [originY, origin2ndY, origin3rdY] = this.popover.position[0] === 'above' || this.popover.position[1] === 'below'
656
+ ? ['top', 'center', 'bottom']
657
+ : this.popover.position[0] === 'below' || this.popover.position[1] === 'above'
658
+ ? ['bottom', 'center', 'top']
659
+ : ['center', 'top', 'bottom'];
660
+ const [overlayX, overlayFallbackX] = this.popover.position[0] === 'below' || this.popover.position[0] === 'above'
661
+ ? [originX, originX]
662
+ : this.popover.position[0] === 'before'
663
+ ? ['end', 'start']
664
+ : ['start', 'end'];
665
+ const [overlayY, overlayFallbackY] = this.popover.position[0] === 'before' || this.popover.position[0] === 'after'
666
+ ? [originY, originY]
667
+ : this.popover.position[0] === 'below'
668
+ ? ['top', 'bottom']
669
+ : ['bottom', 'top'];
670
+ const originFallbackX = overlayX;
671
+ const originFallbackY = overlayY;
638
672
  const offsetX = this.popover.xOffset && !isNaN(Number(this.popover.xOffset))
639
- ? Number(this.popover.xOffset)
673
+ ? Number(this.dir === 'ltr' ? this.popover.xOffset : -this.popover.xOffset)
640
674
  : 0;
641
675
  const offsetY = this.popover.yOffset && !isNaN(Number(this.popover.yOffset))
642
676
  ? Number(this.popover.yOffset)
643
677
  : 0;
644
678
  /**
645
- * For overriding position element, when mtxPopoverTargetAt has a valid element reference.
679
+ * For overriding position element, when `mtxPopoverTargetAt` has a valid element reference.
646
680
  * Useful for sticking popover to parent element and offsetting arrow to trigger element.
647
681
  * If undefined defaults to the trigger element reference.
648
682
  */
@@ -651,54 +685,68 @@ class MtxPopoverTrigger {
651
685
  this.popover.containerPositioning = true;
652
686
  element = this.targetElement._elementRef;
653
687
  }
688
+ let positions = [{ originX, originY, overlayX, overlayY }];
689
+ if (this.popover.position[0] === 'above' || this.popover.position[0] === 'below') {
690
+ positions = [
691
+ { originX, originY, overlayX, overlayY, offsetY },
692
+ { originX: origin2ndX, originY, overlayX: origin2ndX, overlayY, offsetY },
693
+ { originX: origin3rdX, originY, overlayX: origin3rdX, overlayY, offsetY },
694
+ {
695
+ originX,
696
+ originY: originFallbackY,
697
+ overlayX,
698
+ overlayY: overlayFallbackY,
699
+ offsetY: -offsetY,
700
+ },
701
+ {
702
+ originX: origin2ndX,
703
+ originY: originFallbackY,
704
+ overlayX: origin2ndX,
705
+ overlayY: overlayFallbackY,
706
+ offsetY: -offsetY,
707
+ },
708
+ {
709
+ originX: origin3rdX,
710
+ originY: originFallbackY,
711
+ overlayX: origin3rdX,
712
+ overlayY: overlayFallbackY,
713
+ offsetY: -offsetY,
714
+ },
715
+ ];
716
+ }
717
+ if (this.popover.position[0] === 'before' || this.popover.position[0] === 'after') {
718
+ positions = [
719
+ { originX, originY, overlayX, overlayY, offsetX },
720
+ { originX, originY: origin2ndY, overlayX, overlayY: origin2ndY, offsetX },
721
+ { originX, originY: origin3rdY, overlayX, overlayY: origin3rdY, offsetX },
722
+ {
723
+ originX: originFallbackX,
724
+ originY,
725
+ overlayX: overlayFallbackX,
726
+ overlayY,
727
+ offsetX: -offsetX,
728
+ },
729
+ {
730
+ originX: originFallbackX,
731
+ originY: origin2ndY,
732
+ overlayX: overlayFallbackX,
733
+ overlayY: origin2ndY,
734
+ offsetX: -offsetX,
735
+ },
736
+ {
737
+ originX: originFallbackX,
738
+ originY: origin3rdY,
739
+ overlayX: overlayFallbackX,
740
+ overlayY: origin3rdY,
741
+ offsetX: -offsetX,
742
+ },
743
+ ];
744
+ }
654
745
  return this._overlay
655
746
  .position()
656
747
  .flexibleConnectedTo(element)
657
- .withLockedPosition(true)
658
- .withPositions([
659
- {
660
- originX,
661
- originY,
662
- overlayX,
663
- overlayY,
664
- offsetY,
665
- },
666
- {
667
- originX: origin2ndX,
668
- originY,
669
- overlayX: origin2ndX,
670
- overlayY,
671
- offsetY,
672
- },
673
- {
674
- originX,
675
- originY: originFallbackY,
676
- overlayX,
677
- overlayY: overlayFallbackY,
678
- offsetY: -offsetY,
679
- },
680
- {
681
- originX: origin2ndX,
682
- originY: originFallbackY,
683
- overlayX: origin2ndX,
684
- overlayY: overlayFallbackY,
685
- offsetY: -offsetY,
686
- },
687
- {
688
- originX: origin3rdX,
689
- originY,
690
- overlayX: origin3rdX,
691
- overlayY,
692
- offsetY,
693
- },
694
- {
695
- originX: origin3rdX,
696
- originY: originFallbackY,
697
- overlayX: origin3rdX,
698
- overlayY: overlayFallbackY,
699
- offsetY: -offsetY,
700
- },
701
- ])
748
+ .withLockedPosition()
749
+ .withPositions(positions)
702
750
  .withDefaultOffsetX(offsetX)
703
751
  .withDefaultOffsetY(offsetY);
704
752
  }