@lion/ui 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/components/core/src/SlotMixin.js +2 -1
  2. package/components/dialog/test/lion-dialog.test.js +3 -7
  3. package/components/form-integrations/test/form-group-methods.test.js +6 -4
  4. package/components/form-integrations/test/form-integrations.test.js +10 -5
  5. package/components/form-integrations/test/helpers/umbrella-form.js +10 -0
  6. package/components/form-integrations/test/model-value-consistency.test.js +29 -20
  7. package/components/input-datepicker/src/LionInputDatepicker.js +64 -100
  8. package/components/input-datepicker/src/localizeNamespaceLoader.js +188 -0
  9. package/components/input-datepicker/test/lion-input-datepicker.test.js +15 -20
  10. package/components/input-datepicker/test-helpers/DatepickerInputObject.js +3 -3
  11. package/components/input-tel/src/parsers.js +1 -1
  12. package/components/listbox/test-suites/ListboxMixin.suite.js +3 -3
  13. package/components/localize/test/number/formatNumber.test.js +2 -6
  14. package/components/overlays/src/OverlayController.js +236 -289
  15. package/components/overlays/src/OverlayMixin.js +17 -18
  16. package/components/overlays/src/OverlaysManager.js +28 -53
  17. package/components/overlays/src/overlayDocumentStyle.js +24 -0
  18. package/components/overlays/src/overlayShadowDomStyle.js +138 -0
  19. package/components/overlays/src/singleton.js +3 -1
  20. package/components/overlays/test/ArrowMixin.test.js +0 -1
  21. package/components/overlays/test/OverlayController.test.js +306 -273
  22. package/components/overlays/test/OverlaysManager.test.js +23 -32
  23. package/components/overlays/test/global-positioning.test.js +4 -15
  24. package/components/overlays/test/local-positioning.test.js +65 -38
  25. package/components/overlays/test-suites/OverlayMixin.suite.js +18 -26
  26. package/components/overlays/types/OverlayConfig.ts +32 -11
  27. package/components/overlays/types/OverlayMixinTypes.ts +2 -2
  28. package/components/select-rich/src/LionSelectInvoker.js +2 -3
  29. package/components/select-rich/src/LionSelectRich.js +22 -20
  30. package/components/select-rich/test/lion-select-rich.test.js +5 -7
  31. package/custom-elements.json +251 -362
  32. package/dist-types/components/core/src/SlotMixin.d.ts.map +1 -1
  33. package/dist-types/components/form-integrations/test/helpers/umbrella-form.d.ts +4 -0
  34. package/dist-types/components/form-integrations/test/helpers/umbrella-form.d.ts.map +1 -1
  35. package/dist-types/components/form-integrations/test/model-value-consistency.test.d.ts.map +1 -1
  36. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +3 -3
  37. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts.map +1 -1
  38. package/dist-types/components/input-datepicker/src/localizeNamespaceLoader.d.ts +4 -0
  39. package/dist-types/components/input-datepicker/src/localizeNamespaceLoader.d.ts.map +1 -0
  40. package/dist-types/components/overlays/src/OverlayController.d.ts +46 -101
  41. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  42. package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
  43. package/dist-types/components/overlays/src/OverlaysManager.d.ts +0 -7
  44. package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
  45. package/dist-types/components/overlays/src/overlayDocumentStyle.d.ts +2 -0
  46. package/dist-types/components/overlays/src/overlayDocumentStyle.d.ts.map +1 -0
  47. package/dist-types/components/overlays/src/overlayShadowDomStyle.d.ts +2 -0
  48. package/dist-types/components/overlays/src/overlayShadowDomStyle.d.ts.map +1 -0
  49. package/dist-types/components/overlays/src/singleton.d.ts +2 -1
  50. package/dist-types/components/overlays/src/singleton.d.ts.map +1 -1
  51. package/dist-types/components/overlays/test-suites/OverlayMixin.suite.d.ts.map +1 -1
  52. package/dist-types/components/overlays/types/OverlayConfig.d.ts +14 -10
  53. package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
  54. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts +2 -2
  55. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts.map +1 -1
  56. package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts +3 -27
  57. package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts.map +1 -1
  58. package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
  59. package/dist-types/components/select-rich/test/lion-select-rich.test.d.ts.map +1 -1
  60. package/dist-types/exports/input-datepicker.d.ts +0 -1
  61. package/dist-types/exports/overlays.d.ts +0 -1
  62. package/dist-types/exports/types/overlays.d.ts +1 -0
  63. package/dist-types/exports/types/overlays.d.ts.map +1 -1
  64. package/dist-types/tsconfig.tsbuildinfo +1 -1
  65. package/docs/components/checkbox-group/overview.md +2 -2
  66. package/docs/components/collapsible/overview.md +1 -1
  67. package/docs/components/combobox/overview.md +1 -1
  68. package/docs/components/combobox/use-cases.md +1 -1
  69. package/docs/components/dialog/overview.md +5 -9
  70. package/docs/components/dialog/use-cases.md +43 -87
  71. package/docs/components/fieldset/overview.md +5 -5
  72. package/docs/components/form/overview.md +3 -3
  73. package/docs/components/icon/use-cases.md +1 -1
  74. package/docs/components/input/overview.md +1 -1
  75. package/docs/components/input-amount/overview.md +3 -3
  76. package/docs/components/input-date/overview.md +3 -3
  77. package/docs/components/input-datepicker/overview.md +5 -5
  78. package/docs/components/input-email/overview.md +2 -2
  79. package/docs/components/input-iban/overview.md +2 -2
  80. package/docs/components/input-range/overview.md +2 -2
  81. package/docs/components/input-stepper/overview.md +1 -1
  82. package/docs/components/input-tel/overview.md +1 -1
  83. package/docs/components/input-tel/use-cases.md +6 -6
  84. package/docs/components/input-tel-dropdown/overview.md +1 -1
  85. package/docs/components/radio-group/overview.md +3 -3
  86. package/docs/components/select-rich/use-cases.md +1 -1
  87. package/docs/components/tabs/examples.md +1 -1
  88. package/docs/fundamentals/index.md +4 -4
  89. package/docs/fundamentals/node-tools/providence-analytics/LocalConfiguration.md +1 -1
  90. package/docs/fundamentals/node-tools/providence-analytics/QueryResult.md +1 -1
  91. package/docs/fundamentals/node-tools/providence-analytics/analyzer.md +1 -1
  92. package/docs/fundamentals/node-tools/providence-analytics/dashboard.md +1 -1
  93. package/docs/fundamentals/node-tools/providence-analytics/overview.md +3 -3
  94. package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
  95. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
  96. package/docs/fundamentals/systems/core/overview.md +1 -1
  97. package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
  98. package/docs/fundamentals/systems/form/model-value.md +1 -1
  99. package/docs/fundamentals/systems/form/overview.md +28 -28
  100. package/docs/fundamentals/systems/form/use-cases.md +4 -0
  101. package/docs/fundamentals/systems/form/validate.md +1 -1
  102. package/docs/fundamentals/systems/localize/overview.md +4 -4
  103. package/docs/fundamentals/systems/overlays/assets/{applyDemoOverlayStyles.js → applyDemoOverlayStyles.mjs} +2 -1
  104. package/docs/fundamentals/systems/overlays/assets/demo-el-using-overlaymixin.mjs +119 -0
  105. package/docs/fundamentals/systems/overlays/assets/{demo-overlay-backdrop.js → demo-overlay-backdrop.mjs} +3 -4
  106. package/docs/fundamentals/systems/overlays/assets/demo-overlay-positioning.mjs +537 -0
  107. package/docs/fundamentals/systems/overlays/assets/umbrella-form.js +9 -2
  108. package/docs/fundamentals/systems/overlays/configuration.md +56 -54
  109. package/docs/fundamentals/systems/overlays/overview.md +5 -5
  110. package/docs/fundamentals/systems/overlays/use-cases.md +83 -77
  111. package/docs/fundamentals/tools/helpers/overview.md +1 -1
  112. package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
  113. package/docs/guides/how-to/create-a-custom-field.md +6 -6
  114. package/docs/guides/how-to/extend-a-native-input.md +3 -3
  115. package/docs/guides/index.md +8 -8
  116. package/docs/guides/principles/index.md +5 -5
  117. package/docs/guides/principles/styling.md +1 -1
  118. package/exports/input-datepicker.js +0 -1
  119. package/exports/overlays.js +0 -1
  120. package/exports/types/overlays.ts +1 -0
  121. package/package.json +2 -1
  122. package/components/input-datepicker/src/LionCalendarOverlayFrame.js +0 -125
  123. package/components/overlays/src/globalOverlaysStyle.js +0 -139
  124. package/dist-types/components/input-datepicker/src/LionCalendarOverlayFrame.d.ts +0 -10
  125. package/dist-types/components/input-datepicker/src/LionCalendarOverlayFrame.d.ts.map +0 -1
  126. package/dist-types/components/overlays/src/globalOverlaysStyle.d.ts +0 -2
  127. package/dist-types/components/overlays/src/globalOverlaysStyle.d.ts.map +0 -1
  128. package/dist-types/exports/define/lion-calendar-overlay-frame.d.ts +0 -2
  129. package/dist-types/exports/define/lion-calendar-overlay-frame.d.ts.map +0 -1
  130. package/docs/fundamentals/systems/overlays/assets/demo-overlay-system.js +0 -42
  131. package/docs/fundamentals/systems/overlays/form-integration.md +0 -65
  132. package/docs/fundamentals/systems/overlays/scope.md +0 -176
  133. package/exports/define/lion-calendar-overlay-frame.js +0 -3
