@quandis/qbo4.ui 4.0.1-CI-20250107-190636 → 4.0.1-CI-20250108-195954

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "author": "Quandis, Inc.",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
- "version": "4.0.1-CI-20250107-190636",
6
+ "version": "4.0.1-CI-20250108-195954",
7
7
  "workspaces": [
8
8
  "code"
9
9
  ],
@@ -27,7 +27,7 @@
27
27
  "src/"
28
28
  ],
29
29
  "dependencies": {
30
- "@codemirror/commands": "^6.7.1",
30
+ "@codemirror/commands": "^6.8.0",
31
31
  "@codemirror/lang-html": "^6.4.9",
32
32
  "@codemirror/lang-javascript": "^6.2.2",
33
33
  "@codemirror/lang-sql": "^6.8.0",
@@ -55,7 +55,7 @@
55
55
  "postcss": "^8.4.49",
56
56
  "postcss-loader": "^8.1.1",
57
57
  "sass": "^1.83.1",
58
- "typescript": "^5.7.2",
58
+ "typescript": "^5.7.3",
59
59
  "webpack": "^5.97.1",
60
60
  "webpack-cli": "^6.0.1",
61
61
  "webpack-merge": "^6.0.1"
package/scss/qboui.scss CHANGED
@@ -1454,31 +1454,34 @@ details {
1454
1454
  display: flex;
1455
1455
  list-style: none;
1456
1456
  padding-left: 0;
1457
- margin-bottom: 1px;
1457
+ margin-bottom: 1rem;
1458
1458
  border-bottom: 1px solid var(--qbo-border-color);
1459
1459
  }
1460
1460
 
1461
1461
  .qbo-tabs li {
1462
- margin-bottom: -1px;
1463
- padding: 0.5rem 1rem;
1464
1462
  border: 1px solid transparent;
1465
1463
  border-top-left-radius: var(--qbo-border-radius);
1466
1464
  border-top-right-radius: var(--qbo-border-radius);
1467
- color: #007bff;
1468
- text-decoration: none;
1465
+ color: var(--qbo-h3-card-color);
1469
1466
  cursor: pointer;
1467
+ font-size: 1.25rem;
1468
+ font-weight: 500;
1469
+ margin-bottom: -1px;
1470
+ max-width: var(--qbo-tab-max-width);
1471
+ overflow: hidden;
1472
+ padding: 0.5rem 1rem;
1473
+ text-decoration: none;
1474
+ text-overflow: ellipsis;
1475
+ white-space: nowrap;
1470
1476
  }
1471
1477
 
1472
1478
  .qbo-tabs li:hover {
1473
- border-color: #e9ecef #e9ecef #dee2e6;
1474
- color: #0056b3;
1475
- text-decoration: none;
1479
+ border-color: #81181d #81181d #fff;
1480
+ color: #81181d;
1476
1481
  }
1477
1482
 
1478
1483
  .qbo-tabs li.active {
1479
- color: var(--qbo-table-header-color);
1480
- background-color: var(--qbo-table-header-background);
1481
- border-color: #dee2e6 #dee2e6 #fff;
1484
+ border-color: #999 #999 #fff;
1482
1485
  }
1483
1486
 
1484
1487
  .qbo-tabs li:not(:last-child) {
@@ -33,9 +33,12 @@ export * from './qbo-popover.js';
33
33
  export * from './qbo-popup.js';
34
34
  export * from './qbo-popup-listener.js';
35
35
  export * from './qbo-resize.js';
36
+ export * from './qbo-search.js';
36
37
  export * from './qbo-select.js';
37
38
  export * from './qbo-selectable.js';
38
39
  export * from './qbo-table.js';
40
+ export * from './qbo-table-sort.js';
41
+ export * from './qbo-tabs.js';
39
42
  export * from './qbo-user-preferences.js';
40
43
  export * from './qbo-validate.js';
41
44
  export * from './styles.js';
@@ -22,9 +22,12 @@ export * from './qbo-popover.js';
22
22
  export * from './qbo-popup.js';
23
23
  export * from './qbo-popup-listener.js';
24
24
  export * from './qbo-resize.js';
25
+ export * from './qbo-search.js';
25
26
  export * from './qbo-select.js';
26
27
  export * from './qbo-selectable.js';
27
28
  export * from './qbo-table.js';
29
+ export * from './qbo-table-sort.js';
30
+ export * from './qbo-tabs.js';
28
31
  export * from './qbo-user-preferences.js';
29
32
  export * from './qbo-validate.js';
30
33
  export * from './styles.js';
@@ -39,9 +39,12 @@ export * from './qbo-popover.js'
39
39
  export * from './qbo-popup.js';
40
40
  export * from './qbo-popup-listener.js';
41
41
  export * from './qbo-resize.js';
42
+ export * from './qbo-search.js';
42
43
  export * from './qbo-select.js';
43
44
  export * from './qbo-selectable.js';
44
45
  export * from './qbo-table.js';
46
+ export * from './qbo-table-sort.js';
47
+ export * from './qbo-tabs.js';
45
48
  export * from './qbo-user-preferences.js';
46
49
  export * from './qbo-validate.js';
47
50
  export * from './styles.js';
@@ -0,0 +1,18 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class QboSearch extends LitElement {
3
+ payload: Record<string, string>;
4
+ private expanded;
5
+ private inputText;
6
+ private jsonListContainer;
7
+ private inputContainer;
8
+ static styles: import("lit").CSSResult;
9
+ render(): import("lit-html").TemplateResult<1>;
10
+ firstUpdated(): void;
11
+ updated(): void;
12
+ private updateFloatingPosition;
13
+ private handleKeyDown;
14
+ private handleSearchClick;
15
+ private updateKey;
16
+ private updateValue;
17
+ private deleteKeyValuePair;
18
+ }
@@ -0,0 +1,199 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { LitElement, html, css } from 'lit';
11
+ import { customElement, state, property } from 'lit/decorators.js';
12
+ import { computePosition, autoUpdate } from '@floating-ui/dom';
13
+ let QboSearch = class QboSearch extends LitElement {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.payload = {};
17
+ this.expanded = false;
18
+ this.inputText = '';
19
+ this.jsonListContainer = null;
20
+ this.inputContainer = null;
21
+ }
22
+ static { this.styles = css `
23
+ :host {
24
+ display: inline-block;
25
+ font-family: var(--qbo-font);
26
+ margin-left: auto;
27
+ vertical-align: top;
28
+ float: right;
29
+ position: relative;
30
+ }
31
+ input {
32
+ border: 1px solid var(--qbo-border-color);
33
+ border-radius: var(--qbo-border-radius);
34
+ font-size: 0.9em;
35
+ line-height: var(--qbo-line-height);
36
+ }
37
+ .collapsed {
38
+ display: flex;
39
+ align-items: center;
40
+ width: fit-content;
41
+ padding: 0.2em 0.5em;
42
+ cursor: pointer;
43
+ }
44
+ .collapsed input {
45
+ width: 5rem;
46
+ transition: width 0.3s ease;
47
+ }
48
+ .collapsed input:focus {
49
+ width: 15rem;
50
+ }
51
+ .input-container {
52
+ display: flex;
53
+ align-items: center;
54
+ width: fit-content;
55
+ border: 1px solid #ccc;
56
+ padding: 0.2em 0.5em;
57
+ position: relative;
58
+ }
59
+ .json-list {
60
+ position: absolute;
61
+ top: 100%;
62
+ right: 0;
63
+ background: white;
64
+ border: 1px solid #ccc;
65
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
66
+ padding: 0.5em;
67
+ z-index: 10000;
68
+ }
69
+ .json-item {
70
+ display: flex;
71
+ gap: 5px;
72
+ margin-bottom: 0.3em;
73
+ }
74
+ .json-item input {
75
+ flex: 1;
76
+ padding: 0.3em;
77
+ }
78
+ button {
79
+ padding: 0.3em;
80
+ font-size: 0.9em;
81
+ }
82
+ .search-icon {
83
+ cursor: pointer;
84
+ margin-left: 0.5em;
85
+ }
86
+ svg {
87
+ height: 1rem;
88
+ width: 1rem;
89
+ }
90
+ `; }
91
+ render() {
92
+ return html `
93
+ ${!this.expanded
94
+ ? html `
95
+ <div class="collapsed" @click=${() => (this.expanded = true)}>
96
+ <svg class="qbo-icon" @click=${() => (this.expanded = true)}><use href="/ui/images/qbo-icons.svg#search"></use></svg>
97
+ </div>
98
+ `
99
+ : html `
100
+ <div class="input-container">
101
+ <input
102
+ type="text"
103
+ placeholder="Enter key:value"
104
+ .value=${this.inputText}
105
+ @input=${(e) => (this.inputText = e.target.value)}
106
+ @keydown=${this.handleKeyDown}
107
+ @blur=${() => (this.expanded = false)}
108
+ />
109
+ <svg class="qbo-icon" @click=${this.handleSearchClick}><use href="/ui/images/qbo-icons.svg#search"></use></svg>
110
+ </div>
111
+ <div class="json-list" id="json-list">
112
+ ${Object.entries(this.payload).map(([key, value]) => html `
113
+ <div class="json-item">
114
+ <input
115
+ type="text"
116
+ .value=${key}
117
+ @input=${(e) => this.updateKey(e, key)}
118
+ />
119
+ <input
120
+ type="text"
121
+ .value=${value}
122
+ @input=${(e) => this.updateValue(e, key)}
123
+ />
124
+ <button @click=${() => this.deleteKeyValuePair(key)}>Delete</button>
125
+ </div>
126
+ `)}
127
+ </div>
128
+ `}
129
+ `;
130
+ }
131
+ firstUpdated() {
132
+ this.updateFloatingPosition();
133
+ }
134
+ updated() {
135
+ this.updateFloatingPosition();
136
+ }
137
+ async updateFloatingPosition() {
138
+ if (this.inputContainer && this.jsonListContainer) {
139
+ autoUpdate(this.inputContainer, this.jsonListContainer, async () => {
140
+ const { x, y } = await computePosition(this.inputContainer, this.jsonListContainer, {
141
+ middleware: [],
142
+ });
143
+ Object.assign(this.jsonListContainer.style, {
144
+ left: `${x}px`,
145
+ top: `${y}px`,
146
+ });
147
+ });
148
+ }
149
+ }
150
+ handleKeyDown(e) {
151
+ if (e.key === 'Enter' && this.inputText.includes(':')) {
152
+ const [key, value] = this.inputText.split(':').map(part => part.trim());
153
+ if (key && value) {
154
+ this.payload = { ...this.payload, [key]: value };
155
+ this.inputText = '';
156
+ }
157
+ }
158
+ }
159
+ handleSearchClick() {
160
+ this.expanded = false;
161
+ this.dispatchEvent(new CustomEvent('change', {
162
+ detail: { payload: this.payload },
163
+ bubbles: true,
164
+ composed: true,
165
+ }));
166
+ }
167
+ updateKey(e, oldKey) {
168
+ const newKey = e.target.value;
169
+ if (newKey && newKey !== oldKey) {
170
+ const { [oldKey]: _, ...rest } = this.payload;
171
+ this.payload = { ...rest, [newKey]: this.payload[oldKey] };
172
+ }
173
+ }
174
+ updateValue(e, key) {
175
+ this.payload = { ...this.payload, [key]: e.target.value };
176
+ }
177
+ deleteKeyValuePair(key) {
178
+ const { [key]: _, ...rest } = this.payload;
179
+ this.payload = { ...rest };
180
+ }
181
+ };
182
+ __decorate([
183
+ property({ type: Object }),
184
+ __metadata("design:type", Object)
185
+ ], QboSearch.prototype, "payload", void 0);
186
+ __decorate([
187
+ state(),
188
+ __metadata("design:type", Object)
189
+ ], QboSearch.prototype, "expanded", void 0);
190
+ __decorate([
191
+ state(),
192
+ __metadata("design:type", Object)
193
+ ], QboSearch.prototype, "inputText", void 0);
194
+ QboSearch = __decorate([
195
+ customElement('qbo-search')
196
+ ], QboSearch);
197
+ export { QboSearch };
198
+ if (!customElements.get('qbo-search'))
199
+ customElements.define('qbo-search', QboSearch);
@@ -0,0 +1,192 @@
1
+ import { LitElement, html, css } from 'lit';
2
+ import { customElement, state, property } from 'lit/decorators.js';
3
+ import { computePosition, autoUpdate } from '@floating-ui/dom';
4
+
5
+ @customElement('qbo-search')
6
+ export class QboSearch extends LitElement {
7
+ @property({ type: Object })
8
+ payload: Record<string, string> = {};
9
+
10
+ @state()
11
+ private expanded = false;
12
+
13
+ @state()
14
+ private inputText = '';
15
+
16
+ private jsonListContainer: HTMLElement | null = null;
17
+ private inputContainer: HTMLElement | null = null;
18
+
19
+ static styles = css`
20
+ :host {
21
+ display: inline-block;
22
+ font-family: var(--qbo-font);
23
+ margin-left: auto;
24
+ vertical-align: top;
25
+ float: right;
26
+ position: relative;
27
+ }
28
+ input {
29
+ border: 1px solid var(--qbo-border-color);
30
+ border-radius: var(--qbo-border-radius);
31
+ font-size: 0.9em;
32
+ line-height: var(--qbo-line-height);
33
+ }
34
+ .collapsed {
35
+ display: flex;
36
+ align-items: center;
37
+ width: fit-content;
38
+ padding: 0.2em 0.5em;
39
+ cursor: pointer;
40
+ }
41
+ .collapsed input {
42
+ width: 5rem;
43
+ transition: width 0.3s ease;
44
+ }
45
+ .collapsed input:focus {
46
+ width: 15rem;
47
+ }
48
+ .input-container {
49
+ display: flex;
50
+ align-items: center;
51
+ width: fit-content;
52
+ border: 1px solid #ccc;
53
+ padding: 0.2em 0.5em;
54
+ position: relative;
55
+ }
56
+ .json-list {
57
+ position: absolute;
58
+ top: 100%;
59
+ right: 0;
60
+ background: white;
61
+ border: 1px solid #ccc;
62
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
63
+ padding: 0.5em;
64
+ z-index: 10000;
65
+ }
66
+ .json-item {
67
+ display: flex;
68
+ gap: 5px;
69
+ margin-bottom: 0.3em;
70
+ }
71
+ .json-item input {
72
+ flex: 1;
73
+ padding: 0.3em;
74
+ }
75
+ button {
76
+ padding: 0.3em;
77
+ font-size: 0.9em;
78
+ }
79
+ .search-icon {
80
+ cursor: pointer;
81
+ margin-left: 0.5em;
82
+ }
83
+ svg {
84
+ height: 1rem;
85
+ width: 1rem;
86
+ }
87
+ `;
88
+
89
+ render() {
90
+ return html`
91
+ ${!this.expanded
92
+ ? html`
93
+ <div class="collapsed" @click=${() => (this.expanded = true)}>
94
+ <svg class="qbo-icon" @click=${() => (this.expanded = true)}><use href="/ui/images/qbo-icons.svg#search"></use></svg>
95
+ </div>
96
+ `
97
+ : html`
98
+ <div class="input-container">
99
+ <input
100
+ type="text"
101
+ placeholder="Enter key:value"
102
+ .value=${this.inputText}
103
+ @input=${(e: Event) => (this.inputText = (e.target as HTMLInputElement).value)}
104
+ @keydown=${this.handleKeyDown}
105
+ @blur=${() => (this.expanded = false)}
106
+ />
107
+ <svg class="qbo-icon" @click=${this.handleSearchClick}><use href="/ui/images/qbo-icons.svg#search"></use></svg>
108
+ </div>
109
+ <div class="json-list" id="json-list">
110
+ ${Object.entries(this.payload).map(
111
+ ([key, value]) => html`
112
+ <div class="json-item">
113
+ <input
114
+ type="text"
115
+ .value=${key}
116
+ @input=${(e: Event) => this.updateKey(e, key)}
117
+ />
118
+ <input
119
+ type="text"
120
+ .value=${value}
121
+ @input=${(e: Event) => this.updateValue(e, key)}
122
+ />
123
+ <button @click=${() => this.deleteKeyValuePair(key)}>Delete</button>
124
+ </div>
125
+ `
126
+ )}
127
+ </div>
128
+ `}
129
+ `;
130
+ }
131
+
132
+ firstUpdated() {
133
+ this.updateFloatingPosition();
134
+ }
135
+
136
+ updated() {
137
+ this.updateFloatingPosition();
138
+ }
139
+
140
+ private async updateFloatingPosition() {
141
+ if (this.inputContainer && this.jsonListContainer) {
142
+ autoUpdate(this.inputContainer, this.jsonListContainer, async () => {
143
+ const { x, y } = await computePosition(this.inputContainer!, this.jsonListContainer!, {
144
+ middleware: [],
145
+ });
146
+ Object.assign(this.jsonListContainer!.style, {
147
+ left: `${x}px`,
148
+ top: `${y}px`,
149
+ });
150
+ });
151
+ }
152
+ }
153
+
154
+ private handleKeyDown(e: KeyboardEvent) {
155
+ if (e.key === 'Enter' && this.inputText.includes(':')) {
156
+ const [key, value] = this.inputText.split(':').map(part => part.trim());
157
+ if (key && value) {
158
+ this.payload = { ...this.payload, [key]: value };
159
+ this.inputText = '';
160
+ }
161
+ }
162
+ }
163
+
164
+ private handleSearchClick() {
165
+ this.expanded = false;
166
+ this.dispatchEvent(new CustomEvent('change', {
167
+ detail: { payload: this.payload },
168
+ bubbles: true,
169
+ composed: true,
170
+ }));
171
+ }
172
+
173
+ private updateKey(e: Event, oldKey: string) {
174
+ const newKey = (e.target as HTMLInputElement).value;
175
+ if (newKey && newKey !== oldKey) {
176
+ const { [oldKey]: _, ...rest } = this.payload;
177
+ this.payload = { ...rest, [newKey]: this.payload[oldKey] };
178
+ }
179
+ }
180
+
181
+ private updateValue(e: Event, key: string) {
182
+ this.payload = { ...this.payload, [key]: (e.target as HTMLInputElement).value };
183
+ }
184
+
185
+ private deleteKeyValuePair(key: string) {
186
+ const { [key]: _, ...rest } = this.payload;
187
+ this.payload = { ...rest };
188
+ }
189
+ }
190
+
191
+ if (!customElements.get('qbo-search'))
192
+ customElements.define('qbo-search', QboSearch);
@@ -0,0 +1,14 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class QboTableSort extends LitElement {
3
+ direction: 'asc' | 'desc';
4
+ selector: string;
5
+ sortBy: string | null;
6
+ trigger: 'ctrl' | null;
7
+ type: 'inline' | 'remote' | 'all';
8
+ table: HTMLTableElement | null;
9
+ firstUpdated(): void;
10
+ disconnectedCallback(): void;
11
+ sortInline(column: HTMLTableCellElement): void;
12
+ sortTable(event: MouseEvent): void;
13
+ render(): import("lit-html").TemplateResult<1>;
14
+ }
@@ -0,0 +1,102 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { LitElement, html } from 'lit';
11
+ import { property, state } from 'lit/decorators.js';
12
+ export class QboTableSort extends LitElement {
13
+ constructor() {
14
+ super(...arguments);
15
+ this.direction = 'desc';
16
+ this.selector = 'table';
17
+ this.sortBy = null;
18
+ /* Trigger for raising the sort event. */
19
+ this.trigger = null;
20
+ this.type = 'inline';
21
+ this.table = null;
22
+ }
23
+ firstUpdated() {
24
+ this.table = this.closest('table');
25
+ if (this.table == null)
26
+ return;
27
+ this.table.addEventListener('click', this.sortTable.bind(this));
28
+ }
29
+ disconnectedCallback() {
30
+ this.table?.removeEventListener('click', this.sortTable.bind(this));
31
+ }
32
+ sortInline(column) {
33
+ const rows = Array.from(this.table.querySelector('tbody').querySelectorAll('tr'));
34
+ const sortType = column.getAttribute('data-sort') || 'string';
35
+ rows.sort((rowA, rowB) => {
36
+ const cellA = rowA.cells[column.cellIndex].getAttribute('data-sort-value')
37
+ ?? rowA.cells[column.cellIndex].textContent.trim();
38
+ const cellB = rowB.cells[column.cellIndex].getAttribute('data-sort-value')
39
+ ?? rowB.cells[column.cellIndex].textContent.trim();
40
+ switch (sortType) {
41
+ case 'numeric':
42
+ return this.direction === 'asc' ? Number(cellA) - Number(cellB) : Number(cellB) - Number(cellA);
43
+ case 'date':
44
+ return this.direction === 'asc'
45
+ ? new Date(cellA).getTime() - new Date(cellB).getTime()
46
+ : new Date(cellB).getTime() - new Date(cellA).getTime();
47
+ case 'string':
48
+ default:
49
+ return this.direction === 'asc'
50
+ ? cellA.localeCompare(cellB)
51
+ : cellB.localeCompare(cellA);
52
+ }
53
+ });
54
+ rows.forEach(row => this.table.querySelector('tbody').appendChild(row));
55
+ const headers = this.table.querySelectorAll('th[data-sort]');
56
+ headers.forEach(th => th.classList.remove('sorted-asc', 'sorted-desc'));
57
+ column.classList.add(this.direction === 'asc' ? 'sorted-asc' : 'sorted-desc');
58
+ }
59
+ sortTable(event) {
60
+ const target = event.target;
61
+ const column = target?.closest('th');
62
+ if (column == null || column.getAttribute('data-sort') == null)
63
+ return;
64
+ this.direction = this.direction === 'asc' ? 'desc' : 'asc';
65
+ this.sortBy = column.getAttribute('data-sort') || column.innerText;
66
+ let sortType = 'string';
67
+ if (this.sortBy != null && this.sortBy.indexOf('|')) {
68
+ }
69
+ if (this.type !== 'remote')
70
+ this.sortInline(column);
71
+ this.dispatchEvent(new CustomEvent('sort', {
72
+ detail: { sortBy: this.sortBy, direction: this.direction, source: event },
73
+ bubbles: true,
74
+ composed: true,
75
+ }));
76
+ }
77
+ render() {
78
+ return html ``; // The component itself doesn't render anything
79
+ }
80
+ }
81
+ __decorate([
82
+ property(),
83
+ __metadata("design:type", String)
84
+ ], QboTableSort.prototype, "direction", void 0);
85
+ __decorate([
86
+ property(),
87
+ __metadata("design:type", String)
88
+ ], QboTableSort.prototype, "selector", void 0);
89
+ __decorate([
90
+ state(),
91
+ __metadata("design:type", Object)
92
+ ], QboTableSort.prototype, "sortBy", void 0);
93
+ __decorate([
94
+ property(),
95
+ __metadata("design:type", Object)
96
+ ], QboTableSort.prototype, "trigger", void 0);
97
+ __decorate([
98
+ property(),
99
+ __metadata("design:type", String)
100
+ ], QboTableSort.prototype, "type", void 0);
101
+ if (!customElements.get('qbo-table-sort'))
102
+ customElements.define('qbo-table-sort', QboTableSort);