@tylertech/forge 2.19.1 → 2.20.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 (93) hide show
  1. package/custom-elements.json +120 -20
  2. package/dist/esm/app-bar/help-button/index.js +1 -1
  3. package/dist/esm/app-bar/index.js +1 -1
  4. package/dist/esm/autocomplete/index.js +1 -1
  5. package/dist/esm/chip-field/index.js +1 -1
  6. package/dist/esm/chunks/{chunk.P4VJUJQN.js → chunk.2T6HVSO4.js} +2 -2
  7. package/dist/esm/chunks/{chunk.JMRXBELV.js → chunk.2VWASAUU.js} +2 -2
  8. package/dist/esm/chunks/{chunk.JMRXBELV.js.map → chunk.2VWASAUU.js.map} +3 -3
  9. package/dist/esm/chunks/{chunk.IASYHPZ4.js → chunk.4E4ZOFQI.js} +2 -2
  10. package/dist/esm/chunks/{chunk.IASYHPZ4.js.map → chunk.4E4ZOFQI.js.map} +1 -1
  11. package/dist/esm/chunks/{chunk.54KXJVRY.js → chunk.4HWB754J.js} +2 -2
  12. package/dist/esm/chunks/{chunk.GEWDZDXN.js → chunk.6G4DOKR2.js} +2 -2
  13. package/dist/esm/chunks/{chunk.GEWDZDXN.js.map → chunk.6G4DOKR2.js.map} +3 -3
  14. package/dist/esm/chunks/{chunk.2EAQ36QO.js → chunk.FCTKNIBN.js} +2 -2
  15. package/dist/esm/chunks/{chunk.2EAQ36QO.js.map → chunk.FCTKNIBN.js.map} +2 -2
  16. package/dist/esm/chunks/{chunk.XAPKK4ZJ.js → chunk.G6GRI7UL.js} +2 -2
  17. package/dist/esm/chunks/{chunk.ZDTJPNFM.js → chunk.HGGP6G7L.js} +2 -2
  18. package/dist/esm/chunks/chunk.IX2UHMIM.js +7 -0
  19. package/dist/esm/chunks/chunk.IX2UHMIM.js.map +7 -0
  20. package/dist/esm/chunks/{chunk.P67RC5S3.js → chunk.L3SL4NW6.js} +2 -2
  21. package/dist/esm/chunks/chunk.L52XPVYZ.js +7 -0
  22. package/dist/esm/chunks/chunk.L52XPVYZ.js.map +7 -0
  23. package/dist/esm/chunks/{chunk.3NHRJPT4.js → chunk.LM57IEFE.js} +2 -2
  24. package/dist/esm/chunks/{chunk.BJRQ67AD.js → chunk.M2ATVI24.js} +2 -2
  25. package/dist/esm/chunks/{chunk.PAH2OIYV.js → chunk.O7IKUHRR.js} +2 -2
  26. package/dist/esm/chunks/{chunk.23QPY6PU.js → chunk.SZNMBPMR.js} +1 -1
  27. package/dist/esm/chunks/{chunk.23QPY6PU.js.map → chunk.SZNMBPMR.js.map} +2 -2
  28. package/dist/esm/chunks/chunk.XY3WCDVX.js +7 -0
  29. package/dist/esm/chunks/chunk.XY3WCDVX.js.map +7 -0
  30. package/dist/esm/chunks/chunk.ZWL2Q7E6.js +7 -0
  31. package/dist/esm/chunks/chunk.ZWL2Q7E6.js.map +7 -0
  32. package/dist/esm/date-picker/index.js +1 -1
  33. package/dist/esm/date-range-picker/index.js +1 -1
  34. package/dist/esm/index.js +1 -1
  35. package/dist/esm/label-value/index.js +1 -1
  36. package/dist/esm/menu/index.js +1 -1
  37. package/dist/esm/paginator/index.js +1 -1
  38. package/dist/esm/quantity-field/index.js +1 -1
  39. package/dist/esm/select/core/index.js +1 -1
  40. package/dist/esm/select/index.js +1 -1
  41. package/dist/esm/select/select/index.js +1 -1
  42. package/dist/esm/select/select-dropdown/index.js +1 -1
  43. package/dist/esm/split-view/index.js +1 -1
  44. package/dist/esm/split-view/split-view/index.js +1 -1
  45. package/dist/esm/split-view/split-view-panel/index.js +1 -1
  46. package/dist/esm/stepper/index.js +1 -1
  47. package/dist/esm/stepper/stepper/index.js +1 -1
  48. package/dist/esm/table/index.js +1 -1
  49. package/dist/esm/text-field/index.js +1 -1
  50. package/dist/esm/time-picker/index.js +1 -1
  51. package/dist/forge.css +1 -1
  52. package/dist/table/forge-table.css +1 -1
  53. package/esm/autocomplete/autocomplete-foundation.js +2 -2
  54. package/esm/chip-field/chip-field-constants.d.ts +3 -0
  55. package/esm/chip-field/chip-field-constants.js +4 -0
  56. package/esm/chip-field/chip-field-foundation.d.ts +5 -0
  57. package/esm/chip-field/chip-field-foundation.js +20 -1
  58. package/esm/chip-field/chip-field.d.ts +5 -0
  59. package/esm/chip-field/chip-field.js +19 -1
  60. package/esm/field/field-constants.d.ts +8 -0
  61. package/esm/field/field-constants.js +10 -8
  62. package/esm/menu/menu-foundation.js +0 -4
  63. package/esm/paginator/paginator-adapter.d.ts +4 -2
  64. package/esm/paginator/paginator-adapter.js +21 -8
  65. package/esm/paginator/paginator-foundation.d.ts +2 -0
  66. package/esm/paginator/paginator-foundation.js +19 -16
  67. package/esm/paginator/paginator.d.ts +1 -0
  68. package/esm/paginator/paginator.js +3 -0
  69. package/esm/select/core/base-select-foundation.js +3 -1
  70. package/esm/split-view/split-view-panel/split-view-panel.js +1 -1
  71. package/esm/stepper/stepper/stepper-foundation.js +1 -1
  72. package/esm/table/table-foundation.d.ts +2 -0
  73. package/esm/table/table-foundation.js +17 -6
  74. package/esm/table/table-utils.js +13 -1
  75. package/esm/table/types.d.ts +1 -0
  76. package/package.json +1 -1
  77. package/styles/table/_mixins.scss +20 -2
  78. package/dist/esm/chunks/chunk.GO5A4GKZ.js +0 -7
  79. package/dist/esm/chunks/chunk.GO5A4GKZ.js.map +0 -7
  80. package/dist/esm/chunks/chunk.PBWUHK7Q.js +0 -7
  81. package/dist/esm/chunks/chunk.PBWUHK7Q.js.map +0 -7
  82. package/dist/esm/chunks/chunk.PILDKQOE.js +0 -7
  83. package/dist/esm/chunks/chunk.PILDKQOE.js.map +0 -7
  84. package/dist/esm/chunks/chunk.ROWBKHIO.js +0 -7
  85. package/dist/esm/chunks/chunk.ROWBKHIO.js.map +0 -7
  86. /package/dist/esm/chunks/{chunk.P4VJUJQN.js.map → chunk.2T6HVSO4.js.map} +0 -0
  87. /package/dist/esm/chunks/{chunk.54KXJVRY.js.map → chunk.4HWB754J.js.map} +0 -0
  88. /package/dist/esm/chunks/{chunk.XAPKK4ZJ.js.map → chunk.G6GRI7UL.js.map} +0 -0
  89. /package/dist/esm/chunks/{chunk.ZDTJPNFM.js.map → chunk.HGGP6G7L.js.map} +0 -0
  90. /package/dist/esm/chunks/{chunk.P67RC5S3.js.map → chunk.L3SL4NW6.js.map} +0 -0
  91. /package/dist/esm/chunks/{chunk.3NHRJPT4.js.map → chunk.LM57IEFE.js.map} +0 -0
  92. /package/dist/esm/chunks/{chunk.BJRQ67AD.js.map → chunk.M2ATVI24.js.map} +0 -0
  93. /package/dist/esm/chunks/{chunk.PAH2OIYV.js.map → chunk.O7IKUHRR.js.map} +0 -0
