@luzmo/ngx-lucero 1.0.3-alpha.6 → 1.0.3-alpha.8

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.
@@ -0,0 +1,29 @@
1
+ import { OnChanges, SimpleChanges } from '@angular/core';
2
+ import '@luzmo/lucero/menu';
3
+ import type { LuzmoMenuDivider as LuzmoMenuDividerHostElement } from '@luzmo/lucero/menu';
4
+ import * as i0 from "@angular/core";
5
+ export type { MenuChildItem, MenuItemChildren } from '@luzmo/lucero/menu';
6
+ export declare class LuzmoMenuDivider implements OnChanges {
7
+ private readonly elementRef;
8
+ private readonly renderer;
9
+ private readonly destroyRef;
10
+ private readonly host;
11
+ private readonly listenerCleanup;
12
+ /** The underlying custom element instance. Use to call imperative methods. */
13
+ get nativeElement(): LuzmoMenuDividerHostElement;
14
+ size?: ('xxs' | 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl');
15
+ constructor();
16
+ ngOnChanges(changes: SimpleChanges): void;
17
+ /**
18
+ * Forward a wrapper @Input to the underlying host element via Renderer2 so
19
+ * the wrapper stays compatible with non-DOM Angular platforms (SSR, tests).
20
+ * Unlike a "skip undefined" guard, this lets consumers reset values back to
21
+ * undefined / null by clearing their bindings.
22
+ */
23
+ private setHostProperty;
24
+ private bindEvents;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<LuzmoMenuDivider, never>;
26
+ static ɵcmp: i0.ɵɵComponentDeclaration<LuzmoMenuDivider, "luzmo-menu-divider", ["luzmoMenuDivider"], { "size": { "alias": "size"; "required": false; }; }, {}, never, ["*"], true, never>;
27
+ }
28
+ /** The underlying custom element type for LuzmoMenuDivider */
29
+ export type LuzmoMenuDividerElement = LuzmoMenuDividerHostElement;
@@ -0,0 +1,69 @@
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, Input, Renderer2 } from '@angular/core';
2
+ import '@luzmo/lucero/menu';
3
+ import * as i0 from "@angular/core";
4
+ const _c0 = ["*"];
5
+ /**
6
+ * Angular wrapper component for <luzmo-menu-divider>
7
+ */
8
+ export class LuzmoMenuDivider {
9
+ elementRef = inject(ElementRef);
10
+ renderer = inject(Renderer2);
11
+ destroyRef = inject(DestroyRef);
12
+ host = this.elementRef.nativeElement;
13
+ listenerCleanup = [];
14
+ /** The underlying custom element instance. Use to call imperative methods. */
15
+ get nativeElement() {
16
+ return this.host;
17
+ }
18
+ size;
19
+ constructor() {
20
+ this.bindEvents();
21
+ this.destroyRef.onDestroy(() => {
22
+ for (const cleanup of this.listenerCleanup) {
23
+ cleanup();
24
+ }
25
+ });
26
+ }
27
+ ngOnChanges(changes) {
28
+ for (const key of Object.keys(changes)) {
29
+ switch (key) {
30
+ case 'size':
31
+ this.setHostProperty('size', changes['size'].currentValue);
32
+ break;
33
+ default:
34
+ break;
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * Forward a wrapper @Input to the underlying host element via Renderer2 so
40
+ * the wrapper stays compatible with non-DOM Angular platforms (SSR, tests).
41
+ * Unlike a "skip undefined" guard, this lets consumers reset values back to
42
+ * undefined / null by clearing their bindings.
43
+ */
44
+ setHostProperty(key, value) {
45
+ this.renderer.setProperty(this.host, key, value);
46
+ }
47
+ bindEvents() {
48
+ // No custom events for this wrapper.
49
+ }
50
+ static ɵfac = function LuzmoMenuDivider_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LuzmoMenuDivider)(); };
51
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoMenuDivider, selectors: [["luzmo-menu-divider"]], inputs: { size: "size" }, exportAs: ["luzmoMenuDivider"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoMenuDivider_Template(rf, ctx) { if (rf & 1) {
52
+ i0.ɵɵprojectionDef();
53
+ i0.ɵɵprojection(0);
54
+ } }, encapsulation: 2, changeDetection: 0 });
55
+ }
56
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LuzmoMenuDivider, [{
57
+ type: Component,
58
+ args: [{
59
+ selector: 'luzmo-menu-divider',
60
+ exportAs: 'luzmoMenuDivider',
61
+ standalone: true,
62
+ changeDetection: ChangeDetectionStrategy.OnPush,
63
+ template: '<ng-content />'
64
+ }]
65
+ }], () => [], { size: [{
66
+ type: Input,
67
+ args: [{ alias: 'size' }]
68
+ }] }); })();
69
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LuzmoMenuDivider, { className: "LuzmoMenuDivider", filePath: "components/menu-divider.ts", lineNumber: 16 }); })();
@@ -0,0 +1,55 @@
1
+ import { OnChanges, SimpleChanges } from '@angular/core';
2
+ import { ControlValueAccessor } from '@angular/forms';
3
+ import '@luzmo/lucero/menu';
4
+ import type { LuzmoMenuGroup as LuzmoMenuGroupHostElement } from '@luzmo/lucero/menu';
5
+ import * as i0 from "@angular/core";
6
+ export type { MenuChildItem, MenuItemChildren } from '@luzmo/lucero/menu';
7
+ export declare class LuzmoMenuGroup implements OnChanges, ControlValueAccessor {
8
+ private readonly elementRef;
9
+ private readonly renderer;
10
+ private readonly destroyRef;
11
+ private readonly host;
12
+ private readonly listenerCleanup;
13
+ /** The underlying custom element instance. Use to call imperative methods. */
14
+ get nativeElement(): LuzmoMenuGroupHostElement;
15
+ size?: ('xxs' | 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl');
16
+ label?: string;
17
+ ignore?: boolean;
18
+ variant?: 'checkmarks' | 'highlight';
19
+ selects?: never | 'inherit' | 'single' | 'multiple';
20
+ value?: string;
21
+ valueSeparator?: string;
22
+ selected?: string[];
23
+ selectedItems?: unknown;
24
+ menuSlot?: unknown;
25
+ focusedItemIndex?: number;
26
+ focusInItemIndex?: number;
27
+ handleSubmenuClosed?: unknown;
28
+ handleSubmenuOpened?: unknown;
29
+ /** Announces that the `value` of the element has changed */
30
+ readonly changeEvent: import("@angular/core").OutputEmitterRef<Event>;
31
+ readonly closeEvent: import("@angular/core").OutputEmitterRef<Event>;
32
+ constructor();
33
+ ngOnChanges(changes: SimpleChanges): void;
34
+ /**
35
+ * Forward a wrapper @Input to the underlying host element via Renderer2 so
36
+ * the wrapper stays compatible with non-DOM Angular platforms (SSR, tests).
37
+ * Unlike a "skip undefined" guard, this lets consumers reset values back to
38
+ * undefined / null by clearing their bindings.
39
+ */
40
+ private setHostProperty;
41
+ private bindEvents;
42
+ private onChange;
43
+ private onTouched;
44
+ private isWritingValue;
45
+ private lastCvaValue;
46
+ writeValue(value: string): void;
47
+ registerOnChange(fn: (value: string) => void): void;
48
+ registerOnTouched(fn: () => void): void;
49
+ setDisabledState(isDisabled: boolean): void;
50
+ focus({ preventScroll }: FocusOptions): void;
51
+ static ɵfac: i0.ɵɵFactoryDeclaration<LuzmoMenuGroup, never>;
52
+ static ɵcmp: i0.ɵɵComponentDeclaration<LuzmoMenuGroup, "luzmo-menu-group", ["luzmoMenuGroup"], { "size": { "alias": "size"; "required": false; }; "label": { "alias": "label"; "required": false; }; "ignore": { "alias": "ignore"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "selects": { "alias": "selects"; "required": false; }; "value": { "alias": "value"; "required": false; }; "valueSeparator": { "alias": "valueSeparator"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "selectedItems": { "alias": "selectedItems"; "required": false; }; "menuSlot": { "alias": "menuSlot"; "required": false; }; "focusedItemIndex": { "alias": "focusedItemIndex"; "required": false; }; "focusInItemIndex": { "alias": "focusInItemIndex"; "required": false; }; "handleSubmenuClosed": { "alias": "handleSubmenuClosed"; "required": false; }; "handleSubmenuOpened": { "alias": "handleSubmenuOpened"; "required": false; }; }, { "changeEvent": "change"; "closeEvent": "close"; }, never, ["*"], true, never>;
53
+ }
54
+ /** The underlying custom element type for LuzmoMenuGroup */
55
+ export type LuzmoMenuGroupElement = LuzmoMenuGroupHostElement;
@@ -0,0 +1,229 @@
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, forwardRef, inject, Input, output, Renderer2 } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import '@luzmo/lucero/menu';
4
+ import * as i0 from "@angular/core";
5
+ const _c0 = ["*"];
6
+ /**
7
+ * Angular wrapper component for <luzmo-menu-group>
8
+ *
9
+ * @slot header - headline of the menu group
10
+ * @slot (default) - menu items to be listed in the group
11
+ */
12
+ export class LuzmoMenuGroup {
13
+ elementRef = inject(ElementRef);
14
+ renderer = inject(Renderer2);
15
+ destroyRef = inject(DestroyRef);
16
+ host = this.elementRef.nativeElement;
17
+ listenerCleanup = [];
18
+ /** The underlying custom element instance. Use to call imperative methods. */
19
+ get nativeElement() {
20
+ return this.host;
21
+ }
22
+ size;
23
+ label;
24
+ ignore;
25
+ variant;
26
+ selects;
27
+ value;
28
+ valueSeparator;
29
+ selected;
30
+ selectedItems;
31
+ menuSlot;
32
+ focusedItemIndex;
33
+ focusInItemIndex;
34
+ handleSubmenuClosed;
35
+ handleSubmenuOpened;
36
+ /** Announces that the `value` of the element has changed */
37
+ changeEvent = output({ alias: 'change' });
38
+ closeEvent = output({ alias: 'close' });
39
+ constructor() {
40
+ this.bindEvents();
41
+ this.destroyRef.onDestroy(() => {
42
+ for (const cleanup of this.listenerCleanup) {
43
+ cleanup();
44
+ }
45
+ });
46
+ }
47
+ ngOnChanges(changes) {
48
+ for (const key of Object.keys(changes)) {
49
+ switch (key) {
50
+ case 'size':
51
+ this.setHostProperty('size', changes['size'].currentValue);
52
+ break;
53
+ case 'label':
54
+ this.setHostProperty('label', changes['label'].currentValue);
55
+ break;
56
+ case 'ignore':
57
+ this.setHostProperty('ignore', changes['ignore'].currentValue);
58
+ break;
59
+ case 'variant':
60
+ this.setHostProperty('variant', changes['variant'].currentValue);
61
+ break;
62
+ case 'selects':
63
+ this.setHostProperty('selects', changes['selects'].currentValue);
64
+ break;
65
+ case 'value':
66
+ this.setHostProperty('value', changes['value'].currentValue);
67
+ break;
68
+ case 'valueSeparator':
69
+ this.setHostProperty('valueSeparator', changes['valueSeparator'].currentValue);
70
+ break;
71
+ case 'selected':
72
+ this.setHostProperty('selected', changes['selected'].currentValue);
73
+ break;
74
+ case 'selectedItems':
75
+ this.setHostProperty('selectedItems', changes['selectedItems'].currentValue);
76
+ break;
77
+ case 'menuSlot':
78
+ this.setHostProperty('menuSlot', changes['menuSlot'].currentValue);
79
+ break;
80
+ case 'focusedItemIndex':
81
+ this.setHostProperty('focusedItemIndex', changes['focusedItemIndex'].currentValue);
82
+ break;
83
+ case 'focusInItemIndex':
84
+ this.setHostProperty('focusInItemIndex', changes['focusInItemIndex'].currentValue);
85
+ break;
86
+ case 'handleSubmenuClosed':
87
+ this.setHostProperty('handleSubmenuClosed', changes['handleSubmenuClosed'].currentValue);
88
+ break;
89
+ case 'handleSubmenuOpened':
90
+ this.setHostProperty('handleSubmenuOpened', changes['handleSubmenuOpened'].currentValue);
91
+ break;
92
+ default:
93
+ break;
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Forward a wrapper @Input to the underlying host element via Renderer2 so
99
+ * the wrapper stays compatible with non-DOM Angular platforms (SSR, tests).
100
+ * Unlike a "skip undefined" guard, this lets consumers reset values back to
101
+ * undefined / null by clearing their bindings.
102
+ */
103
+ setHostProperty(key, value) {
104
+ this.renderer.setProperty(this.host, key, value);
105
+ }
106
+ bindEvents() {
107
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'change', (event) => {
108
+ this.changeEvent.emit(event);
109
+ if (!this.isWritingValue) {
110
+ const eventWithDetail = event;
111
+ const eventTarget = event.target;
112
+ const detail = 'detail' in eventWithDetail ? eventWithDetail.detail : undefined;
113
+ const detailRecord = detail != null && typeof detail === 'object' ? detail : undefined;
114
+ const hostRecord = this.host;
115
+ const nextValue = (detailRecord != null && 'value' in detailRecord
116
+ ? detailRecord['value']
117
+ : (detailRecord === undefined ? detail : undefined)
118
+ ?? eventTarget?.['value']
119
+ ?? hostRecord['value']);
120
+ if (Object.is(this.lastCvaValue, nextValue)) {
121
+ return;
122
+ }
123
+ this.lastCvaValue = nextValue;
124
+ this.setHostProperty('value', nextValue);
125
+ this.onChange(nextValue);
126
+ }
127
+ }));
128
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'close', (event) => {
129
+ this.closeEvent.emit(event);
130
+ }));
131
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'blur', () => {
132
+ this.onTouched();
133
+ }));
134
+ }
135
+ onChange = () => { };
136
+ onTouched = () => { };
137
+ isWritingValue = false;
138
+ lastCvaValue;
139
+ writeValue(value) {
140
+ this.isWritingValue = true;
141
+ this.lastCvaValue = value;
142
+ this.setHostProperty('value', value);
143
+ this.isWritingValue = false;
144
+ }
145
+ registerOnChange(fn) {
146
+ this.onChange = fn;
147
+ }
148
+ registerOnTouched(fn) {
149
+ this.onTouched = fn;
150
+ }
151
+ setDisabledState(isDisabled) {
152
+ // Underlying element does not declare a 'disabled' field; nothing to do.
153
+ void isDisabled;
154
+ }
155
+ focus({ preventScroll }) {
156
+ return this.host.focus({ preventScroll });
157
+ }
158
+ static ɵfac = function LuzmoMenuGroup_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LuzmoMenuGroup)(); };
159
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoMenuGroup, selectors: [["luzmo-menu-group"]], inputs: { size: "size", label: "label", ignore: "ignore", variant: "variant", selects: "selects", value: "value", valueSeparator: "valueSeparator", selected: "selected", selectedItems: "selectedItems", menuSlot: "menuSlot", focusedItemIndex: "focusedItemIndex", focusInItemIndex: "focusInItemIndex", handleSubmenuClosed: "handleSubmenuClosed", handleSubmenuOpened: "handleSubmenuOpened" }, outputs: { changeEvent: "change", closeEvent: "close" }, exportAs: ["luzmoMenuGroup"], features: [i0.ɵɵProvidersFeature([
160
+ {
161
+ provide: NG_VALUE_ACCESSOR,
162
+ useExisting: forwardRef(() => LuzmoMenuGroup),
163
+ multi: true
164
+ }
165
+ ]), i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoMenuGroup_Template(rf, ctx) { if (rf & 1) {
166
+ i0.ɵɵprojectionDef();
167
+ i0.ɵɵprojection(0);
168
+ } }, encapsulation: 2, changeDetection: 0 });
169
+ }
170
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LuzmoMenuGroup, [{
171
+ type: Component,
172
+ args: [{
173
+ selector: 'luzmo-menu-group',
174
+ exportAs: 'luzmoMenuGroup',
175
+ standalone: true,
176
+ changeDetection: ChangeDetectionStrategy.OnPush,
177
+ template: '<ng-content />',
178
+ providers: [
179
+ {
180
+ provide: NG_VALUE_ACCESSOR,
181
+ useExisting: forwardRef(() => LuzmoMenuGroup),
182
+ multi: true
183
+ }
184
+ ]
185
+ }]
186
+ }], () => [], { size: [{
187
+ type: Input,
188
+ args: [{ alias: 'size' }]
189
+ }], label: [{
190
+ type: Input,
191
+ args: [{ alias: 'label' }]
192
+ }], ignore: [{
193
+ type: Input,
194
+ args: [{ alias: 'ignore' }]
195
+ }], variant: [{
196
+ type: Input,
197
+ args: [{ alias: 'variant' }]
198
+ }], selects: [{
199
+ type: Input,
200
+ args: [{ alias: 'selects' }]
201
+ }], value: [{
202
+ type: Input,
203
+ args: [{ alias: 'value' }]
204
+ }], valueSeparator: [{
205
+ type: Input,
206
+ args: [{ alias: 'valueSeparator' }]
207
+ }], selected: [{
208
+ type: Input,
209
+ args: [{ alias: 'selected' }]
210
+ }], selectedItems: [{
211
+ type: Input,
212
+ args: [{ alias: 'selectedItems' }]
213
+ }], menuSlot: [{
214
+ type: Input,
215
+ args: [{ alias: 'menuSlot' }]
216
+ }], focusedItemIndex: [{
217
+ type: Input,
218
+ args: [{ alias: 'focusedItemIndex' }]
219
+ }], focusInItemIndex: [{
220
+ type: Input,
221
+ args: [{ alias: 'focusInItemIndex' }]
222
+ }], handleSubmenuClosed: [{
223
+ type: Input,
224
+ args: [{ alias: 'handleSubmenuClosed' }]
225
+ }], handleSubmenuOpened: [{
226
+ type: Input,
227
+ args: [{ alias: 'handleSubmenuOpened' }]
228
+ }], changeEvent: [{ type: i0.Output, args: ["change"] }], closeEvent: [{ type: i0.Output, args: ["close"] }] }); })();
229
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LuzmoMenuGroup, { className: "LuzmoMenuGroup", filePath: "components/menu-group.ts", lineNumber: 27 }); })();
@@ -0,0 +1,64 @@
1
+ import { OnChanges, SimpleChanges } from '@angular/core';
2
+ import '@luzmo/lucero/menu';
3
+ import type { LuzmoMenuItem as LuzmoMenuItemHostElement } from '@luzmo/lucero/menu';
4
+ import * as i0 from "@angular/core";
5
+ export type { MenuChildItem, MenuItemChildren } from '@luzmo/lucero/menu';
6
+ export declare class LuzmoMenuItem implements OnChanges {
7
+ private readonly elementRef;
8
+ private readonly renderer;
9
+ private readonly destroyRef;
10
+ private readonly host;
11
+ private readonly listenerCleanup;
12
+ /** The underlying custom element instance. Use to call imperative methods. */
13
+ get nativeElement(): LuzmoMenuItemHostElement;
14
+ abortControllerSubmenu?: unknown;
15
+ active?: boolean;
16
+ focused?: boolean;
17
+ selected?: boolean;
18
+ value?: string;
19
+ hasSubmenu?: boolean;
20
+ tooltip?: string;
21
+ tooltipPlacement?: 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end';
22
+ contentSlot?: unknown;
23
+ iconSlot?: unknown;
24
+ noWrap?: boolean;
25
+ overlayElement?: unknown;
26
+ open?: boolean;
27
+ menuData?: unknown;
28
+ /** Causes the browser to treat the linked URL as a download. */
29
+ download?: string;
30
+ /** An accessible label that describes the component. It will be applied to aria-label, but not visually rendered. */
31
+ label?: string;
32
+ /** The URL that the hyperlink points to. */
33
+ href?: string;
34
+ /** Where to display the linked URL, as the name for a browsing context (a tab, window, or &lt;iframe&gt;). */
35
+ target?: '_blank' | '_parent' | '_self' | '_top';
36
+ /** How much of the referrer to send when following the link. */
37
+ referrerpolicy?: 'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url';
38
+ /** The relationship of the linked URL as space-separated link types. */
39
+ rel?: string;
40
+ managePresenceObservedSlot?: unknown;
41
+ /** Disable this control. It will not receive focus or events */
42
+ disabled?: boolean;
43
+ /** The tab index to apply to this control. See general documentation about the tabindex HTML property */
44
+ tabIndex?: number;
45
+ /** announces the item has been added so a parent menu can take ownerships */
46
+ readonly luzmoMenuItemAddedEvent: import("@angular/core").OutputEmitterRef<CustomEvent<unknown>>;
47
+ /** Trick :focus-visible polyfill into thinking keyboard based focus */
48
+ readonly keydownEvent: import("@angular/core").OutputEmitterRef<unknown>;
49
+ constructor();
50
+ ngOnChanges(changes: SimpleChanges): void;
51
+ /**
52
+ * Forward a wrapper @Input to the underlying host element via Renderer2 so
53
+ * the wrapper stays compatible with non-DOM Angular platforms (SSR, tests).
54
+ * Unlike a "skip undefined" guard, this lets consumers reset values back to
55
+ * undefined / null by clearing their bindings.
56
+ */
57
+ private setHostProperty;
58
+ private bindEvents;
59
+ focus(options?: FocusOptions): void;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<LuzmoMenuItem, never>;
61
+ static ɵcmp: i0.ɵɵComponentDeclaration<LuzmoMenuItem, "luzmo-menu-item", ["luzmoMenuItem"], { "abortControllerSubmenu": { "alias": "abortControllerSubmenu"; "required": false; }; "active": { "alias": "active"; "required": false; }; "focused": { "alias": "focused"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "value": { "alias": "value"; "required": false; }; "hasSubmenu": { "alias": "hasSubmenu"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "tooltipPlacement": { "alias": "tooltipPlacement"; "required": false; }; "contentSlot": { "alias": "contentSlot"; "required": false; }; "iconSlot": { "alias": "iconSlot"; "required": false; }; "noWrap": { "alias": "noWrap"; "required": false; }; "overlayElement": { "alias": "overlayElement"; "required": false; }; "open": { "alias": "open"; "required": false; }; "menuData": { "alias": "menuData"; "required": false; }; "download": { "alias": "download"; "required": false; }; "label": { "alias": "label"; "required": false; }; "href": { "alias": "href"; "required": false; }; "target": { "alias": "target"; "required": false; }; "referrerpolicy": { "alias": "referrerpolicy"; "required": false; }; "rel": { "alias": "rel"; "required": false; }; "managePresenceObservedSlot": { "alias": "managePresenceObservedSlot"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; }, { "luzmoMenuItemAddedEvent": "luzmo-menu-item-added"; "keydownEvent": "keydown"; }, never, ["*"], true, never>;
62
+ }
63
+ /** The underlying custom element type for LuzmoMenuItem */
64
+ export type LuzmoMenuItemElement = LuzmoMenuItemHostElement;
@@ -0,0 +1,249 @@
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, Input, output, Renderer2 } from '@angular/core';
2
+ import '@luzmo/lucero/menu';
3
+ import * as i0 from "@angular/core";
4
+ const _c0 = ["*"];
5
+ /**
6
+ * Angular wrapper component for <luzmo-menu-item>
7
+ *
8
+ * @slot (default) - text content to display within the Menu Item
9
+ * @slot description - description to be placed below the label of the Menu Item
10
+ * @slot icon - icon element to be placed at the start of the Menu Item
11
+ * @slot value - content placed at the end of the Menu Item like values, keyboard shortcuts, etc.
12
+ * @slot submenu - content placed in a submenu
13
+ */
14
+ export class LuzmoMenuItem {
15
+ elementRef = inject(ElementRef);
16
+ renderer = inject(Renderer2);
17
+ destroyRef = inject(DestroyRef);
18
+ host = this.elementRef.nativeElement;
19
+ listenerCleanup = [];
20
+ /** The underlying custom element instance. Use to call imperative methods. */
21
+ get nativeElement() {
22
+ return this.host;
23
+ }
24
+ abortControllerSubmenu;
25
+ active;
26
+ focused;
27
+ selected;
28
+ value;
29
+ hasSubmenu;
30
+ tooltip;
31
+ tooltipPlacement;
32
+ contentSlot;
33
+ iconSlot;
34
+ noWrap;
35
+ overlayElement;
36
+ open;
37
+ menuData;
38
+ /** Causes the browser to treat the linked URL as a download. */
39
+ download;
40
+ /** An accessible label that describes the component. It will be applied to aria-label, but not visually rendered. */
41
+ label;
42
+ /** The URL that the hyperlink points to. */
43
+ href;
44
+ /** Where to display the linked URL, as the name for a browsing context (a tab, window, or &lt;iframe&gt;). */
45
+ target;
46
+ /** How much of the referrer to send when following the link. */
47
+ referrerpolicy;
48
+ /** The relationship of the linked URL as space-separated link types. */
49
+ rel;
50
+ managePresenceObservedSlot;
51
+ /** Disable this control. It will not receive focus or events */
52
+ disabled;
53
+ /** The tab index to apply to this control. See general documentation about the tabindex HTML property */
54
+ tabIndex;
55
+ /** announces the item has been added so a parent menu can take ownerships */
56
+ luzmoMenuItemAddedEvent = output({ alias: 'luzmo-menu-item-added' });
57
+ /** Trick :focus-visible polyfill into thinking keyboard based focus */
58
+ keydownEvent = output({ alias: 'keydown' });
59
+ constructor() {
60
+ this.bindEvents();
61
+ this.destroyRef.onDestroy(() => {
62
+ for (const cleanup of this.listenerCleanup) {
63
+ cleanup();
64
+ }
65
+ });
66
+ }
67
+ ngOnChanges(changes) {
68
+ for (const key of Object.keys(changes)) {
69
+ switch (key) {
70
+ case 'abortControllerSubmenu':
71
+ this.setHostProperty('abortControllerSubmenu', changes['abortControllerSubmenu'].currentValue);
72
+ break;
73
+ case 'active':
74
+ this.setHostProperty('active', changes['active'].currentValue);
75
+ break;
76
+ case 'focused':
77
+ this.setHostProperty('focused', changes['focused'].currentValue);
78
+ break;
79
+ case 'selected':
80
+ this.setHostProperty('selected', changes['selected'].currentValue);
81
+ break;
82
+ case 'value':
83
+ this.setHostProperty('value', changes['value'].currentValue);
84
+ break;
85
+ case 'hasSubmenu':
86
+ this.setHostProperty('hasSubmenu', changes['hasSubmenu'].currentValue);
87
+ break;
88
+ case 'tooltip':
89
+ this.setHostProperty('tooltip', changes['tooltip'].currentValue);
90
+ break;
91
+ case 'tooltipPlacement':
92
+ this.setHostProperty('tooltipPlacement', changes['tooltipPlacement'].currentValue);
93
+ break;
94
+ case 'contentSlot':
95
+ this.setHostProperty('contentSlot', changes['contentSlot'].currentValue);
96
+ break;
97
+ case 'iconSlot':
98
+ this.setHostProperty('iconSlot', changes['iconSlot'].currentValue);
99
+ break;
100
+ case 'noWrap':
101
+ this.setHostProperty('noWrap', changes['noWrap'].currentValue);
102
+ break;
103
+ case 'overlayElement':
104
+ this.setHostProperty('overlayElement', changes['overlayElement'].currentValue);
105
+ break;
106
+ case 'open':
107
+ this.setHostProperty('open', changes['open'].currentValue);
108
+ break;
109
+ case 'menuData':
110
+ this.setHostProperty('menuData', changes['menuData'].currentValue);
111
+ break;
112
+ case 'download':
113
+ this.setHostProperty('download', changes['download'].currentValue);
114
+ break;
115
+ case 'label':
116
+ this.setHostProperty('label', changes['label'].currentValue);
117
+ break;
118
+ case 'href':
119
+ this.setHostProperty('href', changes['href'].currentValue);
120
+ break;
121
+ case 'target':
122
+ this.setHostProperty('target', changes['target'].currentValue);
123
+ break;
124
+ case 'referrerpolicy':
125
+ this.setHostProperty('referrerpolicy', changes['referrerpolicy'].currentValue);
126
+ break;
127
+ case 'rel':
128
+ this.setHostProperty('rel', changes['rel'].currentValue);
129
+ break;
130
+ case 'managePresenceObservedSlot':
131
+ this.setHostProperty('managePresenceObservedSlot', changes['managePresenceObservedSlot'].currentValue);
132
+ break;
133
+ case 'disabled':
134
+ this.setHostProperty('disabled', changes['disabled'].currentValue);
135
+ break;
136
+ case 'tabIndex':
137
+ this.setHostProperty('tabIndex', changes['tabIndex'].currentValue);
138
+ break;
139
+ default:
140
+ break;
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * Forward a wrapper @Input to the underlying host element via Renderer2 so
146
+ * the wrapper stays compatible with non-DOM Angular platforms (SSR, tests).
147
+ * Unlike a "skip undefined" guard, this lets consumers reset values back to
148
+ * undefined / null by clearing their bindings.
149
+ */
150
+ setHostProperty(key, value) {
151
+ this.renderer.setProperty(this.host, key, value);
152
+ }
153
+ bindEvents() {
154
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'luzmo-menu-item-added', (event) => {
155
+ this.luzmoMenuItemAddedEvent.emit(event);
156
+ }));
157
+ this.listenerCleanup.push(this.renderer.listen(this.host, 'keydown', (event) => {
158
+ this.keydownEvent.emit(event);
159
+ }));
160
+ }
161
+ focus(options) {
162
+ return this.host.focus(options);
163
+ }
164
+ static ɵfac = function LuzmoMenuItem_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LuzmoMenuItem)(); };
165
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoMenuItem, selectors: [["luzmo-menu-item"]], inputs: { abortControllerSubmenu: "abortControllerSubmenu", active: "active", focused: "focused", selected: "selected", value: "value", hasSubmenu: "hasSubmenu", tooltip: "tooltip", tooltipPlacement: "tooltipPlacement", contentSlot: "contentSlot", iconSlot: "iconSlot", noWrap: "noWrap", overlayElement: "overlayElement", open: "open", menuData: "menuData", download: "download", label: "label", href: "href", target: "target", referrerpolicy: "referrerpolicy", rel: "rel", managePresenceObservedSlot: "managePresenceObservedSlot", disabled: "disabled", tabIndex: "tabIndex" }, outputs: { luzmoMenuItemAddedEvent: "luzmo-menu-item-added", keydownEvent: "keydown" }, exportAs: ["luzmoMenuItem"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoMenuItem_Template(rf, ctx) { if (rf & 1) {
166
+ i0.ɵɵprojectionDef();
167
+ i0.ɵɵprojection(0);
168
+ } }, encapsulation: 2, changeDetection: 0 });
169
+ }
170
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LuzmoMenuItem, [{
171
+ type: Component,
172
+ args: [{
173
+ selector: 'luzmo-menu-item',
174
+ exportAs: 'luzmoMenuItem',
175
+ standalone: true,
176
+ changeDetection: ChangeDetectionStrategy.OnPush,
177
+ template: '<ng-content />'
178
+ }]
179
+ }], () => [], { abortControllerSubmenu: [{
180
+ type: Input,
181
+ args: [{ alias: 'abortControllerSubmenu' }]
182
+ }], active: [{
183
+ type: Input,
184
+ args: [{ alias: 'active' }]
185
+ }], focused: [{
186
+ type: Input,
187
+ args: [{ alias: 'focused' }]
188
+ }], selected: [{
189
+ type: Input,
190
+ args: [{ alias: 'selected' }]
191
+ }], value: [{
192
+ type: Input,
193
+ args: [{ alias: 'value' }]
194
+ }], hasSubmenu: [{
195
+ type: Input,
196
+ args: [{ alias: 'hasSubmenu' }]
197
+ }], tooltip: [{
198
+ type: Input,
199
+ args: [{ alias: 'tooltip' }]
200
+ }], tooltipPlacement: [{
201
+ type: Input,
202
+ args: [{ alias: 'tooltipPlacement' }]
203
+ }], contentSlot: [{
204
+ type: Input,
205
+ args: [{ alias: 'contentSlot' }]
206
+ }], iconSlot: [{
207
+ type: Input,
208
+ args: [{ alias: 'iconSlot' }]
209
+ }], noWrap: [{
210
+ type: Input,
211
+ args: [{ alias: 'noWrap' }]
212
+ }], overlayElement: [{
213
+ type: Input,
214
+ args: [{ alias: 'overlayElement' }]
215
+ }], open: [{
216
+ type: Input,
217
+ args: [{ alias: 'open' }]
218
+ }], menuData: [{
219
+ type: Input,
220
+ args: [{ alias: 'menuData' }]
221
+ }], download: [{
222
+ type: Input,
223
+ args: [{ alias: 'download' }]
224
+ }], label: [{
225
+ type: Input,
226
+ args: [{ alias: 'label' }]
227
+ }], href: [{
228
+ type: Input,
229
+ args: [{ alias: 'href' }]
230
+ }], target: [{
231
+ type: Input,
232
+ args: [{ alias: 'target' }]
233
+ }], referrerpolicy: [{
234
+ type: Input,
235
+ args: [{ alias: 'referrerpolicy' }]
236
+ }], rel: [{
237
+ type: Input,
238
+ args: [{ alias: 'rel' }]
239
+ }], managePresenceObservedSlot: [{
240
+ type: Input,
241
+ args: [{ alias: 'managePresenceObservedSlot' }]
242
+ }], disabled: [{
243
+ type: Input,
244
+ args: [{ alias: 'disabled' }]
245
+ }], tabIndex: [{
246
+ type: Input,
247
+ args: [{ alias: 'tabIndex' }]
248
+ }], luzmoMenuItemAddedEvent: [{ type: i0.Output, args: ["luzmo-menu-item-added"] }], keydownEvent: [{ type: i0.Output, args: ["keydown"] }] }); })();
249
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LuzmoMenuItem, { className: "LuzmoMenuItem", filePath: "components/menu-item.ts", lineNumber: 22 }); })();
@@ -3,6 +3,7 @@ import { ControlValueAccessor } from '@angular/forms';
3
3
  import '@luzmo/lucero/menu';
