@vaadin/side-nav 24.4.0-alpha2 → 24.4.0-alpha20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,8 +4,7 @@ A web component for navigation menus.
4
4
 
5
5
  [Documentation + Live Demo ↗](https://vaadin.com/docs/latest/components/side-nav)
6
6
 
7
- [![npm version](https://badgen.net/npm/v/@vaadin/vaadin-side-nav)](https://www.npmjs.com/package/@vaadin/vaadin-side-nav)
8
- [![Discord](https://img.shields.io/discord/732335336448852018?label=discord)](https://discord.gg/PHmkCKC)
7
+ [![npm version](https://badgen.net/npm/v/@vaadin/side-nav)](https://www.npmjs.com/package/@vaadin/side-nav)
9
8
 
10
9
  ```html
11
10
  <vaadin-side-nav collapsible>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/side-nav",
3
- "version": "24.4.0-alpha2",
3
+ "version": "24.4.0-alpha20",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -35,11 +35,11 @@
35
35
  ],
36
36
  "dependencies": {
37
37
  "@open-wc/dedupe-mixin": "^1.3.0",
38
- "@vaadin/a11y-base": "24.4.0-alpha2",
39
- "@vaadin/component-base": "24.4.0-alpha2",
40
- "@vaadin/vaadin-lumo-styles": "24.4.0-alpha2",
41
- "@vaadin/vaadin-material-styles": "24.4.0-alpha2",
42
- "@vaadin/vaadin-themable-mixin": "24.4.0-alpha2",
38
+ "@vaadin/a11y-base": "24.4.0-alpha20",
39
+ "@vaadin/component-base": "24.4.0-alpha20",
40
+ "@vaadin/vaadin-lumo-styles": "24.4.0-alpha20",
41
+ "@vaadin/vaadin-material-styles": "24.4.0-alpha20",
42
+ "@vaadin/vaadin-themable-mixin": "24.4.0-alpha20",
43
43
  "lit": "^3.0.0"
44
44
  },
45
45
  "devDependencies": {
@@ -52,5 +52,5 @@
52
52
  "web-types.json",
53
53
  "web-types.lit.json"
54
54
  ],
55
- "gitHead": "f303ead58d27e15d81a55db0559611fb77c0e421"
55
+ "gitHead": "9d2eacc494eb27658ba9298be6656815912637be"
56
56
  }
@@ -94,12 +94,32 @@ declare class SideNavItem extends SideNavChildrenMixin(DisabledMixin(ElementMixi
94
94
  expanded: boolean;
95
95
 
96
96
  /**
97
- * Whether the path of the item matches the current path.
98
- * Set when the item is appended to DOM or when navigated back
99
- * to the page that contains this item using the browser.
97
+ * Whether the item's path matches the current browser URL.
98
+ *
99
+ * A match occurs when both share the same base origin (like https://example.com),
100
+ * the same path (like /path/to/page), and the browser URL contains all
101
+ * the query parameters with the same values from the item's path.
102
+ *
103
+ * The state is updated when the item is added to the DOM or when the browser
104
+ * navigates to a new page.
100
105
  */
101
106
  readonly current: boolean;
102
107
 
108
+ /**
109
+ * The target of the link. Works only when `path` is set.
110
+ */
111
+ target: string | null | undefined;
112
+
113
+ /**
114
+ * Whether to exclude the item from client-side routing. When enabled,
115
+ * this causes the item to behave like a regular anchor, causing a full
116
+ * page reload. This only works with supported routers, such as the one
117
+ * provided in Vaadin apps, or when using the side nav `onNavigate` hook.
118
+ *
119
+ * @attr {boolean} router-ignore
120
+ */
121
+ routerIgnore: boolean;
122
+
103
123
  addEventListener<K extends keyof SideNavItemEventMap>(
104
124
  type: K,
105
125
  listener: (this: SideNavItem, ev: SideNavItemEventMap[K]) => void,
@@ -115,9 +115,14 @@ class SideNavItem extends SideNavChildrenMixin(DisabledMixin(ElementMixin(Themab
115
115
  },
116
116
 
117
117
  /**
118
- * Whether the path of the item matches the current path.
119
- * Set when the item is appended to DOM or when navigated back
120
- * to the page that contains this item using the browser.
118
+ * Whether the item's path matches the current browser URL.
119
+ *
120
+ * A match occurs when both share the same base origin (like https://example.com),
121
+ * the same path (like /path/to/page), and the browser URL contains at least
122
+ * all the query parameters with the same values from the item's path.
123
+ *
124
+ * The state is updated when the item is added to the DOM or when the browser
125
+ * navigates to a new page.
121
126
  *
122
127
  * @type {boolean}
123
128
  */
@@ -127,6 +132,25 @@ class SideNavItem extends SideNavChildrenMixin(DisabledMixin(ElementMixin(Themab
127
132
  readOnly: true,
128
133
  reflectToAttribute: true,
129
134
  },
135
+
136
+ /**
137
+ * The target of the link. Works only when `path` is set.
138
+ */
139
+ target: String,
140
+
141
+ /**
142
+ * Whether to exclude the item from client-side routing. When enabled,
143
+ * this causes the item to behave like a regular anchor, causing a full
144
+ * page reload. This only works with supported routers, such as the one
145
+ * provided in Vaadin apps, or when using the side nav `onNavigate` hook.
146
+ *
147
+ * @type {boolean}
148
+ * @attr {boolean} router-ignore
149
+ */
150
+ routerIgnore: {
151
+ type: Boolean,
152
+ value: false,
153
+ },
130
154
  };
131
155
  }
132
156
 
@@ -184,12 +208,14 @@ class SideNavItem extends SideNavChildrenMixin(DisabledMixin(ElementMixin(Themab
184
208
  this.__updateCurrent();
185
209
 
186
210
  window.addEventListener('popstate', this.__boundUpdateCurrent);
211
+ window.addEventListener('side-nav-location-changed', this.__boundUpdateCurrent);
187
212
  }
188
213
 
189
214
  /** @protected */
190
215
  disconnectedCallback() {
191
216
  super.disconnectedCallback();
192
217
  window.removeEventListener('popstate', this.__boundUpdateCurrent);
218
+ window.removeEventListener('side-nav-location-changed', this.__boundUpdateCurrent);
193
219
  }
194
220
 
195
221
  /** @protected */
@@ -201,6 +227,8 @@ class SideNavItem extends SideNavChildrenMixin(DisabledMixin(ElementMixin(Themab
201
227
  ?disabled="${this.disabled}"
202
228
  tabindex="${this.disabled || this.path == null ? '-1' : '0'}"
203
229
  href="${ifDefined(this.disabled ? null : this.path)}"
230
+ target="${ifDefined(this.target)}"
231
+ ?router-ignore="${this.routerIgnore}"
204
232
  part="link"
205
233
  aria-current="${this.current ? 'page' : 'false'}"
206
234
  >
@@ -249,19 +277,33 @@ class SideNavItem extends SideNavChildrenMixin(DisabledMixin(ElementMixin(Themab
249
277
  __updateCurrent() {
250
278
  this._setCurrent(this.__isCurrent());
251
279
  if (this.current) {
280
+ this.__expandParentItems();
252
281
  this.expanded = this._items.length > 0;
253
282
  }
254
283
  }
255
284
 
285
+ /** @private */
286
+ __expandParentItems() {
287
+ const parentItem = this.__getParentItem();
288
+ if (parentItem) {
289
+ parentItem.__expandParentItems();
290
+ }
291
+ this.expanded = true;
292
+ }
293
+
294
+ /** @private */
295
+ __getParentItem() {
296
+ return this.parentElement instanceof SideNavItem ? this.parentElement : null;
297
+ }
298
+
256
299
  /** @private */
257
300
  __isCurrent() {
258
301
  if (this.path == null) {
259
302
  return false;
260
303
  }
261
- return (
262
- matchPaths(document.location.pathname, this.path) ||
263
- this.pathAliases.some((alias) => matchPaths(document.location.pathname, alias))
264
- );
304
+
305
+ const browserPath = `${document.location.pathname}${document.location.search}`;
306
+ return matchPaths(browserPath, this.path) || this.pathAliases.some((alias) => matchPaths(browserPath, alias));
265
307
  }
266
308
  }
267
309
 
@@ -7,6 +7,7 @@ import { FocusMixin } from '@vaadin/a11y-base/src/focus-mixin.js';
7
7
  import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
8
8
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
9
9
  import { SideNavChildrenMixin, type SideNavI18n } from './vaadin-side-nav-children-mixin.js';
10
+ import type { SideNavItem } from './vaadin-side-nav-item.js';
10
11
 
11
12
  export type { SideNavI18n };
12
13
 
@@ -21,6 +22,15 @@ export interface SideNavCustomEventMap {
21
22
 
22
23
  export type SideNavEventMap = HTMLElementEventMap & SideNavCustomEventMap;
23
24
 
25
+ export type NavigateEvent = {
26
+ path: SideNavItem['path'];
27
+ target: SideNavItem['target'];
28
+ current: SideNavItem['current'];
29
+ expanded: SideNavItem['expanded'];
30
+ pathAliases: SideNavItem['pathAliases'];
31
+ originalEvent: MouseEvent;
32
+ };
33
+
24
34
  /**
25
35
  * `<vaadin-side-nav>` is a Web Component for navigation menus.
26
36
  *
@@ -83,6 +93,40 @@ declare class SideNav extends SideNavChildrenMixin(FocusMixin(ElementMixin(Thema
83
93
  */
84
94
  collapsed: boolean;
85
95
 
96
+ /**
97
+ * Callback function for router integration.
98
+ *
99
+ * When a side nav item link is clicked, this function is called and the default click action is cancelled.
100
+ * This delegates the responsibility of navigation to the function's logic.
101
+ *
102
+ * The click event action is not cancelled in the following cases:
103
+ * - The click event has a modifier (e.g. `metaKey`, `shiftKey`)
104
+ * - The click event is on an external link
105
+ * - The click event is on a link with `target="_blank"`
106
+ * - The function explicitly returns `false`
107
+ *
108
+ * The function receives an object with the properties of the clicked side-nav item:
109
+ * - `path`: The path of the navigation item.
110
+ * - `target`: The target of the navigation item.
111
+ * - `current`: A boolean indicating whether the navigation item is currently selected.
112
+ * - `expanded`: A boolean indicating whether the navigation item is expanded.
113
+ * - `pathAliases`: An array of path aliases for the navigation item.
114
+ * - `originalEvent`: The original DOM event that triggered the navigation.
115
+ *
116
+ * Also see the `location` property for updating the highlighted navigation item on route change.
117
+ */
118
+ onNavigate?: ((event: NavigateEvent) => boolean) | ((event: NavigateEvent) => void);
119
+
120
+ /**
121
+ * A change to this property triggers an update of the highlighted item in the side navigation. While it typically
122
+ * corresponds to the browser's URL, the specific value assigned to the property is irrelevant. The component has
123
+ * its own internal logic for determining which item is highlighted.
124
+ *
125
+ * The main use case for this property is when the side navigation is used with a client-side router. In this case,
126
+ * the component needs to be informed about route changes so it can update the highlighted item.
127
+ */
128
+ location: any;
129
+
86
130
  addEventListener<K extends keyof SideNavEventMap>(
87
131
  type: K,
88
132
  listener: (this: SideNav, ev: SideNavEventMap[K]) => void,
@@ -103,6 +103,48 @@ class SideNav extends SideNavChildrenMixin(FocusMixin(ElementMixin(ThemableMixin
103
103
  notify: true,
104
104
  reflectToAttribute: true,
105
105
  },
106
+
107
+ /**
108
+ * Callback function for router integration.
109
+ *
110
+ * When a side nav item link is clicked, this function is called and the default click action is cancelled.
111
+ * This delegates the responsibility of navigation to the function's logic.
112
+ *
113
+ * The click event action is not cancelled in the following cases:
114
+ * - The click event has a modifier (e.g. `metaKey`, `shiftKey`)
115
+ * - The click event is on an external link
116
+ * - The click event is on a link with `target="_blank"`
117
+ * - The function explicitly returns `false`
118
+ *
119
+ * The function receives an object with the properties of the clicked side-nav item:
120
+ * - `path`: The path of the navigation item.
121
+ * - `target`: The target of the navigation item.
122
+ * - `current`: A boolean indicating whether the navigation item is currently selected.
123
+ * - `expanded`: A boolean indicating whether the navigation item is expanded.
124
+ * - `pathAliases`: An array of path aliases for the navigation item.
125
+ * - `originalEvent`: The original DOM event that triggered the navigation.
126
+ *
127
+ * Also see the `location` property for updating the highlighted navigation item on route change.
128
+ *
129
+ * @type {function(Object): boolean | undefined}
130
+ */
131
+ onNavigate: {
132
+ attribute: false,
133
+ },
134
+
135
+ /**
136
+ * A change to this property triggers an update of the highlighted item in the side navigation. While it typically
137
+ * corresponds to the browser's URL, the specific value assigned to the property is irrelevant. The component has
138
+ * its own internal logic for determining which item is highlighted.
139
+ *
140
+ * The main use case for this property is when the side navigation is used with a client-side router. In this case,
141
+ * the component needs to be informed about route changes so it can update the highlighted item.
142
+ *
143
+ * @type {any}
144
+ */
145
+ location: {
146
+ observer: '__locationChanged',
147
+ },
106
148
  };
107
149
  }
108
150
 
@@ -114,6 +156,7 @@ class SideNav extends SideNavChildrenMixin(FocusMixin(ElementMixin(ThemableMixin
114
156
  super();
115
157
 
116
158
  this._labelId = `side-nav-label-${generateUniqueId()}`;
159
+ this.addEventListener('click', this.__onClick);
117
160
  }
118
161
 
119
162
  /**
@@ -203,10 +246,67 @@ class SideNav extends SideNavChildrenMixin(FocusMixin(ElementMixin(ThemableMixin
203
246
  }
204
247
  }
205
248
 
249
+ /** @private */
250
+ __locationChanged() {
251
+ window.dispatchEvent(new CustomEvent('side-nav-location-changed'));
252
+ }
253
+
206
254
  /** @private */
207
255
  __toggleCollapsed() {
208
256
  this.collapsed = !this.collapsed;
209
257
  }
258
+
259
+ /** @private */
260
+ __onClick(e) {
261
+ if (!this.onNavigate) {
262
+ return;
263
+ }
264
+
265
+ const hasModifier = e.metaKey || e.shiftKey;
266
+ if (hasModifier) {
267
+ // Allow default action for clicks with modifiers
268
+ return;
269
+ }
270
+
271
+ const composedPath = e.composedPath();
272
+ const item = composedPath.find((el) => el.localName && el.localName.includes('side-nav-item'));
273
+ const anchor = composedPath.find((el) => el instanceof HTMLAnchorElement);
274
+ if (!item || !item.shadowRoot.contains(anchor)) {
275
+ // Not a click on a side-nav-item anchor
276
+ return;
277
+ }
278
+
279
+ const isRelative = anchor.href && anchor.href.startsWith(location.origin);
280
+ if (!isRelative) {
281
+ // Allow default action for external links
282
+ return;
283
+ }
284
+
285
+ if (item.target === '_blank') {
286
+ // Allow default action for links with target="_blank"
287
+ return;
288
+ }
289
+
290
+ if (item.routerIgnore) {
291
+ // Allow default action when client-side routing is ignored
292
+ return;
293
+ }
294
+
295
+ // Call the onNavigate callback
296
+ const result = this.onNavigate({
297
+ path: item.path,
298
+ target: item.target,
299
+ current: item.current,
300
+ expanded: item.expanded,
301
+ pathAliases: item.pathAliases,
302
+ originalEvent: e,
303
+ });
304
+
305
+ if (result !== false) {
306
+ // Cancel the default action if the callback didn't return false
307
+ e.preventDefault();
308
+ }
309
+ }
210
310
  }
211
311
 
212
312
  defineCustomElement(SideNav);
@@ -0,0 +1,7 @@
1
+ import '@vaadin/vaadin-lumo-styles/color.js';
2
+ import '@vaadin/vaadin-lumo-styles/typography.js';
3
+ import '@vaadin/vaadin-lumo-styles/sizing.js';
4
+ import '@vaadin/vaadin-lumo-styles/spacing.js';
5
+ import '@vaadin/vaadin-lumo-styles/style.js';
6
+ import '@vaadin/vaadin-lumo-styles/font-icons.js';
7
+ export declare const sideNavItemStyles: import("lit").CSSResult;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2023 - 2024 Vaadin Ltd.
4
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
+ */
6
+ import './vaadin-side-nav-item-styles.js';
7
+ import '../../src/vaadin-side-nav-item.js';
@@ -0,0 +1,7 @@
1
+ import '@vaadin/vaadin-lumo-styles/color.js';
2
+ import '@vaadin/vaadin-lumo-styles/typography.js';
3
+ import '@vaadin/vaadin-lumo-styles/sizing.js';
4
+ import '@vaadin/vaadin-lumo-styles/spacing.js';
5
+ import '@vaadin/vaadin-lumo-styles/style.js';
6
+ import '@vaadin/vaadin-lumo-styles/font-icons.js';
7
+ export declare const sideNavStyles: import("lit").CSSResult;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2023 - 2024 Vaadin Ltd.
4
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
+ */
6
+ import './vaadin-side-nav-item.js';
7
+ import './vaadin-side-nav-styles.js';
8
+ import '../../src/vaadin-side-nav.js';
@@ -0,0 +1,4 @@
1
+ import '@vaadin/vaadin-material-styles/color.js';
2
+ import '@vaadin/vaadin-material-styles/font-icons.js';
3
+ import '@vaadin/vaadin-material-styles/typography.js';
4
+ export declare const sideNavItemStyles: import("lit").CSSResult;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2023 - 2024 Vaadin Ltd.
4
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
+ */
6
+ import './vaadin-side-nav-item-styles.js';
7
+ import '../../src/vaadin-side-nav-item.js';
@@ -0,0 +1,4 @@
1
+ import '@vaadin/vaadin-material-styles/color.js';
2
+ import '@vaadin/vaadin-material-styles/font-icons.js';
3
+ import '@vaadin/vaadin-material-styles/typography.js';
4
+ export declare const sideNavStyles: import("lit").CSSResult;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2023 - 2024 Vaadin Ltd.
4
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
+ */
6
+ import './vaadin-side-nav-item.js';
7
+ import './vaadin-side-nav-styles.js';
8
+ import '../../src/vaadin-side-nav.js';
package/web-types.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/side-nav",
4
- "version": "24.4.0-alpha2",
4
+ "version": "24.4.0-alpha20",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -41,6 +41,26 @@
41
41
  ]
42
42
  }
43
43
  },
44
+ {
45
+ "name": "target",
46
+ "description": "The target of the link. Works only when `path` is set.",
47
+ "value": {
48
+ "type": [
49
+ "string",
50
+ "null",
51
+ "undefined"
52
+ ]
53
+ }
54
+ },
55
+ {
56
+ "name": "router-ignore",
57
+ "description": "Whether to exclude the item from client-side routing. When enabled,\nthis causes the item to behave like a regular anchor, causing a full\npage reload. This only works with supported routers, such as the one\nprovided in Vaadin apps, or when using the side nav `onNavigate` hook.",
58
+ "value": {
59
+ "type": [
60
+ "boolean"
61
+ ]
62
+ }
63
+ },
44
64
  {
45
65
  "name": "theme",
46
66
  "description": "The theme variants to apply to the component.",
@@ -103,6 +123,26 @@
103
123
  "boolean"
104
124
  ]
105
125
  }
126
+ },
127
+ {
128
+ "name": "target",
129
+ "description": "The target of the link. Works only when `path` is set.",
130
+ "value": {
131
+ "type": [
132
+ "string",
133
+ "null",
134
+ "undefined"
135
+ ]
136
+ }
137
+ },
138
+ {
139
+ "name": "routerIgnore",
140
+ "description": "Whether to exclude the item from client-side routing. When enabled,\nthis causes the item to behave like a regular anchor, causing a full\npage reload. This only works with supported routers, such as the one\nprovided in Vaadin apps, or when using the side nav `onNavigate` hook.",
141
+ "value": {
142
+ "type": [
143
+ "boolean"
144
+ ]
145
+ }
106
146
  }
107
147
  ],
108
148
  "events": [
@@ -135,6 +175,25 @@
135
175
  ]
136
176
  }
137
177
  },
178
+ {
179
+ "name": "on-navigate",
180
+ "description": "Callback function for router integration.\n\nWhen a side nav item link is clicked, this function is called and the default click action is cancelled.\nThis delegates the responsibility of navigation to the function's logic.\n\nThe click event action is not cancelled in the following cases:\n- The click event has a modifier (e.g. `metaKey`, `shiftKey`)\n- The click event is on an external link\n- The click event is on a link with `target=\"_blank\"`\n- The function explicitly returns `false`\n\nThe function receives an object with the properties of the clicked side-nav item:\n- `path`: The path of the navigation item.\n- `target`: The target of the navigation item.\n- `current`: A boolean indicating whether the navigation item is currently selected.\n- `expanded`: A boolean indicating whether the navigation item is expanded.\n- `pathAliases`: An array of path aliases for the navigation item.\n- `originalEvent`: The original DOM event that triggered the navigation.\n\nAlso see the `location` property for updating the highlighted navigation item on route change.",
181
+ "value": {
182
+ "type": [
183
+ "function Object: boolean",
184
+ "undefined"
185
+ ]
186
+ }
187
+ },
188
+ {
189
+ "name": "location",
190
+ "description": "A change to this property triggers an update of the highlighted item in the side navigation. While it typically\ncorresponds to the browser's URL, the specific value assigned to the property is irrelevant. The component has\nits own internal logic for determining which item is highlighted.\n\nThe main use case for this property is when the side navigation is used with a client-side router. In this case,\nthe component needs to be informed about route changes so it can update the highlighted item.",
191
+ "value": {
192
+ "type": [
193
+ "any"
194
+ ]
195
+ }
196
+ },
138
197
  {
139
198
  "name": "theme",
140
199
  "description": "The theme variants to apply to the component.",
@@ -175,6 +234,25 @@
175
234
  "boolean"
176
235
  ]
177
236
  }
237
+ },
238
+ {
239
+ "name": "onNavigate",
240
+ "description": "Callback function for router integration.\n\nWhen a side nav item link is clicked, this function is called and the default click action is cancelled.\nThis delegates the responsibility of navigation to the function's logic.\n\nThe click event action is not cancelled in the following cases:\n- The click event has a modifier (e.g. `metaKey`, `shiftKey`)\n- The click event is on an external link\n- The click event is on a link with `target=\"_blank\"`\n- The function explicitly returns `false`\n\nThe function receives an object with the properties of the clicked side-nav item:\n- `path`: The path of the navigation item.\n- `target`: The target of the navigation item.\n- `current`: A boolean indicating whether the navigation item is currently selected.\n- `expanded`: A boolean indicating whether the navigation item is expanded.\n- `pathAliases`: An array of path aliases for the navigation item.\n- `originalEvent`: The original DOM event that triggered the navigation.\n\nAlso see the `location` property for updating the highlighted navigation item on route change.",
241
+ "value": {
242
+ "type": [
243
+ "function Object: boolean",
244
+ "undefined"
245
+ ]
246
+ }
247
+ },
248
+ {
249
+ "name": "location",
250
+ "description": "A change to this property triggers an update of the highlighted item in the side navigation. While it typically\ncorresponds to the browser's URL, the specific value assigned to the property is irrelevant. The component has\nits own internal logic for determining which item is highlighted.\n\nThe main use case for this property is when the side navigation is used with a client-side router. In this case,\nthe component needs to be informed about route changes so it can update the highlighted item.",
251
+ "value": {
252
+ "type": [
253
+ "any"
254
+ ]
255
+ }
178
256
  }
179
257
  ],
180
258
  "events": [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/side-nav",
4
- "version": "24.4.0-alpha2",
4
+ "version": "24.4.0-alpha20",
5
5
  "description-markup": "markdown",
6
6
  "framework": "lit",
7
7
  "framework-config": {
@@ -33,6 +33,13 @@
33
33
  "kind": "expression"
34
34
  }
35
35
  },
36
+ {
37
+ "name": "?routerIgnore",
38
+ "description": "Whether to exclude the item from client-side routing. When enabled,\nthis causes the item to behave like a regular anchor, causing a full\npage reload. This only works with supported routers, such as the one\nprovided in Vaadin apps, or when using the side nav `onNavigate` hook.",
39
+ "value": {
40
+ "kind": "expression"
41
+ }
42
+ },
36
43
  {
37
44
  "name": ".i18n",
38
45
  "description": "The object used to localize this component.\n\nTo change the default localization, replace the entire\n`i18n` object with a custom one.\n\nThe object has the following structure and default values:\n```\n{\n toggle: 'Toggle child items'\n}\n```",
@@ -54,6 +61,13 @@
54
61
  "kind": "expression"
55
62
  }
56
63
  },
64
+ {
65
+ "name": ".target",
66
+ "description": "The target of the link. Works only when `path` is set.",
67
+ "value": {
68
+ "kind": "expression"
69
+ }
70
+ },
57
71
  {
58
72
  "name": "@expanded-changed",
59
73
  "description": "Fired when the `expanded` property changes.",
@@ -82,6 +96,13 @@
82
96
  "kind": "expression"
83
97
  }
84
98
  },
99
+ {
100
+ "name": "?onNavigate",
101
+ "description": "Callback function for router integration.\n\nWhen a side nav item link is clicked, this function is called and the default click action is cancelled.\nThis delegates the responsibility of navigation to the function's logic.\n\nThe click event action is not cancelled in the following cases:\n- The click event has a modifier (e.g. `metaKey`, `shiftKey`)\n- The click event is on an external link\n- The click event is on a link with `target=\"_blank\"`\n- The function explicitly returns `false`\n\nThe function receives an object with the properties of the clicked side-nav item:\n- `path`: The path of the navigation item.\n- `target`: The target of the navigation item.\n- `current`: A boolean indicating whether the navigation item is currently selected.\n- `expanded`: A boolean indicating whether the navigation item is expanded.\n- `pathAliases`: An array of path aliases for the navigation item.\n- `originalEvent`: The original DOM event that triggered the navigation.\n\nAlso see the `location` property for updating the highlighted navigation item on route change.",
102
+ "value": {
103
+ "kind": "expression"
104
+ }
105
+ },
85
106
  {
86
107
  "name": ".i18n",
87
108
  "description": "The object used to localize this component.\n\nTo change the default localization, replace the entire\n`i18n` object with a custom one.\n\nThe object has the following structure and default values:\n```\n{\n toggle: 'Toggle child items'\n}\n```",
@@ -89,6 +110,13 @@
89
110
  "kind": "expression"
90
111
  }
91
112
  },
113
+ {
114
+ "name": ".location",
115
+ "description": "A change to this property triggers an update of the highlighted item in the side navigation. While it typically\ncorresponds to the browser's URL, the specific value assigned to the property is irrelevant. The component has\nits own internal logic for determining which item is highlighted.\n\nThe main use case for this property is when the side navigation is used with a client-side router. In this case,\nthe component needs to be informed about route changes so it can update the highlighted item.",
116
+ "value": {
117
+ "kind": "expression"
118
+ }
119
+ },
92
120
  {
93
121
  "name": "@collapsed-changed",
94
122
  "description": "Fired when the `collapsed` property changes.",