@neural-ui/core 1.7.6 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/neural-ui-core-accordion.mjs +22 -8
- package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
- package/fesm2022/neural-ui-core-alert.mjs +1 -1
- package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
- package/fesm2022/neural-ui-core-autocomplete.mjs +50 -9
- package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
- package/fesm2022/neural-ui-core-button.mjs +1 -1
- package/fesm2022/neural-ui-core-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-calendar.mjs +26 -18
- package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-command-palette.mjs +22 -8
- package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
- package/fesm2022/neural-ui-core-context-menu.mjs +24 -8
- package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
- package/fesm2022/neural-ui-core-empty-state.mjs +1 -1
- package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-icon.mjs +9 -2
- package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
- package/fesm2022/neural-ui-core-inline-editor.mjs +1 -1
- package/fesm2022/neural-ui-core-inline-editor.mjs.map +1 -1
- package/fesm2022/neural-ui-core-input.mjs +1 -1
- package/fesm2022/neural-ui-core-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-listbox.mjs +50 -5
- package/fesm2022/neural-ui-core-listbox.mjs.map +1 -1
- package/fesm2022/neural-ui-core-menu.mjs +38 -16
- package/fesm2022/neural-ui-core-menu.mjs.map +1 -1
- package/fesm2022/neural-ui-core-modal.mjs +1 -1
- package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
- package/fesm2022/neural-ui-core-multiselect.mjs +67 -7
- package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
- package/fesm2022/neural-ui-core-nav.mjs +1 -1
- package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
- package/fesm2022/neural-ui-core-pick-list.mjs +43 -16
- package/fesm2022/neural-ui-core-pick-list.mjs.map +1 -1
- package/fesm2022/neural-ui-core-select.mjs +64 -5
- package/fesm2022/neural-ui-core-select.mjs.map +1 -1
- package/fesm2022/neural-ui-core-sidebar.mjs +1 -1
- package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-split-button.mjs +22 -8
- package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-stats-card.mjs +1 -1
- package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
- package/fesm2022/neural-ui-core-table.mjs +1 -1
- package/fesm2022/neural-ui-core-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tabs.mjs +22 -9
- package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tags.mjs +40 -13
- package/fesm2022/neural-ui-core-tags.mjs.map +1 -1
- package/fesm2022/neural-ui-core-timeline.mjs +39 -10
- package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toast.mjs +1 -1
- package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toggle-button-group.mjs +22 -8
- package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree-select.mjs +86 -12
- package/fesm2022/neural-ui-core-tree-select.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree.mjs +21 -6
- package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
- package/package.json +1 -1
- package/types/neural-ui-core-accordion.d.ts +16 -2
- package/types/neural-ui-core-autocomplete.d.ts +23 -2
- package/types/neural-ui-core-calendar.d.ts +18 -3
- package/types/neural-ui-core-command-palette.d.ts +24 -10
- package/types/neural-ui-core-context-menu.d.ts +17 -3
- package/types/neural-ui-core-icon.d.ts +5 -1
- package/types/neural-ui-core-listbox.d.ts +23 -2
- package/types/neural-ui-core-menu.d.ts +23 -3
- package/types/neural-ui-core-multiselect.d.ts +33 -2
- package/types/neural-ui-core-pick-list.d.ts +32 -3
- package/types/neural-ui-core-select.d.ts +30 -2
- package/types/neural-ui-core-split-button.d.ts +15 -3
- package/types/neural-ui-core-tabs.d.ts +16 -3
- package/types/neural-ui-core-tags.d.ts +35 -4
- package/types/neural-ui-core-timeline.d.ts +27 -2
- package/types/neural-ui-core-toggle-button-group.d.ts +16 -2
- package/types/neural-ui-core-tree-select.d.ts +51 -3
- package/types/neural-ui-core-tree.d.ts +18 -3
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, ChangeDetectionStrategy, ViewEncapsulation, Component, input, output, inject, ElementRef, Injector, ViewContainerRef, HostListener
|
|
2
|
+
import { Directive, signal, ChangeDetectionStrategy, ViewEncapsulation, Component, contentChild, input, output, inject, ElementRef, Injector, ViewContainerRef, HostListener } from '@angular/core';
|
|
3
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
3
4
|
import { Overlay } from '@angular/cdk/overlay';
|
|
4
5
|
import { ComponentPortal } from '@angular/cdk/portal';
|
|
5
6
|
|
|
7
|
+
class NeuContextMenuItemDirective {
|
|
8
|
+
templateRef;
|
|
9
|
+
constructor(templateRef) {
|
|
10
|
+
this.templateRef = templateRef;
|
|
11
|
+
}
|
|
12
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuContextMenuItemDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
13
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuContextMenuItemDirective, isStandalone: true, selector: "ng-template[neuContextMenuItem]", ngImport: i0 });
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuContextMenuItemDirective, decorators: [{
|
|
16
|
+
type: Directive,
|
|
17
|
+
args: [{ selector: 'ng-template[neuContextMenuItem]' }]
|
|
18
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
6
19
|
let _seq = 0;
|
|
7
20
|
/**
|
|
8
21
|
* NeuralUI ContextMenu Overlay Component (internal)
|
|
9
22
|
*/
|
|
10
23
|
class NeuContextMenuOverlayComponent {
|
|
11
24
|
_items = signal([], ...(ngDevMode ? [{ debugName: "_items" }] : /* istanbul ignore next */ []));
|
|
25
|
+
itemTemplate = null;
|
|
12
26
|
_selectFn = null;
|
|
13
27
|
_escapeFn = null;
|
|
14
28
|
select(item) {
|
|
@@ -34,17 +48,17 @@ class NeuContextMenuOverlayComponent {
|
|
|
34
48
|
[attr.aria-disabled]="item.disabled ?? false"
|
|
35
49
|
(click)="select(item)"
|
|
36
50
|
>
|
|
37
|
-
@if (item.icon) {
|
|
51
|
+
@if (itemTemplate) { <ng-container [ngTemplateOutlet]="itemTemplate" [ngTemplateOutletContext]="{ $implicit: item }" /> } @else if (item.icon) {
|
|
38
52
|
<span class="neu-context-menu__icon" aria-hidden="true">{{ item.icon }}</span>
|
|
39
53
|
}
|
|
40
54
|
{{ item.label }}
|
|
41
55
|
</button>
|
|
42
56
|
}
|
|
43
|
-
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-context-menu{background:var(--neu-context-menu-bg, var(--neu-surface-1, #ffffff));border:1px solid var(--neu-context-menu-border, var(--neu-border-color, #e5e7eb));border-radius:var(--neu-radius-lg, 12px);box-shadow:0 8px 24px -4px #00000024;padding:6px;min-width:180px;max-width:260px;z-index:2000;outline:none;animation:neu-ctx-in 80ms ease}@keyframes neu-ctx-in{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}.neu-context-menu__item{all:unset;display:flex;align-items:center;gap:8px;width:100%;box-sizing:border-box;padding:7px 10px;border-radius:var(--neu-radius-md, 8px);font-size:.875rem;color:var(--neu-context-menu-color, var(--neu-text, var(--neu-text-primary, #111827)));cursor:pointer;transition:background .1s}.neu-context-menu__item:hover:not(.neu-context-menu__item--disabled){background:var(--neu-context-menu-hover, var(--neu-surface-2, #f3f4f6))}.neu-context-menu__item:focus-visible{background:var(--neu-context-menu-hover, var(--neu-surface-2, #f3f4f6));outline:2px solid var(--neu-focus-ring, #0ea5e9);outline-offset:-2px}.neu-context-menu__item.neu-context-menu__item--danger{color:var(--neu-color-danger, #ef4444)}.neu-context-menu__item.neu-context-menu__item--disabled{color:var(--neu-context-menu-disabled-color, var(--neu-text-muted, #6b7280));opacity:.56;cursor:not-allowed;pointer-events:none}.neu-context-menu__icon{flex-shrink:0;font-style:normal;font-size:1em}.neu-context-menu__separator{all:unset;display:block;height:1px;background:var(--neu-context-menu-border, var(--neu-border-color, #e5e7eb));margin:4px 0}.neu-context-menu-backdrop{background:transparent}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
57
|
+
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-context-menu{background:var(--neu-context-menu-bg, var(--neu-surface-1, #ffffff));border:1px solid var(--neu-context-menu-border, var(--neu-border-color, #e5e7eb));border-radius:var(--neu-radius-lg, 12px);box-shadow:0 8px 24px -4px #00000024;padding:6px;min-width:180px;max-width:260px;z-index:2000;outline:none;animation:neu-ctx-in 80ms ease}@keyframes neu-ctx-in{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}.neu-context-menu__item{all:unset;display:flex;align-items:center;gap:8px;width:100%;box-sizing:border-box;padding:7px 10px;border-radius:var(--neu-radius-md, 8px);font-size:.875rem;color:var(--neu-context-menu-color, var(--neu-text, var(--neu-text-primary, #111827)));cursor:pointer;transition:background .1s}.neu-context-menu__item:hover:not(.neu-context-menu__item--disabled){background:var(--neu-context-menu-hover, var(--neu-surface-2, #f3f4f6))}.neu-context-menu__item:focus-visible{background:var(--neu-context-menu-hover, var(--neu-surface-2, #f3f4f6));outline:2px solid var(--neu-focus-ring, #0ea5e9);outline-offset:-2px}.neu-context-menu__item.neu-context-menu__item--danger{color:var(--neu-color-danger, #ef4444)}.neu-context-menu__item.neu-context-menu__item--disabled{color:var(--neu-context-menu-disabled-color, var(--neu-text-muted, #6b7280));opacity:.56;cursor:not-allowed;pointer-events:none}.neu-context-menu__icon{flex-shrink:0;font-style:normal;font-size:1em}.neu-context-menu__separator{all:unset;display:block;height:1px;background:var(--neu-context-menu-border, var(--neu-border-color, #e5e7eb));margin:4px 0}.neu-context-menu-backdrop{background:transparent}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
44
58
|
}
|
|
45
59
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuContextMenuOverlayComponent, decorators: [{
|
|
46
60
|
type: Component,
|
|
47
|
-
args: [{ selector: 'neu-context-menu-overlay', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
61
|
+
args: [{ selector: 'neu-context-menu-overlay', imports: [NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
48
62
|
class: 'neu-context-menu',
|
|
49
63
|
role: 'menu',
|
|
50
64
|
tabindex: '-1',
|
|
@@ -64,7 +78,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
64
78
|
[attr.aria-disabled]="item.disabled ?? false"
|
|
65
79
|
(click)="select(item)"
|
|
66
80
|
>
|
|
67
|
-
@if (item.icon) {
|
|
81
|
+
@if (itemTemplate) { <ng-container [ngTemplateOutlet]="itemTemplate" [ngTemplateOutletContext]="{ $implicit: item }" /> } @else if (item.icon) {
|
|
68
82
|
<span class="neu-context-menu__icon" aria-hidden="true">{{ item.icon }}</span>
|
|
69
83
|
}
|
|
70
84
|
{{ item.label }}
|
|
@@ -83,6 +97,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
83
97
|
* </div>
|
|
84
98
|
*/
|
|
85
99
|
class NeuContextMenuDirective {
|
|
100
|
+
itemTpl = contentChild(NeuContextMenuItemDirective, ...(ngDevMode ? [{ debugName: "itemTpl" }] : /* istanbul ignore next */ []));
|
|
86
101
|
/** Ítems del menú / Menu items */
|
|
87
102
|
neuContextMenu = input([], ...(ngDevMode ? [{ debugName: "neuContextMenu" }] : /* istanbul ignore next */ []));
|
|
88
103
|
/** Desactiva el menú / Disables the menu */
|
|
@@ -116,6 +131,7 @@ class NeuContextMenuDirective {
|
|
|
116
131
|
const portal = new ComponentPortal(NeuContextMenuOverlayComponent, this._vcr, this._injector);
|
|
117
132
|
this._compRef = this._overlayRef.attach(portal);
|
|
118
133
|
this._compRef.instance._items.set(this.neuContextMenu());
|
|
134
|
+
this._compRef.instance.itemTemplate = this.itemTpl()?.templateRef ?? null;
|
|
119
135
|
this._compRef.instance._selectFn = (item) => {
|
|
120
136
|
this.menuItemClick.emit(item);
|
|
121
137
|
this._close();
|
|
@@ -137,7 +153,7 @@ class NeuContextMenuDirective {
|
|
|
137
153
|
this._close();
|
|
138
154
|
}
|
|
139
155
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuContextMenuDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
140
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.
|
|
156
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.17", type: NeuContextMenuDirective, isStandalone: true, selector: "[neuContextMenu]", inputs: { neuContextMenu: { classPropertyName: "neuContextMenu", publicName: "neuContextMenu", isSignal: true, isRequired: false, transformFunction: null }, neuContextMenuDisabled: { classPropertyName: "neuContextMenuDisabled", publicName: "neuContextMenuDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuItemClick: "menuItemClick", menuOpened: "menuOpened", menuClosed: "menuClosed" }, host: { listeners: { "contextmenu": "onContextMenu($event)" } }, queries: [{ propertyName: "itemTpl", first: true, predicate: NeuContextMenuItemDirective, descendants: true, isSignal: true }], exportAs: ["neuContextMenu"], ngImport: i0 });
|
|
141
157
|
}
|
|
142
158
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuContextMenuDirective, decorators: [{
|
|
143
159
|
type: Directive,
|
|
@@ -145,7 +161,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
145
161
|
selector: '[neuContextMenu]',
|
|
146
162
|
exportAs: 'neuContextMenu',
|
|
147
163
|
}]
|
|
148
|
-
}], propDecorators: { neuContextMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuContextMenu", required: false }] }], neuContextMenuDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuContextMenuDisabled", required: false }] }], menuItemClick: [{ type: i0.Output, args: ["menuItemClick"] }], menuOpened: [{ type: i0.Output, args: ["menuOpened"] }], menuClosed: [{ type: i0.Output, args: ["menuClosed"] }], onContextMenu: [{
|
|
164
|
+
}], propDecorators: { itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuContextMenuItemDirective), { isSignal: true }] }], neuContextMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuContextMenu", required: false }] }], neuContextMenuDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuContextMenuDisabled", required: false }] }], menuItemClick: [{ type: i0.Output, args: ["menuItemClick"] }], menuOpened: [{ type: i0.Output, args: ["menuOpened"] }], menuClosed: [{ type: i0.Output, args: ["menuClosed"] }], onContextMenu: [{
|
|
149
165
|
type: HostListener,
|
|
150
166
|
args: ['contextmenu', ['$event']]
|
|
151
167
|
}] } });
|
|
@@ -154,5 +170,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
154
170
|
* Generated bundle index. Do not edit.
|
|
155
171
|
*/
|
|
156
172
|
|
|
157
|
-
export { NeuContextMenuDirective, NeuContextMenuOverlayComponent };
|
|
173
|
+
export { NeuContextMenuDirective, NeuContextMenuItemDirective, NeuContextMenuOverlayComponent };
|
|
158
174
|
//# sourceMappingURL=neural-ui-core-context-menu.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-context-menu.mjs","sources":["../../../../projects/ui-core/context-menu/neu-context-menu.component.ts","../../../../projects/ui-core/context-menu/neural-ui-core-context-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n HostListener,\n Injector,\n OnDestroy,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport interface NeuContextMenuItem {\n /** Key para identificar la acción / Key to identify the action */\n key: string;\n /** Texto visible / Visible text */\n label: string;\n /** Icono opcional (texto/emoji) / Optional icon (text/emoji) */\n icon?: string;\n /** Separador antes de este item / Separator before this item */\n separator?: boolean;\n /** Desactiva el item / Disables the item */\n disabled?: boolean;\n /** Variante de color / Color variant */\n variant?: 'default' | 'danger';\n}\n\nlet _seq = 0;\n\n/**\n * NeuralUI ContextMenu Overlay Component (internal)\n */\n@Component({\n selector: 'neu-context-menu-overlay',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-context-menu',\n role: 'menu',\n tabindex: '-1',\n '(keydown.escape)': '_onEscape()',\n },\n template: `\n @for (item of _items(); track item.key) {\n @if (item.separator && !$first) {\n <hr class=\"neu-context-menu__separator\" role=\"separator\" />\n }\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"neu-context-menu__item\"\n [class.neu-context-menu__item--danger]=\"item.variant === 'danger'\"\n [class.neu-context-menu__item--disabled]=\"item.disabled\"\n [disabled]=\"item.disabled ?? false\"\n [attr.aria-disabled]=\"item.disabled ?? false\"\n (click)=\"select(item)\"\n >\n @if (item.icon) {\n <span class=\"neu-context-menu__icon\" aria-hidden=\"true\">{{ item.icon }}</span>\n }\n {{ item.label }}\n </button>\n }\n `,\n styleUrl: './neu-context-menu.component.scss',\n})\nexport class NeuContextMenuOverlayComponent {\n readonly _items = signal<NeuContextMenuItem[]>([]);\n _selectFn: ((item: NeuContextMenuItem) => void) | null = null;\n _escapeFn: (() => void) | null = null;\n\n select(item: NeuContextMenuItem): void {\n if (!item.disabled) this._selectFn?.(item);\n }\n\n _onEscape(): void {\n this._escapeFn?.();\n }\n}\n\n/**\n * NeuralUI ContextMenu Directive\n *\n * Muestra un menú contextual al hacer clic derecho sobre el elemento host.\n *\n * Uso:\n * <div [neuContextMenu]=\"menuItems\" (menuItemClick)=\"onItem($event)\">\n * Clic derecho aquí\n * </div>\n */\n@Directive({\n selector: '[neuContextMenu]',\n exportAs: 'neuContextMenu',\n})\nexport class NeuContextMenuDirective implements OnDestroy {\n /** Ítems del menú / Menu items */\n readonly neuContextMenu = input<NeuContextMenuItem[]>([]);\n\n /** Desactiva el menú / Disables the menu */\n readonly neuContextMenuDisabled = input<boolean>(false);\n\n /** Emitido al seleccionar un ítem / Emitted when an item is selected */\n readonly menuItemClick = output<NeuContextMenuItem>();\n\n /** Emitido al abrir / Emitted on open */\n readonly menuOpened = output<void>();\n\n /** Emitido al cerrar / Emitted on close */\n readonly menuClosed = output<void>();\n\n private readonly _overlay = inject(Overlay);\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _injector = inject(Injector);\n private readonly _vcr = inject(ViewContainerRef);\n private _overlayRef: OverlayRef | null = null;\n private _compRef: ComponentRef<NeuContextMenuOverlayComponent> | null = null;\n\n @HostListener('contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n event.preventDefault();\n if (this.neuContextMenuDisabled()) return;\n this._open(event.clientX, event.clientY);\n }\n\n private _open(x: number, y: number): void {\n this._close();\n this._overlayRef = this._overlay.create({\n hasBackdrop: true,\n backdropClass: 'neu-context-menu-backdrop',\n positionStrategy: this._overlay.position().global().left(`${x}px`).top(`${y}px`),\n scrollStrategy: this._overlay.scrollStrategies.close(),\n });\n\n const portal = new ComponentPortal(NeuContextMenuOverlayComponent, this._vcr, this._injector);\n this._compRef = this._overlayRef.attach(portal);\n this._compRef.instance._items.set(this.neuContextMenu());\n this._compRef.instance._selectFn = (item) => {\n this.menuItemClick.emit(item);\n this._close();\n };\n this._compRef.instance._escapeFn = () => this._close();\n\n this._overlayRef.backdropClick().subscribe(() => this._close());\n this.menuOpened.emit();\n }\n\n private _close(): void {\n if (this._overlayRef?.hasAttached()) {\n this._overlayRef.detach();\n this.menuClosed.emit();\n }\n this._overlayRef?.dispose();\n this._overlayRef = null;\n this._compRef = null;\n }\n\n ngOnDestroy(): void {\n this._close();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"neural-ui-core-context-menu.mjs","sources":["../../../../projects/ui-core/context-menu/neu-context-menu.component.ts","../../../../projects/ui-core/context-menu/neural-ui-core-context-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n HostListener,\n Injector,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n contentChild,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport interface NeuContextMenuItem {\n /** Key para identificar la acción / Key to identify the action */\n key: string;\n /** Texto visible / Visible text */\n label: string;\n /** Icono opcional (texto/emoji) / Optional icon (text/emoji) */\n icon?: string;\n /** Separador antes de este item / Separator before this item */\n separator?: boolean;\n /** Desactiva el item / Disables the item */\n disabled?: boolean;\n /** Variante de color / Color variant */\n variant?: 'default' | 'danger';\n}\n@Directive({ selector: 'ng-template[neuContextMenuItem]' })\nexport class NeuContextMenuItemDirective { constructor(readonly templateRef: TemplateRef<{ $implicit: NeuContextMenuItem }>) {} }\n\nlet _seq = 0;\n\n/**\n * NeuralUI ContextMenu Overlay Component (internal)\n */\n@Component({\n selector: 'neu-context-menu-overlay',\n imports: [NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-context-menu',\n role: 'menu',\n tabindex: '-1',\n '(keydown.escape)': '_onEscape()',\n },\n template: `\n @for (item of _items(); track item.key) {\n @if (item.separator && !$first) {\n <hr class=\"neu-context-menu__separator\" role=\"separator\" />\n }\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"neu-context-menu__item\"\n [class.neu-context-menu__item--danger]=\"item.variant === 'danger'\"\n [class.neu-context-menu__item--disabled]=\"item.disabled\"\n [disabled]=\"item.disabled ?? false\"\n [attr.aria-disabled]=\"item.disabled ?? false\"\n (click)=\"select(item)\"\n >\n @if (itemTemplate) { <ng-container [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\" /> } @else if (item.icon) {\n <span class=\"neu-context-menu__icon\" aria-hidden=\"true\">{{ item.icon }}</span>\n }\n {{ item.label }}\n </button>\n }\n `,\n styleUrl: './neu-context-menu.component.scss',\n})\nexport class NeuContextMenuOverlayComponent {\n readonly _items = signal<NeuContextMenuItem[]>([]);\n itemTemplate: TemplateRef<{ $implicit: NeuContextMenuItem }> | null = null;\n _selectFn: ((item: NeuContextMenuItem) => void) | null = null;\n _escapeFn: (() => void) | null = null;\n\n select(item: NeuContextMenuItem): void {\n if (!item.disabled) this._selectFn?.(item);\n }\n\n _onEscape(): void {\n this._escapeFn?.();\n }\n}\n\n/**\n * NeuralUI ContextMenu Directive\n *\n * Muestra un menú contextual al hacer clic derecho sobre el elemento host.\n *\n * Uso:\n * <div [neuContextMenu]=\"menuItems\" (menuItemClick)=\"onItem($event)\">\n * Clic derecho aquí\n * </div>\n */\n@Directive({\n selector: '[neuContextMenu]',\n exportAs: 'neuContextMenu',\n})\nexport class NeuContextMenuDirective implements OnDestroy {\n readonly itemTpl = contentChild(NeuContextMenuItemDirective);\n /** Ítems del menú / Menu items */\n readonly neuContextMenu = input<NeuContextMenuItem[]>([]);\n\n /** Desactiva el menú / Disables the menu */\n readonly neuContextMenuDisabled = input<boolean>(false);\n\n /** Emitido al seleccionar un ítem / Emitted when an item is selected */\n readonly menuItemClick = output<NeuContextMenuItem>();\n\n /** Emitido al abrir / Emitted on open */\n readonly menuOpened = output<void>();\n\n /** Emitido al cerrar / Emitted on close */\n readonly menuClosed = output<void>();\n\n private readonly _overlay = inject(Overlay);\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _injector = inject(Injector);\n private readonly _vcr = inject(ViewContainerRef);\n private _overlayRef: OverlayRef | null = null;\n private _compRef: ComponentRef<NeuContextMenuOverlayComponent> | null = null;\n\n @HostListener('contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n event.preventDefault();\n if (this.neuContextMenuDisabled()) return;\n this._open(event.clientX, event.clientY);\n }\n\n private _open(x: number, y: number): void {\n this._close();\n this._overlayRef = this._overlay.create({\n hasBackdrop: true,\n backdropClass: 'neu-context-menu-backdrop',\n positionStrategy: this._overlay.position().global().left(`${x}px`).top(`${y}px`),\n scrollStrategy: this._overlay.scrollStrategies.close(),\n });\n\n const portal = new ComponentPortal(NeuContextMenuOverlayComponent, this._vcr, this._injector);\n this._compRef = this._overlayRef.attach(portal);\n this._compRef.instance._items.set(this.neuContextMenu());\n this._compRef.instance.itemTemplate = this.itemTpl()?.templateRef ?? null;\n this._compRef.instance._selectFn = (item) => {\n this.menuItemClick.emit(item);\n this._close();\n };\n this._compRef.instance._escapeFn = () => this._close();\n\n this._overlayRef.backdropClick().subscribe(() => this._close());\n this.menuOpened.emit();\n }\n\n private _close(): void {\n if (this._overlayRef?.hasAttached()) {\n this._overlayRef.detach();\n this.menuClosed.emit();\n }\n this._overlayRef?.dispose();\n this._overlayRef = null;\n this._compRef = null;\n }\n\n ngOnDestroy(): void {\n this._close();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -63,7 +63,7 @@ class NeuEmptyStateComponent {
|
|
|
63
63
|
</button>
|
|
64
64
|
}
|
|
65
65
|
</div>
|
|
66
|
-
`, isInline: true, styles: [".neu-empty-state{display:flex;align-items:center;justify-content:center;padding:var(--neu-space-10, 2.5rem) var(--neu-space-6, 1.5rem);text-align:center;width:100%}.neu-empty-state__inner{display:flex;flex-direction:column;align-items:center;gap:var(--neu-space-3, .75rem);max-width:380px}.neu-empty-state__icon{display:flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:var(--neu-radius-lg, 16px);background:var(--neu-surface-2, #f8fafc);color:var(--neu-text-muted, #94a3b8);margin-bottom:var(--neu-space-2, .5rem);border:1px solid var(--neu-border, #e2e8f0)}.neu-empty-state__title{margin:0;font-size:var(--neu-text-base, 1rem);font-weight:600;color:var(--neu-text, #0f172a)}.neu-empty-state__desc{margin:0;font-size:var(--neu-text-sm, .875rem);color:var(--neu-text-muted, #64748b);line-height:1.5}.neu-empty-state--sm,.neu-empty-state--compact{padding:var(--neu-space-5, 1.25rem) var(--neu-space-4, 1rem)}.neu-empty-state--sm .neu-empty-state__inner,.neu-empty-state--compact .neu-empty-state__inner{gap:var(--neu-space-2, .5rem);max-width:320px}.neu-empty-state--sm .neu-empty-state__icon,.neu-empty-state--compact .neu-empty-state__icon{width:48px;height:48px;border-radius:var(--neu-radius-md, 12px);margin-bottom:0}.neu-empty-state--sm .neu-empty-state__title,.neu-empty-state--compact .neu-empty-state__title{font-size:var(--neu-text-sm, .875rem)}.neu-empty-state--sm .neu-empty-state__desc,.neu-empty-state--compact .neu-empty-state__desc{font-size:var(--neu-text-xs, .75rem)}.neu-empty-state--lg{padding:var(--neu-space-12, 3rem) var(--neu-space-8, 2rem)}.neu-empty-state--lg .neu-empty-state__inner{max-width:460px}.neu-empty-state--lg .neu-empty-state__title{font-size:var(--neu-text-lg, 1.125rem)}.neu-empty-state--info .neu-empty-state__icon{background:color-mix(in srgb,var(--neu-info, #0ea5e9) 12%,transparent);color:var(--neu-info, #0ea5e9);border-color:color-mix(in srgb,var(--neu-info, #0ea5e9) 24%,transparent)}.neu-empty-state--warning .neu-empty-state__icon{background:color-mix(in srgb,var(--neu-warning, #f59e0b) 14%,transparent);color:var(--neu-warning, #f59e0b);border-color:color-mix(in srgb,var(--neu-warning, #f59e0b) 28%,transparent)}.neu-empty-state--danger .neu-empty-state__icon{background:color-mix(in srgb,var(--neu-danger, #ef4444) 12%,transparent);color:var(--neu-danger, #ef4444);border-color:color-mix(in srgb,var(--neu-danger, #ef4444) 24%,transparent)}.neu-empty-state--success .neu-empty-state__icon{background:color-mix(in srgb,var(--neu-success, #22c55e) 12%,transparent);color:var(--neu-success, #22c55e);border-color:color-mix(in srgb,var(--neu-success, #22c55e) 24%,transparent)}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }, { kind: "component", type: NeuButtonComponent, selector: "button[neu-button]", inputs: ["variant", "size", "disabled", "loading", "fullWidth", "icon", "iconPosition", "iconOnly", "ariaLabel"], outputs: ["neuClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
66
|
+
`, isInline: true, styles: [".neu-empty-state{display:flex;align-items:center;justify-content:center;padding:var(--neu-space-10, 2.5rem) var(--neu-space-6, 1.5rem);text-align:center;width:100%}.neu-empty-state__inner{display:flex;flex-direction:column;align-items:center;gap:var(--neu-space-3, .75rem);max-width:380px}.neu-empty-state__icon{display:flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:var(--neu-radius-lg, 16px);background:var(--neu-surface-2, #f8fafc);color:var(--neu-text-muted, #94a3b8);margin-bottom:var(--neu-space-2, .5rem);border:1px solid var(--neu-border, #e2e8f0)}.neu-empty-state__title{margin:0;font-size:var(--neu-text-base, 1rem);font-weight:600;color:var(--neu-text, #0f172a)}.neu-empty-state__desc{margin:0;font-size:var(--neu-text-sm, .875rem);color:var(--neu-text-muted, #64748b);line-height:1.5}.neu-empty-state--sm,.neu-empty-state--compact{padding:var(--neu-space-5, 1.25rem) var(--neu-space-4, 1rem)}.neu-empty-state--sm .neu-empty-state__inner,.neu-empty-state--compact .neu-empty-state__inner{gap:var(--neu-space-2, .5rem);max-width:320px}.neu-empty-state--sm .neu-empty-state__icon,.neu-empty-state--compact .neu-empty-state__icon{width:48px;height:48px;border-radius:var(--neu-radius-md, 12px);margin-bottom:0}.neu-empty-state--sm .neu-empty-state__title,.neu-empty-state--compact .neu-empty-state__title{font-size:var(--neu-text-sm, .875rem)}.neu-empty-state--sm .neu-empty-state__desc,.neu-empty-state--compact .neu-empty-state__desc{font-size:var(--neu-text-xs, .75rem)}.neu-empty-state--lg{padding:var(--neu-space-12, 3rem) var(--neu-space-8, 2rem)}.neu-empty-state--lg .neu-empty-state__inner{max-width:460px}.neu-empty-state--lg .neu-empty-state__title{font-size:var(--neu-text-lg, 1.125rem)}.neu-empty-state--info .neu-empty-state__icon{background:color-mix(in srgb,var(--neu-info, #0ea5e9) 12%,transparent);color:var(--neu-info, #0ea5e9);border-color:color-mix(in srgb,var(--neu-info, #0ea5e9) 24%,transparent)}.neu-empty-state--warning .neu-empty-state__icon{background:color-mix(in srgb,var(--neu-warning, #f59e0b) 14%,transparent);color:var(--neu-warning, #f59e0b);border-color:color-mix(in srgb,var(--neu-warning, #f59e0b) 28%,transparent)}.neu-empty-state--danger .neu-empty-state__icon{background:color-mix(in srgb,var(--neu-danger, #ef4444) 12%,transparent);color:var(--neu-danger, #ef4444);border-color:color-mix(in srgb,var(--neu-danger, #ef4444) 24%,transparent)}.neu-empty-state--success .neu-empty-state__icon{background:color-mix(in srgb,var(--neu-success, #22c55e) 12%,transparent);color:var(--neu-success, #22c55e);border-color:color-mix(in srgb,var(--neu-success, #22c55e) 24%,transparent)}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "decorative", "ariaLabel", "strokeWidth", "size"] }, { kind: "component", type: NeuButtonComponent, selector: "button[neu-button]", inputs: ["variant", "size", "disabled", "loading", "fullWidth", "icon", "iconPosition", "iconOnly", "ariaLabel"], outputs: ["neuClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
67
67
|
}
|
|
68
68
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuEmptyStateComponent, decorators: [{
|
|
69
69
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-empty-state.mjs","sources":["../../../../projects/ui-core/empty-state/neu-empty-state.component.ts","../../../../projects/ui-core/empty-state/neural-ui-core-empty-state.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n output,\n} from '@angular/core';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\n\nexport type NeuEmptyStateSize = 'sm' | 'md' | 'lg';\nexport type NeuEmptyStateTone = 'neutral' | 'info' | 'warning' | 'danger' | 'success';\n\n/**\n * NeuEmptyState — Estado vacío con icono Lucide, título, descripción y acción.\n *\n * Uso:\n * <neu-empty-state\n * icon=\"lucideInbox\"\n * title=\"Sin resultados\"\n * description=\"Prueba con otros filtros.\"\n * actionLabel=\"Limpiar filtros\"\n * (action)=\"clearFilters()\"\n * />\n */\n@Component({\n selector: 'neu-empty-state',\n imports: [NeuIconComponent, NeuButtonComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClasses()' },\n template: `\n <div class=\"neu-empty-state__inner\">\n @if (icon()) {\n <span class=\"neu-empty-state__icon\">\n <neu-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </span>\n }\n\n <p class=\"neu-empty-state__title\">{{ title() }}</p>\n\n @if (description()) {\n <p class=\"neu-empty-state__desc\">{{ description() }}</p>\n }\n\n @if (actionLabel()) {\n <button neu-button variant=\"primary\" size=\"md\" (click)=\"action.emit()\">\n {{ actionLabel() }}\n </button>\n }\n </div>\n `,\n styleUrl: './neu-empty-state.component.scss',\n})\nexport class NeuEmptyStateComponent {\n /** Nombre del icono Lucide registrado con provideIcons(). / Lucide icon name registered with provideIcons(). */\n icon = input<string>('lucideInbox');\n /** Tamaño del icono. Por defecto 3rem. / Icon size. Default 3rem. */\n iconSize = input<string>('3rem');\n /** Título principal del estado vacío. / Main title of the empty state. */\n title = input<string>('No hay nada aquí');\n /** Descripción secundaria opcional. / Optional secondary description. */\n description = input<string>('');\n /** Texto del botón de acción. Si está vacío, no se muestra el botón. / Action button text. If empty, the button is not shown. */\n actionLabel = input<string>('');\n /** Tamaño visual del estado vacío / Visual empty state size */\n size = input<NeuEmptyStateSize>('md');\n /** Tono semántico del icono y fondo / Semantic tone for icon and background */\n tone = input<NeuEmptyStateTone>('neutral');\n /** Reduce espaciado para tablas, listas y overlays compactos / Reduces spacing for tables, lists and compact overlays */\n compact = input<boolean>(false);\n\n /** Emite cuando el usuario hace clic en el botón de acción. / Emits when the user clicks the action button. */\n action = output<void>();\n\n hostClasses(): Record<string, boolean> {\n return {\n 'neu-empty-state': true,\n [`neu-empty-state--${this.size()}`]: true,\n [`neu-empty-state--${this.tone()}`]: true,\n 'neu-empty-state--compact': this.compact(),\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;AAaA;;;;;;;;;;;AAWG;MA8BU,sBAAsB,CAAA;;AAEjC,IAAA,IAAI,GAAG,KAAK,CAAS,aAAa,2EAAC;;AAEnC,IAAA,QAAQ,GAAG,KAAK,CAAS,MAAM,+EAAC;;AAEhC,IAAA,KAAK,GAAG,KAAK,CAAS,kBAAkB,4EAAC;;AAEzC,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;;AAE/B,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;;AAE/B,IAAA,IAAI,GAAG,KAAK,CAAoB,IAAI,2EAAC;;AAErC,IAAA,IAAI,GAAG,KAAK,CAAoB,SAAS,2EAAC;;AAE1C,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;;IAG/B,MAAM,GAAG,MAAM,EAAQ;IAEvB,WAAW,GAAA;QACT,OAAO;AACL,YAAA,iBAAiB,EAAE,IAAI;YACvB,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI;YACzC,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI;AACzC,YAAA,0BAA0B,EAAE,IAAI,CAAC,OAAO,EAAE;SAC3C;IACH;wGA5BW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvBvB;;;;;;;;;;;;;;;;;;;;GAoBT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,umFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAxBS,gBAAgB,
|
|
1
|
+
{"version":3,"file":"neural-ui-core-empty-state.mjs","sources":["../../../../projects/ui-core/empty-state/neu-empty-state.component.ts","../../../../projects/ui-core/empty-state/neural-ui-core-empty-state.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n output,\n} from '@angular/core';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\n\nexport type NeuEmptyStateSize = 'sm' | 'md' | 'lg';\nexport type NeuEmptyStateTone = 'neutral' | 'info' | 'warning' | 'danger' | 'success';\n\n/**\n * NeuEmptyState — Estado vacío con icono Lucide, título, descripción y acción.\n *\n * Uso:\n * <neu-empty-state\n * icon=\"lucideInbox\"\n * title=\"Sin resultados\"\n * description=\"Prueba con otros filtros.\"\n * actionLabel=\"Limpiar filtros\"\n * (action)=\"clearFilters()\"\n * />\n */\n@Component({\n selector: 'neu-empty-state',\n imports: [NeuIconComponent, NeuButtonComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClasses()' },\n template: `\n <div class=\"neu-empty-state__inner\">\n @if (icon()) {\n <span class=\"neu-empty-state__icon\">\n <neu-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </span>\n }\n\n <p class=\"neu-empty-state__title\">{{ title() }}</p>\n\n @if (description()) {\n <p class=\"neu-empty-state__desc\">{{ description() }}</p>\n }\n\n @if (actionLabel()) {\n <button neu-button variant=\"primary\" size=\"md\" (click)=\"action.emit()\">\n {{ actionLabel() }}\n </button>\n }\n </div>\n `,\n styleUrl: './neu-empty-state.component.scss',\n})\nexport class NeuEmptyStateComponent {\n /** Nombre del icono Lucide registrado con provideIcons(). / Lucide icon name registered with provideIcons(). */\n icon = input<string>('lucideInbox');\n /** Tamaño del icono. Por defecto 3rem. / Icon size. Default 3rem. */\n iconSize = input<string>('3rem');\n /** Título principal del estado vacío. / Main title of the empty state. */\n title = input<string>('No hay nada aquí');\n /** Descripción secundaria opcional. / Optional secondary description. */\n description = input<string>('');\n /** Texto del botón de acción. Si está vacío, no se muestra el botón. / Action button text. If empty, the button is not shown. */\n actionLabel = input<string>('');\n /** Tamaño visual del estado vacío / Visual empty state size */\n size = input<NeuEmptyStateSize>('md');\n /** Tono semántico del icono y fondo / Semantic tone for icon and background */\n tone = input<NeuEmptyStateTone>('neutral');\n /** Reduce espaciado para tablas, listas y overlays compactos / Reduces spacing for tables, lists and compact overlays */\n compact = input<boolean>(false);\n\n /** Emite cuando el usuario hace clic en el botón de acción. / Emits when the user clicks the action button. */\n action = output<void>();\n\n hostClasses(): Record<string, boolean> {\n return {\n 'neu-empty-state': true,\n [`neu-empty-state--${this.size()}`]: true,\n [`neu-empty-state--${this.tone()}`]: true,\n 'neu-empty-state--compact': this.compact(),\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,10 @@ import { NgIcon } from '@ng-icons/core';
|
|
|
16
16
|
class NeuIconComponent {
|
|
17
17
|
/** Nombre del icono registrado con provideIcons() / Icon name registered with provideIcons() */
|
|
18
18
|
name = input.required(...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
19
|
+
/** Los iconos son decorativos por defecto. Para exponer uno al lector de pantalla, usa decorative=false y ariaLabel. */
|
|
20
|
+
decorative = input(true, ...(ngDevMode ? [{ debugName: "decorative" }] : /* istanbul ignore next */ []));
|
|
21
|
+
/** Nombre accesible obligatorio cuando decorative=false. */
|
|
22
|
+
ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
19
23
|
/**
|
|
20
24
|
* Grosor del trazo. Default '2' para estética fina y técnica.
|
|
21
25
|
* Puede sobrescribirse por instancia.
|
|
@@ -29,7 +33,7 @@ class NeuIconComponent {
|
|
|
29
33
|
/** Tamaño resuelto: usa el input `size` o cae al token CSS. / Resolved size: uses the `size` input or falls back to the CSS token. */
|
|
30
34
|
resolvedSize = computed(() => this.size() || 'var(--neu-icon-size, 1.25rem)', ...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
|
|
31
35
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
32
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: NeuIconComponent, isStandalone: true, selector: "neu-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "\"inline-flex\"", "style.align-items": "\"center\"", "style.justify-content": "\"center\"", "style.line-height": "\"1\"", "style.color": "\"inherit\"" }, classAttribute: "neu-icon" }, ngImport: i0, template: `<ng-icon [name]="name()" [size]="resolvedSize()" [strokeWidth]="strokeWidth()" />`, isInline: true, styles: [".neu-icon{color:inherit;vertical-align:middle;flex-shrink:0}\n"], dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
36
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: NeuIconComponent, isStandalone: true, selector: "neu-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, decorative: { classPropertyName: "decorative", publicName: "decorative", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "\"inline-flex\"", "style.align-items": "\"center\"", "style.justify-content": "\"center\"", "style.line-height": "\"1\"", "style.color": "\"inherit\"", "attr.aria-hidden": "decorative() ? \"true\" : null", "attr.role": "decorative() ? null : \"img\"", "attr.aria-label": "decorative() ? null : ariaLabel() || null" }, classAttribute: "neu-icon" }, ngImport: i0, template: `<ng-icon [name]="name()" [size]="resolvedSize()" [strokeWidth]="strokeWidth()" />`, isInline: true, styles: [".neu-icon{color:inherit;vertical-align:middle;flex-shrink:0}\n"], dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
33
37
|
}
|
|
34
38
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuIconComponent, decorators: [{
|
|
35
39
|
type: Component,
|
|
@@ -40,8 +44,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
40
44
|
'[style.justify-content]': '"center"',
|
|
41
45
|
'[style.line-height]': '"1"',
|
|
42
46
|
'[style.color]': '"inherit"',
|
|
47
|
+
'[attr.aria-hidden]': 'decorative() ? "true" : null',
|
|
48
|
+
'[attr.role]': 'decorative() ? null : "img"',
|
|
49
|
+
'[attr.aria-label]': 'decorative() ? null : ariaLabel() || null',
|
|
43
50
|
}, template: `<ng-icon [name]="name()" [size]="resolvedSize()" [strokeWidth]="strokeWidth()" />`, styles: [".neu-icon{color:inherit;vertical-align:middle;flex-shrink:0}\n"] }]
|
|
44
|
-
}], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
|
|
51
|
+
}], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], decorative: [{ type: i0.Input, args: [{ isSignal: true, alias: "decorative", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
|
|
45
52
|
|
|
46
53
|
/**
|
|
47
54
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-icon.mjs","sources":["../../../../projects/ui-core/icon/neu-icon.component.ts","../../../../projects/ui-core/icon/neural-ui-core-icon.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { NgIcon } from '@ng-icons/core';\n\n/**\n * NeuIconComponent — Wrapper delgado sobre NgIcon de @ng-icons/core\n *\n * Hereda el color del elemento padre mediante `color: currentColor`.\n * El grosor del trazo se controla con la variable CSS `--ng-icon__stroke-width`\n * que viene configurada globalmente vía `provideNgIconsConfig`.\n *\n * Uso básico:\n * <neu-icon name=\"lucideX\" />\n * <neu-icon name=\"lucideAlertCircle\" size=\"1rem\" />\n */\n@Component({\n selector: 'neu-icon',\n imports: [NgIcon],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-icon',\n '[style.display]': '\"inline-flex\"',\n '[style.align-items]': '\"center\"',\n '[style.justify-content]': '\"center\"',\n '[style.line-height]': '\"1\"',\n '[style.color]': '\"inherit\"',\n },\n template: `<ng-icon [name]=\"name()\" [size]=\"resolvedSize()\" [strokeWidth]=\"strokeWidth()\" />`,\n styleUrl: './neu-icon.component.scss',\n})\nexport class NeuIconComponent {\n /** Nombre del icono registrado con provideIcons() / Icon name registered with provideIcons() */\n name = input.required<string>();\n\n /**\n * Grosor del trazo. Default '2' para estética fina y técnica.\n * Puede sobrescribirse por instancia.\n */\n strokeWidth = input<string>('2');\n\n /**\n * Tamaño del icono. Acepta cualquier unidad CSS válida.\n * Si no se especifica, usa la variable CSS `--neu-icon-size` (1.25rem por defecto).\n */\n size = input<string>('');\n\n /** Tamaño resuelto: usa el input `size` o cae al token CSS. / Resolved size: uses the `size` input or falls back to the CSS token. */\n readonly resolvedSize = computed(() => this.size() || 'var(--neu-icon-size, 1.25rem)');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;AASA;;;;;;;;;;AAUG;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-icon.mjs","sources":["../../../../projects/ui-core/icon/neu-icon.component.ts","../../../../projects/ui-core/icon/neural-ui-core-icon.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { NgIcon } from '@ng-icons/core';\n\n/**\n * NeuIconComponent — Wrapper delgado sobre NgIcon de @ng-icons/core\n *\n * Hereda el color del elemento padre mediante `color: currentColor`.\n * El grosor del trazo se controla con la variable CSS `--ng-icon__stroke-width`\n * que viene configurada globalmente vía `provideNgIconsConfig`.\n *\n * Uso básico:\n * <neu-icon name=\"lucideX\" />\n * <neu-icon name=\"lucideAlertCircle\" size=\"1rem\" />\n */\n@Component({\n selector: 'neu-icon',\n imports: [NgIcon],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-icon',\n '[style.display]': '\"inline-flex\"',\n '[style.align-items]': '\"center\"',\n '[style.justify-content]': '\"center\"',\n '[style.line-height]': '\"1\"',\n '[style.color]': '\"inherit\"',\n '[attr.aria-hidden]': 'decorative() ? \"true\" : null',\n '[attr.role]': 'decorative() ? null : \"img\"',\n '[attr.aria-label]': 'decorative() ? null : ariaLabel() || null',\n },\n template: `<ng-icon [name]=\"name()\" [size]=\"resolvedSize()\" [strokeWidth]=\"strokeWidth()\" />`,\n styleUrl: './neu-icon.component.scss',\n})\nexport class NeuIconComponent {\n /** Nombre del icono registrado con provideIcons() / Icon name registered with provideIcons() */\n name = input.required<string>();\n\n /** Los iconos son decorativos por defecto. Para exponer uno al lector de pantalla, usa decorative=false y ariaLabel. */\n decorative = input<boolean>(true);\n\n /** Nombre accesible obligatorio cuando decorative=false. */\n ariaLabel = input<string>('');\n\n /**\n * Grosor del trazo. Default '2' para estética fina y técnica.\n * Puede sobrescribirse por instancia.\n */\n strokeWidth = input<string>('2');\n\n /**\n * Tamaño del icono. Acepta cualquier unidad CSS válida.\n * Si no se especifica, usa la variable CSS `--neu-icon-size` (1.25rem por defecto).\n */\n size = input<string>('');\n\n /** Tamaño resuelto: usa el input `size` o cae al token CSS. / Resolved size: uses the `size` input or falls back to the CSS token. */\n readonly resolvedSize = computed(() => this.size() || 'var(--neu-icon-size, 1.25rem)');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -292,7 +292,7 @@ class NeuInlineEditorComponent {
|
|
|
292
292
|
}
|
|
293
293
|
</button>
|
|
294
294
|
}
|
|
295
|
-
`, isInline: true, styles: [".neu-inline-editor{display:inline-flex;min-width:0;max-width:100%;vertical-align:middle}.neu-inline-editor__display{display:inline-flex;align-items:center;gap:var(--neu-space-2, .5rem);min-width:0;max-width:100%;padding:0;border:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:var(--neu-radius-sm, 6px)}.neu-inline-editor__display:focus-visible{outline:none;box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-inline-editor__display:disabled{cursor:not-allowed;opacity:.6}.neu-inline-editor__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.neu-inline-editor__value--empty{color:var(--neu-text-muted, #64748b);font-style:italic}.neu-inline-editor__edit{display:inline-flex;align-items:center;gap:var(--neu-space-2, .5rem);min-width:min(100%,260px);max-width:100%}.neu-inline-editor__control{flex:1 1 auto;min-width:8rem}.neu-inline-editor__actions{display:inline-flex;align-items:center;gap:var(--neu-space-1, .25rem);flex:0 0 auto}.neu-inline-editor--sm .neu-inline-editor__edit{min-width:min(100%,220px)}.neu-inline-editor--lg .neu-inline-editor__edit{min-width:min(100%,320px)}@media(max-width:480px){.neu-inline-editor{width:100%}.neu-inline-editor__edit{width:100%;flex-wrap:wrap}.neu-inline-editor__control{flex-basis:100%}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: NeuButtonComponent, selector: "button[neu-button]", inputs: ["variant", "size", "disabled", "loading", "fullWidth", "icon", "iconPosition", "iconOnly", "ariaLabel"], outputs: ["neuClick"] }, { kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }, { kind: "component", type: NeuInputComponent, selector: "neu-input", inputs: ["type", "label", "placeholder", "floatingLabel", "size", "hint", "errorMessage", "disabled", "autocomplete", "startIcon", "endIcon", "icon", "iconPosition", "inputId", "name", "required", "readonly", "maxlength", "minlength", "min", "max", "pattern"] }, { kind: "component", type: NeuDateInputComponent, selector: "neu-date-input", inputs: ["type", "label", "hint", "errorMessage", "disabled", "size", "readonly", "name", "inputId", "required", "min", "max", "step", "locale", "disabledDates", "multiple", "showMonthYearPicker", "yearRange", "placeholder", "dateFormat", "floatingLabel", "presets"], outputs: ["rangeChange"] }, { kind: "component", type: NeuNumberInputComponent, selector: "neu-number-input", inputs: ["min", "max", "step", "label", "floatingLabel", "decrementLabel", "incrementLabel", "vertical", "stacked", "size"], outputs: ["valueChange"] }, { kind: "component", type: NeuSelectComponent, selector: "neu-select", inputs: ["options", "label", "placeholder", "errorMessage", "hint", "disabled", "floatingLabel", "size", "searchable", "searchPlaceholder", "loading", "loadingLabel", "clearable", "virtualScroll", "virtualScrollVisibleItems", "noResultsMessage", "clearAriaLabel", "urlParam"], outputs: ["selectionChange"] }, { kind: "component", type: NeuTextareaComponent, selector: "neu-textarea", inputs: ["label", "rows", "size", "autoResize", "resizable", "errorMessage", "hint", "disabled", "readonly", "required", "name", "maxlength"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
295
|
+
`, isInline: true, styles: [".neu-inline-editor{display:inline-flex;min-width:0;max-width:100%;vertical-align:middle}.neu-inline-editor__display{display:inline-flex;align-items:center;gap:var(--neu-space-2, .5rem);min-width:0;max-width:100%;padding:0;border:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;border-radius:var(--neu-radius-sm, 6px)}.neu-inline-editor__display:focus-visible{outline:none;box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-inline-editor__display:disabled{cursor:not-allowed;opacity:.6}.neu-inline-editor__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.neu-inline-editor__value--empty{color:var(--neu-text-muted, #64748b);font-style:italic}.neu-inline-editor__edit{display:inline-flex;align-items:center;gap:var(--neu-space-2, .5rem);min-width:min(100%,260px);max-width:100%}.neu-inline-editor__control{flex:1 1 auto;min-width:8rem}.neu-inline-editor__actions{display:inline-flex;align-items:center;gap:var(--neu-space-1, .25rem);flex:0 0 auto}.neu-inline-editor--sm .neu-inline-editor__edit{min-width:min(100%,220px)}.neu-inline-editor--lg .neu-inline-editor__edit{min-width:min(100%,320px)}@media(max-width:480px){.neu-inline-editor{width:100%}.neu-inline-editor__edit{width:100%;flex-wrap:wrap}.neu-inline-editor__control{flex-basis:100%}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: NeuButtonComponent, selector: "button[neu-button]", inputs: ["variant", "size", "disabled", "loading", "fullWidth", "icon", "iconPosition", "iconOnly", "ariaLabel"], outputs: ["neuClick"] }, { kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "decorative", "ariaLabel", "strokeWidth", "size"] }, { kind: "component", type: NeuInputComponent, selector: "neu-input", inputs: ["type", "label", "placeholder", "floatingLabel", "size", "hint", "errorMessage", "disabled", "autocomplete", "startIcon", "endIcon", "icon", "iconPosition", "inputId", "name", "required", "readonly", "maxlength", "minlength", "min", "max", "pattern"] }, { kind: "component", type: NeuDateInputComponent, selector: "neu-date-input", inputs: ["type", "label", "hint", "errorMessage", "disabled", "size", "readonly", "name", "inputId", "required", "min", "max", "step", "locale", "disabledDates", "multiple", "showMonthYearPicker", "yearRange", "placeholder", "dateFormat", "floatingLabel", "presets"], outputs: ["rangeChange"] }, { kind: "component", type: NeuNumberInputComponent, selector: "neu-number-input", inputs: ["min", "max", "step", "label", "floatingLabel", "decrementLabel", "incrementLabel", "vertical", "stacked", "size"], outputs: ["valueChange"] }, { kind: "component", type: NeuSelectComponent, selector: "neu-select", inputs: ["options", "label", "placeholder", "errorMessage", "hint", "disabled", "floatingLabel", "size", "searchable", "searchPlaceholder", "loading", "loadingLabel", "clearable", "virtualScroll", "virtualScrollVisibleItems", "noResultsMessage", "clearAriaLabel", "urlParam"], outputs: ["selectionChange"] }, { kind: "component", type: NeuTextareaComponent, selector: "neu-textarea", inputs: ["label", "rows", "size", "autoResize", "resizable", "errorMessage", "hint", "disabled", "readonly", "required", "name", "maxlength"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
296
296
|
}
|
|
297
297
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuInlineEditorComponent, decorators: [{
|
|
298
298
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-inline-editor.mjs","sources":["../../../../projects/ui-core/inline-editor/neu-inline-editor.component.ts","../../../../projects/ui-core/inline-editor/neural-ui-core-inline-editor.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\nimport { NeuInputComponent } from '@neural-ui/core/input';\nimport { NeuDateInputComponent } from '@neural-ui/core/date-input';\nimport { NeuNumberInputComponent } from '@neural-ui/core/number-input';\nimport { NeuSelectComponent, NeuSelectOption } from '@neural-ui/core/select';\nimport { NeuTextareaComponent } from '@neural-ui/core/textarea';\n\nexport type NeuInlineEditorType = 'text' | 'number' | 'select' | 'textarea' | 'date';\nexport type NeuInlineEditorSize = 'sm' | 'md' | 'lg';\n\nexport interface NeuInlineEditorCommitEvent<T = string | number | null> {\n previousValue: T;\n value: T;\n}\n\n@Component({\n selector: 'neu-inline-editor',\n imports: [\n ReactiveFormsModule,\n NeuButtonComponent,\n NeuIconComponent,\n NeuInputComponent,\n NeuDateInputComponent,\n NeuNumberInputComponent,\n NeuSelectComponent,\n NeuTextareaComponent,\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuInlineEditorComponent),\n multi: true,\n },\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.aria-disabled]': 'isDisabled()',\n },\n template: `\n @if (editing()) {\n <div\n class=\"neu-inline-editor__edit\"\n (keydown)=\"onEditKeydown($event)\"\n (focusout)=\"onEditFocusout($event)\"\n >\n @switch (type()) {\n @case ('select') {\n <neu-select\n class=\"neu-inline-editor__control\"\n [options]=\"options()\"\n [formControl]=\"stringControl\"\n [size]=\"size()\"\n [floatingLabel]=\"false\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n />\n }\n @case ('number') {\n <neu-number-input\n class=\"neu-inline-editor__control\"\n [formControl]=\"numberControl\"\n [size]=\"size()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n />\n }\n @case ('textarea') {\n <neu-textarea\n class=\"neu-inline-editor__control\"\n [formControl]=\"stringControl\"\n [size]=\"size()\"\n [label]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [rows]=\"rows()\"\n />\n }\n @case ('date') {\n <neu-date-input\n class=\"neu-inline-editor__control\"\n [formControl]=\"stringControl\"\n [size]=\"size()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n />\n }\n @default {\n <neu-input\n class=\"neu-inline-editor__control\"\n [formControl]=\"stringControl\"\n [size]=\"size()\"\n [floatingLabel]=\"false\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n />\n }\n }\n\n <div class=\"neu-inline-editor__actions\">\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n [size]=\"size()\"\n icon=\"lucideCheck\"\n [iconOnly]=\"true\"\n [ariaLabel]=\"saveLabel()\"\n [disabled]=\"isDisabled()\"\n (click)=\"commit()\"\n ></button>\n <button\n neu-button\n type=\"button\"\n variant=\"ghost\"\n [size]=\"size()\"\n icon=\"lucideX\"\n [iconOnly]=\"true\"\n [ariaLabel]=\"cancelLabel()\"\n (click)=\"cancel()\"\n ></button>\n </div>\n </div>\n } @else {\n <button\n neu-button\n class=\"neu-inline-editor__display\"\n type=\"button\"\n variant=\"ghost\"\n [size]=\"size()\"\n [disabled]=\"isDisabled() || readonly()\"\n [attr.aria-label]=\"editLabel()\"\n (click)=\"beginEdit()\"\n >\n <span class=\"neu-inline-editor__value\" [class.neu-inline-editor__value--empty]=\"isEmpty()\">\n {{ displayValue() }}\n </span>\n @if (!readonly()) {\n <neu-icon name=\"lucidePencil\" size=\"14px\" aria-hidden=\"true\" />\n }\n </button>\n }\n `,\n styleUrl: './neu-inline-editor.component.scss',\n})\nexport class NeuInlineEditorComponent implements ControlValueAccessor {\n private readonly _host = inject(ElementRef<HTMLElement>);\n\n readonly value = input<string | number | null>(null);\n readonly type = input<NeuInlineEditorType>('text');\n readonly size = input<NeuInlineEditorSize>('sm');\n readonly options = input<NeuSelectOption[]>([]);\n readonly placeholder = input('');\n readonly emptyLabel = input('Empty');\n readonly editLabel = input('Edit value');\n readonly saveLabel = input('Save value');\n readonly cancelLabel = input('Cancel edit');\n readonly disabled = input(false);\n readonly readonly = input(false);\n readonly startInEdit = input(false);\n readonly saveOnBlur = input(false);\n readonly min = input(-Infinity);\n readonly max = input(Infinity);\n readonly step = input(1);\n readonly rows = input(3);\n\n readonly valueChange = output<string | number | null>();\n readonly editStart = output<string | number | null>();\n readonly editCancel = output<string | number | null>();\n readonly editCommit = output<NeuInlineEditorCommitEvent>();\n\n readonly stringControl = new FormControl<string | null>(null);\n readonly numberControl = new FormControl<number>(0, { nonNullable: true });\n readonly editing = signal(false);\n private readonly _value = signal<string | number | null>(null);\n private readonly _snapshot = signal<string | number | null>(null);\n private readonly _cvaDisabled = signal(false);\n private _onChange: (value: string | number | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n readonly isEmpty = computed(() => {\n const value = this._value();\n return value === null || value === undefined || value === '';\n });\n readonly displayValue = computed(() => {\n if (this.isEmpty()) return this.emptyLabel();\n const current = this._value();\n if (this.type() === 'select') {\n return this.options().find((option) => option.value === current)?.label ?? String(current);\n }\n return String(current);\n });\n\n constructor() {\n effect(() => {\n this._setValue(this.value(), false);\n });\n\n effect(() => {\n if (this.startInEdit() && !this.editing()) {\n this.beginEdit();\n }\n });\n\n this.stringControl.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => {\n if (this.type() !== 'number') {\n this._value.set(value);\n }\n });\n this.numberControl.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => {\n if (this.type() === 'number') {\n this._value.set(Number.isFinite(value) ? value : null);\n }\n });\n }\n\n writeValue(value: string | number | null): void {\n this._setValue(value, false);\n }\n\n registerOnChange(fn: (value: string | number | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n this._syncDisabledState();\n }\n\n beginEdit(): void {\n if (this.isDisabled() || this.readonly()) return;\n this._snapshot.set(this._value());\n this._syncControls(this._value());\n this.editing.set(true);\n this.editStart.emit(this._value());\n queueMicrotask(() => this._focusFirstControl());\n }\n\n commit(): void {\n if (this.isDisabled()) return;\n const previousValue = this._snapshot();\n const value = this.type() === 'number' ? this.numberControl.value : this.stringControl.value;\n const normalized = this._normalizeValue(value);\n this._setValue(normalized, true);\n this.editing.set(false);\n this._onTouched();\n this.editCommit.emit({ previousValue, value: normalized });\n }\n\n cancel(): void {\n const previousValue = this._snapshot();\n this._setValue(previousValue, false);\n this.editing.set(false);\n this._onTouched();\n this.editCancel.emit(previousValue);\n }\n\n onEditKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancel();\n return;\n }\n if (event.key === 'Enter' && this.type() !== 'textarea') {\n event.preventDefault();\n this.commit();\n }\n }\n\n onEditFocusout(event: FocusEvent): void {\n if (!this.saveOnBlur() || !this.editing()) return;\n const nextTarget = event.relatedTarget as Node | null;\n if (nextTarget && this._host.nativeElement.contains(nextTarget)) return;\n queueMicrotask(() => {\n if (this.editing()) {\n this.commit();\n }\n });\n }\n\n hostClasses(): Record<string, boolean> {\n return {\n 'neu-inline-editor': true,\n [`neu-inline-editor--${this.size()}`]: true,\n 'neu-inline-editor--editing': this.editing(),\n 'neu-inline-editor--disabled': this.isDisabled(),\n 'neu-inline-editor--readonly': this.readonly(),\n };\n }\n\n private _setValue(value: string | number | null | undefined, emit: boolean): void {\n const normalized = this._normalizeValue(value);\n this._value.set(normalized);\n this._syncControls(normalized);\n if (emit) {\n this.valueChange.emit(normalized);\n this._onChange(normalized);\n }\n }\n\n private _normalizeValue(value: string | number | null | undefined): string | number | null {\n if (value === undefined) return null;\n if (this.type() === 'number') {\n const next = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(next) ? next : null;\n }\n return value === null ? null : String(value);\n }\n\n private _syncControls(value: string | number | null): void {\n this.stringControl.setValue(value === null ? null : String(value), { emitEvent: false });\n this.numberControl.setValue(typeof value === 'number' ? value : Number(value ?? 0), {\n emitEvent: false,\n });\n this._syncDisabledState();\n }\n\n private _syncDisabledState(): void {\n const method = this.isDisabled() ? 'disable' : 'enable';\n this.stringControl[method]({ emitEvent: false });\n this.numberControl[method]({ emitEvent: false });\n }\n\n private _focusFirstControl(): void {\n const control = (this._host.nativeElement as HTMLElement).querySelector(\n '.neu-input__field, .neu-number-input__field, .neu-select__trigger, .neu-textarea__field',\n ) as HTMLElement | null;\n control?.focus();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"neural-ui-core-inline-editor.mjs","sources":["../../../../projects/ui-core/inline-editor/neu-inline-editor.component.ts","../../../../projects/ui-core/inline-editor/neural-ui-core-inline-editor.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\nimport { NeuInputComponent } from '@neural-ui/core/input';\nimport { NeuDateInputComponent } from '@neural-ui/core/date-input';\nimport { NeuNumberInputComponent } from '@neural-ui/core/number-input';\nimport { NeuSelectComponent, NeuSelectOption } from '@neural-ui/core/select';\nimport { NeuTextareaComponent } from '@neural-ui/core/textarea';\n\nexport type NeuInlineEditorType = 'text' | 'number' | 'select' | 'textarea' | 'date';\nexport type NeuInlineEditorSize = 'sm' | 'md' | 'lg';\n\nexport interface NeuInlineEditorCommitEvent<T = string | number | null> {\n previousValue: T;\n value: T;\n}\n\n@Component({\n selector: 'neu-inline-editor',\n imports: [\n ReactiveFormsModule,\n NeuButtonComponent,\n NeuIconComponent,\n NeuInputComponent,\n NeuDateInputComponent,\n NeuNumberInputComponent,\n NeuSelectComponent,\n NeuTextareaComponent,\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuInlineEditorComponent),\n multi: true,\n },\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.aria-disabled]': 'isDisabled()',\n },\n template: `\n @if (editing()) {\n <div\n class=\"neu-inline-editor__edit\"\n (keydown)=\"onEditKeydown($event)\"\n (focusout)=\"onEditFocusout($event)\"\n >\n @switch (type()) {\n @case ('select') {\n <neu-select\n class=\"neu-inline-editor__control\"\n [options]=\"options()\"\n [formControl]=\"stringControl\"\n [size]=\"size()\"\n [floatingLabel]=\"false\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n />\n }\n @case ('number') {\n <neu-number-input\n class=\"neu-inline-editor__control\"\n [formControl]=\"numberControl\"\n [size]=\"size()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n />\n }\n @case ('textarea') {\n <neu-textarea\n class=\"neu-inline-editor__control\"\n [formControl]=\"stringControl\"\n [size]=\"size()\"\n [label]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [rows]=\"rows()\"\n />\n }\n @case ('date') {\n <neu-date-input\n class=\"neu-inline-editor__control\"\n [formControl]=\"stringControl\"\n [size]=\"size()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n />\n }\n @default {\n <neu-input\n class=\"neu-inline-editor__control\"\n [formControl]=\"stringControl\"\n [size]=\"size()\"\n [floatingLabel]=\"false\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n />\n }\n }\n\n <div class=\"neu-inline-editor__actions\">\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n [size]=\"size()\"\n icon=\"lucideCheck\"\n [iconOnly]=\"true\"\n [ariaLabel]=\"saveLabel()\"\n [disabled]=\"isDisabled()\"\n (click)=\"commit()\"\n ></button>\n <button\n neu-button\n type=\"button\"\n variant=\"ghost\"\n [size]=\"size()\"\n icon=\"lucideX\"\n [iconOnly]=\"true\"\n [ariaLabel]=\"cancelLabel()\"\n (click)=\"cancel()\"\n ></button>\n </div>\n </div>\n } @else {\n <button\n neu-button\n class=\"neu-inline-editor__display\"\n type=\"button\"\n variant=\"ghost\"\n [size]=\"size()\"\n [disabled]=\"isDisabled() || readonly()\"\n [attr.aria-label]=\"editLabel()\"\n (click)=\"beginEdit()\"\n >\n <span class=\"neu-inline-editor__value\" [class.neu-inline-editor__value--empty]=\"isEmpty()\">\n {{ displayValue() }}\n </span>\n @if (!readonly()) {\n <neu-icon name=\"lucidePencil\" size=\"14px\" aria-hidden=\"true\" />\n }\n </button>\n }\n `,\n styleUrl: './neu-inline-editor.component.scss',\n})\nexport class NeuInlineEditorComponent implements ControlValueAccessor {\n private readonly _host = inject(ElementRef<HTMLElement>);\n\n readonly value = input<string | number | null>(null);\n readonly type = input<NeuInlineEditorType>('text');\n readonly size = input<NeuInlineEditorSize>('sm');\n readonly options = input<NeuSelectOption[]>([]);\n readonly placeholder = input('');\n readonly emptyLabel = input('Empty');\n readonly editLabel = input('Edit value');\n readonly saveLabel = input('Save value');\n readonly cancelLabel = input('Cancel edit');\n readonly disabled = input(false);\n readonly readonly = input(false);\n readonly startInEdit = input(false);\n readonly saveOnBlur = input(false);\n readonly min = input(-Infinity);\n readonly max = input(Infinity);\n readonly step = input(1);\n readonly rows = input(3);\n\n readonly valueChange = output<string | number | null>();\n readonly editStart = output<string | number | null>();\n readonly editCancel = output<string | number | null>();\n readonly editCommit = output<NeuInlineEditorCommitEvent>();\n\n readonly stringControl = new FormControl<string | null>(null);\n readonly numberControl = new FormControl<number>(0, { nonNullable: true });\n readonly editing = signal(false);\n private readonly _value = signal<string | number | null>(null);\n private readonly _snapshot = signal<string | number | null>(null);\n private readonly _cvaDisabled = signal(false);\n private _onChange: (value: string | number | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n readonly isEmpty = computed(() => {\n const value = this._value();\n return value === null || value === undefined || value === '';\n });\n readonly displayValue = computed(() => {\n if (this.isEmpty()) return this.emptyLabel();\n const current = this._value();\n if (this.type() === 'select') {\n return this.options().find((option) => option.value === current)?.label ?? String(current);\n }\n return String(current);\n });\n\n constructor() {\n effect(() => {\n this._setValue(this.value(), false);\n });\n\n effect(() => {\n if (this.startInEdit() && !this.editing()) {\n this.beginEdit();\n }\n });\n\n this.stringControl.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => {\n if (this.type() !== 'number') {\n this._value.set(value);\n }\n });\n this.numberControl.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => {\n if (this.type() === 'number') {\n this._value.set(Number.isFinite(value) ? value : null);\n }\n });\n }\n\n writeValue(value: string | number | null): void {\n this._setValue(value, false);\n }\n\n registerOnChange(fn: (value: string | number | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n this._syncDisabledState();\n }\n\n beginEdit(): void {\n if (this.isDisabled() || this.readonly()) return;\n this._snapshot.set(this._value());\n this._syncControls(this._value());\n this.editing.set(true);\n this.editStart.emit(this._value());\n queueMicrotask(() => this._focusFirstControl());\n }\n\n commit(): void {\n if (this.isDisabled()) return;\n const previousValue = this._snapshot();\n const value = this.type() === 'number' ? this.numberControl.value : this.stringControl.value;\n const normalized = this._normalizeValue(value);\n this._setValue(normalized, true);\n this.editing.set(false);\n this._onTouched();\n this.editCommit.emit({ previousValue, value: normalized });\n }\n\n cancel(): void {\n const previousValue = this._snapshot();\n this._setValue(previousValue, false);\n this.editing.set(false);\n this._onTouched();\n this.editCancel.emit(previousValue);\n }\n\n onEditKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancel();\n return;\n }\n if (event.key === 'Enter' && this.type() !== 'textarea') {\n event.preventDefault();\n this.commit();\n }\n }\n\n onEditFocusout(event: FocusEvent): void {\n if (!this.saveOnBlur() || !this.editing()) return;\n const nextTarget = event.relatedTarget as Node | null;\n if (nextTarget && this._host.nativeElement.contains(nextTarget)) return;\n queueMicrotask(() => {\n if (this.editing()) {\n this.commit();\n }\n });\n }\n\n hostClasses(): Record<string, boolean> {\n return {\n 'neu-inline-editor': true,\n [`neu-inline-editor--${this.size()}`]: true,\n 'neu-inline-editor--editing': this.editing(),\n 'neu-inline-editor--disabled': this.isDisabled(),\n 'neu-inline-editor--readonly': this.readonly(),\n };\n }\n\n private _setValue(value: string | number | null | undefined, emit: boolean): void {\n const normalized = this._normalizeValue(value);\n this._value.set(normalized);\n this._syncControls(normalized);\n if (emit) {\n this.valueChange.emit(normalized);\n this._onChange(normalized);\n }\n }\n\n private _normalizeValue(value: string | number | null | undefined): string | number | null {\n if (value === undefined) return null;\n if (this.type() === 'number') {\n const next = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(next) ? next : null;\n }\n return value === null ? null : String(value);\n }\n\n private _syncControls(value: string | number | null): void {\n this.stringControl.setValue(value === null ? null : String(value), { emitEvent: false });\n this.numberControl.setValue(typeof value === 'number' ? value : Number(value ?? 0), {\n emitEvent: false,\n });\n this._syncDisabledState();\n }\n\n private _syncDisabledState(): void {\n const method = this.isDisabled() ? 'disable' : 'enable';\n this.stringControl[method]({ emitEvent: false });\n this.numberControl[method]({ emitEvent: false });\n }\n\n private _focusFirstControl(): void {\n const control = (this._host.nativeElement as HTMLElement).querySelector(\n '.neu-input__field, .neu-number-input__field, .neu-select__trigger, .neu-textarea__field',\n ) as HTMLElement | null;\n control?.focus();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -201,7 +201,7 @@ class NeuInputComponent {
|
|
|
201
201
|
} @else if (hint()) {
|
|
202
202
|
<p class="neu-input__hint" [id]="inputId() + '-hint'">{{ hint() }}</p>
|
|
203
203
|
}
|
|
204
|
-
`, isInline: true, styles: [".neu-input-host{display:block}.neu-input-host--sm .neu-input__wrapper{height:36px}.neu-input-host--sm .neu-input__field{font-size:var(--neu-text-sm)}.neu-input-host--lg .neu-input__wrapper{height:56px}.neu-input__wrapper{position:relative;display:flex;align-items:center;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);height:48px;transition:border-color var(--neu-transition),box-shadow var(--neu-transition),background-color var(--neu-transition)}.neu-input__wrapper:hover:not(.neu-input__wrapper--disabled){border-color:var(--neu-border-hover)}.neu-input__wrapper--focused{border-color:var(--neu-primary);box-shadow:var(--neu-focus-ring)}.neu-input__wrapper--error{border-color:var(--neu-error)}.neu-input__wrapper--error.neu-input__wrapper--focused{box-shadow:0 0 0 3px #ef44441f}.neu-input__wrapper--disabled{background:var(--neu-surface-2);cursor:not-allowed}.neu-input__wrapper--has-start-icon .neu-input__field{padding-left:40px}.neu-input__wrapper--has-end-icon .neu-input__field{padding-right:40px}.neu-input__field{width:100%;height:100%;padding:0 var(--neu-space-3);border:none;background:transparent;outline:none;font-family:var(--neu-font-sans);font-size:var(--neu-text-base);color:var(--neu-text);caret-color:var(--neu-primary)}.neu-input__field:disabled{cursor:not-allowed;color:var(--neu-text-disabled)}.neu-input__field::placeholder{color:transparent;transition:color var(--neu-transition)}.neu-input__wrapper--focused .neu-input__field::placeholder{color:var(--neu-text-disabled)}.neu-input__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:var(--neu-text-muted);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6));transition:top var(--neu-transition),font-size var(--neu-transition),color var(--neu-transition),transform var(--neu-transition),padding var(--neu-transition),background var(--neu-transition)}.neu-input__wrapper--focused .neu-input__label,.neu-input__wrapper--has-value .neu-input__label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface);padding:0 4px;left:calc(var(--neu-space-3) - 4px)}.neu-input__wrapper--focused .neu-input__label{color:var(--neu-primary)}.neu-input__wrapper--error .neu-input__label{color:var(--neu-error)}.neu-input__wrapper--disabled .neu-input__label{background:var(--neu-surface-2)}.neu-input__wrapper--has-start-icon .neu-input__label{left:40px}.neu-input__wrapper--has-start-icon .neu-input__label.neu-input__wrapper--focused,.neu-input__wrapper--focused .neu-input__wrapper--has-start-icon .neu-input__label,.neu-input__wrapper--has-value .neu-input__wrapper--has-start-icon .neu-input__label{left:calc(var(--neu-space-3) - 4px)}.neu-input__icon{position:absolute;display:flex;align-items:center;justify-content:center;width:36px;height:36px;color:var(--neu-text-muted);pointer-events:none;flex-shrink:0}.neu-input__icon svg{width:18px;height:18px}.neu-input__icon--start{left:0}.neu-input__icon--end{right:0}.neu-input__error{display:flex;align-items:center;gap:4px;margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text);font-family:var(--neu-font-sans);line-height:1.4}.neu-input__hint{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-text-muted);font-family:var(--neu-font-sans)}.neu-input__static-label{display:block;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);margin-bottom:var(--neu-space-2)}.neu-input__wrapper--no-float .neu-input__field{padding:0 var(--neu-space-3)}.neu-input__wrapper--no-float .neu-input__field::placeholder{color:var(--neu-text-disabled)}.neu-input__wrapper--no-float.neu-input__wrapper--has-start-icon .neu-input__field{padding-left:40px}.neu-input__wrapper--no-float.neu-input__wrapper--has-end-icon .neu-input__field{padding-right:40px}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
204
|
+
`, isInline: true, styles: [".neu-input-host{display:block}.neu-input-host--sm .neu-input__wrapper{height:36px}.neu-input-host--sm .neu-input__field{font-size:var(--neu-text-sm)}.neu-input-host--lg .neu-input__wrapper{height:56px}.neu-input__wrapper{position:relative;display:flex;align-items:center;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);height:48px;transition:border-color var(--neu-transition),box-shadow var(--neu-transition),background-color var(--neu-transition)}.neu-input__wrapper:hover:not(.neu-input__wrapper--disabled){border-color:var(--neu-border-hover)}.neu-input__wrapper--focused{border-color:var(--neu-primary);box-shadow:var(--neu-focus-ring)}.neu-input__wrapper--error{border-color:var(--neu-error)}.neu-input__wrapper--error.neu-input__wrapper--focused{box-shadow:0 0 0 3px #ef44441f}.neu-input__wrapper--disabled{background:var(--neu-surface-2);cursor:not-allowed}.neu-input__wrapper--has-start-icon .neu-input__field{padding-left:40px}.neu-input__wrapper--has-end-icon .neu-input__field{padding-right:40px}.neu-input__field{width:100%;height:100%;padding:0 var(--neu-space-3);border:none;background:transparent;outline:none;font-family:var(--neu-font-sans);font-size:var(--neu-text-base);color:var(--neu-text);caret-color:var(--neu-primary)}.neu-input__field:disabled{cursor:not-allowed;color:var(--neu-text-disabled)}.neu-input__field::placeholder{color:transparent;transition:color var(--neu-transition)}.neu-input__wrapper--focused .neu-input__field::placeholder{color:var(--neu-text-disabled)}.neu-input__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:var(--neu-text-muted);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6));transition:top var(--neu-transition),font-size var(--neu-transition),color var(--neu-transition),transform var(--neu-transition),padding var(--neu-transition),background var(--neu-transition)}.neu-input__wrapper--focused .neu-input__label,.neu-input__wrapper--has-value .neu-input__label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface);padding:0 4px;left:calc(var(--neu-space-3) - 4px)}.neu-input__wrapper--focused .neu-input__label{color:var(--neu-primary)}.neu-input__wrapper--error .neu-input__label{color:var(--neu-error)}.neu-input__wrapper--disabled .neu-input__label{background:var(--neu-surface-2)}.neu-input__wrapper--has-start-icon .neu-input__label{left:40px}.neu-input__wrapper--has-start-icon .neu-input__label.neu-input__wrapper--focused,.neu-input__wrapper--focused .neu-input__wrapper--has-start-icon .neu-input__label,.neu-input__wrapper--has-value .neu-input__wrapper--has-start-icon .neu-input__label{left:calc(var(--neu-space-3) - 4px)}.neu-input__icon{position:absolute;display:flex;align-items:center;justify-content:center;width:36px;height:36px;color:var(--neu-text-muted);pointer-events:none;flex-shrink:0}.neu-input__icon svg{width:18px;height:18px}.neu-input__icon--start{left:0}.neu-input__icon--end{right:0}.neu-input__error{display:flex;align-items:center;gap:4px;margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text);font-family:var(--neu-font-sans);line-height:1.4}.neu-input__hint{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-text-muted);font-family:var(--neu-font-sans)}.neu-input__static-label{display:block;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);margin-bottom:var(--neu-space-2)}.neu-input__wrapper--no-float .neu-input__field{padding:0 var(--neu-space-3)}.neu-input__wrapper--no-float .neu-input__field::placeholder{color:var(--neu-text-disabled)}.neu-input__wrapper--no-float.neu-input__wrapper--has-start-icon .neu-input__field{padding-left:40px}.neu-input__wrapper--no-float.neu-input__wrapper--has-end-icon .neu-input__field{padding-right:40px}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "decorative", "ariaLabel", "strokeWidth", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
205
205
|
}
|
|
206
206
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuInputComponent, decorators: [{
|
|
207
207
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-input.mjs","sources":["../../../../projects/ui-core/input/neu-input.component.ts","../../../../projects/ui-core/input/neural-ui-core-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\n/** Contador global para IDs estables — seguro en SSR, predecible en hidratación / Global counter for stable IDs — SSR-safe, predictable on hydration */\nlet _neuInputIdSeq = 0;\n\nexport type NeuInputType = 'text' | 'email' | 'password' | 'tel' | 'url' | 'search';\n\n/**\n * NeuralUI Input Component\n *\n * Input con floating label, iconos y soporte completo para Angular Forms.\n * Compatible con Reactive Forms mediante FormControl y formularios reactivos.\n *\n * Uso standalone:\n * <neu-input label=\"Correo\" type=\"email\" />\n *\n * Con Reactive Forms:\n * <neu-input label=\"Correo\" [formControl]=\"emailCtrl\" [errorMessage]=\"emailError()\" />\n */\n@Component({\n selector: 'neu-input',\n imports: [NeuIconComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Los atributos del host (class, style, data-*) no deben llegar al <input> nativo\n // — se gestionan de forma explícita con los inputs del componente.\n host: {\n class: 'neu-input-host',\n '[class.neu-input-host--sm]': 'size() === \"sm\"',\n '[class.neu-input-host--lg]': 'size() === \"lg\"',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuInputComponent),\n multi: true,\n },\n ],\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-input__static-label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n <div\n class=\"neu-input__wrapper\"\n [class.neu-input__wrapper--focused]=\"_focused()\"\n [class.neu-input__wrapper--has-value]=\"hasValue()\"\n [class.neu-input__wrapper--error]=\"hasError()\"\n [class.neu-input__wrapper--disabled]=\"isDisabledFinal()\"\n [class.neu-input__wrapper--has-start-icon]=\"!!startIcon() || _hasIconLeft()\"\n [class.neu-input__wrapper--has-end-icon]=\"!!endIcon() || _hasIconRight()\"\n [class.neu-input__wrapper--no-float]=\"!floatingLabel()\"\n >\n <!-- Icono izquierdo (proyección) -->\n @if (startIcon()) {\n <span class=\"neu-input__icon neu-input__icon--start\" aria-hidden=\"true\">\n <ng-content select=\"[neu-input-start]\" />\n @if (!hasStartContent()) {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [innerHTML]=\"startIconPath()\"\n ></svg>\n }\n </span>\n }\n\n <!-- Icono izquierdo (por nombre) -->\n @if (_hasIconLeft()) {\n <span class=\"neu-input__icon neu-input__icon--start\" aria-hidden=\"true\">\n <neu-icon [name]=\"icon()\" size=\"16px\" />\n </span>\n }\n\n <!-- Campo nativo -->\n <input\n class=\"neu-input__field\"\n [id]=\"inputId()\"\n [type]=\"type()\"\n [disabled]=\"isDisabledFinal()\"\n [attr.name]=\"name() || null\"\n [attr.required]=\"required() ? '' : null\"\n [attr.readonly]=\"readonly() ? '' : null\"\n [attr.maxlength]=\"maxlength() ?? null\"\n [attr.minlength]=\"minlength() ?? null\"\n [attr.min]=\"min() ?? null\"\n [attr.max]=\"max() ?? null\"\n [attr.pattern]=\"pattern() ?? null\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"\n hasError() ? inputId() + '-error' : hint() ? inputId() + '-hint' : null\n \"\n [value]=\"_value()\"\n [attr.placeholder]=\"floatingLabel() ? ' ' : placeholder() || null\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Floating Label -->\n @if (floatingLabel() && label()) {\n <label class=\"neu-input__label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n\n <!-- Icono derecho (proyección) -->\n @if (endIcon()) {\n <span class=\"neu-input__icon neu-input__icon--end\" aria-hidden=\"true\">\n <ng-content select=\"[neu-input-end]\" />\n </span>\n }\n\n <!-- Icono derecho (por nombre) -->\n @if (_hasIconRight()) {\n <span class=\"neu-input__icon neu-input__icon--end\" aria-hidden=\"true\">\n <neu-icon [name]=\"icon()\" size=\"16px\" />\n </span>\n }\n </div>\n\n <!-- Mensajes de ayuda / error -->\n @if (hasError()) {\n <p class=\"neu-input__error\" [id]=\"inputId() + '-error'\" role=\"alert\">\n <neu-icon name=\"lucideAlertCircle\" size=\"13px\" aria-hidden=\"true\" />\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-input__hint\" [id]=\"inputId() + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-input.component.scss',\n})\nexport class NeuInputComponent implements ControlValueAccessor {\n /** Tipo de input HTML / HTML input type */\n type = input<NeuInputType>('text');\n\n /** Texto del floating label / Floating label text */\n label = input<string>('');\n\n /** Placeholder visible cuando floatingLabel=false / Visible placeholder when floatingLabel=false */\n placeholder = input<string>('');\n\n /** Muestra el label como flotante (true) o estático encima del campo (false) / Shows the label as floating (true) or static above the field (false) */\n floatingLabel = input<boolean>(true);\n\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n /** Hint de ayuda (visible cuando no hay error) / Help hint (visible when there is no error) */\n hint = input<string>('');\n\n /** Mensaje de error (activa el estado de error) / Error message (activates the error state) */\n errorMessage = input<string>('');\n\n /** Deshabilita el campo / Disables the field */\n disabled = input<boolean>(false);\n\n /** Atributo autocomplete HTML / HTML autocomplete attribute */\n autocomplete = input<string>('off');\n\n /** Muestra zona para icono al inicio / Shows icon slot at the start */\n startIcon = input<boolean>(false);\n\n /** Muestra zona para icono al final / Shows icon slot at the end */\n endIcon = input<boolean>(false);\n\n /** Nombre del icono lucide a renderizar dentro del campo / Lucide icon name to render inside the field */\n icon = input<string>('');\n\n /** Posición del icono cuando se usa `icon` / Icon position when using `icon` */\n iconPosition = input<'left' | 'right'>('left');\n\n /** ID accesible para el input — generado con contador estable (seguro en SSR) / Accessible ID for the input — generated with stable counter (SSR-safe) */\n inputId = input<string>(`neu-input-${++_neuInputIdSeq}`);\n\n /** Nombre del campo para formularios nativos / Field name for native forms */\n name = input<string>('');\n\n /** Marca el campo como requerido / Marks the field as required */\n required = input<boolean>(false);\n\n /** Hace el campo de solo lectura / Makes the field read-only */\n readonly = input<boolean>(false);\n\n /** Longitud máxima de caracteres / Maximum character length */\n maxlength = input<number | null>(null);\n\n /** Longitud mínima de caracteres / Minimum character length */\n minlength = input<number | null>(null);\n\n /** Valor mínimo (para type=number/date) / Minimum value (for type=number/date) */\n min = input<string | null>(null);\n\n /** Valor máximo (para type=number/date) / Maximum value (for type=number/date) */\n max = input<string | null>(null);\n\n /** Patrón de validación HTML5 / HTML5 validation pattern */\n pattern = input<string | null>(null);\n\n // --- Estado interno reactivo ---\n protected readonly _value = signal('');\n protected readonly _focused = signal(false);\n\n readonly hasValue = computed(() => this._value().length > 0);\n readonly hasError = computed(() => !!this.errorMessage());\n readonly startIconPath = computed(() => '');\n readonly hasStartContent = computed(() => false);\n readonly _hasIconLeft = computed(() => !!this.icon() && this.iconPosition() === 'left');\n readonly _hasIconRight = computed(() => !!this.icon() && this.iconPosition() === 'right');\n\n // --- ControlValueAccessor ---\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: unknown): void {\n this._value.set(val == null ? '' : String(val));\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n onInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this._value.set(value);\n this._onChange(value);\n }\n\n onFocus(): void {\n this._focused.set(true);\n }\n\n onBlur(): void {\n this._focused.set(false);\n this._onTouched();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"neural-ui-core-input.mjs","sources":["../../../../projects/ui-core/input/neu-input.component.ts","../../../../projects/ui-core/input/neural-ui-core-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\n/** Contador global para IDs estables — seguro en SSR, predecible en hidratación / Global counter for stable IDs — SSR-safe, predictable on hydration */\nlet _neuInputIdSeq = 0;\n\nexport type NeuInputType = 'text' | 'email' | 'password' | 'tel' | 'url' | 'search';\n\n/**\n * NeuralUI Input Component\n *\n * Input con floating label, iconos y soporte completo para Angular Forms.\n * Compatible con Reactive Forms mediante FormControl y formularios reactivos.\n *\n * Uso standalone:\n * <neu-input label=\"Correo\" type=\"email\" />\n *\n * Con Reactive Forms:\n * <neu-input label=\"Correo\" [formControl]=\"emailCtrl\" [errorMessage]=\"emailError()\" />\n */\n@Component({\n selector: 'neu-input',\n imports: [NeuIconComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Los atributos del host (class, style, data-*) no deben llegar al <input> nativo\n // — se gestionan de forma explícita con los inputs del componente.\n host: {\n class: 'neu-input-host',\n '[class.neu-input-host--sm]': 'size() === \"sm\"',\n '[class.neu-input-host--lg]': 'size() === \"lg\"',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuInputComponent),\n multi: true,\n },\n ],\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-input__static-label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n <div\n class=\"neu-input__wrapper\"\n [class.neu-input__wrapper--focused]=\"_focused()\"\n [class.neu-input__wrapper--has-value]=\"hasValue()\"\n [class.neu-input__wrapper--error]=\"hasError()\"\n [class.neu-input__wrapper--disabled]=\"isDisabledFinal()\"\n [class.neu-input__wrapper--has-start-icon]=\"!!startIcon() || _hasIconLeft()\"\n [class.neu-input__wrapper--has-end-icon]=\"!!endIcon() || _hasIconRight()\"\n [class.neu-input__wrapper--no-float]=\"!floatingLabel()\"\n >\n <!-- Icono izquierdo (proyección) -->\n @if (startIcon()) {\n <span class=\"neu-input__icon neu-input__icon--start\" aria-hidden=\"true\">\n <ng-content select=\"[neu-input-start]\" />\n @if (!hasStartContent()) {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [innerHTML]=\"startIconPath()\"\n ></svg>\n }\n </span>\n }\n\n <!-- Icono izquierdo (por nombre) -->\n @if (_hasIconLeft()) {\n <span class=\"neu-input__icon neu-input__icon--start\" aria-hidden=\"true\">\n <neu-icon [name]=\"icon()\" size=\"16px\" />\n </span>\n }\n\n <!-- Campo nativo -->\n <input\n class=\"neu-input__field\"\n [id]=\"inputId()\"\n [type]=\"type()\"\n [disabled]=\"isDisabledFinal()\"\n [attr.name]=\"name() || null\"\n [attr.required]=\"required() ? '' : null\"\n [attr.readonly]=\"readonly() ? '' : null\"\n [attr.maxlength]=\"maxlength() ?? null\"\n [attr.minlength]=\"minlength() ?? null\"\n [attr.min]=\"min() ?? null\"\n [attr.max]=\"max() ?? null\"\n [attr.pattern]=\"pattern() ?? null\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"\n hasError() ? inputId() + '-error' : hint() ? inputId() + '-hint' : null\n \"\n [value]=\"_value()\"\n [attr.placeholder]=\"floatingLabel() ? ' ' : placeholder() || null\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Floating Label -->\n @if (floatingLabel() && label()) {\n <label class=\"neu-input__label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n\n <!-- Icono derecho (proyección) -->\n @if (endIcon()) {\n <span class=\"neu-input__icon neu-input__icon--end\" aria-hidden=\"true\">\n <ng-content select=\"[neu-input-end]\" />\n </span>\n }\n\n <!-- Icono derecho (por nombre) -->\n @if (_hasIconRight()) {\n <span class=\"neu-input__icon neu-input__icon--end\" aria-hidden=\"true\">\n <neu-icon [name]=\"icon()\" size=\"16px\" />\n </span>\n }\n </div>\n\n <!-- Mensajes de ayuda / error -->\n @if (hasError()) {\n <p class=\"neu-input__error\" [id]=\"inputId() + '-error'\" role=\"alert\">\n <neu-icon name=\"lucideAlertCircle\" size=\"13px\" aria-hidden=\"true\" />\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-input__hint\" [id]=\"inputId() + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-input.component.scss',\n})\nexport class NeuInputComponent implements ControlValueAccessor {\n /** Tipo de input HTML / HTML input type */\n type = input<NeuInputType>('text');\n\n /** Texto del floating label / Floating label text */\n label = input<string>('');\n\n /** Placeholder visible cuando floatingLabel=false / Visible placeholder when floatingLabel=false */\n placeholder = input<string>('');\n\n /** Muestra el label como flotante (true) o estático encima del campo (false) / Shows the label as floating (true) or static above the field (false) */\n floatingLabel = input<boolean>(true);\n\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n /** Hint de ayuda (visible cuando no hay error) / Help hint (visible when there is no error) */\n hint = input<string>('');\n\n /** Mensaje de error (activa el estado de error) / Error message (activates the error state) */\n errorMessage = input<string>('');\n\n /** Deshabilita el campo / Disables the field */\n disabled = input<boolean>(false);\n\n /** Atributo autocomplete HTML / HTML autocomplete attribute */\n autocomplete = input<string>('off');\n\n /** Muestra zona para icono al inicio / Shows icon slot at the start */\n startIcon = input<boolean>(false);\n\n /** Muestra zona para icono al final / Shows icon slot at the end */\n endIcon = input<boolean>(false);\n\n /** Nombre del icono lucide a renderizar dentro del campo / Lucide icon name to render inside the field */\n icon = input<string>('');\n\n /** Posición del icono cuando se usa `icon` / Icon position when using `icon` */\n iconPosition = input<'left' | 'right'>('left');\n\n /** ID accesible para el input — generado con contador estable (seguro en SSR) / Accessible ID for the input — generated with stable counter (SSR-safe) */\n inputId = input<string>(`neu-input-${++_neuInputIdSeq}`);\n\n /** Nombre del campo para formularios nativos / Field name for native forms */\n name = input<string>('');\n\n /** Marca el campo como requerido / Marks the field as required */\n required = input<boolean>(false);\n\n /** Hace el campo de solo lectura / Makes the field read-only */\n readonly = input<boolean>(false);\n\n /** Longitud máxima de caracteres / Maximum character length */\n maxlength = input<number | null>(null);\n\n /** Longitud mínima de caracteres / Minimum character length */\n minlength = input<number | null>(null);\n\n /** Valor mínimo (para type=number/date) / Minimum value (for type=number/date) */\n min = input<string | null>(null);\n\n /** Valor máximo (para type=number/date) / Maximum value (for type=number/date) */\n max = input<string | null>(null);\n\n /** Patrón de validación HTML5 / HTML5 validation pattern */\n pattern = input<string | null>(null);\n\n // --- Estado interno reactivo ---\n protected readonly _value = signal('');\n protected readonly _focused = signal(false);\n\n readonly hasValue = computed(() => this._value().length > 0);\n readonly hasError = computed(() => !!this.errorMessage());\n readonly startIconPath = computed(() => '');\n readonly hasStartContent = computed(() => false);\n readonly _hasIconLeft = computed(() => !!this.icon() && this.iconPosition() === 'left');\n readonly _hasIconRight = computed(() => !!this.icon() && this.iconPosition() === 'right');\n\n // --- ControlValueAccessor ---\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: unknown): void {\n this._value.set(val == null ? '' : String(val));\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n onInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this._value.set(value);\n this._onChange(value);\n }\n\n onFocus(): void {\n this._focused.set(true);\n }\n\n onBlur(): void {\n this._focused.set(false);\n this._onTouched();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|