4
4
  import type { LuzmoMenu as LuzmoMenuHostElement } from '@luzmo/lucero/menu';
5
5
  import * as i0 from "@angular/core";
6
+ export type { MenuChildItem, MenuItemChildren } from '@luzmo/lucero/menu';
6
7
  export declare class LuzmoMenu implements OnChanges, ControlValueAccessor {
7
8
  private readonly elementRef;
8
9
  private readonly renderer;
@@ -225,4 +225,4 @@ export class LuzmoMenu {
225
225
  type: Input,
226
226
  args: [{ alias: 'size' }]
227
227
  }], changeEvent: [{ type: i0.Output, args: ["change"] }], closeEvent: [{ type: i0.Output, args: ["close"] }] }); })();
228
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LuzmoMenu, { className: "LuzmoMenu", filePath: "components/menu.ts", lineNumber: 25 }); })();
228
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LuzmoMenu, { className: "LuzmoMenu", filePath: "components/menu.ts", lineNumber: 26 }); })();
@@ -27,6 +27,8 @@ export declare class LuzmoTooltip implements OnChanges {
27
27
  tipElement?: unknown;
28
28
  tipPadding?: number;
29
29
  variant?: string;
30
+ /** Explicit trigger element for a self-managed Tooltip. Setting this bypasses the composed-tree resolution walk entirely, which is the durable fix for virtualized/detached contexts (e.g. virtual-scroll recycling, CDK drag) where the walk cannot reliably find an ancestor. */
31
+ triggerElement?: HTMLElement | null;
30
32
  size?: ('xxs' | 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl');
31
33
  constructor();
32
34
  ngOnChanges(changes: SimpleChanges): void;
@@ -39,7 +41,7 @@ export declare class LuzmoTooltip implements OnChanges {
39
41
  private setHostProperty;
40
42
  private bindEvents;
41
43
  static ɵfac: i0.ɵɵFactoryDeclaration<LuzmoTooltip, never>;
42
- static ɵcmp: i0.ɵɵComponentDeclaration<LuzmoTooltip, "luzmo-tooltip", ["luzmoTooltip"], { "delayed": { "alias": "delayed"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "showOnlyIfTruncated": { "alias": "showOnlyIfTruncated"; "required": false; }; "truncatedElementSelector": { "alias": "truncatedElementSelector"; "required": false; }; "selfManaged": { "alias": "selfManaged"; "required": false; }; "offset": { "alias": "offset"; "required": false; }; "open": { "alias": "open"; "required": false; }; "overlayElement": { "alias": "overlayElement"; "required": false; }; "placement": { "alias": "placement"; "required": false; }; "tipElement": { "alias": "tipElement"; "required": false; }; "tipPadding": { "alias": "tipPadding"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, {}, never, ["*"], true, never>;
44
+ static ɵcmp: i0.ɵɵComponentDeclaration<LuzmoTooltip, "luzmo-tooltip", ["luzmoTooltip"], { "delayed": { "alias": "delayed"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "showOnlyIfTruncated": { "alias": "showOnlyIfTruncated"; "required": false; }; "truncatedElementSelector": { "alias": "truncatedElementSelector"; "required": false; }; "selfManaged": { "alias": "selfManaged"; "required": false; }; "offset": { "alias": "offset"; "required": false; }; "open": { "alias": "open"; "required": false; }; "overlayElement": { "alias": "overlayElement"; "required": false; }; "placement": { "alias": "placement"; "required": false; }; "tipElement": { "alias": "tipElement"; "required": false; }; "tipPadding": { "alias": "tipPadding"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "triggerElement": { "alias": "triggerElement"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, {}, never, ["*"], true, never>;
43
45
  }
44
46
  /** The underlying custom element type for LuzmoTooltip */
45
47
  export type LuzmoTooltipElement = LuzmoTooltipHostElement;
@@ -35,6 +35,8 @@ export class LuzmoTooltip {
35
35
  tipElement;
36
36
  tipPadding;
37
37
  variant;
38
+ /** Explicit trigger element for a self-managed Tooltip. Setting this bypasses the composed-tree resolution walk entirely, which is the durable fix for virtualized/detached contexts (e.g. virtual-scroll recycling, CDK drag) where the walk cannot reliably find an ancestor. */
39
+ triggerElement;
38
40
  size;
39
41
  constructor() {
40
42
  this.bindEvents();
@@ -83,6 +85,9 @@ export class LuzmoTooltip {
83
85
  case 'variant':
84
86
  this.setHostProperty('variant', changes['variant'].currentValue);
85
87
  break;
88
+ case 'triggerElement':
89
+ this.setHostProperty('triggerElement', changes['triggerElement'].currentValue);
90
+ break;
86
91
  case 'size':
87
92
  this.setHostProperty('size', changes['size'].currentValue);
88
93
  break;
@@ -104,7 +109,7 @@ export class LuzmoTooltip {
104
109
  // No custom events for this wrapper.
105
110
  }
106
111
  static ɵfac = function LuzmoTooltip_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LuzmoTooltip)(); };
107
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoTooltip, selectors: [["luzmo-tooltip"]], inputs: { delayed: "delayed", disabled: "disabled", showOnlyIfTruncated: "showOnlyIfTruncated", truncatedElementSelector: "truncatedElementSelector", selfManaged: "selfManaged", offset: "offset", open: "open", overlayElement: "overlayElement", placement: "placement", tipElement: "tipElement", tipPadding: "tipPadding", variant: "variant", size: "size" }, exportAs: ["luzmoTooltip"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoTooltip_Template(rf, ctx) { if (rf & 1) {
112
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoTooltip, selectors: [["luzmo-tooltip"]], inputs: { delayed: "delayed", disabled: "disabled", showOnlyIfTruncated: "showOnlyIfTruncated", truncatedElementSelector: "truncatedElementSelector", selfManaged: "selfManaged", offset: "offset", open: "open", overlayElement: "overlayElement", placement: "placement", tipElement: "tipElement", tipPadding: "tipPadding", variant: "variant", triggerElement: "triggerElement", size: "size" }, exportAs: ["luzmoTooltip"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoTooltip_Template(rf, ctx) { if (rf & 1) {
108
113
  i0.ɵɵprojectionDef();
109
114
  i0.ɵɵprojection(0);
110
115
  } }, encapsulation: 2, changeDetection: 0 });
@@ -154,6 +159,9 @@ export class LuzmoTooltip {
154
159
  }], variant: [{
155
160
  type: Input,
156
161
  args: [{ alias: 'variant' }]
162
+ }], triggerElement: [{
163
+ type: Input,
164
+ args: [{ alias: 'triggerElement' }]
157
165
  }], size: [{
158
166
  type: Input,
159
167
  args: [{ alias: 'size' }]
package/esm/index.d.ts CHANGED
@@ -33,6 +33,9 @@ import { LuzmoIcon } from './components/icon.js';
33
33
  import { LuzmoInfieldButton } from './components/infield-button.js';
34
34
  import { LuzmoLabel } from './components/label.js';
35
35
  import { LuzmoMenu } from './components/menu.js';
36
+ import { LuzmoMenuDivider } from './components/menu-divider.js';
37
+ import { LuzmoMenuGroup } from './components/menu-group.js';
38
+ import { LuzmoMenuItem } from './components/menu-item.js';
36
39
  import { LuzmoMultiLanguageField } from './components/multi-language-field.js';
37
40
  import { LuzmoNumberField } from './components/number-field.js';
38
41
  import { LuzmoOptions } from './components/options.js';
@@ -100,6 +103,9 @@ export { LuzmoIcon, type LuzmoIconElement } from './components/icon.js';
100
103
  export { LuzmoInfieldButton, type LuzmoInfieldButtonElement } from './components/infield-button.js';
101
104
  export { LuzmoLabel, type LuzmoLabelElement } from './components/label.js';
102
105
  export { LuzmoMenu, type LuzmoMenuElement } from './components/menu.js';
106
+ export { LuzmoMenuDivider, type LuzmoMenuDividerElement } from './components/menu-divider.js';
107
+ export { LuzmoMenuGroup, type LuzmoMenuGroupElement } from './components/menu-group.js';
108
+ export { LuzmoMenuItem, type LuzmoMenuItemElement } from './components/menu-item.js';
103
109
  export { LuzmoMultiLanguageField, type LuzmoMultiLanguageFieldElement } from './components/multi-language-field.js';
104
110
  export { LuzmoNumberField, type LuzmoNumberFieldElement } from './components/number-field.js';
105
111
  export { LuzmoOptions, type LuzmoOptionsElement } from './components/options.js';
@@ -132,6 +138,6 @@ export { LuzmoToast, type LuzmoToastElement } from './components/toast.js';
132
138
  export { LuzmoTooltip, type LuzmoTooltipElement } from './components/tooltip.js';
133
139
  export { LuzmoTopNav, type LuzmoTopNavElement } from './components/top-nav.js';
134
140
  export { LuzmoTopNavItem, type LuzmoTopNavItemElement } from './components/top-nav-item.js';
135
- export declare const LUZMO_ANGULAR_COMPONENTS: readonly [typeof LuzmoAccordion, typeof LuzmoAccordionItem, typeof LuzmoActionBar, typeof LuzmoActionButton, typeof LuzmoActionGroup, typeof LuzmoActionMenu, typeof LuzmoAvatar, typeof LuzmoBadge, typeof LuzmoButton, typeof LuzmoButtonGroup, typeof LuzmoCalendar, typeof LuzmoChatMessage, typeof LuzmoChatMessageGroup, typeof LuzmoCheckbox, typeof LuzmoClearButton, typeof LuzmoCloseButton, typeof LuzmoColorArea, typeof LuzmoColorField, typeof LuzmoColorHandle, typeof LuzmoColorLoupe, typeof LuzmoColorMenu, typeof LuzmoColorPalette, typeof LuzmoColorPaletteGroup, typeof LuzmoColorPicker, typeof LuzmoColorSlider, typeof LuzmoDateRangePicker, typeof LuzmoDateTimePicker, typeof LuzmoDivider, typeof LuzmoFieldGroup, typeof LuzmoFieldLabel, typeof LuzmoHelpText, typeof LuzmoIcon, typeof LuzmoInfieldButton, typeof LuzmoLabel, typeof LuzmoMenu, typeof LuzmoMultiLanguageField, typeof LuzmoNumberField, typeof LuzmoOptions, typeof LuzmoOverlay, typeof LuzmoPicker, typeof LuzmoPickerButton, typeof LuzmoPopover, typeof LuzmoProgressBar, typeof LuzmoProgressCircle, typeof LuzmoProgressSteps, typeof LuzmoPromptBox, typeof LuzmoRadio, typeof LuzmoRadioGroup, typeof LuzmoSearch, typeof LuzmoSelect, typeof LuzmoSkeletonLoader, typeof LuzmoSlider, typeof LuzmoStatusLight, typeof LuzmoSwatch, typeof LuzmoSwatchGroup, typeof LuzmoSwitch, typeof LuzmoTab, typeof LuzmoTabPanel, typeof LuzmoTabs, typeof LuzmoTabsOverflow, typeof LuzmoTag, typeof LuzmoTags, typeof LuzmoTextField, typeof LuzmoToast, typeof LuzmoTooltip, typeof LuzmoTopNav, typeof LuzmoTopNavItem];
136
- export declare const LUZMO_ANGULAR_COMPONENT_NAMES: readonly ["LuzmoAccordion", "LuzmoAccordionItem", "LuzmoActionBar", "LuzmoActionButton", "LuzmoActionGroup", "LuzmoActionMenu", "LuzmoAvatar", "LuzmoBadge", "LuzmoButton", "LuzmoButtonGroup", "LuzmoCalendar", "LuzmoChatMessage", "LuzmoChatMessageGroup", "LuzmoCheckbox", "LuzmoClearButton", "LuzmoCloseButton", "LuzmoColorArea", "LuzmoColorField", "LuzmoColorHandle", "LuzmoColorLoupe", "LuzmoColorMenu", "LuzmoColorPalette", "LuzmoColorPaletteGroup", "LuzmoColorPicker", "LuzmoColorSlider", "LuzmoDateRangePicker", "LuzmoDateTimePicker", "LuzmoDivider", "LuzmoFieldGroup", "LuzmoFieldLabel", "LuzmoHelpText", "LuzmoIcon", "LuzmoInfieldButton", "LuzmoLabel", "LuzmoMenu", "LuzmoMultiLanguageField", "LuzmoNumberField", "LuzmoOptions", "LuzmoOverlay", "LuzmoPicker", "LuzmoPickerButton", "LuzmoPopover", "LuzmoProgressBar", "LuzmoProgressCircle", "LuzmoProgressSteps", "LuzmoPromptBox", "LuzmoRadio", "LuzmoRadioGroup", "LuzmoSearch", "LuzmoSelect", "LuzmoSkeletonLoader", "LuzmoSlider", "LuzmoStatusLight", "LuzmoSwatch", "LuzmoSwatchGroup", "LuzmoSwitch", "LuzmoTab", "LuzmoTabPanel", "LuzmoTabs", "LuzmoTabsOverflow", "LuzmoTag", "LuzmoTags", "LuzmoTextField", "LuzmoToast", "LuzmoTooltip", "LuzmoTopNav", "LuzmoTopNavItem"];
141
+ export declare const LUZMO_ANGULAR_COMPONENTS: readonly [typeof LuzmoAccordion, typeof LuzmoAccordionItem, typeof LuzmoActionBar, typeof LuzmoActionButton, typeof LuzmoActionGroup, typeof LuzmoActionMenu, typeof LuzmoAvatar, typeof LuzmoBadge, typeof LuzmoButton, typeof LuzmoButtonGroup, typeof LuzmoCalendar, typeof LuzmoChatMessage, typeof LuzmoChatMessageGroup, typeof LuzmoCheckbox, typeof LuzmoClearButton, typeof LuzmoCloseButton, typeof LuzmoColorArea, typeof LuzmoColorField, typeof LuzmoColorHandle, typeof LuzmoColorLoupe, typeof LuzmoColorMenu, typeof LuzmoColorPalette, typeof LuzmoColorPaletteGroup, typeof LuzmoColorPicker, typeof LuzmoColorSlider, typeof LuzmoDateRangePicker, typeof LuzmoDateTimePicker, typeof LuzmoDivider, typeof LuzmoFieldGroup, typeof LuzmoFieldLabel, typeof LuzmoHelpText, typeof LuzmoIcon, typeof LuzmoInfieldButton, typeof LuzmoLabel, typeof LuzmoMenu, typeof LuzmoMenuDivider, typeof LuzmoMenuGroup, typeof LuzmoMenuItem, typeof LuzmoMultiLanguageField, typeof LuzmoNumberField, typeof LuzmoOptions, typeof LuzmoOverlay, typeof LuzmoPicker, typeof LuzmoPickerButton, typeof LuzmoPopover, typeof LuzmoProgressBar, typeof LuzmoProgressCircle, typeof LuzmoProgressSteps, typeof LuzmoPromptBox, typeof LuzmoRadio, typeof LuzmoRadioGroup, typeof LuzmoSearch, typeof LuzmoSelect, typeof LuzmoSkeletonLoader, typeof LuzmoSlider, typeof LuzmoStatusLight, typeof LuzmoSwatch, typeof LuzmoSwatchGroup, typeof LuzmoSwitch, typeof LuzmoTab, typeof LuzmoTabPanel, typeof LuzmoTabs, typeof LuzmoTabsOverflow, typeof LuzmoTag, typeof LuzmoTags, typeof LuzmoTextField, typeof LuzmoToast, typeof LuzmoTooltip, typeof LuzmoTopNav, typeof LuzmoTopNavItem];
142
+ export declare const LUZMO_ANGULAR_COMPONENT_NAMES: readonly ["LuzmoAccordion", "LuzmoAccordionItem", "LuzmoActionBar", "LuzmoActionButton", "LuzmoActionGroup", "LuzmoActionMenu", "LuzmoAvatar", "LuzmoBadge", "LuzmoButton", "LuzmoButtonGroup", "LuzmoCalendar", "LuzmoChatMessage", "LuzmoChatMessageGroup", "LuzmoCheckbox", "LuzmoClearButton", "LuzmoCloseButton", "LuzmoColorArea", "LuzmoColorField", "LuzmoColorHandle", "LuzmoColorLoupe", "LuzmoColorMenu", "LuzmoColorPalette", "LuzmoColorPaletteGroup", "LuzmoColorPicker", "LuzmoColorSlider", "LuzmoDateRangePicker", "LuzmoDateTimePicker", "LuzmoDivider", "LuzmoFieldGroup", "LuzmoFieldLabel", "LuzmoHelpText", "LuzmoIcon", "LuzmoInfieldButton", "LuzmoLabel", "LuzmoMenu", "LuzmoMenuDivider", "LuzmoMenuGroup", "LuzmoMenuItem", "LuzmoMultiLanguageField", "LuzmoNumberField", "LuzmoOptions", "LuzmoOverlay", "LuzmoPicker", "LuzmoPickerButton", "LuzmoPopover", "LuzmoProgressBar", "LuzmoProgressCircle", "LuzmoProgressSteps", "LuzmoPromptBox", "LuzmoRadio", "LuzmoRadioGroup", "LuzmoSearch", "LuzmoSelect", "LuzmoSkeletonLoader", "LuzmoSlider", "LuzmoStatusLight", "LuzmoSwatch", "LuzmoSwatchGroup", "LuzmoSwitch", "LuzmoTab", "LuzmoTabPanel", "LuzmoTabs", "LuzmoTabsOverflow", "LuzmoTag", "LuzmoTags", "LuzmoTextField", "LuzmoToast", "LuzmoTooltip", "LuzmoTopNav", "LuzmoTopNavItem"];
137
143
  export type LuzmoAngularComponentName = (typeof LUZMO_ANGULAR_COMPONENT_NAMES)[number];
package/esm/index.js CHANGED
@@ -34,6 +34,9 @@ import { LuzmoIcon } from './components/icon.js';
34
34
  import { LuzmoInfieldButton } from './components/infield-button.js';
35
35
  import { LuzmoLabel } from './components/label.js';
36
36
  import { LuzmoMenu } from './components/menu.js';
37
+ import { LuzmoMenuDivider } from './components/menu-divider.js';
38
+ import { LuzmoMenuGroup } from './components/menu-group.js';
39
+ import { LuzmoMenuItem } from './components/menu-item.js';
37
40
  import { LuzmoMultiLanguageField } from './components/multi-language-field.js';
38
41
  import { LuzmoNumberField } from './components/number-field.js';
39
42
  import { LuzmoOptions } from './components/options.js';
@@ -101,6 +104,9 @@ export { LuzmoIcon } from './components/icon.js';
101
104
  export { LuzmoInfieldButton } from './components/infield-button.js';
102
105
  export { LuzmoLabel } from './components/label.js';
103
106
  export { LuzmoMenu } from './components/menu.js';
107
+ export { LuzmoMenuDivider } from './components/menu-divider.js';
108
+ export { LuzmoMenuGroup } from './components/menu-group.js';
109
+ export { LuzmoMenuItem } from './components/menu-item.js';
104
110
  export { LuzmoMultiLanguageField } from './components/multi-language-field.js';
105
111
  export { LuzmoNumberField } from './components/number-field.js';
106
112
  export { LuzmoOptions } from './components/options.js';
@@ -169,6 +175,9 @@ export const LUZMO_ANGULAR_COMPONENTS = [
169
175
  LuzmoInfieldButton,
170
176
  LuzmoLabel,
171
177
  LuzmoMenu,
178
+ LuzmoMenuDivider,
179
+ LuzmoMenuGroup,
180
+ LuzmoMenuItem,
172
181
  LuzmoMultiLanguageField,
173
182
  LuzmoNumberField,
174
183
  LuzmoOptions,
@@ -238,6 +247,9 @@ export const LUZMO_ANGULAR_COMPONENT_NAMES = [
238
247
  'LuzmoInfieldButton',
239
248
  'LuzmoLabel',
240
249
  'LuzmoMenu',
250
+ 'LuzmoMenuDivider',
251
+ 'LuzmoMenuGroup',
252
+ 'LuzmoMenuItem',
241
253
  'LuzmoMultiLanguageField',
242
254
  'LuzmoNumberField',
243
255
  'LuzmoOptions',
package/package.json CHANGED
@@ -29,9 +29,9 @@
29
29
  "peerDependencies": {
30
30
  "@angular/core": "^17.3.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
31
31
  "@angular/forms": "^17.3.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
32
- "@luzmo/lucero": "1.0.3-alpha.6"
32
+ "@luzmo/lucero": "1.0.3-alpha.8"
33
33
  },
34
- "version": "1.0.3-alpha.6",
34
+ "version": "1.0.3-alpha.8",
35
35
  "peerDependenciesMeta": {
36
36
  "@angular/forms": {
37
37
  "optional": true