@nuralyui/menu 0.0.18 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/bundle.js +400 -2
  2. package/package.json +1 -1
package/bundle.js CHANGED
@@ -1,4 +1,323 @@
1
- import{css as e,LitElement as n,html as t,nothing as r}from"lit";import{property as i,customElement as o}from"lit/decorators.js";import{NuralyUIBaseMixin as s}from"@nuralyui/common/mixins";const a=[e`:host{display:block}.menu-root{font-size:var(--nuraly-menu-font-size);font-family:var(--nuraly-menu-font-family);font-weight:var(--nuraly-menu-font-weight);line-height:var(--nuraly-menu-line-height);list-style:none;margin:0;padding:0}.menu-link{list-style:none;display:flex;align-items:center;cursor:pointer;padding:var(--nuraly-menu-link-padding-vertical) var(--nuraly-menu-link-padding-horizontal);color:var(--nuraly-menu-link-color);background-color:var(--nuraly-menu-link-background-color);border-left:4px solid transparent;border-top:2px solid transparent;border-right:2px solid transparent;border-bottom:2px solid transparent;border-radius:var(--nuraly-menu-border-radius);transition:background-color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing),color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing),border-color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing)}.menu-link.disabled{color:var(--nuraly-menu-disabled-link-color);cursor:not-allowed;opacity:.6}.menu-link:not(.disabled):not(.selected):hover{background-color:var(--nuraly-menu-hover-link-background-color);color:var(--nuraly-menu-hover-link-color)}.menu-link.selected{background-color:var(--nuraly-menu-selected-link-background-color);color:var(--nuraly-menu-selected-color);border-left:var(--nuraly-menu-selected-link-border)}.menu-link:not(.disabled):not(.selected):focus{outline:0;border-left:4px solid transparent;border-top:var(--nuraly-menu-focus-border);border-right:var(--nuraly-menu-focus-border);border-bottom:var(--nuraly-menu-focus-border);color:var(--nuraly-menu-focus-color)}.menu-link.selected:not(.disabled):focus{outline:0;border-left:var(--nuraly-menu-selected-link-border);border-top:var(--nuraly-menu-focus-border);border-right:var(--nuraly-menu-focus-border);border-bottom:var(--nuraly-menu-focus-border);color:var(--nuraly-menu-focus-color)}.menu-link:not(.disabled):focus-visible{outline:0;border-top:var(--nuraly-menu-focus-border);border-right:var(--nuraly-menu-focus-border);border-bottom:var(--nuraly-menu-focus-border)}.menu-link:not(.disabled):not(.selected):focus-visible{border-left:var(--nuraly-menu-focus-border);color:var(--nuraly-menu-focus-color)}.menu-link.selected:not(.disabled):focus-visible{border-left:var(--nuraly-menu-selected-link-border)!important;color:var(--nuraly-menu-focus-color)}.menu-link:not(.disabled):not(.selected):active{color:var(--nuraly-menu-active-color);background-color:var(--nuraly-menu-active-background-color)}.menu-link.selected:not(.disabled):active{background-color:var(--nuraly-menu-active-background-color);color:var(--nuraly-menu-active-color);border-left:var(--nuraly-menu-selected-link-border)!important;border-top:2px solid transparent;border-right:2px solid transparent;border-bottom:2px solid transparent}.menu-link .action-text-container{width:100%;display:flex;justify-content:space-between;align-items:center;position:relative}.menu-link .text-container{flex:1;min-width:0}.menu-link nr-icon{display:flex;align-items:center;--nuraly-icon-color:var(--nuraly-menu-link-icon-color)}.menu-link nr-icon:first-child{padding-right:var(--nuraly-menu-icon-padding-right);padding-left:var(--nuraly-menu-icon-padding-left)}.sub-menu{display:flex;flex-direction:column;padding-left:0;list-style:none;color:var(--nuraly-sub-menu-color)}.sub-menu.disabled .sub-menu-header{color:var(--nuraly-sub-menu-disabled-color);cursor:not-allowed;opacity:.6}.sub-menu.highlighted .sub-menu-header{background-color:var(--nuraly-sub-menu-highlighted-background-color);color:var(--nuraly-sub-menu-highlighted-color)}.sub-menu .sub-menu-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer;padding:var(--nuraly-sub-menu-padding-vertical) var(--nuraly-sub-menu-padding-horizontal);border-left:4px solid transparent;border-top:2px solid transparent;border-right:2px solid transparent;border-bottom:2px solid transparent;border-radius:var(--nuraly-menu-border-radius);transition:background-color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing),color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing),border-color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing)}.sub-menu .sub-menu-header span{flex:1;min-width:0;padding-left:var(--nuraly-sub-menu-icon-padding-right)}.sub-menu .text-icon{flex-shrink:0}.sub-menu .icons-container{display:flex;align-items:center;gap:var(--nuraly-sub-menu-icon-padding-right);position:relative;flex-shrink:0;min-width:fit-content;height:100%;min-height:24px}.menu-link .icon-container{display:flex;align-items:center;position:relative;flex-shrink:0;height:100%;min-height:24px}.menu-link nr-dropdown,.sub-menu nr-dropdown{display:inline-flex;flex-shrink:0;flex-grow:0;align-items:center;vertical-align:middle}.menu-link .action-icon,.sub-menu .action-icon{flex-shrink:0;cursor:pointer}.sub-menu .action-icon{--nuraly-icon-color:var(--nuraly-sub-menu-action-icon-color)}.sub-menu .status-icon{--nuraly-icon-color:var(--nuraly-sub-menu-status-icon-color)}.sub-menu .text-icon{--nuraly-icon-color:var(--nuraly-sub-menu-text-icon-color)}.sub-menu #toggle-icon{--nuraly-icon-color:var(--nuraly-sub-menu-toggle-icon-color)}.sub-menu:not(.disabled):not(.selected) .sub-menu-header:focus{outline:0;border-left:4px solid transparent;border-top:var(--nuraly-sub-menu-focus-border);border-right:var(--nuraly-sub-menu-focus-border);border-bottom:var(--nuraly-sub-menu-focus-border);color:var(--nuraly-sub-menu-focus-color)}.sub-menu.selected:not(.disabled) .sub-menu-header:focus{outline:0;border-left:var(--nuraly-menu-selected-link-border);border-top:var(--nuraly-sub-menu-focus-border);border-right:var(--nuraly-sub-menu-focus-border);border-bottom:var(--nuraly-sub-menu-focus-border);color:var(--nuraly-sub-menu-focus-color)}.sub-menu:not(.disabled) .sub-menu-header:focus-visible{outline:0;border-top:var(--nuraly-sub-menu-focus-border);border-right:var(--nuraly-sub-menu-focus-border);border-bottom:var(--nuraly-sub-menu-focus-border)}.sub-menu:not(.disabled):not(.selected) .sub-menu-header:focus-visible{border-left:var(--nuraly-sub-menu-focus-border);color:var(--nuraly-sub-menu-focus-color)}.sub-menu.selected:not(.disabled) .sub-menu-header:focus-visible{border-left:var(--nuraly-menu-selected-link-border)!important;color:var(--nuraly-sub-menu-focus-color)}.sub-menu:not(.disabled) .sub-menu-header:hover{background-color:var(--nuraly-sub-menu-hover-background-color);color:var(--nuraly-sub-menu-hover-color)}.sub-menu.selected:not(.disabled) .sub-menu-header{background-color:var(--nuraly-menu-selected-link-background-color);color:var(--nuraly-menu-selected-color);border-left:var(--nuraly-menu-selected-link-border);border-top:2px solid transparent;border-right:2px solid transparent;border-bottom:2px solid transparent}.sub-menu.selected:not(.disabled) .sub-menu-header:active{background-color:var(--nuraly-sub-menu-active-background-color);color:var(--nuraly-sub-menu-active-color);border-left:var(--nuraly-menu-selected-link-border);border-top:2px solid transparent;border-right:2px solid transparent;border-bottom:2px solid transparent}.sub-menu:not(.disabled):not(.selected) .sub-menu-header:active{background-color:var(--nuraly-sub-menu-active-background-color);color:var(--nuraly-sub-menu-active-color)}.sub-menu-children{padding-left:var(--nuraly-sub-menu-nested-padding-left)}.menu--small .menu-link{padding:var(--nuraly-menu-link-padding-vertical-small) var(--nuraly-menu-link-padding-horizontal-small)}.menu--small .sub-menu .sub-menu-header{padding:var(--nuraly-sub-menu-padding-vertical-small) var(--nuraly-sub-menu-padding-horizontal-small)}.menu--medium .menu-link{padding:var(--nuraly-menu-link-padding-vertical-medium) var(--nuraly-menu-link-padding-horizontal-medium)}.menu--medium .sub-menu .sub-menu-header{padding:var(--nuraly-sub-menu-padding-vertical-medium) var(--nuraly-sub-menu-padding-horizontal-medium)}.menu--large .menu-link{padding:var(--nuraly-menu-link-padding-vertical-large) var(--nuraly-menu-link-padding-horizontal-large)}.menu--large .sub-menu .sub-menu-header{padding:var(--nuraly-sub-menu-padding-vertical-large) var(--nuraly-sub-menu-padding-horizontal-large)}`];
1
+ import{css as e,LitElement as n,html as t,nothing as r}from"lit";import{property as i,customElement as o}from"lit/decorators.js";import{NuralyUIBaseMixin as s}from"@nuralyui/common/mixins";const a=[e`
2
+ /* Root menu container */
3
+ :host {
4
+ display: block;
5
+ }
6
+
7
+ .menu-root {
8
+ font-size: var(--nuraly-menu-font-size);
9
+ font-family: var(--nuraly-menu-font-family);
10
+ font-weight: var(--nuraly-menu-font-weight);
11
+ line-height: var(--nuraly-menu-line-height);
12
+ list-style: none;
13
+ margin: 0;
14
+ padding: 0;
15
+ }
16
+
17
+ /* Menu Link Styles */
18
+ .menu-link {
19
+ list-style: none;
20
+ display: flex;
21
+ align-items: center;
22
+ cursor: pointer;
23
+ padding: var(--nuraly-menu-link-padding-vertical) var(--nuraly-menu-link-padding-horizontal);
24
+ color: var(--nuraly-menu-link-color);
25
+ background-color: var(--nuraly-menu-link-background-color);
26
+ border-left: 4px solid transparent;
27
+ border-top: 2px solid transparent;
28
+ border-right: 2px solid transparent;
29
+ border-bottom: 2px solid transparent;
30
+ border-radius: var(--nuraly-menu-border-radius);
31
+ transition: background-color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing),
32
+ color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing),
33
+ border-color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing);
34
+ }
35
+
36
+ .menu-link.disabled {
37
+ color: var(--nuraly-menu-disabled-link-color);
38
+ cursor: not-allowed;
39
+ opacity: 0.6;
40
+ }
41
+
42
+ .menu-link:not(.disabled):not(.selected):hover {
43
+ background-color: var(--nuraly-menu-hover-link-background-color);
44
+ color: var(--nuraly-menu-hover-link-color);
45
+ }
46
+
47
+ .menu-link.selected {
48
+ background-color: var(--nuraly-menu-selected-link-background-color);
49
+ color: var(--nuraly-menu-selected-color);
50
+ border-left: var(--nuraly-menu-selected-link-border);
51
+ }
52
+
53
+ .menu-link:not(.disabled):not(.selected):focus {
54
+ outline: none;
55
+ border-left: 4px solid transparent;
56
+ border-top: var(--nuraly-menu-focus-border);
57
+ border-right: var(--nuraly-menu-focus-border);
58
+ border-bottom: var(--nuraly-menu-focus-border);
59
+ color: var(--nuraly-menu-focus-color);
60
+ }
61
+
62
+ .menu-link.selected:not(.disabled):focus {
63
+ outline: none;
64
+ border-left: var(--nuraly-menu-selected-link-border);
65
+ border-top: var(--nuraly-menu-focus-border);
66
+ border-right: var(--nuraly-menu-focus-border);
67
+ border-bottom: var(--nuraly-menu-focus-border);
68
+ color: var(--nuraly-menu-focus-color);
69
+ }
70
+
71
+ /* Focus-visible for keyboard navigation */
72
+ .menu-link:not(.disabled):focus-visible {
73
+ outline: none;
74
+ border-top: var(--nuraly-menu-focus-border);
75
+ border-right: var(--nuraly-menu-focus-border);
76
+ border-bottom: var(--nuraly-menu-focus-border);
77
+ }
78
+
79
+ .menu-link:not(.disabled):not(.selected):focus-visible {
80
+ border-left: var(--nuraly-menu-focus-border);
81
+ color: var(--nuraly-menu-focus-color);
82
+ }
83
+
84
+ .menu-link.selected:not(.disabled):focus-visible {
85
+ border-left: var(--nuraly-menu-selected-link-border) !important;
86
+ color: var(--nuraly-menu-focus-color);
87
+ }
88
+
89
+ .menu-link:not(.disabled):not(.selected):active {
90
+ color: var(--nuraly-menu-active-color);
91
+ background-color: var(--nuraly-menu-active-background-color);
92
+ }
93
+
94
+ .menu-link.selected:not(.disabled):active {
95
+ background-color: var(--nuraly-menu-active-background-color);
96
+ color: var(--nuraly-menu-active-color);
97
+ border-left: var(--nuraly-menu-selected-link-border) !important;
98
+ border-top: 2px solid transparent;
99
+ border-right: 2px solid transparent;
100
+ border-bottom: 2px solid transparent;
101
+ }
102
+
103
+ .menu-link .action-text-container {
104
+ width: 100%;
105
+ display: flex;
106
+ justify-content: space-between;
107
+ align-items: center;
108
+ position: relative;
109
+ }
110
+
111
+ .menu-link .text-container {
112
+ flex: 1;
113
+ min-width: 0;
114
+ }
115
+
116
+ .menu-link nr-icon {
117
+ display: flex;
118
+ align-items: center;
119
+ --nuraly-icon-color: var(--nuraly-menu-link-icon-color);
120
+ }
121
+
122
+ .menu-link nr-icon:first-child {
123
+ padding-right: var(--nuraly-menu-icon-padding-right);
124
+ padding-left: var(--nuraly-menu-icon-padding-left);
125
+ }
126
+
127
+ /* Sub Menu Styles */
128
+ .sub-menu {
129
+ display: flex;
130
+ flex-direction: column;
131
+ padding-left: 0;
132
+ list-style: none;
133
+ color: var(--nuraly-sub-menu-color);
134
+ }
135
+
136
+ .sub-menu.disabled .sub-menu-header {
137
+ color: var(--nuraly-sub-menu-disabled-color);
138
+ cursor: not-allowed;
139
+ opacity: 0.6;
140
+ }
141
+
142
+ .sub-menu.highlighted .sub-menu-header {
143
+ background-color: var(--nuraly-sub-menu-highlighted-background-color);
144
+ color: var(--nuraly-sub-menu-highlighted-color);
145
+ }
146
+
147
+ .sub-menu .sub-menu-header {
148
+ display: flex;
149
+ justify-content: space-between;
150
+ align-items: center;
151
+ cursor: pointer;
152
+ padding: var(--nuraly-sub-menu-padding-vertical) var(--nuraly-sub-menu-padding-horizontal);
153
+ border-left: 4px solid transparent;
154
+ border-top: 2px solid transparent;
155
+ border-right: 2px solid transparent;
156
+ border-bottom: 2px solid transparent;
157
+ border-radius: var(--nuraly-menu-border-radius);
158
+ transition: background-color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing),
159
+ color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing),
160
+ border-color var(--nuraly-menu-transition-duration) var(--nuraly-menu-transition-timing);
161
+ }
162
+
163
+ .sub-menu .sub-menu-header span {
164
+ flex: 1;
165
+ min-width: 0;
166
+ padding-left: var(--nuraly-sub-menu-icon-padding-right);
167
+ }
168
+
169
+ .sub-menu .text-icon {
170
+ flex-shrink: 0;
171
+ }
172
+
173
+ .sub-menu .icons-container {
174
+ display: flex;
175
+ align-items: center;
176
+ gap: var(--nuraly-sub-menu-icon-padding-right);
177
+ position: relative;
178
+ flex-shrink: 0;
179
+ /* Reserve space for dropdown to prevent layout shift */
180
+ min-width: fit-content;
181
+ /* Fixed height to prevent vertical shifting */
182
+ height: 100%;
183
+ min-height: 24px;
184
+ }
185
+
186
+ .menu-link .icon-container {
187
+ display: flex;
188
+ align-items: center;
189
+ position: relative;
190
+ flex-shrink: 0;
191
+ /* Fixed height to prevent vertical shifting */
192
+ height: 100%;
193
+ min-height: 24px;
194
+ }
195
+
196
+ .sub-menu nr-dropdown,
197
+ .menu-link nr-dropdown {
198
+ /* Keep in normal flow but ensure it doesn't grow/shrink */
199
+ display: inline-flex;
200
+ flex-shrink: 0;
201
+ flex-grow: 0;
202
+ align-items: center;
203
+ vertical-align: middle;
204
+ }
205
+
206
+ .sub-menu .action-icon,
207
+ .menu-link .action-icon {
208
+ flex-shrink: 0;
209
+ cursor: pointer;
210
+ }
211
+
212
+ .sub-menu .action-icon {
213
+ --nuraly-icon-color: var(--nuraly-sub-menu-action-icon-color);
214
+ }
215
+
216
+ .sub-menu .status-icon {
217
+ --nuraly-icon-color: var(--nuraly-sub-menu-status-icon-color);
218
+ }
219
+
220
+ .sub-menu .text-icon {
221
+ --nuraly-icon-color: var(--nuraly-sub-menu-text-icon-color);
222
+ }
223
+
224
+ .sub-menu #toggle-icon {
225
+ --nuraly-icon-color: var(--nuraly-sub-menu-toggle-icon-color);
226
+ }
227
+
228
+ .sub-menu:not(.disabled):not(.selected) .sub-menu-header:focus {
229
+ outline: none;
230
+ border-left: 4px solid transparent;
231
+ border-top: var(--nuraly-sub-menu-focus-border);
232
+ border-right: var(--nuraly-sub-menu-focus-border);
233
+ border-bottom: var(--nuraly-sub-menu-focus-border);
234
+ color: var(--nuraly-sub-menu-focus-color);
235
+ }
236
+
237
+ .sub-menu.selected:not(.disabled) .sub-menu-header:focus {
238
+ outline: none;
239
+ border-left: var(--nuraly-menu-selected-link-border);
240
+ border-top: var(--nuraly-sub-menu-focus-border);
241
+ border-right: var(--nuraly-sub-menu-focus-border);
242
+ border-bottom: var(--nuraly-sub-menu-focus-border);
243
+ color: var(--nuraly-sub-menu-focus-color);
244
+ }
245
+
246
+ /* Focus-visible for keyboard navigation on submenus */
247
+ .sub-menu:not(.disabled) .sub-menu-header:focus-visible {
248
+ outline: none;
249
+ border-top: var(--nuraly-sub-menu-focus-border);
250
+ border-right: var(--nuraly-sub-menu-focus-border);
251
+ border-bottom: var(--nuraly-sub-menu-focus-border);
252
+ }
253
+
254
+ .sub-menu:not(.disabled):not(.selected) .sub-menu-header:focus-visible {
255
+ border-left: var(--nuraly-sub-menu-focus-border);
256
+ color: var(--nuraly-sub-menu-focus-color);
257
+ }
258
+
259
+ .sub-menu.selected:not(.disabled) .sub-menu-header:focus-visible {
260
+ border-left: var(--nuraly-menu-selected-link-border) !important;
261
+ color: var(--nuraly-sub-menu-focus-color);
262
+ }
263
+
264
+ .sub-menu:not(.disabled) .sub-menu-header:hover {
265
+ background-color: var(--nuraly-sub-menu-hover-background-color);
266
+ color: var(--nuraly-sub-menu-hover-color);
267
+ }
268
+
269
+ .sub-menu.selected:not(.disabled) .sub-menu-header {
270
+ background-color: var(--nuraly-menu-selected-link-background-color);
271
+ color: var(--nuraly-menu-selected-color);
272
+ border-left: var(--nuraly-menu-selected-link-border);
273
+ border-top: 2px solid transparent;
274
+ border-right: 2px solid transparent;
275
+ border-bottom: 2px solid transparent;
276
+ }
277
+
278
+ .sub-menu.selected:not(.disabled) .sub-menu-header:active {
279
+ background-color: var(--nuraly-sub-menu-active-background-color);
280
+ color: var(--nuraly-sub-menu-active-color);
281
+ border-left: var(--nuraly-menu-selected-link-border);
282
+ border-top: 2px solid transparent;
283
+ border-right: 2px solid transparent;
284
+ border-bottom: 2px solid transparent;
285
+ }
286
+
287
+ .sub-menu:not(.disabled):not(.selected) .sub-menu-header:active {
288
+ background-color: var(--nuraly-sub-menu-active-background-color);
289
+ color: var(--nuraly-sub-menu-active-color);
290
+ }
291
+
292
+ .sub-menu-children {
293
+ padding-left: var(--nuraly-sub-menu-nested-padding-left);
294
+ }
295
+
296
+ /* Size Variants */
297
+ .menu--small .menu-link {
298
+ padding: var(--nuraly-menu-link-padding-vertical-small) var(--nuraly-menu-link-padding-horizontal-small);
299
+ }
300
+
301
+ .menu--small .sub-menu .sub-menu-header {
302
+ padding: var(--nuraly-sub-menu-padding-vertical-small) var(--nuraly-sub-menu-padding-horizontal-small);
303
+ }
304
+
305
+ .menu--medium .menu-link {
306
+ padding: var(--nuraly-menu-link-padding-vertical-medium) var(--nuraly-menu-link-padding-horizontal-medium);
307
+ }
308
+
309
+ .menu--medium .sub-menu .sub-menu-header {
310
+ padding: var(--nuraly-sub-menu-padding-vertical-medium) var(--nuraly-sub-menu-padding-horizontal-medium);
311
+ }
312
+
313
+ .menu--large .menu-link {
314
+ padding: var(--nuraly-menu-link-padding-vertical-large) var(--nuraly-menu-link-padding-horizontal-large);
315
+ }
316
+
317
+ .menu--large .sub-menu .sub-menu-header {
318
+ padding: var(--nuraly-sub-menu-padding-vertical-large) var(--nuraly-sub-menu-padding-horizontal-large);
319
+ }
320
+ `];
2
321
  /**
3
322
  * @license
4
323
  * Copyright 2023 Nuraly, Laabidi Aymen
@@ -24,4 +343,83 @@ class u{constructor(e){this.host=e,e.addController(this)}hostConnected(){}hostDi
24
343
  * @license
25
344
  * Copyright 2023 Nuraly, Laabidi Aymen
26
345
  * SPDX-License-Identifier: MIT
27
- */var h=function(e,n,t,r){for(var i,o=arguments.length,s=o<3?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r,a=e.length-1;a>=0;a--)(i=e[a])&&(s=(o<3?i(s):o>3?i(n,t,s):i(n,t))||s);return o>3&&s&&Object.defineProperty(n,t,s),s};let m=class extends(s(n)){constructor(){super(),this.requiredComponents=["nr-icon","nr-dropdown"],this.items=[],this.size="medium",this._linkIndex=0,this.stateController=new l(this),this.keyboardController=new d(this,this.stateController),this.accessibilityController=new c(this,this.stateController)}firstUpdated(){this._initializeSelectedState(),this.accessibilityController.updateAriaAttributes()}updated(){this.accessibilityController.updateAriaAttributes()}_initializeSelectedState(){this._linkIndex=0,this._findSelectedPath(this.items)}_findSelectedPath(e,n=[]){for(let t=0;t<e.length;t++){const r=e[t],i=[...n,t];if(r.children){if(this._findSelectedPath(r.children,i))return!0}else if(r.selected)return this.stateController.setSelectedPath(i),!0}return!1}_handleLinkClick(e,n,t){var r;if(!(null===(r=null==t?void 0:t.target)||void 0===r?void 0:r.classList.contains("action-icon"))){if("click"===(null==t?void 0:t.type)){if(t.detail>0)return}this.stateController.setSelectedPath(e),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{path:e,value:n}})),this.requestUpdate()}}_handleSubMenuClick(e,n,t){const r=t,i=t.target;if("toggle-icon"!==i.id&&!i.closest("#toggle-icon")){if("click"===t.type)return 0===r.detail?(this.stateController.toggleSubMenu(e),void this.requestUpdate()):void 0;this.stateController.setSelectedPath([]),this.stateController.clearHighlights(),this.stateController.setHighlighted(e,!0),this.stateController.toggleSubMenu(e),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{path:e,value:n}})),this.requestUpdate()}}_toggleSubMenu(e,n){n.stopPropagation(),this.stateController.toggleSubMenu(e),this.requestUpdate()}_handleSubMenuMouseEnter(e){this.stateController.setHovered(e,!0),this.requestUpdate()}_handleSubMenuMouseLeave(e){this.stateController.setHovered(e,!1),this.requestUpdate()}_handleActionClick(e,n){const t=n.detail.item;this.dispatchEvent(new CustomEvent("action-click",{detail:{value:t.value,path:e,item:t},composed:!0,bubbles:!0}))}_isPathSelected(e){return this.stateController.isPathSelected(e)}_convertActionsToDropdownItems(e){return e.map((e=>({id:e.value,label:e.label,value:e.value})))}_renderMenuLink(e,n){var i,o;const s=n.join("-"),a=this._isPathSelected(n),u=this._linkIndex++;return t`<li class="menu-link ${a?"selected":""} ${e.disabled?"disabled":""}" data-path="${s}" data-index="${u}" tabindex="0" @mousedown="${e.disabled?r:t=>this._handleLinkClick(n,e.text,t)}" @click="${e.disabled?r:t=>this._handleLinkClick(n,e.text,t)}"><div class="icon-container">${e.icon?t`${e.text?t`<nr-icon name="${e.icon}"></nr-icon>`:t`<div class="icon-only"><nr-icon name="${e.icon}"></nr-icon></div>`}`:r}</div>${e.text?t`<div class="action-text-container"><div class="text-container"><span>${e.text}</span></div><div class="icon-container">${(null===(i=e.status)||void 0===i?void 0:i.icon)?t`<nr-icon name="${e.status.icon}" class="status-icon"></nr-icon>`:r} ${(null===(o=e.menu)||void 0===o?void 0:o.actions)?t`<nr-dropdown .items="${this._convertActionsToDropdownItems(e.menu.actions)}" trigger="click" placement="bottom-end" @nr-dropdown-item-click="${e=>this._handleActionClick(n,e)}"><nr-icon name="${e.menu.icon}" class="action-icon" slot="trigger"></nr-icon></nr-dropdown>`:r}</div></div>`:r}</li>`}_renderSubMenu(e,n){var i,o;const s=n.join("-"),a=this.stateController.isSubMenuOpen(n)||e.opened,u=this.stateController.isSubMenuHovered(n),l=this.stateController.isSubMenuHighlighted(n),d=e.selected;return t`<ul class="sub-menu ${l?"highlighted":""} ${e.disabled?"disabled":""} ${d?"selected":""}" data-path="${s}" tabindex="0" @mouseenter="${()=>this._handleSubMenuMouseEnter(n)}" @mouseleave="${()=>this._handleSubMenuMouseLeave(n)}" @click="${e.disabled?r:e=>{const t=e;e.target.classList.contains("sub-menu")&&0===t.detail&&(e.stopPropagation(),this.stateController.toggleSubMenu(n),this.requestUpdate())}}"><div class="sub-menu-header" @mousedown="${e.disabled?r:t=>this._handleSubMenuClick(n,e.text,t)}" @click="${e.disabled?r:t=>this._handleSubMenuClick(n,e.text,t)}">${e.icon?t`<nr-icon class="text-icon" name="${e.icon}"></nr-icon>`:r} <span>${e.text}</span><div class="icons-container">${(null===(i=e.status)||void 0===i?void 0:i.icon)?t`<nr-icon name="${e.status.icon}" class="status-icon"></nr-icon>`:r} ${(l||u)&&(null===(o=e.menu)||void 0===o?void 0:o.actions)?t`<nr-dropdown .items="${this._convertActionsToDropdownItems(e.menu.actions)}" trigger="click" placement="bottom-end" @nr-dropdown-item-click="${e=>this._handleActionClick(n,e)}"><nr-icon name="${e.menu.icon}" class="action-icon" slot="trigger"></nr-icon></nr-dropdown>`:r} ${e.children&&e.children.length?t`<nr-icon id="toggle-icon" name="${a?"angle-up":"angle-down"}" @mousedown="${e.disabled?r:e=>this._toggleSubMenu(n,e)}"></nr-icon>`:r}</div></div><div class="sub-menu-children" style="display:${a?"block":"none"}">${e.children?this._renderMenuItems(e.children,n):r}</div></ul>`}_renderMenuItems(e,n=[]){return e.map(((e,t)=>{const r=[...n,t];return e.children?this._renderSubMenu(e,r):this._renderMenuLink(e,r)}))}render(){return this._linkIndex=0,t`<ul class="menu-root menu--${this.size}">${this._renderMenuItems(this.items)}</ul>`}};m.styles=a,h([i({type:Array})],m.prototype,"items",void 0),h([i({type:String})],m.prototype,"size",void 0),m=h([o("nr-menu")],m);export{m as NrMenuElement};
346
+ */var h=function(e,n,t,r){for(var i,o=arguments.length,s=o<3?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r,a=e.length-1;a>=0;a--)(i=e[a])&&(s=(o<3?i(s):o>3?i(n,t,s):i(n,t))||s);return o>3&&s&&Object.defineProperty(n,t,s),s};let m=class extends(s(n)){constructor(){super(),this.requiredComponents=["nr-icon","nr-dropdown"],this.items=[],this.size="medium",this._linkIndex=0,this.stateController=new l(this),this.keyboardController=new d(this,this.stateController),this.accessibilityController=new c(this,this.stateController)}firstUpdated(){this._initializeSelectedState(),this.accessibilityController.updateAriaAttributes()}updated(){this.accessibilityController.updateAriaAttributes()}_initializeSelectedState(){this._linkIndex=0,this._findSelectedPath(this.items)}_findSelectedPath(e,n=[]){for(let t=0;t<e.length;t++){const r=e[t],i=[...n,t];if(r.children){if(this._findSelectedPath(r.children,i))return!0}else if(r.selected)return this.stateController.setSelectedPath(i),!0}return!1}_handleLinkClick(e,n,t){var r;if(!(null===(r=null==t?void 0:t.target)||void 0===r?void 0:r.classList.contains("action-icon"))){if("click"===(null==t?void 0:t.type)){if(t.detail>0)return}this.stateController.setSelectedPath(e),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{path:e,value:n}})),this.requestUpdate()}}_handleSubMenuClick(e,n,t){const r=t,i=t.target;if("toggle-icon"!==i.id&&!i.closest("#toggle-icon")){if("click"===t.type)return 0===r.detail?(this.stateController.toggleSubMenu(e),void this.requestUpdate()):void 0;this.stateController.setSelectedPath([]),this.stateController.clearHighlights(),this.stateController.setHighlighted(e,!0),this.stateController.toggleSubMenu(e),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{path:e,value:n}})),this.requestUpdate()}}_toggleSubMenu(e,n){n.stopPropagation(),this.stateController.toggleSubMenu(e),this.requestUpdate()}_handleSubMenuMouseEnter(e){this.stateController.setHovered(e,!0),this.requestUpdate()}_handleSubMenuMouseLeave(e){this.stateController.setHovered(e,!1),this.requestUpdate()}_handleActionClick(e,n){const t=n.detail.item;this.dispatchEvent(new CustomEvent("action-click",{detail:{value:t.value,path:e,item:t},composed:!0,bubbles:!0}))}_isPathSelected(e){return this.stateController.isPathSelected(e)}_convertActionsToDropdownItems(e){return e.map((e=>({id:e.value,label:e.label,value:e.value})))}_renderMenuLink(e,n){var i,o;const s=n.join("-"),a=this._isPathSelected(n),u=this._linkIndex++;return t`
347
+ <li
348
+ class="menu-link ${a?"selected":""} ${e.disabled?"disabled":""}"
349
+ data-path=${s}
350
+ data-index=${u}
351
+ tabindex="0"
352
+ @mousedown=${e.disabled?r:t=>this._handleLinkClick(n,e.text,t)}
353
+ @click=${e.disabled?r:t=>this._handleLinkClick(n,e.text,t)}>
354
+ <div class="icon-container">
355
+ ${e.icon?t`
356
+ ${e.text?t`<nr-icon name="${e.icon}"></nr-icon>`:t`<div class="icon-only"><nr-icon name="${e.icon}"></nr-icon></div>`}
357
+ `:r}
358
+ </div>
359
+ ${e.text?t`
360
+ <div class="action-text-container">
361
+ <div class="text-container">
362
+ <span>${e.text}</span>
363
+ </div>
364
+ <div class="icon-container">
365
+ ${(null===(i=e.status)||void 0===i?void 0:i.icon)?t`
366
+ <nr-icon name=${e.status.icon} class="status-icon"></nr-icon>
367
+ `:r}
368
+ ${(null===(o=e.menu)||void 0===o?void 0:o.actions)?t`
369
+ <nr-dropdown
370
+ .items=${this._convertActionsToDropdownItems(e.menu.actions)}
371
+ trigger="click"
372
+ placement="bottom-end"
373
+ @nr-dropdown-item-click=${e=>this._handleActionClick(n,e)}>
374
+ <nr-icon name="${e.menu.icon}" class="action-icon" slot="trigger"></nr-icon>
375
+ </nr-dropdown>
376
+ `:r}
377
+ </div>
378
+ </div>
379
+ `:r}
380
+ </li>
381
+ `}_renderSubMenu(e,n){var i,o;const s=n.join("-"),a=this.stateController.isSubMenuOpen(n)||e.opened,u=this.stateController.isSubMenuHovered(n),l=this.stateController.isSubMenuHighlighted(n),d=e.selected;return t`
382
+ <ul
383
+ class="sub-menu ${l?"highlighted":""} ${e.disabled?"disabled":""} ${d?"selected":""}"
384
+ data-path=${s}
385
+ tabindex="0"
386
+ @mouseenter=${()=>this._handleSubMenuMouseEnter(n)}
387
+ @mouseleave=${()=>this._handleSubMenuMouseLeave(n)}
388
+ @click=${e.disabled?r:e=>{const t=e;e.target.classList.contains("sub-menu")&&0===t.detail&&(e.stopPropagation(),this.stateController.toggleSubMenu(n),this.requestUpdate())}}>
389
+ <div
390
+ class="sub-menu-header"
391
+ @mousedown=${e.disabled?r:t=>this._handleSubMenuClick(n,e.text,t)}
392
+ @click=${e.disabled?r:t=>this._handleSubMenuClick(n,e.text,t)}>
393
+ ${e.icon?t`<nr-icon class="text-icon" name="${e.icon}"></nr-icon>`:r}
394
+ <span>${e.text}</span>
395
+ <div class="icons-container">
396
+ ${(null===(i=e.status)||void 0===i?void 0:i.icon)?t`
397
+ <nr-icon name=${e.status.icon} class="status-icon"></nr-icon>
398
+ `:r}
399
+ ${(l||u)&&(null===(o=e.menu)||void 0===o?void 0:o.actions)?t`
400
+ <nr-dropdown
401
+ .items=${this._convertActionsToDropdownItems(e.menu.actions)}
402
+ trigger="click"
403
+ placement="bottom-end"
404
+ @nr-dropdown-item-click=${e=>this._handleActionClick(n,e)}>
405
+ <nr-icon name="${e.menu.icon}" class="action-icon" slot="trigger"></nr-icon>
406
+ </nr-dropdown>
407
+ `:r}
408
+ ${e.children&&e.children.length?t`
409
+ <nr-icon
410
+ id="toggle-icon"
411
+ name="${a?"angle-up":"angle-down"}"
412
+ @mousedown=${e.disabled?r:e=>this._toggleSubMenu(n,e)}>
413
+ </nr-icon>
414
+ `:r}
415
+ </div>
416
+ </div>
417
+ <div class="sub-menu-children" style="display: ${a?"block":"none"}">
418
+ ${e.children?this._renderMenuItems(e.children,n):r}
419
+ </div>
420
+ </ul>
421
+ `}_renderMenuItems(e,n=[]){return e.map(((e,t)=>{const r=[...n,t];return e.children?this._renderSubMenu(e,r):this._renderMenuLink(e,r)}))}render(){return this._linkIndex=0,t`
422
+ <ul class="menu-root menu--${this.size}">
423
+ ${this._renderMenuItems(this.items)}
424
+ </ul>
425
+ `}};m.styles=a,h([i({type:Array})],m.prototype,"items",void 0),h([i({type:String})],m.prototype,"size",void 0),m=h([o("nr-menu")],m);export{m as NrMenuElement};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuralyui/menu",
3
- "version": "0.0.18",
3
+ "version": "0.0.19",
4
4
  "description": "Menu component for NuralyUI library with support for nested submenus",
5
5
  "main": "index.js",
6
6
  "type": "module",