@nova-design-system/nova-react 3.21.1-beta.0 → 3.22.0
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/dist/cjs/generated/components.server.js +0 -92
- package/dist/cjs/{index-CEKdYnmK.js → index-WPRkQD3O.js} +619 -1364
- package/dist/cjs/index.js +1 -11
- package/dist/cjs/{nv-accordion-item.entry-zvp8yDql.js → nv-accordion-item.entry-BuTvA6w9.js} +1 -1
- package/dist/cjs/{nv-accordion.entry-D6gckOF4.js → nv-accordion.entry-Dtsfw6He.js} +1 -1
- package/dist/cjs/{nv-alert.entry-Df8-nQ-R.js → nv-alert.entry-TIdfdU7Y.js} +1 -1
- package/dist/cjs/{nv-avatar.entry-ZOnVWP9L.js → nv-avatar.entry-CaxrhPuw.js} +1 -1
- package/dist/cjs/{nv-badge_2.entry-DgiVv_Yf.js → nv-badge_2.entry-CfYvTZxX.js} +1 -1
- package/dist/cjs/{nv-breadcrumb.entry-IqtE1JL0.js → nv-breadcrumb.entry-BCZ4MmfD.js} +1 -1
- package/dist/cjs/{nv-breadcrumbs.entry-Be6dz7zI.js → nv-breadcrumbs.entry-DwzCE7F6.js} +1 -1
- package/dist/cjs/{nv-button.entry-CmswF3Si.js → nv-button.entry-Cr_86bcZ.js} +1 -1
- package/dist/cjs/{nv-buttongroup.entry-Cfe6rFSs.js → nv-buttongroup.entry-CWjRoHY1.js} +1 -1
- package/dist/cjs/{nv-calendar.entry-q83sS_dN.js → nv-calendar.entry-CXfwNt6G.js} +1 -1
- package/dist/cjs/{nv-col.entry-Cu-Qi1bi.js → nv-col.entry-CJLDS3LY.js} +1 -1
- package/dist/cjs/{nv-datagrid.entry-Cx7SvD5S.js → nv-datagrid.entry-Cns8XSud.js} +1 -1
- package/dist/cjs/{nv-datagridcolumn.entry-B_uXKFLg.js → nv-datagridcolumn.entry-CFFAipHF.js} +1 -1
- package/dist/cjs/{nv-dialog.entry-J6Xwi6z1.js → nv-dialog.entry-CDSK9pUH.js} +1 -1
- package/dist/cjs/{nv-dialogfooter_2.entry-DOlhqDTh.js → nv-dialogfooter_2.entry-To_dGUn4.js} +1 -1
- package/dist/cjs/{nv-fieldcheckbox.entry-C23dGGX7.js → nv-fieldcheckbox.entry-fdonR07Z.js} +1 -1
- package/dist/cjs/{nv-fielddate.entry-xWi3GpLl.js → nv-fielddate.entry-C3pXtMHL.js} +1 -1
- package/dist/cjs/{nv-fielddaterange.entry-BwFtpw9X.js → nv-fielddaterange.entry-CjVVPEK_.js} +1 -1
- package/dist/cjs/{nv-fielddropdown.entry-mnl7mSaK.js → nv-fielddropdown.entry-C9mXuNNj.js} +1 -1
- package/dist/cjs/{nv-fielddropdownitem.entry-DjyFlVXw.js → nv-fielddropdownitem.entry-Dah-PaE8.js} +1 -1
- package/dist/cjs/{nv-fieldmultiselect.entry-BtLTG7nM.js → nv-fieldmultiselect.entry-BMLjhqoJ.js} +1 -1
- package/dist/cjs/{nv-fieldnumber.entry-C00Hg70B.js → nv-fieldnumber.entry-DBdJviXu.js} +1 -1
- package/dist/cjs/{nv-fieldpassword.entry-BLg8tCN0.js → nv-fieldpassword.entry-Cim_usSM.js} +1 -1
- package/dist/cjs/{nv-fieldradio.entry-2hb1Ur40.js → nv-fieldradio.entry-X_2VT1Dj.js} +1 -1
- package/dist/cjs/{nv-fieldselect.entry-D-eYQpAv.js → nv-fieldselect.entry-pSp-2rNn.js} +1 -1
- package/dist/cjs/{nv-fieldslider.entry-BGle1RZR.js → nv-fieldslider.entry-pZf7zzLU.js} +1 -1
- package/dist/cjs/{nv-fieldtext.entry-Djg8cqOa.js → nv-fieldtext.entry-DlI_ExaV.js} +1 -1
- package/dist/cjs/{nv-fieldtextarea.entry-Z32-s901.js → nv-fieldtextarea.entry-t3Ixxi23.js} +1 -1
- package/dist/cjs/{nv-fieldtime.entry-CDFGdfFL.js → nv-fieldtime.entry-DY7D5_6K.js} +1 -1
- package/dist/cjs/{nv-icon.entry-BDq7DKRt.js → nv-icon.entry-6oYPSf4c.js} +1 -1
- package/dist/cjs/{nv-iconbutton_2.entry-DdgEkFLK.js → nv-iconbutton_2.entry-ChULGovr.js} +1 -1
- package/dist/cjs/{nv-menu.entry-iob0Kve8.js → nv-menu.entry-sd0tatWq.js} +1 -1
- package/dist/cjs/{nv-menuitem.entry-C989Ui60.js → nv-menuitem.entry-CCOqR7UF.js} +1 -1
- package/dist/cjs/{nv-notification.entry-BxvJMKxH.js → nv-notification.entry-Cc3zE3yY.js} +1 -1
- package/dist/cjs/{nv-notificationcontainer.entry-CxGCIb96.js → nv-notificationcontainer.entry-DV4D6oOH.js} +1 -1
- package/dist/cjs/{nv-popover.entry-1KsO_KQm.js → nv-popover.entry-DQSwI2jT.js} +1 -1
- package/dist/cjs/{nv-row.entry-PBLq_BzJ.js → nv-row.entry-UUuMSAY5.js} +1 -1
- package/dist/cjs/{nv-split.entry-y66NBf88.js → nv-split.entry-CYP2bTTM.js} +2 -2
- package/dist/cjs/{nv-stack.entry-CXjpkpbW.js → nv-stack.entry-D35-75Vw.js} +2 -2
- package/dist/cjs/{nv-table.entry-quaVnLru.js → nv-table.entry-DevWJBnL.js} +2 -2
- package/dist/cjs/{nv-tableheader.entry-DTBE2XQO.js → nv-tableheader.entry-Hs7nUSOC.js} +2 -2
- package/dist/cjs/{nv-toggle.entry-CxUwF0pb.js → nv-toggle.entry-Eje9d--6.js} +3 -3
- package/dist/cjs/{nv-togglebutton.entry-w-WEAmE6.js → nv-togglebutton.entry-LGI7pIeK.js} +2 -2
- package/dist/cjs/{nv-togglebuttongroup.entry-UbrE8y7a.js → nv-togglebuttongroup.entry-CWN_Ucry.js} +2 -2
- package/dist/cjs/{nv-tooltip.entry-Dq2bkV33.js → nv-tooltip.entry-BGkKDEFg.js} +2 -2
- package/dist/components/NvDatatable/NvDatatable.js +77 -4
- package/dist/generated/components.js +0 -80
- package/dist/generated/components.server.js +0 -82
- package/dist/types/components/NvDatatable/NvDatatable.d.ts +1 -1
- package/dist/types/components/NvDatatable/types.d.ts +17 -1
- package/dist/types/generated/components.d.ts +0 -32
- package/dist/types/generated/components.server.d.ts +0 -32
- package/package.json +1 -1
- package/dist/cjs/nv-notification-bullet.entry-J8OkAZtU.js +0 -77
- package/dist/cjs/nv-sidebar.entry-CjLbvLqw.js +0 -177
- package/dist/cjs/nv-sidebarcontent.entry-Cv76IH4W.js +0 -22
- package/dist/cjs/nv-sidebardivider.entry-DYPJ_k73.js +0 -22
- package/dist/cjs/nv-sidebarfooter.entry-mGcMBRmv.js +0 -22
- package/dist/cjs/nv-sidebargroup.entry-DtwFliHZ.js +0 -23
- package/dist/cjs/nv-sidebarheader.entry-BdOYIXCA.js +0 -22
- package/dist/cjs/nv-sidebarlogo.entry-Da0kGsfw.js +0 -32
- package/dist/cjs/nv-sidebarnavitem.entry-D5xLfpwn.js +0 -297
- package/dist/cjs/nv-sidebarnavsubitem.entry-CkeJfHH4.js +0 -35
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('./index-CEKdYnmK.js');
|
|
4
|
-
require('react');
|
|
5
|
-
require('react-dom');
|
|
6
|
-
|
|
7
|
-
const nvSidebarCss = "nv-sidebarnavitem a,nv-sidebarnavitem a:link,nv-sidebarnavitem a:visited,nv-sidebarnavitem a:hover,nv-sidebarnavitem a:active,nv-sidebarnavsubitem a,nv-sidebarnavsubitem a:link,nv-sidebarnavsubitem a:visited,nv-sidebarnavsubitem a:hover,nv-sidebarnavsubitem a:active{color:inherit !important;text-decoration:none !important}nv-sidebar{display:flex;flex-direction:column;position:relative;height:100vh;background-color:var(--color-level-00-background);border-right:var(--sidebar-primary-separator-size) solid var(--color-content-low-border);transition:width 0.3s ease;width:var(--sidebar-width)}nv-sidebar[collapsed]{width:var(--sidebar-reduced-max-width)}nv-sidebar[collapsed] [data-hide-on-collapsed]{display:none !important}nv-sidebar[collapsed] .nv-sidebar-container{padding:var(--spacing-6) var(--spacing-5)}nv-sidebar .nv-sidebar-container{display:flex;flex-direction:column;flex:1;overflow:hidden;padding:var(--spacing-6);gap:var(--sidebar-gap-y)}nv-sidebar .nv-sidebar-toggle{position:absolute;top:var(--spacing-8);right:calc(var(--spacing-8) / -2);display:flex;align-items:center;justify-content:center;width:var(--spacing-8);height:var(--spacing-8);padding:var(--sidebar-collapsible-button-padding);background-color:var(--color-level-00-background);border:var(--sidebar-primary-separator-size) solid var(--color-content-low-border);border-radius:var(--radius-rounded-full);cursor:pointer;transition:transform 0.2s ease;z-index:10}nv-sidebar .nv-sidebar-toggle:hover{background-color:var(--color-level-10-background)}nv-sidebar .nv-sidebar-toggle:focus,nv-sidebar .nv-sidebar-toggle:focus-within{outline:none}nv-sidebar .nv-sidebar-toggle:focus-visible,nv-sidebar .nv-sidebar-toggle:has(:focus-visible){outline:calc(var(--focus-outline-stroke) * 1) solid var(--color-focus-brand);outline-offset:calc(var(--focus-outline-offset) * 1)}nv-sidebar .nv-sidebar-toggle nv-icon{width:var(--sidebar-collapsible-button-icon-size);height:var(--sidebar-collapsible-button-icon-size);color:var(--color-interaction-container-neutral-icon)}";
|
|
8
|
-
const NvSidebarStyle0 = nvSidebarCss;
|
|
9
|
-
|
|
10
|
-
const NvSidebar = class {
|
|
11
|
-
constructor(hostRef) {
|
|
12
|
-
index.registerInstance(this, hostRef);
|
|
13
|
-
this.openChanged = index.createEvent(this, "openChanged");
|
|
14
|
-
/****************************************************************************/
|
|
15
|
-
//#region PROPERTIES
|
|
16
|
-
/**
|
|
17
|
-
* The type of sidebar behavior.
|
|
18
|
-
* - collapsible: Can be toggled open/closed
|
|
19
|
-
* - persistent: Always visible
|
|
20
|
-
*/
|
|
21
|
-
this.type = 'persistent';
|
|
22
|
-
/**
|
|
23
|
-
* Whether the sidebar is currently open (only applies to collapsible type).
|
|
24
|
-
*/
|
|
25
|
-
// eslint-disable-next-line @stencil-community/ban-default-true
|
|
26
|
-
this.open = true;
|
|
27
|
-
/**
|
|
28
|
-
* Determines the type of notification bullets in the sidebar.
|
|
29
|
-
* - neutral: Uses neutral colors (gray)
|
|
30
|
-
* - brand: Uses brand colors (orange/teal depending on theme)
|
|
31
|
-
*/
|
|
32
|
-
this.notificationIntention = 'brand';
|
|
33
|
-
/**
|
|
34
|
-
* Determines the emphasis of notification bullets in the sidebar.
|
|
35
|
-
* - high: More prominent appearance
|
|
36
|
-
* - low: Less prominent appearance
|
|
37
|
-
*/
|
|
38
|
-
this.notificationEmphasis = 'high';
|
|
39
|
-
//#endregion EVENTS
|
|
40
|
-
/****************************************************************************/
|
|
41
|
-
//#region METHODS
|
|
42
|
-
this.handleToggle = () => {
|
|
43
|
-
if (this.type === 'collapsible') {
|
|
44
|
-
// Changing open will trigger @Watch which emits the event
|
|
45
|
-
this.open = !this.open;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* Sets the active state of navigation items based on activePath
|
|
50
|
-
*/
|
|
51
|
-
this.setActiveNavItems = () => {
|
|
52
|
-
if (!this.activePath)
|
|
53
|
-
return;
|
|
54
|
-
// First, check all subitems to find if any matches exactly
|
|
55
|
-
const activeSubitemHrefs = new Set();
|
|
56
|
-
this.el.querySelectorAll('nv-sidebarnavsubitem').forEach(subItem => {
|
|
57
|
-
const link = subItem.querySelector('a');
|
|
58
|
-
const href = link === null || link === void 0 ? void 0 : link.getAttribute('href');
|
|
59
|
-
if (href) {
|
|
60
|
-
const isActive = this.activePath === href;
|
|
61
|
-
subItem.active = isActive;
|
|
62
|
-
if (isActive) {
|
|
63
|
-
activeSubitemHrefs.add(href);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
// Then, set nav items active only if:
|
|
68
|
-
// 1. Exact match with activePath AND no subitem matches
|
|
69
|
-
// 2. OR the navitem has no subitems and activePath starts with its href
|
|
70
|
-
this.el.querySelectorAll('nv-sidebarnavitem').forEach(navItem => {
|
|
71
|
-
const link = navItem.querySelector(':scope > a, :scope > .nv-sidebarnavitem-trigger a, .nv-sidebarnavitem-content > a');
|
|
72
|
-
const href = link === null || link === void 0 ? void 0 : link.getAttribute('href');
|
|
73
|
-
const hasSubitems = navItem.querySelector('nv-sidebarnavsubitem') !== null;
|
|
74
|
-
if (href) {
|
|
75
|
-
if (hasSubitems) {
|
|
76
|
-
// Parent with subitems: only active if exact match (not when subitem is active)
|
|
77
|
-
navItem.active = this.activePath === href;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
// Item without subitems: active on exact match
|
|
81
|
-
navItem.active = this.activePath === href;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
};
|
|
86
|
-
this.pendingActiveUpdate = null;
|
|
87
|
-
/**
|
|
88
|
-
* Sets up the MutationObserver to watch for changes in child elements.
|
|
89
|
-
* Only triggers on new nav items being added, not on attribute changes.
|
|
90
|
-
*/
|
|
91
|
-
this.setupMutationObserver = () => {
|
|
92
|
-
this.mutationObserver = new MutationObserver(mutations => {
|
|
93
|
-
// Only react to new nav items being added, ignore other mutations
|
|
94
|
-
const hasNewNavItems = mutations.some(mutation => {
|
|
95
|
-
if (mutation.type !== 'childList')
|
|
96
|
-
return false;
|
|
97
|
-
return Array.from(mutation.addedNodes).some(node => {
|
|
98
|
-
if (node.nodeType !== Node.ELEMENT_NODE)
|
|
99
|
-
return false;
|
|
100
|
-
const el = node;
|
|
101
|
-
return (el.tagName.toLowerCase() === 'nv-sidebarnavitem' ||
|
|
102
|
-
el.tagName.toLowerCase() === 'nv-sidebarnavsubitem' ||
|
|
103
|
-
el.querySelector('nv-sidebarnavitem, nv-sidebarnavsubitem'));
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
if (hasNewNavItems) {
|
|
107
|
-
// Debounce to prevent multiple rapid calls
|
|
108
|
-
if (this.pendingActiveUpdate) {
|
|
109
|
-
clearTimeout(this.pendingActiveUpdate);
|
|
110
|
-
}
|
|
111
|
-
this.pendingActiveUpdate = window.setTimeout(() => {
|
|
112
|
-
this.setActiveNavItems();
|
|
113
|
-
this.pendingActiveUpdate = null;
|
|
114
|
-
}, 50);
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
this.mutationObserver.observe(this.el, {
|
|
118
|
-
childList: true,
|
|
119
|
-
subtree: true,
|
|
120
|
-
});
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
handleCollapsedSideEffects(isCollapsed) {
|
|
124
|
-
if (!isCollapsed) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
this.el.querySelectorAll('nv-sidebarnavitem[open]').forEach(navItem => {
|
|
128
|
-
navItem.open = false;
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
//#endregion METHODS
|
|
132
|
-
/****************************************************************************/
|
|
133
|
-
//#region WATCHERS
|
|
134
|
-
onActivePathChanged() {
|
|
135
|
-
this.setActiveNavItems();
|
|
136
|
-
}
|
|
137
|
-
//#endregion WATCHERS
|
|
138
|
-
/****************************************************************************/
|
|
139
|
-
//#region LIFECYCLE
|
|
140
|
-
componentWillLoad() {
|
|
141
|
-
this.setActiveNavItems();
|
|
142
|
-
this.setupMutationObserver();
|
|
143
|
-
this.handleCollapsedSideEffects(this.type === 'collapsible' && !this.open);
|
|
144
|
-
}
|
|
145
|
-
onOpenChanged(newValue, oldValue) {
|
|
146
|
-
this.handleCollapsedSideEffects(this.type === 'collapsible' && !newValue);
|
|
147
|
-
// Only emit event when open state actually changes (not on re-render with same value)
|
|
148
|
-
if (this.type === 'collapsible' && newValue !== oldValue) {
|
|
149
|
-
this.openChanged.emit(newValue);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
disconnectedCallback() {
|
|
153
|
-
if (this.mutationObserver) {
|
|
154
|
-
this.mutationObserver.disconnect();
|
|
155
|
-
}
|
|
156
|
-
if (this.pendingActiveUpdate) {
|
|
157
|
-
clearTimeout(this.pendingActiveUpdate);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
//#endregion LIFECYCLE
|
|
161
|
-
/****************************************************************************/
|
|
162
|
-
//#region RENDER
|
|
163
|
-
render() {
|
|
164
|
-
const isCollapsed = this.type === 'collapsible' && !this.open;
|
|
165
|
-
return (index.h(index.Host, { key: 'af78cae6f6cd895dbef098e549e63ac8baace243', role: "navigation", collapsed: isCollapsed ? true : undefined, "notification-intention": this.notificationIntention, "notification-emphasis": this.notificationEmphasis, "aria-expanded": this.type === 'collapsible' ? String(this.open) : undefined }, index.h("div", { key: '28a2ec38d36308d803362d361a243dc5c1b6083e', class: "nv-sidebar-container" }, index.h("slot", { key: 'c4d85987d256e89508392b6e28fdb74be9140ccb' })), this.type === 'collapsible' && (index.h("button", { key: 'a34c2b6a0be9b1bd494ac542db3ed096c81e32f9', class: "nv-sidebar-toggle", onClick: this.handleToggle, "aria-label": this.open ? 'Collapse sidebar' : 'Expand sidebar' }, index.h("nv-icon", { key: '8905351a55b339106a4c7bb5cf61582a98dd31a5', name: this.open
|
|
166
|
-
? 'layout-sidebar-left-collapse'
|
|
167
|
-
: 'layout-sidebar-right-collapse', size: "sm" })))));
|
|
168
|
-
}
|
|
169
|
-
get el() { return index.getElement(this); }
|
|
170
|
-
static get watchers() { return {
|
|
171
|
-
"activePath": ["onActivePathChanged"],
|
|
172
|
-
"open": ["onOpenChanged"]
|
|
173
|
-
}; }
|
|
174
|
-
};
|
|
175
|
-
NvSidebar.style = NvSidebarStyle0;
|
|
176
|
-
|
|
177
|
-
exports.nv_sidebar = NvSidebar;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('./index-CEKdYnmK.js');
|
|
4
|
-
require('react');
|
|
5
|
-
require('react-dom');
|
|
6
|
-
|
|
7
|
-
const nvSidebarcontentCss = "nv-sidebarcontent{display:flex;flex-direction:column;flex:1;overflow-y:auto;overflow-x:hidden}";
|
|
8
|
-
const NvSidebarcontentStyle0 = nvSidebarcontentCss;
|
|
9
|
-
|
|
10
|
-
const NvSidebarcontent = class {
|
|
11
|
-
constructor(hostRef) {
|
|
12
|
-
index.registerInstance(this, hostRef);
|
|
13
|
-
}
|
|
14
|
-
/****************************************************************************/
|
|
15
|
-
//#region RENDER
|
|
16
|
-
render() {
|
|
17
|
-
return (index.h(index.Host, { key: 'd960a2c2abe06db605980bf35d2c7cc74f4e0dba', role: "list" }, index.h("slot", { key: '7c0b0ad872d1afc279bfd9c9d381097207f055e2' })));
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
NvSidebarcontent.style = NvSidebarcontentStyle0;
|
|
21
|
-
|
|
22
|
-
exports.nv_sidebarcontent = NvSidebarcontent;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('./index-CEKdYnmK.js');
|
|
4
|
-
require('react');
|
|
5
|
-
require('react-dom');
|
|
6
|
-
|
|
7
|
-
const nvSidebardividerCss = "nv-sidebardivider{display:block;height:var(--sidebar-primary-separator-size);background-color:var(--color-content-low-border);margin:var(--spacing-2) 0}";
|
|
8
|
-
const NvSidebardividerStyle0 = nvSidebardividerCss;
|
|
9
|
-
|
|
10
|
-
const NvSidebardivider = class {
|
|
11
|
-
constructor(hostRef) {
|
|
12
|
-
index.registerInstance(this, hostRef);
|
|
13
|
-
}
|
|
14
|
-
/****************************************************************************/
|
|
15
|
-
//#region RENDER
|
|
16
|
-
render() {
|
|
17
|
-
return index.h(index.Host, { key: 'a4328b357b750232920c8b5e24e91503bba7e235', role: "separator", "aria-orientation": "horizontal" });
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
NvSidebardivider.style = NvSidebardividerStyle0;
|
|
21
|
-
|
|
22
|
-
exports.nv_sidebardivider = NvSidebardivider;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('./index-CEKdYnmK.js');
|
|
4
|
-
require('react');
|
|
5
|
-
require('react-dom');
|
|
6
|
-
|
|
7
|
-
const nvSidebarfooterCss = "nv-sidebarfooter{display:block;margin-top:auto}";
|
|
8
|
-
const NvSidebarfooterStyle0 = nvSidebarfooterCss;
|
|
9
|
-
|
|
10
|
-
const NvSidebarfooter = class {
|
|
11
|
-
constructor(hostRef) {
|
|
12
|
-
index.registerInstance(this, hostRef);
|
|
13
|
-
}
|
|
14
|
-
/****************************************************************************/
|
|
15
|
-
//#region RENDER
|
|
16
|
-
render() {
|
|
17
|
-
return (index.h(index.Host, { key: '73ce5246f93d982caf0d65f2cde8156dfbe565da' }, index.h("slot", { key: '92a297a59988ce6e70875eedd50227cdf011d4bf' })));
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
NvSidebarfooter.style = NvSidebarfooterStyle0;
|
|
21
|
-
|
|
22
|
-
exports.nv_sidebarfooter = NvSidebarfooter;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('./index-CEKdYnmK.js');
|
|
4
|
-
require('react');
|
|
5
|
-
require('react-dom');
|
|
6
|
-
|
|
7
|
-
const nvSidebargroupCss = "nv-sidebargroup{display:flex;flex-direction:column;gap:var(--spacing-1)}nv-sidebargroup .nv-sidebargroup-label{display:block;font-size:var(--font-size-sm);line-height:var(--line-height-sm);font-weight:var(--font-weight-medium-emphasis);color:var(--color-content-lower-text);letter-spacing:0;padding:var(--sidebar-primary-title-padding-y) var(--sidebar-primary-title-padding-x)}nv-sidebar[collapsed] nv-sidebargroup .nv-sidebargroup-label{display:none}";
|
|
8
|
-
const NvSidebargroupStyle0 = nvSidebargroupCss;
|
|
9
|
-
|
|
10
|
-
const NvSidebargroup = class {
|
|
11
|
-
constructor(hostRef) {
|
|
12
|
-
index.registerInstance(this, hostRef);
|
|
13
|
-
}
|
|
14
|
-
//#endregion PROPERTIES
|
|
15
|
-
/****************************************************************************/
|
|
16
|
-
//#region RENDER
|
|
17
|
-
render() {
|
|
18
|
-
return (index.h(index.Host, { key: 'c7b4e34d8237dc93adaa33f12d7cfda36a8ac269', role: "group", "aria-label": this.label }, this.label && index.h("div", { key: '7cafdf840b12c89604efda7895b764331c8054b7', class: "nv-sidebargroup-label" }, this.label), index.h("slot", { key: 'b6567a223f7cc05ce2874a632d38d6665c255659' })));
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
NvSidebargroup.style = NvSidebargroupStyle0;
|
|
22
|
-
|
|
23
|
-
exports.nv_sidebargroup = NvSidebargroup;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('./index-CEKdYnmK.js');
|
|
4
|
-
require('react');
|
|
5
|
-
require('react-dom');
|
|
6
|
-
|
|
7
|
-
const nvSidebarheaderCss = "nv-sidebarheader{display:block}";
|
|
8
|
-
const NvSidebarheaderStyle0 = nvSidebarheaderCss;
|
|
9
|
-
|
|
10
|
-
const NvSidebarheader = class {
|
|
11
|
-
constructor(hostRef) {
|
|
12
|
-
index.registerInstance(this, hostRef);
|
|
13
|
-
}
|
|
14
|
-
/****************************************************************************/
|
|
15
|
-
//#region RENDER
|
|
16
|
-
render() {
|
|
17
|
-
return (index.h(index.Host, { key: '42d91f8325df19e8208ab045a057657c97bf3ff4' }, index.h("slot", { key: '42b4e5952fd55b95fe2934297929cef3bd1b226c' })));
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
NvSidebarheader.style = NvSidebarheaderStyle0;
|
|
21
|
-
|
|
22
|
-
exports.nv_sidebarheader = NvSidebarheader;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('./index-CEKdYnmK.js');
|
|
4
|
-
require('react');
|
|
5
|
-
require('react-dom');
|
|
6
|
-
|
|
7
|
-
const nvSidebarlogoCss = "nv-sidebarlogo{display:block}nv-sidebarlogo .nv-sidebarlogo-container{display:flex;align-items:center;gap:var(--spacing-3)}nv-sidebarlogo .nv-sidebarlogo-full,nv-sidebarlogo .nv-sidebarlogo-collapsed{height:var(--spacing-8);width:auto;object-fit:contain}nv-sidebarlogo .nv-sidebarlogo-collapsed{display:none}nv-sidebarlogo .nv-sidebarlogo-title{font-size:var(--nv-sidebarlogo-font-size, var(--font-size-md));font-weight:var(--nv-sidebarlogo-font-weight, var(--font-weight-high-emphasis));font-family:var(--nv-sidebarlogo-font-family, inherit);color:var(--color-content-high-text);white-space:nowrap;overflow:hidden;transition:opacity 0.2s ease, max-width 0.3s ease, margin-left 0.3s ease;max-width:200px;opacity:1}nv-sidebar[collapsed] nv-sidebarlogo .nv-sidebarlogo-full{display:none}nv-sidebar[collapsed] nv-sidebarlogo .nv-sidebarlogo-collapsed{display:block}nv-sidebar[collapsed] nv-sidebarlogo .nv-sidebarlogo-title{max-width:0;opacity:0;margin-left:0}nv-sidebar[collapsed] nv-sidebarlogo .nv-sidebarlogo-container{justify-content:center;align-items:center;gap:0;width:100%;min-height:var(--spacing-12);padding:0}";
|
|
8
|
-
const NvSidebarlogoStyle0 = nvSidebarlogoCss;
|
|
9
|
-
|
|
10
|
-
const NvSidebarlogo = class {
|
|
11
|
-
constructor(hostRef) {
|
|
12
|
-
index.registerInstance(this, hostRef);
|
|
13
|
-
//#endregion PROPERTIES
|
|
14
|
-
/****************************************************************************/
|
|
15
|
-
//#region CONSTANTS
|
|
16
|
-
// Default Nova logo SVG (expanded - icon only, text comes from label prop)
|
|
17
|
-
this.defaultLogo = 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"%3E%3Cstyle%3E.cls-1{fill:%23f0801a;}%3C/style%3E%3Cpath class="cls-1" d="M25.71,2.13l-5.08,11.39c-.39.88-.38,1.92.13,2.73.74,1.17,2.19,1.59,3.42,1.07l14.26-6-3.14-2.27-10.89,4.66c-.15.06-.3-.09-.23-.24l4.34-9.31-2.81-2.03Z"/%3E%3Cpath class="cls-1" d="M4.29,10l9.22,8.4c.71.65,1.7.97,2.63.73,1.34-.34,2.2-1.58,2.09-2.91l-1.22-15.43-3.14,2.27,1.01,11.8c.01.16-.18.26-.3.15l-7.48-7.04-2.81,2.03Z"/%3E%3Cpath class="cls-1" d="M26.95,39.15l-2.59-12.2c-.2-.94-.82-1.78-1.71-2.13-1.29-.51-2.71,0-3.4,1.14l-8.01,13.24h3.87s6.07-10.18,6.07-10.18c.08-.14.3-.1.33.06l1.97,10.08h3.47Z"/%3E%3Cpath class="cls-1" d="M4.85,32.76l10.82-6.19c.83-.48,1.44-1.32,1.5-2.28.09-1.38-.83-2.58-2.13-2.89L0,17.82l1.2,3.68,11.54,2.67c.16.04.19.25.05.33l-9,4.96,1.07,3.3Z"/%3E%3Cpath class="cls-1" d="M40,20.11l-12.4-1.35c-.95-.1-1.94.22-2.56.96-.89,1.07-.84,2.58.03,3.58l10.08,11.74,1.2-3.69-7.77-8.94c-.11-.12,0-.32.16-.3l10.19,1.28,1.07-3.3Z"/%3E%3C/svg%3E';
|
|
18
|
-
// Default Nova icon (collapsed - same logo but will be displayed smaller)
|
|
19
|
-
this.defaultCollapsedLogo = 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"%3E%3Cstyle%3E.cls-1{fill:%23f0801a;}%3C/style%3E%3Cpath class="cls-1" d="M25.71,2.13l-5.08,11.39c-.39.88-.38,1.92.13,2.73.74,1.17,2.19,1.59,3.42,1.07l14.26-6-3.14-2.27-10.89,4.66c-.15.06-.3-.09-.23-.24l4.34-9.31-2.81-2.03Z"/%3E%3Cpath class="cls-1" d="M4.29,10l9.22,8.4c.71.65,1.7.97,2.63.73,1.34-.34,2.2-1.58,2.09-2.91l-1.22-15.43-3.14,2.27,1.01,11.8c.01.16-.18.26-.3.15l-7.48-7.04-2.81,2.03Z"/%3E%3Cpath class="cls-1" d="M26.95,39.15l-2.59-12.2c-.2-.94-.82-1.78-1.71-2.13-1.29-.51-2.71,0-3.4,1.14l-8.01,13.24h3.87s6.07-10.18,6.07-10.18c.08-.14.3-.1.33.06l1.97,10.08h3.47Z"/%3E%3Cpath class="cls-1" d="M4.85,32.76l10.82-6.19c.83-.48,1.44-1.32,1.5-2.28.09-1.38-.83-2.58-2.13-2.89L0,17.82l1.2,3.68,11.54,2.67c.16.04.19.25.05.33l-9,4.96,1.07,3.3Z"/%3E%3Cpath class="cls-1" d="M40,20.11l-12.4-1.35c-.95-.1-1.94.22-2.56.96-.89,1.07-.84,2.58.03,3.58l10.08,11.74,1.2-3.69-7.77-8.94c-.11-.12,0-.32.16-.3l10.19,1.28,1.07-3.3Z"/%3E%3C/svg%3E';
|
|
20
|
-
}
|
|
21
|
-
//#endregion CONSTANTS
|
|
22
|
-
/****************************************************************************/
|
|
23
|
-
//#region RENDER
|
|
24
|
-
render() {
|
|
25
|
-
const logoSrc = this.logo || this.defaultLogo;
|
|
26
|
-
const collapsedLogoSrc = this.collapsedLogo || this.defaultCollapsedLogo;
|
|
27
|
-
return (index.h(index.Host, { key: 'ec2aba08293e4def2fe083c311b69cafe005cf5e' }, index.h("div", { key: '3a24d832a0bb5aa44264fe1fc3091878556649bd', class: "nv-sidebarlogo-container" }, index.h("img", { key: 'a9a08e7c5dd51902d9ffbda0d9216a4ffb186756', src: logoSrc, alt: this.label || 'Logo', class: "nv-sidebarlogo-full" }), index.h("img", { key: 'daef311e11c8d5ee6b823a4896be36ea5bd696cc', src: collapsedLogoSrc, alt: this.label || 'Logo', class: "nv-sidebarlogo-collapsed" }), this.label && index.h("span", { key: '9685e4c110e7bb7356f5d49b615105033a32a736', class: "nv-sidebarlogo-title" }, this.label))));
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
NvSidebarlogo.style = NvSidebarlogoStyle0;
|
|
31
|
-
|
|
32
|
-
exports.nv_sidebarlogo = NvSidebarlogo;
|
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('./index-CEKdYnmK.js');
|
|
4
|
-
require('react');
|
|
5
|
-
require('react-dom');
|
|
6
|
-
|
|
7
|
-
const nvSidebarnavitemCss = "nv-sidebarnavitem{display:flex;flex-direction:column;gap:0}nv-sidebarnavitem .nv-sidebarnavitem-trigger{display:flex;align-items:center;gap:var(--sidebar-primary-item-gap-x);padding:var(--sidebar-primary-item-padding-y) var(--sidebar-primary-item-padding-x);border-radius:var(--sidebar-primary-item-radius);cursor:pointer;transition:all 0.15s ease;font-size:var(--sidebar-primary-item-font-size);font-weight:var(--font-weight-medium-emphasis);color:var(--color-content-low-text);background:var(--color-interaction-container-neutral-background);text-decoration:none;--nv-component-background:var(--color-interaction-container-neutral-background);--nv-sidebarnavitem-background:var(--color-interaction-container-neutral-background)}nv-sidebarnavitem .nv-sidebarnavitem-trigger:hover{background-color:var(--color-interaction-container-neutral-background-hover);color:var(--color-content-medium-text);--nv-component-background:var(--color-interaction-container-neutral-background-hover);--nv-sidebarnavitem-background:var(--color-interaction-container-neutral-background-hover)}nv-sidebarnavitem .nv-sidebarnavitem-trigger:focus,nv-sidebarnavitem .nv-sidebarnavitem-trigger:focus-within{outline:none}nv-sidebarnavitem .nv-sidebarnavitem-trigger:focus-visible,nv-sidebarnavitem .nv-sidebarnavitem-trigger:has(:focus-visible){outline:calc(var(--focus-outline-stroke) * 1) solid var(--color-focus-brand);outline-offset:calc(var(--focus-outline-offset) * 1)}nv-sidebarnavitem[active] .nv-sidebarnavitem-trigger{background-color:var(--color-interaction-container-neutral-background-active);color:var(--color-interaction-container-neutral-text-active);font-weight:var(--font-weight-medium-emphasis);--nv-component-background:var(--color-interaction-container-neutral-background-active);--nv-sidebarnavitem-background:var(--color-interaction-container-neutral-background-active)}nv-sidebarnavitem .nv-sidebarnavitem-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;color:inherit;width:var(--sidebar-primary-item-icon-size);height:var(--sidebar-primary-item-icon-size);position:relative}nv-sidebar[collapsed] nv-sidebarnavitem .nv-sidebarnavitem-icon{overflow:visible;margin:0;justify-content:center}nv-sidebar[collapsed] nv-sidebarnavitem .nv-sidebarnavitem-icon nv-notification-bullet{position:absolute;transform:translate(50%, -50%);z-index:1;--sidebar-primary-notification-bullet-size-reduced:calc(\n var(--sidebar-primary-item-icon-size) * 0.4\n )}nv-sidebarnavitem .nv-sidebarnavitem-content{flex:1;display:flex;align-items:center}nv-sidebarnavitem .nv-sidebarnavitem-content a{color:inherit !important;text-decoration:none !important;font-weight:var(--font-weight-medium-emphasis) !important;flex:1}nv-sidebarnavitem .nv-sidebarnavitem-trailing{display:flex;align-items:center;gap:var(--spacing-2);margin-left:auto}nv-sidebarnavitem .nv-sidebarnavitem-chevron{transition:transform 0.2s ease;color:inherit}nv-sidebarnavitem[open] .nv-sidebarnavitem-chevron{transform:rotate(180deg)}nv-sidebarnavitem .nv-sidebarnavitem-subitems{display:flex;flex-direction:column;gap:0;max-height:0;overflow:hidden;opacity:0;transition:max-height 0.3s ease, opacity 0.2s ease;padding-left:0}nv-sidebarnavitem[open] .nv-sidebarnavitem-subitems{opacity:1;margin-top:var(--spacing-1)}nv-sidebar[collapsed] nv-sidebarnavitem .nv-sidebarnavitem-trigger{justify-content:center;gap:0;width:100%}nv-sidebar[collapsed] nv-sidebarnavitem .nv-sidebarnavitem-content{display:none}nv-sidebar[collapsed] nv-sidebarnavitem .nv-sidebarnavitem-trailing,nv-sidebar[collapsed] nv-sidebarnavitem .nv-sidebarnavitem-chevron{display:none}";
|
|
8
|
-
const NvSidebarnavitemStyle0 = nvSidebarnavitemCss;
|
|
9
|
-
|
|
10
|
-
const NvSidebarnavitem = class {
|
|
11
|
-
constructor(hostRef) {
|
|
12
|
-
index.registerInstance(this, hostRef);
|
|
13
|
-
/**
|
|
14
|
-
* Whether this item represents the active/current page.
|
|
15
|
-
* Can be set automatically when a sub-item becomes active.
|
|
16
|
-
*/
|
|
17
|
-
this.active = false;
|
|
18
|
-
/**
|
|
19
|
-
* Whether this item can be collapsed/expanded (has sub-items).
|
|
20
|
-
*/
|
|
21
|
-
this.collapsible = false;
|
|
22
|
-
/**
|
|
23
|
-
* Whether the collapsible item is currently open (showing sub-items).
|
|
24
|
-
*/
|
|
25
|
-
this.open = false;
|
|
26
|
-
//#endregion PROPERTIES
|
|
27
|
-
/****************************************************************************/
|
|
28
|
-
//#region STATE
|
|
29
|
-
this.hasSubitems = false;
|
|
30
|
-
this.isSidebarCollapsed = false;
|
|
31
|
-
this.wasActiveFromSubitem = false; // Track if active was set by subitem logic
|
|
32
|
-
//#endregion STATE
|
|
33
|
-
/****************************************************************************/
|
|
34
|
-
//#region METHODS
|
|
35
|
-
this.handleToggle = (event) => {
|
|
36
|
-
// Ignore clicks that originated from subitems (they bubble up but shouldn't toggle)
|
|
37
|
-
const target = event.target;
|
|
38
|
-
if (target.closest('nv-sidebarnavsubitem')) {
|
|
39
|
-
return; // Let the subitem's link handle navigation normally
|
|
40
|
-
}
|
|
41
|
-
// In collapsed sidebar mode, navigate to the main link instead of toggling
|
|
42
|
-
if (this.isSidebarCollapsed) {
|
|
43
|
-
// Find the first link that is NOT inside subitems
|
|
44
|
-
const link = this.el.querySelector('.nv-sidebarnavitem-content a, :scope > a');
|
|
45
|
-
if (link === null || link === void 0 ? void 0 : link.href) {
|
|
46
|
-
// Check if click was directly on the link - if so, let it handle naturally
|
|
47
|
-
if (target.closest('a')) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
// Trigger navigation by clicking the link programmatically
|
|
51
|
-
link.click();
|
|
52
|
-
}
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
// Only handle toggle for collapsible items when sidebar is expanded
|
|
56
|
-
if (this.collapsible) {
|
|
57
|
-
event.preventDefault();
|
|
58
|
-
event.stopPropagation();
|
|
59
|
-
this.open = !this.open;
|
|
60
|
-
}
|
|
61
|
-
// For non-collapsible items in expanded mode, let the link handle the navigation
|
|
62
|
-
// Don't prevent default or stop propagation - allow the link to work normally
|
|
63
|
-
};
|
|
64
|
-
this.isAnimating = false;
|
|
65
|
-
this.hasInitializedHeight = false;
|
|
66
|
-
/** Tracks the last open state that was animated to, to prevent redundant animations */
|
|
67
|
-
this.lastAnimatedOpenState = null;
|
|
68
|
-
this.updateSubitemsHeight = (force = false) => {
|
|
69
|
-
if (!this.subitemsRef)
|
|
70
|
-
return;
|
|
71
|
-
// Skip animation if we're already in the target state (prevents animation on active change)
|
|
72
|
-
// Only animate if:
|
|
73
|
-
// 1. forced (explicit toggle by user via @Watch)
|
|
74
|
-
// 2. OR this is the first animation (lastAnimatedOpenState is null)
|
|
75
|
-
// 3. OR the open state has actually changed since last animation
|
|
76
|
-
if (!force &&
|
|
77
|
-
this.lastAnimatedOpenState !== null &&
|
|
78
|
-
this.lastAnimatedOpenState === this.open) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
// Don't re-animate if already animating and not forced
|
|
82
|
-
if (this.isAnimating && !force) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
this.isAnimating = true;
|
|
86
|
-
this.lastAnimatedOpenState = this.open;
|
|
87
|
-
if (this.open) {
|
|
88
|
-
// Calculate real height and animate to it
|
|
89
|
-
this.subitemsRef.style.transition = 'none';
|
|
90
|
-
this.subitemsRef.style.maxHeight = '0px';
|
|
91
|
-
requestAnimationFrame(() => {
|
|
92
|
-
if (this.subitemsRef) {
|
|
93
|
-
this.subitemsRef.style.transition =
|
|
94
|
-
'max-height 0.3s ease, opacity 0.2s ease';
|
|
95
|
-
this.subitemsRef.style.maxHeight =
|
|
96
|
-
this.subitemsRef.scrollHeight + 'px';
|
|
97
|
-
// Reset animation flag after animation completes
|
|
98
|
-
setTimeout(() => {
|
|
99
|
-
this.isAnimating = false;
|
|
100
|
-
}, 300); // Match animation duration
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
// Animate to 0
|
|
106
|
-
this.subitemsRef.style.transition = 'none';
|
|
107
|
-
this.subitemsRef.style.maxHeight = this.subitemsRef.scrollHeight + 'px';
|
|
108
|
-
requestAnimationFrame(() => {
|
|
109
|
-
if (this.subitemsRef) {
|
|
110
|
-
this.subitemsRef.style.transition =
|
|
111
|
-
'max-height 0.3s ease, opacity 0.2s ease';
|
|
112
|
-
this.subitemsRef.style.maxHeight = '0px';
|
|
113
|
-
// Reset animation flag after animation completes
|
|
114
|
-
setTimeout(() => {
|
|
115
|
-
this.isAnimating = false;
|
|
116
|
-
}, 300); // Match animation duration
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
this.checkSidebarCollapsed = () => {
|
|
122
|
-
var _a;
|
|
123
|
-
const sidebar = this.el.closest('nv-sidebar');
|
|
124
|
-
const wasCollapsed = this.isSidebarCollapsed;
|
|
125
|
-
this.isSidebarCollapsed = (_a = sidebar === null || sidebar === void 0 ? void 0 : sidebar.hasAttribute('collapsed')) !== null && _a !== void 0 ? _a : false;
|
|
126
|
-
// When sidebar collapse state changes, update active state based on subitems
|
|
127
|
-
if (wasCollapsed !== this.isSidebarCollapsed) {
|
|
128
|
-
this.updateActiveFromSubitems();
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
/**
|
|
132
|
-
* Checks if any sub-item is active and updates parent active state.
|
|
133
|
-
* - When sidebar is collapsed: if a sub-item is active, parent should be active
|
|
134
|
-
* - When sidebar is expanded: if a sub-item is active AND parent is not open, parent should be active
|
|
135
|
-
* (because sub-items are hidden, we need to indicate the parent contains an active child)
|
|
136
|
-
*/
|
|
137
|
-
this.updateActiveFromSubitems = () => {
|
|
138
|
-
if (!this.hasSubitems)
|
|
139
|
-
return;
|
|
140
|
-
// Find all sub-items
|
|
141
|
-
const subItems = Array.from(this.el.querySelectorAll('nv-sidebarnavsubitem'));
|
|
142
|
-
// Check if any sub-item is active
|
|
143
|
-
const hasActiveSubitem = subItems.some(subItem => subItem.active);
|
|
144
|
-
if (this.isSidebarCollapsed) {
|
|
145
|
-
// When sidebar is collapsed AND a sub-item is active, make parent active
|
|
146
|
-
if (hasActiveSubitem) {
|
|
147
|
-
this.active = true;
|
|
148
|
-
this.wasActiveFromSubitem = true;
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
// When collapsed and no sub-item is active, remove active state only if we set it
|
|
152
|
-
if (this.wasActiveFromSubitem) {
|
|
153
|
-
this.active = false;
|
|
154
|
-
this.wasActiveFromSubitem = false;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
// When sidebar is expanded
|
|
160
|
-
if (hasActiveSubitem && !this.open) {
|
|
161
|
-
// If a sub-item is active AND parent is not open (sub-items hidden),
|
|
162
|
-
// make parent active to indicate it contains an active child
|
|
163
|
-
this.active = true;
|
|
164
|
-
this.wasActiveFromSubitem = true;
|
|
165
|
-
}
|
|
166
|
-
else if (hasActiveSubitem && this.open) {
|
|
167
|
-
// If a sub-item is active BUT parent is open (sub-items visible),
|
|
168
|
-
// remove active state from parent (only sub-item should be active)
|
|
169
|
-
if (this.wasActiveFromSubitem) {
|
|
170
|
-
this.active = false;
|
|
171
|
-
this.wasActiveFromSubitem = false;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
// No active sub-item, remove active state if we set it
|
|
176
|
-
if (this.wasActiveFromSubitem) {
|
|
177
|
-
this.active = false;
|
|
178
|
-
this.wasActiveFromSubitem = false;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
// Note: activePath logic in nv-sidebar can also manage parent active state
|
|
182
|
-
// (when parent href matches activePath exactly)
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
//#endregion METHODS
|
|
187
|
-
/****************************************************************************/
|
|
188
|
-
//#region LIFECYCLE
|
|
189
|
-
componentWillLoad() {
|
|
190
|
-
// Check if there are sub-items in any slot
|
|
191
|
-
const subItems = Array.from(this.el.children).filter(child => child.tagName.toLowerCase() === 'nv-sidebarnavsubitem');
|
|
192
|
-
this.hasSubitems = subItems.length > 0;
|
|
193
|
-
// Move sub-items to the subitems slot
|
|
194
|
-
if (this.hasSubitems) {
|
|
195
|
-
subItems.forEach(item => {
|
|
196
|
-
item.setAttribute('slot', 'subitems');
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
// Check sidebar collapsed state
|
|
200
|
-
this.checkSidebarCollapsed();
|
|
201
|
-
// Watch for sidebar state changes
|
|
202
|
-
const sidebar = this.el.closest('nv-sidebar');
|
|
203
|
-
if (sidebar) {
|
|
204
|
-
this.mutationObserver = new MutationObserver(() => {
|
|
205
|
-
this.checkSidebarCollapsed();
|
|
206
|
-
});
|
|
207
|
-
this.mutationObserver.observe(sidebar, {
|
|
208
|
-
attributes: true,
|
|
209
|
-
attributeFilter: ['collapsed'],
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
// Watch for sub-items active state changes
|
|
213
|
-
if (this.hasSubitems) {
|
|
214
|
-
// Observe the subitems container for changes (including new sub-items being added)
|
|
215
|
-
// Using subtree: true to catch all attribute changes in descendants
|
|
216
|
-
const subitemsContainer = this.el.querySelector('.nv-sidebarnavitem-subitems');
|
|
217
|
-
if (subitemsContainer) {
|
|
218
|
-
this.subitemsMutationObserver = new MutationObserver(() => {
|
|
219
|
-
this.updateActiveFromSubitems();
|
|
220
|
-
});
|
|
221
|
-
// Observe the container for child list changes and attribute changes in descendants
|
|
222
|
-
this.subitemsMutationObserver.observe(subitemsContainer, {
|
|
223
|
-
childList: true,
|
|
224
|
-
subtree: true,
|
|
225
|
-
attributes: true,
|
|
226
|
-
attributeFilter: ['active'],
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
// If container doesn't exist yet (not collapsible or not rendered), observe the element itself
|
|
231
|
-
// This handles cases where sub-items are direct children
|
|
232
|
-
this.subitemsMutationObserver = new MutationObserver(() => {
|
|
233
|
-
this.updateActiveFromSubitems();
|
|
234
|
-
});
|
|
235
|
-
this.subitemsMutationObserver.observe(this.el, {
|
|
236
|
-
childList: true,
|
|
237
|
-
subtree: true,
|
|
238
|
-
attributes: true,
|
|
239
|
-
attributeFilter: ['active'],
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
// Initial check for active subitems
|
|
244
|
-
this.updateActiveFromSubitems();
|
|
245
|
-
}
|
|
246
|
-
disconnectedCallback() {
|
|
247
|
-
if (this.mutationObserver) {
|
|
248
|
-
this.mutationObserver.disconnect();
|
|
249
|
-
}
|
|
250
|
-
if (this.subitemsMutationObserver) {
|
|
251
|
-
this.subitemsMutationObserver.disconnect();
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
//#endregion LIFECYCLE
|
|
255
|
-
/****************************************************************************/
|
|
256
|
-
//#region WATCHERS
|
|
257
|
-
onOpenChanged(newValue, oldValue) {
|
|
258
|
-
// Only animate if the value actually changed (prevents false triggers from React re-renders)
|
|
259
|
-
if (newValue === oldValue) {
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
// Force update when open state changes (user clicked toggle)
|
|
263
|
-
this.updateSubitemsHeight(true);
|
|
264
|
-
// Update active state based on subitems when open state changes
|
|
265
|
-
this.updateActiveFromSubitems();
|
|
266
|
-
}
|
|
267
|
-
//#endregion WATCHERS
|
|
268
|
-
/****************************************************************************/
|
|
269
|
-
//#region RENDER
|
|
270
|
-
render() {
|
|
271
|
-
const showNotificationBullet = this.notificationCount !== undefined && this.notificationCount > 0;
|
|
272
|
-
const notificationSize = this.isSidebarCollapsed ? 'reduced' : 'default';
|
|
273
|
-
return (index.h(index.Host, { key: 'c0c9c63cb295441389b5ced9a4b0a0d5a1af99cd', role: "listitem" }, index.h("div", { key: '6673c3f4c14762bff8512ecc430febddfa74b307', class: "nv-sidebarnavitem-trigger", onClick: this.handleToggle, "aria-expanded": this.collapsible ? String(this.open) : undefined, "aria-current": this.active && !this.collapsible ? 'page' : undefined }, this.icon && (index.h("div", { key: '25f703e9fb7375b8b562be54f080120ae037dd9f', class: "nv-sidebarnavitem-icon" }, index.h("nv-icon", { key: '1a4e345c90afcec159890db6c6b0e22d53dd673d', name: this.icon, size: "md" }), showNotificationBullet && this.isSidebarCollapsed && (index.h("nv-notification-bullet", { key: '15b69d1a2325daed7d6583ed10906fe4e91809e5', count: this.notificationCount, size: notificationSize, contrastingBorder: true })))), index.h("div", { key: 'c717c09f39eab07616de419a35b11a5b7dfce5d1', class: "nv-sidebarnavitem-content" }, index.h("slot", { key: '9f8687f151fd082a6737e7fbe6036cc3ebff3cc2' })), index.h("div", { key: 'b2c3d7a4c30ce96273731a05a1d361f5654582de', class: "nv-sidebarnavitem-trailing" }, index.h("slot", { key: 'acf2dddbbbc7d2e83703c731a244237e0dc81153', name: "trailing" }), showNotificationBullet && !this.isSidebarCollapsed && (index.h("nv-notification-bullet", { key: 'adca5c7418a3b58afa5ef21ddd3fa9b2d880a56c', count: this.notificationCount, size: notificationSize })), this.collapsible && (index.h("nv-icon", { key: 'a4a4369d4ba76f567cca439d1b4c7e95ad5ba98c', name: "chevron-down", size: "sm", class: "nv-sidebarnavitem-chevron" })))), this.collapsible && this.hasSubitems && (index.h("div", { key: '2d4fadb0b547eb369a702bb8210b3312dde505b2', class: "nv-sidebarnavitem-subitems", ref: el => {
|
|
274
|
-
// Only update ref and initialize if element changed or not yet initialized
|
|
275
|
-
if (el !== this.subitemsRef) {
|
|
276
|
-
this.subitemsRef = el;
|
|
277
|
-
if (el && !this.hasInitializedHeight) {
|
|
278
|
-
// Initialize height only on first mount, not on re-renders
|
|
279
|
-
this.hasInitializedHeight = true;
|
|
280
|
-
requestAnimationFrame(() => {
|
|
281
|
-
// Only animate if item is open, otherwise it will animate when opened
|
|
282
|
-
if (this.open) {
|
|
283
|
-
this.updateSubitemsHeight();
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
} }, index.h("slot", { key: 'f0ffb970aa2d84580205ba110858d3f1c27875a3', name: "subitems" })))));
|
|
289
|
-
}
|
|
290
|
-
get el() { return index.getElement(this); }
|
|
291
|
-
static get watchers() { return {
|
|
292
|
-
"open": ["onOpenChanged"]
|
|
293
|
-
}; }
|
|
294
|
-
};
|
|
295
|
-
NvSidebarnavitem.style = NvSidebarnavitemStyle0;
|
|
296
|
-
|
|
297
|
-
exports.nv_sidebarnavitem = NvSidebarnavitem;
|