@neural-ui/core 1.6.0 → 1.6.2
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 +5 -5
- package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
- package/fesm2022/neural-ui-core-alert.mjs +3 -3
- package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
- package/fesm2022/neural-ui-core-autocomplete.mjs +3 -3
- package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
- package/fesm2022/neural-ui-core-avatar.mjs +3 -3
- package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-badge.mjs +3 -3
- package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
- package/fesm2022/neural-ui-core-block-ui.mjs +6 -6
- package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
- package/fesm2022/neural-ui-core-breadcrumb.mjs +3 -3
- package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
- package/fesm2022/neural-ui-core-button.mjs +3 -3
- package/fesm2022/neural-ui-core-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-calendar.mjs +41 -33
- package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-card.mjs +3 -3
- package/fesm2022/neural-ui-core-card.mjs.map +1 -1
- package/fesm2022/neural-ui-core-chart.mjs +3 -3
- package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
- package/fesm2022/neural-ui-core-checkbox.mjs +3 -3
- package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
- package/fesm2022/neural-ui-core-chip.mjs +3 -3
- package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-code-block.mjs +4 -3
- package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
- package/fesm2022/neural-ui-core-color-picker.mjs +3 -3
- package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
- package/fesm2022/neural-ui-core-command-palette.mjs +6 -6
- 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-confirm-dialog.mjs.map +1 -1
- package/fesm2022/neural-ui-core-context-menu.mjs +6 -6
- package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
- package/fesm2022/neural-ui-core-dashboard-grid.mjs +3 -3
- package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
- package/fesm2022/neural-ui-core-date-input.mjs +3 -3
- package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-divider.mjs +3 -3
- package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
- package/fesm2022/neural-ui-core-empty-state.mjs +3 -3
- package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-filter-bar.mjs +3 -3
- package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-icon.mjs +3 -3
- package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
- package/fesm2022/neural-ui-core-image-gallery.mjs +3 -3
- package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
- package/fesm2022/neural-ui-core-image-viewer.mjs +6 -6
- package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
- package/fesm2022/neural-ui-core-input-otp.mjs +3 -3
- package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
- package/fesm2022/neural-ui-core-input.mjs +3 -3
- package/fesm2022/neural-ui-core-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-kanban.mjs +5 -5
- package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
- package/fesm2022/neural-ui-core-knob.mjs +3 -3
- package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
- package/fesm2022/neural-ui-core-meter-group.mjs +3 -3
- package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-modal.mjs +6 -6
- package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
- package/fesm2022/neural-ui-core-multiselect.mjs +6 -6
- package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
- package/fesm2022/neural-ui-core-nav.mjs +3 -3
- package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
- package/fesm2022/neural-ui-core-notification-center.mjs +21 -7
- package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
- package/fesm2022/neural-ui-core-number-input.mjs +3 -3
- package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-pagination.mjs +3 -3
- package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
- package/fesm2022/neural-ui-core-popover.mjs +6 -6
- package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
- package/fesm2022/neural-ui-core-progress-bar.mjs +3 -3
- package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-radio.mjs +6 -6
- package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
- package/fesm2022/neural-ui-core-rating.mjs +3 -3
- package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
- package/fesm2022/neural-ui-core-rich-text-editor.mjs +13 -5
- package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -1
- package/fesm2022/neural-ui-core-scheduler-gantt.mjs +3 -3
- package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
- package/fesm2022/neural-ui-core-select.mjs +9 -9
- package/fesm2022/neural-ui-core-select.mjs.map +1 -1
- package/fesm2022/neural-ui-core-sidebar.mjs +5 -5
- package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-skeleton.mjs +3 -3
- package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
- package/fesm2022/neural-ui-core-slider.mjs +3 -3
- package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
- package/fesm2022/neural-ui-core-spinner.mjs +3 -3
- package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
- package/fesm2022/neural-ui-core-split-button.mjs +3 -3
- package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-splitter.mjs +3 -3
- package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
- package/fesm2022/neural-ui-core-stats-card.mjs +3 -3
- package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
- package/fesm2022/neural-ui-core-stepper.mjs +3 -3
- package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
- package/fesm2022/neural-ui-core-switch.mjs +3 -3
- package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
- package/fesm2022/neural-ui-core-table.mjs +6 -6
- package/fesm2022/neural-ui-core-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tabs.mjs +6 -6
- package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
- package/fesm2022/neural-ui-core-textarea.mjs +3 -3
- package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
- package/fesm2022/neural-ui-core-timeline-grid.mjs +3 -3
- package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
- package/fesm2022/neural-ui-core-timeline.mjs +3 -3
- package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toast.mjs +21 -7
- package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toggle-button-group.mjs +3 -3
- package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toolbar.mjs +3 -3
- package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tooltip.mjs +6 -6
- package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree-table.mjs +3 -3
- package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree.mjs +3 -3
- package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
- package/fesm2022/neural-ui-core-uploader.mjs +3 -3
- package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
- package/fesm2022/neural-ui-core-url-state.mjs +3 -3
- package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-virtual-list.mjs +6 -6
- package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
- package/package.json +6 -6
- 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-notification-center.mjs","sources":["../../../../projects/ui-core/notification-center/neu-notification-center.component.ts","../../../../projects/ui-core/notification-center/neural-ui-core-notification-center.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n OnDestroy,\n ViewEncapsulation,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { ConnectedPosition, Overlay, OverlayModule } from '@angular/cdk/overlay';\n\nexport type NeuNotificationType = 'info' | 'success' | 'warning' | 'error';\n\nexport interface NeuNotification {\n id: string;\n type: NeuNotificationType;\n title?: string;\n message: string;\n /** Auto-dismiss duration in ms (0 = persistent) */\n duration?: number;\n /** Icon text / emoji */\n icon?: string;\n timestamp: Date;\n read: boolean;\n}\n\nexport interface NeuNotificationOptions extends Omit<\n NeuNotification,\n 'id' | 'timestamp' | 'read'\n> {}\n\nconst DEFAULT_ICONS: Record<NeuNotificationType, string> = {\n info: 'ℹ️',\n success: '✅',\n warning: '⚠️',\n error: '❌',\n};\n\nlet _idSeq = 0;\n\n/**\n * NeuralUI NotificationService\n *\n * Servicio inyectable que gestiona la cola de notificaciones.\n *\n * Uso:\n * inject(NeuNotificationService).push({ type: 'success', message: '¡Guardado!' });\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuNotificationService {\n readonly notifications = signal<NeuNotification[]>([]);\n\n readonly unreadCount = computed(() => this.notifications().filter((n) => !n.read).length);\n\n /** Agrega una notificación / Adds a notification */\n push(opts: Partial<NeuNotificationOptions> & Pick<NeuNotificationOptions, 'message'>): string {\n const id = `neu-notif-${++_idSeq}`;\n const n: NeuNotification = {\n id,\n type: opts.type ?? 'info',\n title: opts.title,\n message: opts.message,\n icon: opts.icon ?? DEFAULT_ICONS[opts.type ?? 'info'],\n duration: opts.duration ?? 5000,\n timestamp: new Date(),\n read: false,\n };\n this.notifications.update((list) => [n, ...list]);\n\n if (n.duration && n.duration > 0) {\n setTimeout(() => this.remove(id), n.duration);\n }\n return id;\n }\n\n /** Elimina una notificación / Removes a notification */\n remove(id: string): void {\n this.notifications.update((list) => list.filter((n) => n.id !== id));\n }\n\n /** Marca todas como leídas / Marks all as read */\n markAllRead(): void {\n this.notifications.update((list) => list.map((n) => ({ ...n, read: true })));\n }\n\n /** Elimina todas / Clears all */\n clearAll(): void {\n this.notifications.set([]);\n }\n}\n\nlet _panelSeq = 0;\n\n/**\n * NeuralUI NotificationCenter Component\n *\n * Icono de campana con badge de no leídos y panel de notificaciones\n * deslizante. Consume NeuNotificationService.\n *\n * Uso:\n * <neu-notification-center />\n */\n@Component({\n selector: 'neu-notification-center',\n imports: [OverlayModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-nc',\n '[attr.aria-label]': '\"Centro de notificaciones\"',\n },\n template: `\n <!-- Bell button -->\n <button\n cdkOverlayOrigin\n #notificationOrigin=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"neu-nc__bell\"\n [attr.aria-expanded]=\"_isOpen()\"\n [attr.aria-controls]=\"_panelId\"\n [attr.aria-label]=\"'Notificaciones. ' + _svc.unreadCount() + ' sin leer'\"\n (click)=\"_toggle()\"\n >\n <span class=\"neu-nc__bell-icon\" aria-hidden=\"true\">🔔</span>\n @if (_svc.unreadCount() > 0) {\n <span class=\"neu-nc__badge\" aria-hidden=\"true\">{{\n _svc.unreadCount() > 99 ? '99+' : _svc.unreadCount()\n }}</span>\n }\n </button>\n\n <!-- Panel -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"notificationOrigin\"\n [cdkConnectedOverlayOpen]=\"_isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"_viewportMargin\"\n (backdropClick)=\"_isOpen.set(false)\"\n (detach)=\"_isOpen.set(false)\"\n >\n <div\n class=\"neu-nc__panel\"\n [id]=\"_panelId\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label=\"Notificaciones\"\n >\n <div class=\"neu-nc__panel-header\">\n <span class=\"neu-nc__panel-title\">Notificaciones</span>\n <div class=\"neu-nc__panel-actions\">\n @if (_svc.unreadCount() > 0) {\n <button type=\"button\" class=\"neu-nc__action-btn\" (click)=\"_svc.markAllRead()\">\n Leer todo\n </button>\n }\n @if (_svc.notifications().length > 0) {\n <button type=\"button\" class=\"neu-nc__action-btn\" (click)=\"_svc.clearAll()\">\n Limpiar\n </button>\n }\n </div>\n </div>\n\n <div class=\"neu-nc__list\" role=\"list\">\n @if (!_svc.notifications().length) {\n <div class=\"neu-nc__empty\" role=\"status\">No hay notificaciones</div>\n }\n @for (n of _svc.notifications(); track n.id) {\n <div\n class=\"neu-nc__item\"\n role=\"listitem\"\n [class.neu-nc__item--unread]=\"!n.read\"\n [class]=\"'neu-nc__item--' + n.type\"\n >\n <span class=\"neu-nc__item-icon\" aria-hidden=\"true\">{{ n.icon }}</span>\n <div class=\"neu-nc__item-body\">\n @if (n.title) {\n <p class=\"neu-nc__item-title\">{{ n.title }}</p>\n }\n <p class=\"neu-nc__item-msg\">{{ n.message }}</p>\n <time class=\"neu-nc__item-time\" [dateTime]=\"n.timestamp.toISOString()\">\n {{ _relativeTime(n.timestamp) }}\n </time>\n </div>\n <button\n type=\"button\"\n class=\"neu-nc__item-close\"\n [attr.aria-label]=\"'Cerrar notificación'\"\n (click)=\"_svc.remove(n.id)\"\n >\n ×\n </button>\n </div>\n }\n </div>\n </div>\n </ng-template>\n `,\n styleUrl: './neu-notification-center.component.scss',\n})\nexport class NeuNotificationCenterComponent {\n readonly _svc = inject(NeuNotificationService);\n private readonly overlay = inject(Overlay);\n readonly _isOpen = signal(false);\n readonly _panelId = `neu-nc-panel-${++_panelSeq}`;\n readonly _viewportMargin = 16;\n readonly overlayPositions: ConnectedPosition[] = [\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8,\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8,\n },\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 8,\n },\n ];\n readonly overlayScrollStrategy = this.overlay.scrollStrategies.reposition();\n\n _toggle(): void {\n const opening = !this._isOpen();\n this._isOpen.set(opening);\n if (opening) {\n // Mark all as read when panel opens\n setTimeout(() => this._svc.markAllRead(), 500);\n }\n }\n\n _relativeTime(date: Date): string {\n const diff = Date.now() - date.getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'Ahora';\n if (mins < 60) return `Hace ${mins} min`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `Hace ${hours}h`;\n return `Hace ${Math.floor(hours / 24)}d`;\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-notification-center.mjs","sources":["../../../../projects/ui-core/notification-center/neu-notification-center.component.ts","../../../../projects/ui-core/notification-center/neural-ui-core-notification-center.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n OnDestroy,\n ViewEncapsulation,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { ConnectedPosition, Overlay, OverlayModule } from '@angular/cdk/overlay';\n\nexport type NeuNotificationType = 'info' | 'success' | 'warning' | 'error';\n\nexport interface NeuNotification {\n id: string;\n type: NeuNotificationType;\n title?: string;\n message: string;\n /** Auto-dismiss duration in ms (0 = persistent) */\n duration?: number;\n /** Icon text / emoji */\n icon?: string;\n timestamp: Date;\n read: boolean;\n}\n\nexport interface NeuNotificationOptions extends Omit<\n NeuNotification,\n 'id' | 'timestamp' | 'read'\n> {}\n\nconst DEFAULT_ICONS: Record<NeuNotificationType, string> = {\n info: 'ℹ️',\n success: '✅',\n warning: '⚠️',\n error: '❌',\n};\n\nlet _idSeq = 0;\n\n/**\n * NeuralUI NotificationService\n *\n * Servicio inyectable que gestiona la cola de notificaciones.\n *\n * Uso:\n * inject(NeuNotificationService).push({ type: 'success', message: '¡Guardado!' });\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuNotificationService {\n readonly notifications = signal<NeuNotification[]>([]);\n\n readonly unreadCount = computed(() => this.notifications().filter((n) => !n.read).length);\n\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n /** Agrega una notificación / Adds a notification */\n push(opts: Partial<NeuNotificationOptions> & Pick<NeuNotificationOptions, 'message'>): string {\n const id = `neu-notif-${++_idSeq}`;\n const n: NeuNotification = {\n id,\n type: opts.type ?? 'info',\n title: opts.title,\n message: opts.message,\n icon: opts.icon ?? DEFAULT_ICONS[opts.type ?? 'info'],\n duration: opts.duration ?? 5000,\n timestamp: new Date(),\n read: false,\n };\n this.notifications.update((list) => [n, ...list]);\n\n if (n.duration && n.duration > 0) {\n const timer = setTimeout(() => this.remove(id), n.duration);\n this.timers.set(id, timer);\n }\n return id;\n }\n\n /** Elimina una notificación / Removes a notification */\n remove(id: string): void {\n this.clearTimer(id);\n this.notifications.update((list) => list.filter((n) => n.id !== id));\n }\n\n /** Marca todas como leídas / Marks all as read */\n markAllRead(): void {\n this.notifications.update((list) => list.map((n) => ({ ...n, read: true })));\n }\n\n /** Elimina todas / Clears all */\n clearAll(): void {\n for (const timer of this.timers.values()) {\n clearTimeout(timer);\n }\n this.timers.clear();\n this.notifications.set([]);\n }\n\n private clearTimer(id: string): void {\n const timer = this.timers.get(id);\n if (!timer) return;\n clearTimeout(timer);\n this.timers.delete(id);\n }\n}\n\nlet _panelSeq = 0;\n\n/**\n * NeuralUI NotificationCenter Component\n *\n * Icono de campana con badge de no leídos y panel de notificaciones\n * deslizante. Consume NeuNotificationService.\n *\n * Uso:\n * <neu-notification-center />\n */\n@Component({\n selector: 'neu-notification-center',\n imports: [OverlayModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-nc',\n '[attr.aria-label]': '\"Centro de notificaciones\"',\n },\n template: `\n <!-- Bell button -->\n <button\n cdkOverlayOrigin\n #notificationOrigin=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"neu-nc__bell\"\n [attr.aria-expanded]=\"_isOpen()\"\n [attr.aria-controls]=\"_panelId\"\n [attr.aria-label]=\"'Notificaciones. ' + _svc.unreadCount() + ' sin leer'\"\n (click)=\"_toggle()\"\n >\n <span class=\"neu-nc__bell-icon\" aria-hidden=\"true\">🔔</span>\n @if (_svc.unreadCount() > 0) {\n <span class=\"neu-nc__badge\" aria-hidden=\"true\">{{\n _svc.unreadCount() > 99 ? '99+' : _svc.unreadCount()\n }}</span>\n }\n </button>\n\n <!-- Panel -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"notificationOrigin\"\n [cdkConnectedOverlayOpen]=\"_isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"_viewportMargin\"\n (backdropClick)=\"_isOpen.set(false)\"\n (detach)=\"_isOpen.set(false)\"\n >\n <div\n class=\"neu-nc__panel\"\n [id]=\"_panelId\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label=\"Notificaciones\"\n >\n <div class=\"neu-nc__panel-header\">\n <span class=\"neu-nc__panel-title\">Notificaciones</span>\n <div class=\"neu-nc__panel-actions\">\n @if (_svc.unreadCount() > 0) {\n <button type=\"button\" class=\"neu-nc__action-btn\" (click)=\"_svc.markAllRead()\">\n Leer todo\n </button>\n }\n @if (_svc.notifications().length > 0) {\n <button type=\"button\" class=\"neu-nc__action-btn\" (click)=\"_svc.clearAll()\">\n Limpiar\n </button>\n }\n </div>\n </div>\n\n <div class=\"neu-nc__list\" role=\"list\">\n @if (!_svc.notifications().length) {\n <div class=\"neu-nc__empty\" role=\"status\">No hay notificaciones</div>\n }\n @for (n of _svc.notifications(); track n.id) {\n <div\n class=\"neu-nc__item\"\n role=\"listitem\"\n [class.neu-nc__item--unread]=\"!n.read\"\n [class]=\"'neu-nc__item--' + n.type\"\n >\n <span class=\"neu-nc__item-icon\" aria-hidden=\"true\">{{ n.icon }}</span>\n <div class=\"neu-nc__item-body\">\n @if (n.title) {\n <p class=\"neu-nc__item-title\">{{ n.title }}</p>\n }\n <p class=\"neu-nc__item-msg\">{{ n.message }}</p>\n <time class=\"neu-nc__item-time\" [dateTime]=\"n.timestamp.toISOString()\">\n {{ _relativeTime(n.timestamp) }}\n </time>\n </div>\n <button\n type=\"button\"\n class=\"neu-nc__item-close\"\n [attr.aria-label]=\"'Cerrar notificación'\"\n (click)=\"_svc.remove(n.id)\"\n >\n ×\n </button>\n </div>\n }\n </div>\n </div>\n </ng-template>\n `,\n styleUrl: './neu-notification-center.component.scss',\n})\nexport class NeuNotificationCenterComponent {\n readonly _svc = inject(NeuNotificationService);\n private readonly overlay = inject(Overlay);\n readonly _isOpen = signal(false);\n readonly _panelId = `neu-nc-panel-${++_panelSeq}`;\n readonly _viewportMargin = 16;\n readonly overlayPositions: ConnectedPosition[] = [\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 8,\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -8,\n },\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 8,\n },\n ];\n readonly overlayScrollStrategy = this.overlay.scrollStrategies.reposition();\n\n _toggle(): void {\n const opening = !this._isOpen();\n this._isOpen.set(opening);\n if (opening) {\n // Mark all as read when panel opens\n setTimeout(() => this._svc.markAllRead(), 500);\n }\n }\n\n _relativeTime(date: Date): string {\n const diff = Date.now() - date.getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'Ahora';\n if (mins < 60) return `Hace ${mins} min`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `Hace ${hours}h`;\n return `Hace ${Math.floor(hours / 24)}d`;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -91,8 +91,8 @@ class NeuNumberInputComponent {
|
|
|
91
91
|
_clamp(v) {
|
|
92
92
|
return Math.min(this.max(), Math.max(this.min(), v));
|
|
93
93
|
}
|
|
94
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
95
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
94
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuNumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
95
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuNumberInputComponent, isStandalone: true, selector: "neu-number-input", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, floatingLabel: { classPropertyName: "floatingLabel", publicName: "floatingLabel", isSignal: true, isRequired: false, transformFunction: null }, decrementLabel: { classPropertyName: "decrementLabel", publicName: "decrementLabel", isSignal: true, isRequired: false, transformFunction: null }, incrementLabel: { classPropertyName: "incrementLabel", publicName: "incrementLabel", isSignal: true, isRequired: false, transformFunction: null }, vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null }, stacked: { classPropertyName: "stacked", publicName: "stacked", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, host: { properties: { "class": "hostClasses()" } }, providers: [
|
|
96
96
|
{
|
|
97
97
|
provide: NG_VALUE_ACCESSOR,
|
|
98
98
|
useExisting: forwardRef(() => NeuNumberInputComponent),
|
|
@@ -223,7 +223,7 @@ class NeuNumberInputComponent {
|
|
|
223
223
|
</div>
|
|
224
224
|
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-number-input{display:inline-flex;flex-direction:column;align-items:flex-start;gap:6px}.neu-number-input--disabled{opacity:.5;pointer-events:none}.neu-number-input--vertical .neu-number-input__control{flex-direction:column;gap:0;align-items:stretch;border:1px solid var(--neu-border);border-radius:var(--neu-radius-md, 8px);overflow:hidden;width:var(--neu-number-input-width, 80px)}.neu-number-input--vertical .neu-number-input__field{width:100%;border:none;border-top:1px solid var(--neu-border);border-bottom:1px solid var(--neu-border);border-radius:0}.neu-number-input--vertical .neu-number-input__control>.neu-number-input__btn{width:100%;border:none;border-radius:0}.neu-number-input--stacked .neu-number-input__control{align-items:stretch;gap:0}.neu-number-input--stacked .neu-number-input__field{flex:1 1 auto;width:auto;min-width:var(--neu-number-input-stacked-min-width, 120px);border-radius:var(--neu-radius-md, 8px) 0 0 var(--neu-radius-md, 8px);border-right:none;text-align:left;padding:0 10px}.neu-number-input--horizontal .neu-number-input__floating-label{left:calc(var(--neu-number-input-btn-size, 48px) + 12px);max-width:calc(100% - var(--neu-number-input-btn-size, 48px) * 2 - 28px)}.neu-number-input--sm{--neu-number-input-height: 36px;--neu-number-input-btn-size: 36px}.neu-number-input--sm .neu-number-input__field{font-size:var(--neu-text-sm)}.neu-number-input--lg{--neu-number-input-height: 56px;--neu-number-input-btn-size: 56px}.neu-number-input__label{font-size:var(--neu-text-sm, .875rem);font-weight:500;color:var(--neu-text);line-height:1.4;cursor:pointer}.neu-number-input__control{position:relative;display:inline-flex;align-items:center;gap:4px}.neu-number-input__field{width:var(--neu-number-input-width, 80px);height:var(--neu-number-input-height, 48px);padding:0 8px;border:1px solid var(--neu-border);border-radius:var(--neu-radius-md, 8px);background:var(--neu-surface);color:var(--neu-text);font-size:.9375rem;font-variant-numeric:tabular-nums;text-align:center;outline:none;transition:border-color .15s;-moz-appearance:textfield}.neu-number-input__field::-webkit-inner-spin-button,.neu-number-input__field::-webkit-outer-spin-button{display:none}.neu-number-input__field:focus{border-color:var(--neu-primary);box-shadow:var(--neu-focus-ring)}.neu-number-input__floating-label{position:absolute;left:6px;top:50%;z-index:1;transform:translateY(-50%);max-width:calc(100% - var(--neu-number-input-btn-size, 26px) - 18px);padding:0 4px;overflow:hidden;color:var(--neu-text-muted);font-size:var(--neu-text-base, 1rem);line-height:1.2;pointer-events:none;text-overflow:ellipsis;transition:top var(--neu-transition),color var(--neu-transition),font-size var(--neu-transition),transform var(--neu-transition),background var(--neu-transition);white-space:nowrap}.neu-number-input__control--focused .neu-number-input__floating-label,.neu-number-input__control--has-value .neu-number-input__floating-label{top:0;transform:translateY(-50%);background:var(--neu-surface);color:var(--neu-text-muted);font-size:12px;font-weight:600}.neu-number-input__control--focused .neu-number-input__floating-label{color:var(--neu-primary)}.neu-number-input__stack{display:flex;flex-direction:column;border:1px solid var(--neu-border);border-radius:0 var(--neu-radius-md, 8px) var(--neu-radius-md, 8px) 0;overflow:hidden;flex-shrink:0}.neu-number-input__stack .neu-number-input__btn{all:unset;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;flex:1;width:var(--neu-number-input-btn-size, 26px);border:none;border-radius:0;background:var(--neu-surface);color:var(--neu-text-muted);font-size:.625rem;font-weight:700;line-height:1;transition:background .1s,color .1s}.neu-number-input__stack .neu-number-input__btn:not(:disabled):hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-number-input__stack .neu-number-input__btn:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-1px}.neu-number-input__stack .neu-number-input__btn:disabled{opacity:.4;cursor:not-allowed}.neu-number-input__stack .neu-number-input__btn--inc{border-bottom:1px solid var(--neu-border)}.neu-number-input__control>.neu-number-input__btn{all:unset;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;justify-content:center;width:var(--neu-number-input-btn-size, 48px);height:var(--neu-number-input-btn-size, 48px);border:1px solid var(--neu-border);border-radius:var(--neu-radius-md, 8px);background:var(--neu-surface);color:var(--neu-text-muted);font-size:.6875rem;line-height:1;transition:background .12s,color .12s,border-color .12s}.neu-number-input__control>.neu-number-input__btn:not(:disabled):hover{background:var(--neu-surface-2);color:var(--neu-text);border-color:var(--neu-primary)}.neu-number-input__control>.neu-number-input__btn:focus-visible{outline:2px solid var(--neu-primary);outline-offset:1px}.neu-number-input__control>.neu-number-input__btn:disabled{opacity:.4;cursor:not-allowed}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
225
225
|
}
|
|
226
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
226
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuNumberInputComponent, decorators: [{
|
|
227
227
|
type: Component,
|
|
228
228
|
args: [{ selector: 'neu-number-input', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class]': 'hostClasses()' }, providers: [
|
|
229
229
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-number-input.mjs","sources":["../../../../projects/ui-core/number-input/neu-number-input.component.ts","../../../../projects/ui-core/number-input/neural-ui-core-number-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nlet _seq = 0;\n\n/**\n * NeuralUI NumberInput Component\n *\n * Input numérico con botones de incremento/decremento. Implementa CVA.\n * Soporta layout apilado (stacked), horizontal y vertical.\n *\n * Numeric input with increment/decrement buttons. Implements CVA.\n * Supports stacked, horizontal and vertical layouts.\n *\n * Uso: <neu-number-input [min]=\"0\" [max]=\"99\" label=\"Cantidad\" />\n */\n@Component({\n selector: 'neu-number-input',\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(() => NeuNumberInputComponent),\n multi: true,\n },\n ],\n template: `\n @if (!effectiveFloatingLabel() && label()) {\n <label class=\"neu-number-input__label\" [for]=\"_id\">{{ label() }}</label>\n }\n <div\n class=\"neu-number-input__control\"\n [class.neu-number-input__control--focused]=\"_focused()\"\n [class.neu-number-input__control--has-value]=\"hasValue()\"\n [class.neu-number-input__control--no-float]=\"!effectiveFloatingLabel()\"\n >\n @if (vertical()) {\n <!-- layout vertical: [▲] [input] [▼] -->\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n ▲\n </button>\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n ▼\n </button>\n } @else if (stacked()) {\n <!-- layout apilado: [input | ▲▼ apilados] -->\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"neu-number-input__stack\">\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n ▲\n </button>\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n ▼\n </button>\n </span>\n } @else {\n <!-- layout horizontal: [−] [input] [+] -->\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n −\n </button>\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n +\n </button>\n }\n\n @if (effectiveFloatingLabel() && label()) {\n <label class=\"neu-number-input__floating-label\" [for]=\"_id\">{{ label() }}</label>\n }\n </div>\n `,\n styleUrl: './neu-number-input.component.scss',\n})\nexport class NeuNumberInputComponent implements ControlValueAccessor {\n /** Valor mínimo / Min value */\n readonly min = input<number>(-Infinity);\n /** Valor máximo / Max value */\n readonly max = input<number>(Infinity);\n /** Incremento / Step */\n readonly step = input<number>(1);\n /** Etiqueta para el input (accesibilidad) / Label for the input (accessibility) */\n readonly label = input<string>('');\n /** Muestra el label como flotante dentro del campo. No compatible con vertical=true. / Shows the label as floating inside the field. Not compatible with vertical=true. */\n readonly floatingLabel = input<boolean>(false);\n /** Aria-label del botón de decremento */\n readonly decrementLabel = input<string>('Disminuir');\n /** Aria-label del botón de incremento */\n readonly incrementLabel = input<string>('Aumentar');\n /** Muestra los botones en vertical / Shows buttons vertically */\n readonly vertical = input<boolean>(false);\n /** Agrupa ambos botones apilados al final del input / Groups both buttons stacked at input end */\n readonly stacked = input<boolean>(true);\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n /** Emitido en cada cambio / Emitted on each change */\n readonly valueChange = output<number>();\n\n readonly _id = `neu-number-input-${++_seq}`;\n readonly _cvaDisabled = signal(false);\n readonly _value = signal(0);\n readonly _focused = signal(false);\n\n readonly hasValue = computed(() => Number.isFinite(this._value()));\n readonly effectiveFloatingLabel = computed(() => this.floatingLabel() && !this.vertical());\n\n readonly hostClasses = computed(() => ({\n 'neu-number-input': true,\n 'neu-number-input--vertical': this.vertical(),\n 'neu-number-input--stacked': this.stacked(),\n 'neu-number-input--horizontal': !this.vertical() && !this.stacked(),\n 'neu-number-input--disabled': this._cvaDisabled(),\n 'neu-number-input--sm': this.size() === 'sm',\n 'neu-number-input--lg': this.size() === 'lg',\n }));\n\n private _onChange: (v: number) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: number | null): void {\n this._value.set(this._clamp(val ?? 0));\n }\n\n registerOnChange(fn: (v: number) => 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 increment(): void {\n this._emit(this._clamp(this._value() + this.step()));\n }\n\n decrement(): void {\n this._emit(this._clamp(this._value() - this.step()));\n }\n\n onInputChange(event: Event): void {\n const raw = parseFloat((event.target as HTMLInputElement).value);\n this._emit(this._clamp(isNaN(raw) ? 0 : raw));\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 private _emit(value: number): void {\n this._value.set(value);\n this._onChange(value);\n this.valueChange.emit(value);\n }\n\n private _clamp(v: number): number {\n return Math.min(this.max(), Math.max(this.min(), 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-number-input.mjs","sources":["../../../../projects/ui-core/number-input/neu-number-input.component.ts","../../../../projects/ui-core/number-input/neural-ui-core-number-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nlet _seq = 0;\n\n/**\n * NeuralUI NumberInput Component\n *\n * Input numérico con botones de incremento/decremento. Implementa CVA.\n * Soporta layout apilado (stacked), horizontal y vertical.\n *\n * Numeric input with increment/decrement buttons. Implements CVA.\n * Supports stacked, horizontal and vertical layouts.\n *\n * Uso: <neu-number-input [min]=\"0\" [max]=\"99\" label=\"Cantidad\" />\n */\n@Component({\n selector: 'neu-number-input',\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(() => NeuNumberInputComponent),\n multi: true,\n },\n ],\n template: `\n @if (!effectiveFloatingLabel() && label()) {\n <label class=\"neu-number-input__label\" [for]=\"_id\">{{ label() }}</label>\n }\n <div\n class=\"neu-number-input__control\"\n [class.neu-number-input__control--focused]=\"_focused()\"\n [class.neu-number-input__control--has-value]=\"hasValue()\"\n [class.neu-number-input__control--no-float]=\"!effectiveFloatingLabel()\"\n >\n @if (vertical()) {\n <!-- layout vertical: [▲] [input] [▼] -->\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n ▲\n </button>\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n ▼\n </button>\n } @else if (stacked()) {\n <!-- layout apilado: [input | ▲▼ apilados] -->\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"neu-number-input__stack\">\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n ▲\n </button>\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n ▼\n </button>\n </span>\n } @else {\n <!-- layout horizontal: [−] [input] [+] -->\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n −\n </button>\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n +\n </button>\n }\n\n @if (effectiveFloatingLabel() && label()) {\n <label class=\"neu-number-input__floating-label\" [for]=\"_id\">{{ label() }}</label>\n }\n </div>\n `,\n styleUrl: './neu-number-input.component.scss',\n})\nexport class NeuNumberInputComponent implements ControlValueAccessor {\n /** Valor mínimo / Min value */\n readonly min = input<number>(-Infinity);\n /** Valor máximo / Max value */\n readonly max = input<number>(Infinity);\n /** Incremento / Step */\n readonly step = input<number>(1);\n /** Etiqueta para el input (accesibilidad) / Label for the input (accessibility) */\n readonly label = input<string>('');\n /** Muestra el label como flotante dentro del campo. No compatible con vertical=true. / Shows the label as floating inside the field. Not compatible with vertical=true. */\n readonly floatingLabel = input<boolean>(false);\n /** Aria-label del botón de decremento */\n readonly decrementLabel = input<string>('Disminuir');\n /** Aria-label del botón de incremento */\n readonly incrementLabel = input<string>('Aumentar');\n /** Muestra los botones en vertical / Shows buttons vertically */\n readonly vertical = input<boolean>(false);\n /** Agrupa ambos botones apilados al final del input / Groups both buttons stacked at input end */\n readonly stacked = input<boolean>(true);\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n /** Emitido en cada cambio / Emitted on each change */\n readonly valueChange = output<number>();\n\n readonly _id = `neu-number-input-${++_seq}`;\n readonly _cvaDisabled = signal(false);\n readonly _value = signal(0);\n readonly _focused = signal(false);\n\n readonly hasValue = computed(() => Number.isFinite(this._value()));\n readonly effectiveFloatingLabel = computed(() => this.floatingLabel() && !this.vertical());\n\n readonly hostClasses = computed(() => ({\n 'neu-number-input': true,\n 'neu-number-input--vertical': this.vertical(),\n 'neu-number-input--stacked': this.stacked(),\n 'neu-number-input--horizontal': !this.vertical() && !this.stacked(),\n 'neu-number-input--disabled': this._cvaDisabled(),\n 'neu-number-input--sm': this.size() === 'sm',\n 'neu-number-input--lg': this.size() === 'lg',\n }));\n\n private _onChange: (v: number) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: number | null): void {\n this._value.set(this._clamp(val ?? 0));\n }\n\n registerOnChange(fn: (v: number) => 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 increment(): void {\n this._emit(this._clamp(this._value() + this.step()));\n }\n\n decrement(): void {\n this._emit(this._clamp(this._value() - this.step()));\n }\n\n onInputChange(event: Event): void {\n const raw = parseFloat((event.target as HTMLInputElement).value);\n this._emit(this._clamp(isNaN(raw) ? 0 : raw));\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 private _emit(value: number): void {\n this._value.set(value);\n this._onChange(value);\n this.valueChange.emit(value);\n }\n\n private _clamp(v: number): number {\n return Math.min(this.max(), Math.max(this.min(), v));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -50,8 +50,8 @@ class NeuPaginationComponent {
|
|
|
50
50
|
this.pageChange.emit(clamped);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
54
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
53
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
54
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuPaginationComponent, isStandalone: true, selector: "neu-pagination", inputs: { page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, maxVisible: { classPropertyName: "maxVisible", publicName: "maxVisible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: `
|
|
55
55
|
<nav class="neu-pagination" aria-label="Paginación">
|
|
56
56
|
<!-- Anterior -->
|
|
57
57
|
<button
|
|
@@ -119,7 +119,7 @@ class NeuPaginationComponent {
|
|
|
119
119
|
</nav>
|
|
120
120
|
`, isInline: true, styles: [".neu-pagination{display:inline-flex;align-items:center;gap:4px;font-family:var(--neu-font-sans)}.neu-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 6px;border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);background:var(--neu-surface);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);cursor:pointer;transition:background var(--neu-transition),border-color var(--neu-transition),color var(--neu-transition);outline:none}.neu-pagination__btn:hover:not(:disabled){background:var(--neu-surface-2);border-color:var(--neu-border-hover);color:var(--neu-text)}.neu-pagination__btn:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-pagination__btn--active{background:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));border-color:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));color:var(--neu-primary-solid-fg, var(--neu-primary-fg));font-weight:600}.neu-pagination__btn--active:hover{background:var(--neu-primary-solid-hover, var(--neu-primary-dark));border-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-pagination__btn--nav{color:var(--neu-text-muted)}.neu-pagination__btn:disabled{opacity:.35;cursor:not-allowed}.neu-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);-webkit-user-select:none;user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
121
121
|
}
|
|
122
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuPaginationComponent, decorators: [{
|
|
123
123
|
type: Component,
|
|
124
124
|
args: [{ selector: 'neu-pagination', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
125
125
|
<nav class="neu-pagination" aria-label="Paginación">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-pagination.mjs","sources":["../../../../projects/ui-core/pagination/neu-pagination.component.ts","../../../../projects/ui-core/pagination/neural-ui-core-pagination.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n} from '@angular/core';\n\n/**\n * NeuralUI Pagination Component\n *\n * Paginación accesible con navegación por páginas, primera/última y ellipsis.\n *\n * Uso:\n * <neu-pagination [total]=\"200\" [pageSize]=\"10\" [page]=\"currentPage\"\n * (pageChange)=\"currentPage = $event\" />\n */\n@Component({\n selector: 'neu-pagination',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nav class=\"neu-pagination\" aria-label=\"Paginación\">\n <!-- Anterior -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() <= 1\"\n [attr.aria-label]=\"'Página anterior'\"\n (click)=\"go(page() - 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n\n <!-- Páginas -->\n @for (p of pages(); track p) {\n @if (p === -1) {\n <span class=\"neu-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n } @else {\n <button\n class=\"neu-pagination__btn\"\n [class.neu-pagination__btn--active]=\"p === page()\"\n type=\"button\"\n [attr.aria-label]=\"'Página ' + p\"\n [attr.aria-current]=\"p === page() ? 'page' : null\"\n (click)=\"go(p)\"\n >\n {{ p }}\n </button>\n }\n }\n\n <!-- Siguiente -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() >= totalPages()\"\n [attr.aria-label]=\"'Página siguiente'\"\n (click)=\"go(page() + 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n </nav>\n `,\n styleUrl: './neu-pagination.component.scss',\n})\nexport class NeuPaginationComponent {\n /** Página actual (1-indexed) / Current page (1-indexed) */\n page = input<number>(1);\n\n /** Total de ítems / Total items */\n total = input<number>(0);\n\n /** Ítems por página / Items per page */\n pageSize = input<number>(10);\n\n /** Número máximo de botones de página visibles (sin contar anterior/siguiente) / Maximum number of visible page buttons (not counting prev/next) */\n maxVisible = input<number>(7);\n\n /** Emite la nueva página al hacer click / Emits the new page on click */\n pageChange = output<number>();\n\n readonly totalPages = computed(() => Math.max(1, Math.ceil(this.total() / this.pageSize())));\n\n readonly pages = computed((): (number | -1)[] => {\n const total = this.totalPages();\n const current = this.page();\n const max = this.maxVisible();\n\n if (total <= max) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const half = Math.floor(max / 2);\n let start = Math.max(2, current - half + 1);\n let end = Math.min(total - 1, start + max - 3);\n if (end - start < max - 3) start = Math.max(2, end - (max - 4));\n\n const result: (number | -1)[] = [1];\n if (start > 2) result.push(-1);\n for (let i = start; i <= end; i++) result.push(i);\n if (end < total - 1) result.push(-1);\n result.push(total);\n return result;\n });\n\n go(page: number): void {\n const clamped = Math.min(this.totalPages(), Math.max(1, page));\n if (clamped !== this.page()) {\n this.pageChange.emit(clamped);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;AASA;;;;;;;;AAQG;MA2EU,sBAAsB,CAAA;;AAEjC,IAAA,IAAI,GAAG,KAAK,CAAS,CAAC,2EAAC;;AAGvB,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,4EAAC;;AAGxB,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;;AAG5B,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,iFAAC;;IAG7B,UAAU,GAAG,MAAM,EAAU;AAEpB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEnF,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAsB;AAC9C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE;AAC3B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAE7B,QAAA,IAAI,KAAK,IAAI,GAAG,EAAE;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvD;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AAChC,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC;AAC3C,QAAA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AAC9C,QAAA,IAAI,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;AAE/D,QAAA,MAAM,MAAM,GAAoB,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,QAAA,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpC,QAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,4EAAC;AAEF,IAAA,EAAE,CAAC,IAAY,EAAA;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC9D,QAAA,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE;AAC3B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B;IACF;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-pagination.mjs","sources":["../../../../projects/ui-core/pagination/neu-pagination.component.ts","../../../../projects/ui-core/pagination/neural-ui-core-pagination.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n} from '@angular/core';\n\n/**\n * NeuralUI Pagination Component\n *\n * Paginación accesible con navegación por páginas, primera/última y ellipsis.\n *\n * Uso:\n * <neu-pagination [total]=\"200\" [pageSize]=\"10\" [page]=\"currentPage\"\n * (pageChange)=\"currentPage = $event\" />\n */\n@Component({\n selector: 'neu-pagination',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nav class=\"neu-pagination\" aria-label=\"Paginación\">\n <!-- Anterior -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() <= 1\"\n [attr.aria-label]=\"'Página anterior'\"\n (click)=\"go(page() - 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n\n <!-- Páginas -->\n @for (p of pages(); track p) {\n @if (p === -1) {\n <span class=\"neu-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n } @else {\n <button\n class=\"neu-pagination__btn\"\n [class.neu-pagination__btn--active]=\"p === page()\"\n type=\"button\"\n [attr.aria-label]=\"'Página ' + p\"\n [attr.aria-current]=\"p === page() ? 'page' : null\"\n (click)=\"go(p)\"\n >\n {{ p }}\n </button>\n }\n }\n\n <!-- Siguiente -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() >= totalPages()\"\n [attr.aria-label]=\"'Página siguiente'\"\n (click)=\"go(page() + 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n </nav>\n `,\n styleUrl: './neu-pagination.component.scss',\n})\nexport class NeuPaginationComponent {\n /** Página actual (1-indexed) / Current page (1-indexed) */\n page = input<number>(1);\n\n /** Total de ítems / Total items */\n total = input<number>(0);\n\n /** Ítems por página / Items per page */\n pageSize = input<number>(10);\n\n /** Número máximo de botones de página visibles (sin contar anterior/siguiente) / Maximum number of visible page buttons (not counting prev/next) */\n maxVisible = input<number>(7);\n\n /** Emite la nueva página al hacer click / Emits the new page on click */\n pageChange = output<number>();\n\n readonly totalPages = computed(() => Math.max(1, Math.ceil(this.total() / this.pageSize())));\n\n readonly pages = computed((): (number | -1)[] => {\n const total = this.totalPages();\n const current = this.page();\n const max = this.maxVisible();\n\n if (total <= max) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const half = Math.floor(max / 2);\n let start = Math.max(2, current - half + 1);\n let end = Math.min(total - 1, start + max - 3);\n if (end - start < max - 3) start = Math.max(2, end - (max - 4));\n\n const result: (number | -1)[] = [1];\n if (start > 2) result.push(-1);\n for (let i = start; i <= end; i++) result.push(i);\n if (end < total - 1) result.push(-1);\n result.push(total);\n return result;\n });\n\n go(page: number): void {\n const clamped = Math.min(this.totalPages(), Math.max(1, page));\n if (clamped !== this.page()) {\n this.pageChange.emit(clamped);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -12,8 +12,8 @@ class NeuPopoverOverlayComponent {
|
|
|
12
12
|
_text = signal('', ...(ngDevMode ? [{ debugName: "_text" }] : /* istanbul ignore next */ []));
|
|
13
13
|
_templateRef = null;
|
|
14
14
|
_context = {};
|
|
15
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
16
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
15
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuPopoverOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
16
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuPopoverOverlayComponent, isStandalone: true, selector: "neu-popover-overlay", host: { classAttribute: "neu-popover" }, ngImport: i0, template: `
|
|
17
17
|
@if (_templateRef) {
|
|
18
18
|
<ng-container [ngTemplateOutlet]="_templateRef" [ngTemplateOutletContext]="_context" />
|
|
19
19
|
} @else {
|
|
@@ -21,7 +21,7 @@ class NeuPopoverOverlayComponent {
|
|
|
21
21
|
}
|
|
22
22
|
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-popover{background:var(--neu-popover-bg, var(--neu-surface-1, #ffffff));border:1px solid var(--neu-popover-border, var(--neu-border-color, #e5e7eb));border-radius:var(--neu-popover-radius, var(--neu-radius-lg, 12px));box-shadow:var(--neu-popover-shadow, 0 8px 24px -4px rgba(0, 0, 0, .12));min-width:var(--neu-popover-min-width, 200px);max-width:var(--neu-popover-max-width, 320px);padding:var(--neu-popover-padding, 12px 16px);font-size:.875rem;line-height:1.5;color:var(--neu-popover-color, var(--neu-text, var(--neu-text-primary, #111827)));z-index:1000;animation:neu-popover-in .12s ease}@keyframes neu-popover-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.neu-popover__inner{padding:0}.neu-popover-backdrop{background:transparent}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
23
23
|
}
|
|
24
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuPopoverOverlayComponent, decorators: [{
|
|
25
25
|
type: Component,
|
|
26
26
|
args: [{ selector: 'neu-popover-overlay', imports: [NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'neu-popover' }, template: `
|
|
27
27
|
@if (_templateRef) {
|
|
@@ -161,10 +161,10 @@ class NeuPopoverDirective {
|
|
|
161
161
|
scrollStrategy: this._overlay.scrollStrategies.reposition(),
|
|
162
162
|
});
|
|
163
163
|
}
|
|
164
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
165
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
164
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuPopoverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
165
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.17", type: NeuPopoverDirective, isStandalone: true, selector: "[neuPopover]", inputs: { neuPopover: { classPropertyName: "neuPopover", publicName: "neuPopover", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverText: { classPropertyName: "neuPopoverText", publicName: "neuPopoverText", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverPosition: { classPropertyName: "neuPopoverPosition", publicName: "neuPopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverTrigger: { classPropertyName: "neuPopoverTrigger", publicName: "neuPopoverTrigger", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverDisabled: { classPropertyName: "neuPopoverDisabled", publicName: "neuPopoverDisabled", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverContext: { classPropertyName: "neuPopoverContext", publicName: "neuPopoverContext", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { popoverOpened: "popoverOpened", popoverClosed: "popoverClosed" }, host: { listeners: { "click": "onHostClick()", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.aria-haspopup": "_hostAriaHasPopup()", "attr.aria-expanded": "_hostAriaExpanded()" } }, exportAs: ["neuPopover"], ngImport: i0 });
|
|
166
166
|
}
|
|
167
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuPopoverDirective, decorators: [{
|
|
168
168
|
type: Directive,
|
|
169
169
|
args: [{
|
|
170
170
|
selector: '[neuPopover]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-popover.mjs","sources":["../../../../projects/ui-core/popover/neu-popover.component.ts","../../../../projects/ui-core/popover/neural-ui-core-popover.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n EnvironmentInjector,\n HostListener,\n Injector,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Overlay, OverlayRef, ConnectedPosition } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport type NeuPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type NeuPopoverTrigger = 'click' | 'hover' | 'focus';\n\n/**\n * NeuralUI Popover Overlay Component (internal)\n * Renderizado por CDK Portal — no usar directamente.\n */\n@Component({\n selector: 'neu-popover-overlay',\n imports: [NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-popover' },\n template: `\n @if (_templateRef) {\n <ng-container [ngTemplateOutlet]=\"_templateRef\" [ngTemplateOutletContext]=\"_context\" />\n } @else {\n <div class=\"neu-popover__inner\">{{ _text() }}</div>\n }\n `,\n styleUrl: './neu-popover.component.scss',\n})\nexport class NeuPopoverOverlayComponent {\n readonly _text = signal('');\n _templateRef: TemplateRef<unknown> | null = null;\n _context: unknown = {};\n}\n\n/**\n * NeuralUI Popover Directive\n *\n * Muestra un popover flotante anclado al elemento host usando CDK Overlay.\n *\n * Uso:\n * <button [neuPopoverTemplate]=\"myTpl\">Info</button>\n * <ng-template #myTpl>Contenido del popover</ng-template>\n *\n * <button [neuPopoverText]=\"'Descripción detallada'\">Hover me</button>\n */\n@Directive({\n selector: '[neuPopover]',\n exportAs: 'neuPopover',\n host: {\n '[attr.aria-haspopup]': '_hostAriaHasPopup()',\n '[attr.aria-expanded]': '_hostAriaExpanded()',\n },\n})\nexport class NeuPopoverDirective implements OnDestroy {\n /** Template del contenido / Content template */\n readonly neuPopover = input<TemplateRef<unknown> | null>(null);\n\n /** Texto plano cuando no hay template / Plain text when no template */\n readonly neuPopoverText = input<string>('');\n\n /** Posición preferida / Preferred position */\n readonly neuPopoverPosition = input<NeuPopoverPosition>('bottom');\n\n /** Trigger del popover / Popover trigger */\n readonly neuPopoverTrigger = input<NeuPopoverTrigger>('click');\n\n /** Desactiva el popover / Disables the popover */\n readonly neuPopoverDisabled = input<boolean>(false);\n\n /** Contexto del template / Template context */\n readonly neuPopoverContext = input<unknown>({});\n\n /** Emitido al abrir / Emitted on open */\n readonly popoverOpened = output<void>();\n\n /** Emitido al cerrar / Emitted on close */\n readonly popoverClosed = output<void>();\n\n readonly _isOpen = signal(false);\n\n private readonly _overlay = inject(Overlay);\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _injector = inject(Injector);\n private readonly _vcr = inject(ViewContainerRef);\n\n private _overlayRef: OverlayRef | null = null;\n private _compRef: ComponentRef<NeuPopoverOverlayComponent> | null = null;\n\n @HostListener('click')\n onHostClick(): void {\n if (this.neuPopoverTrigger() !== 'click') return;\n this._toggle();\n }\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.open();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.close();\n }\n\n @HostListener('focus')\n onFocus(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.open();\n }\n\n @HostListener('blur')\n onBlur(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.close();\n }\n\n /** Abre el popover / Opens the popover */\n open(): void {\n if (this.neuPopoverDisabled() || this._isOpen()) return;\n this._createOverlay();\n const portal = new ComponentPortal(NeuPopoverOverlayComponent, this._vcr, this._injector);\n this._compRef = this._overlayRef!.attach(portal);\n const comp = this._compRef.instance;\n const tpl = this.neuPopover();\n if (tpl) {\n comp._templateRef = tpl;\n comp._context = this.neuPopoverContext();\n } else {\n comp._text.set(this.neuPopoverText());\n }\n this._isOpen.set(true);\n this.popoverOpened.emit();\n\n // Cierra al hacer clic fuera (solo en trigger 'click') / Close on outside click (click trigger only)\n if (this.neuPopoverTrigger() === 'click') {\n this._overlayRef!.backdropClick().subscribe(() => this.close());\n }\n }\n\n /** Cierra el popover / Closes the popover */\n close(): void {\n this._overlayRef?.detach();\n this._isOpen.set(false);\n this.popoverClosed.emit();\n }\n\n /** Alterna la visibilidad / Toggles visibility */\n toggle(): void {\n this._toggle();\n }\n\n ngOnDestroy(): void {\n this._overlayRef?.dispose();\n }\n\n protected _hostAriaHasPopup(): 'dialog' | null {\n return this.neuPopoverTrigger() === 'click' ? 'dialog' : null;\n }\n\n protected _hostAriaExpanded(): 'true' | 'false' | null {\n if (this.neuPopoverTrigger() !== 'click') {\n return null;\n }\n return this._isOpen() ? 'true' : 'false';\n }\n\n private _toggle(): void {\n this._isOpen() ? this.close() : this.open();\n }\n\n private _createOverlay(): void {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n }\n const pos = this.neuPopoverPosition();\n const isClick = this.neuPopoverTrigger() === 'click';\n const positions: ConnectedPosition[] = [\n ...POSITIONS[pos],\n ...POSITIONS[pos === 'bottom' ? 'top' : 'bottom'],\n ];\n this._overlayRef = this._overlay.create({\n // Solo usamos backdrop en trigger 'click' — hover/focus lo cierran con sus propios listeners.\n // Only use backdrop for 'click' trigger — hover/focus close via their own listeners.\n hasBackdrop: isClick,\n backdropClass: 'neu-popover-backdrop',\n positionStrategy: this._overlay\n .position()\n .flexibleConnectedTo(this._el)\n .withPositions(positions),\n scrollStrategy: this._overlay.scrollStrategies.reposition(),\n });\n }\n}\n\nconst POSITIONS: Record<NeuPopoverPosition, ConnectedPosition[]> = {\n bottom: [\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 6 },\n ],\n top: [{ originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -6 }],\n left: [{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -6 }],\n right: [{ originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 6 }],\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-popover.mjs","sources":["../../../../projects/ui-core/popover/neu-popover.component.ts","../../../../projects/ui-core/popover/neural-ui-core-popover.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n EnvironmentInjector,\n HostListener,\n Injector,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Overlay, OverlayRef, ConnectedPosition } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport type NeuPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type NeuPopoverTrigger = 'click' | 'hover' | 'focus';\n\n/**\n * NeuralUI Popover Overlay Component (internal)\n * Renderizado por CDK Portal — no usar directamente.\n */\n@Component({\n selector: 'neu-popover-overlay',\n imports: [NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-popover' },\n template: `\n @if (_templateRef) {\n <ng-container [ngTemplateOutlet]=\"_templateRef\" [ngTemplateOutletContext]=\"_context\" />\n } @else {\n <div class=\"neu-popover__inner\">{{ _text() }}</div>\n }\n `,\n styleUrl: './neu-popover.component.scss',\n})\nexport class NeuPopoverOverlayComponent {\n readonly _text = signal('');\n _templateRef: TemplateRef<unknown> | null = null;\n _context: unknown = {};\n}\n\n/**\n * NeuralUI Popover Directive\n *\n * Muestra un popover flotante anclado al elemento host usando CDK Overlay.\n *\n * Uso:\n * <button [neuPopoverTemplate]=\"myTpl\">Info</button>\n * <ng-template #myTpl>Contenido del popover</ng-template>\n *\n * <button [neuPopoverText]=\"'Descripción detallada'\">Hover me</button>\n */\n@Directive({\n selector: '[neuPopover]',\n exportAs: 'neuPopover',\n host: {\n '[attr.aria-haspopup]': '_hostAriaHasPopup()',\n '[attr.aria-expanded]': '_hostAriaExpanded()',\n },\n})\nexport class NeuPopoverDirective implements OnDestroy {\n /** Template del contenido / Content template */\n readonly neuPopover = input<TemplateRef<unknown> | null>(null);\n\n /** Texto plano cuando no hay template / Plain text when no template */\n readonly neuPopoverText = input<string>('');\n\n /** Posición preferida / Preferred position */\n readonly neuPopoverPosition = input<NeuPopoverPosition>('bottom');\n\n /** Trigger del popover / Popover trigger */\n readonly neuPopoverTrigger = input<NeuPopoverTrigger>('click');\n\n /** Desactiva el popover / Disables the popover */\n readonly neuPopoverDisabled = input<boolean>(false);\n\n /** Contexto del template / Template context */\n readonly neuPopoverContext = input<unknown>({});\n\n /** Emitido al abrir / Emitted on open */\n readonly popoverOpened = output<void>();\n\n /** Emitido al cerrar / Emitted on close */\n readonly popoverClosed = output<void>();\n\n readonly _isOpen = signal(false);\n\n private readonly _overlay = inject(Overlay);\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _injector = inject(Injector);\n private readonly _vcr = inject(ViewContainerRef);\n\n private _overlayRef: OverlayRef | null = null;\n private _compRef: ComponentRef<NeuPopoverOverlayComponent> | null = null;\n\n @HostListener('click')\n onHostClick(): void {\n if (this.neuPopoverTrigger() !== 'click') return;\n this._toggle();\n }\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.open();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.close();\n }\n\n @HostListener('focus')\n onFocus(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.open();\n }\n\n @HostListener('blur')\n onBlur(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.close();\n }\n\n /** Abre el popover / Opens the popover */\n open(): void {\n if (this.neuPopoverDisabled() || this._isOpen()) return;\n this._createOverlay();\n const portal = new ComponentPortal(NeuPopoverOverlayComponent, this._vcr, this._injector);\n this._compRef = this._overlayRef!.attach(portal);\n const comp = this._compRef.instance;\n const tpl = this.neuPopover();\n if (tpl) {\n comp._templateRef = tpl;\n comp._context = this.neuPopoverContext();\n } else {\n comp._text.set(this.neuPopoverText());\n }\n this._isOpen.set(true);\n this.popoverOpened.emit();\n\n // Cierra al hacer clic fuera (solo en trigger 'click') / Close on outside click (click trigger only)\n if (this.neuPopoverTrigger() === 'click') {\n this._overlayRef!.backdropClick().subscribe(() => this.close());\n }\n }\n\n /** Cierra el popover / Closes the popover */\n close(): void {\n this._overlayRef?.detach();\n this._isOpen.set(false);\n this.popoverClosed.emit();\n }\n\n /** Alterna la visibilidad / Toggles visibility */\n toggle(): void {\n this._toggle();\n }\n\n ngOnDestroy(): void {\n this._overlayRef?.dispose();\n }\n\n protected _hostAriaHasPopup(): 'dialog' | null {\n return this.neuPopoverTrigger() === 'click' ? 'dialog' : null;\n }\n\n protected _hostAriaExpanded(): 'true' | 'false' | null {\n if (this.neuPopoverTrigger() !== 'click') {\n return null;\n }\n return this._isOpen() ? 'true' : 'false';\n }\n\n private _toggle(): void {\n this._isOpen() ? this.close() : this.open();\n }\n\n private _createOverlay(): void {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n }\n const pos = this.neuPopoverPosition();\n const isClick = this.neuPopoverTrigger() === 'click';\n const positions: ConnectedPosition[] = [\n ...POSITIONS[pos],\n ...POSITIONS[pos === 'bottom' ? 'top' : 'bottom'],\n ];\n this._overlayRef = this._overlay.create({\n // Solo usamos backdrop en trigger 'click' — hover/focus lo cierran con sus propios listeners.\n // Only use backdrop for 'click' trigger — hover/focus close via their own listeners.\n hasBackdrop: isClick,\n backdropClass: 'neu-popover-backdrop',\n positionStrategy: this._overlay\n .position()\n .flexibleConnectedTo(this._el)\n .withPositions(positions),\n scrollStrategy: this._overlay.scrollStrategies.reposition(),\n });\n }\n}\n\nconst POSITIONS: Record<NeuPopoverPosition, ConnectedPosition[]> = {\n bottom: [\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 6 },\n ],\n top: [{ originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -6 }],\n left: [{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -6 }],\n right: [{ originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 6 }],\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -27,8 +27,8 @@ class NeuProgressBarComponent {
|
|
|
27
27
|
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
28
28
|
clampedValue = computed(() => Math.min(100, Math.max(0, this.value())), ...(ngDevMode ? [{ debugName: "clampedValue" }] : /* istanbul ignore next */ []));
|
|
29
29
|
hostClasses = computed(() => [`neu-progress--${this.variant()}`, `neu-progress--${this.size()}`].join(' '), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
30
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
31
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
30
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
31
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuProgressBarComponent, isStandalone: true, selector: "neu-progress-bar", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
32
32
|
<div class="neu-progress" [class]="hostClasses()">
|
|
33
33
|
@if (label()) {
|
|
34
34
|
<div class="neu-progress__header">
|
|
@@ -61,7 +61,7 @@ class NeuProgressBarComponent {
|
|
|
61
61
|
</div>
|
|
62
62
|
`, isInline: true, styles: ["@keyframes neu-progress-indeterminate{0%{transform:translate(-100%) scaleX(.5)}50%{transform:translate(0) scaleX(.7)}to{transform:translate(200%) scaleX(.5)}}.neu-progress{display:flex;flex-direction:column;gap:6px;width:100%;font-family:var(--neu-font-sans)}.neu-progress--sm .neu-progress__track{height:4px}.neu-progress--md .neu-progress__track{height:8px}.neu-progress--lg .neu-progress__track{height:12px}.neu-progress--primary .neu-progress__fill{background:var(--neu-primary)}.neu-progress--success .neu-progress__fill{background:var(--neu-success)}.neu-progress--warning .neu-progress__fill{background:var(--neu-warning)}.neu-progress--danger .neu-progress__fill{background:var(--neu-error)}.neu-progress__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.neu-progress__label{font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted)}.neu-progress__value{font-size:var(--neu-text-xs);font-weight:600;color:var(--neu-text-muted);min-width:32px;text-align:right}.neu-progress__track{width:100%;background:var(--neu-surface-3);border-radius:var(--neu-radius-full);overflow:hidden}.neu-progress__fill{height:100%;border-radius:var(--neu-radius-full);transition:width .4s cubic-bezier(.4,0,.2,1);transform-origin:left center}.neu-progress__fill--indeterminate{width:50%!important;animation:neu-progress-indeterminate 1.4s ease-in-out infinite}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
63
63
|
}
|
|
64
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
64
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuProgressBarComponent, decorators: [{
|
|
65
65
|
type: Component,
|
|
66
66
|
args: [{ selector: 'neu-progress-bar', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
67
67
|
<div class="neu-progress" [class]="hostClasses()">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-progress-bar.mjs","sources":["../../../../projects/ui-core/progress-bar/neu-progress-bar.component.ts","../../../../projects/ui-core/progress-bar/neural-ui-core-progress-bar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\n\nexport type NeuProgressVariant = 'primary' | 'success' | 'warning' | 'danger';\n\n/**\n * NeuralUI ProgressBar Component\n *\n * Barra de progreso accesible con valor, etiqueta y variantes semánticas.\n * Soporte para modo indeterminado (animación continua).\n *\n * Uso:\n * <neu-progress-bar [value]=\"75\" />\n * <neu-progress-bar [value]=\"75\" label=\"Cargando...\" variant=\"success\" [showValue]=\"true\" />\n * <neu-progress-bar [indeterminate]=\"true\" />\n */\n@Component({\n selector: 'neu-progress-bar',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-progress\" [class]=\"hostClasses()\">\n @if (label()) {\n <div class=\"neu-progress__header\">\n <span class=\"neu-progress__label\">{{ label() }}</span>\n @if (showValue() && !indeterminate()) {\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n }\n </div>\n } @else if (showValue() && !indeterminate()) {\n <div class=\"neu-progress__header\">\n <span></span>\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n </div>\n }\n <div\n class=\"neu-progress__track\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"indeterminate() ? null : clampedValue()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-label]=\"label() || 'Progreso'\"\n [attr.aria-valuetext]=\"indeterminate() ? 'Cargando...' : clampedValue() + '%'\"\n >\n <div\n class=\"neu-progress__fill\"\n [class.neu-progress__fill--indeterminate]=\"indeterminate()\"\n [style.width.%]=\"indeterminate() ? null : clampedValue()\"\n ></div>\n </div>\n </div>\n `,\n styleUrl: './neu-progress-bar.component.scss',\n})\nexport class NeuProgressBarComponent {\n /** Valor de 0 a 100 / Value from 0 to 100 */\n value = input<number>(0);\n\n /** Variante de color / Color variant */\n variant = input<NeuProgressVariant>('primary');\n\n /** Etiqueta descriptiva sobre la barra / Descriptive label above the bar */\n label = input<string>('');\n\n /** Muestra el % a la derecha / Shows the % on the right */\n showValue = input<boolean>(false);\n\n /** Modo indeterminado (animación continua) / Indeterminate mode (continuous animation) */\n indeterminate = input<boolean>(false);\n\n /** Altura de la barra / Bar height */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n readonly clampedValue = computed(() => Math.min(100, Math.max(0, this.value())));\n\n readonly hostClasses = computed(() =>\n [`neu-progress--${this.variant()}`, `neu-progress--${this.size()}`].join(' '),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;AAUA;;;;;;;;;;AAUG;MAwCU,uBAAuB,CAAA;;AAElC,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,4EAAC;;AAGxB,IAAA,OAAO,GAAG,KAAK,CAAqB,SAAS,8EAAC;;AAG9C,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAGzB,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;;AAGjC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,oFAAC;;AAGrC,IAAA,IAAI,GAAG,KAAK,CAAqB,IAAI,2EAAC;IAE7B,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAEvE,WAAW,GAAG,QAAQ,CAAC,MAC9B,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE,EAAE,CAAA,cAAA,EAAiB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC9E;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-progress-bar.mjs","sources":["../../../../projects/ui-core/progress-bar/neu-progress-bar.component.ts","../../../../projects/ui-core/progress-bar/neural-ui-core-progress-bar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\n\nexport type NeuProgressVariant = 'primary' | 'success' | 'warning' | 'danger';\n\n/**\n * NeuralUI ProgressBar Component\n *\n * Barra de progreso accesible con valor, etiqueta y variantes semánticas.\n * Soporte para modo indeterminado (animación continua).\n *\n * Uso:\n * <neu-progress-bar [value]=\"75\" />\n * <neu-progress-bar [value]=\"75\" label=\"Cargando...\" variant=\"success\" [showValue]=\"true\" />\n * <neu-progress-bar [indeterminate]=\"true\" />\n */\n@Component({\n selector: 'neu-progress-bar',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-progress\" [class]=\"hostClasses()\">\n @if (label()) {\n <div class=\"neu-progress__header\">\n <span class=\"neu-progress__label\">{{ label() }}</span>\n @if (showValue() && !indeterminate()) {\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n }\n </div>\n } @else if (showValue() && !indeterminate()) {\n <div class=\"neu-progress__header\">\n <span></span>\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n </div>\n }\n <div\n class=\"neu-progress__track\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"indeterminate() ? null : clampedValue()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-label]=\"label() || 'Progreso'\"\n [attr.aria-valuetext]=\"indeterminate() ? 'Cargando...' : clampedValue() + '%'\"\n >\n <div\n class=\"neu-progress__fill\"\n [class.neu-progress__fill--indeterminate]=\"indeterminate()\"\n [style.width.%]=\"indeterminate() ? null : clampedValue()\"\n ></div>\n </div>\n </div>\n `,\n styleUrl: './neu-progress-bar.component.scss',\n})\nexport class NeuProgressBarComponent {\n /** Valor de 0 a 100 / Value from 0 to 100 */\n value = input<number>(0);\n\n /** Variante de color / Color variant */\n variant = input<NeuProgressVariant>('primary');\n\n /** Etiqueta descriptiva sobre la barra / Descriptive label above the bar */\n label = input<string>('');\n\n /** Muestra el % a la derecha / Shows the % on the right */\n showValue = input<boolean>(false);\n\n /** Modo indeterminado (animación continua) / Indeterminate mode (continuous animation) */\n indeterminate = input<boolean>(false);\n\n /** Altura de la barra / Bar height */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n readonly clampedValue = computed(() => Math.min(100, Math.max(0, this.value())));\n\n readonly hostClasses = computed(() =>\n [`neu-progress--${this.variant()}`, `neu-progress--${this.size()}`].join(' '),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -43,8 +43,8 @@ class NeuRadioGroupComponent {
|
|
|
43
43
|
setDisabledState(isDisabled) {
|
|
44
44
|
this._isDisabled.set(isDisabled);
|
|
45
45
|
}
|
|
46
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
47
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.
|
|
46
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuRadioGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
47
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: NeuRadioGroupComponent, isStandalone: true, selector: "neu-radio-group", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "radiogroup" }, properties: { "attr.aria-disabled": "_isDisabled()", "attr.aria-label": "ariaLabel() || null" }, classAttribute: "neu-radio-group" }, providers: [
|
|
48
48
|
{
|
|
49
49
|
provide: NG_VALUE_ACCESSOR,
|
|
50
50
|
useExisting: forwardRef(() => NeuRadioGroupComponent),
|
|
@@ -56,7 +56,7 @@ class NeuRadioGroupComponent {
|
|
|
56
56
|
},
|
|
57
57
|
], ngImport: i0, template: `<ng-content />`, isInline: true, styles: [".neu-radio-group{display:flex;flex-direction:column;gap:var(--neu-space-3)}.neu-radio-group[dir=row]{flex-direction:row;flex-wrap:wrap}.neu-radio-host{display:inline-block}.neu-radio{display:inline-flex;align-items:center;gap:var(--neu-space-3);cursor:pointer;-webkit-user-select:none;user-select:none}.neu-radio--disabled{opacity:.5;pointer-events:none}.neu-radio__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.neu-radio__input:focus-visible+.neu-radio__circle{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-radio__circle{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;background:var(--neu-surface);border:1.5px solid var(--neu-border-hover);border-radius:var(--neu-radius-full);transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-radio__circle--checked{border-color:var(--neu-primary);box-shadow:var(--neu-focus-ring)}.neu-radio__dot{width:8px;height:8px;border-radius:var(--neu-radius-full);background:var(--neu-primary);transform:scale(0);transition:transform var(--neu-transition-bounce)}.neu-radio--checked .neu-radio__dot{transform:scale(1)}.neu-radio__label{font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);color:var(--neu-text);font-weight:500;line-height:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
58
58
|
}
|
|
59
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuRadioGroupComponent, decorators: [{
|
|
60
60
|
type: Component,
|
|
61
61
|
args: [{ selector: 'neu-radio-group', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
62
62
|
class: 'neu-radio-group',
|
|
@@ -99,8 +99,8 @@ class NeuRadioComponent {
|
|
|
99
99
|
this.group.select(this.value());
|
|
100
100
|
}
|
|
101
101
|
onBlur() { }
|
|
102
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
103
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
102
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
103
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuRadioComponent, isStandalone: true, selector: "neu-radio", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "neu-radio-host" }, ngImport: i0, template: `
|
|
104
104
|
<label
|
|
105
105
|
class="neu-radio"
|
|
106
106
|
[class.neu-radio--checked]="isChecked()"
|
|
@@ -127,7 +127,7 @@ class NeuRadioComponent {
|
|
|
127
127
|
</label>
|
|
128
128
|
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
129
129
|
}
|
|
130
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
130
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuRadioComponent, decorators: [{
|
|
131
131
|
type: Component,
|
|
132
132
|
args: [{
|
|
133
133
|
selector: 'neu-radio',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-radio.mjs","sources":["../../../../projects/ui-core/radio/neu-radio-group.component.ts","../../../../projects/ui-core/radio/neu-radio.component.ts","../../../../projects/ui-core/radio/neural-ui-core-radio.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n InjectionToken,\n ViewEncapsulation,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Token para que neu-radio encuentre a su grupo padre / Token for neu-radio to find its parent group */\nexport const NEU_RADIO_GROUP = new InjectionToken<NeuRadioGroupComponent>('NEU_RADIO_GROUP');\n\n/**\n * NeuralUI Radio Group Component\n *\n * Contenedor para grupos de radio buttons. Implementa ControlValueAccessor.\n *\n * Uso:\n * <neu-radio-group [formControl]=\"ctrl\">\n * <neu-radio value=\"a\" label=\"Opción A\" />\n * <neu-radio value=\"b\" label=\"Opción B\" />\n * </neu-radio-group>\n */\nlet _neuRadioGroupIdSeq = 0;\n\n@Component({\n selector: 'neu-radio-group',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-radio-group',\n role: 'radiogroup',\n '[attr.aria-disabled]': '_isDisabled()',\n '[attr.aria-label]': 'ariaLabel() || null',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuRadioGroupComponent),\n multi: true,\n },\n {\n provide: NEU_RADIO_GROUP,\n useExisting: NeuRadioGroupComponent,\n },\n ],\n template: `<ng-content />`,\n styleUrl: './neu-radio.component.scss',\n})\nexport class NeuRadioGroupComponent implements ControlValueAccessor {\n readonly direction = input<'row' | 'column'>('column');\n /** Etiqueta accesible del grupo (WCAG 4.1.2). Usar cuando no hay <legend> visible. / Accessible label for the group (WCAG 4.1.2). Use when there is no visible <legend>. */\n readonly ariaLabel = input<string>('');\n\n /** Nombre HTML compartido por todos los neu-radio hijos — garantiza la exclusión mutua nativa / HTML name shared by all child neu-radio — guarantees native mutual exclusion */\n readonly _name = `neu-radio-group-${++_neuRadioGroupIdSeq}`;\n\n readonly _value = signal<unknown>(null);\n readonly _isDisabled = signal(false);\n\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n select(value: unknown): void {\n this._value.set(value);\n this._onChange(value);\n this._onTouched();\n }\n\n writeValue(val: unknown): void {\n this._value.set(val ?? null);\n }\n\n registerOnChange(fn: (v: unknown) => 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._isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { NEU_RADIO_GROUP } from './neu-radio-group.component';\n\nlet _neuRadioIdSeq = 0;\n\n/**\n * NeuralUI Radio Component\n *\n * Opción individual dentro de un neu-radio-group.\n *\n * Uso:\n * <neu-radio value=\"opcion-a\" label=\"Opción A\" />\n */\n@Component({\n selector: 'neu-radio',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-radio-host' },\n template: `\n <label\n class=\"neu-radio\"\n [class.neu-radio--checked]=\"isChecked()\"\n [class.neu-radio--disabled]=\"isDisabled()\"\n [for]=\"_id\"\n >\n <input\n type=\"radio\"\n class=\"neu-radio__input\"\n [id]=\"_id\"\n [name]=\"_groupName\"\n [value]=\"value()\"\n [checked]=\"isChecked()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onSelect()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"neu-radio__circle\" [class.neu-radio__circle--checked]=\"isChecked()\">\n <span class=\"neu-radio__dot\"></span>\n </span>\n @if (label()) {\n <span class=\"neu-radio__label\">{{ label() }}</span>\n }\n </label>\n `,\n})\nexport class NeuRadioComponent {\n readonly value = input.required<unknown>();\n readonly label = input<string>('');\n readonly disabled = input<boolean>(false);\n\n readonly group = inject(NEU_RADIO_GROUP);\n\n readonly _id = `neu-radio-${_neuRadioIdSeq++}`;\n /** Toma el nombre del grupo padre — así todos los radios del grupo comparten el mismo `name` nativo / Takes the parent group name — so all radios in the group share the same native `name` */\n readonly _groupName = this.group._name;\n\n readonly isChecked = computed(() => this.group._value() === this.value());\n readonly isDisabled = computed(() => this.disabled() || this.group._isDisabled());\n\n onSelect(): void {\n this.group.select(this.value());\n }\n\n onBlur(): void {}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;AAWA;MACa,eAAe,GAAG,IAAI,cAAc,CAAyB,iBAAiB;AAE3F;;;;;;;;;;AAUG;AACH,IAAI,mBAAmB,GAAG,CAAC;MA0Bd,sBAAsB,CAAA;AACxB,IAAA,SAAS,GAAG,KAAK,CAAmB,QAAQ,gFAAC;;AAE7C,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;;AAG7B,IAAA,KAAK,GAAG,CAAA,gBAAA,EAAmB,EAAE,mBAAmB,EAAE;AAElD,IAAA,MAAM,GAAG,MAAM,CAAU,IAAI,6EAAC;AAC9B,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,kFAAC;AAE5B,IAAA,SAAS,GAAyB,MAAK,EAAE,CAAC;AAC1C,IAAA,UAAU,GAAe,MAAK,EAAE,CAAC;AAEzC,IAAA,MAAM,CAAC,KAAc,EAAA;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA,IAAA,UAAU,CAAC,GAAY,EAAA;QACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC;IAC9B;AAEA,IAAA,gBAAgB,CAAC,EAAwB,EAAA;AACvC,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;IAClC;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-radio.mjs","sources":["../../../../projects/ui-core/radio/neu-radio-group.component.ts","../../../../projects/ui-core/radio/neu-radio.component.ts","../../../../projects/ui-core/radio/neural-ui-core-radio.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n InjectionToken,\n ViewEncapsulation,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Token para que neu-radio encuentre a su grupo padre / Token for neu-radio to find its parent group */\nexport const NEU_RADIO_GROUP = new InjectionToken<NeuRadioGroupComponent>('NEU_RADIO_GROUP');\n\n/**\n * NeuralUI Radio Group Component\n *\n * Contenedor para grupos de radio buttons. Implementa ControlValueAccessor.\n *\n * Uso:\n * <neu-radio-group [formControl]=\"ctrl\">\n * <neu-radio value=\"a\" label=\"Opción A\" />\n * <neu-radio value=\"b\" label=\"Opción B\" />\n * </neu-radio-group>\n */\nlet _neuRadioGroupIdSeq = 0;\n\n@Component({\n selector: 'neu-radio-group',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-radio-group',\n role: 'radiogroup',\n '[attr.aria-disabled]': '_isDisabled()',\n '[attr.aria-label]': 'ariaLabel() || null',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuRadioGroupComponent),\n multi: true,\n },\n {\n provide: NEU_RADIO_GROUP,\n useExisting: NeuRadioGroupComponent,\n },\n ],\n template: `<ng-content />`,\n styleUrl: './neu-radio.component.scss',\n})\nexport class NeuRadioGroupComponent implements ControlValueAccessor {\n readonly direction = input<'row' | 'column'>('column');\n /** Etiqueta accesible del grupo (WCAG 4.1.2). Usar cuando no hay <legend> visible. / Accessible label for the group (WCAG 4.1.2). Use when there is no visible <legend>. */\n readonly ariaLabel = input<string>('');\n\n /** Nombre HTML compartido por todos los neu-radio hijos — garantiza la exclusión mutua nativa / HTML name shared by all child neu-radio — guarantees native mutual exclusion */\n readonly _name = `neu-radio-group-${++_neuRadioGroupIdSeq}`;\n\n readonly _value = signal<unknown>(null);\n readonly _isDisabled = signal(false);\n\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n select(value: unknown): void {\n this._value.set(value);\n this._onChange(value);\n this._onTouched();\n }\n\n writeValue(val: unknown): void {\n this._value.set(val ?? null);\n }\n\n registerOnChange(fn: (v: unknown) => 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._isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { NEU_RADIO_GROUP } from './neu-radio-group.component';\n\nlet _neuRadioIdSeq = 0;\n\n/**\n * NeuralUI Radio Component\n *\n * Opción individual dentro de un neu-radio-group.\n *\n * Uso:\n * <neu-radio value=\"opcion-a\" label=\"Opción A\" />\n */\n@Component({\n selector: 'neu-radio',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-radio-host' },\n template: `\n <label\n class=\"neu-radio\"\n [class.neu-radio--checked]=\"isChecked()\"\n [class.neu-radio--disabled]=\"isDisabled()\"\n [for]=\"_id\"\n >\n <input\n type=\"radio\"\n class=\"neu-radio__input\"\n [id]=\"_id\"\n [name]=\"_groupName\"\n [value]=\"value()\"\n [checked]=\"isChecked()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onSelect()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"neu-radio__circle\" [class.neu-radio__circle--checked]=\"isChecked()\">\n <span class=\"neu-radio__dot\"></span>\n </span>\n @if (label()) {\n <span class=\"neu-radio__label\">{{ label() }}</span>\n }\n </label>\n `,\n})\nexport class NeuRadioComponent {\n readonly value = input.required<unknown>();\n readonly label = input<string>('');\n readonly disabled = input<boolean>(false);\n\n readonly group = inject(NEU_RADIO_GROUP);\n\n readonly _id = `neu-radio-${_neuRadioIdSeq++}`;\n /** Toma el nombre del grupo padre — así todos los radios del grupo comparten el mismo `name` nativo / Takes the parent group name — so all radios in the group share the same native `name` */\n readonly _groupName = this.group._name;\n\n readonly isChecked = computed(() => this.group._value() === this.value());\n readonly isDisabled = computed(() => this.disabled() || this.group._isDisabled());\n\n onSelect(): void {\n this.group.select(this.value());\n }\n\n onBlur(): void {}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -47,8 +47,8 @@ class NeuRatingComponent {
|
|
|
47
47
|
return `url(#half-${i})`;
|
|
48
48
|
return 'transparent';
|
|
49
49
|
}
|
|
50
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
51
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
50
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuRatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
51
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuRatingComponent, isStandalone: true, selector: "neu-rating", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, stars: { classPropertyName: "stars", publicName: "stars", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
|
|
52
52
|
<div
|
|
53
53
|
class="neu-rating"
|
|
54
54
|
[class.neu-rating--readonly]="readonly()"
|
|
@@ -94,7 +94,7 @@ class NeuRatingComponent {
|
|
|
94
94
|
</div>
|
|
95
95
|
`, isInline: true, styles: [".neu-rating{display:inline-flex;align-items:center;gap:2px;font-family:var(--neu-font-sans)}.neu-rating--readonly{pointer-events:none}.neu-rating__star{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;background:transparent;border:none;border-radius:var(--neu-radius-sm);cursor:pointer;color:var(--neu-surface-3);padding:2px;transition:transform .15s ease,color .15s ease;outline:none}.neu-rating__star--filled{color:#f59e0b}.neu-rating__star:hover:not(:disabled){transform:scale(1.15)}.neu-rating__star:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-rating__star:disabled{cursor:default}.neu-rating__icon{width:22px;height:22px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
96
96
|
}
|
|
97
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuRatingComponent, decorators: [{
|
|
98
98
|
type: Component,
|
|
99
99
|
args: [{ selector: 'neu-rating', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
100
100
|
<div
|