@sula-tech/webcomponents 0.23.1 → 0.24.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.
Files changed (129) hide show
  1. package/dist/cjs/index.cjs.js +8 -7
  2. package/dist/cjs/index.cjs.js.map +1 -1
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/sula-avatar_32.cjs.entry.js +24 -23
  5. package/dist/cjs/sula-avatar_32.cjs.entry.js.map +1 -1
  6. package/dist/cjs/sula-calendar.model-CxjS_EJv.js +10 -0
  7. package/dist/cjs/sula-calendar.model-CxjS_EJv.js.map +1 -0
  8. package/dist/cjs/{sula-calendar.model-BI5cNrUo.js → sula-menu.model-BDxbWyPG.js} +2 -8
  9. package/dist/cjs/sula-menu.model-BDxbWyPG.js.map +1 -0
  10. package/dist/cjs/sula-profile-menu.cjs.entry.js +55 -0
  11. package/dist/cjs/sula-profile-menu.cjs.entry.js.map +1 -0
  12. package/dist/cjs/sula-profile-menu.entry.cjs.js.map +1 -0
  13. package/dist/cjs/sula-workbench-menu.cjs.entry.js +578 -0
  14. package/dist/cjs/sula-workbench-menu.cjs.entry.js.map +1 -0
  15. package/dist/cjs/sula-workbench-menu.entry.cjs.js.map +1 -0
  16. package/dist/cjs/webcomponents.cjs.js +1 -1
  17. package/dist/collection/collection-manifest.json +3 -1
  18. package/dist/collection/components/sula-icon/sula-icon.css +1 -1
  19. package/dist/collection/components/sula-menu/sula-menu.css +1 -1
  20. package/dist/collection/components/sula-menu/sula-menu.js +13 -13
  21. package/dist/collection/components/sula-menu/sula-menu.js.map +1 -1
  22. package/dist/collection/components/sula-profile-menu/model/sula-profile-menu.model.js +2 -0
  23. package/dist/collection/components/sula-profile-menu/model/sula-profile-menu.model.js.map +1 -0
  24. package/dist/collection/components/sula-profile-menu/sula-profile-menu.css +1 -0
  25. package/dist/collection/components/sula-profile-menu/sula-profile-menu.js +163 -0
  26. package/dist/collection/components/sula-profile-menu/sula-profile-menu.js.map +1 -0
  27. package/dist/collection/components/sula-profile-menu/sula-profile-menu.stories.js +74 -0
  28. package/dist/collection/components/sula-profile-menu/sula-profile-menu.stories.js.map +1 -0
  29. package/dist/collection/components/sula-switch/sula-switch.css +1 -1
  30. package/dist/collection/components/sula-workbench-menu/model/sula-workbench-menu.model.js +2 -0
  31. package/dist/collection/components/sula-workbench-menu/model/sula-workbench-menu.model.js.map +1 -0
  32. package/dist/collection/components/sula-workbench-menu/sula-workbench-menu.css +1 -0
  33. package/dist/collection/components/sula-workbench-menu/sula-workbench-menu.js +996 -0
  34. package/dist/collection/components/sula-workbench-menu/sula-workbench-menu.js.map +1 -0
  35. package/dist/collection/components/sula-workbench-menu/sula-workbench-menu.stories.js +450 -0
  36. package/dist/collection/components/sula-workbench-menu/sula-workbench-menu.stories.js.map +1 -0
  37. package/dist/collection/index.js.map +1 -1
  38. package/dist/components/{p-Dl7qXhBf.js → p-B_WIoxzn.js} +4 -4
  39. package/dist/components/{p-Dl7qXhBf.js.map → p-B_WIoxzn.js.map} +1 -1
  40. package/dist/components/{p-V9D4rqf7.js → p-BssyNhpP.js} +3 -3
  41. package/dist/components/{p-V9D4rqf7.js.map → p-BssyNhpP.js.map} +1 -1
  42. package/dist/components/{p-DzGiAQVF.js → p-CGpfhGAG.js} +3 -3
  43. package/dist/components/{p-DzGiAQVF.js.map → p-CGpfhGAG.js.map} +1 -1
  44. package/dist/components/{p-DRskhGOW.js → p-CWTfj4TV.js} +3 -3
  45. package/dist/components/{p-DRskhGOW.js.map → p-CWTfj4TV.js.map} +1 -1
  46. package/dist/components/p-DEhN6ZhJ.js +110 -0
  47. package/dist/components/p-DEhN6ZhJ.js.map +1 -0
  48. package/dist/components/{p-DjPqgTzy.js → p-DK8hW-Cd.js} +3 -3
  49. package/dist/components/{p-DjPqgTzy.js.map → p-DK8hW-Cd.js.map} +1 -1
  50. package/dist/components/{p-BhhQBGyJ.js → p-DwZCdDhF.js} +3 -3
  51. package/dist/components/{p-BhhQBGyJ.js.map → p-DwZCdDhF.js.map} +1 -1
  52. package/dist/components/{p-jsqtM3Ie.js → p-GEr9Dmhq.js} +3 -3
  53. package/dist/components/{p-jsqtM3Ie.js.map → p-GEr9Dmhq.js.map} +1 -1
  54. package/dist/components/p-KitH8bea.js +84 -0
  55. package/dist/components/p-KitH8bea.js.map +1 -0
  56. package/dist/components/sula-avatar.js +1 -1
  57. package/dist/components/sula-badge.js +1 -1
  58. package/dist/components/sula-breadcrumb.js +1 -1
  59. package/dist/components/sula-button.js +1 -1
  60. package/dist/components/sula-calendar.js +2 -2
  61. package/dist/components/sula-checkbox.js +1 -1
  62. package/dist/components/sula-chip.js +2 -2
  63. package/dist/components/sula-dropdown.js +1 -1
  64. package/dist/components/sula-icon-picker.js +4 -4
  65. package/dist/components/sula-icon.js +1 -1
  66. package/dist/components/sula-menu-select-list.js +1 -1
  67. package/dist/components/sula-menu.js +15 -15
  68. package/dist/components/sula-menu.js.map +1 -1
  69. package/dist/components/sula-modal.js +2 -2
  70. package/dist/components/sula-profile-menu.d.ts +11 -0
  71. package/dist/components/sula-profile-menu.js +9 -0
  72. package/dist/components/sula-profile-menu.js.map +1 -0
  73. package/dist/components/sula-progress-bar.js +1 -1
  74. package/dist/components/sula-search-bar.js +1 -1
  75. package/dist/components/sula-segmented-control.js +1 -1
  76. package/dist/components/sula-switch.js +1 -105
  77. package/dist/components/sula-switch.js.map +1 -1
  78. package/dist/components/sula-tag.js +1 -1
  79. package/dist/components/sula-textfield.js +1 -1
  80. package/dist/components/sula-tiles.js +1 -1
  81. package/dist/components/sula-timeline-list.js +1 -1
  82. package/dist/components/sula-toast-stack.js +2 -2
  83. package/dist/components/sula-toast.js +1 -1
  84. package/dist/components/sula-toggle.js +1 -1
  85. package/dist/components/sula-tooltip.js +1 -1
  86. package/dist/components/sula-workbench-menu.d.ts +11 -0
  87. package/dist/components/sula-workbench-menu.js +633 -0
  88. package/dist/components/sula-workbench-menu.js.map +1 -0
  89. package/dist/esm/index.js +2 -1
  90. package/dist/esm/index.js.map +1 -1
  91. package/dist/esm/loader.js +1 -1
  92. package/dist/esm/sula-avatar_32.entry.js +18 -17
  93. package/dist/esm/sula-avatar_32.entry.js.map +1 -1
  94. package/dist/esm/sula-calendar.model-Cp_4qTxj.js +10 -0
  95. package/dist/esm/sula-calendar.model-Cp_4qTxj.js.map +1 -0
  96. package/dist/esm/{sula-calendar.model-BbsLJDfp.js → sula-menu.model-Cs9RR1ZV.js} +3 -9
  97. package/dist/esm/sula-menu.model-Cs9RR1ZV.js.map +1 -0
  98. package/dist/esm/sula-profile-menu.entry.js +53 -0
  99. package/dist/esm/sula-profile-menu.entry.js.map +1 -0
  100. package/dist/esm/sula-workbench-menu.entry.js +576 -0
  101. package/dist/esm/sula-workbench-menu.entry.js.map +1 -0
  102. package/dist/esm/webcomponents.js +1 -1
  103. package/dist/types/components/sula-profile-menu/model/sula-profile-menu.model.d.ts +22 -0
  104. package/dist/types/components/sula-profile-menu/sula-profile-menu.d.ts +35 -0
  105. package/dist/types/components/sula-profile-menu/sula-profile-menu.stories.d.ts +34 -0
  106. package/dist/types/components/sula-workbench-menu/model/sula-workbench-menu.model.d.ts +19 -0
  107. package/dist/types/components/sula-workbench-menu/sula-workbench-menu.d.ts +175 -0
  108. package/dist/types/components/sula-workbench-menu/sula-workbench-menu.stories.d.ts +145 -0
  109. package/dist/types/components.d.ts +267 -0
  110. package/dist/types/index.d.ts +1 -0
  111. package/dist/webcomponents/index.esm.js +3 -1
  112. package/dist/webcomponents/index.esm.js.map +1 -1
  113. package/dist/webcomponents/p-68a6d489.entry.js +807 -0
  114. package/dist/webcomponents/p-68a6d489.entry.js.map +1 -0
  115. package/dist/webcomponents/p-88e5171a.entry.js +100 -0
  116. package/dist/webcomponents/p-88e5171a.entry.js.map +1 -0
  117. package/dist/webcomponents/{p-20b3135d.entry.js → p-907588e9.entry.js} +193 -191
  118. package/dist/webcomponents/{p-20b3135d.entry.js.map → p-907588e9.entry.js.map} +1 -1
  119. package/dist/webcomponents/p-Cp_4qTxj.js +10 -0
  120. package/dist/webcomponents/p-Cp_4qTxj.js.map +1 -0
  121. package/dist/webcomponents/{p-BbsLJDfp.js → p-Cs9RR1ZV.js} +4 -11
  122. package/dist/webcomponents/p-Cs9RR1ZV.js.map +1 -0
  123. package/dist/webcomponents/sula-profile-menu.entry.esm.js.map +1 -0
  124. package/dist/webcomponents/sula-workbench-menu.entry.esm.js.map +1 -0
  125. package/dist/webcomponents/webcomponents.esm.js +32 -9
  126. package/package.json +1 -1
  127. package/dist/cjs/sula-calendar.model-BI5cNrUo.js.map +0 -1
  128. package/dist/esm/sula-calendar.model-BbsLJDfp.js.map +0 -1
  129. package/dist/webcomponents/p-BbsLJDfp.js.map +0 -1