@@ -12,6 +12,14 @@ export declare const FIELD_CONSTANTS: {
12
12
  REQUIRED: string;
13
13
  HOST_LABEL_FLOATING: string;
14
14
  };
15
+ observedAttributes: {
16
+ DENSITY: string;
17
+ FLOAT_LABEL_TYPE: string;
18
+ SHAPE: string;
19
+ INVALID: string;
20
+ REQUIRED: string;
21
+ HOST_LABEL_FLOATING: string;
22
+ };
15
23
  observedInputAttributes: string[];
16
24
  selectors: {
17
25
  INPUT: string;
@@ -3,14 +3,6 @@
3
3
  * Copyright 2023 Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
- const attributes = {
7
- DENSITY: 'density',
8
- FLOAT_LABEL_TYPE: 'float-label-type',
9
- SHAPE: 'shape',
10
- INVALID: 'invalid',
11
- REQUIRED: 'required',
12
- HOST_LABEL_FLOATING: `forge-label-floating`
13
- };
14
6
  const selectors = {
15
7
  INPUT: 'input,textarea'
16
8
  };
@@ -32,8 +24,18 @@ const classes = {
32
24
  ROOMY: 'forge-field--roomy',
33
25
  LABEL: 'forge-field--label'
34
26
  };
27
+ const observedAttributes = {
28
+ DENSITY: 'density',
29
+ FLOAT_LABEL_TYPE: 'float-label-type',
30
+ SHAPE: 'shape',
31
+ INVALID: 'invalid',
32
+ REQUIRED: 'required',
33
+ HOST_LABEL_FLOATING: `forge-label-floating`
34
+ };
35
+ const attributes = Object.assign({}, observedAttributes);
35
36
  export const FIELD_CONSTANTS = {
36
37
  attributes,
38
+ observedAttributes,
37
39
  observedInputAttributes,
38
40
  selectors,
39
41
  classes
@@ -413,8 +413,6 @@ export class MenuFoundation extends CascadingListDropdownAwareFoundation {
413
413
  else {
414
414
  this.optionsFactory = undefined;
415
415
  // Intentional shallow copy of member properties. These member objects have properties that are references to functions.
416
- // The typical JSON.parse(JSON.stringify(object)) will not work here. If this becomes an issue we'll add a deepClone
417
- // function to the core library.
418
416
  this._options = options.map(o => (Object.assign({}, o)));
419
417
  if (this._open) {
420
418
  this._mapIconToLeadingIcon();
@@ -433,8 +431,6 @@ export class MenuFoundation extends CascadingListDropdownAwareFoundation {
433
431
  return [];
434
432
  }
435
433
  // Intentional shallow copy of member properties. These member objects have properties that are references to functions.
436
- // The typical JSON.parse(JSON.stringify(object)) will not work here. If this becomes an issue we'll add a deepClone
437
- // function to the core library.
438
434
  return this._flatOptions.map(o => (Object.assign({}, o)));
439
435
  }
440
436
  set optionsFactory(factory) {
@@ -42,7 +42,8 @@ export interface IPaginatorAdapter extends IBaseAdapter {
42
42
  enableLastPageButton(): void;
43
43
  setAlternative(alternative: boolean): void;
44
44
  setAlignment(alignment: PaginatorAlternativeAlignment): void;
45
- handleFocusMove(from: PaginatorFieldIdentifier): void;
45
+ hasFocus(): boolean;
46
+ handleFocusMove(from?: PaginatorFieldIdentifier | null, options?: FocusOptions): void;
46
47
  }
47
48
  /**
48
49
  * Provides facilities for interacting with the internal DOM of `PaginatorComponent`.
@@ -95,6 +96,7 @@ export declare class PaginatorAdapter extends BaseAdapter<IPaginatorComponent> i
95
96
  enableLastPageButton(): void;
96
97
  setAlternative(alternative: boolean): void;
97
98
  setAlignment(alignment: PaginatorAlternativeAlignment): void;
98
- handleFocusMove(from: PaginatorFieldIdentifier): void;
99
+ hasFocus(): boolean;
100
+ handleFocusMove(from?: PaginatorFieldIdentifier, options?: FocusOptions): void;
99
101
  private _tryFocus;
100
102
  }
@@ -146,8 +146,11 @@ export class PaginatorAdapter extends BaseAdapter {
146
146
  break;
147
147
  }
148
148
  }
149
- handleFocusMove(from) {
150
- if (!this._component.matches(':focus')) {
149
+ hasFocus() {
150
+ return this._component.matches(':focus');
151
+ }
152
+ handleFocusMove(from, options) {
153
+ if (from && !this.hasFocus()) {
151
154
  return; // We can only move focus elsewhere within the element if the element already contains focus
152
155
  }
153
156
  switch (from) {
@@ -157,7 +160,7 @@ export class PaginatorAdapter extends BaseAdapter {
157
160
  this._lastPageButton,
158
161
  this._previousPageButton,
159
162
  this._pageSizeSelect
160
- ]);
163
+ ], options);
161
164
  break;
162
165
  case 'last':
163
166
  this._tryFocus([
@@ -165,7 +168,7 @@ export class PaginatorAdapter extends BaseAdapter {
165
168
  this._firstPageButton,
166
169
  this._nextPageButton,
167
170
  this._pageSizeSelect
168
- ]);
171
+ ], options);
169
172
  break;
170
173
  case 'previous':
171
174
  this._tryFocus([
@@ -181,7 +184,7 @@ export class PaginatorAdapter extends BaseAdapter {
181
184
  this._firstPageButton,
182
185
  this._lastPageButton,
183
186
  this._pageSizeSelect
184
- ]);
187
+ ], options);
185
188
  break;
186
189
  case 'page-size':
187
190
  this._tryFocus([
@@ -189,14 +192,24 @@ export class PaginatorAdapter extends BaseAdapter {
189
192
  this._lastPageButton,
190
193
  this._firstPageButton,
191
194
  this._previousPageButton
192
- ]);
195
+ ], options);
196
+ break;
197
+ default:
198
+ this._tryFocus([
199
+ this._firstPageButton,
200
+ this._previousPageButton,
201
+ this._nextPageButton,
202
+ this._lastPageButton,
203
+ this._pageSizeSelect
204
+ ], options);
193
205
  break;
194
206
  }
195
207
  }
196
- _tryFocus(elements) {
208
+ _tryFocus(elements, options) {
209
+ const preventScroll = typeof (options === null || options === void 0 ? void 0 : options.preventScroll) === 'boolean' ? options.preventScroll : true;
197
210
  for (const el of elements) {
198
211
  if (el && el.isConnected && !el.disabled) {
199
- el.focus();
212
+ el.focus(Object.assign(Object.assign({}, options), { preventScroll }));
200
213
  return;
201
214
  }
202
215
  }
@@ -13,6 +13,7 @@ export interface IPaginatorFoundation extends ICustomElementFoundation {
13
13
  total: number;
14
14
  pageSizeOptions: number[] | boolean;
15
15
  pageSizeLabel: string;
16
+ focus(options?: FocusOptions): void;
16
17
  }
17
18
  export declare class PaginatorFoundation {
18
19
  private _adapter;
@@ -36,6 +37,7 @@ export declare class PaginatorFoundation {
36
37
  constructor(_adapter: IPaginatorAdapter);
37
38
  initialize(): void;
38
39
  disconnect(): void;
40
+ focus(options?: FocusOptions): void;
39
41
  private _attachListeners;
40
42
  private _detachListeners;
41
43
  private _onFirstPage;
@@ -36,6 +36,9 @@ export class PaginatorFoundation {
36
36
  disconnect() {
37
37
  this._detachListeners();
38
38
  }
39
+ focus(options) {
40
+ this._adapter.handleFocusMove(null, options);
41
+ }
39
42
  _attachListeners() {
40
43
  this._adapter.attachPageSizeChangeListener(this._pageSizeListener);
41
44
  this._adapter.attachFirstPageListener(this._firstPageListener);
@@ -58,7 +61,7 @@ export class PaginatorFoundation {
58
61
  const firstPage = 0;
59
62
  const canPage = this._emitChangeEvent(PAGINATOR_CONSTANTS.strings.FIRST_PAGE, { pageIndex: firstPage });
60
63
  if (canPage) {
61
- this._applyPageIndex(firstPage, { fromField: 'first' });
64
+ this._applyPageIndex(firstPage);
62
65
  }
63
66
  }
64
67
  _onPreviousPage(evt) {
@@ -69,7 +72,7 @@ export class PaginatorFoundation {
69
72
  const prevPage = this._pageIndex - 1;
70
73
  const canPage = this._emitChangeEvent(PAGINATOR_CONSTANTS.strings.PREVIOUS_PAGE, { pageIndex: prevPage });
71
74
  if (canPage) {
72
- this._applyPageIndex(prevPage, { fromField: 'previous' });
75
+ this._applyPageIndex(prevPage);
73
76
  }
74
77
  }
75
78
  _onNextPage(evt) {
@@ -80,7 +83,7 @@ export class PaginatorFoundation {
80
83
  const nextPage = this._pageIndex + 1;
81
84
  const canPage = this._emitChangeEvent(PAGINATOR_CONSTANTS.strings.NEXT_PAGE, { pageIndex: nextPage });
82
85
  if (canPage) {
83
- this._applyPageIndex(nextPage, { fromField: 'next' });
86
+ this._applyPageIndex(nextPage);
84
87
  }
85
88
  }
86
89
  _onLastPage(evt) {
@@ -91,7 +94,7 @@ export class PaginatorFoundation {
91
94
  const lastPage = this._getMaxPages();
92
95
  const canPage = this._emitChangeEvent(PAGINATOR_CONSTANTS.strings.LAST_PAGE, { pageIndex: lastPage });
93
96
  if (canPage) {
94
- this._applyPageIndex(lastPage, { fromField: 'last' });
97
+ this._applyPageIndex(lastPage);
95
98
  }
96
99
  }
97
100
  _onPageSizeChanged(evt) {
@@ -99,7 +102,7 @@ export class PaginatorFoundation {
99
102
  const pageSize = Number(evt.detail);
100
103
  const canPage = this._emitChangeEvent(PAGINATOR_CONSTANTS.strings.PAGE_SIZE, { pageIndex: 0, pageSize });
101
104
  if (canPage) {
102
- this._applyPageIndex(0, { fromField: 'page-size' });
105
+ this._applyPageIndex(0);
103
106
  this._applyPageSize(pageSize);
104
107
  }
105
108
  else {
@@ -127,32 +130,32 @@ export class PaginatorFoundation {
127
130
  }
128
131
  this._adapter.setRangeLabel(this._rangeLabel);
129
132
  }
130
- _syncInteractionState(fromField = null) {
133
+ _syncInteractionState() {
131
134
  this._adapter.enableFirstPageButton();
132
135
  this._adapter.enablePreviousPageButton();
133
136
  this._adapter.enableNextPageButton();
134
137
  this._adapter.enableLastPageButton();
135
138
  if (!this._hasFirstPage()) {
136
- if (fromField) {
137
- this._adapter.handleFocusMove(fromField);
139
+ if (this._adapter.hasFocus()) {
140
+ this._adapter.handleFocusMove('first');
138
141
  }
139
142
  this._adapter.disableFirstPageButton();
140
143
  }
141
144
  if (!this._hasPreviousPage()) {
142
- if (fromField) {
143
- this._adapter.handleFocusMove(fromField);
145
+ if (this._adapter.hasFocus()) {
146
+ this._adapter.handleFocusMove('previous');
144
147
  }
145
148
  this._adapter.disablePreviousPageButton();
146
149
  }
147
150
  if (!this._hasNextPage()) {
148
- if (fromField) {
149
- this._adapter.handleFocusMove(fromField);
151
+ if (this._adapter.hasFocus()) {
152
+ this._adapter.handleFocusMove('next');
150
153
  }
151
154
  this._adapter.disableNextPageButton();
152
155
  }
153
156
  if (!this._hasLastPage()) {
154
- if (fromField) {
155
- this._adapter.handleFocusMove(fromField);
157
+ if (this._adapter.hasFocus()) {
158
+ this._adapter.handleFocusMove('last');
156
159
  }
157
160
  this._adapter.disableLastPageButton();
158
161
  }
@@ -213,11 +216,11 @@ export class PaginatorFoundation {
213
216
  this._offset = this._pageIndex * this._pageSize;
214
217
  }
215
218
  }
216
- _applyPageIndex(value, { fromField = null } = {}) {
219
+ _applyPageIndex(value) {
217
220
  this._pageIndex = value;
218
221
  this._computeOffset();
219
222
  this._updateRangeLabel();
220
- this._syncInteractionState(fromField);
223
+ this._syncInteractionState();
221
224
  this._adapter.toggleHostAttribute(PAGINATOR_CONSTANTS.attributes.PAGE_INDEX, this._pageIndex != null, this._pageIndex.toString());
222
225
  }
223
226
  _applyPageSize(value) {
@@ -56,4 +56,5 @@ export declare class PaginatorComponent extends BaseComponent implements IPagina
56
56
  disabled: boolean;
57
57
  alternative: boolean;
58
58
  alignment: PaginatorAlternativeAlignment;
59
+ focus(options?: FocusOptions): void;
59
60
  }
@@ -89,6 +89,9 @@ let PaginatorComponent = class PaginatorComponent extends BaseComponent {
89
89
  break;
90
90
  }
91
91
  }
92
+ focus(options) {
93
+ this._foundation.focus(options);
94
+ }
92
95
  };
93
96
  __decorate([
94
97
  FoundationProperty()
@@ -445,7 +445,9 @@ export class BaseSelectFoundation extends ListDropdownAwareFoundation {
445
445
  }, 300);
446
446
  this._options = this._adapter.getOptions();
447
447
  // TODO: Enhance this to cycle through closest matches (see the native select)
448
- const matchedOption = this._flatOptions.find(option => !option.disabled && option.label.toLowerCase().startsWith(this._filterString.toLowerCase()));
448
+ const matchedOption = this._flatOptions.find(({ disabled, label }) => {
449
+ return !disabled && label.trim().toLowerCase().startsWith(this._filterString.trim().toLowerCase());
450
+ });
449
451
  if (matchedOption) {
450
452
  const optionIndex = this._flatOptions.indexOf(matchedOption);
451
453
  if (this._open) {
@@ -14,7 +14,7 @@ import { SplitViewPanelAdapter } from './split-view-panel-adapter';
14
14
  import { IconComponent, IconRegistry } from '../../icon';
15
15
  import { RippleComponent } from '../../ripple';
16
16
  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-ripple id=\"ripple\" part=\"ripple\"></forge-ripple></div><div class=\"forge-split-view-panel__content\" id=\"content\" part=\"content\" role=\"group\"><slot></slot></div></div></template>';
17
- const styles = '@-webkit-keyframes mdc-ripple-fg-radius-in{from{-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);-webkit-transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1);transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1)}to{-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}}@keyframes mdc-ripple-fg-radius-in{from{-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);-webkit-transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1);transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1)}to{-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}}@-webkit-keyframes mdc-ripple-fg-opacity-in{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:0}to{opacity:var(--mdc-ripple-fg-opacity, 0)}}@keyframes mdc-ripple-fg-opacity-in{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:0}to{opacity:var(--mdc-ripple-fg-opacity, 0)}}@-webkit-keyframes mdc-ripple-fg-opacity-out{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:var(--mdc-ripple-fg-opacity, 0)}to{opacity:0}}@keyframes mdc-ripple-fg-opacity-out{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:var(--mdc-ripple-fg-opacity, 0)}to{opacity:0}}.mdc-ripple-surface{--mdc-ripple-fg-size:0;--mdc-ripple-left:0;--mdc-ripple-top:0;--mdc-ripple-fg-scale:1;--mdc-ripple-fg-translate-end:0;--mdc-ripple-fg-translate-start:0;-webkit-tap-highlight-color:transparent;will-change:transform,opacity;position:relative;outline:0;overflow:hidden}.mdc-ripple-surface::after,.mdc-ripple-surface::before{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:\"\"}.mdc-ripple-surface::before{-webkit-transition:opacity 15ms linear,background-color 15ms linear;transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index,1)}.mdc-ripple-surface::after{z-index:0;z-index:var(--mdc-ripple-z-index,0)}.mdc-ripple-surface.mdc-ripple-upgraded::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale,1));transform:scale(var(--mdc-ripple-fg-scale,1))}.mdc-ripple-surface.mdc-ripple-upgraded::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-ripple-surface.mdc-ripple-upgraded--unbounded::after{top:var(--mdc-ripple-top,0);left:var(--mdc-ripple-left,0)}.mdc-ripple-surface.mdc-ripple-upgraded--foreground-activation::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-ripple-surface.mdc-ripple-upgraded--foreground-deactivation::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}.mdc-ripple-surface::after,.mdc-ripple-surface::before{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-ripple-surface.mdc-ripple-upgraded::after{width:var(--mdc-ripple-fg-size,100%);height:var(--mdc-ripple-fg-size,100%)}.mdc-ripple-surface[data-mdc-ripple-is-unbounded],.mdc-ripple-upgraded--unbounded{overflow:visible}.mdc-ripple-surface[data-mdc-ripple-is-unbounded]::after,.mdc-ripple-surface[data-mdc-ripple-is-unbounded]::before,.mdc-ripple-upgraded--unbounded::after,.mdc-ripple-upgraded--unbounded::before{top:calc(50% - 50%);left:calc(50% - 50%);width:100%;height:100%}.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::after,.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::before,.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::after,.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::before{top:var(--mdc-ripple-top,calc(50% - 50%));left:var(--mdc-ripple-left,calc(50% - 50%));width:var(--mdc-ripple-fg-size,100%);height:var(--mdc-ripple-fg-size,100%)}.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::after,.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::after{width:var(--mdc-ripple-fg-size,100%);height:var(--mdc-ripple-fg-size,100%)}.mdc-ripple-surface::after,.mdc-ripple-surface::before{background-color:#000;background-color:var(--mdc-ripple-color,#000)}.mdc-ripple-surface.mdc-ripple-surface--hover::before,.mdc-ripple-surface:hover::before{opacity:.04;opacity:var(--mdc-ripple-hover-opacity, .04)}.mdc-ripple-surface.mdc-ripple-upgraded--background-focused::before,.mdc-ripple-surface:not(.mdc-ripple-upgraded):focus::before{-webkit-transition-duration:75ms;transition-duration:75ms;opacity:.12;opacity:var(--mdc-ripple-focus-opacity, .12)}.mdc-ripple-surface:not(.mdc-ripple-upgraded)::after{-webkit-transition:opacity 150ms linear;transition:opacity 150ms linear}.mdc-ripple-surface:not(.mdc-ripple-upgraded):active::after{-webkit-transition-duration:75ms;transition-duration:75ms;opacity:.12;opacity:var(--mdc-ripple-press-opacity, .12)}.mdc-ripple-surface.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-ripple-surface::after,.mdc-ripple-surface::before{--mdc-ripple-color:var(--mdc-theme-on-surface)}.forge-split-view-panel{display:-webkit-box;display:flex;width:100%;height:100%;overflow:hidden;contain:paint size}.forge-split-view-panel__handle{color:rgba(0,0,0,.54);color:var(--mdc-theme-text-secondary-on-light,rgba(0,0,0,.54));background-color:#e0e0e0;background-color:var(--forge-theme-border-color,#e0e0e0);display:-webkit-box;display:flex;flex-shrink:0;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;outline:0}.forge-split-view-panel__content{-webkit-box-flex:1;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:8px;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));-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.forge-split-view-panel[orientation=horizontal] .forge-split-view-panel__handle{width:8px;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;-webkit-animation-name:ug5dp2m;animation-name:ug5dp2m;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1)}@-webkit-keyframes ug5dp2m{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes ug5dp2m{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=start]{position:absolute;top:0;right:0;-webkit-animation-name:ug5dp3g;animation-name:ug5dp3g;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1)}@-webkit-keyframes ug5dp3g{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes ug5dp3g{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;-webkit-animation-name:ug5dp49;animation-name:ug5dp49;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-direction:reverse}@-webkit-keyframes ug5dp49{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes ug5dp49{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=start]{position:absolute;top:0;right:0;-webkit-animation-name:ug5dp4l;animation-name:ug5dp4l;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-direction:reverse}@-webkit-keyframes ug5dp4l{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes ug5dp4l{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}.forge-split-view-panel[orientation=vertical]{min-height:8px;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));-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.forge-split-view-panel[orientation=vertical] .forge-split-view-panel__handle{height:8px;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;-webkit-animation-name:ug5dp4v;animation-name:ug5dp4v;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1)}@-webkit-keyframes ug5dp4v{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes ug5dp4v{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=start]{position:absolute;bottom:0;left:0;-webkit-animation-name:ug5dp5f;animation-name:ug5dp5f;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1)}@-webkit-keyframes ug5dp5f{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes ug5dp5f{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;-webkit-animation-name:ug5dp5u;animation-name:ug5dp5u;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-direction:reverse}@-webkit-keyframes ug5dp5u{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes ug5dp5u{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=start]{position:absolute;bottom:0;left:0;-webkit-animation-name:ug5dp69;animation-name:ug5dp69;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-direction:reverse}@-webkit-keyframes ug5dp69{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes ug5dp69{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}:host{z-index:var(--forge-split-view-animating-layer)!important;display:block;position:relative;height:100%;width:100%;-webkit-box-flex:0;flex:0}:host([hidden]){display:none}:host(:not([resizable=start],[resizable=end])){-webkit-box-flex:1;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}';
17
+ const styles = '@-webkit-keyframes mdc-ripple-fg-radius-in{from{-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);-webkit-transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1);transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1)}to{-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}}@keyframes mdc-ripple-fg-radius-in{from{-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);-webkit-transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1);transform:translate(var(--mdc-ripple-fg-translate-start,0)) scale(1)}to{-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}}@-webkit-keyframes mdc-ripple-fg-opacity-in{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:0}to{opacity:var(--mdc-ripple-fg-opacity, 0)}}@keyframes mdc-ripple-fg-opacity-in{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:0}to{opacity:var(--mdc-ripple-fg-opacity, 0)}}@-webkit-keyframes mdc-ripple-fg-opacity-out{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:var(--mdc-ripple-fg-opacity, 0)}to{opacity:0}}@keyframes mdc-ripple-fg-opacity-out{from{-webkit-animation-timing-function:linear;animation-timing-function:linear;opacity:var(--mdc-ripple-fg-opacity, 0)}to{opacity:0}}.mdc-ripple-surface{--mdc-ripple-fg-size:0;--mdc-ripple-left:0;--mdc-ripple-top:0;--mdc-ripple-fg-scale:1;--mdc-ripple-fg-translate-end:0;--mdc-ripple-fg-translate-start:0;-webkit-tap-highlight-color:transparent;will-change:transform,opacity;position:relative;outline:0;overflow:hidden}.mdc-ripple-surface::after,.mdc-ripple-surface::before{position:absolute;border-radius:50%;opacity:0;pointer-events:none;content:\"\"}.mdc-ripple-surface::before{-webkit-transition:opacity 15ms linear,background-color 15ms linear;transition:opacity 15ms linear,background-color 15ms linear;z-index:1;z-index:var(--mdc-ripple-z-index,1)}.mdc-ripple-surface::after{z-index:0;z-index:var(--mdc-ripple-z-index,0)}.mdc-ripple-surface.mdc-ripple-upgraded::before{-webkit-transform:scale(var(--mdc-ripple-fg-scale,1));transform:scale(var(--mdc-ripple-fg-scale,1))}.mdc-ripple-surface.mdc-ripple-upgraded::after{top:0;left:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:center center;transform-origin:center center}.mdc-ripple-surface.mdc-ripple-upgraded--unbounded::after{top:var(--mdc-ripple-top,0);left:var(--mdc-ripple-left,0)}.mdc-ripple-surface.mdc-ripple-upgraded--foreground-activation::after{-webkit-animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards;animation:mdc-ripple-fg-radius-in 225ms forwards,mdc-ripple-fg-opacity-in 75ms forwards}.mdc-ripple-surface.mdc-ripple-upgraded--foreground-deactivation::after{-webkit-animation:mdc-ripple-fg-opacity-out 150ms;animation:mdc-ripple-fg-opacity-out 150ms;-webkit-transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1));transform:translate(var(--mdc-ripple-fg-translate-end,0)) scale(var(--mdc-ripple-fg-scale,1))}.mdc-ripple-surface::after,.mdc-ripple-surface::before{top:calc(50% - 100%);left:calc(50% - 100%);width:200%;height:200%}.mdc-ripple-surface.mdc-ripple-upgraded::after{width:var(--mdc-ripple-fg-size,100%);height:var(--mdc-ripple-fg-size,100%)}.mdc-ripple-surface[data-mdc-ripple-is-unbounded],.mdc-ripple-upgraded--unbounded{overflow:visible}.mdc-ripple-surface[data-mdc-ripple-is-unbounded]::after,.mdc-ripple-surface[data-mdc-ripple-is-unbounded]::before,.mdc-ripple-upgraded--unbounded::after,.mdc-ripple-upgraded--unbounded::before{top:calc(50% - 50%);left:calc(50% - 50%);width:100%;height:100%}.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::after,.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::before,.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::after,.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::before{top:var(--mdc-ripple-top,calc(50% - 50%));left:var(--mdc-ripple-left,calc(50% - 50%));width:var(--mdc-ripple-fg-size,100%);height:var(--mdc-ripple-fg-size,100%)}.mdc-ripple-surface[data-mdc-ripple-is-unbounded].mdc-ripple-upgraded::after,.mdc-ripple-upgraded--unbounded.mdc-ripple-upgraded::after{width:var(--mdc-ripple-fg-size,100%);height:var(--mdc-ripple-fg-size,100%)}.mdc-ripple-surface::after,.mdc-ripple-surface::before{background-color:#000;background-color:var(--mdc-ripple-color,#000)}.mdc-ripple-surface.mdc-ripple-surface--hover::before,.mdc-ripple-surface:hover::before{opacity:.04;opacity:var(--mdc-ripple-hover-opacity, .04)}.mdc-ripple-surface.mdc-ripple-upgraded--background-focused::before,.mdc-ripple-surface:not(.mdc-ripple-upgraded):focus::before{-webkit-transition-duration:75ms;transition-duration:75ms;opacity:.12;opacity:var(--mdc-ripple-focus-opacity, .12)}.mdc-ripple-surface:not(.mdc-ripple-upgraded)::after{-webkit-transition:opacity 150ms linear;transition:opacity 150ms linear}.mdc-ripple-surface:not(.mdc-ripple-upgraded):active::after{-webkit-transition-duration:75ms;transition-duration:75ms;opacity:.12;opacity:var(--mdc-ripple-press-opacity, .12)}.mdc-ripple-surface.mdc-ripple-upgraded{--mdc-ripple-fg-opacity:var(--mdc-ripple-press-opacity, 0.12)}.mdc-ripple-surface::after,.mdc-ripple-surface::before{--mdc-ripple-color:var(--mdc-theme-on-surface)}.forge-split-view-panel{display:-webkit-box;display:flex;width:100%;height:100%;overflow:hidden;contain:paint size}.forge-split-view-panel__handle{color:rgba(0,0,0,.54);color:var(--mdc-theme-text-secondary-on-light,rgba(0,0,0,.54));background-color:#e0e0e0;background-color:var(--forge-theme-border-color,#e0e0e0);display:-webkit-box;display:flex;flex-shrink:0;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;outline:0}.forge-split-view-panel__content{-webkit-box-flex:1;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:8px;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));-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}.forge-split-view-panel[orientation=horizontal] .forge-split-view-panel__handle{width:8px;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;-webkit-animation-name:unhqqyb;animation-name:unhqqyb;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1)}@-webkit-keyframes unhqqyb{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes unhqqyb{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--closing[resizable=start]{position:absolute;top:0;right:0;-webkit-animation-name:unhqqyf;animation-name:unhqqyf;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1)}@-webkit-keyframes unhqqyf{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes unhqqyf{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;-webkit-animation-name:unhqqyw;animation-name:unhqqyw;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-direction:reverse}@-webkit-keyframes unhqqyw{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes unhqqyw{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.forge-split-view-panel[orientation=horizontal].forge-split-view-panel--opening[resizable=start]{position:absolute;top:0;right:0;-webkit-animation-name:unhqqzk;animation-name:unhqqzk;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-direction:reverse}@-webkit-keyframes unhqqzk{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes unhqqzk{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateX(100%);transform:translateX(100%)}}.forge-split-view-panel[orientation=vertical]{min-height:8px;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));-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.forge-split-view-panel[orientation=vertical] .forge-split-view-panel__handle{height:8px;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;-webkit-animation-name:unhqqzz;animation-name:unhqqzz;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1)}@-webkit-keyframes unhqqzz{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes unhqqzz{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--closing[resizable=start]{position:absolute;bottom:0;left:0;-webkit-animation-name:unhqr00;animation-name:unhqr00;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1)}@-webkit-keyframes unhqr00{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes unhqr00{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=end]{position:absolute;top:0;left:0;-webkit-animation-name:unhqr0e;animation-name:unhqr0e;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-direction:reverse}@-webkit-keyframes unhqr0e{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes unhqr0e{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.forge-split-view-panel[orientation=vertical].forge-split-view-panel--opening[resizable=start]{position:absolute;bottom:0;left:0;-webkit-animation-name:unhqr13;animation-name:unhqr13;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-timing-function:cubic-bezier(0.4,0,0.2,1);animation-direction:reverse}@-webkit-keyframes unhqr13{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes unhqr13{from{-webkit-transform:none;transform:none}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}:host{z-index:var(--forge-split-view-animating-layer)!important;display:block;position:relative;height:100%;width:100%;-webkit-box-flex:0;flex:0}:host([hidden]){display:none}:host(:not([resizable=start],[resizable=end])){-webkit-box-flex:1;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}';
18
18
  /**
19
19
  * The custom element class behind the `<forge-split-view-panel>` element.
20
20
  *
@@ -55,7 +55,7 @@ export class StepperFoundation {
55
55
  }
56
56
  /** The step configurations. */
57
57
  get steps() {
58
- return JSON.parse(JSON.stringify(this._steps));
58
+ return this._steps.map(s => (Object.assign({}, s))); // Shallow clone
59
59
  }
60
60
  set steps(value) {
61
61
  if (Array.isArray(value) && value.length > 0) {
@@ -76,6 +76,7 @@ export declare class TableFoundation implements ITableFoundation {
76
76
  private _rowDoubleClickListener;
77
77
  private _selectRowListener;
78
78
  private _selectAllListener;
79
+ private _sortableHeadCellKeydownListener;
79
80
  private _headRowMouseDownListener;
80
81
  private _headRowContextMenuListener;
81
82
  private _documentMouseMoveListener;
@@ -259,6 +260,7 @@ export declare class TableFoundation implements ITableFoundation {
259
260
  private _onHeadRowMouseDown;
260
261
  private _onMouseMove;
261
262
  private _onMouseUp;
263
+ private _onSortableHeadCellKeydown;
262
264
  /**
263
265
  * Called when a click event is triggered on the table header row.
264
266
  * We use this to capture all click events on the row, and determine which
@@ -42,6 +42,7 @@ export class TableFoundation {
42
42
  this._rowDoubleClickListener = evt => this._onRowDoubleClick(evt);
43
43
  this._selectRowListener = evt => this._onRowSelected(evt);
44
44
  this._selectAllListener = evt => this._onSelectAll(evt);
45
+ this._sortableHeadCellKeydownListener = (evt) => this._onSortableHeadCellKeydown(evt);
45
46
  this._headRowMouseDownListener = evt => this._onHeadRowMouseDown(evt);
46
47
  this._headRowContextMenuListener = evt => this._onHeadRowContextMenu(evt);
47
48
  this._documentMouseMoveListener = evt => this._onMouseMove(evt);
@@ -86,13 +87,11 @@ export class TableFoundation {
86
87
  this._renderBody();
87
88
  }
88
89
  get data() {
89
- return JSON.parse(JSON.stringify(this._data));
90
+ return this._data.map(o => (Object.assign({}, o))); // Shallow clone
90
91
  }
91
92
  /** The column configuration options. */
92
93
  set columnConfigurations(value) {
93
94
  // Intentional shallow copy of member properties. These member objects have properties that are references to functions.
94
- // The typical JSON.parse(JSON.stringify(object)) will not work here. If this becomes an issue we'll add a deepClone
95
- // function to the core library.
96
95
  this._columnConfigurations = value.map(cc => (Object.assign({}, cc)));
97
96
  // Update hidden column manager
98
97
  this._hiddenColumnManager.clear();
@@ -106,8 +105,6 @@ export class TableFoundation {
106
105
  }
107
106
  get columnConfigurations() {
108
107
  // Intentional shallow copy of member properties. These member objects have properties that are references to functions.
109
- // The typical JSON.parse(JSON.stringify(object)) will not work here. If this becomes an issue we'll add a deepClone
110
- // function to the core library.
111
108
  return this._columnConfigurations.map(cc => (Object.assign({}, cc)));
112
109
  }
113
110
  /** Gets the visible column configurations. */
@@ -124,6 +121,7 @@ export class TableFoundation {
124
121
  doubleClickListener: this._allowRowClick ? this._rowDoubleClickListener : null,
125
122
  selectListener: this._select ? this._selectRowListener : null,
126
123
  selectAllListener: this._multiselect ? this._selectAllListener : null,
124
+ sortableHeadCellKeydownListener: this._sortableHeadCellKeydownListener,
127
125
  headRowMouseDownListener: this._headRowMouseDownListener,
128
126
  headRowContextMenuListener: this._headRowContextMenuListener,
129
127
  filterListener: this._filter ? this._filterListener : null,
@@ -699,7 +697,11 @@ export class TableFoundation {
699
697
  this._adapter.emitHostEvent(TABLE_CONSTANTS.events.SELECT_ALL, data, true, false);
700
698
  }
701
699
  _onHeadRowContextMenu(evt) {
702
- evt.preventDefault();
700
+ // We only handle this event on MacOS due to the `ctrl+click` combination triggering the contextmenu event...
701
+ // So we only detect that scenario here to still allow for the default context menu on Mac when right-clicking
702
+ if (evt.ctrlKey) {
703
+ evt.preventDefault();
704
+ }
703
705
  }
704
706
  _onHeadRowMouseDown(evt) {
705
707
  if (evt.button !== 0) {
@@ -764,6 +766,15 @@ export class TableFoundation {
764
766
  }
765
767
  this._headCellMouseDownIndex = undefined;
766
768
  }
769
+ _onSortableHeadCellKeydown(evt) {
770
+ if (evt.key === ' ' || evt.key === 'Enter') {
771
+ const composedPath = getEventPath(evt);
772
+ const rowElement = composedPath.find(el => el.tagName === 'TR');
773
+ const thElement = composedPath.find(el => el.tagName === 'TH');
774
+ const cellIndex = Array.from(rowElement.cells).findIndex(c => c === thElement);
775
+ this._onSort(cellIndex);
776
+ }
777
+ }
767
778
  /**
768
779
  * Called when a click event is triggered on the table header row.
769
780
  * We use this to capture all click events on the row, and determine which
@@ -141,7 +141,15 @@ export class TableUtils {
141
141
  th.scope = 'col';
142
142
  addClass([TABLE_CONSTANTS.classes.TABLE_CELL, TABLE_CONSTANTS.classes.TABLE_HEAD_CELL], th);
143
143
  // We wrap the header text in a div for ease of alignment
144
- const cellContainer = document.createElement('div');
144
+ let cellContainer;
145
+ if (columnConfig.sortable) {
146
+ cellContainer = document.createElement('button');
147
+ cellContainer.type = 'button';
148
+ cellContainer.addEventListener('keydown', tableConfiguration.sortableHeadCellKeydownListener);
149
+ }
150
+ else {
151
+ cellContainer = document.createElement('div');
152
+ }
145
153
  cellContainer.classList.add(TABLE_CONSTANTS.classes.TABLE_HEAD_CELL_CONTAINER);
146
154
  // Add tooltip for multisort
147
155
  if (tableConfiguration.multiColumnSort) {
@@ -236,6 +244,7 @@ export class TableUtils {
236
244
  */
237
245
  static setSortDirection(tableElement, columnIndex, sortDirection) {
238
246
  const cell = TableUtils._getHeaderCellByIndex(tableElement, columnIndex);
247
+ tableElement.querySelectorAll('th[aria-sort]').forEach(th => th.removeAttribute('aria-sort'));
239
248
  TableUtils._setColumnSortDirection(cell, sortDirection);
240
249
  }
241
250
  /**
@@ -251,9 +260,11 @@ export class TableUtils {
251
260
  thElement.classList.remove(TABLE_CONSTANTS.classes.TABLE_HEAD_CELL_SORTED_DESCENDING);
252
261
  }
253
262
  if (!sortDirection || sortDirection === SortDirection.Descending) {
263
+ thElement.setAttribute('aria-sort', 'descending');
254
264
  thElement.classList.add(TABLE_CONSTANTS.classes.TABLE_HEAD_CELL_SORTED_DESCENDING);
255
265
  }
256
266
  else {
267
+ thElement.setAttribute('aria-sort', 'ascending');
257
268
  thElement.classList.add(TABLE_CONSTANTS.classes.TABLE_HEAD_CELL_SORTED_ASCENDING);
258
269
  }
259
270
  }
@@ -885,6 +896,7 @@ export class TableUtils {
885
896
  */
886
897
  static removeColumnSort(tableElement, columnIndex) {
887
898
  const cell = TableUtils._getHeaderCellByIndex(tableElement, columnIndex);
899
+ cell.removeAttribute('aria-sort');
888
900
  // Remove any existing sort direction classes from the existing th element
889
901
  if (cell.classList.contains(TABLE_CONSTANTS.classes.TABLE_HEAD_CELL_SORTED_ASCENDING)) {
890
902
  cell.classList.remove(TABLE_CONSTANTS.classes.TABLE_HEAD_CELL_SORTED_ASCENDING);
@@ -38,6 +38,7 @@ export interface ITableConfiguration {
38
38
  doubleClickListener: ((evt: Event) => void) | null;
39
39
  selectListener: ((evt: Event) => void) | null;
40
40
  selectAllListener: ((evt: Event) => void) | null;
41
+ sortableHeadCellKeydownListener: EventListener;
41
42
  headRowMouseDownListener: (evt: Event) => void;
42
43
  headRowContextMenuListener: (evt: Event) => void;
43
44
  filterListener: ((value: any, columnIndex: number) => void) | null;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tylertech/forge",
3
3
  "description": "Tyler Forge™ Web Components library",
4
- "version": "2.19.1",
4
+ "version": "2.20.1",
5
5
  "author": "Tyler Technologies, Inc.",
6
6
  "license": "Apache-2.0",
7
7
  "repository": {
@@ -113,10 +113,14 @@
113
113
  display: none;
114
114
  }
115
115
  }
116
-
116
+
117
117
  &--sortable {
118
118
  @include head-cell-sortable(forge-table-head__cell-sort-icon, forge-table-head__cell__sort-order);
119
-
119
+
120
+ button {
121
+ @include head-cell-sortable-button;
122
+ }
123
+
120
124
  &.forge-table-head__cell--sorted-ascending {
121
125
  .forge-table-head__cell-sort-icon {
122
126
  @include head-cell-sort-icon-ascending;
@@ -438,6 +442,20 @@
438
442
  }
439
443
  }
440
444
 
445
+ @mixin head-cell-sortable-button {
446
+ cursor: pointer;
447
+ border: none;
448
+ background: transparent;
449
+ text-align: inherit;
450
+ margin: inherit;
451
+ padding-block: 4px;
452
+ padding-inline: 0;
453
+ font: inherit;
454
+ color: inherit;
455
+ width: 100%;
456
+ outline-offset: 4px;
457
+ }
458
+
441
459
  /// The base table body row styles for row interactions.
442
460
  @mixin body-row() {
443
461
  height: variables.$tbody-row-height;
@@ -1,7 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2023 Tyler Technologies, Inc.
4
- * License: Apache-2.0
5
- */
6
- var e={DENSITY:"density",FLOAT_LABEL_TYPE:"float-label-type",SHAPE:"shape",INVALID:"invalid",REQUIRED:"required",HOST_LABEL_FLOATING:"forge-label-floating"},d={INPUT:"input,textarea"},l=["disabled","readonly","value","placeholder"],o={DISABLED:"forge-field--disabled",READONLY:"forge-field--readonly",INPUT_FOCUSED:"forge-field__input--focused",LEADING:"forge-field--leading",TRAILING:"forge-field--trailing",ADDON_END:"forge-field--addon-end",ADDON_END_CONTAINER:"forge-field__addon-end-container",FOCUSED:"forge-field--focused",LABEL_FOCUSED:"forge-field__label--focused",SHAPE_ROUNDED:"forge-field--shape-rounded",INVALID:"forge-field--invalid",REQUIRED:"forge-field--required",DENSE:"forge-field--dense",ROOMY:"forge-field--roomy",LABEL:"forge-field--label"},f={attributes:e,observedInputAttributes:l,selectors:d,classes:o};export{f as a};
7
- //# sourceMappingURL=chunk.GO5A4GKZ.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/field/field-constants.ts"],
4
- "sourcesContent": ["const attributes = {\n DENSITY: 'density',\n FLOAT_LABEL_TYPE: 'float-label-type',\n SHAPE: 'shape',\n INVALID: 'invalid',\n REQUIRED: 'required',\n HOST_LABEL_FLOATING: `forge-label-floating`\n};\n\nconst selectors = {\n INPUT: 'input,textarea'\n};\n\nconst observedInputAttributes = ['disabled', 'readonly', 'value', 'placeholder'];\n\nconst classes = {\n DISABLED: 'forge-field--disabled',\n READONLY: 'forge-field--readonly',\n INPUT_FOCUSED: 'forge-field__input--focused',\n LEADING: 'forge-field--leading',\n TRAILING: 'forge-field--trailing',\n ADDON_END: 'forge-field--addon-end',\n ADDON_END_CONTAINER: 'forge-field__addon-end-container',\n FOCUSED: 'forge-field--focused',\n LABEL_FOCUSED: 'forge-field__label--focused',\n SHAPE_ROUNDED: 'forge-field--shape-rounded',\n INVALID: 'forge-field--invalid',\n REQUIRED: 'forge-field--required',\n DENSE: 'forge-field--dense',\n ROOMY: 'forge-field--roomy',\n LABEL: 'forge-field--label'\n};\n\nexport const FIELD_CONSTANTS = {\n attributes,\n observedInputAttributes,\n selectors,\n classes\n};\n\nexport type FieldDensityType = 'roomy' | 'default' | 'dense';\nexport type FieldFloatLabelType = 'always' | 'auto';\nexport type FieldShapeType = 'default' | 'rounded';\n"],
5
- "mappings": "AAAA,IAAMA,EAAa,CACjB,QAAS,UACT,iBAAkB,mBAClB,MAAO,QACP,QAAS,UACT,SAAU,WACV,oBAAqB,sBACvB,EAEMC,EAAY,CAChB,MAAO,gBACT,EAEMC,EAA0B,CAAC,WAAY,WAAY,QAAS,aAAa,EAEzEC,EAAU,CACd,SAAU,wBACV,SAAU,wBACV,cAAe,8BACf,QAAS,uBACT,SAAU,wBACV,UAAW,yBACX,oBAAqB,mCACrB,QAAS,uBACT,cAAe,8BACf,cAAe,6BACf,QAAS,uBACT,SAAU,wBACV,MAAO,qBACP,MAAO,qBACP,MAAO,oBACT,EAEaC,EAAkB,CAC7B,WAAAJ,EACA,wBAAAE,EACA,UAAAD,EACA,QAAAE,CACF",
6
- "names": ["attributes", "selectors", "observedInputAttributes", "classes", "FIELD_CONSTANTS"]
7
- }