@neural-ui/core 1.7.5 → 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-card.mjs +2 -2
- package/fesm2022/neural-ui-core-card.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-mask.mjs +2 -2
- package/fesm2022/neural-ui-core-input-mask.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-password.mjs +42 -6
- package/fesm2022/neural-ui-core-password.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
|
@@ -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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"}
|
|
@@ -15,6 +15,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
15
15
|
type: Directive,
|
|
16
16
|
args: [{ selector: 'ng-template[neuListboxItem]' }]
|
|
17
17
|
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
18
|
+
class NeuListboxHeaderDirective {
|
|
19
|
+
templateRef;
|
|
20
|
+
constructor(templateRef) {
|
|
21
|
+
this.templateRef = templateRef;
|
|
22
|
+
}
|
|
23
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuListboxHeaderDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
24
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuListboxHeaderDirective, isStandalone: true, selector: "ng-template[neuListboxHeader]", ngImport: i0 });
|
|
25
|
+
}
|
|
26
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuListboxHeaderDirective, decorators: [{
|
|
27
|
+
type: Directive,
|
|
28
|
+
args: [{ selector: 'ng-template[neuListboxHeader]' }]
|
|
29
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
30
|
+
class NeuListboxFooterDirective {
|
|
31
|
+
templateRef;
|
|
32
|
+
constructor(templateRef) {
|
|
33
|
+
this.templateRef = templateRef;
|
|
34
|
+
}
|
|
35
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuListboxFooterDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
36
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuListboxFooterDirective, isStandalone: true, selector: "ng-template[neuListboxFooter]", ngImport: i0 });
|
|
37
|
+
}
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuListboxFooterDirective, decorators: [{
|
|
39
|
+
type: Directive,
|
|
40
|
+
args: [{ selector: 'ng-template[neuListboxFooter]' }]
|
|
41
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
42
|
+
class NeuListboxEmptyDirective {
|
|
43
|
+
templateRef;
|
|
44
|
+
constructor(templateRef) {
|
|
45
|
+
this.templateRef = templateRef;
|
|
46
|
+
}
|
|
47
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuListboxEmptyDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
48
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuListboxEmptyDirective, isStandalone: true, selector: "ng-template[neuListboxEmpty]", ngImport: i0 });
|
|
49
|
+
}
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuListboxEmptyDirective, decorators: [{
|
|
51
|
+
type: Directive,
|
|
52
|
+
args: [{ selector: 'ng-template[neuListboxEmpty]' }]
|
|
53
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
18
54
|
class NeuListboxComponent {
|
|
19
55
|
options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
20
56
|
label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
@@ -27,6 +63,9 @@ class NeuListboxComponent {
|
|
|
27
63
|
disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
28
64
|
selectionChange = output();
|
|
29
65
|
itemTpl = contentChild(NeuListboxItemDirective, ...(ngDevMode ? [{ debugName: "itemTpl" }] : /* istanbul ignore next */ []));
|
|
66
|
+
headerTpl = contentChild(NeuListboxHeaderDirective, ...(ngDevMode ? [{ debugName: "headerTpl" }] : /* istanbul ignore next */ []));
|
|
67
|
+
footerTpl = contentChild(NeuListboxFooterDirective, ...(ngDevMode ? [{ debugName: "footerTpl" }] : /* istanbul ignore next */ []));
|
|
68
|
+
emptyTpl = contentChild(NeuListboxEmptyDirective, ...(ngDevMode ? [{ debugName: "emptyTpl" }] : /* istanbul ignore next */ []));
|
|
30
69
|
query = signal('', ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
|
|
31
70
|
activeIndex = signal(0, ...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
|
|
32
71
|
values = signal([], ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
|
|
@@ -93,7 +132,7 @@ class NeuListboxComponent {
|
|
|
93
132
|
useExisting: forwardRef(() => NeuListboxComponent),
|
|
94
133
|
multi: true,
|
|
95
134
|
},
|
|
96
|
-
], queries: [{ propertyName: "itemTpl", first: true, predicate: NeuListboxItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
135
|
+
], queries: [{ propertyName: "itemTpl", first: true, predicate: NeuListboxItemDirective, descendants: true, isSignal: true }, { propertyName: "headerTpl", first: true, predicate: NeuListboxHeaderDirective, descendants: true, isSignal: true }, { propertyName: "footerTpl", first: true, predicate: NeuListboxFooterDirective, descendants: true, isSignal: true }, { propertyName: "emptyTpl", first: true, predicate: NeuListboxEmptyDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
97
136
|
@if (label()) {
|
|
98
137
|
<div class="neu-listbox__label" [id]="labelId">{{ label() }}</div>
|
|
99
138
|
}
|
|
@@ -116,6 +155,7 @@ class NeuListboxComponent {
|
|
|
116
155
|
tabindex="0"
|
|
117
156
|
(keydown)="onKeyDown($event)"
|
|
118
157
|
>
|
|
158
|
+
@if (headerTpl()) { <ng-container [ngTemplateOutlet]="headerTpl()!.templateRef" /> }
|
|
119
159
|
@for (option of filteredOptions(); track option.value; let i = $index) {
|
|
120
160
|
<button
|
|
121
161
|
type="button"
|
|
@@ -138,8 +178,10 @@ class NeuListboxComponent {
|
|
|
138
178
|
</button>
|
|
139
179
|
}
|
|
140
180
|
@if (!filteredOptions().length) {
|
|
141
|
-
<
|
|
181
|
+
@if (emptyTpl()) { <ng-container [ngTemplateOutlet]="emptyTpl()!.templateRef" /> }
|
|
182
|
+
@else { <div class="neu-listbox__empty">{{ emptyLabel() }}</div> }
|
|
142
183
|
}
|
|
184
|
+
@if (footerTpl()) { <ng-container [ngTemplateOutlet]="footerTpl()!.templateRef" /> }
|
|
143
185
|
</div>
|
|
144
186
|
@if (hint()) {
|
|
145
187
|
<p class="neu-listbox__hint">{{ hint() }}</p>
|
|
@@ -180,6 +222,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
180
222
|
tabindex="0"
|
|
181
223
|
(keydown)="onKeyDown($event)"
|
|
182
224
|
>
|
|
225
|
+
@if (headerTpl()) { <ng-container [ngTemplateOutlet]="headerTpl()!.templateRef" /> }
|
|
183
226
|
@for (option of filteredOptions(); track option.value; let i = $index) {
|
|
184
227
|
<button
|
|
185
228
|
type="button"
|
|
@@ -202,18 +245,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
202
245
|
</button>
|
|
203
246
|
}
|
|
204
247
|
@if (!filteredOptions().length) {
|
|
205
|
-
<
|
|
248
|
+
@if (emptyTpl()) { <ng-container [ngTemplateOutlet]="emptyTpl()!.templateRef" /> }
|
|
249
|
+
@else { <div class="neu-listbox__empty">{{ emptyLabel() }}</div> }
|
|
206
250
|
}
|
|
251
|
+
@if (footerTpl()) { <ng-container [ngTemplateOutlet]="footerTpl()!.templateRef" /> }
|
|
207
252
|
</div>
|
|
208
253
|
@if (hint()) {
|
|
209
254
|
<p class="neu-listbox__hint">{{ hint() }}</p>
|
|
210
255
|
}
|
|
211
256
|
`, styles: [".neu-listbox{display:block}.neu-listbox__label{margin-bottom:.375rem;font-size:.875rem;font-weight:600;color:var(--neu-text, #111827)}.neu-listbox__search{width:100%;min-height:2.25rem;margin-bottom:.5rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.5rem;background:var(--neu-surface, #fff);color:var(--neu-text, #111827);padding:0 .75rem}.neu-listbox__options{display:grid;gap:.25rem;max-height:18rem;overflow:auto;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;padding:.375rem;background:var(--neu-surface, #fff)}.neu-listbox__option{border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.625rem .75rem;text-align:left;cursor:pointer}.neu-listbox__option--active{outline:2px solid var(--neu-primary, #2563eb);outline-offset:1px}.neu-listbox__option--selected{background:color-mix(in srgb,var(--neu-primary, #2563eb) 14%,transparent)}.neu-listbox__empty,.neu-listbox__hint{color:var(--neu-text-muted, #6b7280);font-size:.875rem}\n"] }]
|
|
212
|
-
}], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], emptyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyLabel", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuListboxItemDirective), { isSignal: true }] }] } });
|
|
257
|
+
}], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], emptyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyLabel", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuListboxItemDirective), { isSignal: true }] }], headerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuListboxHeaderDirective), { isSignal: true }] }], footerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuListboxFooterDirective), { isSignal: true }] }], emptyTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuListboxEmptyDirective), { isSignal: true }] }] } });
|
|
213
258
|
|
|
214
259
|
/**
|
|
215
260
|
* Generated bundle index. Do not edit.
|
|
216
261
|
*/
|
|
217
262
|
|
|
218
|
-
export { NeuListboxComponent, NeuListboxItemDirective };
|
|
263
|
+
export { NeuListboxComponent, NeuListboxEmptyDirective, NeuListboxFooterDirective, NeuListboxHeaderDirective, NeuListboxItemDirective };
|
|
219
264
|
//# sourceMappingURL=neural-ui-core-listbox.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-listbox.mjs","sources":["../../../../projects/ui-core/listbox/neu-listbox.component.ts","../../../../projects/ui-core/listbox/neural-ui-core-listbox.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n ViewEncapsulation,\n computed,\n contentChild,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface NeuListboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n data?: unknown;\n}\n\n@Directive({ selector: 'ng-template[neuListboxItem]' })\nexport class NeuListboxItemDirective {\n constructor(readonly templateRef: TemplateRef<{ $implicit: NeuListboxOption }>) {}\n}\n\n@Component({\n selector: 'neu-listbox',\n imports: [NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuListboxComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-listbox',\n '[class.neu-listbox--disabled]': 'isDisabled()',\n },\n template: `\n @if (label()) {\n <div class=\"neu-listbox__label\" [id]=\"labelId\">{{ label() }}</div>\n }\n @if (searchable()) {\n <input\n class=\"neu-listbox__search\"\n type=\"search\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"query()\"\n [disabled]=\"isDisabled()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n }\n <div\n class=\"neu-listbox__options\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"label() ? labelId : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel()\"\n [attr.aria-multiselectable]=\"multiple()\"\n tabindex=\"0\"\n (keydown)=\"onKeyDown($event)\"\n >\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <button\n type=\"button\"\n class=\"neu-listbox__option\"\n role=\"option\"\n [class.neu-listbox__option--active]=\"activeIndex() === i\"\n [class.neu-listbox__option--selected]=\"isSelected(option.value)\"\n [disabled]=\"isDisabled() || option.disabled\"\n [attr.aria-selected]=\"isSelected(option.value)\"\n (click)=\"toggleOption(option)\"\n >\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </button>\n }\n @if (!filteredOptions().length) {\n <div class=\"neu-listbox__empty\">{{ emptyLabel() }}</div>\n }\n </div>\n @if (hint()) {\n <p class=\"neu-listbox__hint\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-listbox.component.scss',\n})\nexport class NeuListboxComponent implements ControlValueAccessor {\n readonly options = input<NeuListboxOption[]>([]);\n readonly label = input('');\n readonly ariaLabel = input('Options');\n readonly hint = input('');\n readonly emptyLabel = input('No options found');\n readonly multiple = input(false);\n readonly searchable = input(false);\n readonly searchPlaceholder = input('Search...');\n readonly disabled = input(false);\n\n readonly selectionChange = output<NeuListboxOption[]>();\n readonly itemTpl = contentChild(NeuListboxItemDirective);\n\n readonly query = signal('');\n readonly activeIndex = signal(0);\n readonly values = signal<string[]>([]);\n readonly cvaDisabled = signal(false);\n readonly labelId = `neu-listbox-label-${Math.random().toString(36).slice(2)}`;\n\n readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n readonly filteredOptions = computed(() => {\n const q = this.query().trim().toLowerCase();\n return q ? this.options().filter((option) => option.label.toLowerCase().includes(q)) : this.options();\n });\n\n private onChange: (value: string | string[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: string | string[] | null): void {\n this.values.set(Array.isArray(value) ? value : value ? [value] : []);\n }\n\n registerOnChange(fn: (value: string | string[] | 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 }\n\n isSelected(value: string): boolean {\n return this.values().includes(value);\n }\n\n toggleOption(option: NeuListboxOption): void {\n if (option.disabled || this.isDisabled()) {\n return;\n }\n const next = this.multiple()\n ? this.isSelected(option.value)\n ? this.values().filter((value) => value !== option.value)\n : [...this.values(), option.value]\n : [option.value];\n this.values.set(next);\n this.onTouched();\n this.onChange(this.multiple() ? next : (next[0] ?? null));\n this.selectionChange.emit(this.options().filter((item) => next.includes(item.value)));\n }\n\n onKeyDown(event: KeyboardEvent): void {\n const enabled = this.filteredOptions().filter((option) => !option.disabled);\n if (!enabled.length) {\n return;\n }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n const step = event.key === 'ArrowDown' ? 1 : -1;\n this.activeIndex.set(\n Math.max(0, Math.min(this.filteredOptions().length - 1, this.activeIndex() + step)),\n );\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const option = this.filteredOptions()[this.activeIndex()];\n if (option) {\n this.toggleOption(option);\n }\n }\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-listbox.mjs","sources":["../../../../projects/ui-core/listbox/neu-listbox.component.ts","../../../../projects/ui-core/listbox/neural-ui-core-listbox.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n ViewEncapsulation,\n computed,\n contentChild,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface NeuListboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n data?: unknown;\n}\n\n@Directive({ selector: 'ng-template[neuListboxItem]' })\nexport class NeuListboxItemDirective {\n constructor(readonly templateRef: TemplateRef<{ $implicit: NeuListboxOption }>) {}\n}\n@Directive({ selector: 'ng-template[neuListboxHeader]' })\nexport class NeuListboxHeaderDirective { constructor(readonly templateRef: TemplateRef<void>) {} }\n@Directive({ selector: 'ng-template[neuListboxFooter]' })\nexport class NeuListboxFooterDirective { constructor(readonly templateRef: TemplateRef<void>) {} }\n@Directive({ selector: 'ng-template[neuListboxEmpty]' })\nexport class NeuListboxEmptyDirective { constructor(readonly templateRef: TemplateRef<void>) {} }\n\n@Component({\n selector: 'neu-listbox',\n imports: [NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuListboxComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-listbox',\n '[class.neu-listbox--disabled]': 'isDisabled()',\n },\n template: `\n @if (label()) {\n <div class=\"neu-listbox__label\" [id]=\"labelId\">{{ label() }}</div>\n }\n @if (searchable()) {\n <input\n class=\"neu-listbox__search\"\n type=\"search\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"query()\"\n [disabled]=\"isDisabled()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n }\n <div\n class=\"neu-listbox__options\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"label() ? labelId : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel()\"\n [attr.aria-multiselectable]=\"multiple()\"\n tabindex=\"0\"\n (keydown)=\"onKeyDown($event)\"\n >\n @if (headerTpl()) { <ng-container [ngTemplateOutlet]=\"headerTpl()!.templateRef\" /> }\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <button\n type=\"button\"\n class=\"neu-listbox__option\"\n role=\"option\"\n [class.neu-listbox__option--active]=\"activeIndex() === i\"\n [class.neu-listbox__option--selected]=\"isSelected(option.value)\"\n [disabled]=\"isDisabled() || option.disabled\"\n [attr.aria-selected]=\"isSelected(option.value)\"\n (click)=\"toggleOption(option)\"\n >\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </button>\n }\n @if (!filteredOptions().length) {\n @if (emptyTpl()) { <ng-container [ngTemplateOutlet]=\"emptyTpl()!.templateRef\" /> }\n @else { <div class=\"neu-listbox__empty\">{{ emptyLabel() }}</div> }\n }\n @if (footerTpl()) { <ng-container [ngTemplateOutlet]=\"footerTpl()!.templateRef\" /> }\n </div>\n @if (hint()) {\n <p class=\"neu-listbox__hint\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-listbox.component.scss',\n})\nexport class NeuListboxComponent implements ControlValueAccessor {\n readonly options = input<NeuListboxOption[]>([]);\n readonly label = input('');\n readonly ariaLabel = input('Options');\n readonly hint = input('');\n readonly emptyLabel = input('No options found');\n readonly multiple = input(false);\n readonly searchable = input(false);\n readonly searchPlaceholder = input('Search...');\n readonly disabled = input(false);\n\n readonly selectionChange = output<NeuListboxOption[]>();\n readonly itemTpl = contentChild(NeuListboxItemDirective);\n readonly headerTpl = contentChild(NeuListboxHeaderDirective);\n readonly footerTpl = contentChild(NeuListboxFooterDirective);\n readonly emptyTpl = contentChild(NeuListboxEmptyDirective);\n\n readonly query = signal('');\n readonly activeIndex = signal(0);\n readonly values = signal<string[]>([]);\n readonly cvaDisabled = signal(false);\n readonly labelId = `neu-listbox-label-${Math.random().toString(36).slice(2)}`;\n\n readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n readonly filteredOptions = computed(() => {\n const q = this.query().trim().toLowerCase();\n return q ? this.options().filter((option) => option.label.toLowerCase().includes(q)) : this.options();\n });\n\n private onChange: (value: string | string[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: string | string[] | null): void {\n this.values.set(Array.isArray(value) ? value : value ? [value] : []);\n }\n\n registerOnChange(fn: (value: string | string[] | 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 }\n\n isSelected(value: string): boolean {\n return this.values().includes(value);\n }\n\n toggleOption(option: NeuListboxOption): void {\n if (option.disabled || this.isDisabled()) {\n return;\n }\n const next = this.multiple()\n ? this.isSelected(option.value)\n ? this.values().filter((value) => value !== option.value)\n : [...this.values(), option.value]\n : [option.value];\n this.values.set(next);\n this.onTouched();\n this.onChange(this.multiple() ? next : (next[0] ?? null));\n this.selectionChange.emit(this.options().filter((item) => next.includes(item.value)));\n }\n\n onKeyDown(event: KeyboardEvent): void {\n const enabled = this.filteredOptions().filter((option) => !option.disabled);\n if (!enabled.length) {\n return;\n }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n const step = event.key === 'ArrowDown' ? 1 : -1;\n this.activeIndex.set(\n Math.max(0, Math.min(this.filteredOptions().length - 1, this.activeIndex() + step)),\n );\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const option = this.filteredOptions()[this.activeIndex()];\n if (option) {\n this.toggleOption(option);\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,28 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, output, ChangeDetectionStrategy, ViewEncapsulation, Component, signal } from '@angular/core';
|
|
2
|
+
import { Directive, contentChild, input, computed, output, ChangeDetectionStrategy, ViewEncapsulation, Component, signal } from '@angular/core';
|
|
3
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
3
4
|
import * as i1 from '@angular/cdk/overlay';
|
|
4
5
|
import { OverlayModule } from '@angular/cdk/overlay';
|
|
5
6
|
import { NeuButtonComponent } from '@neural-ui/core/button';
|
|
6
7
|
import { NeuIconComponent } from '@neural-ui/core/icon';
|
|
7
8
|
|
|
9
|
+
/** Custom visual content for each menu item; menu semantics remain owned by the component. */
|
|
10
|
+
class NeuMenuItemDirective {
|
|
11
|
+
templateRef;
|
|
12
|
+
constructor(templateRef) {
|
|
13
|
+
this.templateRef = templateRef;
|
|
14
|
+
}
|
|
15
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMenuItemDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
16
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuMenuItemDirective, isStandalone: true, selector: "ng-template[neuMenuItem]", ngImport: i0 });
|
|
17
|
+
}
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMenuItemDirective, decorators: [{
|
|
19
|
+
type: Directive,
|
|
20
|
+
args: [{ selector: 'ng-template[neuMenuItem]' }]
|
|
21
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
8
22
|
class NeuMenuComponent {
|
|
23
|
+
itemTpl = contentChild(NeuMenuItemDirective, ...(ngDevMode ? [{ debugName: "itemTpl" }] : /* istanbul ignore next */ []));
|
|
24
|
+
itemTemplate = input(null, ...(ngDevMode ? [{ debugName: "itemTemplate" }] : /* istanbul ignore next */ []));
|
|
25
|
+
itemTemplateRef = computed(() => this.itemTemplate() ?? this.itemTpl()?.templateRef ?? null, ...(ngDevMode ? [{ debugName: "itemTemplateRef" }] : /* istanbul ignore next */ []));
|
|
9
26
|
items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
10
27
|
ariaLabel = input('Menu', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
11
28
|
itemClick = output();
|
|
@@ -15,7 +32,7 @@ class NeuMenuComponent {
|
|
|
15
32
|
}
|
|
16
33
|
}
|
|
17
34
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
18
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuMenuComponent, isStandalone: true, selector: "neu-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { classAttribute: "neu-menu" }, ngImport: i0, template: `
|
|
35
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuMenuComponent, isStandalone: true, selector: "neu-menu", inputs: { itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { classAttribute: "neu-menu" }, queries: [{ propertyName: "itemTpl", first: true, predicate: NeuMenuItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
19
36
|
<div class="neu-menu__list" role="menu" [attr.aria-label]="ariaLabel()">
|
|
20
37
|
@for (item of items(); track item.key) {
|
|
21
38
|
@if (item.separator) {
|
|
@@ -31,7 +48,9 @@ class NeuMenuComponent {
|
|
|
31
48
|
[disabled]="!!item.disabled"
|
|
32
49
|
(click)="activate(item)"
|
|
33
50
|
>
|
|
34
|
-
@if (
|
|
51
|
+
@if (itemTemplateRef()) {
|
|
52
|
+
<ng-container [ngTemplateOutlet]="itemTemplateRef()" [ngTemplateOutletContext]="{ $implicit: item }" />
|
|
53
|
+
} @else if (item.icon) {
|
|
35
54
|
<neu-icon class="neu-menu__icon" [name]="item.icon" size="1rem" aria-hidden="true" />
|
|
36
55
|
}
|
|
37
56
|
<span class="neu-menu__label">{{ item.label }}</span>
|
|
@@ -44,17 +63,17 @@ class NeuMenuComponent {
|
|
|
44
63
|
</button>
|
|
45
64
|
@if (item.children?.length) {
|
|
46
65
|
<div class="neu-menu__child">
|
|
47
|
-
<neu-menu [items]="item.children ?? []" [ariaLabel]="item.label" (itemClick)="itemClick.emit($event)" />
|
|
66
|
+
<neu-menu [items]="item.children ?? []" [ariaLabel]="item.label" [itemTemplate]="itemTemplateRef()" (itemClick)="itemClick.emit($event)" />
|
|
48
67
|
</div>
|
|
49
68
|
}
|
|
50
69
|
}
|
|
51
70
|
}
|
|
52
71
|
</div>
|
|
53
|
-
`, isInline: true, styles: [".neu-menu,.neu-tiered-menu{display:block}.neu-menu__list,.neu-menu-button__panel{min-width:12rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.375rem}.neu-menu__item,.neu-menubar__item,.neu-menu-button__trigger{display:flex;align-items:center;gap:.5rem;border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.625rem .75rem;cursor:pointer}.neu-menu__item{width:100%;justify-content:flex-start;text-align:left}.neu-menu__item:hover,.neu-menubar__item:hover,.neu-menu-button__trigger:hover{background:var(--neu-surface-2, #f3f4f6)}.neu-menu__label{flex:1}.neu-menu__icon{flex:0 0 auto}.neu-menu__shortcut{color:var(--neu-text-muted, #6b7280);font:inherit;font-size:.75rem}.neu-menu__separator{height:1px;margin:.25rem;background:var(--neu-border, #e5e7eb)}.neu-menu__child{margin-left:.75rem;padding-left:.5rem;border-left:1px solid var(--neu-border, #e5e7eb)}.neu-menubar__list{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem}html[data-theme=dark] .neu-menu__item,html[data-theme=dark] .neu-menubar__item,html[data-theme=dark] .neu-menu-button__trigger{color:#f2f7fb}html[data-theme=dark] .neu-menu__shortcut{color:#c9d1d9}html[data-theme=dark] .neu-menu__item:hover,html[data-theme=dark] .neu-menubar__item:hover,html[data-theme=dark] .neu-menu-button__trigger:hover{background:#ffffff1f;color:#fff}\n"], dependencies: [{ kind: "component", type: NeuMenuComponent, selector: "neu-menu", inputs: ["items", "ariaLabel"], outputs: ["itemClick"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
72
|
+
`, isInline: true, styles: [".neu-menu,.neu-tiered-menu{display:block}.neu-menu__list,.neu-menu-button__panel{min-width:12rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.375rem}.neu-menu__item,.neu-menubar__item,.neu-menu-button__trigger{display:flex;align-items:center;gap:.5rem;border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.625rem .75rem;cursor:pointer}.neu-menu__item{width:100%;justify-content:flex-start;text-align:left}.neu-menu__item:hover,.neu-menubar__item:hover,.neu-menu-button__trigger:hover{background:var(--neu-surface-2, #f3f4f6)}.neu-menu__label{flex:1}.neu-menu__icon{flex:0 0 auto}.neu-menu__shortcut{color:var(--neu-text-muted, #6b7280);font:inherit;font-size:.75rem}.neu-menu__separator{height:1px;margin:.25rem;background:var(--neu-border, #e5e7eb)}.neu-menu__child{margin-left:.75rem;padding-left:.5rem;border-left:1px solid var(--neu-border, #e5e7eb)}.neu-menubar__list{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem}html[data-theme=dark] .neu-menu__item,html[data-theme=dark] .neu-menubar__item,html[data-theme=dark] .neu-menu-button__trigger{color:#f2f7fb}html[data-theme=dark] .neu-menu__shortcut{color:#c9d1d9}html[data-theme=dark] .neu-menu__item:hover,html[data-theme=dark] .neu-menubar__item:hover,html[data-theme=dark] .neu-menu-button__trigger:hover{background:#ffffff1f;color:#fff}\n"], dependencies: [{ kind: "component", type: NeuMenuComponent, selector: "neu-menu", inputs: ["itemTemplate", "items", "ariaLabel"], outputs: ["itemClick"] }, { 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: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
54
73
|
}
|
|
55
74
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMenuComponent, decorators: [{
|
|
56
75
|
type: Component,
|
|
57
|
-
args: [{ selector: 'neu-menu', imports: [NeuButtonComponent, NeuIconComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'neu-menu' }, template: `
|
|
76
|
+
args: [{ selector: 'neu-menu', imports: [NeuButtonComponent, NeuIconComponent, NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'neu-menu' }, template: `
|
|
58
77
|
<div class="neu-menu__list" role="menu" [attr.aria-label]="ariaLabel()">
|
|
59
78
|
@for (item of items(); track item.key) {
|
|
60
79
|
@if (item.separator) {
|
|
@@ -70,7 +89,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
70
89
|
[disabled]="!!item.disabled"
|
|
71
90
|
(click)="activate(item)"
|
|
72
91
|
>
|
|
73
|
-
@if (
|
|
92
|
+
@if (itemTemplateRef()) {
|
|
93
|
+
<ng-container [ngTemplateOutlet]="itemTemplateRef()" [ngTemplateOutletContext]="{ $implicit: item }" />
|
|
94
|
+
} @else if (item.icon) {
|
|
74
95
|
<neu-icon class="neu-menu__icon" [name]="item.icon" size="1rem" aria-hidden="true" />
|
|
75
96
|
}
|
|
76
97
|
<span class="neu-menu__label">{{ item.label }}</span>
|
|
@@ -83,15 +104,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
83
104
|
</button>
|
|
84
105
|
@if (item.children?.length) {
|
|
85
106
|
<div class="neu-menu__child">
|
|
86
|
-
<neu-menu [items]="item.children ?? []" [ariaLabel]="item.label" (itemClick)="itemClick.emit($event)" />
|
|
107
|
+
<neu-menu [items]="item.children ?? []" [ariaLabel]="item.label" [itemTemplate]="itemTemplateRef()" (itemClick)="itemClick.emit($event)" />
|
|
87
108
|
</div>
|
|
88
109
|
}
|
|
89
110
|
}
|
|
90
111
|
}
|
|
91
112
|
</div>
|
|
92
113
|
`, styles: [".neu-menu,.neu-tiered-menu{display:block}.neu-menu__list,.neu-menu-button__panel{min-width:12rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.375rem}.neu-menu__item,.neu-menubar__item,.neu-menu-button__trigger{display:flex;align-items:center;gap:.5rem;border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.625rem .75rem;cursor:pointer}.neu-menu__item{width:100%;justify-content:flex-start;text-align:left}.neu-menu__item:hover,.neu-menubar__item:hover,.neu-menu-button__trigger:hover{background:var(--neu-surface-2, #f3f4f6)}.neu-menu__label{flex:1}.neu-menu__icon{flex:0 0 auto}.neu-menu__shortcut{color:var(--neu-text-muted, #6b7280);font:inherit;font-size:.75rem}.neu-menu__separator{height:1px;margin:.25rem;background:var(--neu-border, #e5e7eb)}.neu-menu__child{margin-left:.75rem;padding-left:.5rem;border-left:1px solid var(--neu-border, #e5e7eb)}.neu-menubar__list{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem}html[data-theme=dark] .neu-menu__item,html[data-theme=dark] .neu-menubar__item,html[data-theme=dark] .neu-menu-button__trigger{color:#f2f7fb}html[data-theme=dark] .neu-menu__shortcut{color:#c9d1d9}html[data-theme=dark] .neu-menu__item:hover,html[data-theme=dark] .neu-menubar__item:hover,html[data-theme=dark] .neu-menu-button__trigger:hover{background:#ffffff1f;color:#fff}\n"] }]
|
|
93
|
-
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
|
|
114
|
+
}], propDecorators: { itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuMenuItemDirective), { isSignal: true }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
|
|
94
115
|
class NeuMenuButtonComponent {
|
|
116
|
+
itemTpl = contentChild(NeuMenuItemDirective, ...(ngDevMode ? [{ debugName: "itemTpl" }] : /* istanbul ignore next */ []));
|
|
95
117
|
items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
96
118
|
label = input('Menu', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
97
119
|
itemClick = output();
|
|
@@ -112,7 +134,7 @@ class NeuMenuButtonComponent {
|
|
|
112
134
|
this.close();
|
|
113
135
|
}
|
|
114
136
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMenuButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
115
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.
|
|
137
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: NeuMenuButtonComponent, isStandalone: true, selector: "neu-menu-button", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", openChange: "openChange" }, host: { classAttribute: "neu-menu-button" }, queries: [{ propertyName: "itemTpl", first: true, predicate: NeuMenuItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
116
138
|
<button
|
|
117
139
|
neu-button
|
|
118
140
|
cdkOverlayOrigin
|
|
@@ -136,9 +158,9 @@ class NeuMenuButtonComponent {
|
|
|
136
158
|
(backdropClick)="close()"
|
|
137
159
|
(detach)="close()"
|
|
138
160
|
>
|
|
139
|
-
<neu-menu class="neu-menu-button__panel" [items]="items()" (itemClick)="onItemClick($event)" />
|
|
161
|
+
<neu-menu class="neu-menu-button__panel" [items]="items()" [itemTemplate]="itemTpl()?.templateRef ?? null" (itemClick)="onItemClick($event)" />
|
|
140
162
|
</ng-template>
|
|
141
|
-
`, isInline: true, styles: [".neu-menu,.neu-tiered-menu{display:block}.neu-menu__list,.neu-menu-button__panel{min-width:12rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.375rem}.neu-menu__item,.neu-menubar__item,.neu-menu-button__trigger{display:flex;align-items:center;gap:.5rem;border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.625rem .75rem;cursor:pointer}.neu-menu__item{width:100%;justify-content:flex-start;text-align:left}.neu-menu__item:hover,.neu-menubar__item:hover,.neu-menu-button__trigger:hover{background:var(--neu-surface-2, #f3f4f6)}.neu-menu__label{flex:1}.neu-menu__icon{flex:0 0 auto}.neu-menu__shortcut{color:var(--neu-text-muted, #6b7280);font:inherit;font-size:.75rem}.neu-menu__separator{height:1px;margin:.25rem;background:var(--neu-border, #e5e7eb)}.neu-menu__child{margin-left:.75rem;padding-left:.5rem;border-left:1px solid var(--neu-border, #e5e7eb)}.neu-menubar__list{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem}html[data-theme=dark] .neu-menu__item,html[data-theme=dark] .neu-menubar__item,html[data-theme=dark] .neu-menu-button__trigger{color:#f2f7fb}html[data-theme=dark] .neu-menu__shortcut{color:#c9d1d9}html[data-theme=dark] .neu-menu__item:hover,html[data-theme=dark] .neu-menubar__item:hover,html[data-theme=dark] .neu-menu-button__trigger:hover{background:#ffffff1f;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: NeuButtonComponent, selector: "button[neu-button]", inputs: ["variant", "size", "disabled", "loading", "fullWidth", "icon", "iconPosition", "iconOnly", "ariaLabel"], outputs: ["neuClick"] }, { kind: "component", type: NeuMenuComponent, selector: "neu-menu", inputs: ["items", "ariaLabel"], outputs: ["itemClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
163
|
+
`, isInline: true, styles: [".neu-menu,.neu-tiered-menu{display:block}.neu-menu__list,.neu-menu-button__panel{min-width:12rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.375rem}.neu-menu__item,.neu-menubar__item,.neu-menu-button__trigger{display:flex;align-items:center;gap:.5rem;border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.625rem .75rem;cursor:pointer}.neu-menu__item{width:100%;justify-content:flex-start;text-align:left}.neu-menu__item:hover,.neu-menubar__item:hover,.neu-menu-button__trigger:hover{background:var(--neu-surface-2, #f3f4f6)}.neu-menu__label{flex:1}.neu-menu__icon{flex:0 0 auto}.neu-menu__shortcut{color:var(--neu-text-muted, #6b7280);font:inherit;font-size:.75rem}.neu-menu__separator{height:1px;margin:.25rem;background:var(--neu-border, #e5e7eb)}.neu-menu__child{margin-left:.75rem;padding-left:.5rem;border-left:1px solid var(--neu-border, #e5e7eb)}.neu-menubar__list{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem}html[data-theme=dark] .neu-menu__item,html[data-theme=dark] .neu-menubar__item,html[data-theme=dark] .neu-menu-button__trigger{color:#f2f7fb}html[data-theme=dark] .neu-menu__shortcut{color:#c9d1d9}html[data-theme=dark] .neu-menu__item:hover,html[data-theme=dark] .neu-menubar__item:hover,html[data-theme=dark] .neu-menu-button__trigger:hover{background:#ffffff1f;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: NeuButtonComponent, selector: "button[neu-button]", inputs: ["variant", "size", "disabled", "loading", "fullWidth", "icon", "iconPosition", "iconOnly", "ariaLabel"], outputs: ["neuClick"] }, { kind: "component", type: NeuMenuComponent, selector: "neu-menu", inputs: ["itemTemplate", "items", "ariaLabel"], outputs: ["itemClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
142
164
|
}
|
|
143
165
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMenuButtonComponent, decorators: [{
|
|
144
166
|
type: Component,
|
|
@@ -166,10 +188,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
166
188
|
(backdropClick)="close()"
|
|
167
189
|
(detach)="close()"
|
|
168
190
|
>
|
|
169
|
-
<neu-menu class="neu-menu-button__panel" [items]="items()" (itemClick)="onItemClick($event)" />
|
|
191
|
+
<neu-menu class="neu-menu-button__panel" [items]="items()" [itemTemplate]="itemTpl()?.templateRef ?? null" (itemClick)="onItemClick($event)" />
|
|
170
192
|
</ng-template>
|
|
171
193
|
`, styles: [".neu-menu,.neu-tiered-menu{display:block}.neu-menu__list,.neu-menu-button__panel{min-width:12rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.375rem}.neu-menu__item,.neu-menubar__item,.neu-menu-button__trigger{display:flex;align-items:center;gap:.5rem;border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.625rem .75rem;cursor:pointer}.neu-menu__item{width:100%;justify-content:flex-start;text-align:left}.neu-menu__item:hover,.neu-menubar__item:hover,.neu-menu-button__trigger:hover{background:var(--neu-surface-2, #f3f4f6)}.neu-menu__label{flex:1}.neu-menu__icon{flex:0 0 auto}.neu-menu__shortcut{color:var(--neu-text-muted, #6b7280);font:inherit;font-size:.75rem}.neu-menu__separator{height:1px;margin:.25rem;background:var(--neu-border, #e5e7eb)}.neu-menu__child{margin-left:.75rem;padding-left:.5rem;border-left:1px solid var(--neu-border, #e5e7eb)}.neu-menubar__list{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem}html[data-theme=dark] .neu-menu__item,html[data-theme=dark] .neu-menubar__item,html[data-theme=dark] .neu-menu-button__trigger{color:#f2f7fb}html[data-theme=dark] .neu-menu__shortcut{color:#c9d1d9}html[data-theme=dark] .neu-menu__item:hover,html[data-theme=dark] .neu-menubar__item:hover,html[data-theme=dark] .neu-menu-button__trigger:hover{background:#ffffff1f;color:#fff}\n"] }]
|
|
172
|
-
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], openChange: [{ type: i0.Output, args: ["openChange"] }] } });
|
|
194
|
+
}], propDecorators: { itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuMenuItemDirective), { isSignal: true }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], openChange: [{ type: i0.Output, args: ["openChange"] }] } });
|
|
173
195
|
class NeuMenubarComponent {
|
|
174
196
|
items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
175
197
|
ariaLabel = input('Menu bar', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
@@ -214,7 +236,7 @@ class NeuTieredMenuComponent {
|
|
|
214
236
|
ariaLabel = input('Tiered menu', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
215
237
|
itemClick = output();
|
|
216
238
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTieredMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
217
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: NeuTieredMenuComponent, isStandalone: true, selector: "neu-tiered-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { classAttribute: "neu-tiered-menu" }, ngImport: i0, template: `<neu-menu [items]="items()" [ariaLabel]="ariaLabel()" (itemClick)="itemClick.emit($event)" />`, isInline: true, styles: [".neu-menu,.neu-tiered-menu{display:block}.neu-menu__list,.neu-menu-button__panel{min-width:12rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.375rem}.neu-menu__item,.neu-menubar__item,.neu-menu-button__trigger{display:flex;align-items:center;gap:.5rem;border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.625rem .75rem;cursor:pointer}.neu-menu__item{width:100%;justify-content:flex-start;text-align:left}.neu-menu__item:hover,.neu-menubar__item:hover,.neu-menu-button__trigger:hover{background:var(--neu-surface-2, #f3f4f6)}.neu-menu__label{flex:1}.neu-menu__icon{flex:0 0 auto}.neu-menu__shortcut{color:var(--neu-text-muted, #6b7280);font:inherit;font-size:.75rem}.neu-menu__separator{height:1px;margin:.25rem;background:var(--neu-border, #e5e7eb)}.neu-menu__child{margin-left:.75rem;padding-left:.5rem;border-left:1px solid var(--neu-border, #e5e7eb)}.neu-menubar__list{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem}html[data-theme=dark] .neu-menu__item,html[data-theme=dark] .neu-menubar__item,html[data-theme=dark] .neu-menu-button__trigger{color:#f2f7fb}html[data-theme=dark] .neu-menu__shortcut{color:#c9d1d9}html[data-theme=dark] .neu-menu__item:hover,html[data-theme=dark] .neu-menubar__item:hover,html[data-theme=dark] .neu-menu-button__trigger:hover{background:#ffffff1f;color:#fff}\n"], dependencies: [{ kind: "component", type: NeuMenuComponent, selector: "neu-menu", inputs: ["items", "ariaLabel"], outputs: ["itemClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
239
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: NeuTieredMenuComponent, isStandalone: true, selector: "neu-tiered-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { classAttribute: "neu-tiered-menu" }, ngImport: i0, template: `<neu-menu [items]="items()" [ariaLabel]="ariaLabel()" (itemClick)="itemClick.emit($event)" />`, isInline: true, styles: [".neu-menu,.neu-tiered-menu{display:block}.neu-menu__list,.neu-menu-button__panel{min-width:12rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.375rem}.neu-menu__item,.neu-menubar__item,.neu-menu-button__trigger{display:flex;align-items:center;gap:.5rem;border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.625rem .75rem;cursor:pointer}.neu-menu__item{width:100%;justify-content:flex-start;text-align:left}.neu-menu__item:hover,.neu-menubar__item:hover,.neu-menu-button__trigger:hover{background:var(--neu-surface-2, #f3f4f6)}.neu-menu__label{flex:1}.neu-menu__icon{flex:0 0 auto}.neu-menu__shortcut{color:var(--neu-text-muted, #6b7280);font:inherit;font-size:.75rem}.neu-menu__separator{height:1px;margin:.25rem;background:var(--neu-border, #e5e7eb)}.neu-menu__child{margin-left:.75rem;padding-left:.5rem;border-left:1px solid var(--neu-border, #e5e7eb)}.neu-menubar__list{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem}html[data-theme=dark] .neu-menu__item,html[data-theme=dark] .neu-menubar__item,html[data-theme=dark] .neu-menu-button__trigger{color:#f2f7fb}html[data-theme=dark] .neu-menu__shortcut{color:#c9d1d9}html[data-theme=dark] .neu-menu__item:hover,html[data-theme=dark] .neu-menubar__item:hover,html[data-theme=dark] .neu-menu-button__trigger:hover{background:#ffffff1f;color:#fff}\n"], dependencies: [{ kind: "component", type: NeuMenuComponent, selector: "neu-menu", inputs: ["itemTemplate", "items", "ariaLabel"], outputs: ["itemClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
218
240
|
}
|
|
219
241
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTieredMenuComponent, decorators: [{
|
|
220
242
|
type: Component,
|
|
@@ -225,5 +247,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
225
247
|
* Generated bundle index. Do not edit.
|
|
226
248
|
*/
|
|
227
249
|
|
|
228
|
-
export { NeuMenuButtonComponent, NeuMenuComponent, NeuMenubarComponent, NeuTieredMenuComponent };
|
|
250
|
+
export { NeuMenuButtonComponent, NeuMenuComponent, NeuMenuItemDirective, NeuMenubarComponent, NeuTieredMenuComponent };
|
|
229
251
|
//# sourceMappingURL=neural-ui-core-menu.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-menu.mjs","sources":["../../../../projects/ui-core/menu/neu-menu.component.ts","../../../../projects/ui-core/menu/neural-ui-core-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\nexport interface NeuMenuItem {\n key: string;\n label: string;\n icon?: string;\n shortcut?: string;\n disabled?: boolean;\n separator?: boolean;\n children?: NeuMenuItem[];\n data?: unknown;\n}\n\n@Component({\n selector: 'neu-menu',\n imports: [NeuButtonComponent, NeuIconComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-menu' },\n template: `\n <div class=\"neu-menu__list\" role=\"menu\" [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track item.key) {\n @if (item.separator) {\n <div class=\"neu-menu__separator\" role=\"separator\"></div>\n } @else {\n <button\n neu-button\n type=\"button\"\n role=\"menuitem\"\n class=\"neu-menu__item\"\n variant=\"ghost\"\n size=\"sm\"\n [disabled]=\"!!item.disabled\"\n (click)=\"activate(item)\"\n >\n @if (item.icon) {\n <neu-icon class=\"neu-menu__icon\" [name]=\"item.icon\" size=\"1rem\" aria-hidden=\"true\" />\n }\n <span class=\"neu-menu__label\">{{ item.label }}</span>\n @if (item.shortcut) {\n <kbd class=\"neu-menu__shortcut\">{{ item.shortcut }}</kbd>\n }\n @if (item.children?.length) {\n <span class=\"neu-menu__chevron\" aria-hidden=\"true\">›</span>\n }\n </button>\n @if (item.children?.length) {\n <div class=\"neu-menu__child\">\n <neu-menu [items]=\"item.children ?? []\" [ariaLabel]=\"item.label\" (itemClick)=\"itemClick.emit($event)\" />\n </div>\n }\n }\n }\n </div>\n `,\n styleUrl: './neu-menu.component.scss',\n})\nexport class NeuMenuComponent {\n readonly items = input<NeuMenuItem[]>([]);\n readonly ariaLabel = input('Menu');\n readonly itemClick = output<NeuMenuItem>();\n\n activate(item: NeuMenuItem): void {\n if (!item.disabled) {\n this.itemClick.emit(item);\n }\n }\n}\n\n@Component({\n selector: 'neu-menu-button',\n imports: [OverlayModule, NeuButtonComponent, NeuMenuComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-menu-button' },\n template: `\n <button\n neu-button\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"neu-menu-button__trigger\"\n variant=\"ghost\"\n size=\"sm\"\n [attr.aria-expanded]=\"open()\"\n aria-haspopup=\"menu\"\n (click)=\"toggle()\"\n >\n <ng-content>{{ label() }}</ng-content>\n </button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n >\n <neu-menu class=\"neu-menu-button__panel\" [items]=\"items()\" (itemClick)=\"onItemClick($event)\" />\n </ng-template>\n `,\n styleUrl: './neu-menu.component.scss',\n})\nexport class NeuMenuButtonComponent {\n readonly items = input<NeuMenuItem[]>([]);\n readonly label = input('Menu');\n readonly itemClick = output<NeuMenuItem>();\n readonly openChange = output<boolean>();\n readonly open = signal(false);\n\n toggle(): void {\n this.open.set(!this.open());\n this.openChange.emit(this.open());\n }\n\n close(): void {\n if (this.open()) {\n this.open.set(false);\n this.openChange.emit(false);\n }\n }\n\n onItemClick(item: NeuMenuItem): void {\n this.itemClick.emit(item);\n this.close();\n }\n}\n\n@Component({\n selector: 'neu-menubar',\n imports: [NeuButtonComponent, NeuMenuButtonComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-menubar' },\n template: `\n <nav class=\"neu-menubar__list\" [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track item.key) {\n @if (item.children?.length) {\n <neu-menu-button [items]=\"item.children ?? []\" [label]=\"item.label\" (itemClick)=\"itemClick.emit($event)\">\n {{ item.label }}\n </neu-menu-button>\n } @else {\n <button neu-button type=\"button\" class=\"neu-menubar__item\" variant=\"ghost\" size=\"sm\" [disabled]=\"!!item.disabled\" (click)=\"itemClick.emit(item)\">\n {{ item.label }}\n </button>\n }\n }\n </nav>\n `,\n styleUrl: './neu-menu.component.scss',\n})\nexport class NeuMenubarComponent {\n readonly items = input<NeuMenuItem[]>([]);\n readonly ariaLabel = input('Menu bar');\n readonly itemClick = output<NeuMenuItem>();\n}\n\n@Component({\n selector: 'neu-tiered-menu',\n imports: [NeuMenuComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-tiered-menu' },\n template: `<neu-menu [items]=\"items()\" [ariaLabel]=\"ariaLabel()\" (itemClick)=\"itemClick.emit($event)\" />`,\n styleUrl: './neu-menu.component.scss',\n})\nexport class NeuTieredMenuComponent {\n readonly items = input<NeuMenuItem[]>([]);\n readonly ariaLabel = input('Tiered menu');\n readonly itemClick = output<NeuMenuItem>();\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-menu.mjs","sources":["../../../../projects/ui-core/menu/neu-menu.component.ts","../../../../projects/ui-core/menu/neural-ui-core-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n ViewEncapsulation,\n computed,\n contentChild,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\nexport interface NeuMenuItem {\n key: string;\n label: string;\n icon?: string;\n shortcut?: string;\n disabled?: boolean;\n separator?: boolean;\n children?: NeuMenuItem[];\n data?: unknown;\n}\n\n/** Custom visual content for each menu item; menu semantics remain owned by the component. */\n@Directive({ selector: 'ng-template[neuMenuItem]' })\nexport class NeuMenuItemDirective {\n constructor(readonly templateRef: TemplateRef<{ $implicit: NeuMenuItem }>) {}\n}\n\n@Component({\n selector: 'neu-menu',\n imports: [NeuButtonComponent, NeuIconComponent, NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-menu' },\n template: `\n <div class=\"neu-menu__list\" role=\"menu\" [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track item.key) {\n @if (item.separator) {\n <div class=\"neu-menu__separator\" role=\"separator\"></div>\n } @else {\n <button\n neu-button\n type=\"button\"\n role=\"menuitem\"\n class=\"neu-menu__item\"\n variant=\"ghost\"\n size=\"sm\"\n [disabled]=\"!!item.disabled\"\n (click)=\"activate(item)\"\n >\n @if (itemTemplateRef()) {\n <ng-container [ngTemplateOutlet]=\"itemTemplateRef()\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n } @else if (item.icon) {\n <neu-icon class=\"neu-menu__icon\" [name]=\"item.icon\" size=\"1rem\" aria-hidden=\"true\" />\n }\n <span class=\"neu-menu__label\">{{ item.label }}</span>\n @if (item.shortcut) {\n <kbd class=\"neu-menu__shortcut\">{{ item.shortcut }}</kbd>\n }\n @if (item.children?.length) {\n <span class=\"neu-menu__chevron\" aria-hidden=\"true\">›</span>\n }\n </button>\n @if (item.children?.length) {\n <div class=\"neu-menu__child\">\n <neu-menu [items]=\"item.children ?? []\" [ariaLabel]=\"item.label\" [itemTemplate]=\"itemTemplateRef()\" (itemClick)=\"itemClick.emit($event)\" />\n </div>\n }\n }\n }\n </div>\n `,\n styleUrl: './neu-menu.component.scss',\n})\nexport class NeuMenuComponent {\n readonly itemTpl = contentChild(NeuMenuItemDirective);\n readonly itemTemplate = input<TemplateRef<{ $implicit: NeuMenuItem }> | null>(null);\n readonly itemTemplateRef = computed(() => this.itemTemplate() ?? this.itemTpl()?.templateRef ?? null);\n readonly items = input<NeuMenuItem[]>([]);\n readonly ariaLabel = input('Menu');\n readonly itemClick = output<NeuMenuItem>();\n\n activate(item: NeuMenuItem): void {\n if (!item.disabled) {\n this.itemClick.emit(item);\n }\n }\n}\n\n@Component({\n selector: 'neu-menu-button',\n imports: [OverlayModule, NeuButtonComponent, NeuMenuComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-menu-button' },\n template: `\n <button\n neu-button\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"neu-menu-button__trigger\"\n variant=\"ghost\"\n size=\"sm\"\n [attr.aria-expanded]=\"open()\"\n aria-haspopup=\"menu\"\n (click)=\"toggle()\"\n >\n <ng-content>{{ label() }}</ng-content>\n </button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n >\n <neu-menu class=\"neu-menu-button__panel\" [items]=\"items()\" [itemTemplate]=\"itemTpl()?.templateRef ?? null\" (itemClick)=\"onItemClick($event)\" />\n </ng-template>\n `,\n styleUrl: './neu-menu.component.scss',\n})\nexport class NeuMenuButtonComponent {\n readonly itemTpl = contentChild(NeuMenuItemDirective);\n readonly items = input<NeuMenuItem[]>([]);\n readonly label = input('Menu');\n readonly itemClick = output<NeuMenuItem>();\n readonly openChange = output<boolean>();\n readonly open = signal(false);\n\n toggle(): void {\n this.open.set(!this.open());\n this.openChange.emit(this.open());\n }\n\n close(): void {\n if (this.open()) {\n this.open.set(false);\n this.openChange.emit(false);\n }\n }\n\n onItemClick(item: NeuMenuItem): void {\n this.itemClick.emit(item);\n this.close();\n }\n}\n\n@Component({\n selector: 'neu-menubar',\n imports: [NeuButtonComponent, NeuMenuButtonComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-menubar' },\n template: `\n <nav class=\"neu-menubar__list\" [attr.aria-label]=\"ariaLabel()\">\n @for (item of items(); track item.key) {\n @if (item.children?.length) {\n <neu-menu-button [items]=\"item.children ?? []\" [label]=\"item.label\" (itemClick)=\"itemClick.emit($event)\">\n {{ item.label }}\n </neu-menu-button>\n } @else {\n <button neu-button type=\"button\" class=\"neu-menubar__item\" variant=\"ghost\" size=\"sm\" [disabled]=\"!!item.disabled\" (click)=\"itemClick.emit(item)\">\n {{ item.label }}\n </button>\n }\n }\n </nav>\n `,\n styleUrl: './neu-menu.component.scss',\n})\nexport class NeuMenubarComponent {\n readonly items = input<NeuMenuItem[]>([]);\n readonly ariaLabel = input('Menu bar');\n readonly itemClick = output<NeuMenuItem>();\n}\n\n@Component({\n selector: 'neu-tiered-menu',\n imports: [NeuMenuComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-tiered-menu' },\n template: `<neu-menu [items]=\"items()\" [ariaLabel]=\"ariaLabel()\" (itemClick)=\"itemClick.emit($event)\" />`,\n styleUrl: './neu-menu.component.scss',\n})\nexport class NeuTieredMenuComponent {\n readonly items = input<NeuMenuItem[]>([]);\n readonly ariaLabel = input('Tiered menu');\n readonly itemClick = output<NeuMenuItem>();\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|