@luzmo/ngx-lucero 1.0.3-alpha.7 → 1.0.3-alpha.9

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 });
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 });
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 });
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 }); })();
@@ -1,8 +1,8 @@
1
1
  import { OnChanges, SimpleChanges } from '@angular/core';
2
2
  import '@luzmo/lucero/prompt-box';
3
- import type { LuzmoPromptBox as LuzmoPromptBoxHostElement, PromptBoxSegment, TriggerConfig } from '@luzmo/lucero/prompt-box';
3
+ import type { LuzmoPromptBox as LuzmoPromptBoxHostElement, PromptBoxFileIcons, PromptBoxSegment, TriggerConfig } from '@luzmo/lucero/prompt-box';
4
4
  import * as i0 from "@angular/core";
5
- export type { ActionValue, PromptBoxAttachment, PromptBoxElement, PromptBoxElementInsertedDetail, PromptBoxElementRemovedDetail, PromptBoxRecordErrorDetail, PromptBoxRecordingCompleteDetail, PromptBoxSegment, PromptBoxSubmitDetail, TriggerConfig, TriggerMenuChangeDetail, TriggerMenuSelectDetail, TriggerOption } from '@luzmo/lucero/prompt-box';
5
+ export type { ActionValue, PromptBoxAttachment, PromptBoxElement, PromptBoxElementInsertedDetail, PromptBoxElementRemovedDetail, PromptBoxFileIcons, PromptBoxRecordErrorDetail, PromptBoxRecordingCompleteDetail, PromptBoxSegment, PromptBoxSubmitDetail, TriggerConfig, TriggerMenuChangeDetail, TriggerMenuSelectDetail, TriggerOption } from '@luzmo/lucero/prompt-box';
6
6
  export declare class LuzmoPromptBox implements OnChanges {
7
7
  private readonly elementRef;
8
8
  private readonly renderer;
@@ -45,6 +45,10 @@ export declare class LuzmoPromptBox implements OnChanges {
45
45
  allowFiles?: boolean;
46
46
  /** Accepted file types for attachments (MIME types or extensions). */
47
47
  acceptedFileTypes?: string[];
48
+ /** Custom icons for file attachment tiles, keyed by extension without a leading dot (e.g. `pdf`, `csv`, `svg`). Merged over the built-in defaults (`DEFAULT_FILE_ICONS`); unmatched extensions fall back to the generic document icon. ```ts promptBox.fileIcons = { pdf: luzmoHeart, svg: luzmoFileImage }; ``` */
49
+ fileIcons?: PromptBoxFileIcons;
50
+ /** Formats the accessible name for attachment remove buttons. Override to localize; receives the file name. ```ts promptBox.removeAttachmentLabel = (name) => `Verwijder ${name}`; ``` */
51
+ removeAttachmentLabel?: unknown;
48
52
  /** Whether to enable rich input mode with inline element badges. When enabled, the textarea is replaced with a contenteditable div. */
49
53
  allowElements?: boolean;
50
54
  /** Optional filter for accepted element types during drag-and-drop. */
@@ -87,7 +91,7 @@ export declare class LuzmoPromptBox implements OnChanges {
87
91
  clear(): void;
88
92
  submit(): void;
89
93
  static ɵfac: i0.ɵɵFactoryDeclaration<LuzmoPromptBox, never>;
90
- static ɵcmp: i0.ɵɵComponentDeclaration<LuzmoPromptBox, "luzmo-prompt-box", ["luzmoPromptBox"], { "rows": { "alias": "rows"; "required": false; }; "grows": { "alias": "grows"; "required": false; }; "maxRows": { "alias": "maxRows"; "required": false; }; "recording": { "alias": "recording"; "required": false; }; "hideSubmit": { "alias": "hideSubmit"; "required": false; }; "disableSubmit": { "alias": "disableSubmit"; "required": false; }; "singleLine": { "alias": "singleLine"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "pending": { "alias": "pending"; "required": false; }; "stoppable": { "alias": "stoppable"; "required": false; }; "allowImages": { "alias": "allowImages"; "required": false; }; "allowFiles": { "alias": "allowFiles"; "required": false; }; "acceptedFileTypes": { "alias": "acceptedFileTypes"; "required": false; }; "allowElements": { "alias": "allowElements"; "required": false; }; "acceptedElementTypes": { "alias": "acceptedElementTypes"; "required": false; }; "triggers": { "alias": "triggers"; "required": false; }; "segments": { "alias": "segments"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, { "luzmoSubmitEvent": "luzmo-submit"; "luzmoStopEvent": "luzmo-stop"; "luzmoTriggerChangeEvent": "luzmo-trigger-change"; "luzmoElementInsertedEvent": "luzmo-element-inserted"; "luzmoElementRemovedEvent": "luzmo-element-removed"; "luzmoAttachmentsChangeEvent": "luzmo-attachments-change"; "luzmoRecordEvent": "luzmo-record"; "luzmoRecordingCompleteEvent": "luzmo-recording-complete"; "luzmoRecordCancelEvent": "luzmo-record-cancel"; "luzmoRecordErrorEvent": "luzmo-record-error"; }, never, ["*"], true, never>;
94
+ static ɵcmp: i0.ɵɵComponentDeclaration<LuzmoPromptBox, "luzmo-prompt-box", ["luzmoPromptBox"], { "rows": { "alias": "rows"; "required": false; }; "grows": { "alias": "grows"; "required": false; }; "maxRows": { "alias": "maxRows"; "required": false; }; "recording": { "alias": "recording"; "required": false; }; "hideSubmit": { "alias": "hideSubmit"; "required": false; }; "disableSubmit": { "alias": "disableSubmit"; "required": false; }; "singleLine": { "alias": "singleLine"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "pending": { "alias": "pending"; "required": false; }; "stoppable": { "alias": "stoppable"; "required": false; }; "allowImages": { "alias": "allowImages"; "required": false; }; "allowFiles": { "alias": "allowFiles"; "required": false; }; "acceptedFileTypes": { "alias": "acceptedFileTypes"; "required": false; }; "fileIcons": { "alias": "fileIcons"; "required": false; }; "removeAttachmentLabel": { "alias": "removeAttachmentLabel"; "required": false; }; "allowElements": { "alias": "allowElements"; "required": false; }; "acceptedElementTypes": { "alias": "acceptedElementTypes"; "required": false; }; "triggers": { "alias": "triggers"; "required": false; }; "segments": { "alias": "segments"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, { "luzmoSubmitEvent": "luzmo-submit"; "luzmoStopEvent": "luzmo-stop"; "luzmoTriggerChangeEvent": "luzmo-trigger-change"; "luzmoElementInsertedEvent": "luzmo-element-inserted"; "luzmoElementRemovedEvent": "luzmo-element-removed"; "luzmoAttachmentsChangeEvent": "luzmo-attachments-change"; "luzmoRecordEvent": "luzmo-record"; "luzmoRecordingCompleteEvent": "luzmo-recording-complete"; "luzmoRecordCancelEvent": "luzmo-record-cancel"; "luzmoRecordErrorEvent": "luzmo-record-error"; }, never, ["*"], true, never>;
91
95
  }
92
96
  /** The underlying custom element type for LuzmoPromptBox */
93
97
  export type LuzmoPromptBoxElement = LuzmoPromptBoxHostElement;
@@ -55,6 +55,10 @@ export class LuzmoPromptBox {
55
55
  allowFiles;
56
56
  /** Accepted file types for attachments (MIME types or extensions). */
57
57
  acceptedFileTypes;
58
+ /** Custom icons for file attachment tiles, keyed by extension without a leading dot (e.g. `pdf`, `csv`, `svg`). Merged over the built-in defaults (`DEFAULT_FILE_ICONS`); unmatched extensions fall back to the generic document icon. ```ts promptBox.fileIcons = { pdf: luzmoHeart, svg: luzmoFileImage }; ``` */
59
+ fileIcons;
60
+ /** Formats the accessible name for attachment remove buttons. Override to localize; receives the file name. ```ts promptBox.removeAttachmentLabel = (name) => `Verwijder ${name}`; ``` */
61
+ removeAttachmentLabel;
58
62
  /** Whether to enable rich input mode with inline element badges. When enabled, the textarea is replaced with a contenteditable div. */
59
63
  allowElements;
60
64
  /** Optional filter for accepted element types during drag-and-drop. */
@@ -145,6 +149,12 @@ export class LuzmoPromptBox {
145
149
  case 'acceptedFileTypes':
146
150
  this.setHostProperty('acceptedFileTypes', changes['acceptedFileTypes'].currentValue);
147
151
  break;
152
+ case 'fileIcons':
153
+ this.setHostProperty('fileIcons', changes['fileIcons'].currentValue);
154
+ break;
155
+ case 'removeAttachmentLabel':
156
+ this.setHostProperty('removeAttachmentLabel', changes['removeAttachmentLabel'].currentValue);
157
+ break;
148
158
  case 'allowElements':
149
159
  this.setHostProperty('allowElements', changes['allowElements'].currentValue);
150
160
  break;
@@ -216,7 +226,7 @@ export class LuzmoPromptBox {
216
226
  return this.host.submit();
217
227
  }
218
228
  static ɵfac = function LuzmoPromptBox_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LuzmoPromptBox)(); };
219
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoPromptBox, selectors: [["luzmo-prompt-box"]], inputs: { rows: "rows", grows: "grows", maxRows: "maxRows", recording: "recording", hideSubmit: "hideSubmit", disableSubmit: "disableSubmit", singleLine: "singleLine", placeholder: "placeholder", value: "value", disabled: "disabled", readonly: "readonly", maxlength: "maxlength", pending: "pending", stoppable: "stoppable", allowImages: "allowImages", allowFiles: "allowFiles", acceptedFileTypes: "acceptedFileTypes", allowElements: "allowElements", acceptedElementTypes: "acceptedElementTypes", triggers: "triggers", segments: "segments", size: "size" }, outputs: { luzmoSubmitEvent: "luzmo-submit", luzmoStopEvent: "luzmo-stop", luzmoTriggerChangeEvent: "luzmo-trigger-change", luzmoElementInsertedEvent: "luzmo-element-inserted", luzmoElementRemovedEvent: "luzmo-element-removed", luzmoAttachmentsChangeEvent: "luzmo-attachments-change", luzmoRecordEvent: "luzmo-record", luzmoRecordingCompleteEvent: "luzmo-recording-complete", luzmoRecordCancelEvent: "luzmo-record-cancel", luzmoRecordErrorEvent: "luzmo-record-error" }, exportAs: ["luzmoPromptBox"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoPromptBox_Template(rf, ctx) { if (rf & 1) {
229
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LuzmoPromptBox, selectors: [["luzmo-prompt-box"]], inputs: { rows: "rows", grows: "grows", maxRows: "maxRows", recording: "recording", hideSubmit: "hideSubmit", disableSubmit: "disableSubmit", singleLine: "singleLine", placeholder: "placeholder", value: "value", disabled: "disabled", readonly: "readonly", maxlength: "maxlength", pending: "pending", stoppable: "stoppable", allowImages: "allowImages", allowFiles: "allowFiles", acceptedFileTypes: "acceptedFileTypes", fileIcons: "fileIcons", removeAttachmentLabel: "removeAttachmentLabel", allowElements: "allowElements", acceptedElementTypes: "acceptedElementTypes", triggers: "triggers", segments: "segments", size: "size" }, outputs: { luzmoSubmitEvent: "luzmo-submit", luzmoStopEvent: "luzmo-stop", luzmoTriggerChangeEvent: "luzmo-trigger-change", luzmoElementInsertedEvent: "luzmo-element-inserted", luzmoElementRemovedEvent: "luzmo-element-removed", luzmoAttachmentsChangeEvent: "luzmo-attachments-change", luzmoRecordEvent: "luzmo-record", luzmoRecordingCompleteEvent: "luzmo-recording-complete", luzmoRecordCancelEvent: "luzmo-record-cancel", luzmoRecordErrorEvent: "luzmo-record-error" }, exportAs: ["luzmoPromptBox"], features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function LuzmoPromptBox_Template(rf, ctx) { if (rf & 1) {
220
230
  i0.ɵɵprojectionDef();
221
231
  i0.ɵɵprojection(0);
222
232
  } }, encapsulation: 2 });
@@ -281,6 +291,12 @@ export class LuzmoPromptBox {
281
291
  }], acceptedFileTypes: [{
282
292
  type: Input,
283
293
  args: [{ alias: 'acceptedFileTypes' }]
294
+ }], fileIcons: [{
295
+ type: Input,
296
+ args: [{ alias: 'fileIcons' }]
297
+ }], removeAttachmentLabel: [{
298
+ type: Input,
299
+ args: [{ alias: 'removeAttachmentLabel' }]
284
300
  }], allowElements: [{
285
301
  type: Input,
286
302
  args: [{ alias: 'allowElements' }]
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.7"
32
+ "@luzmo/lucero": "1.0.3-alpha.9"
33
33
  },
34
- "version": "1.0.3-alpha.7",
34
+ "version": "1.0.3-alpha.9",
35
35
  "peerDependenciesMeta": {
36
36
  "@angular/forms": {
37
37
  "optional": true