@lion/ui 0.17.0-menu-system.1 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/collapsible.js +0 -1
- package/components/button/src/LionButton.js +0 -4
- package/components/button/test-suites/LionButton.suite.js +0 -1
- package/components/calendar/src/LionCalendar.js +0 -2
- package/components/combobox/test/lion-combobox.test.js +0 -1
- package/components/form-core/src/form-group/FormGroupMixin.js +0 -7
- package/components/form-core/src/registration/FormRegistrarMixin.js +0 -11
- package/components/form-core/test/FormControlMixin.test.js +0 -1
- package/components/form-core/test/validate/Validator.test.js +0 -2
- package/components/form-core/test-suites/ValidateMixin.suite.js +0 -2
- package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +0 -1
- package/components/input-datepicker/src/localizeNamespaceLoader.js +0 -1
- package/components/input-datepicker/test/lion-input-datepicker.test.js +6 -5
- package/components/localize/test/date/formatDate.test.js +0 -1
- package/components/overlays/src/OverlayController.js +111 -244
- package/components/overlays/src/OverlayMixin.js +11 -58
- package/components/overlays/src/OverlaysManager.js +2 -2
- package/components/overlays/src/configurations/withDropdownConfig.js +2 -22
- package/components/overlays/src/configurations/withPopoverConfig.js +32 -0
- package/components/overlays/src/utils/adopt-styles.js +1 -2
- package/components/overlays/src/utils/get-focusable-elements.js +0 -4
- package/components/overlays/src/utils/is-equal-config.js +6 -10
- package/components/overlays/test/OverlayController.test.js +3 -5
- package/components/overlays/test/utils-tests/is-equal-config.test.js +1 -1
- package/components/overlays/test-suites/OverlayMixin.suite.js +8 -8
- package/components/overlays/types/OverlayConfig.ts +5 -16
- package/components/select-rich/test/lion-select-rich.test.js +0 -3
- package/custom-elements.json +1891 -13818
- package/dist-types/components/button/src/LionButton.d.ts +0 -1
- package/dist-types/components/button/src/LionButton.d.ts.map +1 -1
- package/dist-types/components/button/test-suites/LionButton.suite.d.ts.map +1 -1
- package/dist-types/components/calendar/src/LionCalendar.d.ts.map +1 -1
- package/dist-types/components/dialog/src/LionDialog.d.ts +1 -3
- package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
- package/dist-types/components/form-core/src/form-group/FormGroupMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/src/registration/FormRegistrarMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/src/localizeNamespaceLoader.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlayController.d.ts +13 -9
- 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/overlays/src/configurations/withDropdownConfig.d.ts +0 -1
- package/dist-types/components/overlays/src/configurations/withDropdownConfig.d.ts.map +1 -1
- package/dist-types/components/overlays/src/configurations/withPopoverConfig.d.ts +6 -0
- package/dist-types/components/overlays/src/configurations/withPopoverConfig.d.ts.map +1 -0
- package/dist-types/components/overlays/src/utils/get-focusable-elements.d.ts.map +1 -1
- package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
- package/dist-types/components/overlays/types/OverlayConfig.d.ts +2 -10
- package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts +2 -8
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
- package/dist-types/exports/overlays.d.ts +1 -3
- package/dist-types/exports/overlays.d.ts.map +1 -1
- package/dist-types/tsconfig.tsbuildinfo +1 -1
- package/docs/components/checkbox-group/overview.md +2 -2
- package/docs/components/collapsible/overview.md +1 -1
- package/docs/components/combobox/api-table.md +8 -21
- package/docs/components/combobox/overview.md +1 -1
- package/docs/components/combobox/use-cases.md +1 -1
- package/docs/components/dialog/api-table.md +6 -31
- package/docs/components/dialog/overview.md +1 -1
- package/docs/components/fieldset/overview.md +5 -5
- package/docs/components/form/overview.md +3 -3
- package/docs/components/form/use-cases.md +2 -2
- package/docs/components/icon/use-cases.md +1 -1
- package/docs/components/input/overview.md +1 -1
- package/docs/components/input-amount/overview.md +3 -3
- package/docs/components/input-date/overview.md +3 -3
- package/docs/components/input-datepicker/api-table.md +4 -21
- package/docs/components/input-datepicker/overview.md +5 -5
- package/docs/components/input-email/overview.md +2 -2
- package/docs/components/input-file/overview.md +1 -1
- package/docs/components/input-iban/overview.md +2 -2
- package/docs/components/input-range/overview.md +2 -2
- 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 +6 -6
- package/docs/components/input-tel-dropdown/overview.md +1 -1
- package/docs/components/listbox/use-cases.md +1 -1
- package/docs/components/radio-group/overview.md +3 -3
- package/docs/components/select/use-cases.md +1 -1
- package/docs/components/select-rich/api-table.md +5 -21
- package/docs/components/select-rich/use-cases.md +2 -2
- package/docs/components/tabs/examples.md +1 -1
- package/docs/components/tooltip/api-table.md +11 -36
- package/docs/fundamentals/index.md +4 -4
- 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 +4 -4
- package/docs/fundamentals/systems/form/model-value.md +1 -1
- package/docs/fundamentals/systems/form/overview.md +28 -28
- package/docs/fundamentals/systems/form/validate.md +2 -2
- package/docs/fundamentals/systems/localize/overview.md +4 -4
- package/docs/fundamentals/systems/overlays/api-table.md +34 -34
- package/docs/fundamentals/systems/overlays/configuration.md +2 -2
- package/docs/fundamentals/systems/overlays/overview.md +5 -5
- package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
- package/docs/fundamentals/tools/helpers/overview.md +1 -1
- package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
- package/docs/guides/how-to/create-a-custom-field.md +5 -5
- 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/how-to/index.md +1 -1
- package/docs/guides/index.md +8 -8
- package/docs/guides/principles/index.md +5 -5
- package/docs/guides/principles/styling.md +1 -1
- package/exports/collapsible.js +0 -1
- package/exports/overlays.js +1 -6
- package/overlays.js +1 -6
- package/package.json +1 -1
- package/components/collapsible/src/DisclosureMixin.js +0 -313
- package/components/collapsible/types/DisclosureMixinTypes.ts +0 -48
- package/components/menu/CHANGELOG.md +0 -37
- package/components/menu/README.md +0 -335
- package/components/menu/index.js +0 -2
- package/components/menu/lion-menu-overlay.js +0 -3
- package/components/menu/lion-menu.js +0 -3
- package/components/menu/lion-spinbutton.js +0 -3
- package/components/menu/lion-toolbar.js +0 -3
- package/components/menu/lion-tree.js +0 -3
- package/components/menu/package.json +0 -46
- package/components/menu/requirements.temp.md +0 -12
- package/components/menu/src/InteractiveListMixin.js +0 -796
- package/components/menu/src/LionMenu.js +0 -250
- package/components/menu/src/LionMenuHybrid.js +0 -46
- package/components/menu/src/LionMenuOverlay.js +0 -155
- package/components/menu/src/LionSpinbutton.js +0 -213
- package/components/menu/src/LionToolbar.js +0 -94
- package/components/menu/src/LionTree.js +0 -52
- package/components/menu/src/MultiLevelListMixin.js +0 -274
- package/components/menu/src/utils/isInView.js +0 -26
- package/components/menu/src/utils/listItemInteractions.js +0 -104
- package/components/menu/src/utils/uuid.js +0 -3
- package/components/menu/test/lion-menu.test.js +0 -3
- package/components/menu/test-suites/InteractiveListMixin.suite.js +0 -142
- package/components/menu/types/InteractiveListMixinTypes.d.ts +0 -82
- package/components/navigation-bar/README.md +0 -1
- package/components/navigation-bar/src/LionNavigationBar.js +0 -422
- package/components/navigation-bar/src/types.js +0 -41
- package/components/overlays/NEXT.md +0 -49
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts +0 -3
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts.map +0 -1
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts +0 -24
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts.map +0 -1
- package/dist-types/components/menu/index.d.ts +0 -3
- package/dist-types/components/menu/index.d.ts.map +0 -1
- package/dist-types/components/menu/lion-menu-overlay.d.ts +0 -2
- package/dist-types/components/menu/lion-menu-overlay.d.ts.map +0 -1
- package/dist-types/components/menu/lion-menu.d.ts +0 -2
- package/dist-types/components/menu/lion-menu.d.ts.map +0 -1
- package/dist-types/components/menu/lion-spinbutton.d.ts +0 -2
- package/dist-types/components/menu/lion-spinbutton.d.ts.map +0 -1
- package/dist-types/components/menu/lion-toolbar.d.ts +0 -2
- package/dist-types/components/menu/lion-toolbar.d.ts.map +0 -1
- package/dist-types/components/menu/lion-tree.d.ts +0 -2
- package/dist-types/components/menu/lion-tree.d.ts.map +0 -1
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts +0 -611
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionMenu.d.ts +0 -563
- package/dist-types/components/menu/src/LionMenu.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts +0 -19
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts +0 -1007
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionSpinbutton.d.ts +0 -58
- package/dist-types/components/menu/src/LionSpinbutton.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionToolbar.d.ts +0 -8
- package/dist-types/components/menu/src/LionToolbar.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionTree.d.ts +0 -445
- package/dist-types/components/menu/src/LionTree.d.ts.map +0 -1
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +0 -493
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +0 -1
- package/dist-types/components/menu/src/utils/isInView.d.ts +0 -9
- package/dist-types/components/menu/src/utils/isInView.d.ts.map +0 -1
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +0 -42
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +0 -1
- package/dist-types/components/menu/src/utils/uuid.d.ts +0 -2
- package/dist-types/components/menu/src/utils/uuid.d.ts.map +0 -1
- package/dist-types/components/menu/test/lion-menu.test.d.ts +0 -2
- package/dist-types/components/menu/test/lion-menu.test.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +0 -13
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +0 -1
- package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts +0 -238
- package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts.map +0 -1
- package/dist-types/components/navigation-bar/src/types.d.ts +0 -85
- package/dist-types/components/navigation-bar/src/types.d.ts.map +0 -1
- package/dist-types/exports/define/lion-item.d.ts +0 -2
- package/dist-types/exports/define/lion-item.d.ts.map +0 -1
- package/dist-types/exports/define/lion-menu-overlay.d.ts +0 -2
- package/dist-types/exports/define/lion-menu-overlay.d.ts.map +0 -1
- package/dist-types/exports/define/lion-menu.d.ts +0 -2
- package/dist-types/exports/define/lion-menu.d.ts.map +0 -1
- package/dist-types/exports/define/lion-navigation-bar.d.ts +0 -2
- package/dist-types/exports/define/lion-navigation-bar.d.ts.map +0 -1
- package/dist-types/exports/define/lion-toolbar.d.ts +0 -2
- package/dist-types/exports/define/lion-toolbar.d.ts.map +0 -1
- package/dist-types/exports/define/lion-tree.d.ts +0 -2
- package/dist-types/exports/define/lion-tree.d.ts.map +0 -1
- package/dist-types/exports/menu.d.ts +0 -7
- package/dist-types/exports/menu.d.ts.map +0 -1
- package/dist-types/exports/navigation-bar.d.ts +0 -2
- package/dist-types/exports/navigation-bar.d.ts.map +0 -1
- package/docs/components/menu/api-table.md +0 -450
- package/docs/components/menu/applyMenuDemoStyles.js +0 -173
- package/docs/components/menu/extensions.md +0 -216
- package/docs/components/menu/index.md +0 -13
- package/docs/components/menu/overview.md +0 -422
- package/exports/define/lion-item.js +0 -3
- package/exports/define/lion-menu-overlay.js +0 -3
- package/exports/define/lion-menu.js +0 -3
- package/exports/define/lion-navigation-bar.js +0 -3
- package/exports/define/lion-toolbar.js +0 -3
- package/exports/define/lion-tree.js +0 -3
- package/exports/menu.js +0 -6
- package/exports/navigation-bar.js +0 -1
- package/menu.js +0 -6
- package/navigation-bar.js +0 -1
|
@@ -33,7 +33,10 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
33
33
|
class OverlayMixin extends superclass {
|
|
34
34
|
static get properties() {
|
|
35
35
|
return {
|
|
36
|
-
opened: {
|
|
36
|
+
opened: {
|
|
37
|
+
type: Boolean,
|
|
38
|
+
reflect: true,
|
|
39
|
+
},
|
|
37
40
|
};
|
|
38
41
|
}
|
|
39
42
|
|
|
@@ -59,17 +62,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
59
62
|
this.open = this.open.bind(this);
|
|
60
63
|
/** @type {EventListener} */
|
|
61
64
|
this.close = this.close.bind(this);
|
|
62
|
-
|
|
63
|
-
// // By default, we go for disclosure behavior
|
|
64
|
-
// // TODO: in the future, bring disclosure behavior to a controller (and therefore directive).
|
|
65
|
-
// // Take inspiration from VisibilityToggleCtrl of portal elements
|
|
66
|
-
// /**
|
|
67
|
-
// * Terminology aligned with https://open-ui.org/components/openable.explainer/
|
|
68
|
-
// * @type {'disclosure'|'overlay'}
|
|
69
|
-
// */
|
|
70
|
-
// this.openableMode = 'disclosure';
|
|
71
|
-
|
|
72
|
-
// allow hybrid disclosure/overlay components
|
|
73
65
|
}
|
|
74
66
|
|
|
75
67
|
get config() {
|
|
@@ -78,7 +70,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
78
70
|
|
|
79
71
|
/** @param {OverlayConfig} value */
|
|
80
72
|
set config(value) {
|
|
81
|
-
// TODO: built-in in overlayCtrl now... delete here
|
|
82
73
|
const shouldUpdate = !isEqualConfig(this.config, value);
|
|
83
74
|
|
|
84
75
|
if (this._overlayCtrl && shouldUpdate) {
|
|
@@ -170,8 +161,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
170
161
|
*/
|
|
171
162
|
// eslint-disable-next-line class-methods-use-this
|
|
172
163
|
_setupOpenCloseListeners() {
|
|
173
|
-
// Keeps the close-overlay event private for the controller.
|
|
174
|
-
// (we already have )
|
|
175
164
|
/**
|
|
176
165
|
* @param {{ stopPropagation: () => void; }} ev
|
|
177
166
|
*/
|
|
@@ -229,11 +218,11 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
229
218
|
// @ts-expect-error
|
|
230
219
|
static enabledWarnings = super.enabledWarnings?.filter(w => w !== 'change-in-update') || [];
|
|
231
220
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
221
|
+
get _overlayInvokerNode() {
|
|
222
|
+
return /** @type {HTMLElement | undefined} */ (
|
|
223
|
+
Array.from(this.children).find(child => child.slot === 'invoker')
|
|
224
|
+
);
|
|
225
|
+
}
|
|
237
226
|
|
|
238
227
|
/**
|
|
239
228
|
* @overridable
|
|
@@ -267,46 +256,13 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
267
256
|
);
|
|
268
257
|
}
|
|
269
258
|
|
|
270
|
-
/**
|
|
271
|
-
* @param {Element} focusableElOrWrapper
|
|
272
|
-
* @returns {Element|null}
|
|
273
|
-
*/
|
|
274
|
-
static _getFocusableInvokerEl(focusableElOrWrapper) {
|
|
275
|
-
// return focusableElOrWrapper;
|
|
276
|
-
return (
|
|
277
|
-
focusableElOrWrapper &&
|
|
278
|
-
(focusableElOrWrapper.hasAttribute('tabindex') || focusableElOrWrapper.tagName === 'BUTTON'
|
|
279
|
-
? focusableElOrWrapper
|
|
280
|
-
: focusableElOrWrapper.querySelector('[role=button], button'))
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
get _overlayInvokerNode() {
|
|
285
|
-
const ctor = /** @type {typeof OverlayMixin} */ (this.constructor);
|
|
286
|
-
if (!this.__invokerNode) {
|
|
287
|
-
const slottedNode = Array.from(this.children).find(child => child.slot === 'invoker');
|
|
288
|
-
if (slottedNode) {
|
|
289
|
-
this.__invokerNode = ctor._getFocusableInvokerEl(slottedNode);
|
|
290
|
-
} else {
|
|
291
|
-
// Look for preceeding sibling with [data-invoker] attribute, and try to find a focusable element in it (either itself or a child)
|
|
292
|
-
this.__invokerNode =
|
|
293
|
-
this.previousElementSibling?.hasAttribute('data-invoker') &&
|
|
294
|
-
ctor._getFocusableInvokerEl(this.previousElementSibling);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
return this.__invokerNode;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
259
|
/** @protected */
|
|
301
260
|
_setupOverlayCtrl() {
|
|
302
261
|
if (this.#hasSetup) return;
|
|
303
|
-
|
|
304
|
-
const invokerNode = this._overlayInvokerNode;
|
|
305
|
-
|
|
306
262
|
const config = {
|
|
307
263
|
contentNode: this._overlayContentNode,
|
|
308
264
|
contentWrapperNode: this._overlayContentWrapperNode,
|
|
309
|
-
invokerNode:
|
|
265
|
+
invokerNode: this._overlayInvokerNode,
|
|
310
266
|
referenceNode: this._overlayReferenceNode,
|
|
311
267
|
backdropNode: this._overlayBackdropNode,
|
|
312
268
|
};
|
|
@@ -326,8 +282,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
326
282
|
|
|
327
283
|
/** @protected */
|
|
328
284
|
_teardownOverlayCtrl() {
|
|
329
|
-
// Make sure that dynamic behavior (e.g. responsive) is possible by allowing multiple setups and teardowns of the overlay controller.
|
|
330
|
-
this.#hasSetup = false;
|
|
331
285
|
if (!this._overlayCtrl) return;
|
|
332
286
|
|
|
333
287
|
this._teardownOpenCloseListeners();
|
|
@@ -480,7 +434,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
480
434
|
for (const postProcessor of overlayMixinPostProcessors) {
|
|
481
435
|
postProcessor(OverlayMixin);
|
|
482
436
|
}
|
|
483
|
-
|
|
484
|
-
return OverlayMixin;
|
|
437
|
+
return /** @type {* & OverlayMixin} */ (OverlayMixin);
|
|
485
438
|
};
|
|
486
439
|
export const OverlayMixin = dedupeMixin(OverlayMixinImplementation);
|
|
@@ -209,9 +209,9 @@ export class OverlaysManager {
|
|
|
209
209
|
const newMarginBottom = this.__bodySizeVars.marginBottom + scrollbarHeight;
|
|
210
210
|
// @ts-expect-error [external]: CSS not yet typed
|
|
211
211
|
if (window.CSS?.number && document.body.attributeStyleMap?.set) {
|
|
212
|
-
// @ts-ignore
|
|
212
|
+
// @ts-ignore
|
|
213
213
|
document.body.attributeStyleMap.set('margin-right', CSS.px(newMarginRight));
|
|
214
|
-
// @ts-ignore
|
|
214
|
+
// @ts-ignore
|
|
215
215
|
document.body.attributeStyleMap.set('margin-bottom', CSS.px(newMarginBottom));
|
|
216
216
|
} else {
|
|
217
217
|
document.body.style.marginRight = `${newMarginRight}px`;
|
|
@@ -1,24 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @typedef {import('../../types/OverlayConfig.js').OverlayConfig} OverlayConfig
|
|
5
|
-
*/
|
|
1
|
+
import { withPopoverConfig } from './withPopoverConfig.js';
|
|
6
2
|
|
|
7
3
|
export const withDropdownConfig = () =>
|
|
8
|
-
|
|
9
|
-
placementMode: 'local',
|
|
10
|
-
inheritsReferenceWidth: 'min',
|
|
11
|
-
hidesOnOutsideClick: true,
|
|
12
|
-
hidesOnEsc: true,
|
|
13
|
-
popperConfig: {
|
|
14
|
-
placement: 'bottom-start',
|
|
15
|
-
modifiers: [
|
|
16
|
-
{
|
|
17
|
-
name: 'offset',
|
|
18
|
-
enabled: false,
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
},
|
|
22
|
-
handlesAccessibility: true,
|
|
23
|
-
...withClickInteraction(),
|
|
24
|
-
});
|
|
4
|
+
withPopoverConfig({ horizontalFallback: false, placement: 'bottom-start' });
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { withClickInteraction } from './visibility-trigger-partials/withClickInteraction.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {import('../../types/OverlayConfig.js').OverlayConfig} OverlayConfig
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const withPopoverConfig = ({ horizontalFallback = true, placement = 'auto' } = {}) =>
|
|
8
|
+
/** @type {OverlayConfig} */ ({
|
|
9
|
+
placementMode: 'local',
|
|
10
|
+
inheritsReferenceWidth: 'min',
|
|
11
|
+
hidesOnOutsideClick: true,
|
|
12
|
+
hidesOnEsc: true,
|
|
13
|
+
popperConfig: {
|
|
14
|
+
placement,
|
|
15
|
+
modifiers: [
|
|
16
|
+
{
|
|
17
|
+
name: 'offset',
|
|
18
|
+
enabled: false,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'flip',
|
|
22
|
+
options: {
|
|
23
|
+
fallbackPlacements: horizontalFallback
|
|
24
|
+
? ['bottom', 'top', 'right', 'left']
|
|
25
|
+
: ['bottom', 'top'],
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
handlesAccessibility: true,
|
|
31
|
+
...withClickInteraction(),
|
|
32
|
+
});
|
|
@@ -56,8 +56,7 @@ function adoptStyleWhenAdoptedStylesheetsNotSupported(
|
|
|
56
56
|
const styleEl = document.createElement('style');
|
|
57
57
|
// keep notation, so it's not renamed in minification/build
|
|
58
58
|
// eslint-disable-next-line dot-notation
|
|
59
|
-
|
|
60
|
-
const nonce = window.litNonce;
|
|
59
|
+
const nonce = window['litNonce'];
|
|
61
60
|
if (nonce !== undefined) {
|
|
62
61
|
styleEl.setAttribute('nonce', nonce);
|
|
63
62
|
}
|
|
@@ -8,7 +8,6 @@ import { isVisible } from './is-visible.js';
|
|
|
8
8
|
import { sortByTabIndex } from './sort-by-tabindex.js';
|
|
9
9
|
|
|
10
10
|
// IE11 supports matches as 'msMatchesSelector'
|
|
11
|
-
/** @type {'matches' | 'msMatchesSelector'} */
|
|
12
11
|
const matchesFunc = 'matches' in Element.prototype ? 'matches' : 'msMatchesSelector';
|
|
13
12
|
|
|
14
13
|
/**
|
|
@@ -17,14 +16,11 @@ const matchesFunc = 'matches' in Element.prototype ? 'matches' : 'msMatchesSelec
|
|
|
17
16
|
*/
|
|
18
17
|
function isFocusable(element) {
|
|
19
18
|
// Elements that cannot be focused if they have [disabled] attribute.
|
|
20
|
-
// @ts-ignore - msMatchesSelector is legacy
|
|
21
19
|
if (element[matchesFunc]('input, select, textarea, button, object')) {
|
|
22
|
-
// @ts-ignore
|
|
23
20
|
return element[matchesFunc](':not([disabled])');
|
|
24
21
|
}
|
|
25
22
|
|
|
26
23
|
// Elements that can be focused even if they have [disabled] attribute.
|
|
27
|
-
// @ts-ignore
|
|
28
24
|
return element[matchesFunc]('a[href], area[href], iframe, [tabindex], [contentEditable]');
|
|
29
25
|
}
|
|
30
26
|
|
|
@@ -12,17 +12,13 @@
|
|
|
12
12
|
*/
|
|
13
13
|
export function isEqualConfig(a, b) {
|
|
14
14
|
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
|
|
15
|
-
if (typeof a === 'function' && typeof b === 'function') {
|
|
16
|
-
return /** @type {Function} */ (a).toString() === /** @type {Function} */ (b).toString();
|
|
17
|
-
}
|
|
18
15
|
return a === b;
|
|
19
16
|
}
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
const aProps = Object.keys(a);
|
|
18
|
+
const bProps = Object.keys(b);
|
|
19
|
+
if (aProps.length !== bProps.length) {
|
|
20
|
+
return false;
|
|
22
21
|
}
|
|
23
|
-
|
|
24
|
-
return
|
|
25
|
-
// @ts-ignore - dynamic property access
|
|
26
|
-
isEqualConfig(a[prop], b[prop], prop),
|
|
27
|
-
);
|
|
22
|
+
const isEqual = /** @param {string} prop */ prop => isEqualConfig(a[prop], b[prop]);
|
|
23
|
+
return aProps.every(isEqual);
|
|
28
24
|
}
|
|
@@ -283,9 +283,8 @@ describe('OverlayController', () => {
|
|
|
283
283
|
contentNode,
|
|
284
284
|
});
|
|
285
285
|
};
|
|
286
|
-
|
|
287
286
|
expect(createOverlayController).to.throw(
|
|
288
|
-
'[OverlayController] Could not find a render target,
|
|
287
|
+
'[OverlayController] Could not find a render target, since the provided contentNode is not connected to the DOM. Make sure that it is connected, e.g. by doing "document.body.appendChild(contentNode)", before passing it on.',
|
|
289
288
|
);
|
|
290
289
|
});
|
|
291
290
|
|
|
@@ -404,7 +403,7 @@ describe('OverlayController', () => {
|
|
|
404
403
|
{ ignoreAttributes: ['closedby'] },
|
|
405
404
|
);
|
|
406
405
|
|
|
407
|
-
expect(el).lightDom.to.equal(`<div
|
|
406
|
+
expect(el).lightDom.to.equal(`<div slot="content">projected</div>`);
|
|
408
407
|
});
|
|
409
408
|
});
|
|
410
409
|
|
|
@@ -426,7 +425,7 @@ describe('OverlayController', () => {
|
|
|
426
425
|
`
|
|
427
426
|
<dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
|
|
428
427
|
<div data-id="content-wrapper">
|
|
429
|
-
<div
|
|
428
|
+
<div id="content">non projected</div>
|
|
430
429
|
</div>
|
|
431
430
|
</dialog>
|
|
432
431
|
`,
|
|
@@ -2293,7 +2292,6 @@ describe('OverlayController', () => {
|
|
|
2293
2292
|
});
|
|
2294
2293
|
|
|
2295
2294
|
it('should run with scroll prevention', async () => {
|
|
2296
|
-
await overlayControllerPreventsScroll.hide();
|
|
2297
2295
|
await overlayControllerPreventsScroll.show();
|
|
2298
2296
|
|
|
2299
2297
|
expect(
|
|
@@ -48,7 +48,7 @@ describe('isEqualConfig()', () => {
|
|
|
48
48
|
expect(isEqualConfig({ ...config, isBlocking: true }, config)).eql(false);
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
it
|
|
51
|
+
it('regards missing props different from ones with undefined value', () => {
|
|
52
52
|
const config = TestConfig();
|
|
53
53
|
expect(isEqualConfig(config, { ...config, referenceNode: undefined })).eql(false);
|
|
54
54
|
});
|
|
@@ -537,13 +537,13 @@ export function runOverlayMixinSuite({ tagString, tag, suffix = '' }) {
|
|
|
537
537
|
it('works with cache directive when reconnected', async () => {
|
|
538
538
|
class CachingContext extends LitElement {
|
|
539
539
|
static properties = {
|
|
540
|
-
|
|
540
|
+
switched: { type: Boolean },
|
|
541
541
|
};
|
|
542
542
|
|
|
543
543
|
constructor() {
|
|
544
544
|
super();
|
|
545
545
|
|
|
546
|
-
this.
|
|
546
|
+
this.switched = false;
|
|
547
547
|
}
|
|
548
548
|
|
|
549
549
|
get overlayEl() {
|
|
@@ -552,12 +552,12 @@ export function runOverlayMixinSuite({ tagString, tag, suffix = '' }) {
|
|
|
552
552
|
|
|
553
553
|
render() {
|
|
554
554
|
return html`${cache(
|
|
555
|
-
this.
|
|
556
|
-
? html
|
|
555
|
+
this.switched
|
|
556
|
+
? html`something else`
|
|
557
|
+
: html`<${tag} id="myOverlay">
|
|
557
558
|
<div slot="content">content b</div>
|
|
558
559
|
<button slot="invoker">invoker button b</button>
|
|
559
|
-
</${tag}
|
|
560
|
-
: html`something else`,
|
|
560
|
+
</${tag}>`,
|
|
561
561
|
)}`;
|
|
562
562
|
}
|
|
563
563
|
}
|
|
@@ -578,7 +578,7 @@ export function runOverlayMixinSuite({ tagString, tag, suffix = '' }) {
|
|
|
578
578
|
// @ts-expect-error [allow-protected] in tests
|
|
579
579
|
const setupSpy = sinon.spy(el.overlayEl, '_setupOverlayCtrl');
|
|
580
580
|
|
|
581
|
-
el.
|
|
581
|
+
el.switched = true;
|
|
582
582
|
// render the new content
|
|
583
583
|
await el.updateComplete;
|
|
584
584
|
// wait for the teardown to complete
|
|
@@ -588,7 +588,7 @@ export function runOverlayMixinSuite({ tagString, tag, suffix = '' }) {
|
|
|
588
588
|
expect(teardownSpy.callCount).to.equal(1);
|
|
589
589
|
expect(setupSpy.callCount).to.equal(0);
|
|
590
590
|
|
|
591
|
-
el.
|
|
591
|
+
el.switched = false;
|
|
592
592
|
await el.updateComplete;
|
|
593
593
|
expect(setupSpy.callCount).to.equal(1);
|
|
594
594
|
|
|
@@ -21,6 +21,7 @@ export type OverlayPhase =
|
|
|
21
21
|
| 'add'
|
|
22
22
|
| 'remove';
|
|
23
23
|
|
|
24
|
+
|
|
24
25
|
export interface ViewportConfig {
|
|
25
26
|
placement: ViewportPlacement;
|
|
26
27
|
}
|
|
@@ -96,26 +97,14 @@ export interface OverlayConfig {
|
|
|
96
97
|
/** By default, the tooltip content is a 'description' for the invoker (uses aria-describedby) Setting this property to 'label' makes the content function as a label (via aria-labelledby) */
|
|
97
98
|
invokerRelation?: 'label' | 'description';
|
|
98
99
|
|
|
100
|
+
/** render a div instead of dialog */
|
|
101
|
+
_noDialogEl?: Boolean;
|
|
102
|
+
|
|
99
103
|
/**
|
|
100
104
|
* Determines the conditions hiding/showing should be based on. It gets the OverlayController as input and returns an object with
|
|
101
105
|
* functions with Overlay phases as keys
|
|
102
106
|
*/
|
|
103
107
|
visibilityTriggerFunction?: Function;
|
|
108
|
+
}
|
|
104
109
|
|
|
105
|
-
/**
|
|
106
|
-
* Whether the overlay content should receive focus when shown.
|
|
107
|
-
*/
|
|
108
|
-
focusContentOnOpen?: boolean;
|
|
109
|
-
|
|
110
|
-
/*
|
|
111
|
-
* By default, we function either as overlay or disclosure. In some cases, this should be dynamically set (think of responsive changes).
|
|
112
|
-
* or it depends on the context (a top level menu is not openable (unless it's a context menu), its children menus are).
|
|
113
|
-
*/
|
|
114
|
-
isOpenable?: boolean;
|
|
115
110
|
|
|
116
|
-
/**
|
|
117
|
-
* By default, an error is thrown when contentNode is not connected to the DOM.
|
|
118
|
-
* This allows to prepare nodes and later connect them to dom.
|
|
119
|
-
*/
|
|
120
|
-
requireConnectedNodes?: boolean;
|
|
121
|
-
}
|
|
@@ -832,7 +832,6 @@ describe('lion-select-rich', () => {
|
|
|
832
832
|
await waitUntil(isSelectRichRendered);
|
|
833
833
|
getInvoker()?.click();
|
|
834
834
|
await waitUntil(isDialogVisible);
|
|
835
|
-
// @ts-ignore - NodeList array access
|
|
836
835
|
const optionBlue = /** @type { HTMLElement | undefined } */ (
|
|
837
836
|
wrapperElementShadowRoot?.querySelectorAll('lion-option')
|
|
838
837
|
)?.[1];
|
|
@@ -956,7 +955,6 @@ describe('lion-select-rich', () => {
|
|
|
956
955
|
await waitUntil(isSelectRichRendered);
|
|
957
956
|
getInvoker()?.click();
|
|
958
957
|
await waitUntil(isDialogVisible);
|
|
959
|
-
// @ts-ignore - NodeList array access
|
|
960
958
|
const optionBlue = /** @type { HTMLElement | undefined } */ (
|
|
961
959
|
wrapperElementShadowRoot?.querySelectorAll('lion-option')
|
|
962
960
|
)?.[1];
|
|
@@ -1084,7 +1082,6 @@ describe('lion-select-rich', () => {
|
|
|
1084
1082
|
await waitUntil(isSelectRichRendered);
|
|
1085
1083
|
getInvoker()?.click();
|
|
1086
1084
|
await waitUntil(isDialogVisible);
|
|
1087
|
-
// @ts-ignore - NodeList array access
|
|
1088
1085
|
const optionBlue = /** @type { HTMLElement | undefined } */ (
|
|
1089
1086
|
wrapperElementShadowRoot?.querySelectorAll('lion-option')
|
|
1090
1087
|
)?.[1];
|