@lion/ui 0.7.6 → 0.7.8
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/README.md +1 -2
- package/components/button/test-suites/LionButton.suite.js +3 -1
- package/components/calendar/src/LionCalendar.js +9 -5
- package/components/calendar/test/lion-calendar.test.js +33 -6
- package/components/combobox/src/LionCombobox.js +33 -9
- package/components/combobox/test/lion-combobox.test.js +134 -7
- package/components/dialog/test/lion-dialog.test.js +59 -1
- package/components/input-datepicker/src/LionInputDatepicker.js +1 -21
- package/components/input-datepicker/test/lion-input-datepicker.test.js +30 -3
- package/components/input-file/src/FileHandle.js +1 -1
- package/components/input-file/src/LionInputFile.js +1 -3
- package/components/input-file/test/lion-input-file.test.js +11 -14
- package/components/overlays/src/OverlayController.js +13 -7
- package/components/overlays/src/OverlayMixin.js +5 -1
- package/components/overlays/test/OverlayController.test.js +46 -0
- package/components/select-rich/src/LionSelectRich.js +12 -0
- package/components/select-rich/test/lion-select-rich.test.js +26 -0
- package/custom-elements.json +60 -73
- package/dist-types/components/button/test-suites/LionButton.suite.d.ts.map +1 -1
- package/dist-types/components/calendar/src/LionCalendar.d.ts +1 -0
- package/dist-types/components/calendar/src/LionCalendar.d.ts.map +1 -1
- package/dist-types/components/combobox/src/LionCombobox.d.ts +9 -0
- package/dist-types/components/combobox/src/LionCombobox.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +0 -5
- package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts.map +1 -1
- package/dist-types/components/input-file/src/LionInputFile.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
- package/dist-types/tsconfig.tsbuildinfo +1 -1
- package/docs/components/button/use-cases.md +2 -2
- package/docs/components/calendar/use-cases.md +4 -4
- package/docs/components/checkbox-group/api-table.md +49 -55
- package/docs/components/checkbox-group/overview.md +5 -5
- package/docs/components/checkbox-group/use-cases.md +33 -33
- package/docs/components/collapsible/overview.md +1 -1
- package/docs/components/collapsible/use-cases.md +3 -3
- package/docs/components/combobox/api-table.md +84 -89
- package/docs/components/combobox/extensions.md +20 -20
- package/docs/components/combobox/overview.md +1 -1
- package/docs/components/combobox/use-cases.md +6 -6
- package/docs/components/dialog/api-table.md +3 -3
- package/docs/components/dialog/overview.md +2 -2
- package/docs/components/dialog/src/external-dialog.js +32 -0
- package/docs/components/dialog/src/slots-dialog-content.js +1 -1
- package/docs/components/dialog/src/styled-dialog-content.js +1 -1
- package/docs/components/dialog/use-cases.md +49 -3
- package/docs/components/drawer/use-cases.md +3 -3
- package/docs/components/fieldset/api-table.md +45 -51
- package/docs/components/fieldset/overview.md +7 -7
- package/docs/components/fieldset/use-cases.md +15 -15
- package/docs/components/form/overview.md +7 -7
- package/docs/components/form/use-cases.md +4 -4
- package/docs/components/icon/use-cases.md +1 -1
- package/docs/components/input/overview.md +1 -1
- package/docs/components/input/use-cases.md +3 -3
- package/docs/components/input-amount/overview.md +3 -3
- package/docs/components/input-amount/use-cases.md +8 -8
- package/docs/components/input-date/overview.md +3 -3
- package/docs/components/input-date/use-cases.md +8 -8
- package/docs/components/input-datepicker/api-table.md +1 -3
- package/docs/components/input-datepicker/overview.md +5 -5
- package/docs/components/input-datepicker/use-cases.md +5 -5
- package/docs/components/input-email/overview.md +2 -2
- package/docs/components/input-email/use-cases.md +3 -3
- package/docs/components/input-file/overview.md +1 -1
- package/docs/components/input-iban/overview.md +2 -2
- package/docs/components/input-iban/use-cases.md +8 -8
- package/docs/components/input-range/overview.md +2 -2
- package/docs/components/input-stepper/api-table.md +65 -69
- package/docs/components/input-stepper/overview.md +1 -1
- package/docs/components/input-tel/overview.md +1 -1
- package/docs/components/input-tel/use-cases.md +9 -9
- package/docs/components/input-tel-dropdown/api-table.md +70 -73
- package/docs/components/input-tel-dropdown/extensions.md +1 -1
- package/docs/components/input-tel-dropdown/overview.md +1 -1
- package/docs/components/input-tel-dropdown/use-cases.md +5 -5
- package/docs/components/listbox/api-table.md +64 -70
- package/docs/components/listbox/overview.md +5 -5
- package/docs/components/listbox/use-cases.md +61 -61
- package/docs/components/pagination/use-cases.md +5 -5
- package/docs/components/radio-group/api-table.md +49 -55
- package/docs/components/radio-group/overview.md +6 -6
- package/docs/components/radio-group/use-cases.md +18 -18
- package/docs/components/select/use-cases.md +2 -2
- package/docs/components/select-rich/api-table.md +79 -85
- package/docs/components/select-rich/overview.md +3 -3
- package/docs/components/select-rich/use-cases.md +33 -33
- package/docs/components/steps/overview.md +4 -4
- package/docs/components/steps/use-cases.md +7 -7
- package/docs/components/tabs/examples.md +1 -1
- package/docs/components/tabs/use-cases.md +1 -1
- package/docs/components/textarea/use-cases.md +3 -3
- package/docs/components/tooltip/api-table.md +3 -3
- package/docs/components/tooltip/use-cases.md +6 -6
- package/docs/fundamentals/index.md +4 -4
- package/docs/fundamentals/node-tools/providence-analytics/LocalConfiguration.md +1 -1
- package/docs/fundamentals/node-tools/providence-analytics/QueryResult.md +1 -1
- package/docs/fundamentals/node-tools/providence-analytics/analyzer.md +1 -1
- package/docs/fundamentals/node-tools/providence-analytics/dashboard.md +1 -1
- package/docs/fundamentals/node-tools/providence-analytics/overview.md +3 -3
- package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
- package/docs/fundamentals/rationales/accessibility.md +1 -1
- package/docs/fundamentals/systems/core/SlotMixin.md +1 -1
- package/docs/fundamentals/systems/core/overview.md +1 -1
- package/docs/fundamentals/systems/form/formatting-and-parsing.md +8 -8
- package/docs/fundamentals/systems/form/model-value.md +1 -1
- package/docs/fundamentals/systems/form/overview.md +28 -28
- package/docs/fundamentals/systems/form/use-cases.md +19 -19
- package/docs/fundamentals/systems/form/validate.md +50 -50
- package/docs/fundamentals/systems/localize/api-table.md +10 -17
- package/docs/fundamentals/systems/localize/overview.md +4 -4
- package/docs/fundamentals/systems/localize/use-cases.md +4 -4
- package/docs/fundamentals/systems/overlays/_configuration-positioning.md +4 -4
- package/docs/fundamentals/systems/overlays/api-table.md +34 -90
- package/docs/fundamentals/systems/overlays/assets/umbrella-form.js +9 -9
- package/docs/fundamentals/systems/overlays/configuration.md +30 -30
- package/docs/fundamentals/systems/overlays/overview.md +6 -6
- package/docs/fundamentals/systems/overlays/use-cases.md +30 -30
- package/docs/fundamentals/tools/ajax/use-cases.md +20 -20
- package/docs/fundamentals/tools/helpers/action-logger.md +3 -3
- package/docs/fundamentals/tools/helpers/overview.md +1 -1
- package/docs/fundamentals/tools/singleton-manager/example-complex/demo-app.js +2 -2
- package/docs/fundamentals/tools/singleton-manager/example-fail/demo-app.js +2 -2
- package/docs/fundamentals/tools/singleton-manager/example-success/demo-app.js +2 -2
- package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
- package/docs/guides/how-to/create-a-custom-field.md +7 -7
- package/docs/guides/how-to/create-a-form.md +4 -4
- package/docs/guides/how-to/extend-a-native-input.md +2 -2
- package/docs/guides/index.md +8 -8
- package/docs/guides/principles/index.md +5 -5
- package/docs/guides/principles/scoped-elements.md +1 -1
- package/docs/guides/principles/styling.md +1 -1
- package/package.json +1 -1
|
@@ -29,13 +29,13 @@ export const placementLocal = () => {
|
|
|
29
29
|
border: 1px solid black;
|
|
30
30
|
}
|
|
31
31
|
</style>
|
|
32
|
-
<demo-el-using-overlaymixin .config
|
|
32
|
+
<demo-el-using-overlaymixin .config="${placementModeLocalConfig}">
|
|
33
33
|
<button slot="invoker">Click me to open the local overlay!</button>
|
|
34
34
|
<div slot="content" class="demo-overlay">
|
|
35
35
|
Hello! You can close this notification here:
|
|
36
36
|
<button
|
|
37
37
|
class="close-button"
|
|
38
|
-
@click
|
|
38
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
39
39
|
>
|
|
40
40
|
⨯
|
|
41
41
|
</button>
|
|
@@ -51,13 +51,13 @@ export const placementLocal = () => {
|
|
|
51
51
|
export const placementGlobal = () => {
|
|
52
52
|
const placementModeGlobalConfig = { placementMode: 'global' };
|
|
53
53
|
return html`
|
|
54
|
-
<demo-el-using-overlaymixin .config
|
|
54
|
+
<demo-el-using-overlaymixin .config="${placementModeGlobalConfig}">
|
|
55
55
|
<button slot="invoker">Click me to open the global overlay!</button>
|
|
56
56
|
<div slot="content" class="demo-overlay">
|
|
57
57
|
Hello! You can close this notification here:
|
|
58
58
|
<button
|
|
59
59
|
class="close-button"
|
|
60
|
-
@click
|
|
60
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
61
61
|
>
|
|
62
62
|
⨯
|
|
63
63
|
</button>
|
|
@@ -69,7 +69,7 @@ export const placementGlobal = () => {
|
|
|
69
69
|
|
|
70
70
|
## isTooltip (placementMode: 'local')
|
|
71
71
|
|
|
72
|
-
As specified in the [overlay rationale](https://github.com/ing-bank/lion/blob/
|
|
72
|
+
As specified in the [overlay rationale](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/fundamentals/systems/overlays/rationale.md) there are only two official types of overlays: dialogs and tooltips. And their main differences are:
|
|
73
73
|
|
|
74
74
|
- Dialogs have a modal option, tooltips don’t
|
|
75
75
|
- Dialogs have interactive content, tooltips don’t
|
|
@@ -82,7 +82,7 @@ export const usingTooltipConfig = () => {
|
|
|
82
82
|
const tooltipConfig = { ...withTooltipConfig() };
|
|
83
83
|
|
|
84
84
|
return html`
|
|
85
|
-
<demo-el-using-overlaymixin id="tooltip" .config
|
|
85
|
+
<demo-el-using-overlaymixin id="tooltip" .config="${tooltipConfig}">
|
|
86
86
|
<button slot="invoker">Hover me to open the tooltip!</button>
|
|
87
87
|
<div slot="content" class="demo-overlay">Hello!</div>
|
|
88
88
|
</demo-el-using-overlaymixin>
|
|
@@ -103,7 +103,7 @@ You use the feature on any type of overlay.
|
|
|
103
103
|
export const trapsKeyboardFocus = () => {
|
|
104
104
|
const trapsKeyboardFocusConfig = { ...withDropdownConfig(), trapsKeyboardFocus: true };
|
|
105
105
|
return html`
|
|
106
|
-
<demo-el-using-overlaymixin .config
|
|
106
|
+
<demo-el-using-overlaymixin .config="${trapsKeyboardFocusConfig}">
|
|
107
107
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
108
108
|
<div slot="content" class="demo-overlay">
|
|
109
109
|
<div><a href="#">A focusable anchor</a></div>
|
|
@@ -111,7 +111,7 @@ export const trapsKeyboardFocus = () => {
|
|
|
111
111
|
Hello! You can close this notification here:
|
|
112
112
|
<button
|
|
113
113
|
class="close-button"
|
|
114
|
-
@click
|
|
114
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
115
115
|
>
|
|
116
116
|
⨯
|
|
117
117
|
</button>
|
|
@@ -129,13 +129,13 @@ Boolean property. Will allow closing the overlay on ESC key when enabled.
|
|
|
129
129
|
export const hidesOnEsc = () => {
|
|
130
130
|
const hidesOnEscConfig = { ...withDropdownConfig(), hidesOnEsc: true };
|
|
131
131
|
return html`
|
|
132
|
-
<demo-el-using-overlaymixin .config
|
|
132
|
+
<demo-el-using-overlaymixin .config="${hidesOnEscConfig}">
|
|
133
133
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
134
134
|
<div slot="content" class="demo-overlay">
|
|
135
135
|
Hello! You can close this notification here:
|
|
136
136
|
<button
|
|
137
137
|
class="close-button"
|
|
138
|
-
@click
|
|
138
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
139
139
|
>
|
|
140
140
|
⨯
|
|
141
141
|
</button>
|
|
@@ -155,13 +155,13 @@ export const hidesOnEscFalse = () => {
|
|
|
155
155
|
hidesOnOutsideEsc: false,
|
|
156
156
|
};
|
|
157
157
|
return html`
|
|
158
|
-
<demo-el-using-overlaymixin .config
|
|
158
|
+
<demo-el-using-overlaymixin .config="${hidesOnEscConfig}">
|
|
159
159
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
160
160
|
<div slot="content" class="demo-overlay">
|
|
161
161
|
Hello! You can close this notification here:
|
|
162
162
|
<button
|
|
163
163
|
class="close-button"
|
|
164
|
-
@click
|
|
164
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
165
165
|
>
|
|
166
166
|
⨯
|
|
167
167
|
</button>
|
|
@@ -179,13 +179,13 @@ Boolean property. When enabled allows closing the overlay on ESC key, even when
|
|
|
179
179
|
export const hidesOnOutsideEsc = () => {
|
|
180
180
|
const hidesOnEscConfig = { ...withDropdownConfig(), hidesOnOutsideEsc: true };
|
|
181
181
|
return html`
|
|
182
|
-
<demo-el-using-overlaymixin .config
|
|
182
|
+
<demo-el-using-overlaymixin .config="${hidesOnEscConfig}">
|
|
183
183
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
184
184
|
<div slot="content" class="demo-overlay">
|
|
185
185
|
Hello! You can close this notification here:
|
|
186
186
|
<button
|
|
187
187
|
class="close-button"
|
|
188
|
-
@click
|
|
188
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
189
189
|
>
|
|
190
190
|
⨯
|
|
191
191
|
</button>
|
|
@@ -203,14 +203,14 @@ Boolean property. Will allow closing the overlay by clicking outside the `conten
|
|
|
203
203
|
export const hidesOnOutsideClick = () => {
|
|
204
204
|
const hidesOnOutsideClickConfig = { ...withDropdownConfig(), hidesOnOutsideClick: true };
|
|
205
205
|
return html`
|
|
206
|
-
<demo-el-using-overlaymixin .config
|
|
206
|
+
<demo-el-using-overlaymixin .config="${hidesOnOutsideClickConfig}">
|
|
207
207
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
208
208
|
<div slot="content" class="demo-overlay">
|
|
209
209
|
<label for="myInput">Clicking this label should not trigger close</label>
|
|
210
210
|
<input id="myInput" />
|
|
211
211
|
<button
|
|
212
212
|
class="close-button"
|
|
213
|
-
@click
|
|
213
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
214
214
|
>
|
|
215
215
|
⨯
|
|
216
216
|
</button>
|
|
@@ -233,13 +233,13 @@ export const elementToFocusAfterHide = () => {
|
|
|
233
233
|
|
|
234
234
|
const elementToFocusAfterHideConfig = { ...withDropdownConfig(), elementToFocusAfterHide: btn };
|
|
235
235
|
return html`
|
|
236
|
-
<demo-el-using-overlaymixin .config
|
|
236
|
+
<demo-el-using-overlaymixin .config="${elementToFocusAfterHideConfig}">
|
|
237
237
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
238
238
|
<div slot="content" class="demo-overlay">
|
|
239
239
|
Hello! You can close this notification here:
|
|
240
240
|
<button
|
|
241
241
|
class="close-button"
|
|
242
|
-
@click
|
|
242
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
243
243
|
>
|
|
244
244
|
⨯
|
|
245
245
|
</button>
|
|
@@ -269,13 +269,13 @@ This currently only supports CSS Animations, because it relies on the `animation
|
|
|
269
269
|
export const hasBackdrop = () => {
|
|
270
270
|
const hasBackdropConfig = { ...withDropdownConfig(), hasBackdrop: true };
|
|
271
271
|
return html`
|
|
272
|
-
<demo-el-using-overlaymixin .config
|
|
272
|
+
<demo-el-using-overlaymixin .config="${hasBackdropConfig}">
|
|
273
273
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
274
274
|
<div slot="content" class="demo-overlay">
|
|
275
275
|
Hello! You can close this notification here:
|
|
276
276
|
<button
|
|
277
277
|
class="close-button"
|
|
278
|
-
@click
|
|
278
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
279
279
|
>
|
|
280
280
|
⨯
|
|
281
281
|
</button>
|
|
@@ -299,19 +299,19 @@ export const isBlocking = () => {
|
|
|
299
299
|
This overlay gets closed when overlay B gets opened
|
|
300
300
|
<button
|
|
301
301
|
class="close-button"
|
|
302
|
-
@click
|
|
302
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
303
303
|
>
|
|
304
304
|
⨯
|
|
305
305
|
</button>
|
|
306
306
|
</div>
|
|
307
307
|
</demo-el-using-overlaymixin>
|
|
308
|
-
<demo-el-using-overlaymixin .config
|
|
308
|
+
<demo-el-using-overlaymixin .config="${isBlockingConfig}">
|
|
309
309
|
<button slot="invoker">Overlay B: open second</button>
|
|
310
310
|
<div slot="content" class="demo-overlay demo-overlay--blocking">
|
|
311
311
|
Overlay A is hidden... now close me and see overlay A again.
|
|
312
312
|
<button
|
|
313
313
|
class="close-button"
|
|
314
|
-
@click
|
|
314
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
315
315
|
>
|
|
316
316
|
⨯
|
|
317
317
|
</button>
|
|
@@ -332,13 +332,13 @@ Boolean property. When true, prevents scrolling content that is outside of the `
|
|
|
332
332
|
export const preventsScroll = () => {
|
|
333
333
|
const preventsScrollConfig = { preventsScroll: true };
|
|
334
334
|
return html`
|
|
335
|
-
<demo-el-using-overlaymixin .config
|
|
335
|
+
<demo-el-using-overlaymixin .config="${preventsScrollConfig}">
|
|
336
336
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
337
337
|
<div slot="content" class="demo-overlay">
|
|
338
338
|
Hello! You can close this notification here:
|
|
339
339
|
<button
|
|
340
340
|
class="close-button"
|
|
341
|
-
@click
|
|
341
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
342
342
|
>
|
|
343
343
|
⨯
|
|
344
344
|
</button>
|
|
@@ -371,13 +371,13 @@ export const viewportConfig = () => {
|
|
|
371
371
|
viewportConfig: { placement: 'bottom-left' },
|
|
372
372
|
};
|
|
373
373
|
return html`
|
|
374
|
-
<demo-el-using-overlaymixin .config
|
|
374
|
+
<demo-el-using-overlaymixin .config="${viewportConfig}">
|
|
375
375
|
<button slot="invoker">Click me to open the overlay in the bottom left corner!</button>
|
|
376
376
|
<div slot="content" class="demo-overlay">
|
|
377
377
|
Hello! You can close this notification here:
|
|
378
378
|
<button
|
|
379
379
|
class="close-button"
|
|
380
|
-
@click
|
|
380
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
381
381
|
>
|
|
382
382
|
⨯
|
|
383
383
|
</button>
|
|
@@ -400,7 +400,7 @@ Features:
|
|
|
400
400
|
|
|
401
401
|
> Popper strictly is scoped on positioning. **It does not change the dimensions of the content node nor the invoker node**.
|
|
402
402
|
> This also means that if you use the arrow feature, you are in charge of styling it properly, use the data-popper-placement attribute for this.
|
|
403
|
-
> An example implementation can be found in [lion-tooltip](https://github.com/ing-bank/lion/blob/
|
|
403
|
+
> An example implementation can be found in [lion-tooltip](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/components/tooltip/overview.md), where an arrow is set by default.
|
|
404
404
|
|
|
405
405
|
To override the default options we set for local mode, you add a `popperConfig` object to the config passed to the OverlayController.
|
|
406
406
|
Here's a succinct overview of some often used popper properties:
|
|
@@ -451,13 +451,13 @@ export const popperConfig = () => {
|
|
|
451
451
|
border: 1px solid black;
|
|
452
452
|
}
|
|
453
453
|
</style>
|
|
454
|
-
<demo-el-using-overlaymixin .config
|
|
454
|
+
<demo-el-using-overlaymixin .config="${popperConfig}">
|
|
455
455
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
456
456
|
<div slot="content" class="demo-overlay">
|
|
457
457
|
Hello! You can close this notification here:
|
|
458
458
|
<button
|
|
459
459
|
class="close-button"
|
|
460
|
-
@click
|
|
460
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
461
461
|
>
|
|
462
462
|
⨯
|
|
463
463
|
</button>
|
|
@@ -6,7 +6,7 @@ Manages their position on the screen relative to other elements, including other
|
|
|
6
6
|
|
|
7
7
|
Its purpose is to make it easy to use our Overlay System declaratively. It can be easily extended where needed, to override event listeners and more.
|
|
8
8
|
|
|
9
|
-
See [lion-dialog](../../../components/dialog/overview.md) and [lion-tooltip](https://github.com/ing-bank/lion/blob/
|
|
9
|
+
See [lion-dialog](../../../components/dialog/overview.md) and [lion-tooltip](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/components/tooltip/overview.md) for example Web Component implementations using the Overlay System.
|
|
10
10
|
|
|
11
11
|
## Features
|
|
12
12
|
|
|
@@ -18,9 +18,9 @@ See [lion-dialog](../../../components/dialog/overview.md) and [lion-tooltip](htt
|
|
|
18
18
|
- lion-overlay web component:
|
|
19
19
|
- Show content when clicking the invoker
|
|
20
20
|
- Have a `.config` object to set or update the OverlayController's configuration
|
|
21
|
-
- [**OverlaysManager**](https://github.com/ing-bank/lion/blob/
|
|
22
|
-
- [**OverlayController**](https://github.com/ing-bank/lion/blob/
|
|
23
|
-
- [**OverlayMixin**](https://github.com/ing-bank/lion/blob/
|
|
21
|
+
- [**OverlaysManager**](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/fundamentals/systems/overlays/use-cases.md#overlaysmanager), a global repository keeping track of all different types of overlays
|
|
22
|
+
- [**OverlayController**](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/fundamentals/systems/overlays/use-cases.md#overlaycontroller), a single controller class for handling overlays
|
|
23
|
+
- [**OverlayMixin**](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/fundamentals/systems/overlays/use-cases.md#overlaymixin), a mixin that can be used to create webcomponents that use the OverlayController under the hood
|
|
24
24
|
|
|
25
25
|
Usually you will use `lion-dialog` (or `lion-tooltip` if this makes more sense).
|
|
26
26
|
|
|
@@ -43,7 +43,7 @@ html`
|
|
|
43
43
|
<div slot="content">
|
|
44
44
|
This is an overlay
|
|
45
45
|
<button
|
|
46
|
-
@click
|
|
46
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
47
47
|
>x</button>
|
|
48
48
|
<div>
|
|
49
49
|
<button slot="invoker">
|
|
@@ -110,4 +110,4 @@ class MyOverlayComponent extends OverlayMixin(LitElement) {
|
|
|
110
110
|
|
|
111
111
|
## Rationales
|
|
112
112
|
|
|
113
|
-
Please check the [system rationals](https://github.com/ing-bank/lion/blob/
|
|
113
|
+
Please check the [system rationals](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/fundamentals/systems/overlays/rationale.md) folder, where we go more in-depth.
|
|
@@ -21,7 +21,7 @@ The overlay system allows to create different types of overlays like dialogs, to
|
|
|
21
21
|
It's designed to be highly flexible, while still delivering sensible defaults.
|
|
22
22
|
On top of this, the system was built having accessibility in mind.
|
|
23
23
|
|
|
24
|
-
For a detailed rationale, please consult [Rationale](https://github.com/ing-bank/lion/blob/
|
|
24
|
+
For a detailed rationale, please consult [Rationale](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/fundamentals/systems/overlays/rationale.md).
|
|
25
25
|
|
|
26
26
|
```js preview-story
|
|
27
27
|
export const main = () => html`
|
|
@@ -29,7 +29,7 @@ export const main = () => html`
|
|
|
29
29
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
30
30
|
<div slot="content" class="demo-overlay">
|
|
31
31
|
Hello! You can close this notification here:
|
|
32
|
-
<button @click
|
|
32
|
+
<button @click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}">
|
|
33
33
|
⨯
|
|
34
34
|
</button>
|
|
35
35
|
</div>
|
|
@@ -67,7 +67,7 @@ Global refers to overlays where the content is positioned in a global root node
|
|
|
67
67
|
|
|
68
68
|
Overlays can be configured in many ways to suit your needs. We go in-depth into each option in the Overlay System - Configuration chapter.
|
|
69
69
|
|
|
70
|
-
We also export a few [preset configuration objects](https://github.com/ing-bank/lion/blob/
|
|
70
|
+
We also export a few [preset configuration objects](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/fundamentals/systems/overlays/configuration.md).
|
|
71
71
|
|
|
72
72
|
- withModalDialogConfig
|
|
73
73
|
- withDropdownConfig
|
|
@@ -152,13 +152,13 @@ The easiest way is declarative. This can be achieved by adding a `<slot name="ba
|
|
|
152
152
|
export const backdrop = () => {
|
|
153
153
|
const responsiveModalDialogConfig = { ...withModalDialogConfig() };
|
|
154
154
|
return html`
|
|
155
|
-
<demo-el-using-overlaymixin .config
|
|
155
|
+
<demo-el-using-overlaymixin .config="${responsiveModalDialogConfig}">
|
|
156
156
|
<demo-overlay-backdrop slot="backdrop"></demo-overlay-backdrop>
|
|
157
157
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
158
158
|
<div slot="content" class="demo-overlay">
|
|
159
159
|
Hello! You can close this notification here:
|
|
160
160
|
<button
|
|
161
|
-
@click
|
|
161
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
162
162
|
>
|
|
163
163
|
⨯
|
|
164
164
|
</button>
|
|
@@ -176,12 +176,12 @@ export const backdropImperative = () => {
|
|
|
176
176
|
const backdropNode = document.createElement('demo-overlay-backdrop');
|
|
177
177
|
const responsiveModalDialogConfig = { ...withModalDialogConfig(), backdropNode };
|
|
178
178
|
return html`
|
|
179
|
-
<demo-el-using-overlaymixin .config
|
|
179
|
+
<demo-el-using-overlaymixin .config="${responsiveModalDialogConfig}">
|
|
180
180
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
181
181
|
<div slot="content" class="demo-overlay">
|
|
182
182
|
Hello! You can close this notification here:
|
|
183
183
|
<button
|
|
184
|
-
@click
|
|
184
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
185
185
|
>
|
|
186
186
|
⨯
|
|
187
187
|
</button>
|
|
@@ -231,13 +231,13 @@ Under the hood, the OverlayController listens to `animationend` event, only then
|
|
|
231
231
|
export const backdropAnimation = () => {
|
|
232
232
|
const responsiveModalDialogConfig = { ...withModalDialogConfig() };
|
|
233
233
|
return html`
|
|
234
|
-
<demo-el-using-overlaymixin .config
|
|
234
|
+
<demo-el-using-overlaymixin .config="${responsiveModalDialogConfig}">
|
|
235
235
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
236
236
|
<demo-overlay-backdrop slot="backdrop"></demo-overlay-backdrop>
|
|
237
237
|
<div slot="content" class="demo-overlay">
|
|
238
238
|
Hello! You can close this notification here:
|
|
239
239
|
<button
|
|
240
|
-
@click
|
|
240
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
241
241
|
>
|
|
242
242
|
⨯
|
|
243
243
|
</button>
|
|
@@ -262,7 +262,7 @@ export const responsiveSwitching = () => {
|
|
|
262
262
|
const responsiveBottomSheetConfig = { ...withBottomSheetConfig() };
|
|
263
263
|
return html`
|
|
264
264
|
<demo-el-using-overlaymixin
|
|
265
|
-
.config
|
|
265
|
+
.config="${responsiveBottomSheetConfig}"
|
|
266
266
|
@before-opened=${e => {
|
|
267
267
|
if (window.innerWidth >= 600) {
|
|
268
268
|
e.target.config = { ...withModalDialogConfig() };
|
|
@@ -275,7 +275,7 @@ export const responsiveSwitching = () => {
|
|
|
275
275
|
<div slot="content" class="demo-overlay">
|
|
276
276
|
Hello! You can close this notification here:
|
|
277
277
|
<button
|
|
278
|
-
@click
|
|
278
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
279
279
|
>
|
|
280
280
|
⨯
|
|
281
281
|
</button>
|
|
@@ -362,12 +362,12 @@ export const responsiveSwitching2 = () => {
|
|
|
362
362
|
</select>
|
|
363
363
|
|
|
364
364
|
<br />
|
|
365
|
-
<demo-el-using-overlaymixin ${ref(overlayRef)} .config
|
|
365
|
+
<demo-el-using-overlaymixin ${ref(overlayRef)} .config="${getConfig(selectRef.value?.value)}">
|
|
366
366
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
367
367
|
<div slot="content" class="demo-overlay">
|
|
368
368
|
Hello! You can close this notification here:
|
|
369
369
|
<button
|
|
370
|
-
@click
|
|
370
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
371
371
|
>
|
|
372
372
|
⨯
|
|
373
373
|
</button>
|
|
@@ -401,13 +401,13 @@ export const openedState = () => {
|
|
|
401
401
|
<demo-el-using-overlaymixin
|
|
402
402
|
${ref(myRefs.overlay)}
|
|
403
403
|
.opened="${appState.opened}"
|
|
404
|
-
@opened-changed
|
|
404
|
+
@opened-changed="${onOpenClosed}"
|
|
405
405
|
>
|
|
406
406
|
<button slot="invoker">Overlay</button>
|
|
407
407
|
<div slot="content" class="demo-overlay">
|
|
408
408
|
Hello! You can close this notification here:
|
|
409
409
|
<button
|
|
410
|
-
@click
|
|
410
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
411
411
|
>
|
|
412
412
|
⨯
|
|
413
413
|
</button>
|
|
@@ -448,8 +448,8 @@ export const interceptingOpenClose = () => {
|
|
|
448
448
|
</button>
|
|
449
449
|
<demo-el-using-overlaymixin
|
|
450
450
|
${ref(myRefs.overlay)}
|
|
451
|
-
@before-closed
|
|
452
|
-
@before-opened
|
|
451
|
+
@before-closed="${intercept}"
|
|
452
|
+
@before-opened="${intercept}"
|
|
453
453
|
>
|
|
454
454
|
<button
|
|
455
455
|
slot="invoker"
|
|
@@ -460,7 +460,7 @@ export const interceptingOpenClose = () => {
|
|
|
460
460
|
</button>
|
|
461
461
|
<div slot="content" class="demo-overlay">
|
|
462
462
|
Hello! You can close this notification here:
|
|
463
|
-
<button @click
|
|
463
|
+
<button @click="${() => (myRefs.overlay.value.opened = false)}">⨯</button>
|
|
464
464
|
</div>
|
|
465
465
|
</demo-el-using-overlaymixin>
|
|
466
466
|
`;
|
|
@@ -538,29 +538,29 @@ Below an example is shown with the `isBlocking` option, which makes use of the O
|
|
|
538
538
|
export const overlayManager = () => {
|
|
539
539
|
const hasBackdropConfig = { ...withModalDialogConfig(), hasBackdrop: true };
|
|
540
540
|
return html`
|
|
541
|
-
<demo-el-using-overlaymixin .config
|
|
541
|
+
<demo-el-using-overlaymixin .config="${hasBackdropConfig}">
|
|
542
542
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
543
543
|
<div slot="content" class="demo-overlay">
|
|
544
544
|
Hello! You can close this notification here:
|
|
545
545
|
<button
|
|
546
|
-
@click
|
|
546
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
547
547
|
>
|
|
548
548
|
⨯
|
|
549
549
|
</button>
|
|
550
550
|
<br />
|
|
551
|
-
<button @click
|
|
551
|
+
<button @click="${e => (document.querySelector('#secondOverlay').opened = true)}">
|
|
552
552
|
Click me to open another overlay which is blocking
|
|
553
553
|
</button>
|
|
554
554
|
</div>
|
|
555
555
|
</demo-el-using-overlaymixin>
|
|
556
556
|
<demo-el-using-overlaymixin
|
|
557
557
|
id="secondOverlay"
|
|
558
|
-
.config
|
|
558
|
+
.config="${{ ...withModalDialogConfig(), hasBackdrop: true, isBlocking: true }}"
|
|
559
559
|
>
|
|
560
560
|
<div slot="content" class="demo-overlay demo-overlay--second">
|
|
561
561
|
Hello! You can close this notification here:
|
|
562
562
|
<button
|
|
563
|
-
@click
|
|
563
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
564
564
|
>
|
|
565
565
|
⨯
|
|
566
566
|
</button>
|
|
@@ -580,13 +580,13 @@ Here is the example below
|
|
|
580
580
|
export const localBackdrop = () => {
|
|
581
581
|
const localBackdropConfig = { ...withDropdownConfig() };
|
|
582
582
|
return html`
|
|
583
|
-
<demo-el-using-overlaymixin .config
|
|
583
|
+
<demo-el-using-overlaymixin .config="${localBackdropConfig}">
|
|
584
584
|
<demo-overlay-backdrop slot="backdrop"></demo-overlay-backdrop>
|
|
585
585
|
<button slot="invoker">Click me to open the overlay!</button>
|
|
586
586
|
<div slot="content" class="demo-overlay">
|
|
587
587
|
Hello! You can close this notification here:
|
|
588
588
|
<button
|
|
589
|
-
@click
|
|
589
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
590
590
|
>
|
|
591
591
|
⨯
|
|
592
592
|
</button>
|
|
@@ -611,7 +611,7 @@ export const nestedOverlays = () => {
|
|
|
611
611
|
<div slot="content" id="nestedContent" class="demo-overlay">
|
|
612
612
|
Nested content
|
|
613
613
|
<button
|
|
614
|
-
@click
|
|
614
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
615
615
|
>
|
|
616
616
|
⨯
|
|
617
617
|
</button>
|
|
@@ -619,7 +619,7 @@ export const nestedOverlays = () => {
|
|
|
619
619
|
<button slot="invoker" id="nestedInvoker">nested invoker button</button>
|
|
620
620
|
</demo-el-using-overlaymixin>
|
|
621
621
|
<button
|
|
622
|
-
@click
|
|
622
|
+
@click="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
|
|
623
623
|
>
|
|
624
624
|
⨯
|
|
625
625
|
</button>
|
|
@@ -684,15 +684,15 @@ export const LocalWithArrow = () => {
|
|
|
684
684
|
<button slot="invoker">Top</button>
|
|
685
685
|
<div slot="content">This is a tooltip with an arrow</div>
|
|
686
686
|
</arrow-example>
|
|
687
|
-
<arrow-example .config
|
|
687
|
+
<arrow-example .config="${placementRightConfig}">
|
|
688
688
|
<button slot="invoker">Right</button>
|
|
689
689
|
<div slot="content">This is a tooltip with an arrow</div>
|
|
690
690
|
</arrow-example>
|
|
691
|
-
<arrow-example .config
|
|
691
|
+
<arrow-example .config="${placementBottomConfig}">
|
|
692
692
|
<button slot="invoker">Bottom</button>
|
|
693
693
|
<div slot="content">This is a tooltip with an arrow</div>
|
|
694
694
|
</arrow-example>
|
|
695
|
-
<arrow-example .config
|
|
695
|
+
<arrow-example .config="${placementLeftConfig}">
|
|
696
696
|
<button slot="invoker">Left</button>
|
|
697
697
|
<div slot="content">This is a tooltip with an arrow</div>
|
|
698
698
|
</arrow-example>
|
|
@@ -52,8 +52,8 @@ export const getRequest = () => {
|
|
|
52
52
|
--sb-action-logger-max-height: 300px;
|
|
53
53
|
}
|
|
54
54
|
</style>
|
|
55
|
-
<button @click
|
|
56
|
-
<button @click
|
|
55
|
+
<button @click="${() => fetchHandler('pabu')}">Fetch Pabu</button>
|
|
56
|
+
<button @click="${() => fetchHandler('naga')}">Fetch Naga</button>
|
|
57
57
|
${actionLogger}
|
|
58
58
|
`;
|
|
59
59
|
};
|
|
@@ -101,8 +101,8 @@ export const getJsonRequest = () => {
|
|
|
101
101
|
--sb-action-logger-max-height: 300px;
|
|
102
102
|
}
|
|
103
103
|
</style>
|
|
104
|
-
<button @click
|
|
105
|
-
<button @click
|
|
104
|
+
<button @click="${() => fetchHandler('pabu')}">Fetch Pabu</button>
|
|
105
|
+
<button @click="${() => fetchHandler('naga')}">Fetch Naga</button>
|
|
106
106
|
${actionLogger}
|
|
107
107
|
`;
|
|
108
108
|
};
|
|
@@ -151,7 +151,7 @@ export const errorHandling = () => {
|
|
|
151
151
|
--sb-action-logger-max-height: 300px;
|
|
152
152
|
}
|
|
153
153
|
</style>
|
|
154
|
-
<button @click
|
|
154
|
+
<button @click="${fetchHandler}">Fetch</button>
|
|
155
155
|
${actionLogger}
|
|
156
156
|
`;
|
|
157
157
|
};
|
|
@@ -239,8 +239,8 @@ export const cache = () => {
|
|
|
239
239
|
--sb-action-logger-max-height: 300px;
|
|
240
240
|
}
|
|
241
241
|
</style>
|
|
242
|
-
<button @click
|
|
243
|
-
<button @click
|
|
242
|
+
<button @click="${() => fetchHandler('pabu')}">Fetch Pabu</button>
|
|
243
|
+
<button @click="${() => fetchHandler('naga')}">Fetch Naga</button>
|
|
244
244
|
${actionLogger}
|
|
245
245
|
`;
|
|
246
246
|
};
|
|
@@ -274,8 +274,8 @@ export const cacheActionOptions = () => {
|
|
|
274
274
|
--sb-action-logger-max-height: 300px;
|
|
275
275
|
}
|
|
276
276
|
</style>
|
|
277
|
-
<button @click
|
|
278
|
-
<button @click
|
|
277
|
+
<button @click="${() => fetchHandler('pabu')}">Fetch Pabu</button>
|
|
278
|
+
<button @click="${() => fetchHandler('naga')}">Fetch Naga</button>
|
|
279
279
|
${actionLogger}
|
|
280
280
|
`;
|
|
281
281
|
};
|
|
@@ -321,7 +321,7 @@ export const cacheMaxAge = () => {
|
|
|
321
321
|
--sb-action-logger-max-height: 300px;
|
|
322
322
|
}
|
|
323
323
|
</style>
|
|
324
|
-
<button @click
|
|
324
|
+
<button @click="${fetchHandler}">Fetch Pabu</button>
|
|
325
325
|
${actionLogger}
|
|
326
326
|
`;
|
|
327
327
|
};
|
|
@@ -355,8 +355,8 @@ export const changeCacheIdentifier = () => {
|
|
|
355
355
|
--sb-action-logger-max-height: 300px;
|
|
356
356
|
}
|
|
357
357
|
</style>
|
|
358
|
-
<button @click
|
|
359
|
-
<button @click
|
|
358
|
+
<button @click="${fetchHandler}">Fetch Pabu</button>
|
|
359
|
+
<button @click="${changeUserHandler}">Change user</button>
|
|
360
360
|
${actionLogger}
|
|
361
361
|
`;
|
|
362
362
|
};
|
|
@@ -392,10 +392,10 @@ export const nonGETRequest = () => {
|
|
|
392
392
|
--sb-action-logger-max-height: 300px;
|
|
393
393
|
}
|
|
394
394
|
</style>
|
|
395
|
-
<button @click
|
|
396
|
-
<button @click
|
|
397
|
-
<button @click
|
|
398
|
-
<button @click
|
|
395
|
+
<button @click="${() => fetchHandler('pabu', 'GET')}">GET Pabu</button>
|
|
396
|
+
<button @click="${() => fetchHandler('pabu', 'PATCH')}">PATCH Pabu</button>
|
|
397
|
+
<button @click="${() => fetchHandler('naga', 'GET')}">GET Naga</button>
|
|
398
|
+
<button @click="${() => fetchHandler('naga', 'PATCH')}">PATCH Naga</button>
|
|
399
399
|
${actionLogger}
|
|
400
400
|
`;
|
|
401
401
|
};
|
|
@@ -446,10 +446,10 @@ export const invalidateRules = () => {
|
|
|
446
446
|
--sb-action-logger-max-height: 300px;
|
|
447
447
|
}
|
|
448
448
|
</style>
|
|
449
|
-
<button @click
|
|
450
|
-
<button @click
|
|
451
|
-
<button @click
|
|
452
|
-
<button @click
|
|
449
|
+
<button @click="${() => fetchHandler('pabu', 'GET')}">GET Pabu</button>
|
|
450
|
+
<button @click="${() => fetchHandler('pabu', 'PATCH')}">PATCH Pabu</button>
|
|
451
|
+
<button @click="${() => fetchHandler('naga', 'GET')}">GET Naga</button>
|
|
452
|
+
<button @click="${() => fetchHandler('naga', 'PATCH')}">PATCH Naga</button>
|
|
453
453
|
${actionLogger}
|
|
454
454
|
`;
|
|
455
455
|
};
|
|
@@ -112,17 +112,17 @@ export const customTitle = () => {
|
|
|
112
112
|
const uid = Math.random().toString(36).substr(2, 10);
|
|
113
113
|
return html`
|
|
114
114
|
<button
|
|
115
|
-
@click
|
|
115
|
+
@click="${e => e.target.parentElement.querySelector(`#logger-${uid}`).log('Hello, World!')}"
|
|
116
116
|
>
|
|
117
117
|
Log
|
|
118
118
|
</button>
|
|
119
|
-
<sb-action-logger id="logger-${uid}" .title
|
|
119
|
+
<sb-action-logger id="logger-${uid}" .title="${'Hello World'}"></sb-action-logger>
|
|
120
120
|
`;
|
|
121
121
|
};
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
```html
|
|
125
|
-
<sb-action-logger .title
|
|
125
|
+
<sb-action-logger .title="${'Hello World'}"></sb-action-logger>
|
|
126
126
|
```
|
|
127
127
|
|
|
128
128
|
## Rationale
|
|
@@ -9,7 +9,7 @@ Therefore, they may not have the same quality standards as our other packages.
|
|
|
9
9
|
|
|
10
10
|
| Package | Description |
|
|
11
11
|
| -------------------------------------- | ----------------------- |
|
|
12
|
-
| [sb-action-logger](https://github.com/ing-bank/lion/blob/
|
|
12
|
+
| [sb-action-logger](https://github.com/ing-bank/lion/blob/b25478e4cc0cb51c4fda1eccadf5e630b679f53c/docs/fundamentals/tools/helpers/action-logger.md) | Storybook action logger |
|
|
13
13
|
|
|
14
14
|
## Installation
|
|
15
15
|
|