@@ -0,0 +1,537 @@
1
+ /* eslint-disable max-classes-per-file */
2
+ /* eslint-disable import/no-extraneous-dependencies */
3
+ import { html, LitElement, css } from 'lit';
4
+ import { ref, createRef } from 'lit/directives/ref.js';
5
+ import { OverlayMixin } from '@lion/ui/overlays.js';
6
+ import './demo-el-using-overlaymixin.mjs';
7
+
8
+ /**
9
+ * @typedef {import('@lion/ui/types/overlays.js').OverlayConfig} OverlayConfig
10
+ * @typedef {import('@lion/ui/types/overlays.js').OverlayHost} OverlayHost
11
+ * @typedef {import('@lion/ui/button.js').LionButton} LionButton
12
+ * @typedef {'top-start'|'top'|'top-end'|'right-start'|'right'|'right-end'|'bottom-start'|'bottom'|'bottom-end'|'left-start'|'left'|'left-end'} LocalPlacement
13
+ * @typedef {'center'|'top-left'|'top'|'top-right'|'right'|'bottom-right'|'bottom'|'bottom-left'|'left'} ViewportPlacement
14
+ * @typedef {{refs: { contentNodeWrapper:{ref: {value:HTMLElement}}; closeButton: {ref: {value:HTMLButtonElement|LionButton}; label:string} }}} TemplateDataForOverlay
15
+ */
16
+ class DemoOverlayEl extends OverlayMixin(LitElement) {
17
+ /** @type {any} */
18
+ static get properties() {
19
+ return {
20
+ simulateViewport: { type: Boolean, attribute: 'simulate-viewport', reflect: true },
21
+ noDialogEl: { type: Boolean, attribute: 'no-dialog-el' },
22
+ useAbsolute: { type: Boolean, attribute: 'use-absolute', reflect: true },
23
+ };
24
+ }
25
+
26
+ static get styles() {
27
+ return [
28
+ super.styles || [],
29
+ css`
30
+ :host([use-absolute]) dialog {
31
+ position: absolute !important;
32
+ }
33
+
34
+ :host([simulate-viewport]) {
35
+ position: absolute;
36
+ inset: 0;
37
+ z-index: -1;
38
+ }
39
+
40
+ :host([simulate-viewport]) dialog {
41
+ position: absolute !important;
42
+ inset: 0;
43
+ width: 100%;
44
+ height: 100%;
45
+ }
46
+
47
+ :host([simulate-viewport]) #overlay-content-node-wrapper.overlays__overlay-container {
48
+ position: absolute;
49
+ }
50
+
51
+ /*=== demo invoker and content ===*/
52
+
53
+ :host ::slotted([slot='invoker']) {
54
+ border: 4px dashed;
55
+ height: 24px;
56
+ min-width: 24px;
57
+ }
58
+
59
+ :host ::slotted([slot='content']) {
60
+ background-color: black;
61
+ color: white;
62
+ height: 54px;
63
+ min-width: 54px;
64
+ display: flex;
65
+ place-items: center;
66
+ padding: 20px;
67
+ text-align: center;
68
+ font-size: 0.8rem;
69
+ }
70
+ `,
71
+ ];
72
+ }
73
+
74
+ constructor() {
75
+ super();
76
+
77
+ this.simulateViewport = false;
78
+ this._noDialogEl = false;
79
+ this.useAbsolute = false;
80
+ }
81
+
82
+ // eslint-disable-next-line class-methods-use-this
83
+ _defineOverlayConfig() {
84
+ return /** @type {OverlayConfig} */ ({
85
+ placementMode: 'local',
86
+ noDialogEl: this._noDialogEl,
87
+ popperConfig: { strategy: this.useAbsolute ? 'absolute' : 'fixed' },
88
+ });
89
+ }
90
+
91
+ _setupOpenCloseListeners() {
92
+ super._setupOpenCloseListeners();
93
+
94
+ if (this._overlayInvokerNode) {
95
+ this._overlayInvokerNode.addEventListener('click', this.toggle);
96
+ }
97
+ }
98
+
99
+ _teardownOpenCloseListeners() {
100
+ super._teardownOpenCloseListeners();
101
+
102
+ if (this._overlayInvokerNode) {
103
+ this._overlayInvokerNode.removeEventListener('click', this.toggle);
104
+ }
105
+ }
106
+
107
+ refs = {
108
+ invokerSlot: /** @type {{value: HTMLSlotElement}} */ (createRef()),
109
+ backdropSlot: /** @type {{value: HTMLSlotElement}} */ (createRef()),
110
+ contentSlot: /** @type {{value: HTMLSlotElement}} */ (createRef()),
111
+ closeButton: /** @type {{value: HTMLButtonElement|LionButton}} */ (createRef()),
112
+ contentNodeWrapper: /** @type {{value: HTMLElement}} */ (createRef()),
113
+ };
114
+
115
+ /**
116
+ * @overridable
117
+ * @type {TemplateDataForOverlay}
118
+ */
119
+ get _templateData() {
120
+ return {
121
+ refs: {
122
+ contentNodeWrapper: {
123
+ ref: this.refs.contentNodeWrapper,
124
+ },
125
+ closeButton: {
126
+ ref: this.refs.closeButton,
127
+ label: 'close dialog',
128
+ },
129
+ },
130
+ };
131
+ }
132
+
133
+ static templates = {
134
+ main: (/** @type {TemplateDataForOverlay} */ { refs }) => html`
135
+ <slot name="invoker"></slot>
136
+ <slot name="backdrop"></slot>
137
+ <div ${ref(refs.contentNodeWrapper.ref)} id="overlay-content-node-wrapper">
138
+ <slot name="content"></slot>
139
+ </div>
140
+ `,
141
+ };
142
+
143
+ render() {
144
+ const ctor = /** @type {typeof DemoOverlayEl} */ (this.constructor);
145
+ const templates = this.templates || ctor.templates;
146
+ return templates.main(this._templateData);
147
+ }
148
+ }
149
+ customElements.define('demo-overlay-el', DemoOverlayEl);
150
+
151
+ class DemoOverlayPositioning extends LitElement {
152
+ static properties = {
153
+ placementMode: { attribute: 'placement-mode', type: String },
154
+ simulateViewport: { type: Boolean, attribute: 'simulate-viewport', reflect: true },
155
+ _activePos: { type: String, reflect: true, attribute: 'active-pos' },
156
+ _activeConfig: { type: Object, state: true },
157
+ };
158
+
159
+ static get styles() {
160
+ return [
161
+ css`
162
+ /*=== .pos-container ===*/
163
+
164
+ .pos-container {
165
+ padding: 0.5rem;
166
+ overflow: hidden;
167
+ place-items: center;
168
+ height: 20rem;
169
+ display: grid;
170
+ position: relative;
171
+ }
172
+
173
+ /*=== .pos-btn-wrapper ===*/
174
+
175
+ /**
176
+ * We need a wrapper for position transforms, so that we can apply scale transforms on .pos-btn hover
177
+ */
178
+
179
+ .pos-btn-wrapper {
180
+ position: absolute;
181
+ }
182
+
183
+ .pos-container--local .pos-btn-wrapper--bottom-start,
184
+ .pos-container--local .pos-btn-wrapper--bottom-end,
185
+ .pos-container--local .pos-btn-wrapper--top-start,
186
+ .pos-container--local .pos-btn-wrapper--top-end,
187
+ .pos-container--local .pos-btn-wrapper--top,
188
+ .pos-container--local .pos-btn-wrapper--bottom {
189
+ left: 50%;
190
+ transform: translateX(-50%);
191
+ }
192
+
193
+ .pos-container--local .pos-btn-wrapper--top-start,
194
+ .pos-container--local .pos-btn-wrapper--top-end,
195
+ .pos-container--local .pos-btn-wrapper--top {
196
+ top: 0;
197
+ }
198
+
199
+ .pos-container--local .pos-btn-wrapper--bottom-start,
200
+ .pos-container--local .pos-btn-wrapper--bottom-end,
201
+ .pos-container--local .pos-btn-wrapper--bottom {
202
+ bottom: 0;
203
+ }
204
+
205
+ .pos-container--local .pos-btn-wrapper--left-start,
206
+ .pos-container--local .pos-btn-wrapper--left-end,
207
+ .pos-container--local .pos-btn-wrapper--right-start,
208
+ .pos-container--local .pos-btn-wrapper--right-end,
209
+ .pos-container--local .pos-btn-wrapper--left,
210
+ .pos-container--local .pos-btn-wrapper--right {
211
+ top: 50%;
212
+ transform: translateY(-50%);
213
+ }
214
+
215
+ .pos-container--local .pos-btn-wrapper--left-start,
216
+ .pos-container--local .pos-btn-wrapper--left-end,
217
+ .pos-container--local .pos-btn-wrapper--left {
218
+ left: 0;
219
+ }
220
+
221
+ .pos-container--local .pos-btn-wrapper--right-start,
222
+ .pos-container--local .pos-btn-wrapper--right-end,
223
+ .pos-container--local .pos-btn-wrapper--right {
224
+ right: 0;
225
+ }
226
+
227
+ .pos-container--local .pos-btn-wrapper--bottom-start,
228
+ .pos-container--local .pos-btn-wrapper--top-start {
229
+ transform: translateX(-50%) translateX(-48px);
230
+ }
231
+
232
+ .pos-container--local .pos-btn-wrapper--bottom-end,
233
+ .pos-container--local .pos-btn-wrapper--top-end {
234
+ transform: translateX(-50%) translateX(48px);
235
+ }
236
+
237
+ .pos-container--local .pos-btn-wrapper--left-start,
238
+ .pos-container--local .pos-btn-wrapper--right-start {
239
+ transform: translateY(calc(-50% - 48px));
240
+ }
241
+
242
+ .pos-container--local .pos-btn-wrapper--left-end,
243
+ .pos-container--local .pos-btn-wrapper--right-end {
244
+ transform: translateY(calc(-50% + 48px));
245
+ }
246
+
247
+ .pos-container--global .pos-btn-wrapper {
248
+ top: 50%;
249
+ left: 50%;
250
+ }
251
+
252
+ .pos-container--global .pos-btn-wrapper--center {
253
+ transform: translateY(-50%) translateX(-50%);
254
+ }
255
+
256
+ .pos-container--global .pos-btn-wrapper--top-left {
257
+ transform: translateY(-50%) translateX(-50%) translateY(-48px) translateX(-48px);
258
+ }
259
+
260
+ .pos-container--global .pos-btn-wrapper--top {
261
+ transform: translateY(-50%) translateX(-50%) translateY(-48px);
262
+ }
263
+
264
+ .pos-container--global .pos-btn-wrapper--top-right {
265
+ transform: translateY(-50%) translateX(-50%) translateY(-48px) translateX(48px);
266
+ }
267
+
268
+ .pos-container--global .pos-btn-wrapper--bottom-left {
269
+ transform: translateY(-50%) translateX(-50%) translateY(48px) translateX(-48px);
270
+ }
271
+
272
+ .pos-container--global .pos-btn-wrapper--bottom {
273
+ transform: translateY(-50%) translateX(-50%) translateY(48px);
274
+ }
275
+
276
+ .pos-container--global .pos-btn-wrapper--bottom-right {
277
+ transform: translateY(-50%) translateX(-50%) translateY(48px) translateX(48px);
278
+ }
279
+
280
+ .pos-container--global .pos-btn-wrapper--right {
281
+ transform: translateY(-50%) translateX(-50%) translateX(48px);
282
+ }
283
+
284
+ .pos-container--global .pos-btn-wrapper--left {
285
+ transform: translateY(-50%) translateX(-50%) translateX(-48px);
286
+ }
287
+
288
+ /*=== .pos-btn ===*/
289
+
290
+ .pos-btn {
291
+ padding: 1rem;
292
+ cursor: pointer;
293
+ -webkit-appearance: button;
294
+ background-color: transparent;
295
+ background-image: none;
296
+ text-transform: none;
297
+ font-family: inherit;
298
+ font-size: 100%;
299
+ line-height: inherit;
300
+ color: inherit;
301
+ margin: 0;
302
+ box-sizing: border-box;
303
+ border: 0 solid #bfc3d9;
304
+ }
305
+
306
+ .pos-btn__inner {
307
+ border-style: solid;
308
+ border-width: 2px;
309
+ border-radius: 100%;
310
+ width: 0.25rem;
311
+ height: 0.25rem;
312
+ }
313
+
314
+ .pos-btn:hover {
315
+ transform: scaleX(2) scaleY(2);
316
+ }
317
+
318
+ .pos-btn--active .pos-btn__inner {
319
+ background-color: black;
320
+ }
321
+
322
+ /*=== .reference-btn ===*/
323
+
324
+ .reference-btn {
325
+ background: white;
326
+ box-sizing: border-box;
327
+ border: 5px dashed black;
328
+ cursor: pointer;
329
+ padding: 1rem;
330
+ width: 8rem;
331
+ height: 8rem;
332
+ }
333
+
334
+ .pos-container--global .reference-btn {
335
+ position: absolute;
336
+ inset: 0;
337
+ width: 100%;
338
+ height: 100%;
339
+ z-index: -1;
340
+ }
341
+
342
+ /*=== .close-btn ===*/
343
+
344
+ .close-btn {
345
+ background: transparent;
346
+ border: none;
347
+ position: absolute;
348
+ right: 0;
349
+ top: 0;
350
+ padding: 0.5rem;
351
+ }
352
+
353
+ .close-btn::after {
354
+ content: '';
355
+ clear: both;
356
+ }
357
+
358
+ /*=== .overlay-content ===*/
359
+
360
+ .overlay-content {
361
+ display: flex;
362
+ box-sizing: border-box;
363
+ border: 1px solid black;
364
+ align-items: center;
365
+ justify-items: center;
366
+ background-color: #000;
367
+ padding: 1rem;
368
+ width: 2rem;
369
+ height: 2rem;
370
+ }
371
+
372
+ :host([active-pos^='center']) .pos-container--global .overlay-content {
373
+ width: 14rem;
374
+ height: 16rem;
375
+ }
376
+
377
+ :host([active-pos^='bottom']) .pos-container--global .overlay-content,
378
+ :host([active-pos^='top']) .pos-container--global .overlay-content {
379
+ width: 50%;
380
+ }
381
+
382
+ :host([active-pos^='left']) .pos-container--global .overlay-content,
383
+ :host([active-pos^='right']) .pos-container--global .overlay-content {
384
+ height: 50%;
385
+ }
386
+
387
+ :host([active-pos^='center']) .pos-btn {
388
+ color: white;
389
+ }
390
+ `,
391
+ ];
392
+ }
393
+
394
+ refs = {
395
+ overlay: /** @type {{value: OverlayHost}} */ (createRef()),
396
+ };
397
+
398
+ constructor() {
399
+ super();
400
+
401
+ this.placementMode = 'local';
402
+ /** @type {ViewportPlacement[]|LocalPlacement[]} */
403
+ this._placements = [];
404
+ this.simulateViewport = false;
405
+ this._activePos = 'top';
406
+ }
407
+
408
+ /**
409
+ *
410
+ * @param {{pos:ViewportPlacement|LocalPlacement}} opts
411
+ */
412
+ async _updatePos({ pos }) {
413
+ this._activePos = pos;
414
+
415
+ const overlayEl = this.refs.overlay.value;
416
+
417
+ // @ts-ignore allow protected
418
+ if (overlayEl?._overlayCtrl) {
419
+ overlayEl.config = /** @type {Partial<OverlayConfig>} */ ({
420
+ popperConfig: { placement: pos },
421
+ viewportConfig: { placement: pos },
422
+ });
423
+ // TODO: these hacks below should not be needed. Fix when moving to floating-ui
424
+ // => animate different positions
425
+ // @ts-ignore allow protected
426
+ await overlayEl._overlayCtrl.hide();
427
+ // @ts-ignore allow protected
428
+ overlayEl._overlayCtrl.show();
429
+ overlayEl.config = /** @type {Partial<OverlayConfig>} */ ({
430
+ popperConfig: { placement: pos },
431
+ viewportConfig: { placement: pos },
432
+ });
433
+ }
434
+ }
435
+
436
+ /**
437
+ * @param {import('lit').PropertyValues } changedProperties
438
+ */
439
+ firstUpdated(changedProperties) {
440
+ super.firstUpdated(changedProperties);
441
+
442
+ this._updatePos({ pos: this.placementMode === 'local' ? 'top' : 'center' });
443
+ }
444
+
445
+ /**
446
+ * @param {import('lit').PropertyValues } changedProperties
447
+ */
448
+ update(changedProperties) {
449
+ if (changedProperties.has('placementMode')) {
450
+ if (this.placementMode === 'local') {
451
+ this._placements = [
452
+ `top-start`,
453
+ `top`,
454
+ `top-end`,
455
+ `right-start`,
456
+ `right`,
457
+ `right-end`,
458
+ `bottom-start`,
459
+ `bottom`,
460
+ `bottom-end`,
461
+ `left-start`,
462
+ `left`,
463
+ `left-end`,
464
+ ];
465
+ } else {
466
+ this._placements = [
467
+ `center`,
468
+ `top-left`,
469
+ `top`,
470
+ `top-right`,
471
+ `right`,
472
+ `bottom-right`,
473
+ `bottom`,
474
+ `bottom-left`,
475
+ `left`,
476
+ ];
477
+ }
478
+ }
479
+ super.update(changedProperties);
480
+ }
481
+
482
+ /**
483
+ * @param {import('lit').PropertyValues } changedProperties
484
+ */
485
+ updated(changedProperties) {
486
+ super.updated(changedProperties);
487
+
488
+ if (changedProperties.has('placementMode')) {
489
+ this._activeConfig = {
490
+ placementMode: this.placementMode,
491
+ };
492
+ }
493
+ }
494
+
495
+ /**
496
+ * @param {{pos:string}} opts
497
+ * @returns
498
+ */
499
+ _isActivePosBtn({ pos }) {
500
+ return pos === this._activePos;
501
+ }
502
+
503
+ render() {
504
+ return html`
505
+ <div class="pos-container pos-container--${this.placementMode}">
506
+ ${this._placements.map(
507
+ pos =>
508
+ html`
509
+ <div class="pos-btn-wrapper pos-btn-wrapper--${pos}">
510
+ <button
511
+ @click="${() => this._updatePos({ pos })}"
512
+ class="pos-btn ${this._isActivePosBtn({ pos }) ? 'pos-btn--active' : ''}"
513
+ aria-label="${pos}"
514
+ >
515
+ <div class="pos-btn__inner"></div>
516
+ </button>
517
+ </div>
518
+ `,
519
+ )}
520
+
521
+ <demo-overlay-el
522
+ opened
523
+ ?simulate-viewport="${this.simulateViewport}"
524
+ ${ref(
525
+ // @ts-ignore
526
+ this.refs.overlay,
527
+ )}
528
+ .config="${this._activeConfig}"
529
+ >
530
+ <button class="reference-btn" slot="invoker"></button>
531
+ <div class="overlay-content" slot="content"></div>
532
+ </demo-overlay-el>
533
+ </div>
534
+ `;
535
+ }
536
+ }
537
+ customElements.define('demo-overlay-positioning', DemoOverlayPositioning);
@@ -8,15 +8,22 @@ import '@lion/ui/define/lion-input-datepicker.js';
8
8
  import '@lion/ui/define/lion-input-amount.js';
