@vaadin/context-menu 24.3.0-beta1 → 24.3.0-beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -11
- package/src/vaadin-context-menu-mixin.js +64 -10
- package/src/vaadin-context-menu.js +13 -11
- package/src/vaadin-contextmenu-items-mixin.js +6 -6
- package/web-types.json +2 -2
- package/web-types.lit.json +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vaadin/context-menu",
|
|
3
|
-
"version": "24.3.0-
|
|
3
|
+
"version": "24.3.0-beta2",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -39,15 +39,15 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@open-wc/dedupe-mixin": "^1.3.0",
|
|
41
41
|
"@polymer/polymer": "^3.0.0",
|
|
42
|
-
"@vaadin/a11y-base": "24.3.0-
|
|
43
|
-
"@vaadin/component-base": "24.3.0-
|
|
44
|
-
"@vaadin/item": "24.3.0-
|
|
45
|
-
"@vaadin/list-box": "24.3.0-
|
|
46
|
-
"@vaadin/lit-renderer": "24.3.0-
|
|
47
|
-
"@vaadin/overlay": "24.3.0-
|
|
48
|
-
"@vaadin/vaadin-lumo-styles": "24.3.0-
|
|
49
|
-
"@vaadin/vaadin-material-styles": "24.3.0-
|
|
50
|
-
"@vaadin/vaadin-themable-mixin": "24.3.0-
|
|
42
|
+
"@vaadin/a11y-base": "24.3.0-beta2",
|
|
43
|
+
"@vaadin/component-base": "24.3.0-beta2",
|
|
44
|
+
"@vaadin/item": "24.3.0-beta2",
|
|
45
|
+
"@vaadin/list-box": "24.3.0-beta2",
|
|
46
|
+
"@vaadin/lit-renderer": "24.3.0-beta2",
|
|
47
|
+
"@vaadin/overlay": "24.3.0-beta2",
|
|
48
|
+
"@vaadin/vaadin-lumo-styles": "24.3.0-beta2",
|
|
49
|
+
"@vaadin/vaadin-material-styles": "24.3.0-beta2",
|
|
50
|
+
"@vaadin/vaadin-themable-mixin": "24.3.0-beta2"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@esm-bundle/chai": "^4.3.4",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"web-types.json",
|
|
60
60
|
"web-types.lit.json"
|
|
61
61
|
],
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "0bbfb24cb8dcd6e1dca8ecf2269635efac53e4d0"
|
|
63
63
|
}
|
|
@@ -126,11 +126,18 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
126
126
|
'_targetOrOpenOnChanged(listenOn, openOn)',
|
|
127
127
|
'_rendererChanged(renderer, items)',
|
|
128
128
|
'_touchOrWideChanged(_touch, _wide)',
|
|
129
|
+
'_overlayContextChanged(_overlayElement, _context)',
|
|
130
|
+
'_overlayModelessChanged(_overlayElement, _modeless)',
|
|
131
|
+
'_overlayPhoneChanged(_overlayElement, _phone)',
|
|
132
|
+
'_overlayThemeChanged(_overlayElement, _theme)',
|
|
129
133
|
];
|
|
130
134
|
}
|
|
131
135
|
|
|
132
136
|
constructor() {
|
|
133
137
|
super();
|
|
138
|
+
|
|
139
|
+
this._createOverlay();
|
|
140
|
+
|
|
134
141
|
this._boundOpen = this.open.bind(this);
|
|
135
142
|
this._boundClose = this.close.bind(this);
|
|
136
143
|
this._boundPreventDefault = this._preventDefault.bind(this);
|
|
@@ -165,9 +172,6 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
165
172
|
ready() {
|
|
166
173
|
super.ready();
|
|
167
174
|
|
|
168
|
-
this._overlayElement = this.$.overlay;
|
|
169
|
-
this._overlayElement.owner = this;
|
|
170
|
-
|
|
171
175
|
this.addController(
|
|
172
176
|
new MediaQueryController(this._wideMediaQuery, (matches) => {
|
|
173
177
|
this._wide = matches;
|
|
@@ -175,6 +179,23 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
175
179
|
);
|
|
176
180
|
}
|
|
177
181
|
|
|
182
|
+
/** @private */
|
|
183
|
+
_createOverlay() {
|
|
184
|
+
// Create an overlay in the constructor to use in observers before `ready()`
|
|
185
|
+
const overlay = document.createElement(`${this._tagNamePrefix}-overlay`);
|
|
186
|
+
overlay.owner = this;
|
|
187
|
+
|
|
188
|
+
overlay.addEventListener('opened-changed', (e) => {
|
|
189
|
+
this._onOverlayOpened(e);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
overlay.addEventListener('vaadin-overlay-open', (e) => {
|
|
193
|
+
this._onVaadinOverlayOpen(e);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
this._overlayElement = overlay;
|
|
197
|
+
}
|
|
198
|
+
|
|
178
199
|
/**
|
|
179
200
|
* Runs before overlay is fully rendered
|
|
180
201
|
* @private
|
|
@@ -190,10 +211,43 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
190
211
|
*/
|
|
191
212
|
_onVaadinOverlayOpen() {
|
|
192
213
|
this.__alignOverlayPosition();
|
|
193
|
-
this
|
|
214
|
+
this._overlayElement.style.opacity = '';
|
|
194
215
|
this.__forwardFocus();
|
|
195
216
|
}
|
|
196
217
|
|
|
218
|
+
/** @private */
|
|
219
|
+
_overlayContextChanged(overlay, context) {
|
|
220
|
+
if (overlay) {
|
|
221
|
+
overlay.model = context;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** @private */
|
|
226
|
+
_overlayModelessChanged(overlay, modeless) {
|
|
227
|
+
if (overlay) {
|
|
228
|
+
overlay.modeless = modeless;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** @private */
|
|
233
|
+
_overlayPhoneChanged(overlay, phone) {
|
|
234
|
+
if (overlay) {
|
|
235
|
+
overlay.toggleAttribute('phone', phone);
|
|
236
|
+
overlay.withBackdrop = phone;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** @private */
|
|
241
|
+
_overlayThemeChanged(overlay, theme) {
|
|
242
|
+
if (overlay) {
|
|
243
|
+
if (theme) {
|
|
244
|
+
overlay.setAttribute('theme', theme);
|
|
245
|
+
} else {
|
|
246
|
+
overlay.removeAttribute('theme');
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
197
251
|
/** @private */
|
|
198
252
|
_targetOrOpenOnChanged(listenOn, openOn) {
|
|
199
253
|
if (this._oldListenOn && this._oldOpenOn) {
|
|
@@ -238,7 +292,7 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
238
292
|
// Outside click event from overlay
|
|
239
293
|
const evtOverlay = 'vaadin-overlay-outside-click';
|
|
240
294
|
|
|
241
|
-
const overlay = this
|
|
295
|
+
const overlay = this._overlayElement;
|
|
242
296
|
|
|
243
297
|
if (oldCloseOn) {
|
|
244
298
|
this._unlisten(overlay, oldCloseOn, this._boundClose);
|
|
@@ -267,7 +321,7 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
267
321
|
}
|
|
268
322
|
|
|
269
323
|
// Has to be set after instance has been created
|
|
270
|
-
this
|
|
324
|
+
this._overlayElement.opened = opened;
|
|
271
325
|
}
|
|
272
326
|
|
|
273
327
|
/**
|
|
@@ -298,7 +352,7 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
298
352
|
renderer = this.__itemsRenderer;
|
|
299
353
|
}
|
|
300
354
|
|
|
301
|
-
this
|
|
355
|
+
this._overlayElement.renderer = renderer;
|
|
302
356
|
}
|
|
303
357
|
|
|
304
358
|
/**
|
|
@@ -342,7 +396,7 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
342
396
|
this.__y = this._getEventCoordinate(e, 'y');
|
|
343
397
|
this.__pageYOffset = window.pageYOffset;
|
|
344
398
|
|
|
345
|
-
this
|
|
399
|
+
this._overlayElement.style.opacity = '0';
|
|
346
400
|
this._setOpened(true);
|
|
347
401
|
}
|
|
348
402
|
}
|
|
@@ -369,7 +423,7 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
369
423
|
|
|
370
424
|
/** @private */
|
|
371
425
|
__adjustPosition(coord, diff) {
|
|
372
|
-
const overlay = this
|
|
426
|
+
const overlay = this._overlayElement;
|
|
373
427
|
const style = overlay.style;
|
|
374
428
|
|
|
375
429
|
style[coord] = `${(parseInt(style[coord]) || 0) + diff}px`;
|
|
@@ -377,7 +431,7 @@ export const ContextMenuMixin = (superClass) =>
|
|
|
377
431
|
|
|
378
432
|
/** @private */
|
|
379
433
|
__alignOverlayPosition() {
|
|
380
|
-
const overlay = this
|
|
434
|
+
const overlay = this._overlayElement;
|
|
381
435
|
|
|
382
436
|
if (overlay.positionTarget) {
|
|
383
437
|
// The overlay is positioned relative to another node, for example, a
|
|
@@ -222,17 +222,6 @@ class ContextMenu extends ContextMenuMixin(
|
|
|
222
222
|
</style>
|
|
223
223
|
|
|
224
224
|
<slot id="slot"></slot>
|
|
225
|
-
|
|
226
|
-
<vaadin-context-menu-overlay
|
|
227
|
-
id="overlay"
|
|
228
|
-
on-opened-changed="_onOverlayOpened"
|
|
229
|
-
on-vaadin-overlay-open="_onVaadinOverlayOpen"
|
|
230
|
-
modeless="[[_modeless]]"
|
|
231
|
-
with-backdrop="[[_phone]]"
|
|
232
|
-
phone$="[[_phone]]"
|
|
233
|
-
model="[[_context]]"
|
|
234
|
-
theme$="[[_theme]]"
|
|
235
|
-
></vaadin-context-menu-overlay>
|
|
236
225
|
`;
|
|
237
226
|
}
|
|
238
227
|
|
|
@@ -247,6 +236,19 @@ class ContextMenu extends ContextMenuMixin(
|
|
|
247
236
|
processTemplates(this);
|
|
248
237
|
}
|
|
249
238
|
|
|
239
|
+
/**
|
|
240
|
+
* @param {DocumentFragment} dom
|
|
241
|
+
* @return {null}
|
|
242
|
+
* @protected
|
|
243
|
+
* @override
|
|
244
|
+
*/
|
|
245
|
+
_attachDom(dom) {
|
|
246
|
+
const root = this.attachShadow({ mode: 'open' });
|
|
247
|
+
root.appendChild(dom);
|
|
248
|
+
root.appendChild(this._overlayElement);
|
|
249
|
+
return root;
|
|
250
|
+
}
|
|
251
|
+
|
|
250
252
|
/**
|
|
251
253
|
* Fired when an item is selected when the context menu is populated using the `items` API.
|
|
252
254
|
*
|
|
@@ -110,7 +110,7 @@ export const ItemsMixin = (superClass) =>
|
|
|
110
110
|
|
|
111
111
|
/** @protected */
|
|
112
112
|
__forwardFocus() {
|
|
113
|
-
const overlay = this
|
|
113
|
+
const overlay = this._overlayElement;
|
|
114
114
|
const child = overlay.getFirstChild();
|
|
115
115
|
// If parent item is not focused, do not focus submenu
|
|
116
116
|
if (overlay.parentOverlay) {
|
|
@@ -131,9 +131,9 @@ export const ItemsMixin = (superClass) =>
|
|
|
131
131
|
subMenu.listenOn = itemElement;
|
|
132
132
|
subMenu.overlayClass = overlayClass;
|
|
133
133
|
|
|
134
|
-
const parent = this
|
|
134
|
+
const parent = this._overlayElement;
|
|
135
135
|
|
|
136
|
-
const subMenuOverlay = subMenu
|
|
136
|
+
const subMenuOverlay = subMenu._overlayElement;
|
|
137
137
|
subMenuOverlay.positionTarget = itemElement;
|
|
138
138
|
subMenuOverlay.noHorizontalOverlap = true;
|
|
139
139
|
// Store the reference parent overlay
|
|
@@ -146,7 +146,7 @@ export const ItemsMixin = (superClass) =>
|
|
|
146
146
|
subMenu.removeAttribute('theme');
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
-
const content =
|
|
149
|
+
const content = subMenuOverlay.$.content;
|
|
150
150
|
content.style.minWidth = '';
|
|
151
151
|
|
|
152
152
|
itemElement.dispatchEvent(
|
|
@@ -233,7 +233,7 @@ export const ItemsMixin = (superClass) =>
|
|
|
233
233
|
|
|
234
234
|
/** @private */
|
|
235
235
|
__initOverlay() {
|
|
236
|
-
const overlay = this
|
|
236
|
+
const overlay = this._overlayElement;
|
|
237
237
|
|
|
238
238
|
overlay.$.backdrop.addEventListener('click', () => {
|
|
239
239
|
this.close();
|
|
@@ -342,7 +342,7 @@ export const ItemsMixin = (superClass) =>
|
|
|
342
342
|
}
|
|
343
343
|
|
|
344
344
|
// Don't open sub-menus while the menu is still opening
|
|
345
|
-
if (this
|
|
345
|
+
if (this._overlayElement.hasAttribute('opening')) {
|
|
346
346
|
requestAnimationFrame(() => {
|
|
347
347
|
this.__showSubMenu(event, item);
|
|
348
348
|
});
|
package/web-types.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/web-types",
|
|
3
3
|
"name": "@vaadin/context-menu",
|
|
4
|
-
"version": "24.3.0-
|
|
4
|
+
"version": "24.3.0-beta2",
|
|
5
5
|
"description-markup": "markdown",
|
|
6
6
|
"contributions": {
|
|
7
7
|
"html": {
|
|
8
8
|
"elements": [
|
|
9
9
|
{
|
|
10
10
|
"name": "vaadin-context-menu",
|
|
11
|
-
"description": "`<vaadin-context-menu>` is a Web Component for creating context menus.\n\n### Items\n\nItems is a higher level convenience API for defining a (hierarchical) menu structure for the component.\nIf a menu item has a non-empty `children` set, a sub-menu with the child items is opened\nnext to the parent menu on mouseover, tap or a right arrow keypress.\n\nWhen an item is selected, `<vaadin-context-menu>` dispatches an \"item-selected\" event\nwith the selected item as `event.detail.value` property.\nIf item does not have `keepOpen` property the menu will be closed.\n\n```javascript\ncontextMenu.items = [\n { text: 'Menu Item 1', theme: 'primary', className: 'first', children:\n [\n { text: 'Menu Item 1-1', checked: true, keepOpen: true },\n { text: 'Menu Item 1-2' }\n ]\n },\n { component: 'hr' },\n { text: 'Menu Item 2', children:\n [\n { text: 'Menu Item 2-1' },\n { text: 'Menu Item 2-2', disabled: true }\n ]\n },\n { text: 'Menu Item 3', disabled: true, className: 'last' }\n];\n\ncontextMenu.addEventListener('item-selected', e => {\n const item = e.detail.value;\n console.log(`${item.text} selected`);\n});\n```\n\n**NOTE:** when the `items` array is defined, the renderer cannot be used.\n\n### Rendering\n\nThe content of the menu can be populated by using the renderer callback function.\n\nThe renderer function provides `root`, `contextMenu`, `model` arguments when applicable.\nGenerate DOM content by using `model` object properties if needed, append it to the `root`\nelement and control the state of the host element by accessing `contextMenu`. Before generating\nnew content, the renderer function should check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-context-menu id=\"contextMenu\">\n <p>This paragraph has a context menu.</p>\n</vaadin-context-menu>\n```\n```js\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.renderer = (root, contextMenu, context) => {\n let listBox = root.firstElementChild;\n if (!listBox) {\n listBox = document.createElement('vaadin-list-box');\n root.appendChild(listBox);\n }\n\n let item = listBox.querySelector('vaadin-item');\n if (!item) {\n item = document.createElement('vaadin-item');\n listBox.appendChild(item);\n }\n item.textContent = 'Content of the selector: ' + context.target.textContent;\n};\n```\n\nYou can access the menu context inside the renderer using\n`context.target` and `context.detail`.\n\nRenderer is called on the opening of the context-menu and each time the related context is updated.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### `vaadin-contextmenu` Gesture Event\n\n`vaadin-contextmenu` is a gesture event (a custom event),\nwhich is dispatched after either `contextmenu` or long touch events.\nThis enables support for both mouse and touch environments in a uniform way.\n\n`<vaadin-context-menu>` opens the menu overlay on the `vaadin-contextmenu`\nevent by default.\n\n### Menu Listener\n\nBy default, the `<vaadin-context-menu>` element listens for the menu opening\nevent on itself. In case if you do not want to wrap the target, you can listen for\nevents on an element outside the `<vaadin-context-menu>` by setting the\n`listenOn` property:\n\n```html\n<vaadin-context-menu id=\"contextMenu\"></vaadin-context-menu>\n\n<div id=\"menuListener\">The element that listens for the contextmenu event.</div>\n```\n```javascript\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.listenOn = document.querySelector('#menuListener');\n```\n\n### Filtering Menu Targets\n\nBy default, the listener element and all its descendants open the context\nmenu. You can filter the menu targets to a smaller set of elements inside\nthe listener element by setting the `selector` property.\n\nIn the following example, only the elements matching `.has-menu` will open the context menu:\n\n```html\n<vaadin-context-menu selector=\".has-menu\">\n <p class=\"has-menu\">This paragraph opens the context menu</p>\n <p>This paragraph does not open the context menu</p>\n</vaadin-context-menu>\n```\n\n### Menu Context\n\nThe following properties are available in the `context` argument:\n\n- `target` is the menu opening event target, which is the element that\nthe user has called the context menu for\n- `detail` is the menu opening event detail\n\nIn the following example, the menu item text is composed with the contents\nof the element that opened the menu:\n\n```html\n<vaadin-context-menu selector=\"li\" id=\"contextMenu\">\n <ul>\n <li>Foo</li>\n <li>Bar</li>\n <li>Baz</li>\n </ul>\n</vaadin-context-menu>\n```\n```js\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.renderer = (root, contextMenu, context) => {\n let listBox = root.firstElementChild;\n if (!listBox) {\n listBox = document.createElement('vaadin-list-box');\n root.appendChild(listBox);\n }\n\n let item = listBox.querySelector('vaadin-item');\n if (!item) {\n item = document.createElement('vaadin-item');\n listBox.appendChild(item);\n }\n item.textContent = 'The menu target: ' + context.target.textContent;\n};\n```\n\n### Styling\n\n`<vaadin-context-menu>` uses `<vaadin-context-menu-overlay>` internal\nthemable component as the actual visible context menu overlay.\n\nSee [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-
|
|
11
|
+
"description": "`<vaadin-context-menu>` is a Web Component for creating context menus.\n\n### Items\n\nItems is a higher level convenience API for defining a (hierarchical) menu structure for the component.\nIf a menu item has a non-empty `children` set, a sub-menu with the child items is opened\nnext to the parent menu on mouseover, tap or a right arrow keypress.\n\nWhen an item is selected, `<vaadin-context-menu>` dispatches an \"item-selected\" event\nwith the selected item as `event.detail.value` property.\nIf item does not have `keepOpen` property the menu will be closed.\n\n```javascript\ncontextMenu.items = [\n { text: 'Menu Item 1', theme: 'primary', className: 'first', children:\n [\n { text: 'Menu Item 1-1', checked: true, keepOpen: true },\n { text: 'Menu Item 1-2' }\n ]\n },\n { component: 'hr' },\n { text: 'Menu Item 2', children:\n [\n { text: 'Menu Item 2-1' },\n { text: 'Menu Item 2-2', disabled: true }\n ]\n },\n { text: 'Menu Item 3', disabled: true, className: 'last' }\n];\n\ncontextMenu.addEventListener('item-selected', e => {\n const item = e.detail.value;\n console.log(`${item.text} selected`);\n});\n```\n\n**NOTE:** when the `items` array is defined, the renderer cannot be used.\n\n### Rendering\n\nThe content of the menu can be populated by using the renderer callback function.\n\nThe renderer function provides `root`, `contextMenu`, `model` arguments when applicable.\nGenerate DOM content by using `model` object properties if needed, append it to the `root`\nelement and control the state of the host element by accessing `contextMenu`. Before generating\nnew content, the renderer function should check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-context-menu id=\"contextMenu\">\n <p>This paragraph has a context menu.</p>\n</vaadin-context-menu>\n```\n```js\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.renderer = (root, contextMenu, context) => {\n let listBox = root.firstElementChild;\n if (!listBox) {\n listBox = document.createElement('vaadin-list-box');\n root.appendChild(listBox);\n }\n\n let item = listBox.querySelector('vaadin-item');\n if (!item) {\n item = document.createElement('vaadin-item');\n listBox.appendChild(item);\n }\n item.textContent = 'Content of the selector: ' + context.target.textContent;\n};\n```\n\nYou can access the menu context inside the renderer using\n`context.target` and `context.detail`.\n\nRenderer is called on the opening of the context-menu and each time the related context is updated.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### `vaadin-contextmenu` Gesture Event\n\n`vaadin-contextmenu` is a gesture event (a custom event),\nwhich is dispatched after either `contextmenu` or long touch events.\nThis enables support for both mouse and touch environments in a uniform way.\n\n`<vaadin-context-menu>` opens the menu overlay on the `vaadin-contextmenu`\nevent by default.\n\n### Menu Listener\n\nBy default, the `<vaadin-context-menu>` element listens for the menu opening\nevent on itself. In case if you do not want to wrap the target, you can listen for\nevents on an element outside the `<vaadin-context-menu>` by setting the\n`listenOn` property:\n\n```html\n<vaadin-context-menu id=\"contextMenu\"></vaadin-context-menu>\n\n<div id=\"menuListener\">The element that listens for the contextmenu event.</div>\n```\n```javascript\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.listenOn = document.querySelector('#menuListener');\n```\n\n### Filtering Menu Targets\n\nBy default, the listener element and all its descendants open the context\nmenu. You can filter the menu targets to a smaller set of elements inside\nthe listener element by setting the `selector` property.\n\nIn the following example, only the elements matching `.has-menu` will open the context menu:\n\n```html\n<vaadin-context-menu selector=\".has-menu\">\n <p class=\"has-menu\">This paragraph opens the context menu</p>\n <p>This paragraph does not open the context menu</p>\n</vaadin-context-menu>\n```\n\n### Menu Context\n\nThe following properties are available in the `context` argument:\n\n- `target` is the menu opening event target, which is the element that\nthe user has called the context menu for\n- `detail` is the menu opening event detail\n\nIn the following example, the menu item text is composed with the contents\nof the element that opened the menu:\n\n```html\n<vaadin-context-menu selector=\"li\" id=\"contextMenu\">\n <ul>\n <li>Foo</li>\n <li>Bar</li>\n <li>Baz</li>\n </ul>\n</vaadin-context-menu>\n```\n```js\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.renderer = (root, contextMenu, context) => {\n let listBox = root.firstElementChild;\n if (!listBox) {\n listBox = document.createElement('vaadin-list-box');\n root.appendChild(listBox);\n }\n\n let item = listBox.querySelector('vaadin-item');\n if (!item) {\n item = document.createElement('vaadin-item');\n listBox.appendChild(item);\n }\n item.textContent = 'The menu target: ' + context.target.textContent;\n};\n```\n\n### Styling\n\n`<vaadin-context-menu>` uses `<vaadin-context-menu-overlay>` internal\nthemable component as the actual visible context menu overlay.\n\nSee [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-beta2/#/elements/vaadin-overlay)\ndocumentation for `<vaadin-context-menu-overlay>` stylable parts.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.\n\n### Internal components\n\nWhen using `items` API, in addition `<vaadin-context-menu-overlay>`, the following\ninternal components are themable:\n\n- `<vaadin-context-menu-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-beta2/#/elements/vaadin-item).\n- `<vaadin-context-menu-list-box>` - has the same API as [`<vaadin-list-box>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-beta2/#/elements/vaadin-list-box).\n\nNote: the `theme` attribute value set on `<vaadin-context-menu>` is\npropagated to the internal components listed above.",
|
|
12
12
|
"attributes": [
|
|
13
13
|
{
|
|
14
14
|
"name": "selector",
|
package/web-types.lit.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/web-types",
|
|
3
3
|
"name": "@vaadin/context-menu",
|
|
4
|
-
"version": "24.3.0-
|
|
4
|
+
"version": "24.3.0-beta2",
|
|
5
5
|
"description-markup": "markdown",
|
|
6
6
|
"framework": "lit",
|
|
7
7
|
"framework-config": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"elements": [
|
|
17
17
|
{
|
|
18
18
|
"name": "vaadin-context-menu",
|
|
19
|
-
"description": "`<vaadin-context-menu>` is a Web Component for creating context menus.\n\n### Items\n\nItems is a higher level convenience API for defining a (hierarchical) menu structure for the component.\nIf a menu item has a non-empty `children` set, a sub-menu with the child items is opened\nnext to the parent menu on mouseover, tap or a right arrow keypress.\n\nWhen an item is selected, `<vaadin-context-menu>` dispatches an \"item-selected\" event\nwith the selected item as `event.detail.value` property.\nIf item does not have `keepOpen` property the menu will be closed.\n\n```javascript\ncontextMenu.items = [\n { text: 'Menu Item 1', theme: 'primary', className: 'first', children:\n [\n { text: 'Menu Item 1-1', checked: true, keepOpen: true },\n { text: 'Menu Item 1-2' }\n ]\n },\n { component: 'hr' },\n { text: 'Menu Item 2', children:\n [\n { text: 'Menu Item 2-1' },\n { text: 'Menu Item 2-2', disabled: true }\n ]\n },\n { text: 'Menu Item 3', disabled: true, className: 'last' }\n];\n\ncontextMenu.addEventListener('item-selected', e => {\n const item = e.detail.value;\n console.log(`${item.text} selected`);\n});\n```\n\n**NOTE:** when the `items` array is defined, the renderer cannot be used.\n\n### Rendering\n\nThe content of the menu can be populated by using the renderer callback function.\n\nThe renderer function provides `root`, `contextMenu`, `model` arguments when applicable.\nGenerate DOM content by using `model` object properties if needed, append it to the `root`\nelement and control the state of the host element by accessing `contextMenu`. Before generating\nnew content, the renderer function should check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-context-menu id=\"contextMenu\">\n <p>This paragraph has a context menu.</p>\n</vaadin-context-menu>\n```\n```js\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.renderer = (root, contextMenu, context) => {\n let listBox = root.firstElementChild;\n if (!listBox) {\n listBox = document.createElement('vaadin-list-box');\n root.appendChild(listBox);\n }\n\n let item = listBox.querySelector('vaadin-item');\n if (!item) {\n item = document.createElement('vaadin-item');\n listBox.appendChild(item);\n }\n item.textContent = 'Content of the selector: ' + context.target.textContent;\n};\n```\n\nYou can access the menu context inside the renderer using\n`context.target` and `context.detail`.\n\nRenderer is called on the opening of the context-menu and each time the related context is updated.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### `vaadin-contextmenu` Gesture Event\n\n`vaadin-contextmenu` is a gesture event (a custom event),\nwhich is dispatched after either `contextmenu` or long touch events.\nThis enables support for both mouse and touch environments in a uniform way.\n\n`<vaadin-context-menu>` opens the menu overlay on the `vaadin-contextmenu`\nevent by default.\n\n### Menu Listener\n\nBy default, the `<vaadin-context-menu>` element listens for the menu opening\nevent on itself. In case if you do not want to wrap the target, you can listen for\nevents on an element outside the `<vaadin-context-menu>` by setting the\n`listenOn` property:\n\n```html\n<vaadin-context-menu id=\"contextMenu\"></vaadin-context-menu>\n\n<div id=\"menuListener\">The element that listens for the contextmenu event.</div>\n```\n```javascript\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.listenOn = document.querySelector('#menuListener');\n```\n\n### Filtering Menu Targets\n\nBy default, the listener element and all its descendants open the context\nmenu. You can filter the menu targets to a smaller set of elements inside\nthe listener element by setting the `selector` property.\n\nIn the following example, only the elements matching `.has-menu` will open the context menu:\n\n```html\n<vaadin-context-menu selector=\".has-menu\">\n <p class=\"has-menu\">This paragraph opens the context menu</p>\n <p>This paragraph does not open the context menu</p>\n</vaadin-context-menu>\n```\n\n### Menu Context\n\nThe following properties are available in the `context` argument:\n\n- `target` is the menu opening event target, which is the element that\nthe user has called the context menu for\n- `detail` is the menu opening event detail\n\nIn the following example, the menu item text is composed with the contents\nof the element that opened the menu:\n\n```html\n<vaadin-context-menu selector=\"li\" id=\"contextMenu\">\n <ul>\n <li>Foo</li>\n <li>Bar</li>\n <li>Baz</li>\n </ul>\n</vaadin-context-menu>\n```\n```js\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.renderer = (root, contextMenu, context) => {\n let listBox = root.firstElementChild;\n if (!listBox) {\n listBox = document.createElement('vaadin-list-box');\n root.appendChild(listBox);\n }\n\n let item = listBox.querySelector('vaadin-item');\n if (!item) {\n item = document.createElement('vaadin-item');\n listBox.appendChild(item);\n }\n item.textContent = 'The menu target: ' + context.target.textContent;\n};\n```\n\n### Styling\n\n`<vaadin-context-menu>` uses `<vaadin-context-menu-overlay>` internal\nthemable component as the actual visible context menu overlay.\n\nSee [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-
|
|
19
|
+
"description": "`<vaadin-context-menu>` is a Web Component for creating context menus.\n\n### Items\n\nItems is a higher level convenience API for defining a (hierarchical) menu structure for the component.\nIf a menu item has a non-empty `children` set, a sub-menu with the child items is opened\nnext to the parent menu on mouseover, tap or a right arrow keypress.\n\nWhen an item is selected, `<vaadin-context-menu>` dispatches an \"item-selected\" event\nwith the selected item as `event.detail.value` property.\nIf item does not have `keepOpen` property the menu will be closed.\n\n```javascript\ncontextMenu.items = [\n { text: 'Menu Item 1', theme: 'primary', className: 'first', children:\n [\n { text: 'Menu Item 1-1', checked: true, keepOpen: true },\n { text: 'Menu Item 1-2' }\n ]\n },\n { component: 'hr' },\n { text: 'Menu Item 2', children:\n [\n { text: 'Menu Item 2-1' },\n { text: 'Menu Item 2-2', disabled: true }\n ]\n },\n { text: 'Menu Item 3', disabled: true, className: 'last' }\n];\n\ncontextMenu.addEventListener('item-selected', e => {\n const item = e.detail.value;\n console.log(`${item.text} selected`);\n});\n```\n\n**NOTE:** when the `items` array is defined, the renderer cannot be used.\n\n### Rendering\n\nThe content of the menu can be populated by using the renderer callback function.\n\nThe renderer function provides `root`, `contextMenu`, `model` arguments when applicable.\nGenerate DOM content by using `model` object properties if needed, append it to the `root`\nelement and control the state of the host element by accessing `contextMenu`. Before generating\nnew content, the renderer function should check if there is already content in `root` for reusing it.\n\n```html\n<vaadin-context-menu id=\"contextMenu\">\n <p>This paragraph has a context menu.</p>\n</vaadin-context-menu>\n```\n```js\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.renderer = (root, contextMenu, context) => {\n let listBox = root.firstElementChild;\n if (!listBox) {\n listBox = document.createElement('vaadin-list-box');\n root.appendChild(listBox);\n }\n\n let item = listBox.querySelector('vaadin-item');\n if (!item) {\n item = document.createElement('vaadin-item');\n listBox.appendChild(item);\n }\n item.textContent = 'Content of the selector: ' + context.target.textContent;\n};\n```\n\nYou can access the menu context inside the renderer using\n`context.target` and `context.detail`.\n\nRenderer is called on the opening of the context-menu and each time the related context is updated.\nDOM generated during the renderer call can be reused\nin the next renderer call and will be provided with the `root` argument.\nOn first call it will be empty.\n\n### `vaadin-contextmenu` Gesture Event\n\n`vaadin-contextmenu` is a gesture event (a custom event),\nwhich is dispatched after either `contextmenu` or long touch events.\nThis enables support for both mouse and touch environments in a uniform way.\n\n`<vaadin-context-menu>` opens the menu overlay on the `vaadin-contextmenu`\nevent by default.\n\n### Menu Listener\n\nBy default, the `<vaadin-context-menu>` element listens for the menu opening\nevent on itself. In case if you do not want to wrap the target, you can listen for\nevents on an element outside the `<vaadin-context-menu>` by setting the\n`listenOn` property:\n\n```html\n<vaadin-context-menu id=\"contextMenu\"></vaadin-context-menu>\n\n<div id=\"menuListener\">The element that listens for the contextmenu event.</div>\n```\n```javascript\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.listenOn = document.querySelector('#menuListener');\n```\n\n### Filtering Menu Targets\n\nBy default, the listener element and all its descendants open the context\nmenu. You can filter the menu targets to a smaller set of elements inside\nthe listener element by setting the `selector` property.\n\nIn the following example, only the elements matching `.has-menu` will open the context menu:\n\n```html\n<vaadin-context-menu selector=\".has-menu\">\n <p class=\"has-menu\">This paragraph opens the context menu</p>\n <p>This paragraph does not open the context menu</p>\n</vaadin-context-menu>\n```\n\n### Menu Context\n\nThe following properties are available in the `context` argument:\n\n- `target` is the menu opening event target, which is the element that\nthe user has called the context menu for\n- `detail` is the menu opening event detail\n\nIn the following example, the menu item text is composed with the contents\nof the element that opened the menu:\n\n```html\n<vaadin-context-menu selector=\"li\" id=\"contextMenu\">\n <ul>\n <li>Foo</li>\n <li>Bar</li>\n <li>Baz</li>\n </ul>\n</vaadin-context-menu>\n```\n```js\nconst contextMenu = document.querySelector('#contextMenu');\ncontextMenu.renderer = (root, contextMenu, context) => {\n let listBox = root.firstElementChild;\n if (!listBox) {\n listBox = document.createElement('vaadin-list-box');\n root.appendChild(listBox);\n }\n\n let item = listBox.querySelector('vaadin-item');\n if (!item) {\n item = document.createElement('vaadin-item');\n listBox.appendChild(item);\n }\n item.textContent = 'The menu target: ' + context.target.textContent;\n};\n```\n\n### Styling\n\n`<vaadin-context-menu>` uses `<vaadin-context-menu-overlay>` internal\nthemable component as the actual visible context menu overlay.\n\nSee [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-beta2/#/elements/vaadin-overlay)\ndocumentation for `<vaadin-context-menu-overlay>` stylable parts.\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.\n\n### Internal components\n\nWhen using `items` API, in addition `<vaadin-context-menu-overlay>`, the following\ninternal components are themable:\n\n- `<vaadin-context-menu-item>` - has the same API as [`<vaadin-item>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-beta2/#/elements/vaadin-item).\n- `<vaadin-context-menu-list-box>` - has the same API as [`<vaadin-list-box>`](https://cdn.vaadin.com/vaadin-web-components/24.3.0-beta2/#/elements/vaadin-list-box).\n\nNote: the `theme` attribute value set on `<vaadin-context-menu>` is\npropagated to the internal components listed above.",
|
|
20
20
|
"extension": true,
|
|
21
21
|
"attributes": [
|
|
22
22
|
{
|