@neural-ui/core 1.6.0 → 1.6.1
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 +13 -9
- package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
- package/fesm2022/neural-ui-core-alert.mjs +25 -14
- package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
- package/fesm2022/neural-ui-core-autocomplete.mjs +53 -28
- package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
- package/fesm2022/neural-ui-core-avatar.mjs +23 -13
- package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-badge.mjs +15 -9
- package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
- package/fesm2022/neural-ui-core-block-ui.mjs +16 -11
- package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
- package/fesm2022/neural-ui-core-breadcrumb.mjs +8 -6
- package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
- package/fesm2022/neural-ui-core-button.mjs +29 -16
- package/fesm2022/neural-ui-core-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-calendar.mjs +75 -50
- package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-card.mjs +13 -8
- package/fesm2022/neural-ui-core-card.mjs.map +1 -1
- package/fesm2022/neural-ui-core-chart.mjs +45 -24
- package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
- package/fesm2022/neural-ui-core-checkbox.mjs +15 -9
- package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
- package/fesm2022/neural-ui-core-chip.mjs +23 -13
- package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-code-block.mjs +32 -17
- package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
- package/fesm2022/neural-ui-core-color-picker.mjs +19 -11
- package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
- package/fesm2022/neural-ui-core-command-palette.mjs +16 -11
- package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
- package/fesm2022/neural-ui-core-confirm-dialog.mjs +6 -6
- package/fesm2022/neural-ui-core-context-menu.mjs +12 -9
- package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
- package/fesm2022/neural-ui-core-dashboard-grid.mjs +11 -7
- package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
- package/fesm2022/neural-ui-core-date-input.mjs +111 -57
- package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-divider.mjs +7 -5
- package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
- package/fesm2022/neural-ui-core-empty-state.mjs +13 -8
- package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-filter-bar.mjs +19 -11
- package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-icon.mjs +11 -7
- package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
- package/fesm2022/neural-ui-core-image-gallery.mjs +23 -13
- package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
- package/fesm2022/neural-ui-core-image-viewer.mjs +22 -14
- package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
- package/fesm2022/neural-ui-core-input-otp.mjs +19 -11
- package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
- package/fesm2022/neural-ui-core-input.mjs +67 -35
- package/fesm2022/neural-ui-core-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-kanban.mjs +17 -11
- package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
- package/fesm2022/neural-ui-core-knob.mjs +41 -22
- package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
- package/fesm2022/neural-ui-core-meter-group.mjs +23 -13
- package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-modal.mjs +16 -11
- package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
- package/fesm2022/neural-ui-core-multiselect.mjs +72 -39
- package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
- package/fesm2022/neural-ui-core-nav.mjs +22 -13
- package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
- package/fesm2022/neural-ui-core-notification-center.mjs +27 -10
- package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
- package/fesm2022/neural-ui-core-number-input.mjs +35 -19
- package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-pagination.mjs +15 -9
- package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
- package/fesm2022/neural-ui-core-popover.mjs +22 -14
- package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
- package/fesm2022/neural-ui-core-progress-bar.mjs +19 -11
- package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-radio.mjs +24 -15
- package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
- package/fesm2022/neural-ui-core-rating.mjs +13 -8
- package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
- package/fesm2022/neural-ui-core-rich-text-editor.mjs +63 -30
- package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -1
- package/fesm2022/neural-ui-core-scheduler-gantt.mjs +41 -22
- package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
- package/fesm2022/neural-ui-core-select.mjs +77 -43
- package/fesm2022/neural-ui-core-select.mjs.map +1 -1
- package/fesm2022/neural-ui-core-sidebar.mjs +23 -14
- package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-skeleton.mjs +11 -7
- package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
- package/fesm2022/neural-ui-core-slider.mjs +23 -13
- package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
- package/fesm2022/neural-ui-core-spinner.mjs +17 -10
- package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
- package/fesm2022/neural-ui-core-split-button.mjs +27 -15
- package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-splitter.mjs +9 -6
- package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
- package/fesm2022/neural-ui-core-stats-card.mjs +19 -11
- package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
- package/fesm2022/neural-ui-core-stepper.mjs +13 -8
- package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
- package/fesm2022/neural-ui-core-switch.mjs +15 -9
- package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
- package/fesm2022/neural-ui-core-table.mjs +242 -124
- package/fesm2022/neural-ui-core-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tabs.mjs +30 -18
- package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
- package/fesm2022/neural-ui-core-textarea.mjs +43 -23
- package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
- package/fesm2022/neural-ui-core-timeline-grid.mjs +21 -12
- package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
- package/fesm2022/neural-ui-core-timeline.mjs +5 -4
- package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toast.mjs +25 -9
- package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toggle-button-group.mjs +17 -10
- package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toolbar.mjs +13 -8
- package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tooltip.mjs +16 -11
- package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree-table.mjs +57 -30
- package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree.mjs +31 -17
- package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
- package/fesm2022/neural-ui-core-uploader.mjs +91 -47
- package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
- package/fesm2022/neural-ui-core-url-state.mjs +7 -5
- package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-virtual-list.mjs +32 -19
- package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
- package/package.json +1 -1
- package/types/neural-ui-core-notification-center.d.ts +2 -0
- package/types/neural-ui-core-toast.d.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-filter-bar.mjs","sources":["../../../../projects/ui-core/filter-bar/neu-filter-bar.component.ts","../../../../projects/ui-core/filter-bar/neural-ui-core-filter-bar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\n\nexport interface NeuFilterChip {\n /** Identificador único del filtro / Unique filter identifier */\n key: string;\n /** Etiqueta visible / Visible label */\n label: string;\n /** Si el chip está activo / Whether the chip is active */\n active?: boolean;\n}\n\nlet _seq = 0;\n\n/**\n * NeuralUI FilterBar Component\n *\n * Fila de chips de filtro con selección individual y botón \"Limpiar todo\".\n *\n * Uso:\n * <neu-filter-bar [filters]=\"chips\" (filterChange)=\"onFilter($event)\" />\n */\n@Component({\n selector: 'neu-filter-bar',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClasses()', role: 'group', '[attr.aria-label]': 'ariaLabel()' },\n template: `\n <div class=\"neu-filter-bar__chips\">\n @for (filter of _chips(); track filter.key) {\n <button\n type=\"button\"\n class=\"neu-filter-bar__chip\"\n [class.neu-filter-bar__chip--active]=\"filter.active\"\n [attr.aria-pressed]=\"filter.active ?? false\"\n (click)=\"toggle(filter)\"\n >\n {{ filter.label }}\n </button>\n }\n </div>\n @if (clearable() && _hasActive()) {\n <button\n type=\"button\"\n class=\"neu-filter-bar__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clearAll()\"\n >\n {{ clearLabel() }}\n </button>\n }\n `,\n styleUrl: './neu-filter-bar.component.scss',\n})\nexport class NeuFilterBarComponent {\n /** Lista inicial de filtros / Initial filter chips list */\n readonly filters = input<NeuFilterChip[]>([]);\n\n /** Muestra el botón \"Limpiar todo\" cuando hay activos / Shows \"Clear all\" when any active */\n readonly clearable = input<boolean>(true);\n\n /** Texto del botón de limpiar / Clear button text */\n readonly clearLabel = input<string>('Limpiar todo');\n\n /** Permite selección múltiple / Allows multi-selection */\n readonly multi = input<boolean>(true);\n\n /** Aria-label de la barra / Aria-label for the bar */\n readonly ariaLabel = input<string>('Filtros');\n\n /** Emitido con los chips activos al cambiar / Emitted with active chips on change */\n readonly filterChange = output<NeuFilterChip[]>();\n\n readonly _id = `neu-filter-bar-${++_seq}`;\n readonly _chips = signal<NeuFilterChip[]>([]);\n\n readonly _hasActive = computed(() => this._chips().some((c) => c.active));\n\n readonly hostClasses = computed(() => ({\n 'neu-filter-bar': true,\n 'neu-filter-bar--multi': this.multi(),\n }));\n\n constructor() {\n effect(() => {\n const src = this.filters();\n untracked(() => this._chips.set(src.map((f) => ({ ...f }))));\n });\n }\n\n toggle(chip: NeuFilterChip): void {\n this._chips.update((chips) => {\n if (this.multi()) {\n return chips.map((c) => (c.key === chip.key ? { ...c, active: !c.active } : c));\n }\n return chips.map((c) => ({ ...c, active: c.key === chip.key ? !c.active : false }));\n });\n this.filterChange.emit(this._chips().filter((c) => c.active));\n }\n\n clearAll(): void {\n this._chips.update((chips) => chips.map((c) => ({ ...c, active: false })));\n this.filterChange.emit([]);\n }\n\n /** Activa chips por sus keys programáticamente / Activate chips by keys programmatically */\n setActive(keys: string[]): void {\n this._chips.update((chips) => chips.map((c) => ({ ...c, active: keys.includes(c.key) })));\n this.filterChange.emit(this._chips().filter((c) => c.active));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;AAqBA,IAAI,IAAI,GAAG,CAAC;AAEZ;;;;;;;AAOG;MAkCU,qBAAqB,CAAA;;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-filter-bar.mjs","sources":["../../../../projects/ui-core/filter-bar/neu-filter-bar.component.ts","../../../../projects/ui-core/filter-bar/neural-ui-core-filter-bar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\n\nexport interface NeuFilterChip {\n /** Identificador único del filtro / Unique filter identifier */\n key: string;\n /** Etiqueta visible / Visible label */\n label: string;\n /** Si el chip está activo / Whether the chip is active */\n active?: boolean;\n}\n\nlet _seq = 0;\n\n/**\n * NeuralUI FilterBar Component\n *\n * Fila de chips de filtro con selección individual y botón \"Limpiar todo\".\n *\n * Uso:\n * <neu-filter-bar [filters]=\"chips\" (filterChange)=\"onFilter($event)\" />\n */\n@Component({\n selector: 'neu-filter-bar',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClasses()', role: 'group', '[attr.aria-label]': 'ariaLabel()' },\n template: `\n <div class=\"neu-filter-bar__chips\">\n @for (filter of _chips(); track filter.key) {\n <button\n type=\"button\"\n class=\"neu-filter-bar__chip\"\n [class.neu-filter-bar__chip--active]=\"filter.active\"\n [attr.aria-pressed]=\"filter.active ?? false\"\n (click)=\"toggle(filter)\"\n >\n {{ filter.label }}\n </button>\n }\n </div>\n @if (clearable() && _hasActive()) {\n <button\n type=\"button\"\n class=\"neu-filter-bar__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clearAll()\"\n >\n {{ clearLabel() }}\n </button>\n }\n `,\n styleUrl: './neu-filter-bar.component.scss',\n})\nexport class NeuFilterBarComponent {\n /** Lista inicial de filtros / Initial filter chips list */\n readonly filters = input<NeuFilterChip[]>([]);\n\n /** Muestra el botón \"Limpiar todo\" cuando hay activos / Shows \"Clear all\" when any active */\n readonly clearable = input<boolean>(true);\n\n /** Texto del botón de limpiar / Clear button text */\n readonly clearLabel = input<string>('Limpiar todo');\n\n /** Permite selección múltiple / Allows multi-selection */\n readonly multi = input<boolean>(true);\n\n /** Aria-label de la barra / Aria-label for the bar */\n readonly ariaLabel = input<string>('Filtros');\n\n /** Emitido con los chips activos al cambiar / Emitted with active chips on change */\n readonly filterChange = output<NeuFilterChip[]>();\n\n readonly _id = `neu-filter-bar-${++_seq}`;\n readonly _chips = signal<NeuFilterChip[]>([]);\n\n readonly _hasActive = computed(() => this._chips().some((c) => c.active));\n\n readonly hostClasses = computed(() => ({\n 'neu-filter-bar': true,\n 'neu-filter-bar--multi': this.multi(),\n }));\n\n constructor() {\n effect(() => {\n const src = this.filters();\n untracked(() => this._chips.set(src.map((f) => ({ ...f }))));\n });\n }\n\n toggle(chip: NeuFilterChip): void {\n this._chips.update((chips) => {\n if (this.multi()) {\n return chips.map((c) => (c.key === chip.key ? { ...c, active: !c.active } : c));\n }\n return chips.map((c) => ({ ...c, active: c.key === chip.key ? !c.active : false }));\n });\n this.filterChange.emit(this._chips().filter((c) => c.active));\n }\n\n clearAll(): void {\n this._chips.update((chips) => chips.map((c) => ({ ...c, active: false })));\n this.filterChange.emit([]);\n }\n\n /** Activa chips por sus keys programáticamente / Activate chips by keys programmatically */\n setActive(keys: string[]): void {\n this._chips.update((chips) => chips.map((c) => ({ ...c, active: keys.includes(c.key) })));\n this.filterChange.emit(this._chips().filter((c) => c.active));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -15,23 +15,27 @@ import { NgIcon } from '@ng-icons/core';
|
|
|
15
15
|
*/
|
|
16
16
|
class NeuIconComponent {
|
|
17
17
|
/** Nombre del icono registrado con provideIcons() / Icon name registered with provideIcons() */
|
|
18
|
-
name = input.required(
|
|
18
|
+
name = input.required(/* @ts-ignore */
|
|
19
|
+
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
19
20
|
/**
|
|
20
21
|
* Grosor del trazo. Default '2' para estética fina y técnica.
|
|
21
22
|
* Puede sobrescribirse por instancia.
|
|
22
23
|
*/
|
|
23
|
-
strokeWidth = input('2',
|
|
24
|
+
strokeWidth = input('2', /* @ts-ignore */
|
|
25
|
+
...(ngDevMode ? [{ debugName: "strokeWidth" }] : /* istanbul ignore next */ []));
|
|
24
26
|
/**
|
|
25
27
|
* Tamaño del icono. Acepta cualquier unidad CSS válida.
|
|
26
28
|
* Si no se especifica, usa la variable CSS `--neu-icon-size` (1.25rem por defecto).
|
|
27
29
|
*/
|
|
28
|
-
size = input('',
|
|
30
|
+
size = input('', /* @ts-ignore */
|
|
31
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
29
32
|
/** Tamaño resuelto: usa el input `size` o cae al token CSS. / Resolved size: uses the `size` input or falls back to the CSS token. */
|
|
30
|
-
resolvedSize = computed(() => this.size() || 'var(--neu-icon-size, 1.25rem)',
|
|
31
|
-
|
|
32
|
-
static
|
|
33
|
+
resolvedSize = computed(() => this.size() || 'var(--neu-icon-size, 1.25rem)', /* @ts-ignore */
|
|
34
|
+
...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
|
|
35
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
36
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: NeuIconComponent, isStandalone: true, selector: "neu-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "\"inline-flex\"", "style.align-items": "\"center\"", "style.justify-content": "\"center\"", "style.line-height": "\"1\"", "style.color": "\"inherit\"" }, classAttribute: "neu-icon" }, ngImport: i0, template: `<ng-icon [name]="name()" [size]="resolvedSize()" [strokeWidth]="strokeWidth()" />`, isInline: true, styles: [".neu-icon{color:inherit;vertical-align:middle;flex-shrink:0}\n"], dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
33
37
|
}
|
|
34
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuIconComponent, decorators: [{
|
|
35
39
|
type: Component,
|
|
36
40
|
args: [{ selector: 'neu-icon', imports: [NgIcon], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
37
41
|
class: 'neu-icon',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-icon.mjs","sources":["../../../../projects/ui-core/icon/neu-icon.component.ts","../../../../projects/ui-core/icon/neural-ui-core-icon.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { NgIcon } from '@ng-icons/core';\n\n/**\n * NeuIconComponent — Wrapper delgado sobre NgIcon de @ng-icons/core\n *\n * Hereda el color del elemento padre mediante `color: currentColor`.\n * El grosor del trazo se controla con la variable CSS `--ng-icon__stroke-width`\n * que viene configurada globalmente vía `provideNgIconsConfig`.\n *\n * Uso básico:\n * <neu-icon name=\"lucideX\" />\n * <neu-icon name=\"lucideAlertCircle\" size=\"1rem\" />\n */\n@Component({\n selector: 'neu-icon',\n imports: [NgIcon],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-icon',\n '[style.display]': '\"inline-flex\"',\n '[style.align-items]': '\"center\"',\n '[style.justify-content]': '\"center\"',\n '[style.line-height]': '\"1\"',\n '[style.color]': '\"inherit\"',\n },\n template: `<ng-icon [name]=\"name()\" [size]=\"resolvedSize()\" [strokeWidth]=\"strokeWidth()\" />`,\n styleUrl: './neu-icon.component.scss',\n})\nexport class NeuIconComponent {\n /** Nombre del icono registrado con provideIcons() / Icon name registered with provideIcons() */\n name = input.required<string>();\n\n /**\n * Grosor del trazo. Default '2' para estética fina y técnica.\n * Puede sobrescribirse por instancia.\n */\n strokeWidth = input<string>('2');\n\n /**\n * Tamaño del icono. Acepta cualquier unidad CSS válida.\n * Si no se especifica, usa la variable CSS `--neu-icon-size` (1.25rem por defecto).\n */\n size = input<string>('');\n\n /** Tamaño resuelto: usa el input `size` o cae al token CSS. / Resolved size: uses the `size` input or falls back to the CSS token. */\n readonly resolvedSize = computed(() => this.size() || 'var(--neu-icon-size, 1.25rem)');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;AASA;;;;;;;;;;AAUG;MAiBU,gBAAgB,CAAA;;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-icon.mjs","sources":["../../../../projects/ui-core/icon/neu-icon.component.ts","../../../../projects/ui-core/icon/neural-ui-core-icon.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { NgIcon } from '@ng-icons/core';\n\n/**\n * NeuIconComponent — Wrapper delgado sobre NgIcon de @ng-icons/core\n *\n * Hereda el color del elemento padre mediante `color: currentColor`.\n * El grosor del trazo se controla con la variable CSS `--ng-icon__stroke-width`\n * que viene configurada globalmente vía `provideNgIconsConfig`.\n *\n * Uso básico:\n * <neu-icon name=\"lucideX\" />\n * <neu-icon name=\"lucideAlertCircle\" size=\"1rem\" />\n */\n@Component({\n selector: 'neu-icon',\n imports: [NgIcon],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-icon',\n '[style.display]': '\"inline-flex\"',\n '[style.align-items]': '\"center\"',\n '[style.justify-content]': '\"center\"',\n '[style.line-height]': '\"1\"',\n '[style.color]': '\"inherit\"',\n },\n template: `<ng-icon [name]=\"name()\" [size]=\"resolvedSize()\" [strokeWidth]=\"strokeWidth()\" />`,\n styleUrl: './neu-icon.component.scss',\n})\nexport class NeuIconComponent {\n /** Nombre del icono registrado con provideIcons() / Icon name registered with provideIcons() */\n name = input.required<string>();\n\n /**\n * Grosor del trazo. Default '2' para estética fina y técnica.\n * Puede sobrescribirse por instancia.\n */\n strokeWidth = input<string>('2');\n\n /**\n * Tamaño del icono. Acepta cualquier unidad CSS válida.\n * Si no se especifica, usa la variable CSS `--neu-icon-size` (1.25rem por defecto).\n */\n size = input<string>('');\n\n /** Tamaño resuelto: usa el input `size` o cae al token CSS. / Resolved size: uses the `size` input or falls back to the CSS token. */\n readonly resolvedSize = computed(() => this.size() || 'var(--neu-icon-size, 1.25rem)');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;AASA;;;;;;;;;;AAUG;MAiBU,gBAAgB,CAAA;;IAE3B,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAU;AAE/B;;;AAGG;IACH,WAAW,GAAG,KAAK,CAAS,GAAG;oFAAC;AAEhC;;;AAGG;IACH,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;IAGf,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,+BAA+B;qFAAC;uGAjB3E,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHjB,CAAA,iFAAA,CAAmF,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAXnF,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,KAAA,EAAA,MAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAcL,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAhB5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,OAAA,EACX,CAAC,MAAM,CAAC,EAAA,aAAA,EACF,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,iBAAiB,EAAE,eAAe;AAClC,wBAAA,qBAAqB,EAAE,UAAU;AACjC,wBAAA,yBAAyB,EAAE,UAAU;AACrC,wBAAA,qBAAqB,EAAE,KAAK;AAC5B,wBAAA,eAAe,EAAE,WAAW;AAC7B,qBAAA,EAAA,QAAA,EACS,CAAA,iFAAA,CAAmF,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA;;;ACjC/F;;AAEG;;;;"}
|
|
@@ -3,22 +3,32 @@ import { input, output, signal, effect, computed, ChangeDetectionStrategy, Compo
|
|
|
3
3
|
import { NeuImageViewerDirective } from '@neural-ui/core/image-viewer';
|
|
4
4
|
|
|
5
5
|
class NeuImageGalleryComponent {
|
|
6
|
-
items = input([],
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
items = input([], /* @ts-ignore */
|
|
7
|
+
...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
8
|
+
initialIndex = input(0, /* @ts-ignore */
|
|
9
|
+
...(ngDevMode ? [{ debugName: "initialIndex" }] : /* istanbul ignore next */ []));
|
|
10
|
+
showThumbnails = input(true, /* @ts-ignore */
|
|
11
|
+
...(ngDevMode ? [{ debugName: "showThumbnails" }] : /* istanbul ignore next */ []));
|
|
12
|
+
thumbnailPosition = input('bottom', /* @ts-ignore */
|
|
13
|
+
...(ngDevMode ? [{ debugName: "thumbnailPosition" }] : /* istanbul ignore next */ []));
|
|
14
|
+
objectFit = input('cover', /* @ts-ignore */
|
|
15
|
+
...(ngDevMode ? [{ debugName: "objectFit" }] : /* istanbul ignore next */ []));
|
|
16
|
+
showCounter = input(true, /* @ts-ignore */
|
|
17
|
+
...(ngDevMode ? [{ debugName: "showCounter" }] : /* istanbul ignore next */ []));
|
|
18
|
+
viewerEnabled = input(true, /* @ts-ignore */
|
|
19
|
+
...(ngDevMode ? [{ debugName: "viewerEnabled" }] : /* istanbul ignore next */ []));
|
|
13
20
|
activeIndexChange = output();
|
|
14
|
-
_activeIndex = signal(0,
|
|
21
|
+
_activeIndex = signal(0, /* @ts-ignore */
|
|
22
|
+
...(ngDevMode ? [{ debugName: "_activeIndex" }] : /* istanbul ignore next */ []));
|
|
15
23
|
constructor() {
|
|
16
24
|
effect(() => {
|
|
17
25
|
this._activeIndex.set(this._clampIndex(this.initialIndex()));
|
|
18
26
|
});
|
|
19
27
|
}
|
|
20
|
-
activeIndex = computed(() => this._clampIndex(this._activeIndex()),
|
|
21
|
-
|
|
28
|
+
activeIndex = computed(() => this._clampIndex(this._activeIndex()), /* @ts-ignore */
|
|
29
|
+
...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
|
|
30
|
+
currentItem = computed(() => this.items()[this.activeIndex()], /* @ts-ignore */
|
|
31
|
+
...(ngDevMode ? [{ debugName: "currentItem" }] : /* istanbul ignore next */ []));
|
|
22
32
|
setActiveIndex(index) {
|
|
23
33
|
const nextIndex = this._clampIndex(index);
|
|
24
34
|
this._activeIndex.set(nextIndex);
|
|
@@ -36,8 +46,8 @@ class NeuImageGalleryComponent {
|
|
|
36
46
|
return 0;
|
|
37
47
|
return Math.max(0, Math.min(total - 1, index));
|
|
38
48
|
}
|
|
39
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
40
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
49
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuImageGalleryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
50
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuImageGalleryComponent, isStandalone: true, selector: "neu-image-gallery", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, initialIndex: { classPropertyName: "initialIndex", publicName: "initialIndex", isSignal: true, isRequired: false, transformFunction: null }, showThumbnails: { classPropertyName: "showThumbnails", publicName: "showThumbnails", isSignal: true, isRequired: false, transformFunction: null }, thumbnailPosition: { classPropertyName: "thumbnailPosition", publicName: "thumbnailPosition", isSignal: true, isRequired: false, transformFunction: null }, objectFit: { classPropertyName: "objectFit", publicName: "objectFit", isSignal: true, isRequired: false, transformFunction: null }, showCounter: { classPropertyName: "showCounter", publicName: "showCounter", isSignal: true, isRequired: false, transformFunction: null }, viewerEnabled: { classPropertyName: "viewerEnabled", publicName: "viewerEnabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeIndexChange: "activeIndexChange" }, ngImport: i0, template: `
|
|
41
51
|
@if (items().length > 0) {
|
|
42
52
|
<div
|
|
43
53
|
class="neu-image-gallery"
|
|
@@ -125,7 +135,7 @@ class NeuImageGalleryComponent {
|
|
|
125
135
|
}
|
|
126
136
|
`, isInline: true, styles: [".neu-image-gallery{display:grid;gap:var(--neu-space-3)}.neu-image-gallery--left{grid-template-columns:88px minmax(0,1fr);align-items:start}.neu-image-gallery__stage{position:relative;border-radius:var(--neu-radius-lg);overflow:hidden;background:color-mix(in srgb,var(--neu-surface-2) 82%,black 18%);border:1px solid var(--neu-border);min-height:280px}.neu-image-gallery__viewer-trigger{display:block;width:100%;height:100%;padding:0;border:none;background:transparent;cursor:zoom-in}.neu-image-gallery__image{display:block;width:100%;height:100%;min-height:280px}.neu-image-gallery__image--contain{object-fit:contain}.neu-image-gallery__image--cover{object-fit:cover}.neu-image-gallery__nav{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border-radius:999px;border:1px solid color-mix(in srgb,var(--neu-surface) 70%,black 30%);background:color-mix(in srgb,var(--neu-surface) 74%,black 26%);color:var(--neu-text);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;z-index:1}.neu-image-gallery__nav:disabled{opacity:.35;cursor:not-allowed}.neu-image-gallery__nav--prev{left:var(--neu-space-3)}.neu-image-gallery__nav--next{right:var(--neu-space-3)}.neu-image-gallery__meta{position:absolute;right:var(--neu-space-3);bottom:var(--neu-space-3);display:flex;gap:var(--neu-space-2);align-items:center}.neu-image-gallery__counter,.neu-image-gallery__caption{display:inline-flex;align-items:center;min-height:30px;padding:0 var(--neu-space-3);border-radius:999px;background:color-mix(in srgb,black 62%,var(--neu-surface) 38%);color:#fff;font-size:var(--neu-text-xs)}.neu-image-gallery__thumbs{display:flex;gap:var(--neu-space-2);overflow:auto;padding-bottom:2px}.neu-image-gallery__thumbs--left{flex-direction:column;max-height:320px;padding-right:4px}.neu-image-gallery__thumb{width:72px;height:72px;flex:0 0 auto;border-radius:var(--neu-radius);overflow:hidden;border:2px solid transparent;background:var(--neu-surface-2);padding:0;cursor:pointer}.neu-image-gallery__thumb--active{border-color:var(--neu-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--neu-primary) 18%,transparent 82%)}.neu-image-gallery__thumb img{width:100%;height:100%;display:block;object-fit:cover}@media(max-width:720px){.neu-image-gallery--left{grid-template-columns:1fr}.neu-image-gallery__thumbs--left{flex-direction:row;max-height:none;padding-right:0}}\n"], dependencies: [{ kind: "directive", type: NeuImageViewerDirective, selector: "[neuImageViewer]", inputs: ["neuImageViewer", "neuIvIndex"], exportAs: ["neuImageViewer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
127
137
|
}
|
|
128
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
138
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuImageGalleryComponent, decorators: [{
|
|
129
139
|
type: Component,
|
|
130
140
|
args: [{ selector: 'neu-image-gallery', imports: [NeuImageViewerDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
131
141
|
@if (items().length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-image-gallery.mjs","sources":["../../../../projects/ui-core/image-gallery/neu-image-gallery.component.ts","../../../../projects/ui-core/image-gallery/neural-ui-core-image-gallery.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NeuImageViewerDirective, type NeuImageViewerItem } from '@neural-ui/core/image-viewer';\n\n@Component({\n selector: 'neu-image-gallery',\n imports: [NeuImageViewerDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (items().length > 0) {\n <div\n class=\"neu-image-gallery\"\n [class.neu-image-gallery--left]=\"thumbnailPosition() === 'left' && showThumbnails()\"\n >\n @if (showThumbnails()) {\n <div\n class=\"neu-image-gallery__thumbs\"\n [class.neu-image-gallery__thumbs--left]=\"thumbnailPosition() === 'left'\"\n >\n @for (item of items(); track item.src; let i = $index) {\n <button\n type=\"button\"\n class=\"neu-image-gallery__thumb\"\n [class.neu-image-gallery__thumb--active]=\"activeIndex() === i\"\n [attr.aria-label]=\"item.alt || 'Image ' + (i + 1)\"\n (click)=\"setActiveIndex(i)\"\n >\n <img [src]=\"item.src\" [alt]=\"item.alt || ''\" />\n </button>\n }\n </div>\n }\n\n <div class=\"neu-image-gallery__stage\">\n @if (items().length > 1) {\n <button\n type=\"button\"\n class=\"neu-image-gallery__nav neu-image-gallery__nav--prev\"\n [disabled]=\"activeIndex() === 0\"\n aria-label=\"Previous image\"\n (click)=\"goPrev()\"\n >\n ‹\n </button>\n <button\n type=\"button\"\n class=\"neu-image-gallery__nav neu-image-gallery__nav--next\"\n [disabled]=\"activeIndex() === items().length - 1\"\n aria-label=\"Next image\"\n (click)=\"goNext()\"\n >\n ›\n </button>\n }\n\n @if (viewerEnabled()) {\n <button\n type=\"button\"\n class=\"neu-image-gallery__viewer-trigger\"\n [neuImageViewer]=\"items()\"\n [neuIvIndex]=\"activeIndex()\"\n [attr.aria-label]=\"currentItem().alt || 'Open image viewer'\"\n >\n <img\n class=\"neu-image-gallery__image\"\n [class.neu-image-gallery__image--contain]=\"objectFit() === 'contain'\"\n [class.neu-image-gallery__image--cover]=\"objectFit() === 'cover'\"\n [src]=\"currentItem().src\"\n [alt]=\"currentItem().alt || ''\"\n />\n </button>\n } @else {\n <img\n class=\"neu-image-gallery__image\"\n [class.neu-image-gallery__image--contain]=\"objectFit() === 'contain'\"\n [class.neu-image-gallery__image--cover]=\"objectFit() === 'cover'\"\n [src]=\"currentItem().src\"\n [alt]=\"currentItem().alt || ''\"\n />\n }\n\n <div class=\"neu-image-gallery__meta\">\n @if (showCounter()) {\n <span class=\"neu-image-gallery__counter\">\n {{ activeIndex() + 1 }} / {{ items().length }}\n </span>\n }\n @if (currentItem().caption) {\n <span class=\"neu-image-gallery__caption\">{{ currentItem().caption }}</span>\n }\n </div>\n </div>\n </div>\n }\n `,\n styleUrl: './neu-image-gallery.component.scss',\n})\nexport class NeuImageGalleryComponent {\n readonly items = input<NeuImageViewerItem[]>([]);\n readonly initialIndex = input<number>(0);\n readonly showThumbnails = input<boolean>(true);\n readonly thumbnailPosition = input<'bottom' | 'left'>('bottom');\n readonly objectFit = input<'cover' | 'contain'>('cover');\n readonly showCounter = input<boolean>(true);\n readonly viewerEnabled = input<boolean>(true);\n\n readonly activeIndexChange = output<number>();\n\n private readonly _activeIndex = signal(0);\n\n constructor() {\n effect(() => {\n this._activeIndex.set(this._clampIndex(this.initialIndex()));\n });\n }\n\n readonly activeIndex = computed(() => this._clampIndex(this._activeIndex()));\n readonly currentItem = computed(() => this.items()[this.activeIndex()]);\n\n setActiveIndex(index: number): void {\n const nextIndex = this._clampIndex(index);\n this._activeIndex.set(nextIndex);\n this.activeIndexChange.emit(nextIndex);\n }\n\n goPrev(): void {\n this.setActiveIndex(this.activeIndex() - 1);\n }\n\n goNext(): void {\n this.setActiveIndex(this.activeIndex() + 1);\n }\n\n private _clampIndex(index: number): number {\n const total = this.items().length;\n if (total === 0) return 0;\n return Math.max(0, Math.min(total - 1, index));\n }\n}\n\nexport type { NeuImageViewerItem } from '@neural-ui/core/image-viewer';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;MAwGa,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-image-gallery.mjs","sources":["../../../../projects/ui-core/image-gallery/neu-image-gallery.component.ts","../../../../projects/ui-core/image-gallery/neural-ui-core-image-gallery.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NeuImageViewerDirective, type NeuImageViewerItem } from '@neural-ui/core/image-viewer';\n\n@Component({\n selector: 'neu-image-gallery',\n imports: [NeuImageViewerDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (items().length > 0) {\n <div\n class=\"neu-image-gallery\"\n [class.neu-image-gallery--left]=\"thumbnailPosition() === 'left' && showThumbnails()\"\n >\n @if (showThumbnails()) {\n <div\n class=\"neu-image-gallery__thumbs\"\n [class.neu-image-gallery__thumbs--left]=\"thumbnailPosition() === 'left'\"\n >\n @for (item of items(); track item.src; let i = $index) {\n <button\n type=\"button\"\n class=\"neu-image-gallery__thumb\"\n [class.neu-image-gallery__thumb--active]=\"activeIndex() === i\"\n [attr.aria-label]=\"item.alt || 'Image ' + (i + 1)\"\n (click)=\"setActiveIndex(i)\"\n >\n <img [src]=\"item.src\" [alt]=\"item.alt || ''\" />\n </button>\n }\n </div>\n }\n\n <div class=\"neu-image-gallery__stage\">\n @if (items().length > 1) {\n <button\n type=\"button\"\n class=\"neu-image-gallery__nav neu-image-gallery__nav--prev\"\n [disabled]=\"activeIndex() === 0\"\n aria-label=\"Previous image\"\n (click)=\"goPrev()\"\n >\n ‹\n </button>\n <button\n type=\"button\"\n class=\"neu-image-gallery__nav neu-image-gallery__nav--next\"\n [disabled]=\"activeIndex() === items().length - 1\"\n aria-label=\"Next image\"\n (click)=\"goNext()\"\n >\n ›\n </button>\n }\n\n @if (viewerEnabled()) {\n <button\n type=\"button\"\n class=\"neu-image-gallery__viewer-trigger\"\n [neuImageViewer]=\"items()\"\n [neuIvIndex]=\"activeIndex()\"\n [attr.aria-label]=\"currentItem().alt || 'Open image viewer'\"\n >\n <img\n class=\"neu-image-gallery__image\"\n [class.neu-image-gallery__image--contain]=\"objectFit() === 'contain'\"\n [class.neu-image-gallery__image--cover]=\"objectFit() === 'cover'\"\n [src]=\"currentItem().src\"\n [alt]=\"currentItem().alt || ''\"\n />\n </button>\n } @else {\n <img\n class=\"neu-image-gallery__image\"\n [class.neu-image-gallery__image--contain]=\"objectFit() === 'contain'\"\n [class.neu-image-gallery__image--cover]=\"objectFit() === 'cover'\"\n [src]=\"currentItem().src\"\n [alt]=\"currentItem().alt || ''\"\n />\n }\n\n <div class=\"neu-image-gallery__meta\">\n @if (showCounter()) {\n <span class=\"neu-image-gallery__counter\">\n {{ activeIndex() + 1 }} / {{ items().length }}\n </span>\n }\n @if (currentItem().caption) {\n <span class=\"neu-image-gallery__caption\">{{ currentItem().caption }}</span>\n }\n </div>\n </div>\n </div>\n }\n `,\n styleUrl: './neu-image-gallery.component.scss',\n})\nexport class NeuImageGalleryComponent {\n readonly items = input<NeuImageViewerItem[]>([]);\n readonly initialIndex = input<number>(0);\n readonly showThumbnails = input<boolean>(true);\n readonly thumbnailPosition = input<'bottom' | 'left'>('bottom');\n readonly objectFit = input<'cover' | 'contain'>('cover');\n readonly showCounter = input<boolean>(true);\n readonly viewerEnabled = input<boolean>(true);\n\n readonly activeIndexChange = output<number>();\n\n private readonly _activeIndex = signal(0);\n\n constructor() {\n effect(() => {\n this._activeIndex.set(this._clampIndex(this.initialIndex()));\n });\n }\n\n readonly activeIndex = computed(() => this._clampIndex(this._activeIndex()));\n readonly currentItem = computed(() => this.items()[this.activeIndex()]);\n\n setActiveIndex(index: number): void {\n const nextIndex = this._clampIndex(index);\n this._activeIndex.set(nextIndex);\n this.activeIndexChange.emit(nextIndex);\n }\n\n goPrev(): void {\n this.setActiveIndex(this.activeIndex() - 1);\n }\n\n goNext(): void {\n this.setActiveIndex(this.activeIndex() + 1);\n }\n\n private _clampIndex(index: number): number {\n const total = this.items().length;\n if (total === 0) return 0;\n return Math.max(0, Math.min(total - 1, index));\n }\n}\n\nexport type { NeuImageViewerItem } from '@neural-ui/core/image-viewer';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -10,14 +10,20 @@ const NEU_IV_DATA = new InjectionToken('NEU_IV_DATA');
|
|
|
10
10
|
*/
|
|
11
11
|
class NeuImageViewerOverlayComponent {
|
|
12
12
|
_data = inject(NEU_IV_DATA);
|
|
13
|
-
_index = signal(this._data.initialIndex,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
_index = signal(this._data.initialIndex, /* @ts-ignore */
|
|
14
|
+
...(ngDevMode ? [{ debugName: "_index" }] : /* istanbul ignore next */ []));
|
|
15
|
+
_scale = signal(1, /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "_scale" }] : /* istanbul ignore next */ []));
|
|
17
|
+
_panX = signal(0, /* @ts-ignore */
|
|
18
|
+
...(ngDevMode ? [{ debugName: "_panX" }] : /* istanbul ignore next */ []));
|
|
19
|
+
_panY = signal(0, /* @ts-ignore */
|
|
20
|
+
...(ngDevMode ? [{ debugName: "_panY" }] : /* istanbul ignore next */ []));
|
|
17
21
|
_dragging = false;
|
|
18
22
|
_dragStart = { x: 0, y: 0, px: 0, py: 0 };
|
|
19
|
-
_current = computed(() => this._data.items[this._index()],
|
|
20
|
-
|
|
23
|
+
_current = computed(() => this._data.items[this._index()], /* @ts-ignore */
|
|
24
|
+
...(ngDevMode ? [{ debugName: "_current" }] : /* istanbul ignore next */ []));
|
|
25
|
+
_transform = computed(() => `translate(${this._panX()}px, ${this._panY()}px) scale(${this._scale()})`, /* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "_transform" }] : /* istanbul ignore next */ []));
|
|
21
27
|
_navigate(dir) {
|
|
22
28
|
this._index.update((i) => Math.max(0, Math.min(this._data.items.length - 1, i + dir)));
|
|
23
29
|
this._resetZoom();
|
|
@@ -80,8 +86,8 @@ class NeuImageViewerOverlayComponent {
|
|
|
80
86
|
break;
|
|
81
87
|
}
|
|
82
88
|
}
|
|
83
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
84
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
89
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuImageViewerOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
90
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuImageViewerOverlayComponent, isStandalone: true, selector: "neu-image-viewer-overlay", host: { attributes: { "aria-modal": "true", "role": "dialog", "aria-label": "Visor de im\u00E1genes", "tabIndex": "0" }, listeners: { "keydown": "_onKey($event)", "click": "_onBackdropClick($event)" }, classAttribute: "neu-iv" }, ngImport: i0, template: `
|
|
85
91
|
<div class="neu-iv__overlay" (click)="$event.stopPropagation()">
|
|
86
92
|
<!-- Toolbar -->
|
|
87
93
|
<div class="neu-iv__toolbar">
|
|
@@ -147,7 +153,7 @@ class NeuImageViewerOverlayComponent {
|
|
|
147
153
|
</div>
|
|
148
154
|
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-iv{position:fixed;inset:0;background:var(--neu-image-viewer-bg);display:flex;flex-direction:column;z-index:1300;outline:none}.neu-iv__overlay{position:relative;display:flex;flex-direction:column;height:100%;width:100%}.neu-iv__toolbar{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;flex-shrink:0}.neu-iv__counter{font-size:.875rem;color:var(--neu-image-viewer-muted)}.neu-iv__toolbar-actions{display:flex;gap:4px}.neu-iv__btn{all:unset;width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:8px;color:#fff;font-size:1.1rem;cursor:pointer;transition:background .1s}.neu-iv__btn:hover{background:var(--neu-image-viewer-btn-hover)}.neu-iv__btn--close{font-size:.875rem}.neu-iv__stage{flex:1;overflow:hidden;display:flex;align-items:center;justify-content:center;cursor:grab;-webkit-user-select:none;user-select:none}.neu-iv__stage:active{cursor:grabbing}.neu-iv__img{max-width:90%;max-height:80vh;object-fit:contain;transform-origin:center;transition:transform 60ms linear;pointer-events:none;border-radius:var(--neu-radius-lg, 12px)}.neu-iv__caption{flex-shrink:0;padding:10px 16px;text-align:center;font-size:.875rem;color:var(--neu-image-viewer-caption)}.neu-iv__arrow{all:unset;position:absolute;top:50%;transform:translateY(-50%);width:48px;height:48px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--neu-image-viewer-arrow-bg);color:#fff;font-size:1.8rem;cursor:pointer;transition:background .12s}.neu-iv__arrow:hover:not(:disabled){background:var(--neu-image-viewer-arrow-hover)}.neu-iv__arrow:disabled{opacity:.25;cursor:default}.neu-iv__arrow--prev{left:16px}.neu-iv__arrow--next{right:16px}.neu-iv-trigger{display:inline-block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
149
155
|
}
|
|
150
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuImageViewerOverlayComponent, decorators: [{
|
|
151
157
|
type: Component,
|
|
152
158
|
args: [{ selector: 'neu-image-viewer-overlay', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
153
159
|
class: 'neu-iv',
|
|
@@ -236,9 +242,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
236
242
|
*/
|
|
237
243
|
class NeuImageViewerDirective {
|
|
238
244
|
/** Puede ser una URL, NeuImageViewerItem o un array de items */
|
|
239
|
-
neuImageViewer = input('',
|
|
245
|
+
neuImageViewer = input('', /* @ts-ignore */
|
|
246
|
+
...(ngDevMode ? [{ debugName: "neuImageViewer" }] : /* istanbul ignore next */ []));
|
|
240
247
|
/** Índice inicial cuando se pasa un array */
|
|
241
|
-
neuIvIndex = input(0,
|
|
248
|
+
neuIvIndex = input(0, /* @ts-ignore */
|
|
249
|
+
...(ngDevMode ? [{ debugName: "neuIvIndex" }] : /* istanbul ignore next */ []));
|
|
242
250
|
_overlay = inject(Overlay);
|
|
243
251
|
_injector = inject(Injector);
|
|
244
252
|
_overlayRef = null;
|
|
@@ -285,10 +293,10 @@ class NeuImageViewerDirective {
|
|
|
285
293
|
return v;
|
|
286
294
|
return [v];
|
|
287
295
|
}
|
|
288
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
289
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
296
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuImageViewerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
297
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.4", type: NeuImageViewerDirective, isStandalone: true, selector: "[neuImageViewer]", inputs: { neuImageViewer: { classPropertyName: "neuImageViewer", publicName: "neuImageViewer", isSignal: true, isRequired: false, transformFunction: null }, neuIvIndex: { classPropertyName: "neuIvIndex", publicName: "neuIvIndex", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "open()" }, styleAttribute: "cursor:pointer", classAttribute: "neu-iv-trigger" }, exportAs: ["neuImageViewer"], ngImport: i0 });
|
|
290
298
|
}
|
|
291
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
299
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuImageViewerDirective, decorators: [{
|
|
292
300
|
type: Directive,
|
|
293
301
|
args: [{
|
|
294
302
|
selector: '[neuImageViewer]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-image-viewer.mjs","sources":["../../../../projects/ui-core/image-viewer/neu-image-viewer.component.ts","../../../../projects/ui-core/image-viewer/neural-ui-core-image-viewer.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n HostListener,\n Injector,\n OnDestroy,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport interface NeuImageViewerItem {\n src: string;\n alt?: string;\n caption?: string;\n}\n\n/** Token que comparte datos entre directiva y overlay */\nimport { InjectionToken } from '@angular/core';\n\nexport const NEU_IV_DATA = new InjectionToken<_NeuIvData>('NEU_IV_DATA');\n\ninterface _NeuIvData {\n items: NeuImageViewerItem[];\n initialIndex: number;\n close: () => void;\n}\n\n/**\n * Componente interno del overlay del visor de imágenes.\n * No debe usarse directamente — es instanciado por la directiva.\n */\n@Component({\n selector: 'neu-image-viewer-overlay',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-iv',\n 'aria-modal': 'true',\n role: 'dialog',\n 'aria-label': 'Visor de imágenes',\n tabIndex: '0',\n '(keydown)': '_onKey($event)',\n '(click)': '_onBackdropClick($event)',\n },\n template: `\n <div class=\"neu-iv__overlay\" (click)=\"$event.stopPropagation()\">\n <!-- Toolbar -->\n <div class=\"neu-iv__toolbar\">\n <span class=\"neu-iv__counter\">{{ _index() + 1 }} / {{ _data.items.length }}</span>\n <div class=\"neu-iv__toolbar-actions\">\n <button type=\"button\" class=\"neu-iv__btn\" aria-label=\"Zoom in\" (click)=\"_zoom(0.25)\">\n +\n </button>\n <button type=\"button\" class=\"neu-iv__btn\" aria-label=\"Zoom out\" (click)=\"_zoom(-0.25)\">\n -\n </button>\n <button type=\"button\" class=\"neu-iv__btn\" aria-label=\"Reset zoom\" (click)=\"_resetZoom()\">\n ⟳\n </button>\n <button\n type=\"button\"\n class=\"neu-iv__btn neu-iv__btn--close\"\n aria-label=\"Cerrar\"\n (click)=\"_data.close()\"\n >\n ✕\n </button>\n </div>\n </div>\n\n <!-- Image -->\n <div class=\"neu-iv__stage\" (wheel)=\"_onWheel($event)\" (mousedown)=\"_onMouseDown($event)\">\n <img\n class=\"neu-iv__img\"\n [src]=\"_current().src\"\n [alt]=\"_current().alt ?? ''\"\n [style.transform]=\"_transform()\"\n draggable=\"false\"\n />\n </div>\n\n <!-- Caption -->\n @if (_current().caption) {\n <div class=\"neu-iv__caption\">{{ _current().caption }}</div>\n }\n\n <!-- Prev/Next arrows -->\n @if (_data.items.length > 1) {\n <button\n type=\"button\"\n class=\"neu-iv__arrow neu-iv__arrow--prev\"\n aria-label=\"Anterior\"\n [disabled]=\"_index() === 0\"\n (click)=\"_navigate(-1)\"\n >\n ‹\n </button>\n <button\n type=\"button\"\n class=\"neu-iv__arrow neu-iv__arrow--next\"\n aria-label=\"Siguiente\"\n [disabled]=\"_index() === _data.items.length - 1\"\n (click)=\"_navigate(1)\"\n >\n ›\n </button>\n }\n </div>\n `,\n styleUrl: './neu-image-viewer.component.scss',\n})\nexport class NeuImageViewerOverlayComponent {\n readonly _data = inject(NEU_IV_DATA);\n readonly _index = signal(this._data.initialIndex);\n readonly _scale = signal(1);\n readonly _panX = signal(0);\n readonly _panY = signal(0);\n\n private _dragging = false;\n private _dragStart = { x: 0, y: 0, px: 0, py: 0 };\n\n readonly _current = computed(() => this._data.items[this._index()]);\n\n readonly _transform = computed(\n () => `translate(${this._panX()}px, ${this._panY()}px) scale(${this._scale()})`,\n );\n\n _navigate(dir: -1 | 1): void {\n this._index.update((i) => Math.max(0, Math.min(this._data.items.length - 1, i + dir)));\n this._resetZoom();\n }\n\n _zoom(delta: number): void {\n this._scale.update((s) => Math.max(0.25, Math.min(5, s + delta)));\n }\n\n _resetZoom(): void {\n this._scale.set(1);\n this._panX.set(0);\n this._panY.set(0);\n }\n\n _onWheel(e: WheelEvent): void {\n e.preventDefault();\n this._zoom(e.deltaY < 0 ? 0.1 : -0.1);\n }\n\n _onMouseDown(e: MouseEvent): void {\n if (e.button !== 0) return;\n this._dragging = true;\n this._dragStart = {\n x: e.clientX,\n y: e.clientY,\n px: this._panX(),\n py: this._panY(),\n };\n const onMove = (ev: MouseEvent) => {\n if (!this._dragging) return;\n this._panX.set(this._dragStart.px + ev.clientX - this._dragStart.x);\n this._panY.set(this._dragStart.py + ev.clientY - this._dragStart.y);\n };\n const onUp = () => {\n this._dragging = false;\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n }\n\n _onBackdropClick(_e: MouseEvent): void {\n this._data.close();\n }\n\n _onKey(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowLeft':\n this._navigate(-1);\n break;\n case 'ArrowRight':\n this._navigate(1);\n break;\n case 'Escape':\n this._data.close();\n break;\n case '+':\n this._zoom(0.25);\n break;\n case '-':\n this._zoom(-0.25);\n break;\n }\n }\n}\n\n/**\n * NeuralUI ImageViewer Directive\n *\n * Adjunta un visor de imágenes en pantalla completa a cualquier elemento.\n *\n * Uso básico (imagen única):\n * <img src=\"photo.jpg\" [neuImageViewer]=\"src\" />\n *\n * Uso con galería:\n * <img src=\"photo.jpg\" [neuImageViewer]=\"items\" [neuIvIndex]=\"0\" />\n */\n@Directive({\n selector: '[neuImageViewer]',\n exportAs: 'neuImageViewer',\n host: {\n class: 'neu-iv-trigger',\n style: 'cursor:pointer',\n '(click)': 'open()',\n },\n})\nexport class NeuImageViewerDirective implements OnDestroy {\n /** Puede ser una URL, NeuImageViewerItem o un array de items */\n readonly neuImageViewer = input<string | NeuImageViewerItem | NeuImageViewerItem[]>('');\n /** Índice inicial cuando se pasa un array */\n readonly neuIvIndex = input<number>(0);\n\n private readonly _overlay = inject(Overlay);\n private readonly _injector = inject(Injector);\n private _overlayRef: OverlayRef | null = null;\n\n open(): void {\n if (this._overlayRef) return;\n\n const items = this._normalizeItems();\n const overlayRef = this._overlay.create({\n hasBackdrop: false,\n scrollStrategy: this._overlay.scrollStrategies.block(),\n positionStrategy: this._overlay.position().global().centerHorizontally().centerVertically(),\n });\n\n const data: _NeuIvData = {\n items,\n initialIndex: Math.max(0, Math.min(this.neuIvIndex(), items.length - 1)),\n close: () => this.close(),\n };\n\n const injector = Injector.create({\n providers: [{ provide: NEU_IV_DATA, useValue: data }],\n parent: this._injector,\n });\n\n const portal = new ComponentPortal(NeuImageViewerOverlayComponent, null, injector);\n overlayRef.attach(portal);\n this._overlayRef = overlayRef;\n\n // Focus overlay for keyboard events\n setTimeout(() => {\n const el = overlayRef.overlayElement?.querySelector<HTMLElement>('.neu-iv');\n el?.focus();\n }, 50);\n }\n\n close(): void {\n this._overlayRef?.detach();\n this._overlayRef?.dispose();\n this._overlayRef = null;\n }\n\n ngOnDestroy(): void {\n this.close();\n }\n\n private _normalizeItems(): NeuImageViewerItem[] {\n const v = this.neuImageViewer();\n if (typeof v === 'string') return [{ src: v }];\n if (Array.isArray(v)) return v;\n return [v];\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-image-viewer.mjs","sources":["../../../../projects/ui-core/image-viewer/neu-image-viewer.component.ts","../../../../projects/ui-core/image-viewer/neural-ui-core-image-viewer.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n HostListener,\n Injector,\n OnDestroy,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport interface NeuImageViewerItem {\n src: string;\n alt?: string;\n caption?: string;\n}\n\n/** Token que comparte datos entre directiva y overlay */\nimport { InjectionToken } from '@angular/core';\n\nexport const NEU_IV_DATA = new InjectionToken<_NeuIvData>('NEU_IV_DATA');\n\ninterface _NeuIvData {\n items: NeuImageViewerItem[];\n initialIndex: number;\n close: () => void;\n}\n\n/**\n * Componente interno del overlay del visor de imágenes.\n * No debe usarse directamente — es instanciado por la directiva.\n */\n@Component({\n selector: 'neu-image-viewer-overlay',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-iv',\n 'aria-modal': 'true',\n role: 'dialog',\n 'aria-label': 'Visor de imágenes',\n tabIndex: '0',\n '(keydown)': '_onKey($event)',\n '(click)': '_onBackdropClick($event)',\n },\n template: `\n <div class=\"neu-iv__overlay\" (click)=\"$event.stopPropagation()\">\n <!-- Toolbar -->\n <div class=\"neu-iv__toolbar\">\n <span class=\"neu-iv__counter\">{{ _index() + 1 }} / {{ _data.items.length }}</span>\n <div class=\"neu-iv__toolbar-actions\">\n <button type=\"button\" class=\"neu-iv__btn\" aria-label=\"Zoom in\" (click)=\"_zoom(0.25)\">\n +\n </button>\n <button type=\"button\" class=\"neu-iv__btn\" aria-label=\"Zoom out\" (click)=\"_zoom(-0.25)\">\n -\n </button>\n <button type=\"button\" class=\"neu-iv__btn\" aria-label=\"Reset zoom\" (click)=\"_resetZoom()\">\n ⟳\n </button>\n <button\n type=\"button\"\n class=\"neu-iv__btn neu-iv__btn--close\"\n aria-label=\"Cerrar\"\n (click)=\"_data.close()\"\n >\n ✕\n </button>\n </div>\n </div>\n\n <!-- Image -->\n <div class=\"neu-iv__stage\" (wheel)=\"_onWheel($event)\" (mousedown)=\"_onMouseDown($event)\">\n <img\n class=\"neu-iv__img\"\n [src]=\"_current().src\"\n [alt]=\"_current().alt ?? ''\"\n [style.transform]=\"_transform()\"\n draggable=\"false\"\n />\n </div>\n\n <!-- Caption -->\n @if (_current().caption) {\n <div class=\"neu-iv__caption\">{{ _current().caption }}</div>\n }\n\n <!-- Prev/Next arrows -->\n @if (_data.items.length > 1) {\n <button\n type=\"button\"\n class=\"neu-iv__arrow neu-iv__arrow--prev\"\n aria-label=\"Anterior\"\n [disabled]=\"_index() === 0\"\n (click)=\"_navigate(-1)\"\n >\n ‹\n </button>\n <button\n type=\"button\"\n class=\"neu-iv__arrow neu-iv__arrow--next\"\n aria-label=\"Siguiente\"\n [disabled]=\"_index() === _data.items.length - 1\"\n (click)=\"_navigate(1)\"\n >\n ›\n </button>\n }\n </div>\n `,\n styleUrl: './neu-image-viewer.component.scss',\n})\nexport class NeuImageViewerOverlayComponent {\n readonly _data = inject(NEU_IV_DATA);\n readonly _index = signal(this._data.initialIndex);\n readonly _scale = signal(1);\n readonly _panX = signal(0);\n readonly _panY = signal(0);\n\n private _dragging = false;\n private _dragStart = { x: 0, y: 0, px: 0, py: 0 };\n\n readonly _current = computed(() => this._data.items[this._index()]);\n\n readonly _transform = computed(\n () => `translate(${this._panX()}px, ${this._panY()}px) scale(${this._scale()})`,\n );\n\n _navigate(dir: -1 | 1): void {\n this._index.update((i) => Math.max(0, Math.min(this._data.items.length - 1, i + dir)));\n this._resetZoom();\n }\n\n _zoom(delta: number): void {\n this._scale.update((s) => Math.max(0.25, Math.min(5, s + delta)));\n }\n\n _resetZoom(): void {\n this._scale.set(1);\n this._panX.set(0);\n this._panY.set(0);\n }\n\n _onWheel(e: WheelEvent): void {\n e.preventDefault();\n this._zoom(e.deltaY < 0 ? 0.1 : -0.1);\n }\n\n _onMouseDown(e: MouseEvent): void {\n if (e.button !== 0) return;\n this._dragging = true;\n this._dragStart = {\n x: e.clientX,\n y: e.clientY,\n px: this._panX(),\n py: this._panY(),\n };\n const onMove = (ev: MouseEvent) => {\n if (!this._dragging) return;\n this._panX.set(this._dragStart.px + ev.clientX - this._dragStart.x);\n this._panY.set(this._dragStart.py + ev.clientY - this._dragStart.y);\n };\n const onUp = () => {\n this._dragging = false;\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n }\n\n _onBackdropClick(_e: MouseEvent): void {\n this._data.close();\n }\n\n _onKey(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowLeft':\n this._navigate(-1);\n break;\n case 'ArrowRight':\n this._navigate(1);\n break;\n case 'Escape':\n this._data.close();\n break;\n case '+':\n this._zoom(0.25);\n break;\n case '-':\n this._zoom(-0.25);\n break;\n }\n }\n}\n\n/**\n * NeuralUI ImageViewer Directive\n *\n * Adjunta un visor de imágenes en pantalla completa a cualquier elemento.\n *\n * Uso básico (imagen única):\n * <img src=\"photo.jpg\" [neuImageViewer]=\"src\" />\n *\n * Uso con galería:\n * <img src=\"photo.jpg\" [neuImageViewer]=\"items\" [neuIvIndex]=\"0\" />\n */\n@Directive({\n selector: '[neuImageViewer]',\n exportAs: 'neuImageViewer',\n host: {\n class: 'neu-iv-trigger',\n style: 'cursor:pointer',\n '(click)': 'open()',\n },\n})\nexport class NeuImageViewerDirective implements OnDestroy {\n /** Puede ser una URL, NeuImageViewerItem o un array de items */\n readonly neuImageViewer = input<string | NeuImageViewerItem | NeuImageViewerItem[]>('');\n /** Índice inicial cuando se pasa un array */\n readonly neuIvIndex = input<number>(0);\n\n private readonly _overlay = inject(Overlay);\n private readonly _injector = inject(Injector);\n private _overlayRef: OverlayRef | null = null;\n\n open(): void {\n if (this._overlayRef) return;\n\n const items = this._normalizeItems();\n const overlayRef = this._overlay.create({\n hasBackdrop: false,\n scrollStrategy: this._overlay.scrollStrategies.block(),\n positionStrategy: this._overlay.position().global().centerHorizontally().centerVertically(),\n });\n\n const data: _NeuIvData = {\n items,\n initialIndex: Math.max(0, Math.min(this.neuIvIndex(), items.length - 1)),\n close: () => this.close(),\n };\n\n const injector = Injector.create({\n providers: [{ provide: NEU_IV_DATA, useValue: data }],\n parent: this._injector,\n });\n\n const portal = new ComponentPortal(NeuImageViewerOverlayComponent, null, injector);\n overlayRef.attach(portal);\n this._overlayRef = overlayRef;\n\n // Focus overlay for keyboard events\n setTimeout(() => {\n const el = overlayRef.overlayElement?.querySelector<HTMLElement>('.neu-iv');\n el?.focus();\n }, 50);\n }\n\n close(): void {\n this._overlayRef?.detach();\n this._overlayRef?.dispose();\n this._overlayRef = null;\n }\n\n ngOnDestroy(): void {\n this.close();\n }\n\n private _normalizeItems(): NeuImageViewerItem[] {\n const v = this.neuImageViewer();\n if (typeof v === 'string') return [{ src: v }];\n if (Array.isArray(v)) return v;\n return [v];\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -12,25 +12,33 @@ let _seq = 0;
|
|
|
12
12
|
*/
|
|
13
13
|
class NeuInputOTPComponent {
|
|
14
14
|
/** Número de celdas / Number of cells */
|
|
15
|
-
length = input(6,
|
|
15
|
+
length = input(6, /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "length" }] : /* istanbul ignore next */ []));
|
|
16
17
|
/** Tipo de caracteres: numeric | alphanumeric / Character type */
|
|
17
|
-
type = input('numeric',
|
|
18
|
+
type = input('numeric', /* @ts-ignore */
|
|
19
|
+
...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
|
|
18
20
|
/** Emitido cuando todas las celdas están completas / Emitted when all cells are filled */
|
|
19
21
|
completed = output();
|
|
20
22
|
/** Emitido en cada cambio parcial / Emitted on each partial change */
|
|
21
23
|
valueChange = output();
|
|
22
24
|
_id = `neu-input-otp-${++_seq}`;
|
|
23
|
-
_cvaDisabled = signal(false,
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
_cvaDisabled = signal(false, /* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
|
|
27
|
+
_digits = signal([], /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "_digits" }] : /* istanbul ignore next */ []));
|
|
29
|
+
_cells = computed(() => Array.from({ length: this.length() }), /* @ts-ignore */
|
|
30
|
+
...(ngDevMode ? [{ debugName: "_cells" }] : /* istanbul ignore next */ []));
|
|
26
31
|
/** Array de dígitos con padding de vacíos — nunca undefined / Digits array padded with empty strings — never undefined */
|
|
27
|
-
_paddedDigits = computed(() => Array.from({ length: this.length() }, (_, i) => this._digits()[i] ?? ''),
|
|
32
|
+
_paddedDigits = computed(() => Array.from({ length: this.length() }, (_, i) => this._digits()[i] ?? ''), /* @ts-ignore */
|
|
33
|
+
...(ngDevMode ? [{ debugName: "_paddedDigits" }] : /* istanbul ignore next */ []));
|
|
28
34
|
hostClasses = computed(() => ({
|
|
29
35
|
'neu-input-otp': true,
|
|
30
36
|
[`neu-input-otp--len-${this.length()}`]: true,
|
|
31
37
|
'neu-input-otp--disabled': this._cvaDisabled(),
|
|
32
|
-
}),
|
|
33
|
-
|
|
38
|
+
}), /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
40
|
+
_cellEls = viewChildren('cellEl', /* @ts-ignore */
|
|
41
|
+
...(ngDevMode ? [{ debugName: "_cellEls" }] : /* istanbul ignore next */ []));
|
|
34
42
|
_onChange = () => { };
|
|
35
43
|
_onTouched = () => { };
|
|
36
44
|
writeValue(val) {
|
|
@@ -126,8 +134,8 @@ class NeuInputOTPComponent {
|
|
|
126
134
|
_focusCell(index) {
|
|
127
135
|
this._cellEls()[index]?.nativeElement.focus();
|
|
128
136
|
}
|
|
129
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
130
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
137
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuInputOTPComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
138
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuInputOTPComponent, isStandalone: true, selector: "neu-input-otp", inputs: { length: { classPropertyName: "length", publicName: "length", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { completed: "completed", valueChange: "valueChange" }, host: { properties: { "class": "hostClasses()" } }, providers: [
|
|
131
139
|
{
|
|
132
140
|
provide: NG_VALUE_ACCESSOR,
|
|
133
141
|
useExisting: forwardRef(() => NeuInputOTPComponent),
|
|
@@ -154,7 +162,7 @@ class NeuInputOTPComponent {
|
|
|
154
162
|
}
|
|
155
163
|
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-input-otp{display:inline-flex;align-items:center;flex-wrap:wrap;max-width:100%;gap:var(--neu-otp-gap, 8px)}.neu-input-otp--disabled{opacity:.5;pointer-events:none}.neu-input-otp__cell{flex:0 0 auto;width:var(--neu-otp-cell-size, 44px);height:var(--neu-otp-cell-size, 44px);text-align:center;font-size:1.25rem;font-weight:600;border:2px solid var(--neu-otp-cell-border, var(--neu-border-color, #d1d5db));border-radius:var(--neu-otp-cell-radius, var(--neu-radius-md, 8px));background:var(--neu-otp-cell-bg, var(--neu-surface-1, #fff));color:var(--neu-text-primary, #111);caret-color:var(--neu-color-primary, #0ea5e9);outline:none;transition:border-color .15s,box-shadow .15s}.neu-input-otp__cell:focus{border-color:var(--neu-color-primary, #0ea5e9);box-shadow:0 0 0 3px var(--neu-focus-ring-alpha, rgba(14, 165, 233, .25))}.neu-input-otp__cell.neu-input-otp__cell--filled{border-color:var(--neu-color-primary, #0ea5e9)}.neu-input-otp__cell::-webkit-inner-spin-button,.neu-input-otp__cell::-webkit-outer-spin-button{display:none}.neu-input-otp__cell{-moz-appearance:textfield}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
156
164
|
}
|
|
157
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuInputOTPComponent, decorators: [{
|
|
158
166
|
type: Component,
|
|
159
167
|
args: [{ selector: 'neu-input-otp', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class]': 'hostClasses()' }, providers: [
|
|
160
168
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-input-otp.mjs","sources":["../../../../projects/ui-core/input-otp/neu-input-otp.component.ts","../../../../projects/ui-core/input-otp/neural-ui-core-input-otp.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nlet _seq = 0;\n\n/**\n * NeuralUI InputOTP Component\n *\n * N-digit OTP code input split into individual cells. Implements CVA.\n *\n * Uso: <neu-input-otp [length]=\"6\" (completed)=\"onOtp($event)\" formControlName=\"code\" />\n */\n@Component({\n selector: 'neu-input-otp',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClasses()' },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuInputOTPComponent),\n multi: true,\n },\n ],\n template: `\n @for (cell of _cells(); track $index) {\n <input\n #cellEl\n class=\"neu-input-otp__cell\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"1\"\n [id]=\"_id + '_' + $index\"\n [value]=\"_paddedDigits()[$index]\"\n [disabled]=\"_cvaDisabled()\"\n [attr.aria-label]=\"'Dígito ' + ($index + 1) + ' de ' + length()\"\n [class.neu-input-otp__cell--filled]=\"!!_paddedDigits()[$index]\"\n (input)=\"onCellInput($event, $index)\"\n (keydown)=\"onKeyDown($event, $index)\"\n (paste)=\"onPaste($event)\"\n (focus)=\"onFocus($index)\"\n />\n }\n `,\n styleUrl: './neu-input-otp.component.scss',\n})\nexport class NeuInputOTPComponent implements ControlValueAccessor {\n /** Número de celdas / Number of cells */\n readonly length = input<number>(6);\n\n /** Tipo de caracteres: numeric | alphanumeric / Character type */\n readonly type = input<'numeric' | 'alphanumeric'>('numeric');\n\n /** Emitido cuando todas las celdas están completas / Emitted when all cells are filled */\n readonly completed = output<string>();\n\n /** Emitido en cada cambio parcial / Emitted on each partial change */\n readonly valueChange = output<string>();\n\n readonly _id = `neu-input-otp-${++_seq}`;\n readonly _cvaDisabled = signal(false);\n readonly _digits = signal<string[]>([]);\n\n readonly _cells = computed(() => Array.from({ length: this.length() }));\n\n /** Array de dígitos con padding de vacíos — nunca undefined / Digits array padded with empty strings — never undefined */\n readonly _paddedDigits = computed(() =>\n Array.from({ length: this.length() }, (_, i) => this._digits()[i] ?? ''),\n );\n\n readonly hostClasses = computed(() => ({\n 'neu-input-otp': true,\n [`neu-input-otp--len-${this.length()}`]: true,\n 'neu-input-otp--disabled': this._cvaDisabled(),\n }));\n\n private readonly _cellEls = viewChildren<ElementRef<HTMLInputElement>>('cellEl');\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: string | null): void {\n const str = (val ?? '').substring(0, this.length());\n this._digits.set(str.split(''));\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this._cvaDisabled.set(disabled);\n }\n\n onCellInput(event: Event, index: number): void {\n const input = event.target as HTMLInputElement;\n const char = this._sanitize(input.value.slice(-1));\n input.value = char;\n this._digits.update((d) => {\n const copy = [...d];\n copy[index] = char;\n return copy;\n });\n const value = this._digits().join('');\n this._onChange(value);\n this.valueChange.emit(value);\n if (char && index < this.length() - 1) {\n this._focusCell(index + 1);\n }\n if (value.length === this.length() && this._digits().every((d) => d !== '')) {\n this.completed.emit(value);\n }\n }\n\n onKeyDown(event: KeyboardEvent, index: number): void {\n if (event.key === 'Backspace') {\n const d = this._digits();\n if (d[index]) {\n this._digits.update((d) => {\n const c = [...d];\n c[index] = '';\n return c;\n });\n const value = this._digits().join('');\n this._onChange(value);\n this.valueChange.emit(value);\n } else if (index > 0) {\n this._focusCell(index - 1);\n }\n } else if (event.key === 'ArrowLeft' && index > 0) {\n this._focusCell(index - 1);\n } else if (event.key === 'ArrowRight' && index < this.length() - 1) {\n this._focusCell(index + 1);\n }\n }\n\n onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n const raw = event.clipboardData?.getData('text') ?? '';\n const sanitized = raw\n .split('')\n .map((c) => this._sanitize(c))\n .filter(Boolean);\n const digits = Array.from({ length: this.length() }, (_, i) => sanitized[i] ?? '');\n this._digits.set(digits);\n const value = digits.join('');\n this._onChange(value);\n this.valueChange.emit(value);\n const lastFilled = Math.min(sanitized.length, this.length() - 1);\n this._focusCell(lastFilled);\n if (value.replace(/\\s/g, '').length === this.length()) {\n this.completed.emit(value);\n }\n }\n\n onFocus(index: number): void {\n this._onTouched();\n const el = this._cellEls()[index]?.nativeElement;\n el?.select();\n }\n\n clear(): void {\n this._digits.set([]);\n this._onChange('');\n this.valueChange.emit('');\n this._focusCell(0);\n }\n\n private _sanitize(char: string): string {\n if (!char) return '';\n return this.type() === 'numeric' ? (/\\d/.test(char) ? char : '') : char.slice(0, 1);\n }\n\n private _focusCell(index: number): void {\n this._cellEls()[index]?.nativeElement.focus();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"neural-ui-core-input-otp.mjs","sources":["../../../../projects/ui-core/input-otp/neu-input-otp.component.ts","../../../../projects/ui-core/input-otp/neural-ui-core-input-otp.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nlet _seq = 0;\n\n/**\n * NeuralUI InputOTP Component\n *\n * N-digit OTP code input split into individual cells. Implements CVA.\n *\n * Uso: <neu-input-otp [length]=\"6\" (completed)=\"onOtp($event)\" formControlName=\"code\" />\n */\n@Component({\n selector: 'neu-input-otp',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClasses()' },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuInputOTPComponent),\n multi: true,\n },\n ],\n template: `\n @for (cell of _cells(); track $index) {\n <input\n #cellEl\n class=\"neu-input-otp__cell\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"1\"\n [id]=\"_id + '_' + $index\"\n [value]=\"_paddedDigits()[$index]\"\n [disabled]=\"_cvaDisabled()\"\n [attr.aria-label]=\"'Dígito ' + ($index + 1) + ' de ' + length()\"\n [class.neu-input-otp__cell--filled]=\"!!_paddedDigits()[$index]\"\n (input)=\"onCellInput($event, $index)\"\n (keydown)=\"onKeyDown($event, $index)\"\n (paste)=\"onPaste($event)\"\n (focus)=\"onFocus($index)\"\n />\n }\n `,\n styleUrl: './neu-input-otp.component.scss',\n})\nexport class NeuInputOTPComponent implements ControlValueAccessor {\n /** Número de celdas / Number of cells */\n readonly length = input<number>(6);\n\n /** Tipo de caracteres: numeric | alphanumeric / Character type */\n readonly type = input<'numeric' | 'alphanumeric'>('numeric');\n\n /** Emitido cuando todas las celdas están completas / Emitted when all cells are filled */\n readonly completed = output<string>();\n\n /** Emitido en cada cambio parcial / Emitted on each partial change */\n readonly valueChange = output<string>();\n\n readonly _id = `neu-input-otp-${++_seq}`;\n readonly _cvaDisabled = signal(false);\n readonly _digits = signal<string[]>([]);\n\n readonly _cells = computed(() => Array.from({ length: this.length() }));\n\n /** Array de dígitos con padding de vacíos — nunca undefined / Digits array padded with empty strings — never undefined */\n readonly _paddedDigits = computed(() =>\n Array.from({ length: this.length() }, (_, i) => this._digits()[i] ?? ''),\n );\n\n readonly hostClasses = computed(() => ({\n 'neu-input-otp': true,\n [`neu-input-otp--len-${this.length()}`]: true,\n 'neu-input-otp--disabled': this._cvaDisabled(),\n }));\n\n private readonly _cellEls = viewChildren<ElementRef<HTMLInputElement>>('cellEl');\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: string | null): void {\n const str = (val ?? '').substring(0, this.length());\n this._digits.set(str.split(''));\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this._cvaDisabled.set(disabled);\n }\n\n onCellInput(event: Event, index: number): void {\n const input = event.target as HTMLInputElement;\n const char = this._sanitize(input.value.slice(-1));\n input.value = char;\n this._digits.update((d) => {\n const copy = [...d];\n copy[index] = char;\n return copy;\n });\n const value = this._digits().join('');\n this._onChange(value);\n this.valueChange.emit(value);\n if (char && index < this.length() - 1) {\n this._focusCell(index + 1);\n }\n if (value.length === this.length() && this._digits().every((d) => d !== '')) {\n this.completed.emit(value);\n }\n }\n\n onKeyDown(event: KeyboardEvent, index: number): void {\n if (event.key === 'Backspace') {\n const d = this._digits();\n if (d[index]) {\n this._digits.update((d) => {\n const c = [...d];\n c[index] = '';\n return c;\n });\n const value = this._digits().join('');\n this._onChange(value);\n this.valueChange.emit(value);\n } else if (index > 0) {\n this._focusCell(index - 1);\n }\n } else if (event.key === 'ArrowLeft' && index > 0) {\n this._focusCell(index - 1);\n } else if (event.key === 'ArrowRight' && index < this.length() - 1) {\n this._focusCell(index + 1);\n }\n }\n\n onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n const raw = event.clipboardData?.getData('text') ?? '';\n const sanitized = raw\n .split('')\n .map((c) => this._sanitize(c))\n .filter(Boolean);\n const digits = Array.from({ length: this.length() }, (_, i) => sanitized[i] ?? '');\n this._digits.set(digits);\n const value = digits.join('');\n this._onChange(value);\n this.valueChange.emit(value);\n const lastFilled = Math.min(sanitized.length, this.length() - 1);\n this._focusCell(lastFilled);\n if (value.replace(/\\s/g, '').length === this.length()) {\n this.completed.emit(value);\n }\n }\n\n onFocus(index: number): void {\n this._onTouched();\n const el = this._cellEls()[index]?.nativeElement;\n el?.select();\n }\n\n clear(): void {\n this._digits.set([]);\n this._onChange('');\n this.valueChange.emit('');\n this._focusCell(0);\n }\n\n private _sanitize(char: string): string {\n if (!char) return '';\n return this.type() === 'numeric' ? (/\\d/.test(char) ? char : '') : char.slice(0, 1);\n }\n\n private _focusCell(index: number): void {\n this._cellEls()[index]?.nativeElement.focus();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|