9
9
  import '@lion/ui/define/lion-input-iban.js';
10
10
  import '@lion/ui/define/lion-input-email.js';
11
+ import '@lion/ui/define/lion-input-tel.js';
12
+ import '@lion/ui/define/lion-input-tel-dropdown.js';
11
13
  import '@lion/ui/define/lion-checkbox-group.js';
14
+ import '@lion/ui/define/lion-checkbox.js';
12
15
  import '@lion/ui/define/lion-radio-group.js';
16
+ import '@lion/ui/define/lion-radio.js';
13
17
  import '@lion/ui/define/lion-select.js';
14
18
  import '@lion/ui/define/lion-select-rich.js';
19
+ import '@lion/ui/define/lion-listbox.js';
20
+ import '@lion/ui/define/lion-option.js';
21
+ import '@lion/ui/define/lion-combobox.js';
15
22
  import '@lion/ui/define/lion-input-range.js';
16
23
  import '@lion/ui/define/lion-textarea.js';
17
24
  import '@lion/ui/define/lion-button.js';
18
- import '@lion/ui/define/lion-input-tel.js';
19
- import '@lion/ui/define/lion-input-tel-dropdown.js';
25
+ import '@lion/ui/define/lion-switch.js';
26
+ import '@lion/ui/define/lion-input-stepper.js';
20
27
 
21
28
  export class UmbrellaForm extends LitElement {
22
29
  get _lionFormNode() {