@tylertech/forge 3.8.2-dev.0 → 3.9.0-dev.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 (42) hide show
  1. package/custom-elements.json +10454 -10067
  2. package/dist/lib.js +18 -18
  3. package/dist/lib.js.map +3 -3
  4. package/dist/toolbar/forge-toolbar.css +1 -0
  5. package/dist/vscode.css-custom-data.json +946 -946
  6. package/dist/vscode.html-custom-data.json +618 -558
  7. package/esm/calendar/calendar-adapter.d.ts +24 -0
  8. package/esm/calendar/calendar-adapter.js +67 -1
  9. package/esm/calendar/calendar-constants.d.ts +34 -0
  10. package/esm/calendar/calendar-constants.js +33 -0
  11. package/esm/calendar/calendar-core.d.ts +60 -0
  12. package/esm/calendar/calendar-core.js +220 -2
  13. package/esm/calendar/calendar-dom-utils.d.ts +6 -0
  14. package/esm/calendar/calendar-dom-utils.js +36 -0
  15. package/esm/calendar/calendar.d.ts +40 -1
  16. package/esm/calendar/calendar.js +80 -2
  17. package/esm/calendar/core/calendar-base.d.ts +3 -0
  18. package/esm/calendar/core/date-range.d.ts +2 -0
  19. package/esm/calendar/core/date-range.js +1 -0
  20. package/esm/date-picker/base/base-date-picker-adapter.js +0 -3
  21. package/esm/date-picker/base/base-date-picker-constants.d.ts +3 -0
  22. package/esm/date-picker/base/base-date-picker-constants.js +3 -0
  23. package/esm/date-picker/base/base-date-picker-core.d.ts +15 -0
  24. package/esm/date-picker/base/base-date-picker-core.js +30 -0
  25. package/esm/date-picker/base/base-date-picker.d.ts +12 -0
  26. package/esm/date-picker/base/base-date-picker.js +24 -0
  27. package/esm/date-picker/date-picker-core.d.ts +3 -0
  28. package/esm/date-picker/date-picker-core.js +20 -0
  29. package/esm/date-range-picker/date-range-picker-constants.d.ts +3 -0
  30. package/esm/date-range-picker/date-range-picker-constants.js +1 -0
  31. package/esm/date-range-picker/date-range-picker-core.d.ts +3 -0
  32. package/esm/date-range-picker/date-range-picker-core.js +62 -2
  33. package/esm/date-range-picker/date-range-picker.d.ts +3 -0
  34. package/esm/date-range-picker/date-range-picker.js +3 -0
  35. package/esm/split-view/split-view-panel/split-view-panel.js +1 -1
  36. package/esm/tabs/tab-bar/tab-bar-core.d.ts +1 -0
  37. package/esm/tabs/tab-bar/tab-bar-core.js +27 -30
  38. package/esm/toolbar/toolbar.js +1 -1
  39. package/package.json +1 -1
  40. package/sass/calendar/_mixins.scss +3 -2
  41. package/sass/toolbar/_core.scss +5 -0
  42. package/sass/toolbar/toolbar.scss +4 -0