@@ -0,0 +1,996 @@
1
+ import { Host, h } from "@stencil/core";
2
+ import { SulaMenuDensity, SulaMenuLabelOverflow } from "../sula-menu/model/sula-menu.model";
3
+ /**
4
+ * Navigation menu that combines an inline expandable tree with a drill-down panel.
5
+ * Levels above `drilldownLevel` expand in place, as in `sula-menu`. Items at or below
6
+ * that level with children open a single-level panel with a breadcrumb trail.
7
+ *
8
+ * @part shell - Main visual container of the menu.
9
+ * @part title - Menu title, or the current level title while drilled in.
10
+ * @part main-item-label - Label of each top-level item.
11
+ * @part item-label - Label of each item inside the drill-down panel.
12
+ * @part toggle-label - Label of the collapse/expand control.
13
+ * @slot profile-content - Extra content rendered inside the profile popover.
14
+ * @part profile-popover - Popover opened from the user area.
15
+ * @cssprop --sula-menu-width - Width of the expanded menu. Defaults to 256px.
16
+ * @cssprop --sula-menu-collapsed-width - Width of the collapsed menu. Defaults to 88px.
17
+ */
18
+ export class SulaWorkbenchMenu {
19
+ constructor() {
20
+ /**
21
+ * Menu title
22
+ */
23
+ this.menuTitle = '';
24
+ /**
25
+ * Menu image
26
+ */
27
+ this.image = '';
28
+ /**
29
+ * Menu width in expanded state. Use a CSS length that does not depend on the
30
+ * host width, for example: 256px, 20rem or clamp(16rem, 25vw, 24rem).
31
+ */
32
+ this.width = '';
33
+ /**
34
+ * Density applied to menu items.
35
+ */
36
+ this.density = SulaMenuDensity.Default;
37
+ /**
38
+ * Overflow behavior for item labels.
39
+ */
40
+ this.labelOverflow = SulaMenuLabelOverflow.Wrap;
41
+ /**
42
+ * Depth (1-based) from which items with children open a drill-down panel instead of expanding in place.
43
+ * With the default of 3, the first two levels expand inline and deeper branches drill down.
44
+ */
45
+ this.drilldownLevel = 3;
46
+ /**
47
+ * Menu items. Each item may use `icon` (icon font class) or `image` (URL or data URI of an image or SVG).
48
+ */
49
+ this.items = [];
50
+ /**
51
+ * Icon used for items without `icon` or `image`. Use an empty string to show no icon.
52
+ */
53
+ this.defaultIcon = 'ph ph-dot-outline';
54
+ /**
55
+ * Options of the profile popover. Use `divider` for a separator and `hasSwitch` + `active` for a toggle row.
56
+ */
57
+ this.profileItems = [];
58
+ this.collapsed = false;
59
+ this.previewExpanded = false;
60
+ this.stack = [];
61
+ this.direction = 'forward';
62
+ this.selectedPath = [];
63
+ this.crumbMenu = { open: false, left: 0, top: 0 };
64
+ this.profileOpen = false;
65
+ this.hovering = false;
66
+ }
67
+ get normalizedWidth() {
68
+ var _a;
69
+ const value = (_a = this.width) === null || _a === void 0 ? void 0 : _a.trim();
70
+ return value ? value : undefined;
71
+ }
72
+ get hostStyleVariables() {
73
+ return Object.assign({}, (this.normalizedWidth ? { '--sula-menu-width': this.normalizedWidth } : {}));
74
+ }
75
+ componentWillLoad() {
76
+ this.syncWithItems(this.items);
77
+ }
78
+ syncWithItems(items) {
79
+ const nextSelected = this.findSelectedIds(items);
80
+ if (nextSelected) {
81
+ this.selectedPath = nextSelected;
82
+ }
83
+ else if (!this.selectedPath.length || !this.isStillSelectable(items, this.selectedPath)) {
84
+ this.selectedPath = [];
85
+ }
86
+ this.stack = this.rebuildStack(items, this.stack);
87
+ }
88
+ componentDidRender() {
89
+ this.positionProfile();
90
+ }
91
+ onDocumentClick(event) {
92
+ const path = event.composedPath();
93
+ if (this.profileOpen && !path.includes(this.profileEl) && !path.includes(this.userInfoEl))
94
+ this.closeProfile();
95
+ if (!this.crumbMenu.open)
96
+ return;
97
+ if (path.includes(this.crumbEllipsisEl) || path.includes(this.crumbDropdownEl))
98
+ return;
99
+ this.closeCrumbMenu();
100
+ }
101
+ onDocumentKeydown(event) {
102
+ var _a;
103
+ if (event.key !== 'Escape')
104
+ return;
105
+ this.closeCrumbMenu();
106
+ if (this.profileOpen) {
107
+ this.closeProfile();
108
+ (_a = this.userInfoEl) === null || _a === void 0 ? void 0 : _a.focus();
109
+ }
110
+ }
111
+ onWindowResize() {
112
+ this.positionProfile();
113
+ }
114
+ getVisibleItems(items) {
115
+ var _a;
116
+ return (_a = items === null || items === void 0 ? void 0 : items.filter(item => !item.hidden)) !== null && _a !== void 0 ? _a : [];
117
+ }
118
+ hasVisibleChildren(item) {
119
+ return this.getVisibleItems(item.children).length > 0;
120
+ }
121
+ isDrilled() {
122
+ return this.stack.length >= this.drilldownLevel;
123
+ }
124
+ findSelectedIds(items, trail = []) {
125
+ for (const item of this.getVisibleItems(items)) {
126
+ if (!this.hasVisibleChildren(item)) {
127
+ if (item.selected)
128
+ return [...trail, item.id];
129
+ continue;
130
+ }
131
+ const nested = this.findSelectedIds(item.children, [...trail, item.id]);
132
+ if (nested)
133
+ return nested;
134
+ }
135
+ return undefined;
136
+ }
137
+ isStillSelectable(items, path) {
138
+ const found = this.findPath(items, path[path.length - 1]);
139
+ return !!found && !this.hasVisibleChildren(found[found.length - 1]);
140
+ }
141
+ toggleExpanded(items, id) {
142
+ return items.map(item => {
143
+ if (item.id === id)
144
+ return Object.assign(Object.assign({}, item), { expanded: !item.expanded });
145
+ if (!item.children)
146
+ return item;
147
+ return Object.assign(Object.assign({}, item), { children: this.toggleExpanded(item.children, id) });
148
+ });
149
+ }
150
+ findPath(items, id, trail = []) {
151
+ var _a;
152
+ for (const item of this.getVisibleItems(items)) {
153
+ const next = [...trail, item];
154
+ if (item.id === id)
155
+ return next;
156
+ const nested = this.findPath((_a = item.children) !== null && _a !== void 0 ? _a : [], id, next);
157
+ if (nested)
158
+ return nested;
159
+ }
160
+ return undefined;
161
+ }
162
+ rebuildStack(items, previous) {
163
+ var _a;
164
+ const next = [];
165
+ let level = items;
166
+ for (const ancestor of previous) {
167
+ const match = this.getVisibleItems(level).find(item => item.id === ancestor.id);
168
+ if (!match)
169
+ break;
170
+ next.push(match);
171
+ level = (_a = match.children) !== null && _a !== void 0 ? _a : [];
172
+ }
173
+ return next;
174
+ }
175
+ isActive(item, branch) {
176
+ if (branch)
177
+ return this.selectedPath.includes(item.id);
178
+ return this.selectedPath.length > 0 && this.selectedPath[this.selectedPath.length - 1] === item.id;
179
+ }
180
+ isFaded(item, active) {
181
+ return !!item.disabled && !active;
182
+ }
183
+ emitLevel() {
184
+ this.levelChanged.emit(this.stack.map(item => item.id));
185
+ }
186
+ toggleInline(id) {
187
+ this.items = this.toggleExpanded(this.items, id);
188
+ }
189
+ enterDrill(item) {
190
+ var _a;
191
+ const path = (_a = this.findPath(this.items, item.id)) !== null && _a !== void 0 ? _a : [item];
192
+ this.direction = 'forward';
193
+ this.stack = path;
194
+ this.closeCrumbMenu();
195
+ this.emitLevel();
196
+ }
197
+ markSelected(items, id) {
198
+ return items.map(item => (Object.assign(Object.assign(Object.assign({}, item), { selected: item.id === id }), (item.children ? { children: this.markSelected(item.children, id) } : {}))));
199
+ }
200
+ // Selection lives on the items (like `expanded`), so re-assigning items when a branch is
201
+ // toggled keeps the user's choice instead of falling back to the initially selected item.
202
+ selectItem(item) {
203
+ var _a;
204
+ const path = (_a = this.findPath(this.items, item.id)) !== null && _a !== void 0 ? _a : [item];
205
+ this.items = this.markSelected(this.items, item.id);
206
+ this.selectedPath = path.map(p => p.id);
207
+ this.itemSelected.emit(item);
208
+ }
209
+ handleRowClick(item, depth) {
210
+ if (item.disabled)
211
+ return;
212
+ this.itemClicked.emit(item);
213
+ if (this.hasVisibleChildren(item)) {
214
+ if (depth < this.drilldownLevel) {
215
+ this.toggleInline(item.id);
216
+ }
217
+ else {
218
+ this.enterDrill(item);
219
+ }
220
+ return;
221
+ }
222
+ this.selectItem(item);
223
+ }
224
+ goToDepth(index) {
225
+ this.direction = 'back';
226
+ this.stack = index < 0 ? [] : this.stack.slice(0, index + 1);
227
+ this.closeCrumbMenu();
228
+ this.emitLevel();
229
+ }
230
+ toggleCrumbMenu(event) {
231
+ if (this.crumbMenu.open) {
232
+ this.closeCrumbMenu();
233
+ return;
234
+ }
235
+ const button = event.currentTarget;
236
+ this.crumbMenu = {
237
+ open: true,
238
+ left: button.offsetLeft,
239
+ top: button.offsetTop + button.offsetHeight + 6,
240
+ };
241
+ }
242
+ closeCrumbMenu() {
243
+ if (this.crumbMenu.open)
244
+ this.crumbMenu = Object.assign(Object.assign({}, this.crumbMenu), { open: false });
245
+ }
246
+ toggleMenu() {
247
+ this.closeProfile();
248
+ if (this.collapsed) {
249
+ this.collapsed = false;
250
+ this.previewExpanded = false;
251
+ this.menuToggled.emit(true);
252
+ return;
253
+ }
254
+ this.collapsed = true;
255
+ this.menuToggled.emit(false);
256
+ this.previewExpanded = false;
257
+ }
258
+ handleMenuMouseEnter() {
259
+ this.hovering = true;
260
+ if (this.collapsed)
261
+ this.previewExpanded = true;
262
+ }
263
+ // While the popover is open the preview stays expanded, so the popover keeps its anchor.
264
+ handleMenuMouseLeave() {
265
+ this.hovering = false;
266
+ if (this.collapsed && !this.profileOpen)
267
+ this.previewExpanded = false;
268
+ }
269
+ toggleProfile() {
270
+ if (this.profileOpen) {
271
+ this.closeProfile();
272
+ return;
273
+ }
274
+ if (this.profileClicked.emit(this.user).defaultPrevented)
275
+ return;
276
+ this.profileOpen = true;
277
+ requestAnimationFrame(() => { var _a; return (_a = this.profileEl) === null || _a === void 0 ? void 0 : _a.focus(); });
278
+ }
279
+ closeProfile() {
280
+ if (!this.profileOpen)
281
+ return;
282
+ this.profileOpen = false;
283
+ if (this.collapsed && !this.hovering)
284
+ this.previewExpanded = false;
285
+ }
286
+ // Fixed position, so ancestors with overflow hidden do not clip the popover.
287
+ positionProfile() {
288
+ if (!this.profileOpen || !this.profileEl || !this.userInfoEl || !this.shellEl)
289
+ return;
290
+ const gap = 8;
291
+ const inset = 12;
292
+ const anchor = this.userInfoEl.getBoundingClientRect();
293
+ const shell = this.shellEl.getBoundingClientRect();
294
+ const style = this.profileEl.style;
295
+ if (!this.collapsed || this.previewExpanded) {
296
+ style.left = `${shell.left + inset}px`;
297
+ style.width = `${shell.width - inset * 2}px`;
298
+ style.bottom = `${window.innerHeight - anchor.top + gap}px`;
299
+ return;
300
+ }
301
+ style.left = `${shell.right + gap}px`;
302
+ style.width = '';
303
+ style.bottom = `${window.innerHeight - anchor.bottom}px`;
304
+ }
305
+ // Inner events are composed; stopping them avoids clashing with this menu's own itemClicked.
306
+ handleProfileItemClicked(event) {
307
+ event.stopPropagation();
308
+ this.closeProfile();
309
+ this.profileItemClicked.emit(event.detail);
310
+ }
311
+ handleProfileSwitchChanged(event) {
312
+ event.stopPropagation();
313
+ const { item } = event.detail;
314
+ this.profileItems = this.profileItems.map(current => (current.id === item.id ? item : current));
315
+ this.profileSwitchChanged.emit(event.detail);
316
+ }
317
+ renderProfilePopover(expandedView) {
318
+ return (h("div", { part: "profile-popover", role: "dialog", "aria-label": `Perfil de ${this.user.name}`, "aria-hidden": String(!this.profileOpen), tabIndex: -1, ref: el => (this.profileEl = el), class: {
319
+ 'profile-popover': true,
320
+ 'profile-popover--open': this.profileOpen,
321
+ 'profile-popover--side': !expandedView,
322
+ } }, h("sula-profile-menu", { user: this.user, items: this.profileItems, onItemClicked: event => this.handleProfileItemClicked(event), onSwitchChanged: event => this.handleProfileSwitchChanged(event) }, h("slot", { name: "profile-content" }))));
323
+ }
324
+ isValidIcon(icon) {
325
+ return !!icon && /ph-[a-z]/.test(icon);
326
+ }
327
+ isSvg(image) {
328
+ return /^data:image\/svg\+xml/i.test(image) || /\.svg(\?|#|$)/i.test(image);
329
+ }
330
+ iconOf(item) {
331
+ return this.isValidIcon(item.icon) ? item.icon : this.defaultIcon;
332
+ }
333
+ hasIcon(item) {
334
+ return !!item.image || this.isValidIcon(this.iconOf(item));
335
+ }
336
+ renderItemIcon(item, customClass, size, faded = false) {
337
+ if (!this.hasIcon(item))
338
+ return null;
339
+ if (item.image && this.isSvg(item.image)) {
340
+ // SVGs are painted with currentColor through a mask, so they follow the same state colors as the icon font.
341
+ return (h("span", { class: `menu-item-image menu-item-image--mask menu-item-image--${size} ${customClass}`, style: { '--menu-item-image': `url("${item.image.replace(/"/g, '%22')}")` }, "aria-hidden": "true" }));
342
+ }
343
+ if (item.image) {
344
+ return (h("img", { class: { 'menu-item-image': true, [`menu-item-image--${size}`]: true, 'is-faded': faded }, src: item.image, alt: "" }));
345
+ }
346
+ return h("sula-icon", { icon: this.iconOf(item), customClass: customClass });
347
+ }
348
+ getInitials(name) {
349
+ return name
350
+ .split(' ')
351
+ .filter(Boolean)
352
+ .slice(0, 2)
353
+ .map(part => part[0].toUpperCase())
354
+ .join('');
355
+ }
356
+ renderUserInfo(expandedView) {
357
+ const user = this.user;
358
+ return (h("button", { type: "button", class: {
359
+ 'user-info flex min-w-0 cursor-pointer items-center rounded-xs p-8 text-left hover:bg-states-empty-bg-hover': true,
360
+ 'user-info--active bg-states-empty-bg-hover': this.profileOpen,
361
+ 'w-full': expandedView,
362
+ }, title: `Ver perfil de ${user.name}`, "aria-label": `Ver perfil de ${user.name}`, "aria-haspopup": "dialog", "aria-expanded": String(this.profileOpen), ref: el => (this.userInfoEl = el), onClick: () => this.toggleProfile() }, h("span", { class: "user-avatar flex h-9 w-9 flex-none items-center justify-center overflow-hidden rounded-full bg-brand-primary text-sm font-semibold text-negative-negative-1" }, user.photo ? h("img", { src: user.photo, alt: user.name }) : this.getInitials(user.name)), h("span", { "aria-hidden": !expandedView, class: {
363
+ 'user-copy': true,
364
+ 'ml-8': true,
365
+ 'user-copy--visible': expandedView,
366
+ 'user-copy--hidden': !expandedView,
367
+ } }, h("span", { part: "user-name", class: "user-name truncate text-sm font-semibold text-text-primary" }, user.name), user.email && h("span", { part: "user-email", class: "user-email truncate text-xs text-text-secondary" }, user.email))));
368
+ }
369
+ getIconClass(active, faded, size) {
370
+ if (faded)
371
+ return `text-icon-disabled ${size}`;
372
+ if (active)
373
+ return `text-brand-primary ${size}`;
374
+ return `text-icon-primary ${size}`;
375
+ }
376
+ renderCollapseButton() {
377
+ const label = this.collapsed ? 'Expandir menu' : 'Recolher menu';
378
+ return (h("button", { type: "button", class: "menu-toggle flex flex-none items-center justify-center", title: label, "aria-label": label, "aria-expanded": String(!this.collapsed), onClick: () => this.toggleMenu() }, h("sula-icon", { icon: `ph-bold ph-caret-${this.collapsed ? 'right' : 'left'}`, customClass: "text-lg" })));
379
+ }
380
+ renderRootHeader(expandedView) {
381
+ return (h("div", { class: {
382
+ 'menu-header flex items-center': true,
383
+ 'mb-40': expandedView,
384
+ 'mb-24 flex-col justify-center px-0': !expandedView,
385
+ } }, this.image && (h("div", { class: { 'menu-brand-image max-h-10 max-w-10 overflow-hidden': true, 'mr-6': expandedView } }, h("img", { src: this.image, alt: this.menuTitle }))), h("div", { "aria-hidden": !expandedView, title: expandedView ? this.menuTitle : undefined, class: {
386
+ 'menu-title menu-copy': true,
387
+ 'menu-copy--visible': expandedView,
388
+ 'menu-copy--hidden': !expandedView,
389
+ } }, h("h1", { part: "title", class: "truncate text-2xl font-bold leading-7 text-text-secondary" }, this.menuTitle)), this.renderCollapseButton()));
390
+ }
391
+ renderTrail(ancestors) {
392
+ const hasHidden = ancestors.length > 2;
393
+ const visible = hasHidden ? ancestors.slice(-2) : ancestors;
394
+ const crumbs = [];
395
+ if (hasHidden) {
396
+ crumbs.push(h("button", { key: "ellipsis", type: "button", class: "crumb-btn crumb-btn--ellipsis", "aria-haspopup": "true", "aria-expanded": String(this.crumbMenu.open), title: `${ancestors.length - 2} nível(is) anterior(es)`, ref: el => (this.crumbEllipsisEl = el), onClick: event => this.toggleCrumbMenu(event) }, h("sula-icon", { icon: "ph-bold ph-dots-three", customClass: "text-base text-text-secondary" })));
397
+ }
398
+ visible.forEach(ancestor => {
399
+ crumbs.push(h("button", { key: ancestor.id, type: "button", class: "crumb-btn", title: ancestor.label, onClick: () => this.goToDepth(this.stack.indexOf(ancestor)) }, ancestor.label));
400
+ });
401
+ const nodes = [];
402
+ crumbs.forEach((crumb, index) => {
403
+ if (index > 0)
404
+ nodes.push(h("sula-icon", { key: `sep-${index}`, icon: "ph ph-caret-right", customClass: "crumb-sep text-xs" }));
405
+ nodes.push(crumb);
406
+ });
407
+ return (h("nav", { class: "crumb-trail flex min-w-0 items-center", "aria-label": "Caminho de navega\u00E7\u00E3o" }, nodes));
408
+ }
409
+ renderCrumbDropdown(ancestors) {
410
+ if (!this.crumbMenu.open || ancestors.length <= 2)
411
+ return null;
412
+ const hidden = ancestors.slice(0, -2);
413
+ return (h("div", { class: "crumb-dropdown", role: "menu", ref: el => (this.crumbDropdownEl = el), style: { left: `${this.crumbMenu.left}px`, top: `${this.crumbMenu.top}px` } }, hidden.map(ancestor => (h("button", { key: ancestor.id, type: "button", role: "menuitem", class: "crumb-dropdown-item", onClick: () => this.goToDepth(this.stack.indexOf(ancestor)) }, h("span", { class: "item-icon flex flex-none items-center justify-center" }, this.renderItemIcon(ancestor, 'text-sm text-icon-primary', 'sm')), h("span", { class: "truncate" }, ancestor.label))))));
414
+ }
415
+ renderDrillHeader(activeParent) {
416
+ const ancestors = this.stack.slice(0, -1);
417
+ const backLabel = ancestors.length ? ancestors[ancestors.length - 1].label : this.menuTitle || 'Início';
418
+ const backButton = (h("button", { type: "button", class: "back-btn", title: `Voltar para ${backLabel}`, "aria-label": `Voltar para ${backLabel}`, onClick: () => this.goToDepth(this.stack.length - 2) }, h("sula-icon", { icon: "ph ph-arrow-left", customClass: "text-lg text-icon-primary" })));
419
+ return (h("div", { class: "menu-header menu-header--drilldown mb-16 flex flex-col border-b border-line-general pb-24" }, h("div", { class: "identity-row flex items-center" }, h("button", { type: "button", class: "identity-strip", title: `Ir para o início de ${this.menuTitle}`, onClick: () => this.goToDepth(-1) }, this.image && (h("span", { class: "identity-image" }, h("img", { src: this.image, alt: "" }))), h("span", { class: "identity-label truncate" }, this.menuTitle)), this.renderCollapseButton()), ancestors.length > 0 && (h("div", { class: "breadcrumb-row" }, backButton, this.renderTrail(ancestors), this.renderCrumbDropdown(ancestors))), h("div", { class: { 'context-row flex items-center min-w-0': true, 'mt-8': ancestors.length > 0 } }, ancestors.length === 0 && backButton, this.hasIcon(activeParent) && (h("span", { class: "context-icon flex flex-none items-center justify-center" }, this.renderItemIcon(activeParent, 'text-xl text-brand-primary', 'md'))), h("h1", { part: "title", class: "context-title truncate text-xl font-semibold leading-tight text-text-primary" }, activeParent.label))));
420
+ }
421
+ renderDrillRow(item, reserve) {
422
+ const branch = this.hasVisibleChildren(item);
423
+ const active = this.isActive(item, branch);
424
+ const faded = this.isFaded(item, active);
425
+ return (h("li", { class: "list-none", key: item.id }, h("div", { class: {
426
+ 'menu-item flex items-center justify-between rounded-xs px-8': true,
427
+ 'cursor-pointer hover:bg-states-empty-bg-hover': !item.disabled && !active,
428
+ 'cursor-pointer': !item.disabled && active,
429
+ 'cursor-not-allowed': !!item.disabled,
430
+ }, "aria-disabled": !!item.disabled, onClick: () => this.handleRowClick(item, this.stack.length + 1) }, h("span", { class: "flex min-w-0 flex-1 items-center gap-8" }, this.renderIconSlot(item, this.getIconClass(active, faded, 'text-base'), faded, reserve), h("span", { part: "item-label", class: {
431
+ 'menu-item-label truncate': this.labelOverflow !== SulaMenuLabelOverflow.Wrap,
432
+ 'menu-item-label menu-item-label--wrap': this.labelOverflow === SulaMenuLabelOverflow.Wrap,
433
+ 'font-bold text-text-primary': active,
434
+ 'text-text-disabled': faded,
435
+ 'text-text-secondary': !active && !faded,
436
+ } }, item.label)), branch && h("sula-icon", { icon: "ph ph-caret-right", customClass: faded ? 'text-text-disabled text-xs' : 'text-text-secondary text-xs' }))));
437
+ }
438
+ renderDrillPanel() {
439
+ const activeParent = this.stack[this.stack.length - 1];
440
+ const panelKey = this.stack.map(item => item.id).join('/');
441
+ return (h("ul", { key: panelKey, class: {
442
+ 'menu-panel flex flex-col': true,
443
+ 'menu-panel--forward': this.direction === 'forward',
444
+ 'menu-panel--back': this.direction === 'back',
445
+ } }, this.getVisibleItems(activeParent.children).map(item => this.renderDrillRow(item, this.siblingsHaveIcon(activeParent.children)))));
446
+ }
447
+ getMainIconClass(active, faded) {
448
+ if (faded)
449
+ return 'text-icon-disabled text-base';
450
+ if (active)
451
+ return 'text-brand-primary text-base';
452
+ return 'text-icon-primary text-base';
453
+ }
454
+ getMainCaretClass(active, faded) {
455
+ if (faded)
456
+ return 'text-text-disabled text-xs';
457
+ if (active)
458
+ return 'text-text-primary text-xs';
459
+ return 'text-text-secondary text-xs';
460
+ }
461
+ getSubIconClass(faded, selected = false) {
462
+ if (faded)
463
+ return 'text-icon-disabled text-base';
464
+ if (selected)
465
+ return 'text-brand-primary text-base';
466
+ return 'text-icon-primary text-base';
467
+ }
468
+ getSubCaretClass(faded) {
469
+ return faded ? 'text-icon-disabled text-xs' : 'text-icon-primary text-xs';
470
+ }
471
+ siblingsHaveIcon(items) {
472
+ return this.getVisibleItems(items).some(sibling => this.hasIcon(sibling));
473
+ }
474
+ renderIconSlot(item, customClass, faded, reserve = true) {
475
+ if (!reserve && !this.hasIcon(item))
476
+ return null;
477
+ return h("span", { class: "item-icon flex flex-none items-center justify-center" }, this.renderItemIcon(item, customClass, 'lg', faded));
478
+ }
479
+ renderMainRow(item, expandedView, branch, expanded, active, faded, reserve) {
480
+ const labelOverflowTruncate = this.labelOverflow === SulaMenuLabelOverflow.Truncate;
481
+ return (h("div", { class: {
482
+ 'menu-item flex items-center rounded-xs px-8': true,
483
+ 'cursor-pointer hover:bg-states-empty-bg-hover': !item.disabled,
484
+ 'cursor-not-allowed': !!item.disabled,
485
+ 'justify-between': expandedView,
486
+ 'justify-center': !expandedView,
487
+ }, title: !expandedView ? item.label : undefined, "aria-disabled": !!item.disabled, onClick: () => this.handleRowClick(item, 1) }, h("div", { class: { 'flex items-center': true, 'flex-1 min-w-0 gap-8': expandedView, 'justify-center': !expandedView } }, this.renderIconSlot(item, this.getMainIconClass(active, faded), faded, reserve), h("span", { part: "main-item-label", title: expandedView ? item.label : undefined, "aria-hidden": !expandedView, class: {
488
+ 'menu-item-label menu-copy': true,
489
+ 'menu-item-label--truncate': labelOverflowTruncate,
490
+ 'menu-item-label--wrap': !labelOverflowTruncate,
491
+ 'menu-copy--visible': expandedView,
492
+ 'menu-copy--hidden': !expandedView,
493
+ 'font-bold text-text-primary': active,
494
+ 'text-text-disabled': faded,
495
+ 'text-text-secondary': !active && !faded,
496
+ } }, item.label)), branch && (h("sula-icon", { "aria-hidden": !expandedView, class: {
497
+ 'menu-item-caret flex items-center justify-center': true,
498
+ 'menu-item-caret--expanded': expanded,
499
+ 'menu-item-caret--visible': expandedView,
500
+ 'menu-item-caret--hidden': !expandedView,
501
+ }, icon: "ph ph-caret-down", customClass: this.getMainCaretClass(active, faded) }))));
502
+ }
503
+ renderSubRow(item, expandedView, branch, expanded, active, faded, drill, reserve) {
504
+ const caretIcon = drill ? 'ph-bold ph-caret-right' : `ph-bold ph-caret-${expanded && expandedView ? 'up' : 'down'}`;
505
+ const onClick = () => this.handleRowClick(item, this.depthOf(item));
506
+ const rowClass = {
507
+ 'submenu-item flex min-w-0 items-center rounded-xs py-8 pr-8 select-none': true,
508
+ 'submenu-item--branch w-full': branch,
509
+ 'cursor-pointer hover:bg-states-empty-bg-hover': !item.disabled,
510
+ 'cursor-not-allowed': !!item.disabled,
511
+ 'font-bold': active && branch,
512
+ };
513
+ const label = (h("span", { class: {
514
+ 'submenu-item-label min-w-0 flex-1': true,
515
+ 'ml-8': reserve || this.hasIcon(item),
516
+ 'menu-item-label--truncate': this.labelOverflow === SulaMenuLabelOverflow.Truncate,
517
+ 'menu-item-label--wrap': this.labelOverflow !== SulaMenuLabelOverflow.Truncate,
518
+ 'text-text-primary': !faded,
519
+ 'text-text-disabled': faded,
520
+ 'font-bold': active,
521
+ } }, item.label));
522
+ if (!branch) {
523
+ return (h("a", { class: rowClass, style: { paddingLeft: '8px' }, title: item.label, "aria-disabled": !!item.disabled, onClick: onClick }, this.renderIconSlot(item, this.getSubIconClass(faded, active && !branch), faded, reserve), label));
524
+ }
525
+ return (h("a", { class: rowClass, style: { paddingLeft: '8px' }, title: item.label, "aria-disabled": !!item.disabled, onClick: onClick }, h("div", { class: "submenu-item-branch-content flex min-w-0 flex-1 items-center" }, this.renderIconSlot(item, this.getSubIconClass(faded, active && !branch), faded, reserve), label), h("div", { class: "submenu-item-branch-caret flex flex-none items-center justify-end pl-8" }, h("sula-icon", { icon: caretIcon, customClass: this.getSubCaretClass(faded) }))));
526
+ }
527
+ depthOf(item) {
528
+ const path = this.findPath(this.items, item.id);
529
+ return path ? path.length : 1;
530
+ }
531
+ renderInlineList(items, depth, expandedView) {
532
+ const reserve = this.siblingsHaveIcon(items);
533
+ return this.getVisibleItems(items).map(item => {
534
+ const branch = this.hasVisibleChildren(item);
535
+ const drill = branch && depth >= this.drilldownLevel;
536
+ const inline = branch && !drill;
537
+ const expanded = inline && !!item.expanded;
538
+ const active = this.isActive(item, branch) || expanded;
539
+ const faded = this.isFaded(item, active);
540
+ const row = depth === 1
541
+ ? this.renderMainRow(item, expandedView, branch, expanded, active, faded, reserve)
542
+ : this.renderSubRow(item, expandedView, branch, expanded, active, faded, drill, reserve);
543
+ return (h("li", { class: { 'decoration-none list-none': true, 'menu-group': depth === 1, 'is-selected': depth > 1 && active && !branch }, key: item.id }, row, inline && (h("ul", { "aria-hidden": !expandedView || !expanded, class: {
544
+ submenu: true,
545
+ 'submenu--expanded': expandedView && expanded,
546
+ 'ml-[8px] border-l border-line-general pl-8': depth === 1,
547
+ 'submenu-branch ml-[24px] border-l border-line-general pl-8': depth > 1,
548
+ } }, this.renderInlineList(item.children, depth + 1, expandedView)))));
549
+ });
550
+ }
551
+ render() {
552
+ const expandedView = !this.collapsed || this.previewExpanded;
553
+ const drilled = expandedView && this.isDrilled();
554
+ const activeParent = this.stack[this.stack.length - 1];
555
+ return (h(Host, { key: 'a5cb552fa5c922b9683e610ac82ffb831ccb5176', class: {
556
+ 'menu-host--collapsed': this.collapsed,
557
+ 'menu-host--preview': this.collapsed && this.previewExpanded,
558
+ 'menu-host--density-compact': this.density === SulaMenuDensity.Compact,
559
+ 'menu-host--density-comfortable': this.density === SulaMenuDensity.Comfortable,
560
+ }, style: this.hostStyleVariables, onMouseEnter: () => this.handleMenuMouseEnter(), onMouseLeave: () => this.handleMenuMouseLeave() }, h("aside", { key: '8c016acb4548d7a0f1b5d406499a070c921579e6', part: "shell", ref: el => (this.shellEl = el), class: {
561
+ 'menu-shell flex h-full flex-col bg-surface-body shadow-md z-50': true,
562
+ 'menu-shell--collapsed': this.collapsed && !this.previewExpanded,
563
+ 'menu-shell--expanded': expandedView,
564
+ 'menu-shell--preview': this.collapsed && this.previewExpanded,
565
+ } }, drilled ? this.renderDrillHeader(activeParent) : this.renderRootHeader(expandedView), h("nav", { key: 'ff2dca54adc4803f67fc3a3f16ff7e884d42e1f6', class: {
566
+ 'menu-nav flex h-full flex-col overflow-y-auto overflow-x-hidden': true,
567
+ 'px-12': !expandedView,
568
+ } }, drilled ? (this.renderDrillPanel()) : (h("ul", { class: "flex flex-col" }, this.renderInlineList(this.items, 1, expandedView)))), this.user && (h("div", { key: '26ef3d34d5a747a3f84b8fcf63d09feba2ff5668', class: "menu-footer border-t border-line-general pt-12" }, this.renderUserInfo(expandedView)))), this.user && this.renderProfilePopover(expandedView)));
569
+ }
570
+ static get is() { return "sula-workbench-menu"; }
571
+ static get encapsulation() { return "shadow"; }
572
+ static get originalStyleUrls() {
573
+ return {
574
+ "$": ["sula-workbench-menu.scss"]
575
+ };
576
+ }
577
+ static get styleUrls() {
578
+ return {
579
+ "$": ["sula-workbench-menu.css"]
580
+ };
581
+ }
582
+ static get properties() {
583
+ return {
584
+ "menuTitle": {
585
+ "type": "string",
586
+ "attribute": "menu-title",
587
+ "mutable": false,
588
+ "complexType": {
589
+ "original": "string",
590
+ "resolved": "string",
591
+ "references": {}
592
+ },
593
+ "required": false,
594
+ "optional": false,
595
+ "docs": {
596
+ "tags": [],
597
+ "text": "Menu title"
598
+ },
599
+ "getter": false,
600
+ "setter": false,
601
+ "reflect": false,
602
+ "defaultValue": "''"
603
+ },
604
+ "image": {
605
+ "type": "string",
606
+ "attribute": "image",
607
+ "mutable": false,
608
+ "complexType": {
609
+ "original": "string",
610
+ "resolved": "string",
611
+ "references": {}
612
+ },
613
+ "required": false,
614
+ "optional": false,
615
+ "docs": {
616
+ "tags": [],
617
+ "text": "Menu image"
618
+ },
619
+ "getter": false,
620
+ "setter": false,
621
+ "reflect": false,
622
+ "defaultValue": "''"
623
+ },
624
+ "width": {
625
+ "type": "string",
626
+ "attribute": "width",
627
+ "mutable": false,
628
+ "complexType": {
629
+ "original": "string",
630
+ "resolved": "string",
631
+ "references": {}
632
+ },
633
+ "required": false,
634
+ "optional": false,
635
+ "docs": {
636
+ "tags": [],
637
+ "text": "Menu width in expanded state. Use a CSS length that does not depend on the\nhost width, for example: 256px, 20rem or clamp(16rem, 25vw, 24rem)."
638
+ },
639
+ "getter": false,
640
+ "setter": false,
641
+ "reflect": false,
642
+ "defaultValue": "''"
643
+ },
644
+ "density": {
645
+ "type": "string",
646
+ "attribute": "density",
647
+ "mutable": false,
648
+ "complexType": {
649
+ "original": "SulaMenuDensity",
650
+ "resolved": "SulaMenuDensity.Comfortable | SulaMenuDensity.Compact | SulaMenuDensity.Default",
651
+ "references": {
652
+ "SulaMenuDensity": {
653
+ "location": "import",
654
+ "path": "../sula-menu/model/sula-menu.model",
655
+ "id": "src/components/sula-menu/model/sula-menu.model.ts::SulaMenuDensity"
656
+ }
657
+ }
658
+ },
659
+ "required": false,
660
+ "optional": false,
661
+ "docs": {
662
+ "tags": [],
663
+ "text": "Density applied to menu items."
664
+ },
665
+ "getter": false,
666
+ "setter": false,
667
+ "reflect": false,
668
+ "defaultValue": "SulaMenuDensity.Default"
669
+ },
670
+ "labelOverflow": {
671
+ "type": "string",
672
+ "attribute": "label-overflow",
673
+ "mutable": false,
674
+ "complexType": {
675
+ "original": "SulaMenuLabelOverflow",
676
+ "resolved": "SulaMenuLabelOverflow.Truncate | SulaMenuLabelOverflow.Wrap",
677
+ "references": {
678
+ "SulaMenuLabelOverflow": {
679
+ "location": "import",
680
+ "path": "../sula-menu/model/sula-menu.model",
681
+ "id": "src/components/sula-menu/model/sula-menu.model.ts::SulaMenuLabelOverflow"
682
+ }
683
+ }
684
+ },
685
+ "required": false,
686
+ "optional": false,
687
+ "docs": {
688
+ "tags": [],
689
+ "text": "Overflow behavior for item labels."
690
+ },
691
+ "getter": false,
692
+ "setter": false,
693
+ "reflect": false,
694
+ "defaultValue": "SulaMenuLabelOverflow.Wrap"
695
+ },
696
+ "drilldownLevel": {
697
+ "type": "number",
698
+ "attribute": "drilldown-level",
699
+ "mutable": false,
700
+ "complexType": {
701
+ "original": "number",
702
+ "resolved": "number",
703
+ "references": {}
704
+ },
705
+ "required": false,
706
+ "optional": false,
707
+ "docs": {
708
+ "tags": [],
709
+ "text": "Depth (1-based) from which items with children open a drill-down panel instead of expanding in place.\nWith the default of 3, the first two levels expand inline and deeper branches drill down."
710
+ },
711
+ "getter": false,
712
+ "setter": false,
713
+ "reflect": false,
714
+ "defaultValue": "3"
715
+ },
716
+ "items": {
717
+ "type": "unknown",
718
+ "attribute": "items",
719
+ "mutable": true,
720
+ "complexType": {
721
+ "original": "SulaWorkbenchMenuItem[]",
722
+ "resolved": "SulaWorkbenchMenuItem[]",
723
+ "references": {
724
+ "SulaWorkbenchMenuItem": {
725
+ "location": "import",
726
+ "path": "./model/sula-workbench-menu.model",
727
+ "id": "src/components/sula-workbench-menu/model/sula-workbench-menu.model.ts::SulaWorkbenchMenuItem"
728
+ }
729
+ }
730
+ },
731
+ "required": false,
732
+ "optional": false,
733
+ "docs": {
734
+ "tags": [],
735
+ "text": "Menu items. Each item may use `icon` (icon font class) or `image` (URL or data URI of an image or SVG)."
736
+ },
737
+ "getter": false,
738
+ "setter": false,
739
+ "defaultValue": "[]"
740
+ },
741
+ "user": {
742
+ "type": "unknown",
743
+ "attribute": "user",
744
+ "mutable": false,
745
+ "complexType": {
746
+ "original": "SulaWorkbenchMenuUser",
747
+ "resolved": "SulaWorkbenchMenuUser",
748
+ "references": {
749
+ "SulaWorkbenchMenuUser": {
750
+ "location": "import",
751
+ "path": "./model/sula-workbench-menu.model",
752
+ "id": "src/components/sula-workbench-menu/model/sula-workbench-menu.model.ts::SulaWorkbenchMenuUser"
753
+ }
754
+ }
755
+ },
756
+ "required": false,
757
+ "optional": true,
758
+ "docs": {
759
+ "tags": [],
760
+ "text": "Logged user shown at the bottom of the menu. Without a photo, the initials are shown."
761
+ },
762
+ "getter": false,
763
+ "setter": false
764
+ },
765
+ "defaultIcon": {
766
+ "type": "string",
767
+ "attribute": "default-icon",
768
+ "mutable": false,
769
+ "complexType": {
770
+ "original": "string",
771
+ "resolved": "string",
772
+ "references": {}
773
+ },
774
+ "required": false,
775
+ "optional": false,
776
+ "docs": {
777
+ "tags": [],
778
+ "text": "Icon used for items without `icon` or `image`. Use an empty string to show no icon."
779
+ },
780
+ "getter": false,
781
+ "setter": false,
782
+ "reflect": false,
783
+ "defaultValue": "'ph ph-dot-outline'"
784
+ },
785
+ "profileItems": {
786
+ "type": "unknown",
787
+ "attribute": "profile-items",
788
+ "mutable": true,
789
+ "complexType": {
790
+ "original": "SulaProfileMenuItem[]",
791
+ "resolved": "SulaProfileMenuItem[]",
792
+ "references": {
793
+ "SulaProfileMenuItem": {
794
+ "location": "import",
795
+ "path": "../sula-profile-menu/model/sula-profile-menu.model",
796
+ "id": "src/components/sula-profile-menu/model/sula-profile-menu.model.ts::SulaProfileMenuItem"
797
+ }
798
+ }
799
+ },
800
+ "required": false,
801
+ "optional": false,
802
+ "docs": {
803
+ "tags": [],
804
+ "text": "Options of the profile popover. Use `divider` for a separator and `hasSwitch` + `active` for a toggle row."
805
+ },
806
+ "getter": false,
807
+ "setter": false,
808
+ "defaultValue": "[]"
809
+ }
810
+ };
811
+ }
812
+ static get states() {
813
+ return {
814
+ "collapsed": {},
815
+ "previewExpanded": {},
816
+ "stack": {},
817
+ "direction": {},
818
+ "selectedPath": {},
819
+ "crumbMenu": {},
820
+ "profileOpen": {}
821
+ };
822
+ }
823
+ static get events() {
824
+ return [{
825
+ "method": "itemSelected",
826
+ "name": "itemSelected",
827
+ "bubbles": true,
828
+ "cancelable": true,
829
+ "composed": true,
830
+ "docs": {
831
+ "tags": [],
832
+ "text": "Emitted when a leaf item is selected"
833
+ },
834
+ "complexType": {
835
+ "original": "SulaWorkbenchMenuItem",
836
+ "resolved": "SulaWorkbenchMenuItem",
837
+ "references": {
838
+ "SulaWorkbenchMenuItem": {
839
+ "location": "import",
840
+ "path": "./model/sula-workbench-menu.model",
841
+ "id": "src/components/sula-workbench-menu/model/sula-workbench-menu.model.ts::SulaWorkbenchMenuItem"
842
+ }
843
+ }
844
+ }
845
+ }, {
846
+ "method": "itemClicked",
847
+ "name": "itemClicked",
848
+ "bubbles": true,
849
+ "cancelable": true,
850
+ "composed": true,
851
+ "docs": {
852
+ "tags": [],
853
+ "text": "Emitted when any item is clicked"
854
+ },
855
+ "complexType": {
856
+ "original": "SulaWorkbenchMenuItem",
857
+ "resolved": "SulaWorkbenchMenuItem",
858
+ "references": {
859
+ "SulaWorkbenchMenuItem": {
860
+ "location": "import",
861
+ "path": "./model/sula-workbench-menu.model",
862
+ "id": "src/components/sula-workbench-menu/model/sula-workbench-menu.model.ts::SulaWorkbenchMenuItem"
863
+ }
864
+ }
865
+ }
866
+ }, {
867
+ "method": "levelChanged",
868
+ "name": "levelChanged",
869
+ "bubbles": true,
870
+ "cancelable": true,
871
+ "composed": true,
872
+ "docs": {
873
+ "tags": [],
874
+ "text": "Emitted when the drill-down level changes, with the ids from the root to the level shown (empty at the root)"
875
+ },
876
+ "complexType": {
877
+ "original": "SulaWorkbenchMenuPath",
878
+ "resolved": "string[]",
879
+ "references": {
880
+ "SulaWorkbenchMenuPath": {
881
+ "location": "import",
882
+ "path": "./model/sula-workbench-menu.model",
883
+ "id": "src/components/sula-workbench-menu/model/sula-workbench-menu.model.ts::SulaWorkbenchMenuPath"
884
+ }
885
+ }
886
+ }
887
+ }, {
888
+ "method": "profileClicked",
889
+ "name": "profileClicked",
890
+ "bubbles": true,
891
+ "cancelable": true,
892
+ "composed": true,
893
+ "docs": {
894
+ "tags": [],
895
+ "text": "Emitted when the user area is clicked. Call `preventDefault()` to keep the profile popover closed."
896
+ },
897
+ "complexType": {
898
+ "original": "SulaWorkbenchMenuUser",
899
+ "resolved": "SulaWorkbenchMenuUser",
900
+ "references": {
901
+ "SulaWorkbenchMenuUser": {
902
+ "location": "import",
903
+ "path": "./model/sula-workbench-menu.model",
904
+ "id": "src/components/sula-workbench-menu/model/sula-workbench-menu.model.ts::SulaWorkbenchMenuUser"
905
+ }
906
+ }
907
+ }
908
+ }, {
909
+ "method": "profileItemClicked",
910
+ "name": "profileItemClicked",
911
+ "bubbles": true,
912
+ "cancelable": true,
913
+ "composed": true,
914
+ "docs": {
915
+ "tags": [],
916
+ "text": "Emitted when a profile popover option without switch is clicked. The popover closes."
917
+ },
918
+ "complexType": {
919
+ "original": "SulaProfileMenuItem",
920
+ "resolved": "SulaProfileMenuItem",
921
+ "references": {
922
+ "SulaProfileMenuItem": {
923
+ "location": "import",
924
+ "path": "../sula-profile-menu/model/sula-profile-menu.model",
925
+ "id": "src/components/sula-profile-menu/model/sula-profile-menu.model.ts::SulaProfileMenuItem"
926
+ }
927
+ }
928
+ }
929
+ }, {
930
+ "method": "profileSwitchChanged",
931
+ "name": "profileSwitchChanged",
932
+ "bubbles": true,
933
+ "cancelable": true,
934
+ "composed": true,
935
+ "docs": {
936
+ "tags": [],
937
+ "text": "Emitted when the switch of a profile popover option changes. The popover stays open."
938
+ },
939
+ "complexType": {
940
+ "original": "SulaProfileMenuSwitchChange",
941
+ "resolved": "SulaProfileMenuSwitchChange",
942
+ "references": {
943
+ "SulaProfileMenuSwitchChange": {
944
+ "location": "import",
945
+ "path": "../sula-profile-menu/model/sula-profile-menu.model",
946
+ "id": "src/components/sula-profile-menu/model/sula-profile-menu.model.ts::SulaProfileMenuSwitchChange"
947
+ }
948
+ }
949
+ }
950
+ }, {
951
+ "method": "menuToggled",
952
+ "name": "menuToggled",
953
+ "bubbles": true,
954
+ "cancelable": true,
955
+ "composed": true,
956
+ "docs": {
957
+ "tags": [],
958
+ "text": "Emitted when the menu is toggled between collapsed and expanded states\nTrue: Menu is expanded\nFalse: Menu is collapsed"
959
+ },
960
+ "complexType": {
961
+ "original": "boolean",
962
+ "resolved": "boolean",
963
+ "references": {}
964
+ }
965
+ }];
966
+ }
967
+ static get elementRef() { return "el"; }
968
+ static get watchers() {
969
+ return [{
970
+ "propName": "items",
971
+ "methodName": "syncWithItems"
972
+ }];
973
+ }
974
+ static get listeners() {
975
+ return [{
976
+ "name": "click",
977
+ "method": "onDocumentClick",
978
+ "target": "document",
979
+ "capture": false,
980
+ "passive": false
981
+ }, {
982
+ "name": "keydown",
983
+ "method": "onDocumentKeydown",
984
+ "target": "document",
985
+ "capture": false,
986
+ "passive": false
987
+ }, {
988
+ "name": "resize",
989
+ "method": "onWindowResize",
990
+ "target": "window",
991
+ "capture": false,
992
+ "passive": true
993
+ }];
994
+ }
995
+ }
996
+ //# sourceMappingURL=sula-workbench-menu.js.map