@refinitiv-ui/elements 6.8.8 → 6.8.9
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/CHANGELOG.md +177 -442
- package/LICENSE +1 -1
- package/README.md +13 -11
- package/lib/accordion/index.d.ts +1 -1
- package/lib/accordion/index.js +4 -7
- package/lib/appstate-bar/index.d.ts +2 -2
- package/lib/appstate-bar/index.js +10 -4
- package/lib/autosuggest/index.d.ts +7 -7
- package/lib/autosuggest/index.js +85 -80
- package/lib/autosuggest/themes/solar/charcoal/index.js +1 -1
- package/lib/autosuggest/themes/solar/pearl/index.js +1 -1
- package/lib/button/index.js +7 -10
- package/lib/button-bar/index.d.ts +1 -1
- package/lib/button-bar/index.js +12 -12
- package/lib/calendar/index.d.ts +39 -39
- package/lib/calendar/index.js +160 -125
- package/lib/calendar/utils.js +2 -2
- package/lib/canvas/index.d.ts +1 -1
- package/lib/canvas/index.js +2 -4
- package/lib/card/helpers/types.d.ts +2 -2
- package/lib/card/index.d.ts +5 -5
- package/lib/card/index.js +34 -28
- package/lib/chart/helpers/legend.js +10 -8
- package/lib/chart/index.d.ts +3 -3
- package/lib/chart/index.js +17 -17
- package/lib/chart/plugins/doughnut-center-label.js +6 -5
- package/lib/checkbox/index.d.ts +1 -1
- package/lib/checkbox/index.js +12 -13
- package/lib/clock/index.d.ts +55 -55
- package/lib/clock/index.js +84 -95
- package/lib/clock/themes/halo/dark/index.js +1 -1
- package/lib/clock/themes/halo/light/index.js +1 -1
- package/lib/clock/themes/solar/charcoal/index.js +1 -1
- package/lib/clock/themes/solar/pearl/index.js +1 -1
- package/lib/collapse/index.d.ts +1 -1
- package/lib/collapse/index.js +28 -19
- package/lib/collapse/themes/halo/dark/index.js +1 -1
- package/lib/collapse/themes/halo/light/index.js +1 -1
- package/lib/color-dialog/elements/color-palettes.d.ts +1 -1
- package/lib/color-dialog/elements/color-palettes.js +5 -6
- package/lib/color-dialog/elements/grayscale-palettes.d.ts +1 -1
- package/lib/color-dialog/elements/grayscale-palettes.js +9 -9
- package/lib/color-dialog/elements/palettes.js +5 -4
- package/lib/color-dialog/helpers/value-model.js +7 -9
- package/lib/color-dialog/index.d.ts +6 -6
- package/lib/color-dialog/index.js +53 -37
- package/lib/color-picker/index.d.ts +2 -2
- package/lib/color-picker/index.js +40 -34
- package/lib/combo-box/helpers/filter.d.ts +2 -2
- package/lib/combo-box/helpers/types.d.ts +1 -1
- package/lib/combo-box/index.d.ts +9 -9
- package/lib/combo-box/index.js +61 -55
- package/lib/configuration/elements/configuration.js +2 -2
- package/lib/counter/index.d.ts +4 -4
- package/lib/counter/index.js +9 -7
- package/lib/datetime-field/index.d.ts +4 -5
- package/lib/datetime-field/index.js +32 -23
- package/lib/datetime-field/utils.js +11 -1
- package/lib/datetime-picker/index.d.ts +75 -75
- package/lib/datetime-picker/index.js +151 -132
- package/lib/datetime-picker/locales.js +5 -5
- package/lib/datetime-picker/utils.js +9 -9
- package/lib/dialog/draggable-element.js +1 -2
- package/lib/dialog/index.d.ts +6 -6
- package/lib/dialog/index.js +48 -38
- package/lib/email-field/index.d.ts +1 -1
- package/lib/email-field/index.js +6 -6
- package/lib/events.d.ts +1 -1
- package/lib/flag/index.d.ts +1 -1
- package/lib/flag/index.js +6 -5
- package/lib/flag/utils/FlagLoader.js +1 -1
- package/lib/header/index.d.ts +1 -1
- package/lib/header/index.js +2 -2
- package/lib/header/themes/halo/dark/index.js +1 -1
- package/lib/header/themes/halo/light/index.js +1 -1
- package/lib/header/themes/solar/charcoal/index.js +1 -1
- package/lib/header/themes/solar/pearl/index.js +1 -1
- package/lib/heatmap/helpers/color.d.ts +1 -1
- package/lib/heatmap/helpers/color.js +11 -5
- package/lib/heatmap/helpers/track.js +3 -3
- package/lib/heatmap/index.d.ts +9 -9
- package/lib/heatmap/index.js +51 -42
- package/lib/icon/index.d.ts +2 -2
- package/lib/icon/index.js +6 -8
- package/lib/icon/utils/IconLoader.d.ts +1 -0
- package/lib/icon/utils/IconLoader.js +9 -1
- package/lib/interactive-chart/helpers/types.d.ts +3 -3
- package/lib/interactive-chart/index.d.ts +34 -34
- package/lib/interactive-chart/index.js +72 -57
- package/lib/item/helpers/types.d.ts +1 -1
- package/lib/item/index.d.ts +3 -3
- package/lib/item/index.js +24 -20
- package/lib/jsx.d.ts +6 -4
- package/lib/label/index.d.ts +1 -1
- package/lib/label/index.js +11 -8
- package/lib/layout/index.d.ts +7 -7
- package/lib/layout/index.js +7 -7
- package/lib/led-gauge/index.d.ts +1 -1
- package/lib/led-gauge/index.js +10 -10
- package/lib/list/elements/list.d.ts +3 -3
- package/lib/list/elements/list.js +10 -12
- package/lib/list/helpers/renderer.js +2 -2
- package/lib/list/helpers/types.d.ts +1 -1
- package/lib/list/index.d.ts +1 -1
- package/lib/list/renderer.d.ts +7 -7
- package/lib/loader/index.js +7 -8
- package/lib/multi-input/index.d.ts +6 -6
- package/lib/multi-input/index.js +39 -45
- package/lib/notification/elements/notification-tray.d.ts +2 -2
- package/lib/notification/elements/notification-tray.js +3 -3
- package/lib/notification/elements/notification.d.ts +2 -2
- package/lib/notification/elements/notification.js +22 -14
- package/lib/notification/helpers/status.js +1 -1
- package/lib/number-field/index.d.ts +5 -6
- package/lib/number-field/index.js +37 -47
- package/lib/overlay/elements/overlay-viewport.d.ts +1 -1
- package/lib/overlay/elements/overlay.d.ts +2 -2
- package/lib/overlay/elements/overlay.js +154 -98
- package/lib/overlay/helpers/types.d.ts +1 -1
- package/lib/overlay/managers/backdrop-manager.d.ts +1 -1
- package/lib/overlay/managers/backdrop-manager.js +2 -2
- package/lib/overlay/managers/close-manager.js +2 -1
- package/lib/overlay/managers/focus-manager.js +23 -13
- package/lib/overlay/managers/interaction-lock-manager.d.ts +4 -4
- package/lib/overlay/managers/interaction-lock-manager.js +33 -25
- package/lib/overlay/managers/viewport-manager.d.ts +2 -2
- package/lib/overlay/managers/viewport-manager.js +3 -2
- package/lib/overlay/managers/zindex-manager.js +4 -2
- package/lib/overlay-menu/helpers/types.d.ts +2 -2
- package/lib/overlay-menu/index.d.ts +1 -1
- package/lib/overlay-menu/index.js +44 -33
- package/lib/overlay-menu/managers/menu-manager.d.ts +10 -10
- package/lib/overlay-menu/managers/menu-manager.js +15 -13
- package/lib/pagination/index.d.ts +4 -4
- package/lib/pagination/index.js +39 -14
- package/lib/panel/index.js +1 -1
- package/lib/password-field/index.d.ts +2 -2
- package/lib/password-field/index.js +4 -4
- package/lib/pill/index.d.ts +1 -1
- package/lib/pill/index.js +22 -19
- package/lib/progress-bar/index.d.ts +1 -1
- package/lib/progress-bar/index.js +38 -37
- package/lib/radio-button/index.d.ts +2 -2
- package/lib/radio-button/index.js +17 -12
- package/lib/radio-button/radio-button-registry.js +8 -5
- package/lib/rating/index.d.ts +1 -1
- package/lib/rating/index.js +2 -5
- package/lib/rating/utils.d.ts +6 -6
- package/lib/rating/utils.js +6 -6
- package/lib/search-field/index.d.ts +2 -2
- package/lib/search-field/index.js +4 -4
- package/lib/select/index.d.ts +34 -34
- package/lib/select/index.js +69 -82
- package/lib/sidebar-layout/index.d.ts +2 -2
- package/lib/sidebar-layout/index.js +7 -9
- package/lib/slider/index.d.ts +2 -2
- package/lib/slider/index.js +57 -45
- package/lib/slider/utils.d.ts +10 -10
- package/lib/slider/utils.js +10 -10
- package/lib/sparkline/index.d.ts +1 -1
- package/lib/sparkline/index.js +7 -8
- package/lib/swing-gauge/helpers.js +2 -2
- package/lib/swing-gauge/index.d.ts +19 -19
- package/lib/swing-gauge/index.js +91 -81
- package/lib/tab/index.d.ts +1 -1
- package/lib/tab/index.js +16 -27
- package/lib/tab/themes/halo/dark/index.js +1 -1
- package/lib/tab/themes/halo/light/index.js +1 -1
- package/lib/tab/themes/solar/charcoal/index.js +1 -1
- package/lib/tab/themes/solar/pearl/index.js +1 -1
- package/lib/tab-bar/helpers/animate.js +1 -1
- package/lib/tab-bar/index.d.ts +1 -1
- package/lib/tab-bar/index.js +34 -18
- package/lib/tab-bar/themes/halo/dark/index.js +1 -1
- package/lib/tab-bar/themes/halo/light/index.js +1 -1
- package/lib/text-field/index.d.ts +1 -1
- package/lib/text-field/index.js +36 -33
- package/lib/time-picker/index.d.ts +6 -6
- package/lib/time-picker/index.js +104 -90
- package/lib/toggle/index.d.ts +1 -1
- package/lib/toggle/index.js +4 -3
- package/lib/tooltip/elements/title-tooltip.js +2 -2
- package/lib/tooltip/index.d.ts +27 -27
- package/lib/tooltip/index.js +42 -38
- package/lib/tooltip/managers/tooltip-manager.d.ts +1 -1
- package/lib/tornado-chart/elements/tornado-chart.d.ts +1 -1
- package/lib/tornado-chart/elements/tornado-chart.js +1 -1
- package/lib/tornado-chart/elements/tornado-item.d.ts +2 -2
- package/lib/tornado-chart/elements/tornado-item.js +12 -10
- package/lib/tree/elements/tree-item.d.ts +3 -3
- package/lib/tree/elements/tree-item.js +21 -19
- package/lib/tree/elements/tree.d.ts +1 -1
- package/lib/tree/elements/tree.js +12 -11
- package/lib/tree/helpers/renderer.js +4 -3
- package/lib/tree/index.d.ts +1 -1
- package/lib/tree/managers/tree-manager.d.ts +1 -1
- package/lib/tree/managers/tree-manager.js +17 -18
- package/lib/tree/themes/solar/charcoal/index.js +1 -1
- package/lib/tree/themes/solar/pearl/index.js +1 -1
- package/lib/tree-select/index.d.ts +9 -9
- package/lib/tree-select/index.js +91 -82
- package/lib/tree-select/themes/halo/dark/index.js +1 -1
- package/lib/tree-select/themes/halo/light/index.js +1 -1
- package/lib/tree-select/themes/solar/charcoal/index.js +1 -1
- package/lib/tree-select/themes/solar/pearl/index.js +1 -1
- package/lib/version.js +1 -1
- package/package.json +16 -16
- package/tsconfig.tsbuildinfo +1 -1
package/lib/select/index.js
CHANGED
|
@@ -1,31 +1,25 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { ControlElement,
|
|
2
|
+
import { ControlElement, FocusedPropertyKey, css, html } from '@refinitiv-ui/core';
|
|
3
3
|
import { customElement } from '@refinitiv-ui/core/decorators/custom-element.js';
|
|
4
4
|
import { property } from '@refinitiv-ui/core/decorators/property.js';
|
|
5
|
-
import { styleMap } from '@refinitiv-ui/core/directives/style-map.js';
|
|
6
5
|
import { createRef, ref } from '@refinitiv-ui/core/directives/ref.js';
|
|
7
|
-
import {
|
|
8
|
-
import '
|
|
9
|
-
import '../item/index.js';
|
|
10
|
-
import '../icon/index.js';
|
|
11
|
-
import { Item } from '../item/index.js';
|
|
6
|
+
import { styleMap } from '@refinitiv-ui/core/directives/style-map.js';
|
|
7
|
+
import { AnimationTaskRunner, TimeoutTaskRunner } from '@refinitiv-ui/utils/async.js';
|
|
12
8
|
import { CollectionComposer } from '@refinitiv-ui/utils/collection.js';
|
|
13
|
-
import { TimeoutTaskRunner, AnimationTaskRunner } from '@refinitiv-ui/utils/async.js';
|
|
14
9
|
import { isElementOverflown } from '@refinitiv-ui/utils/element.js';
|
|
10
|
+
import '../icon/index.js';
|
|
11
|
+
import '../item/index.js';
|
|
12
|
+
import { Item } from '../item/index.js';
|
|
13
|
+
import '../overlay/index.js';
|
|
15
14
|
import { registerOverflowTooltip } from '../tooltip/index.js';
|
|
15
|
+
import { VERSION } from '../version.js';
|
|
16
16
|
// Observer config for items
|
|
17
17
|
const observerOptions = {
|
|
18
18
|
subtree: true,
|
|
19
19
|
childList: true,
|
|
20
20
|
attributes: true,
|
|
21
21
|
characterData: true,
|
|
22
|
-
attributeFilter: [
|
|
23
|
-
'label',
|
|
24
|
-
'value',
|
|
25
|
-
'selected',
|
|
26
|
-
'disabled',
|
|
27
|
-
'readonly'
|
|
28
|
-
]
|
|
22
|
+
attributeFilter: ['label', 'value', 'selected', 'disabled', 'readonly']
|
|
29
23
|
};
|
|
30
24
|
const LABEL_SEPARATOR = ', '; // TODO: for multiselect
|
|
31
25
|
const POPUP_POSITION = ['bottom-start', 'top-start'];
|
|
@@ -61,20 +55,20 @@ let Select = class Select extends ControlElement {
|
|
|
61
55
|
this.keySearchThrottler = new TimeoutTaskRunner(KEY_SEARCH_DEBOUNCER);
|
|
62
56
|
this.resizeThrottler = new AnimationTaskRunner();
|
|
63
57
|
/**
|
|
64
|
-
|
|
65
|
-
|
|
58
|
+
* Placeholder to display when no value is set
|
|
59
|
+
*/
|
|
66
60
|
this.placeholder = '';
|
|
67
61
|
/**
|
|
68
|
-
|
|
69
|
-
|
|
62
|
+
* Toggles the opened state of the list
|
|
63
|
+
*/
|
|
70
64
|
this.opened = false;
|
|
71
65
|
/**
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
* Set state to error
|
|
67
|
+
*/
|
|
74
68
|
this.error = false;
|
|
75
69
|
/**
|
|
76
|
-
|
|
77
|
-
|
|
70
|
+
* Set state to warning
|
|
71
|
+
*/
|
|
78
72
|
this.warning = false;
|
|
79
73
|
/**
|
|
80
74
|
* This variable is here to ensure that the value and data are in sync when data is set after the value.
|
|
@@ -98,8 +92,7 @@ let Select = class Select extends ControlElement {
|
|
|
98
92
|
* @returns {void}
|
|
99
93
|
*/
|
|
100
94
|
this.handleMutations = (mutations) => {
|
|
101
|
-
const hasLightDomMutations = mutations
|
|
102
|
-
.some(m => m.target.getRootNode() !== this.shadowRoot);
|
|
95
|
+
const hasLightDomMutations = mutations.some((m) => m.target.getRootNode() !== this.shadowRoot);
|
|
103
96
|
if (hasLightDomMutations) {
|
|
104
97
|
this.requestUpdate();
|
|
105
98
|
}
|
|
@@ -136,19 +129,19 @@ let Select = class Select extends ControlElement {
|
|
|
136
129
|
display: inline-block;
|
|
137
130
|
}
|
|
138
131
|
|
|
139
|
-
[part=label],
|
|
140
|
-
[part=placeholder] {
|
|
132
|
+
[part='label'],
|
|
133
|
+
[part='placeholder'] {
|
|
141
134
|
white-space: nowrap;
|
|
142
135
|
overflow: hidden;
|
|
143
136
|
text-overflow: ellipsis;
|
|
144
137
|
}
|
|
145
|
-
[part=icon] {
|
|
138
|
+
[part='icon'] {
|
|
146
139
|
flex: none;
|
|
147
140
|
}
|
|
148
|
-
:host [part=list] {
|
|
141
|
+
:host [part='list'] {
|
|
149
142
|
overflow-y: auto;
|
|
150
143
|
}
|
|
151
|
-
:host [part=
|
|
144
|
+
:host [part='list'] ::slotted(:not(ef-item)) {
|
|
152
145
|
display: none;
|
|
153
146
|
}
|
|
154
147
|
#box {
|
|
@@ -190,42 +183,42 @@ let Select = class Select extends ControlElement {
|
|
|
190
183
|
`;
|
|
191
184
|
}
|
|
192
185
|
/**
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
186
|
+
* Current text content of the selected value
|
|
187
|
+
* @readonly
|
|
188
|
+
*/
|
|
196
189
|
get label() {
|
|
197
190
|
return this.labels[0];
|
|
198
191
|
}
|
|
199
192
|
/**
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
193
|
+
* Current text content of the selected values
|
|
194
|
+
* @ignore
|
|
195
|
+
* @readonly
|
|
196
|
+
*/
|
|
204
197
|
get labels() {
|
|
205
198
|
if (this.hasDataItems()) {
|
|
206
|
-
return this.selectedDataItems.map(item => this.composer.getItemPropertyValue(item, 'label'));
|
|
199
|
+
return this.selectedDataItems.map((item) => this.composer.getItemPropertyValue(item, 'label'));
|
|
207
200
|
}
|
|
208
|
-
return this.selectedSlotItems.map(item => this.getItemLabel(item));
|
|
201
|
+
return this.selectedSlotItems.map((item) => this.getItemLabel(item));
|
|
209
202
|
}
|
|
210
203
|
/**
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
204
|
+
* Switch to multiple select input
|
|
205
|
+
* @ignore
|
|
206
|
+
* @param multiple True if element needs to support multi selection
|
|
207
|
+
*/
|
|
215
208
|
set multiple(multiple) {
|
|
216
209
|
// TODO: not implemented
|
|
217
210
|
}
|
|
218
211
|
/**
|
|
219
|
-
|
|
220
|
-
|
|
212
|
+
* @ignore
|
|
213
|
+
*/
|
|
221
214
|
get multiple() {
|
|
222
215
|
return false;
|
|
223
216
|
}
|
|
224
217
|
/**
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
218
|
+
* Construct the menu from data object. Cannot be used with slotted content
|
|
219
|
+
* @type {SelectData | null}
|
|
220
|
+
* @default null
|
|
221
|
+
*/
|
|
229
222
|
get data() {
|
|
230
223
|
return this._data;
|
|
231
224
|
}
|
|
@@ -249,10 +242,10 @@ let Select = class Select extends ControlElement {
|
|
|
249
242
|
this.requestUpdate('data', oldValue);
|
|
250
243
|
}
|
|
251
244
|
/**
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
245
|
+
* Value of the element
|
|
246
|
+
* @param value Element value
|
|
247
|
+
* @default -
|
|
248
|
+
*/
|
|
256
249
|
set value(value) {
|
|
257
250
|
value = this.castValue(value);
|
|
258
251
|
this.cachedValue = value;
|
|
@@ -276,9 +269,9 @@ let Select = class Select extends ControlElement {
|
|
|
276
269
|
*/
|
|
277
270
|
get values() {
|
|
278
271
|
if (this.hasDataItems()) {
|
|
279
|
-
return this.selectedDataItems.map(item => this.composer.getItemPropertyValue(item, 'value'));
|
|
272
|
+
return this.selectedDataItems.map((item) => this.composer.getItemPropertyValue(item, 'value'));
|
|
280
273
|
}
|
|
281
|
-
return this.selectedSlotItems.map(item => this.getItemValue(item));
|
|
274
|
+
return this.selectedSlotItems.map((item) => this.getItemValue(item));
|
|
282
275
|
}
|
|
283
276
|
/**
|
|
284
277
|
* Called when connected to DOM
|
|
@@ -295,7 +288,8 @@ let Select = class Select extends ControlElement {
|
|
|
295
288
|
* @returns {void}
|
|
296
289
|
*/
|
|
297
290
|
update(changedProperties) {
|
|
298
|
-
this.cachedValue =
|
|
291
|
+
this.cachedValue =
|
|
292
|
+
''; /* reset cached value as it is only valid when value and data are set the same time */
|
|
299
293
|
const focusedChanged = changedProperties.has(FocusedPropertyKey);
|
|
300
294
|
// the opened logic is bound to focus state
|
|
301
295
|
if (focusedChanged) {
|
|
@@ -327,7 +321,7 @@ let Select = class Select extends ControlElement {
|
|
|
327
321
|
firstUpdated(changedProperties) {
|
|
328
322
|
super.firstUpdated(changedProperties);
|
|
329
323
|
this.addEventListener('keydown', this.onKeyDown); /* keydown when select is closed */
|
|
330
|
-
registerOverflowTooltip(this, () => this.labelText, () => this.labelRef.value ? isElementOverflown(this.labelRef.value) : false);
|
|
324
|
+
registerOverflowTooltip(this, () => this.labelText, () => (this.labelRef.value ? isElementOverflown(this.labelRef.value) : false));
|
|
331
325
|
}
|
|
332
326
|
/**
|
|
333
327
|
* Called when element finished updating
|
|
@@ -397,7 +391,8 @@ let Select = class Select extends ControlElement {
|
|
|
397
391
|
// this code might happen only when opened has been set during initialisation
|
|
398
392
|
// or when display is set to none
|
|
399
393
|
this.resizeThrottler.schedule(() => {
|
|
400
|
-
if (this.offsetWidth) {
|
|
394
|
+
if (this.offsetWidth) {
|
|
395
|
+
/* must be here to avoid infinitive loop */
|
|
401
396
|
this.restrictPopupWidth();
|
|
402
397
|
this.requestUpdate();
|
|
403
398
|
}
|
|
@@ -500,7 +495,7 @@ let Select = class Select extends ControlElement {
|
|
|
500
495
|
*/
|
|
501
496
|
onPopupClosed({ target }) {
|
|
502
497
|
const eventOptions = {
|
|
503
|
-
capture: true,
|
|
498
|
+
/* need this for IE11, otherwise the event is not removed */ capture: true,
|
|
504
499
|
passive: true
|
|
505
500
|
};
|
|
506
501
|
target?.removeEventListener('scroll', this.onPopupScroll, eventOptions);
|
|
@@ -601,10 +596,7 @@ let Select = class Select extends ControlElement {
|
|
|
601
596
|
*/
|
|
602
597
|
isValidFilterKey(event) {
|
|
603
598
|
// all printable keys have length of 1. This is better than regexp as we cover all non latin characters
|
|
604
|
-
return event.key.length === 1
|
|
605
|
-
&& !event.ctrlKey
|
|
606
|
-
&& !event.altKey
|
|
607
|
-
&& !event.metaKey;
|
|
599
|
+
return event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey;
|
|
608
600
|
}
|
|
609
601
|
/**
|
|
610
602
|
* Focus and highlight element according to specified direction
|
|
@@ -676,7 +668,7 @@ let Select = class Select extends ControlElement {
|
|
|
676
668
|
let selectableElements = this.getSelectableElements();
|
|
677
669
|
const highlightedIdx = this.highlightedItem ? selectableElements.indexOf(this.highlightedItem) : -1;
|
|
678
670
|
selectableElements = selectableElements.concat(selectableElements.splice(0, highlightedIdx));
|
|
679
|
-
const focusElement = selectableElements.find(item => {
|
|
671
|
+
const focusElement = selectableElements.find((item) => {
|
|
680
672
|
const label = this.getItemLabel(item).toLowerCase();
|
|
681
673
|
return label.startsWith(this.keySearchTerm) && item !== this.highlightedItem;
|
|
682
674
|
});
|
|
@@ -738,7 +730,7 @@ let Select = class Select extends ControlElement {
|
|
|
738
730
|
* @returns A list of selected elements
|
|
739
731
|
*/
|
|
740
732
|
getSelectedElements() {
|
|
741
|
-
return this.getSelectableElements().filter(item => item.selected);
|
|
733
|
+
return this.getSelectableElements().filter((item) => item.selected);
|
|
742
734
|
}
|
|
743
735
|
/**
|
|
744
736
|
* Clears the current selected items
|
|
@@ -749,7 +741,7 @@ let Select = class Select extends ControlElement {
|
|
|
749
741
|
this.selectedDataItems.forEach((item) => this.composer.setItemPropertyValue(item, 'selected', false));
|
|
750
742
|
}
|
|
751
743
|
else {
|
|
752
|
-
this.selectedSlotItems.forEach(item => {
|
|
744
|
+
this.selectedSlotItems.forEach((item) => {
|
|
753
745
|
item.selected = false;
|
|
754
746
|
});
|
|
755
747
|
}
|
|
@@ -861,11 +853,7 @@ let Select = class Select extends ControlElement {
|
|
|
861
853
|
case 'divider':
|
|
862
854
|
return html `<ef-item role="presentation" part="item" type="divider"></ef-item>`;
|
|
863
855
|
case 'header':
|
|
864
|
-
return html `<ef-item
|
|
865
|
-
role="presentation"
|
|
866
|
-
part="item"
|
|
867
|
-
type="header"
|
|
868
|
-
.label=${item.label}></ef-item>`;
|
|
856
|
+
return html `<ef-item role="presentation" part="item" type="header" .label=${item.label}></ef-item>`;
|
|
869
857
|
// no default
|
|
870
858
|
}
|
|
871
859
|
return html `<ef-item
|
|
@@ -910,11 +898,11 @@ let Select = class Select extends ControlElement {
|
|
|
910
898
|
* Get data iterator template
|
|
911
899
|
*/
|
|
912
900
|
get dataContent() {
|
|
913
|
-
return html `${this.composer.queryItems(() => true).map(item => this.toItem(item))}`;
|
|
901
|
+
return html `${this.composer.queryItems(() => true).map((item) => this.toItem(item))}`;
|
|
914
902
|
}
|
|
915
903
|
/**
|
|
916
|
-
|
|
917
|
-
|
|
904
|
+
* Edit template when select is not readonly or disabled
|
|
905
|
+
*/
|
|
918
906
|
get popupTemplate() {
|
|
919
907
|
if (this.lazyRendered) {
|
|
920
908
|
return html `<ef-overlay
|
|
@@ -935,7 +923,9 @@ let Select = class Select extends ControlElement {
|
|
|
935
923
|
@opened-changed="${this.onPopupOpenedChanged}"
|
|
936
924
|
@opened="${this.onPopupOpened}"
|
|
937
925
|
@refit=${this.onPopupRefit}
|
|
938
|
-
@closed="${this.onPopupClosed}"
|
|
926
|
+
@closed="${this.onPopupClosed}"
|
|
927
|
+
>${this.hasDataItems() ? this.dataContent : this.slottedContent}</ef-overlay
|
|
928
|
+
>`;
|
|
939
929
|
}
|
|
940
930
|
else {
|
|
941
931
|
// This code is required because IE11 polyfill need items to be within a slot
|
|
@@ -949,14 +939,11 @@ let Select = class Select extends ControlElement {
|
|
|
949
939
|
* @return Render template
|
|
950
940
|
*/
|
|
951
941
|
render() {
|
|
952
|
-
return html `
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
${this.placeholderHidden() ? this.labelTemplate : this.placeholderTemplate}
|
|
942
|
+
return html ` <div id="box">
|
|
943
|
+
<div id="text">${this.placeholderHidden() ? this.labelTemplate : this.placeholderTemplate}</div>
|
|
944
|
+
<ef-icon icon="down" part="icon"></ef-icon>
|
|
956
945
|
</div>
|
|
957
|
-
|
|
958
|
-
</div>
|
|
959
|
-
${this.editTemplate}`;
|
|
946
|
+
${this.editTemplate}`;
|
|
960
947
|
}
|
|
961
948
|
};
|
|
962
949
|
__decorate([
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { JSXInterface } from '../jsx';
|
|
2
|
-
import { BasicElement,
|
|
3
|
-
import type { Layout } from '../layout';
|
|
2
|
+
import { BasicElement, CSSResultGroup, PropertyValues, TemplateResult } from '@refinitiv-ui/core';
|
|
4
3
|
import '../layout/index.js';
|
|
4
|
+
import type { Layout } from '../layout';
|
|
5
5
|
/**
|
|
6
6
|
* Provides an app layout with sidebar.
|
|
7
7
|
* There are 4 sections that can be slotted a component in.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { BasicElement,
|
|
2
|
+
import { BasicElement, css, html, nothing } from '@refinitiv-ui/core';
|
|
3
3
|
import { customElement } from '@refinitiv-ui/core/decorators/custom-element.js';
|
|
4
4
|
import { property } from '@refinitiv-ui/core/decorators/property.js';
|
|
5
5
|
import { query } from '@refinitiv-ui/core/decorators/query.js';
|
|
6
|
-
import { VERSION } from '../version.js';
|
|
7
6
|
import '../layout/index.js';
|
|
7
|
+
import { VERSION } from '../version.js';
|
|
8
8
|
/**
|
|
9
9
|
* Provides an app layout with sidebar.
|
|
10
10
|
* There are 4 sections that can be slotted a component in.
|
|
@@ -45,7 +45,7 @@ let SidebarLayout = class SidebarLayout extends BasicElement {
|
|
|
45
45
|
display: block;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
[part=container] {
|
|
48
|
+
[part='container'] {
|
|
49
49
|
height: 100%;
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -58,16 +58,16 @@ let SidebarLayout = class SidebarLayout extends BasicElement {
|
|
|
58
58
|
height: 100%;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
[part=sidebar] {
|
|
61
|
+
[part='sidebar'] {
|
|
62
62
|
width: var(--sidebar-width);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
:host([collapsed]:not([sidebar-position])) [part=sidebar],
|
|
66
|
-
:host([collapsed][sidebar-position=left]) [part=sidebar] {
|
|
65
|
+
:host([collapsed]:not([sidebar-position])) [part='sidebar'],
|
|
66
|
+
:host([collapsed][sidebar-position='left']) [part='sidebar'] {
|
|
67
67
|
margin-left: calc(var(--sidebar-width) * -1);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
:host([collapsed][sidebar-position=right]) [part=sidebar] {
|
|
70
|
+
:host([collapsed][sidebar-position='right']) [part='sidebar'] {
|
|
71
71
|
margin-right: calc(var(--sidebar-width) * -1);
|
|
72
72
|
}
|
|
73
73
|
`;
|
|
@@ -80,7 +80,6 @@ let SidebarLayout = class SidebarLayout extends BasicElement {
|
|
|
80
80
|
render() {
|
|
81
81
|
return html `
|
|
82
82
|
<ef-layout flex nowrap part="container">
|
|
83
|
-
|
|
84
83
|
<ef-layout flex container part="sidebar" size="${this.sidebarWidth || nothing}">
|
|
85
84
|
<ef-layout size="auto">
|
|
86
85
|
<slot name="sidebar-header"></slot>
|
|
@@ -98,7 +97,6 @@ let SidebarLayout = class SidebarLayout extends BasicElement {
|
|
|
98
97
|
<slot name="main-content"></slot>
|
|
99
98
|
</ef-layout>
|
|
100
99
|
</ef-layout>
|
|
101
|
-
|
|
102
100
|
</ef-layout>
|
|
103
101
|
`;
|
|
104
102
|
}
|
package/lib/slider/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { JSXInterface } from '../jsx';
|
|
2
|
-
import {
|
|
3
|
-
import { TranslateDirective } from '@refinitiv-ui/translate';
|
|
2
|
+
import { CSSResultGroup, ControlElement, PropertyValues, TemplateResult } from '@refinitiv-ui/core';
|
|
4
3
|
import '@refinitiv-ui/phrasebook/locale/en/slider.js';
|
|
4
|
+
import { TranslateDirective } from '@refinitiv-ui/translate';
|
|
5
5
|
import '../number-field/index.js';
|
|
6
6
|
/**
|
|
7
7
|
* Allows users to make selections from a range of values
|
package/lib/slider/index.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import {
|
|
2
|
+
import { ControlElement, WarningNotice, css, html, nothing } from '@refinitiv-ui/core';
|
|
3
3
|
import { customElement } from '@refinitiv-ui/core/decorators/custom-element.js';
|
|
4
4
|
import { property } from '@refinitiv-ui/core/decorators/property.js';
|
|
5
5
|
import { query } from '@refinitiv-ui/core/decorators/query.js';
|
|
6
6
|
import { state } from '@refinitiv-ui/core/decorators/state.js';
|
|
7
7
|
import { createRef, ref } from '@refinitiv-ui/core/directives/ref.js';
|
|
8
8
|
import { styleMap } from '@refinitiv-ui/core/directives/style-map.js';
|
|
9
|
-
import { translate } from '@refinitiv-ui/translate';
|
|
10
9
|
import '@refinitiv-ui/phrasebook/locale/en/slider.js';
|
|
11
|
-
import {
|
|
10
|
+
import { translate } from '@refinitiv-ui/translate';
|
|
12
11
|
import '../number-field/index.js';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
12
|
+
import { VERSION } from '../version.js';
|
|
13
|
+
import { Direction, SliderDataName } from './constants.js';
|
|
14
|
+
import { clamp, countDecimalPlace, isDecimalNumber, preventDefault } from './utils.js';
|
|
15
15
|
/**
|
|
16
16
|
* Allows users to make selections from a range of values
|
|
17
17
|
*
|
|
@@ -45,67 +45,67 @@ let Slider = class Slider extends ControlElement {
|
|
|
45
45
|
:host {
|
|
46
46
|
display: flex;
|
|
47
47
|
}
|
|
48
|
-
[part=slider-wrapper] {
|
|
48
|
+
[part='slider-wrapper'] {
|
|
49
49
|
position: relative;
|
|
50
50
|
width: 100%;
|
|
51
51
|
}
|
|
52
|
-
[part=slider] {
|
|
52
|
+
[part='slider'] {
|
|
53
53
|
width: 100%;
|
|
54
54
|
height: 100%;
|
|
55
55
|
display: inline-block;
|
|
56
56
|
}
|
|
57
|
-
:host(:not([disabled]):focus){
|
|
58
|
-
outline:none;
|
|
57
|
+
:host(:not([disabled]):focus) {
|
|
58
|
+
outline: none;
|
|
59
59
|
}
|
|
60
|
-
:host([show-steps]) [part=track-wrapper]::after {
|
|
61
|
-
display:block;
|
|
60
|
+
:host([show-steps]) [part='track-wrapper']::after {
|
|
61
|
+
display: block;
|
|
62
62
|
position: absolute;
|
|
63
|
-
content:
|
|
63
|
+
content: '';
|
|
64
64
|
right: 0;
|
|
65
65
|
}
|
|
66
|
-
[part=track-wrapper]{
|
|
67
|
-
content:
|
|
66
|
+
[part='track-wrapper'] {
|
|
67
|
+
content: '';
|
|
68
68
|
position: absolute;
|
|
69
69
|
width: 100%;
|
|
70
70
|
top: 50%;
|
|
71
71
|
left: 0;
|
|
72
72
|
pointer-events: none;
|
|
73
73
|
}
|
|
74
|
-
[part=thumb-container]{
|
|
74
|
+
[part='thumb-container'] {
|
|
75
75
|
outline: none;
|
|
76
76
|
position: absolute;
|
|
77
77
|
top: 0;
|
|
78
78
|
width: 100%;
|
|
79
79
|
z-index: 3;
|
|
80
80
|
}
|
|
81
|
-
[part=thumb]{
|
|
81
|
+
[part='thumb'] {
|
|
82
82
|
position: absolute;
|
|
83
83
|
margin: 0 auto;
|
|
84
84
|
}
|
|
85
|
-
[part=pin]{
|
|
85
|
+
[part='pin'] {
|
|
86
86
|
display: flex;
|
|
87
87
|
position: absolute;
|
|
88
88
|
align-items: center;
|
|
89
89
|
justify-content: center;
|
|
90
90
|
z-index: 1;
|
|
91
91
|
}
|
|
92
|
-
:host([show-steps]) [part=step-container]{
|
|
92
|
+
:host([show-steps]) [part='step-container'] {
|
|
93
93
|
position: absolute;
|
|
94
94
|
left: 0;
|
|
95
95
|
width: 100%;
|
|
96
96
|
}
|
|
97
|
-
:host([show-steps]) [part=step]{
|
|
97
|
+
:host([show-steps]) [part='step'] {
|
|
98
98
|
width: 100%;
|
|
99
99
|
position: absolute;
|
|
100
100
|
left: 0;
|
|
101
101
|
}
|
|
102
|
-
[part=track-fill]{
|
|
102
|
+
[part='track-fill'] {
|
|
103
103
|
z-index: 2;
|
|
104
|
-
content:
|
|
104
|
+
content: '';
|
|
105
105
|
position: absolute;
|
|
106
106
|
left: 0;
|
|
107
107
|
}
|
|
108
|
-
:host([show-steps][step=
|
|
108
|
+
:host([show-steps][step='0']) [part='track-wrapper']::after {
|
|
109
109
|
width: 0;
|
|
110
110
|
}
|
|
111
111
|
`;
|
|
@@ -299,19 +299,19 @@ let Slider = class Slider extends ControlElement {
|
|
|
299
299
|
this.changedThumb = null;
|
|
300
300
|
/**
|
|
301
301
|
* @ignore
|
|
302
|
-
|
|
302
|
+
*/
|
|
303
303
|
this.onDrag = this.onDrag.bind(this);
|
|
304
304
|
/**
|
|
305
305
|
* @ignore
|
|
306
|
-
|
|
306
|
+
*/
|
|
307
307
|
this.onDragStart = this.onDragStart.bind(this);
|
|
308
308
|
/**
|
|
309
309
|
* @ignore
|
|
310
|
-
|
|
310
|
+
*/
|
|
311
311
|
this.onDragEnd = this.onDragEnd.bind(this);
|
|
312
312
|
/**
|
|
313
313
|
* @ignore
|
|
314
|
-
|
|
314
|
+
*/
|
|
315
315
|
this.onKeyDown = this.onKeyDown.bind(this);
|
|
316
316
|
}
|
|
317
317
|
/**
|
|
@@ -332,8 +332,8 @@ let Slider = class Slider extends ControlElement {
|
|
|
332
332
|
*/
|
|
333
333
|
willUpdate(changedProperties) {
|
|
334
334
|
super.willUpdate(changedProperties);
|
|
335
|
-
if ((changedProperties.has('disabled') && changedProperties.get('disabled') !== undefined)
|
|
336
|
-
|
|
335
|
+
if ((changedProperties.has('disabled') && changedProperties.get('disabled') !== undefined) ||
|
|
336
|
+
(changedProperties.has('readonly') && changedProperties.get('readonly') !== undefined)) {
|
|
337
337
|
this.prepareSliderTrack();
|
|
338
338
|
}
|
|
339
339
|
changedProperties.forEach((_, changedProperty) => {
|
|
@@ -398,21 +398,21 @@ let Slider = class Slider extends ControlElement {
|
|
|
398
398
|
message = 'value should be more than min.';
|
|
399
399
|
}
|
|
400
400
|
else if (propName === 'from' && this.range) {
|
|
401
|
-
isValid =
|
|
401
|
+
isValid = this.fromNumber >= this.minNumber && this.fromNumber <= this.toNumber;
|
|
402
402
|
message = 'value should be more than min and less than to.';
|
|
403
403
|
}
|
|
404
404
|
else if (propName === 'to' && this.range) {
|
|
405
|
-
isValid =
|
|
405
|
+
isValid = this.toNumber <= this.maxNumber && this.toNumber >= this.fromNumber;
|
|
406
406
|
message = 'value should be less than max and more than from.';
|
|
407
407
|
}
|
|
408
408
|
else if (propName === 'step') {
|
|
409
|
-
isValid =
|
|
409
|
+
isValid = this.maxNumber - this.minNumber >= this.stepNumber;
|
|
410
410
|
message = 'value should be between min and max.';
|
|
411
411
|
}
|
|
412
412
|
else if (propName === 'minRange' && this.minRangeNumber > 0) {
|
|
413
413
|
const distanceFromTo = Math.abs(this.toNumber - this.fromNumber);
|
|
414
414
|
const distanceMinMax = Math.abs(this.maxNumber - this.minNumber);
|
|
415
|
-
isValid =
|
|
415
|
+
isValid = distanceMinMax >= this.minRangeNumber && distanceFromTo >= this.minRangeNumber;
|
|
416
416
|
message = 'value should be less than distance from and to, min and max.';
|
|
417
417
|
}
|
|
418
418
|
if (!isValid) {
|
|
@@ -439,8 +439,8 @@ let Slider = class Slider extends ControlElement {
|
|
|
439
439
|
}
|
|
440
440
|
}
|
|
441
441
|
else {
|
|
442
|
-
this.from = clamp(
|
|
443
|
-
this.to = clamp(
|
|
442
|
+
this.from = clamp(this.fromNumber || this.minNumber, this.minNumber, this.toNumber);
|
|
443
|
+
this.to = clamp(this.toNumber || this.maxNumber, this.fromNumber, this.maxNumber);
|
|
444
444
|
}
|
|
445
445
|
}
|
|
446
446
|
else {
|
|
@@ -681,7 +681,7 @@ let Slider = class Slider extends ControlElement {
|
|
|
681
681
|
shouldUpdate = this.isValueInBoundary(Number(value), '');
|
|
682
682
|
}
|
|
683
683
|
if (shouldUpdate) {
|
|
684
|
-
|
|
684
|
+
this[name] = value;
|
|
685
685
|
this.notifyPropertyChange(name, value);
|
|
686
686
|
}
|
|
687
687
|
else {
|
|
@@ -713,7 +713,7 @@ let Slider = class Slider extends ControlElement {
|
|
|
713
713
|
this.classList.add('grabbable');
|
|
714
714
|
if (this.range) {
|
|
715
715
|
const mousePosition = this.getMousePosition(event);
|
|
716
|
-
const relativeMousePosition = (
|
|
716
|
+
const relativeMousePosition = (this.maxNumber - this.minNumber) * mousePosition + this.minNumber;
|
|
717
717
|
const distanceFrom = Math.abs(relativeMousePosition - this.fromNumber);
|
|
718
718
|
const distanceTo = Math.abs(relativeMousePosition - this.toNumber);
|
|
719
719
|
if (distanceFrom < distanceTo) {
|
|
@@ -748,7 +748,9 @@ let Slider = class Slider extends ControlElement {
|
|
|
748
748
|
return 1;
|
|
749
749
|
}
|
|
750
750
|
// check drag desktop or mobile
|
|
751
|
-
const pageX = event.changedTouches
|
|
751
|
+
const pageX = event.changedTouches
|
|
752
|
+
? event.changedTouches[0].pageX
|
|
753
|
+
: event.pageX;
|
|
752
754
|
const positionSize = pageX - sliderRect.left;
|
|
753
755
|
if (positionSize <= sliderRect.width) {
|
|
754
756
|
return Math.min(Math.max((pageX - sliderRect.left) / sliderRect.width, 0), 1);
|
|
@@ -826,7 +828,7 @@ let Slider = class Slider extends ControlElement {
|
|
|
826
828
|
getNearestPossibleValue(thumbPosition) {
|
|
827
829
|
const stepSize = this.calculatePosition(this.minNumber + this.stepRange, 1);
|
|
828
830
|
const nearestValue = Math.round(thumbPosition / stepSize) * stepSize;
|
|
829
|
-
if (thumbPosition <= nearestValue +
|
|
831
|
+
if (thumbPosition <= nearestValue + stepSize / 2) {
|
|
830
832
|
if (nearestValue <= 1) {
|
|
831
833
|
return nearestValue;
|
|
832
834
|
}
|
|
@@ -954,11 +956,11 @@ let Slider = class Slider extends ControlElement {
|
|
|
954
956
|
// Check if value is in range
|
|
955
957
|
if (this.range) {
|
|
956
958
|
if (valueFor === SliderDataName.to) {
|
|
957
|
-
if (value <
|
|
959
|
+
if (value < this.fromNumber + this.minRangeNumber || value > this.maxNumber) {
|
|
958
960
|
return false;
|
|
959
961
|
}
|
|
960
962
|
}
|
|
961
|
-
else if (value < this.minNumber || value >
|
|
963
|
+
else if (value < this.minNumber || value > this.toNumber - this.minRangeNumber) {
|
|
962
964
|
return false;
|
|
963
965
|
}
|
|
964
966
|
}
|
|
@@ -1083,11 +1085,17 @@ let Slider = class Slider extends ControlElement {
|
|
|
1083
1085
|
*/
|
|
1084
1086
|
renderTrack(range) {
|
|
1085
1087
|
const stepContainerSize = this.calculatePosition(this.minNumber + this.stepNumber);
|
|
1086
|
-
const translateX =
|
|
1087
|
-
const stepsStyle = {
|
|
1088
|
+
const translateX = stepContainerSize / 2;
|
|
1089
|
+
const stepsStyle = {
|
|
1090
|
+
transform: `translateX(${translateX}%)`,
|
|
1091
|
+
backgroundSize: `${stepContainerSize}% 100%`
|
|
1092
|
+
};
|
|
1088
1093
|
const stepContainerStyle = { transform: `translateX(-${translateX}%)` };
|
|
1089
1094
|
const trackFillStyle = range
|
|
1090
|
-
? {
|
|
1095
|
+
? {
|
|
1096
|
+
width: `${this.calculatePosition(this.toNumber) - this.calculatePosition(this.fromNumber)}%`,
|
|
1097
|
+
left: `${this.calculatePosition(this.fromNumber)}%`
|
|
1098
|
+
}
|
|
1091
1099
|
: { width: `${this.calculatePosition(Number(this.value))}%` };
|
|
1092
1100
|
return html `
|
|
1093
1101
|
<div part="track-wrapper" ${ref(this.trackRef)}>
|
|
@@ -1197,11 +1205,15 @@ let Slider = class Slider extends ControlElement {
|
|
|
1197
1205
|
<div part="slider-wrapper">
|
|
1198
1206
|
<div part="slider" ${ref(this.sliderRef)}>
|
|
1199
1207
|
${this.renderTrack(this.range)}
|
|
1200
|
-
${this.range
|
|
1208
|
+
${this.range
|
|
1209
|
+
? this.renderThumb(this.fromNumber, this.toNumber)
|
|
1210
|
+
: this.renderThumb(this.valueNumber)}
|
|
1201
1211
|
</div>
|
|
1202
1212
|
</div>
|
|
1203
1213
|
${this.range && this.isShowInputField ? this.renderNumberField(this.to, SliderDataName.to) : null}
|
|
1204
|
-
${!this.range && this.isShowInputField
|
|
1214
|
+
${!this.range && this.isShowInputField
|
|
1215
|
+
? this.renderNumberField(this.value, SliderDataName.value)
|
|
1216
|
+
: null}
|
|
1205
1217
|
`;
|
|
1206
1218
|
}
|
|
1207
1219
|
};
|