@@ -48,6 +48,9 @@ export declare const BASE_DATE_PICKER_CONSTANTS: {
48
48
  VALUE_MODE: string;
49
49
  ALLOW_INVALID_DATE: string;
50
50
  SHOW_TODAY: string;
51
+ SHOW_YESTERDAY: string;
52
+ SHOW_LAST_SEVEN_DAYS: string;
53
+ SHOW_LAST_THIRTY_DAYS: string;
51
54
  SHOW_CLEAR: string;
52
55
  DISABLED_DAYS_OF_WEEK: string;
53
56
  YEAR_RANGE: string;
@@ -15,6 +15,9 @@ const observedAttributes = {
15
15
  VALUE_MODE: 'value-mode',
16
16
  ALLOW_INVALID_DATE: 'allow-invalid-date',
17
17
  SHOW_TODAY: 'show-today',
18
+ SHOW_YESTERDAY: 'show-yesterday',
19
+ SHOW_LAST_SEVEN_DAYS: 'show-last-seven-days',
20
+ SHOW_LAST_THIRTY_DAYS: 'show-last-thirty-days',
18
21
  SHOW_CLEAR: 'show-clear',
19
22
  DISABLED_DAYS_OF_WEEK: 'disabled-days-of-week',
20
23
  YEAR_RANGE: 'year-range',
@@ -49,6 +49,9 @@ export declare abstract class BaseDatePickerCore<TAdapter extends IBaseDatePicke
49
49
  protected _notifyInputValueChanges: boolean;
50
50
  protected _allowInvalidDate: boolean;
51
51
  protected _showToday: boolean;
52
+ protected _showYesterday: boolean;
53
+ protected _showLastSevenDays: boolean;
54
+ protected _showLastThirtyDays: boolean;
52
55
  protected _showClear: boolean;
53
56
  protected _disabledDaysOfWeek: DayOfWeek[];
54
57
  protected _yearRange: string;
@@ -64,6 +67,9 @@ export declare abstract class BaseDatePickerCore<TAdapter extends IBaseDatePicke
64
67
  private _dropdownCloseListener;
65
68
  private _activeChangeListener;
66
69
  private _todayListener;
70
+ private _yesterdayListener;
71
+ private _lastSevenDaysListener;
72
+ private _lastThirtyDaysListener;
67
73
  private _clearListener;
68
74
  private _dateSelectListener;
69
75
  private _monthChangeListener;
@@ -74,6 +80,9 @@ export declare abstract class BaseDatePickerCore<TAdapter extends IBaseDatePicke
74
80
  protected abstract _emitOpenEvent(): void;
75
81
  protected abstract _emitCloseEvent(): void;
76
82
  protected abstract _onToday(): void;
83
+ protected abstract _onYesterday(): void;
84
+ protected abstract _onLastSevenDays(): void;
85
+ protected abstract _onLastThirtyDays(): void;
77
86
  protected abstract _onClear(): void;
78
87
  protected abstract _getCurrentValue(): TPrivateValue | null | undefined;
79
88
  protected abstract _setFormattedInputValue(suppressValueChanges?: boolean): void;
@@ -149,6 +158,12 @@ export declare abstract class BaseDatePickerCore<TAdapter extends IBaseDatePicke
149
158
  set prepareMaskCallback(cb: DatePickerPrepareMaskCallback);
150
159
  get showToday(): boolean;
151
160
  set showToday(value: boolean);
161
+ get showYesterday(): boolean;
162
+ set showYesterday(value: boolean);
163
+ get showLastSevenDays(): boolean;
164
+ set showLastSevenDays(value: boolean);
165
+ get showLastThirtyDays(): boolean;
166
+ set showLastThirtyDays(value: boolean);
152
167
  get showClear(): boolean;
153
168
  set showClear(value: boolean);
154
169
  get yearRange(): string;
@@ -24,6 +24,9 @@ export class BaseDatePickerCore {
24
24
  this._notifyInputValueChanges = true;
25
25
  this._allowInvalidDate = false;
26
26
  this._showToday = false;
27
+ this._showYesterday = false;
28
+ this._showLastSevenDays = false;
29
+ this._showLastThirtyDays = false;
27
30
  this._showClear = false;
28
31
  this._yearRange = '-50:+50';
29
32
  this._calendarText = {};
@@ -39,6 +42,9 @@ export class BaseDatePickerCore {
39
42
  this._monthChangeListener = evt => this._onMonthChanged(evt);
40
43
  this._activeChangeListener = id => this._onActiveDescendantChanged(id);
41
44
  this._todayListener = () => this._onToday();
45
+ this._yesterdayListener = () => this._onYesterday();
46
+ this._lastSevenDaysListener = () => this._onLastSevenDays();
47
+ this._lastThirtyDaysListener = () => this._onLastThirtyDays();
42
48
  this._clearListener = () => this._onClear();
43
49
  }
44
50
  initialize() {
@@ -118,8 +124,14 @@ export class BaseDatePickerCore {
118
124
  disabledDates: this._disabledDates,
119
125
  yearRange: this._yearRange,
120
126
  todayButton: this._showToday,
127
+ yesterdayButton: this._showYesterday,
128
+ lastSevenDaysButton: this._showLastSevenDays,
129
+ lastThirtyDaysButton: this._showLastThirtyDays,
121
130
  clearButton: this._showClear,
122
131
  todayCallback: this._todayListener,
132
+ yesterdayCallback: this._yesterdayListener,
133
+ lastSevenDaysCallback: this._lastSevenDaysListener,
134
+ lastThirtyDaysCallback: this._lastThirtyDaysListener,
123
135
  clearCallback: this._clearListener,
124
136
  disabledDateBuilder: this._disableDayCallback,
125
137
  disabledDaysOfWeek: this._disabledDaysOfWeek,
@@ -607,6 +619,24 @@ export class BaseDatePickerCore {
607
619
  set showToday(value) {
608
620
  this._showToday = value;
609
621
  }
622
+ get showYesterday() {
623
+ return this._showYesterday;
624
+ }
625
+ set showYesterday(value) {
626
+ this._showYesterday = value;
627
+ }
628
+ get showLastSevenDays() {
629
+ return this._showLastSevenDays;
630
+ }
631
+ set showLastSevenDays(value) {
632
+ this._showLastSevenDays = value;
633
+ }
634
+ get showLastThirtyDays() {
635
+ return this._showLastThirtyDays;
636
+ }
637
+ set showLastThirtyDays(value) {
638
+ this._showLastThirtyDays = value;
639
+ }
610
640
  get showClear() {
611
641
  return this._showClear;
612
642
  }
@@ -27,6 +27,9 @@ export interface IBaseDatePickerComponent<TValue> extends IBaseComponent {
27
27
  notifyInputValueChanges: boolean;
28
28
  allowInvalidDate: boolean;
29
29
  showToday: boolean;
30
+ showYesterday: boolean;
31
+ showLastSevenDays: boolean;
32
+ showLastThirtyDays: boolean;
30
33
  showClear: boolean;
31
34
  disabledDaysOfWeek: DayOfWeek[];
32
35
  yearRange: string;
@@ -54,6 +57,9 @@ export interface IBaseDatePickerComponent<TValue> extends IBaseComponent {
54
57
  * @property {boolean} [showClear=false] - Whether the clear button is visible in the popup.
55
58
  * @property {boolean} [showMaskFormat=false] - Whether the mask format is displayed in the input or not. Only applies if `masked` is `true`.
56
59
  * @property {boolean} [showToday=false] - Whether the today button is visible in the popup.
60
+ * @property {boolean} [showYesterday=false] - Whether the yesterday button is visible in the popup.
61
+ * @property {boolean} [showLastSevenDays=false] - Whether the last seven days button is visible in the popup.
62
+ * @property {boolean} [showLastThirtyDays=false] - Whether the last thirty days button is visible in the popup.
57
63
  * @property {TValue} value - The value of the date picker.
58
64
  * @property {DatePickerValueMode} valueMode - The type for the `value` property and `forge-date-picker-change` event.
59
65
  * @property {string} yearRange - The year range.
@@ -72,6 +78,9 @@ export interface IBaseDatePickerComponent<TValue> extends IBaseComponent {
72
78
  * @attribute {boolean} [show-clear=false] - Whether the clear button is visible in the popup.
73
79
  * @attribute {boolean} [show-mask-format=false] - Whether the mask format is displayed in the input or not. Only applies if `masked` is `true`.
74
80
  * @attribute {boolean} [show-today=false] - Whether the today button is visible in the popup.
81
+ * @attribute {boolean} [show-yesterday=false] - Whether the yesterday button is visible in the popup.
82
+ * @attribute {boolean} [show-last-seven-days=false] - Whether the last seven days button is visible in the popup.
83
+ * @attribute {boolean} [show-last-thirty-days=false] - Whether the last thirty days button is visible in the popup.
75
84
  * @attribute {DatePickerValueMode} [value-mode=string] - The type for the `value` property and `forge-date-picker-change` event.
76
85
  * @attribute {string} [year-range] - The year range.
77
86
  */
@@ -95,6 +104,9 @@ export declare abstract class BaseDatePickerComponent<TPublicValue, TPrivateValu
95
104
  notifyInputValueChanges: boolean;
96
105
  allowInvalidDate: boolean;
97
106
  showToday: boolean;
107
+ showYesterday: boolean;
108
+ showLastSevenDays: boolean;
109
+ showLastThirtyDays: boolean;
98
110
  showClear: boolean;
99
111
  parseCallback: DatePickerParseCallback;
100
112
  formatCallback: DatePickerFormatCallback;
@@ -28,6 +28,9 @@ import { BASE_DATE_PICKER_CONSTANTS } from './base-date-picker-constants';
28
28
  * @property {boolean} [showClear=false] - Whether the clear button is visible in the popup.
29
29
  * @property {boolean} [showMaskFormat=false] - Whether the mask format is displayed in the input or not. Only applies if `masked` is `true`.
30
30
  * @property {boolean} [showToday=false] - Whether the today button is visible in the popup.
31
+ * @property {boolean} [showYesterday=false] - Whether the yesterday button is visible in the popup.
32
+ * @property {boolean} [showLastSevenDays=false] - Whether the last seven days button is visible in the popup.
33
+ * @property {boolean} [showLastThirtyDays=false] - Whether the last thirty days button is visible in the popup.
31
34
  * @property {TValue} value - The value of the date picker.
32
35
  * @property {DatePickerValueMode} valueMode - The type for the `value` property and `forge-date-picker-change` event.
33
36
  * @property {string} yearRange - The year range.
@@ -46,6 +49,9 @@ import { BASE_DATE_PICKER_CONSTANTS } from './base-date-picker-constants';
46
49
  * @attribute {boolean} [show-clear=false] - Whether the clear button is visible in the popup.
47
50
  * @attribute {boolean} [show-mask-format=false] - Whether the mask format is displayed in the input or not. Only applies if `masked` is `true`.
48
51
  * @attribute {boolean} [show-today=false] - Whether the today button is visible in the popup.
52
+ * @attribute {boolean} [show-yesterday=false] - Whether the yesterday button is visible in the popup.
53
+ * @attribute {boolean} [show-last-seven-days=false] - Whether the last seven days button is visible in the popup.
54
+ * @attribute {boolean} [show-last-thirty-days=false] - Whether the last thirty days button is visible in the popup.
49
55
  * @attribute {DatePickerValueMode} [value-mode=string] - The type for the `value` property and `forge-date-picker-change` event.
50
56
  * @attribute {string} [year-range] - The year range.
51
57
  */
@@ -101,6 +107,15 @@ export class BaseDatePickerComponent extends BaseComponent {
101
107
  case BASE_DATE_PICKER_CONSTANTS.observedAttributes.SHOW_TODAY:
102
108
  this.showToday = coerceBoolean(newValue);
103
109
  break;
110
+ case BASE_DATE_PICKER_CONSTANTS.observedAttributes.SHOW_YESTERDAY:
111
+ this.showYesterday = coerceBoolean(newValue);
112
+ break;
113
+ case BASE_DATE_PICKER_CONSTANTS.observedAttributes.SHOW_LAST_SEVEN_DAYS:
114
+ this.showLastSevenDays = coerceBoolean(newValue);
115
+ break;
116
+ case BASE_DATE_PICKER_CONSTANTS.observedAttributes.SHOW_LAST_THIRTY_DAYS:
117
+ this.showLastThirtyDays = coerceBoolean(newValue);
118
+ break;
104
119
  case BASE_DATE_PICKER_CONSTANTS.observedAttributes.SHOW_CLEAR:
105
120
  this.showClear = coerceBoolean(newValue);
106
121
  break;
@@ -161,6 +176,15 @@ __decorate([
161
176
  __decorate([
162
177
  coreProperty()
163
178
  ], BaseDatePickerComponent.prototype, "showToday", void 0);
179
+ __decorate([
180
+ coreProperty()
181
+ ], BaseDatePickerComponent.prototype, "showYesterday", void 0);
182
+ __decorate([
183
+ coreProperty()
184
+ ], BaseDatePickerComponent.prototype, "showLastSevenDays", void 0);
185
+ __decorate([
186
+ coreProperty()
187
+ ], BaseDatePickerComponent.prototype, "showLastThirtyDays", void 0);
164
188
  __decorate([
165
189
  coreProperty()
166
190
  ], BaseDatePickerComponent.prototype, "showClear", void 0);
@@ -16,6 +16,9 @@ export declare class DatePickerCore extends BaseDatePickerCore<IDatePickerAdapte
16
16
  protected _emitOpenEvent(): void;
17
17
  protected _emitCloseEvent(): void;
18
18
  protected _onToday(): void;
19
+ protected _onYesterday(): void;
20
+ protected _onLastSevenDays(): void;
21
+ protected _onLastThirtyDays(): void;
19
22
  protected _onClear(): void;
20
23
  protected _getCurrentValue(): Date | null | undefined;
21
24
  protected _setFormattedInputValue(suppressValueChanges?: boolean): void;
@@ -37,6 +37,26 @@ export class DatePickerCore extends BaseDatePickerCore {
37
37
  this._tryMergeCurrentTime(today);
38
38
  this._onDateSelected({ date: today, selected: true, type: 'date' });
39
39
  }
40
+ _onYesterday() {
41
+ const today = new Date();
42
+ const yesterday = new Date(today.setDate(today.getDate() - 1));
43
+ this._tryMergeCurrentTime(yesterday);
44
+ this._onDateSelected({ date: yesterday, selected: true, type: 'date' });
45
+ }
46
+ _onLastSevenDays() {
47
+ // not a range, so setting the day to 7 days ago
48
+ const today = new Date();
49
+ const sevenDaysAgo = new Date(today.setDate(today.getDate() - 7));
50
+ this._tryMergeCurrentTime(sevenDaysAgo);
51
+ this._onDateSelected({ date: sevenDaysAgo, selected: true, type: 'date' });
52
+ }
53
+ _onLastThirtyDays() {
54
+ // not a range, so setting the day to 30 days ago
55
+ const today = new Date();
56
+ const thirtyDaysAgo = new Date(today.setDate(today.getDate() - 7));
57
+ this._tryMergeCurrentTime(thirtyDaysAgo);
58
+ this._onDateSelected({ date: thirtyDaysAgo, selected: true, type: 'date' });
59
+ }
40
60
  _onClear() {
41
61
  this._onDateSelected({ date: null, selected: false, type: 'date' });
42
62
  }
@@ -6,12 +6,14 @@
6
6
  export declare class DatePickerRange implements IDatePickerRange {
7
7
  from?: Date | string | null;
8
8
  to?: Date | string | null;
9
+ rangeName?: string | null | undefined;
9
10
  constructor(range?: IDatePickerRange);
10
11
  copy(): DatePickerRange;
11
12
  }
12
13
  export interface IDatePickerRange {
13
14
  from?: Date | string | null;
14
15
  to?: Date | string | null;
16
+ rangeName?: string | null | undefined;
15
17
  }
16
18
  export declare const DATE_RANGE_PICKER_CONSTANTS: {
17
19
  elementName: "forge-date-range-picker";
@@ -31,4 +33,5 @@ export declare const DATE_RANGE_PICKER_CONSTANTS: {
31
33
  };
32
34
  };
33
35
  export interface IDateRangePickerChangeEventData extends DatePickerRange {
36
+ rangeName?: string | null | undefined;
34
37
  }
@@ -10,6 +10,7 @@ export class DatePickerRange {
10
10
  if (range) {
11
11
  this.from = range.from;
12
12
  this.to = range.to;
13
+ this.rangeName = range.rangeName;
13
14
  }
14
15
  }
15
16
  copy() {
@@ -32,6 +32,9 @@ export declare class DateRangePickerCore extends BaseDatePickerCore<IDateRangePi
32
32
  protected _emitOpenEvent(): void;
33
33
  protected _emitCloseEvent(): void;
34
34
  protected _onToday(): void;
35
+ protected _onYesterday(): void;
36
+ protected _onLastSevenDays(): void;
37
+ protected _onLastThirtyDays(): void;
35
38
  protected _onClear(): void;
36
39
  protected _getCurrentValue(): IDatePickerRange | null | undefined;
37
40
  private _applyToMask;
@@ -65,7 +65,8 @@ export class DateRangePickerCore extends BaseDatePickerCore {
65
65
  _emitChangeEvent(value, force) {
66
66
  const typedStartValue = this._getTypedValue((value && value.from) || null);
67
67
  const typedEndValue = this._getTypedValue((value && value.to) || null);
68
- const detail = new DatePickerRange({ from: typedStartValue, to: typedEndValue });
68
+ const rangeName = (value && value.rangeName) || null;
69
+ const detail = new DatePickerRange({ from: typedStartValue, to: typedEndValue, rangeName });
69
70
  const wasCancelled = !this._adapter.emitHostEvent(DATE_RANGE_PICKER_CONSTANTS.events.CHANGE, detail, true, !force);
70
71
  if (!wasCancelled) {
71
72
  this._setValue(this._coerceDateValue((value && value.from) || null));
@@ -81,9 +82,14 @@ export class DateRangePickerCore extends BaseDatePickerCore {
81
82
  this._adapter.emitHostEvent(DATE_RANGE_PICKER_CONSTANTS.events.CLOSE, undefined, false);
82
83
  }
83
84
  _onToday() {
85
+ this._onClear();
84
86
  const today = new Date();
87
+ const todayFrom = new Date();
88
+ todayFrom.setHours(0, 0, 0, 0);
85
89
  this._tryMergeCurrentTime({ from: today });
86
- const range = this._open ? new DateRange({ from: this._from || today, to: this._to || undefined }) : new DateRange({ from: today });
90
+ const range = this._open
91
+ ? new DateRange({ from: this._from || todayFrom, to: this._to || today, rangeName: 'today' })
92
+ : new DateRange({ from: todayFrom, to: today, rangeName: 'today' });
87
93
  if (!this._isDateRangeAcceptable(range)) {
88
94
  return;
89
95
  }
@@ -91,6 +97,60 @@ export class DateRangePickerCore extends BaseDatePickerCore {
91
97
  this._onDateSelected({ date: today, range, selected: true, type: 'date' });
92
98
  this._adapter.setCalendarActiveDate(today);
93
99
  }
100
+ _onYesterday() {
101
+ this._onClear();
102
+ const today = new Date();
103
+ const yesterdayFrom = new Date(today.setDate(today.getDate() - 1));
104
+ yesterdayFrom.setHours(0, 0, 0, 0);
105
+ const yesterdayTo = new Date(yesterdayFrom);
106
+ yesterdayTo.setHours(23, 59, 59, 0);
107
+ this._tryMergeCurrentTime({ from: yesterdayFrom, to: yesterdayTo });
108
+ const range = this._open
109
+ ? new DateRange({ from: this._from || yesterdayFrom, to: this._to || yesterdayTo, rangeName: 'yesterday' })
110
+ : new DateRange({ from: yesterdayFrom, to: yesterdayTo, rangeName: 'yesterday' });
111
+ if (!this._isDateRangeAcceptable(range)) {
112
+ return;
113
+ }
114
+ this.value = range;
115
+ this._onDateSelected({ date: yesterdayFrom, range, selected: true, type: 'date' });
116
+ this._adapter.setCalendarActiveDate(yesterdayFrom);
117
+ }
118
+ _onLastSevenDays() {
119
+ this._onClear();
120
+ const today = new Date();
121
+ const lastSevenDaysFrom = new Date(today.setDate(today.getDate() - 7));
122
+ lastSevenDaysFrom.setHours(0, 0, 0, 0);
123
+ const lastSevenDaysTo = new Date();
124
+ lastSevenDaysTo.setHours(23, 59, 59, 0);
125
+ this._tryMergeCurrentTime({ from: lastSevenDaysFrom, to: lastSevenDaysTo });
126
+ const range = this._open
127
+ ? new DateRange({ from: this._from || lastSevenDaysFrom, to: this._to || lastSevenDaysTo, rangeName: 'last 7 days' })
128
+ : new DateRange({ from: lastSevenDaysFrom, to: lastSevenDaysTo, rangeName: 'last 7 days' });
129
+ if (!this._isDateRangeAcceptable(range)) {
130
+ return;
131
+ }
132
+ this.value = range;
133
+ this._onDateSelected({ date: lastSevenDaysFrom, range, selected: true, rangeSelectionState: 'from', type: 'date' });
134
+ this._onDateSelected({ date: lastSevenDaysTo, range, selected: true, rangeSelectionState: 'to', type: 'date' });
135
+ }
136
+ _onLastThirtyDays() {
137
+ this._onClear();
138
+ const today = new Date();
139
+ const lastThirtyDaysFrom = new Date(today.setDate(today.getDate() - 30));
140
+ lastThirtyDaysFrom.setHours(0, 0, 0, 0);
141
+ const lastThirtyDaysTo = new Date();
142
+ lastThirtyDaysTo.setHours(23, 59, 59, 0);
143
+ this._tryMergeCurrentTime({ from: lastThirtyDaysFrom, to: lastThirtyDaysTo });
144
+ const range = this._open
145
+ ? new DateRange({ from: this._from || lastThirtyDaysFrom, to: this._to || lastThirtyDaysTo, rangeName: 'last 30 days' })
146
+ : new DateRange({ from: lastThirtyDaysFrom, to: lastThirtyDaysTo, rangeName: 'last 30 days' });
147
+ if (!this._isDateRangeAcceptable(range)) {
148
+ return;
149
+ }
150
+ this.value = range;
151
+ this._onDateSelected({ date: lastThirtyDaysFrom, range, selected: true, rangeSelectionState: 'from', type: 'date' });
152
+ this._onDateSelected({ date: lastThirtyDaysTo, range, selected: true, rangeSelectionState: 'to', type: 'date' });
153
+ }
94
154
  _onClear() {
95
155
  this._onDateSelected({ date: null, range: new DateRange(), selected: false, type: 'date' });
96
156
  this._closeCalendar(true);
@@ -44,6 +44,9 @@ declare global {
44
44
  * @property {boolean} [notifyInputValueChanges=false] - Gets/sets the state of whether to notify input value changes.
45
45
  * @property {boolean} [allowInvalidDate=false] - Gets/sets the state of whether to allow invalid dates.
46
46
  * @property {boolean} [showToday=true] - Gets/sets the state of whether to show the "Today" button.
47
+ * @property {boolean} [showYesterday=true] - Gets/sets the state of whether to show the "Yesterday" button.
48
+ * @property {boolean} [showLastSevenDays=true] Gets/sets the state of whether to show the "Last 7 days" button.
49
+ * @property {boolean} [showLastThirtyDays=true] Gets/sets the state of whether to show the "Last 30 days" button.
47
50
  * @property {boolean} [showClear=true] - Gets/sets the state of whether to show the "Clear" button.
48
51
  * @property {DayOfWeek[]} [disabledDaysOfWeek=[]] - Gets/sets the disabled days of the week.
49
52
  * @property {string} [yearRange=''] - Gets/sets the year range for the date range picker.
@@ -40,6 +40,9 @@ const styles = ':host{display:block}:host([hidden]){display:none}';
40
40
  * @property {boolean} [notifyInputValueChanges=false] - Gets/sets the state of whether to notify input value changes.
41
41
  * @property {boolean} [allowInvalidDate=false] - Gets/sets the state of whether to allow invalid dates.
42
42
  * @property {boolean} [showToday=true] - Gets/sets the state of whether to show the "Today" button.
43
+ * @property {boolean} [showYesterday=true] - Gets/sets the state of whether to show the "Yesterday" button.
44
+ * @property {boolean} [showLastSevenDays=true] Gets/sets the state of whether to show the "Last 7 days" button.
45
+ * @property {boolean} [showLastThirtyDays=true] Gets/sets the state of whether to show the "Last 30 days" button.
43
46
  * @property {boolean} [showClear=true] - Gets/sets the state of whether to show the "Clear" button.
44
47
  * @property {DayOfWeek[]} [disabledDaysOfWeek=[]] - Gets/sets the disabled days of the week.
45
48
  * @property {string} [yearRange=''] - Gets/sets the year range for the date range picker.
@@ -13,7 +13,7 @@ import { SplitViewPanelCore } from './split-view-panel-core';
13
13
  import { SplitViewPanelAdapter } from './split-view-panel-adapter';
14
14
  import { IconComponent, IconRegistry } from '../../icon';
15
15
  const template = '<template><div class=\"forge-split-view-panel\" id=\"root\" part=\"root\"><div class=\"forge-split-view-panel__handle\" id=\"handle\" part=\"handle\" role=\"separator\" aria-controls=\"content\" aria-grabbed=\"false\" tabindex=\"0\"><forge-icon class=\"forge-split-view-panel__icon\" id=\"icon\" part=\"icon\"></forge-icon><forge-state-layer target=\"handle\" id=\"state-layer\" exportparts=\"surface:state-layer\"></forge-state-layer><forge-focus-indicator inward target=\"handle\" part=\"focus-indicator\"></forge-focus-indicator></div><div class=\"forge-split-view-panel__content\" id=\"content\" part=\"content\" role=\"group\"><slot></slot></div></div></template>';
16
- const styles = '.forge-split-view-panel{display:flex;width:100%;height:100%;overflow:hidden}.forge-split-view-panel__handle{color:var(--forge-theme-text-medium,rgba(0,0,0,.6));background-color:var(--forge-theme-outline,#e0e0e0);position:relative;display:flex;flex-shrink:0;justify-content:center;align-items:center;outline:0}.forge-split-view-panel__content{flex:1;overflow:hidden}.forge-split-view-panel--closed{display:none}.forge-split-view-panel--disabled #handle{pointer-events:none}.forge-split-view-panel--disabled .forge-split-view-panel__icon{display:none}.forge-split-view-panel[orientation=horizontal]{min-width:var(--forge-split-view-handle-width,8px);width:calc(var(--forge-split-view-panel-size,unset) + var(--forge-split-view-handle-width,8px));flex-direction:row}.forge-split-view-panel[orientation=horizontal] .forge-split-view-panel__handle{width:var(--forge-split-view-handle-width,8px);cursor:var(--forge-split-view-panel-cursor)}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=end]{position:absolute;top:0;left:0;animation-name:uez234f;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uez234f{from{transform:none}to{transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=start]{position:absolute;top:0;right:0;animation-name:uez234v;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uez234v{from{transform:none}to{transform:translateX(100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;animation-name:uez235n;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uez235n{from{transform:none}to{transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=start]{position:absolute;top:0;right:0;animation-name:uez236i;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uez236i{from{transform:none}to{transform:translateX(100%)}}.forge-split-view-panel[orientation=vertical]{min-height:var(--forge-split-view-handle-width,8px);height:calc(var(--forge-split-view-panel-size,unset) + var(--forge-split-view-handle-width,8px));flex-direction:column}.forge-split-view-panel[orientation=vertical] .forge-split-view-panel__handle{height:var(--forge-split-view-handle-width,8px);cursor:var(--forge-split-view-panel-cursor)}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=end]{position:absolute;top:0;left:0;animation-name:uez236l;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uez236l{from{transform:none}to{transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=start]{position:absolute;bottom:0;left:0;animation-name:uez237k;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uez237k{from{transform:none}to{transform:translateY(100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;animation-name:uez237p;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uez237p{from{transform:none}to{transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=start]{position:absolute;bottom:0;left:0;animation-name:uez2389;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uez2389{from{transform:none}to{transform:translateY(100%)}}:host{z-index:var(--forge-split-view-animating-layer)!important;display:block;position:relative;height:100%;width:100%;flex:0}:host([hidden]){display:none}:host(:not([resizable=start],[resizable=end])){flex:1}:host(:not([resizable=start],[resizable=end])) .forge-split-view-panel{width:100%;height:100%;min-width:0;min-height:0}:host(:not([resizable=start],[resizable=end])) .forge-split-view-panel__handle{display:none}forge-focus-indicator{--forge-focus-indicator-active-width:2px}';
16
+ const styles = '.forge-split-view-panel{display:flex;width:100%;height:100%;overflow:hidden}.forge-split-view-panel__handle{color:var(--forge-theme-text-medium,rgba(0,0,0,.6));background-color:var(--forge-theme-outline,#e0e0e0);position:relative;display:flex;flex-shrink:0;justify-content:center;align-items:center;outline:0}.forge-split-view-panel__content{flex:1;overflow:hidden}.forge-split-view-panel--closed{display:none}.forge-split-view-panel--disabled #handle{pointer-events:none}.forge-split-view-panel--disabled .forge-split-view-panel__icon{display:none}.forge-split-view-panel[orientation=horizontal]{min-width:var(--forge-split-view-handle-width,8px);width:calc(var(--forge-split-view-panel-size,unset) + var(--forge-split-view-handle-width,8px));flex-direction:row}.forge-split-view-panel[orientation=horizontal] .forge-split-view-panel__handle{width:var(--forge-split-view-handle-width,8px);cursor:var(--forge-split-view-panel-cursor)}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=end]{position:absolute;top:0;left:0;animation-name:uaukume;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uaukume{from{transform:none}to{transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=start]{position:absolute;top:0;right:0;animation-name:uaukumo;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uaukumo{from{transform:none}to{transform:translateX(100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;animation-name:uaukung;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uaukung{from{transform:none}to{transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=start]{position:absolute;top:0;right:0;animation-name:uaukunu;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uaukunu{from{transform:none}to{transform:translateX(100%)}}.forge-split-view-panel[orientation=vertical]{min-height:var(--forge-split-view-handle-width,8px);height:calc(var(--forge-split-view-panel-size,unset) + var(--forge-split-view-handle-width,8px));flex-direction:column}.forge-split-view-panel[orientation=vertical] .forge-split-view-panel__handle{height:var(--forge-split-view-handle-width,8px);cursor:var(--forge-split-view-panel-cursor)}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=end]{position:absolute;top:0;left:0;animation-name:uaukuod;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uaukuod{from{transform:none}to{transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=start]{position:absolute;bottom:0;left:0;animation-name:uaukup9;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1))}@keyframes uaukup9{from{transform:none}to{transform:translateY(100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;animation-name:uaukupi;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uaukupi{from{transform:none}to{transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=start]{position:absolute;bottom:0;left:0;animation-name:uaukupq;animation-duration:var(--forge-animation-duration-medium2, 300ms);animation-timing-function:var(--forge-animation-easing-standard,cubic-bezier(0.2,0,0,1));animation-direction:reverse}@keyframes uaukupq{from{transform:none}to{transform:translateY(100%)}}:host{z-index:var(--forge-split-view-animating-layer)!important;display:block;position:relative;height:100%;width:100%;flex:0}:host([hidden]){display:none}:host(:not([resizable=start],[resizable=end])){flex:1}:host(:not([resizable=start],[resizable=end])) .forge-split-view-panel{width:100%;height:100%;min-width:0;min-height:0}:host(:not([resizable=start],[resizable=end])) .forge-split-view-panel__handle{display:none}forge-focus-indicator{--forge-focus-indicator-active-width:2px}';
17
17
  import { StateLayerComponent } from '../../state-layer';
18
18
  import { FocusIndicatorComponent } from '../../focus-indicator';
19
19
  /**
@@ -29,6 +29,7 @@ export declare class TabBarCore implements ITabBarCore {
29
29
  private _inverted;
30
30
  private _autoActivate;
31
31
  private _scrollButtons;
32
+ private _tabs;
32
33
  private _scrollButtonsVisible;
33
34
  private _tabScrollAnimationFrame;
34
35
  private _tabsChangedListener;
@@ -18,6 +18,7 @@ export class TabBarCore {
18
18
  this._inverted = false;
19
19
  this._autoActivate = false;
20
20
  this._scrollButtons = false;
21
+ this._tabs = [];
21
22
  this._scrollButtonsVisible = false;
22
23
  this._tabsChangedListener = () => this._onTabsChanged();
23
24
  this._tabSelectedListener = (evt) => this._onTabSelected(evt);
@@ -37,7 +38,7 @@ export class TabBarCore {
37
38
  this._adapter.initializeScrollObserver(this._scrollListener);
38
39
  this._updateScrollState();
39
40
  }
40
- this._syncTabState();
41
+ this._tryScrollActiveTabIntoView();
41
42
  this._isInitialized = true;
42
43
  }
43
44
  destroy() {
@@ -46,6 +47,7 @@ export class TabBarCore {
46
47
  this._isInitialized = false;
47
48
  }
48
49
  async _onTabsChanged() {
50
+ this._tabs = this._adapter.getTabs();
49
51
  this._syncTabState();
50
52
  if (this._scrollButtons) {
51
53
  this._detectScrollableStatus();
@@ -63,25 +65,24 @@ export class TabBarCore {
63
65
  }
64
66
  evt.preventDefault();
65
67
  let index = -1;
66
- const tabs = this._adapter.getTabs();
67
68
  if (evt.key === 'Home') {
68
69
  // Locate the first non-disabled tab
69
- index = tabs.findIndex(tab => !tab.disabled);
70
+ index = this._tabs.findIndex(tab => !tab.disabled);
70
71
  }
71
72
  else if (evt.key === 'End') {
72
73
  // Locate the last non-disabled tab
73
- index = tabs.reduceRight((acc, tab, i) => (!tab.disabled && acc === -1 ? i : acc), -1);
74
+ index = this._tabs.reduceRight((acc, tab, i) => (!tab.disabled && acc === -1 ? i : acc), -1);
74
75
  }
75
76
  else {
76
77
  // Locate the next or previous tab based on the key that was pressed
77
- const currentIndex = tabs.findIndex(tab => tab.matches(':focus'));
78
+ const currentIndex = this._tabs.findIndex(tab => tab.matches(':focus'));
78
79
  const isPrevKey = evt.key === 'ArrowLeft' || evt.key === 'ArrowUp';
79
80
  const calcIndex = (startIndex) => {
80
81
  index = startIndex + (isPrevKey ? -1 : 1);
81
- index = index < 0 ? tabs.length - 1 : index % tabs.length;
82
+ index = index < 0 ? this._tabs.length - 1 : index % this._tabs.length;
82
83
  // Try to recurse until we find a non-disabled tab (unless all tabs are disabled already)
83
- const isAllTabsDisabled = tabs.every(tab => tab.disabled);
84
- if (!isAllTabsDisabled && tabs[index]?.disabled) {
84
+ const isAllTabsDisabled = this._tabs.every(tab => tab.disabled);
85
+ if (!isAllTabsDisabled && this._tabs[index]?.disabled) {
85
86
  calcIndex(index);
86
87
  }
87
88
  };
@@ -91,24 +92,23 @@ export class TabBarCore {
91
92
  return;
92
93
  }
93
94
  if (this._autoActivate) {
94
- this._selectTab({ tab: tabs[index], focusTab: true });
95
+ this._selectTab({ tab: this._tabs[index], focusTab: true });
95
96
  }
96
97
  else {
97
- tabs[index].focus({ preventScroll: true, focusVisible: true });
98
- await this._adapter.tryScrollTabIntoView(tabs[index]);
98
+ this._tabs[index].focus({ preventScroll: true, focusVisible: true });
99
+ await this._adapter.tryScrollTabIntoView(this._tabs[index]);
99
100
  }
100
101
  }
101
102
  async _selectTab({ tab, emitEvent = true, focusTab = false }) {
102
103
  if (!tab || tab.disabled) {
103
104
  return;
104
105
  }
105
- const tabs = this._adapter.getTabs();
106
- const currentSelectedTab = tabs.find(t => t.selected);
106
+ const currentSelectedTab = this._tabs.find(t => t.selected);
107
107
  if (currentSelectedTab === tab) {
108
108
  return;
109
109
  }
110
110
  if (emitEvent) {
111
- const index = tabs.indexOf(tab);
111
+ const index = this._tabs.indexOf(tab);
112
112
  const event = new CustomEvent(TAB_BAR_CONSTANTS.events.CHANGE, {
113
113
  detail: { index },
114
114
  bubbles: true,
@@ -132,7 +132,7 @@ export class TabBarCore {
132
132
  if (currentSelectedTab) {
133
133
  currentSelectedTab.selected = false;
134
134
  }
135
- this._activeTab = tabs.indexOf(tab);
135
+ this._activeTab = this._tabs.indexOf(tab);
136
136
  }
137
137
  /**
138
138
  * Ensures that all tabs have the correct state based on the tab bar state.
@@ -140,14 +140,13 @@ export class TabBarCore {
140
140
  * This is called whenever a child tab is added to the DOM.
141
141
  */
142
142
  _syncTabState() {
143
- const tabs = this._adapter.getTabs();
144
- tabs.forEach((tab, index) => {
143
+ this._tabs.forEach((tab, index) => {
145
144
  tab.selected = index === this._activeTab;
146
- if (this._disabled) {
145
+ if (this._disabled)
147
146
  tab.disabled = this._disabled;
148
- }
149
147
  tab.vertical = this._vertical;
150
148
  tab.stacked = this._stacked;
149
+ tab.secondary = this._secondary;
151
150
  tab.inverted = this._inverted;
152
151
  });
153
152
  }
@@ -200,11 +199,10 @@ export class TabBarCore {
200
199
  }
201
200
  // We batch the tab scrolling into a single animation frame to unnecessarily scrolling for each tab
202
201
  this._tabScrollAnimationFrame = window.requestAnimationFrame(() => {
203
- const tabs = this._adapter.getTabs();
204
202
  this._tabScrollAnimationFrame = undefined;
205
203
  if (this._adapter.isScrollable()) {
206
- if (typeof this._activeTab === 'number' && this._activeTab >= 0 && tabs[this._activeTab]) {
207
- this._adapter.tryScrollTabIntoView(tabs[this._activeTab]);
204
+ if (typeof this._activeTab === 'number' && this._activeTab >= 0 && this._tabs[this._activeTab]) {
205
+ this._adapter.tryScrollTabIntoView(this._tabs[this._activeTab]);
208
206
  }
209
207
  }
210
208
  });
@@ -216,7 +214,7 @@ export class TabBarCore {
216
214
  value = Boolean(value);
217
215
  if (this._disabled !== value) {
218
216
  this._disabled = value;
219
- this._adapter.getTabs().forEach(tab => (tab.disabled = this._disabled));
217
+ this._tabs.forEach(tab => (tab.disabled = this._disabled));
220
218
  this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.DISABLED, this._disabled);
221
219
  }
222
220
  }
@@ -226,14 +224,13 @@ export class TabBarCore {
226
224
  set activeTab(value) {
227
225
  if (this._activeTab !== value) {
228
226
  this._activeTab = value ?? undefined;
229
- const tabs = this._adapter.getTabs();
230
227
  if (typeof this._activeTab === 'number') {
231
- const newSelectedTab = tabs[this._activeTab];
228
+ const newSelectedTab = this._tabs[this._activeTab];
232
229
  this._selectTab({ tab: newSelectedTab, emitEvent: false, focusTab: false });
233
230
  this._adapter.setHostAttribute(TAB_BAR_CONSTANTS.attributes.ACTIVE_TAB, String(this._activeTab));
234
231
  }
235
232
  else {
236
- tabs.forEach(tab => (tab.selected = false));
233
+ this._tabs.forEach(tab => (tab.selected = false));
237
234
  this._adapter.removeHostAttribute(TAB_BAR_CONSTANTS.attributes.ACTIVE_TAB);
238
235
  }
239
236
  }
@@ -248,7 +245,7 @@ export class TabBarCore {
248
245
  if (this._isInitialized) {
249
246
  this._adapter.setVertical(this._vertical);
250
247
  }
251
- this._adapter.getTabs().forEach(tab => (tab.vertical = this._vertical));
248
+ this._tabs.forEach(tab => (tab.vertical = this._vertical));
252
249
  if (this._scrollButtonsVisible) {
253
250
  this._adapter.updateScrollButtonIcons(this._vertical);
254
251
  }
@@ -272,7 +269,7 @@ export class TabBarCore {
272
269
  value = Boolean(value);
273
270
  if (this._stacked !== value) {
274
271
  this._stacked = value;
275
- this._adapter.getTabs().forEach(tab => (tab.stacked = this._stacked));
272
+ this._tabs.forEach(tab => (tab.stacked = this._stacked));
276
273
  this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.STACKED, this._stacked);
277
274
  }
278
275
  }
@@ -283,7 +280,7 @@ export class TabBarCore {
283
280
  value = Boolean(value);
284
281
  if (this._secondary !== value) {
285
282
  this._secondary = value;
286
- this._adapter.getTabs().forEach(tab => (tab.secondary = this._secondary));
283
+ this._tabs.forEach(tab => (tab.secondary = this._secondary));
287
284
  this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.SECONDARY, this._secondary);
288
285
  }
289
286
  }
@@ -294,7 +291,7 @@ export class TabBarCore {
294
291
  value = Boolean(value);
295
292
  if (this._inverted !== value) {
296
293
  this._inverted = value;
297
- this._adapter.getTabs().forEach(tab => (tab.inverted = this._inverted));
294
+ this._tabs.forEach(tab => (tab.inverted = this._inverted));
298
295
  this._adapter.toggleHostAttribute(TAB_BAR_CONSTANTS.attributes.INVERTED, this._inverted);
299
296
  }
300
297
  }