@neural-ui/core 1.6.1 → 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 +7 -11
- package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
- package/fesm2022/neural-ui-core-alert.mjs +14 -25
- package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
- package/fesm2022/neural-ui-core-autocomplete.mjs +28 -53
- package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
- package/fesm2022/neural-ui-core-avatar.mjs +13 -23
- package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-badge.mjs +9 -15
- package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
- package/fesm2022/neural-ui-core-block-ui.mjs +11 -16
- package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
- package/fesm2022/neural-ui-core-breadcrumb.mjs +6 -8
- package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
- package/fesm2022/neural-ui-core-button.mjs +16 -29
- package/fesm2022/neural-ui-core-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-calendar.mjs +20 -37
- package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-card.mjs +8 -13
- package/fesm2022/neural-ui-core-card.mjs.map +1 -1
- package/fesm2022/neural-ui-core-chart.mjs +24 -45
- package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
- package/fesm2022/neural-ui-core-checkbox.mjs +9 -15
- package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
- package/fesm2022/neural-ui-core-chip.mjs +13 -23
- package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-code-block.mjs +17 -31
- package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
- package/fesm2022/neural-ui-core-color-picker.mjs +11 -19
- package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
- package/fesm2022/neural-ui-core-command-palette.mjs +11 -16
- 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 +9 -12
- package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
- package/fesm2022/neural-ui-core-dashboard-grid.mjs +7 -11
- package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
- package/fesm2022/neural-ui-core-date-input.mjs +57 -111
- package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-divider.mjs +5 -7
- package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
- package/fesm2022/neural-ui-core-empty-state.mjs +8 -13
- package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-filter-bar.mjs +11 -19
- package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-icon.mjs +7 -11
- package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
- package/fesm2022/neural-ui-core-image-gallery.mjs +13 -23
- package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
- package/fesm2022/neural-ui-core-image-viewer.mjs +14 -22
- package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
- package/fesm2022/neural-ui-core-input-otp.mjs +11 -19
- package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
- package/fesm2022/neural-ui-core-input.mjs +35 -67
- package/fesm2022/neural-ui-core-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-kanban.mjs +9 -15
- package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
- package/fesm2022/neural-ui-core-knob.mjs +22 -41
- package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
- package/fesm2022/neural-ui-core-meter-group.mjs +13 -23
- package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-modal.mjs +11 -16
- package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
- package/fesm2022/neural-ui-core-multiselect.mjs +39 -72
- package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
- package/fesm2022/neural-ui-core-nav.mjs +13 -22
- package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
- package/fesm2022/neural-ui-core-notification-center.mjs +9 -12
- package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
- package/fesm2022/neural-ui-core-number-input.mjs +19 -35
- package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-pagination.mjs +9 -15
- package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
- package/fesm2022/neural-ui-core-popover.mjs +14 -22
- package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
- package/fesm2022/neural-ui-core-progress-bar.mjs +11 -19
- package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-radio.mjs +15 -24
- package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
- package/fesm2022/neural-ui-core-rating.mjs +8 -13
- package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
- package/fesm2022/neural-ui-core-rich-text-editor.mjs +28 -53
- package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -1
- package/fesm2022/neural-ui-core-scheduler-gantt.mjs +22 -41
- package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
- package/fesm2022/neural-ui-core-select.mjs +43 -77
- package/fesm2022/neural-ui-core-select.mjs.map +1 -1
- package/fesm2022/neural-ui-core-sidebar.mjs +12 -21
- package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-skeleton.mjs +7 -11
- package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
- package/fesm2022/neural-ui-core-slider.mjs +13 -23
- package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
- package/fesm2022/neural-ui-core-spinner.mjs +10 -17
- package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
- package/fesm2022/neural-ui-core-split-button.mjs +15 -27
- package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-splitter.mjs +6 -9
- package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
- package/fesm2022/neural-ui-core-stats-card.mjs +11 -19
- package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
- package/fesm2022/neural-ui-core-stepper.mjs +8 -13
- package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
- package/fesm2022/neural-ui-core-switch.mjs +9 -15
- package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
- package/fesm2022/neural-ui-core-table.mjs +124 -242
- package/fesm2022/neural-ui-core-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tabs.mjs +18 -30
- package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
- package/fesm2022/neural-ui-core-textarea.mjs +23 -43
- package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
- package/fesm2022/neural-ui-core-timeline-grid.mjs +12 -21
- package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
- package/fesm2022/neural-ui-core-timeline.mjs +4 -5
- package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toast.mjs +8 -10
- package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toggle-button-group.mjs +10 -17
- package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toolbar.mjs +8 -13
- package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tooltip.mjs +11 -16
- package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree-table.mjs +30 -57
- package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree.mjs +17 -31
- package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
- package/fesm2022/neural-ui-core-uploader.mjs +47 -91
- package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
- package/fesm2022/neural-ui-core-url-state.mjs +5 -7
- package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-virtual-list.mjs +19 -32
- package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-color-picker.mjs","sources":["../../../../projects/ui-core/color-picker/neu-color-picker.component.ts","../../../../projects/ui-core/color-picker/neural-ui-core-color-picker.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n ViewEncapsulation,\n computed,\n forwardRef,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n} from '@angular/core';\nimport { ConnectedPosition, Overlay, OverlayModule } from '@angular/cdk/overlay';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type NeuColorMode = 'hex' | 'rgb' | 'hsl';\n\n/** Parse hex → { r, g, b } */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const clean = hex.replace('#', '').padEnd(6, '0');\n if (!/^[0-9a-fA-F]{6}$/.test(clean)) return null;\n return {\n r: parseInt(clean.slice(0, 2), 16),\n g: parseInt(clean.slice(2, 4), 16),\n b: parseInt(clean.slice(4, 6), 16),\n };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return (\n '#' +\n [r, g, b]\n .map((v) =>\n Math.round(Math.max(0, Math.min(255, v)))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')\n );\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n const _r = r / 255,\n _g = g / 255,\n _b = b / 255;\n const max = Math.max(_r, _g, _b),\n min = Math.min(_r, _g, _b);\n let h = 0,\n s = 0;\n const l = (max + min) / 2;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case _r:\n h = ((_g - _b) / d + (_g < _b ? 6 : 0)) / 6;\n break;\n case _g:\n h = ((_b - _r) / d + 2) / 6;\n break;\n case _b:\n h = ((_r - _g) / d + 4) / 6;\n break;\n }\n }\n return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\nfunction rgbToHsv(r: number, g: number, b: number): { h: number; s: number; v: number } {\n const _r = r / 255,\n _g = g / 255,\n _b = b / 255;\n const max = Math.max(_r, _g, _b),\n min = Math.min(_r, _g, _b);\n const v = max;\n const s = max === 0 ? 0 : (max - min) / max;\n let h = 0;\n if (max !== min) {\n const d = max - min;\n switch (max) {\n case _r:\n h = ((_g - _b) / d + (_g < _b ? 6 : 0)) / 6;\n break;\n case _g:\n h = ((_b - _r) / d + 2) / 6;\n break;\n case _b:\n h = ((_r - _g) / d + 4) / 6;\n break;\n }\n }\n return { h: Math.round(h * 360), s: Math.round(s * 100), v: Math.round(v * 100) };\n}\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const _s = s / 100,\n _v = v / 100;\n const f = (n: number) => {\n const k = (n + h / 60) % 6;\n const val = _v - _v * _s * Math.max(0, Math.min(k, 4 - k, 1));\n return Math.round(val * 255)\n .toString(16)\n .padStart(2, '0');\n };\n return `#${f(5)}${f(3)}${f(1)}`;\n}\n\nfunction hslToHex(h: number, s: number, l: number): string {\n const _s = s / 100,\n _l = l / 100;\n const a = _s * Math.min(_l, 1 - _l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = _l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0');\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\nlet _seq = 0;\n\n/**\n * NeuralUI ColorPicker\n *\n * Selector de color con swatch, hue slider y modos hex/rgb/hsl. CVA.\n *\n * Uso:\n * <neu-color-picker [formControl]=\"colorCtrl\" mode=\"hex\" />\n */\n@Component({\n selector: 'neu-color-picker',\n imports: [OverlayModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuColorPickerComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-cp',\n '[class.neu-cp--open]': '_isOpen()',\n '[class.neu-cp--disabled]': '_cvaDisabled()',\n },\n template: `\n <!-- Swatch trigger -->\n <button\n cdkOverlayOrigin\n #colorPickerOrigin=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"neu-cp__trigger\"\n [attr.aria-expanded]=\"_isOpen()\"\n [attr.aria-label]=\"'Color: ' + _hexValue()\"\n [disabled]=\"_cvaDisabled()\"\n (click)=\"_toggle()\"\n >\n <span class=\"neu-cp__swatch\" [style.background]=\"_hexValue()\"></span>\n <span class=\"neu-cp__hex-label\">{{ _hexValue() }}</span>\n </button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"colorPickerOrigin\"\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 class=\"neu-cp__panel\" role=\"dialog\" aria-label=\"Selector de color\">\n <!-- HSV Canvas -->\n <div\n class=\"neu-cp__canvas-wrap\"\n [style.background-color]=\"'hsl(' + _hue() + ', 100%, 50%)'\"\n (pointerdown)=\"_canvasDown($event)\"\n (pointermove)=\"_canvasDrag($event)\"\n (pointerup)=\"_canvasUp($event)\"\n >\n <div\n class=\"neu-cp__canvas-cursor\"\n [style.left]=\"_sv().s + '%'\"\n [style.top]=\"100 - _sv().v + '%'\"\n ></div>\n </div>\n\n <!-- Hue slider -->\n <input\n type=\"range\"\n class=\"neu-cp__hue-slider\"\n min=\"0\"\n max=\"360\"\n [value]=\"_hue()\"\n (input)=\"_onHueChange(+$any($event.target).value)\"\n [attr.aria-label]=\"'Tono ' + _hue() + '°'\"\n />\n\n <!-- Swatches -->\n <div class=\"neu-cp__swatches\" role=\"group\" aria-label=\"Colores predefinidos\">\n @for (sw of _swatches; track sw) {\n <button\n type=\"button\"\n class=\"neu-cp__sw\"\n [style.background]=\"sw\"\n [attr.aria-label]=\"'Color ' + sw\"\n (click)=\"_pickSwatch(sw)\"\n ></button>\n }\n </div>\n\n <!-- Mode tabs -->\n <div class=\"neu-cp__mode-tabs\">\n @for (m of _modes; track m) {\n <button\n type=\"button\"\n class=\"neu-cp__mode-btn\"\n [class.neu-cp__mode-btn--active]=\"_activeMode() === m\"\n (click)=\"_activeMode.set(m)\"\n >\n {{ m.toUpperCase() }}\n </button>\n }\n </div>\n\n <!-- Value input -->\n <div class=\"neu-cp__input-row\">\n <input\n class=\"neu-cp__text-input\"\n type=\"text\"\n [value]=\"_textValue()\"\n (input)=\"_onTextChange($any($event.target).value)\"\n [attr.aria-label]=\"'Valor ' + _activeMode()\"\n />\n <span class=\"neu-cp__swatch-sm\" [style.background]=\"_hexValue()\"></span>\n </div>\n </div>\n </ng-template>\n `,\n styleUrl: './neu-color-picker.component.scss',\n})\nexport class NeuColorPickerComponent implements ControlValueAccessor {\n // ── Inputs / Outputs ────────────────────────────────────────────\n readonly mode = input<NeuColorMode>('hex');\n\n /** Emitido al cambiar el color / Emitted when color changes */\n readonly colorChange = output<string>();\n\n // ── Internal state ───────────────────────────────────────────────\n readonly _id = `neu-cp-${++_seq}`;\n readonly _modes: NeuColorMode[] = ['hex', 'rgb', 'hsl'];\n readonly _swatches: string[] = [\n '#ef4444',\n '#f97316',\n '#eab308',\n '#22c55e',\n '#10b981',\n '#06b6d4',\n '#3b82f6',\n '#6366f1',\n '#a855f7',\n '#ec4899',\n ];\n\n readonly _isOpen = signal(false);\n readonly _cvaDisabled = signal(false);\n readonly _hue = signal(210);\n readonly _sv = signal({ s: 80, v: 90 });\n readonly _activeMode = linkedSignal<NeuColorMode>(() => this.mode());\n\n private _dragging = false;\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _overlay = inject(Overlay);\n readonly _viewportMargin = 16;\n readonly overlayPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -6,\n },\n ];\n readonly overlayScrollStrategy = this._overlay.scrollStrategies.reposition();\n\n // ── Close on outside click ─────────────────────────────────────\n @HostListener('document:mousedown', ['$event'])\n _outsideClick(e: MouseEvent): void {\n const target = e.target as Element | null;\n const isInsidePanel = !!target?.closest('.neu-cp__panel');\n if (!this._el.nativeElement.contains(e.target as Node) && !isInsidePanel) {\n this._isOpen.set(false);\n }\n }\n\n // ── Computed ──────────────────────────────────────────────────\n readonly _hexValue = computed(() => hsvToHex(this._hue(), this._sv().s, this._sv().v));\n\n readonly _textValue = computed(() => {\n const hex = this._hexValue();\n const rgb = hexToRgb(hex);\n if (!rgb) return hex;\n switch (this._activeMode()) {\n case 'rgb':\n return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n case 'hsl': {\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n default:\n return hex;\n }\n });\n\n // ── Canvas interactions ───────────────────────────────────────\n _canvasDown(e: PointerEvent): void {\n this._dragging = true;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n this._updateFromCanvas(e);\n }\n\n _canvasDrag(e: PointerEvent): void {\n if (!this._dragging) return;\n this._updateFromCanvas(e);\n }\n\n _canvasUp(e: PointerEvent): void {\n this._dragging = false;\n (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n }\n\n private _updateFromCanvas(e: PointerEvent): void {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const s = Math.round(Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width)) * 100);\n const v = Math.round(Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height)) * 100);\n this._sv.set({ s, v });\n this._emit();\n }\n\n // ── Event handlers ────────────────────────────────────────────\n _toggle(): void {\n this._isOpen.update((v) => !v);\n }\n\n _onHueChange(v: number): void {\n this._hue.set(Number(v));\n this._emit();\n }\n\n _pickSwatch(hex: string): void {\n this._applyHex(hex);\n this._emit();\n }\n\n _onTextChange(text: string): void {\n const t = text.trim();\n if (t.startsWith('#')) {\n this._applyHex(t);\n } else if (t.startsWith('rgb')) {\n const m = t.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (m) this._applyHex(rgbToHex(+m[1], +m[2], +m[3]));\n } else if (t.startsWith('hsl')) {\n const m = t.match(/hsl\\((\\d+),\\s*(\\d+)%?,\\s*(\\d+)%?\\)/);\n if (m) this._applyHex(hslToHex(+m[1], +m[2], +m[3]));\n }\n this._emit();\n }\n\n // ── Helpers ───────────────────────────────────────────────────\n private _applyHex(hex: string): void {\n const rgb = hexToRgb(hex);\n if (!rgb) return;\n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);\n this._hue.set(hsv.h);\n this._sv.set({ s: hsv.s, v: hsv.v });\n }\n\n private _emit(): void {\n const val = this._textValue();\n this._onChange(val);\n this.colorChange.emit(val);\n }\n\n // ── CVA ──────────────────────────────────────────────────────\n writeValue(val: string | null): void {\n if (!val) return;\n this._onTextChange(val);\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(d: boolean): void {\n this._cvaDisabled.set(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-color-picker.mjs","sources":["../../../../projects/ui-core/color-picker/neu-color-picker.component.ts","../../../../projects/ui-core/color-picker/neural-ui-core-color-picker.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n ViewEncapsulation,\n computed,\n forwardRef,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n} from '@angular/core';\nimport { ConnectedPosition, Overlay, OverlayModule } from '@angular/cdk/overlay';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type NeuColorMode = 'hex' | 'rgb' | 'hsl';\n\n/** Parse hex → { r, g, b } */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const clean = hex.replace('#', '').padEnd(6, '0');\n if (!/^[0-9a-fA-F]{6}$/.test(clean)) return null;\n return {\n r: parseInt(clean.slice(0, 2), 16),\n g: parseInt(clean.slice(2, 4), 16),\n b: parseInt(clean.slice(4, 6), 16),\n };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return (\n '#' +\n [r, g, b]\n .map((v) =>\n Math.round(Math.max(0, Math.min(255, v)))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')\n );\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n const _r = r / 255,\n _g = g / 255,\n _b = b / 255;\n const max = Math.max(_r, _g, _b),\n min = Math.min(_r, _g, _b);\n let h = 0,\n s = 0;\n const l = (max + min) / 2;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case _r:\n h = ((_g - _b) / d + (_g < _b ? 6 : 0)) / 6;\n break;\n case _g:\n h = ((_b - _r) / d + 2) / 6;\n break;\n case _b:\n h = ((_r - _g) / d + 4) / 6;\n break;\n }\n }\n return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\nfunction rgbToHsv(r: number, g: number, b: number): { h: number; s: number; v: number } {\n const _r = r / 255,\n _g = g / 255,\n _b = b / 255;\n const max = Math.max(_r, _g, _b),\n min = Math.min(_r, _g, _b);\n const v = max;\n const s = max === 0 ? 0 : (max - min) / max;\n let h = 0;\n if (max !== min) {\n const d = max - min;\n switch (max) {\n case _r:\n h = ((_g - _b) / d + (_g < _b ? 6 : 0)) / 6;\n break;\n case _g:\n h = ((_b - _r) / d + 2) / 6;\n break;\n case _b:\n h = ((_r - _g) / d + 4) / 6;\n break;\n }\n }\n return { h: Math.round(h * 360), s: Math.round(s * 100), v: Math.round(v * 100) };\n}\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const _s = s / 100,\n _v = v / 100;\n const f = (n: number) => {\n const k = (n + h / 60) % 6;\n const val = _v - _v * _s * Math.max(0, Math.min(k, 4 - k, 1));\n return Math.round(val * 255)\n .toString(16)\n .padStart(2, '0');\n };\n return `#${f(5)}${f(3)}${f(1)}`;\n}\n\nfunction hslToHex(h: number, s: number, l: number): string {\n const _s = s / 100,\n _l = l / 100;\n const a = _s * Math.min(_l, 1 - _l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = _l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0');\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\nlet _seq = 0;\n\n/**\n * NeuralUI ColorPicker\n *\n * Selector de color con swatch, hue slider y modos hex/rgb/hsl. CVA.\n *\n * Uso:\n * <neu-color-picker [formControl]=\"colorCtrl\" mode=\"hex\" />\n */\n@Component({\n selector: 'neu-color-picker',\n imports: [OverlayModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuColorPickerComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-cp',\n '[class.neu-cp--open]': '_isOpen()',\n '[class.neu-cp--disabled]': '_cvaDisabled()',\n },\n template: `\n <!-- Swatch trigger -->\n <button\n cdkOverlayOrigin\n #colorPickerOrigin=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"neu-cp__trigger\"\n [attr.aria-expanded]=\"_isOpen()\"\n [attr.aria-label]=\"'Color: ' + _hexValue()\"\n [disabled]=\"_cvaDisabled()\"\n (click)=\"_toggle()\"\n >\n <span class=\"neu-cp__swatch\" [style.background]=\"_hexValue()\"></span>\n <span class=\"neu-cp__hex-label\">{{ _hexValue() }}</span>\n </button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"colorPickerOrigin\"\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 class=\"neu-cp__panel\" role=\"dialog\" aria-label=\"Selector de color\">\n <!-- HSV Canvas -->\n <div\n class=\"neu-cp__canvas-wrap\"\n [style.background-color]=\"'hsl(' + _hue() + ', 100%, 50%)'\"\n (pointerdown)=\"_canvasDown($event)\"\n (pointermove)=\"_canvasDrag($event)\"\n (pointerup)=\"_canvasUp($event)\"\n >\n <div\n class=\"neu-cp__canvas-cursor\"\n [style.left]=\"_sv().s + '%'\"\n [style.top]=\"100 - _sv().v + '%'\"\n ></div>\n </div>\n\n <!-- Hue slider -->\n <input\n type=\"range\"\n class=\"neu-cp__hue-slider\"\n min=\"0\"\n max=\"360\"\n [value]=\"_hue()\"\n (input)=\"_onHueChange(+$any($event.target).value)\"\n [attr.aria-label]=\"'Tono ' + _hue() + '°'\"\n />\n\n <!-- Swatches -->\n <div class=\"neu-cp__swatches\" role=\"group\" aria-label=\"Colores predefinidos\">\n @for (sw of _swatches; track sw) {\n <button\n type=\"button\"\n class=\"neu-cp__sw\"\n [style.background]=\"sw\"\n [attr.aria-label]=\"'Color ' + sw\"\n (click)=\"_pickSwatch(sw)\"\n ></button>\n }\n </div>\n\n <!-- Mode tabs -->\n <div class=\"neu-cp__mode-tabs\">\n @for (m of _modes; track m) {\n <button\n type=\"button\"\n class=\"neu-cp__mode-btn\"\n [class.neu-cp__mode-btn--active]=\"_activeMode() === m\"\n (click)=\"_activeMode.set(m)\"\n >\n {{ m.toUpperCase() }}\n </button>\n }\n </div>\n\n <!-- Value input -->\n <div class=\"neu-cp__input-row\">\n <input\n class=\"neu-cp__text-input\"\n type=\"text\"\n [value]=\"_textValue()\"\n (input)=\"_onTextChange($any($event.target).value)\"\n [attr.aria-label]=\"'Valor ' + _activeMode()\"\n />\n <span class=\"neu-cp__swatch-sm\" [style.background]=\"_hexValue()\"></span>\n </div>\n </div>\n </ng-template>\n `,\n styleUrl: './neu-color-picker.component.scss',\n})\nexport class NeuColorPickerComponent implements ControlValueAccessor {\n // ── Inputs / Outputs ────────────────────────────────────────────\n readonly mode = input<NeuColorMode>('hex');\n\n /** Emitido al cambiar el color / Emitted when color changes */\n readonly colorChange = output<string>();\n\n // ── Internal state ───────────────────────────────────────────────\n readonly _id = `neu-cp-${++_seq}`;\n readonly _modes: NeuColorMode[] = ['hex', 'rgb', 'hsl'];\n readonly _swatches: string[] = [\n '#ef4444',\n '#f97316',\n '#eab308',\n '#22c55e',\n '#10b981',\n '#06b6d4',\n '#3b82f6',\n '#6366f1',\n '#a855f7',\n '#ec4899',\n ];\n\n readonly _isOpen = signal(false);\n readonly _cvaDisabled = signal(false);\n readonly _hue = signal(210);\n readonly _sv = signal({ s: 80, v: 90 });\n readonly _activeMode = linkedSignal<NeuColorMode>(() => this.mode());\n\n private _dragging = false;\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _overlay = inject(Overlay);\n readonly _viewportMargin = 16;\n readonly overlayPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -6,\n },\n ];\n readonly overlayScrollStrategy = this._overlay.scrollStrategies.reposition();\n\n // ── Close on outside click ─────────────────────────────────────\n @HostListener('document:mousedown', ['$event'])\n _outsideClick(e: MouseEvent): void {\n const target = e.target as Element | null;\n const isInsidePanel = !!target?.closest('.neu-cp__panel');\n if (!this._el.nativeElement.contains(e.target as Node) && !isInsidePanel) {\n this._isOpen.set(false);\n }\n }\n\n // ── Computed ──────────────────────────────────────────────────\n readonly _hexValue = computed(() => hsvToHex(this._hue(), this._sv().s, this._sv().v));\n\n readonly _textValue = computed(() => {\n const hex = this._hexValue();\n const rgb = hexToRgb(hex);\n if (!rgb) return hex;\n switch (this._activeMode()) {\n case 'rgb':\n return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n case 'hsl': {\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n default:\n return hex;\n }\n });\n\n // ── Canvas interactions ───────────────────────────────────────\n _canvasDown(e: PointerEvent): void {\n this._dragging = true;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n this._updateFromCanvas(e);\n }\n\n _canvasDrag(e: PointerEvent): void {\n if (!this._dragging) return;\n this._updateFromCanvas(e);\n }\n\n _canvasUp(e: PointerEvent): void {\n this._dragging = false;\n (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n }\n\n private _updateFromCanvas(e: PointerEvent): void {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const s = Math.round(Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width)) * 100);\n const v = Math.round(Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height)) * 100);\n this._sv.set({ s, v });\n this._emit();\n }\n\n // ── Event handlers ────────────────────────────────────────────\n _toggle(): void {\n this._isOpen.update((v) => !v);\n }\n\n _onHueChange(v: number): void {\n this._hue.set(Number(v));\n this._emit();\n }\n\n _pickSwatch(hex: string): void {\n this._applyHex(hex);\n this._emit();\n }\n\n _onTextChange(text: string): void {\n const t = text.trim();\n if (t.startsWith('#')) {\n this._applyHex(t);\n } else if (t.startsWith('rgb')) {\n const m = t.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (m) this._applyHex(rgbToHex(+m[1], +m[2], +m[3]));\n } else if (t.startsWith('hsl')) {\n const m = t.match(/hsl\\((\\d+),\\s*(\\d+)%?,\\s*(\\d+)%?\\)/);\n if (m) this._applyHex(hslToHex(+m[1], +m[2], +m[3]));\n }\n this._emit();\n }\n\n // ── Helpers ───────────────────────────────────────────────────\n private _applyHex(hex: string): void {\n const rgb = hexToRgb(hex);\n if (!rgb) return;\n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);\n this._hue.set(hsv.h);\n this._sv.set({ s: hsv.s, v: hsv.v });\n }\n\n private _emit(): void {\n const val = this._textValue();\n this._onChange(val);\n this.colorChange.emit(val);\n }\n\n // ── CVA ──────────────────────────────────────────────────────\n writeValue(val: string | null): void {\n if (!val) return;\n this._onTextChange(val);\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(d: boolean): void {\n this._cvaDisabled.set(d);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -11,20 +11,16 @@ import { signal, computed, Injectable, inject, ChangeDetectionStrategy, ViewEnca
|
|
|
11
11
|
* inject(NeuCommandPaletteService).open();
|
|
12
12
|
*/
|
|
13
13
|
class NeuCommandPaletteService {
|
|
14
|
-
_commands = signal([], /*
|
|
15
|
-
...(ngDevMode ? [{ debugName: "
|
|
16
|
-
|
|
17
|
-
...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
|
|
18
|
-
query = signal('', /* @ts-ignore */
|
|
19
|
-
...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
|
|
14
|
+
_commands = signal([], ...(ngDevMode ? [{ debugName: "_commands" }] : /* istanbul ignore next */ []));
|
|
15
|
+
isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
|
|
16
|
+
query = signal('', ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
|
|
20
17
|
filteredCommands = computed(() => {
|
|
21
18
|
const q = this.query().toLowerCase().trim();
|
|
22
19
|
const cmds = this._commands();
|
|
23
20
|
if (!q)
|
|
24
21
|
return cmds;
|
|
25
22
|
return cmds.filter((c) => c.label.toLowerCase().includes(q) || (c.group?.toLowerCase().includes(q) ?? false));
|
|
26
|
-
}, /*
|
|
27
|
-
...(ngDevMode ? [{ debugName: "filteredCommands" }] : /* istanbul ignore next */ []));
|
|
23
|
+
}, ...(ngDevMode ? [{ debugName: "filteredCommands" }] : /* istanbul ignore next */ []));
|
|
28
24
|
register(...commands) {
|
|
29
25
|
this._commands.update((list) => {
|
|
30
26
|
const ids = new Set(commands.map((c) => c.id));
|
|
@@ -48,10 +44,10 @@ class NeuCommandPaletteService {
|
|
|
48
44
|
cmd?.action();
|
|
49
45
|
this.close();
|
|
50
46
|
}
|
|
51
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
52
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
47
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuCommandPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
48
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuCommandPaletteService, providedIn: 'root' });
|
|
53
49
|
}
|
|
54
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuCommandPaletteService, decorators: [{
|
|
55
51
|
type: Injectable,
|
|
56
52
|
args: [{ providedIn: 'root' }]
|
|
57
53
|
}] });
|
|
@@ -66,8 +62,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
|
|
|
66
62
|
*/
|
|
67
63
|
class NeuCommandPaletteComponent {
|
|
68
64
|
_svc = inject(NeuCommandPaletteService);
|
|
69
|
-
_activeIndex = signal(0, /*
|
|
70
|
-
...(ngDevMode ? [{ debugName: "_activeIndex" }] : /* istanbul ignore next */ []));
|
|
65
|
+
_activeIndex = signal(0, ...(ngDevMode ? [{ debugName: "_activeIndex" }] : /* istanbul ignore next */ []));
|
|
71
66
|
_onDocKey(e) {
|
|
72
67
|
if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
|
|
73
68
|
e.preventDefault();
|
|
@@ -96,8 +91,8 @@ class NeuCommandPaletteComponent {
|
|
|
96
91
|
break;
|
|
97
92
|
}
|
|
98
93
|
}
|
|
99
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
100
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
94
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuCommandPaletteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
95
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuCommandPaletteComponent, isStandalone: true, selector: "neu-command-palette", host: { listeners: { "document:keydown": "_onDocKey($event)" } }, ngImport: i0, template: `
|
|
101
96
|
@if (_svc.isOpen()) {
|
|
102
97
|
<!-- Backdrop -->
|
|
103
98
|
<div class="neu-cp-backdrop" aria-hidden="true" (click)="_svc.close()"></div>
|
|
@@ -162,7 +157,7 @@ class NeuCommandPaletteComponent {
|
|
|
162
157
|
}
|
|
163
158
|
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-cp-backdrop{position:fixed;inset:0;background:var(--neu-overlay-bg);z-index:1200;animation:neu-cp-fade-in 80ms ease}@keyframes neu-cp-fade-in{0%{opacity:0}to{opacity:1}}.neu-cmd{position:fixed;top:20%;left:50%;transform:translate(-50%);width:560px;max-width:calc(100vw - 32px);background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:var(--neu-radius-xl);box-shadow:var(--neu-cmd-shadow);z-index:1201;display:flex;flex-direction:column;overflow:hidden;animation:neu-cmd-in .1s ease}@keyframes neu-cmd-in{0%{opacity:0;transform:translate(-50%) translateY(-8px) scale(.97)}to{opacity:1;transform:translate(-50%) translateY(0) scale(1)}}.neu-cmd__search-wrap{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--neu-border)}.neu-cmd__search-icon{font-size:1rem;flex-shrink:0}.neu-cmd__input{flex:1;border:none;outline:none;background:transparent;font-size:1rem;color:var(--neu-text)}.neu-cmd__input::placeholder{color:var(--neu-text-muted)}.neu-cmd__esc-hint{font-size:.6875rem;padding:2px 6px;background:var(--neu-surface-2);border:1px solid var(--neu-border);border-radius:4px;color:var(--neu-text-muted)}.neu-cmd__list{list-style:none;margin:0;padding:6px;max-height:320px;overflow-y:auto}.neu-cmd__empty{padding:14px 12px;font-size:.875rem;color:var(--neu-text-muted);text-align:center}.neu-cmd__item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--neu-radius-lg, 12px);cursor:pointer;transition:background 80ms}.neu-cmd__item--active,.neu-cmd__item:hover{background:var(--neu-primary-50)}.neu-cmd__item-icon{font-size:1rem;flex-shrink:0;width:20px;text-align:center}.neu-cmd__item-label{flex:1;font-size:.9375rem;color:var(--neu-text)}.neu-cmd__item-group{font-size:.75rem;color:var(--neu-text-muted)}.neu-cmd__item-shortcut{font-size:.6875rem;padding:2px 5px;background:var(--neu-surface-2);border:1px solid var(--neu-border);border-radius:4px;color:var(--neu-text-muted)}.neu-cmd__footer{display:flex;gap:16px;align-items:center;padding:8px 14px;border-top:1px solid var(--neu-border);font-size:.6875rem;color:var(--neu-text-muted)}.neu-cmd__footer kbd{margin-right:3px;padding:1px 4px;background:var(--neu-surface-2);border:1px solid var(--neu-border);border-radius:3px;color:var(--neu-text-muted)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
164
159
|
}
|
|
165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
160
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuCommandPaletteComponent, decorators: [{
|
|
166
161
|
type: Component,
|
|
167
162
|
args: [{ selector: 'neu-command-palette', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
168
163
|
'(document:keydown)': '_onDocKey($event)',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-command-palette.mjs","sources":["../../../../projects/ui-core/command-palette/neu-command-palette.component.ts","../../../../projects/ui-core/command-palette/neural-ui-core-command-palette.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n OnDestroy,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nexport interface NeuCommand {\n id: string;\n label: string;\n /** Grupo / Category */\n group?: string;\n /** Icono (emoji / texto) / Icon */\n icon?: string;\n /** Shortcut display (e.g. '⌘K') */\n shortcut?: string;\n /** Handler invocado al seleccionar / Handler called on select */\n action: () => void;\n}\n\n/**\n * NeuralUI CommandPaletteService\n *\n * Gestiona los comandos registrados y la apertura/cierre del pallete.\n *\n * Uso:\n * inject(NeuCommandPaletteService).register({ id: 'goto-home', label: 'Ir al inicio', action: () => router.navigate(['/']) });\n * inject(NeuCommandPaletteService).open();\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuCommandPaletteService {\n private readonly _commands = signal<NeuCommand[]>([]);\n readonly isOpen = signal(false);\n readonly query = signal('');\n\n readonly filteredCommands = computed(() => {\n const q = this.query().toLowerCase().trim();\n const cmds = this._commands();\n if (!q) return cmds;\n return cmds.filter(\n (c) => c.label.toLowerCase().includes(q) || (c.group?.toLowerCase().includes(q) ?? false),\n );\n });\n\n register(...commands: NeuCommand[]): void {\n this._commands.update((list) => {\n const ids = new Set(commands.map((c) => c.id));\n return [...list.filter((c) => !ids.has(c.id)), ...commands];\n });\n }\n\n unregister(...ids: string[]): void {\n const set = new Set(ids);\n this._commands.update((list) => list.filter((c) => !set.has(c.id)));\n }\n\n open(): void {\n this.query.set('');\n this.isOpen.set(true);\n }\n\n close(): void {\n this.isOpen.set(false);\n this.query.set('');\n }\n\n execute(id: string): void {\n const cmd = this._commands().find((c) => c.id === id);\n cmd?.action();\n this.close();\n }\n}\n\n/**\n * NeuralUI CommandPalette Component\n *\n * Paleta de comandos activada con Cmd+K / Ctrl+K.\n * Registra el atajos globalmente mientras el componente está montado.\n *\n * Uso:\n * <neu-command-palette /> <!-- colócalo una vez en el root layout -->\n */\n@Component({\n selector: 'neu-command-palette',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:keydown)': '_onDocKey($event)',\n },\n template: `\n @if (_svc.isOpen()) {\n <!-- Backdrop -->\n <div class=\"neu-cp-backdrop\" aria-hidden=\"true\" (click)=\"_svc.close()\"></div>\n\n <!-- Dialog -->\n <div class=\"neu-cmd\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Paleta de comandos\">\n <div class=\"neu-cmd__search-wrap\">\n <span class=\"neu-cmd__search-icon\" aria-hidden=\"true\">🔍</span>\n <input\n class=\"neu-cmd__input\"\n type=\"text\"\n placeholder=\"Buscar comandos…\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-autocomplete=\"list\"\n aria-controls=\"neu-cmd-list\"\n [value]=\"_svc.query()\"\n (input)=\"_svc.query.set($any($event.target).value)\"\n (keydown)=\"_onInputKey($event)\"\n #searchInput\n />\n <kbd class=\"neu-cmd__esc-hint\">ESC</kbd>\n </div>\n\n <ul id=\"neu-cmd-list\" class=\"neu-cmd__list\" role=\"listbox\" aria-label=\"Comandos\">\n @if (!_svc.filteredCommands().length) {\n <li class=\"neu-cmd__empty\" role=\"option\" aria-selected=\"false\">\n Sin resultados para \"{{ _svc.query() }}\"\n </li>\n }\n @for (cmd of _svc.filteredCommands(); track cmd.id; let i = $index) {\n <li\n class=\"neu-cmd__item\"\n role=\"option\"\n [class.neu-cmd__item--active]=\"_activeIndex() === i\"\n [id]=\"'neu-cmd-opt-' + i\"\n [attr.aria-selected]=\"_activeIndex() === i\"\n (click)=\"_svc.execute(cmd.id)\"\n (mouseenter)=\"_activeIndex.set(i)\"\n >\n @if (cmd.icon) {\n <span class=\"neu-cmd__item-icon\" aria-hidden=\"true\">{{ cmd.icon }}</span>\n }\n <span class=\"neu-cmd__item-label\">{{ cmd.label }}</span>\n @if (cmd.group) {\n <span class=\"neu-cmd__item-group\">{{ cmd.group }}</span>\n }\n @if (cmd.shortcut) {\n <kbd class=\"neu-cmd__item-shortcut\">{{ cmd.shortcut }}</kbd>\n }\n </li>\n }\n </ul>\n\n <div class=\"neu-cmd__footer\">\n <span><kbd>↑↓</kbd> navegar</span>\n <span><kbd>↵</kbd> ejecutar</span>\n <span><kbd>ESC</kbd> cerrar</span>\n </div>\n </div>\n }\n `,\n styleUrl: './neu-command-palette.component.scss',\n})\nexport class NeuCommandPaletteComponent {\n readonly _svc = inject(NeuCommandPaletteService);\n readonly _activeIndex = signal(0);\n\n _onDocKey(e: KeyboardEvent): void {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n this._svc.isOpen() ? this._svc.close() : this._svc.open();\n }\n }\n\n _onInputKey(e: KeyboardEvent): void {\n const total = this._svc.filteredCommands().length;\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n this._activeIndex.update((i) => Math.min(i + 1, total - 1));\n break;\n case 'ArrowUp':\n e.preventDefault();\n this._activeIndex.update((i) => Math.max(i - 1, 0));\n break;\n case 'Enter': {\n const cmd = this._svc.filteredCommands()[this._activeIndex()];\n if (cmd) this._svc.execute(cmd.id);\n break;\n }\n case 'Escape':\n this._svc.close();\n break;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"neural-ui-core-command-palette.mjs","sources":["../../../../projects/ui-core/command-palette/neu-command-palette.component.ts","../../../../projects/ui-core/command-palette/neural-ui-core-command-palette.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n OnDestroy,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nexport interface NeuCommand {\n id: string;\n label: string;\n /** Grupo / Category */\n group?: string;\n /** Icono (emoji / texto) / Icon */\n icon?: string;\n /** Shortcut display (e.g. '⌘K') */\n shortcut?: string;\n /** Handler invocado al seleccionar / Handler called on select */\n action: () => void;\n}\n\n/**\n * NeuralUI CommandPaletteService\n *\n * Gestiona los comandos registrados y la apertura/cierre del pallete.\n *\n * Uso:\n * inject(NeuCommandPaletteService).register({ id: 'goto-home', label: 'Ir al inicio', action: () => router.navigate(['/']) });\n * inject(NeuCommandPaletteService).open();\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuCommandPaletteService {\n private readonly _commands = signal<NeuCommand[]>([]);\n readonly isOpen = signal(false);\n readonly query = signal('');\n\n readonly filteredCommands = computed(() => {\n const q = this.query().toLowerCase().trim();\n const cmds = this._commands();\n if (!q) return cmds;\n return cmds.filter(\n (c) => c.label.toLowerCase().includes(q) || (c.group?.toLowerCase().includes(q) ?? false),\n );\n });\n\n register(...commands: NeuCommand[]): void {\n this._commands.update((list) => {\n const ids = new Set(commands.map((c) => c.id));\n return [...list.filter((c) => !ids.has(c.id)), ...commands];\n });\n }\n\n unregister(...ids: string[]): void {\n const set = new Set(ids);\n this._commands.update((list) => list.filter((c) => !set.has(c.id)));\n }\n\n open(): void {\n this.query.set('');\n this.isOpen.set(true);\n }\n\n close(): void {\n this.isOpen.set(false);\n this.query.set('');\n }\n\n execute(id: string): void {\n const cmd = this._commands().find((c) => c.id === id);\n cmd?.action();\n this.close();\n }\n}\n\n/**\n * NeuralUI CommandPalette Component\n *\n * Paleta de comandos activada con Cmd+K / Ctrl+K.\n * Registra el atajos globalmente mientras el componente está montado.\n *\n * Uso:\n * <neu-command-palette /> <!-- colócalo una vez en el root layout -->\n */\n@Component({\n selector: 'neu-command-palette',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:keydown)': '_onDocKey($event)',\n },\n template: `\n @if (_svc.isOpen()) {\n <!-- Backdrop -->\n <div class=\"neu-cp-backdrop\" aria-hidden=\"true\" (click)=\"_svc.close()\"></div>\n\n <!-- Dialog -->\n <div class=\"neu-cmd\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Paleta de comandos\">\n <div class=\"neu-cmd__search-wrap\">\n <span class=\"neu-cmd__search-icon\" aria-hidden=\"true\">🔍</span>\n <input\n class=\"neu-cmd__input\"\n type=\"text\"\n placeholder=\"Buscar comandos…\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-autocomplete=\"list\"\n aria-controls=\"neu-cmd-list\"\n [value]=\"_svc.query()\"\n (input)=\"_svc.query.set($any($event.target).value)\"\n (keydown)=\"_onInputKey($event)\"\n #searchInput\n />\n <kbd class=\"neu-cmd__esc-hint\">ESC</kbd>\n </div>\n\n <ul id=\"neu-cmd-list\" class=\"neu-cmd__list\" role=\"listbox\" aria-label=\"Comandos\">\n @if (!_svc.filteredCommands().length) {\n <li class=\"neu-cmd__empty\" role=\"option\" aria-selected=\"false\">\n Sin resultados para \"{{ _svc.query() }}\"\n </li>\n }\n @for (cmd of _svc.filteredCommands(); track cmd.id; let i = $index) {\n <li\n class=\"neu-cmd__item\"\n role=\"option\"\n [class.neu-cmd__item--active]=\"_activeIndex() === i\"\n [id]=\"'neu-cmd-opt-' + i\"\n [attr.aria-selected]=\"_activeIndex() === i\"\n (click)=\"_svc.execute(cmd.id)\"\n (mouseenter)=\"_activeIndex.set(i)\"\n >\n @if (cmd.icon) {\n <span class=\"neu-cmd__item-icon\" aria-hidden=\"true\">{{ cmd.icon }}</span>\n }\n <span class=\"neu-cmd__item-label\">{{ cmd.label }}</span>\n @if (cmd.group) {\n <span class=\"neu-cmd__item-group\">{{ cmd.group }}</span>\n }\n @if (cmd.shortcut) {\n <kbd class=\"neu-cmd__item-shortcut\">{{ cmd.shortcut }}</kbd>\n }\n </li>\n }\n </ul>\n\n <div class=\"neu-cmd__footer\">\n <span><kbd>↑↓</kbd> navegar</span>\n <span><kbd>↵</kbd> ejecutar</span>\n <span><kbd>ESC</kbd> cerrar</span>\n </div>\n </div>\n }\n `,\n styleUrl: './neu-command-palette.component.scss',\n})\nexport class NeuCommandPaletteComponent {\n readonly _svc = inject(NeuCommandPaletteService);\n readonly _activeIndex = signal(0);\n\n _onDocKey(e: KeyboardEvent): void {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n this._svc.isOpen() ? this._svc.close() : this._svc.open();\n }\n }\n\n _onInputKey(e: KeyboardEvent): void {\n const total = this._svc.filteredCommands().length;\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n this._activeIndex.update((i) => Math.min(i + 1, total - 1));\n break;\n case 'ArrowUp':\n e.preventDefault();\n this._activeIndex.update((i) => Math.max(i - 1, 0));\n break;\n case 'Enter': {\n const cmd = this._svc.filteredCommands()[this._activeIndex()];\n if (cmd) this._svc.execute(cmd.id);\n break;\n }\n case 'Escape':\n this._svc.close();\n break;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,8 @@ class NeuConfirmDialogComponent {
|
|
|
14
14
|
reject() {
|
|
15
15
|
this._dialogRef.close(false);
|
|
16
16
|
}
|
|
17
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
18
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
17
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuConfirmDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
18
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuConfirmDialogComponent, isStandalone: true, selector: "neu-confirm-dialog", host: { attributes: { "role": "alertdialog", "aria-modal": "true" }, properties: { "attr.aria-labelledby": "\"neu-confirm-title\"", "attr.aria-describedby": "\"neu-confirm-msg\"" }, classAttribute: "neu-confirm-dialog" }, ngImport: i0, template: `
|
|
19
19
|
@if (data.title) {
|
|
20
20
|
<h2 class="neu-confirm-dialog__title" id="neu-confirm-title">{{ data.title }}</h2>
|
|
21
21
|
}
|
|
@@ -41,7 +41,7 @@ class NeuConfirmDialogComponent {
|
|
|
41
41
|
</div>
|
|
42
42
|
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-confirm-dialog{display:flex;flex-direction:column;gap:16px;background:var(--neu-surface-1, #ffffff);border:1px solid var(--neu-border-color, #e5e7eb);border-radius:var(--neu-radius-xl, 16px);box-shadow:0 20px 40px -8px #0000002e;padding:24px;width:clamp(280px,90vw,420px);animation:neu-confirm-in .14s ease}.neu-confirm-dialog__title{margin:0;font-size:1.125rem;font-weight:600;color:var(--neu-text-primary, #111)}.neu-confirm-dialog__message{margin:0;font-size:.9375rem;color:var(--neu-text-secondary, #4b5563);line-height:1.55}.neu-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:8px;padding-top:4px}.neu-confirm-dialog__btn{all:unset;box-sizing:border-box;padding:8px 18px;border-radius:var(--neu-radius-md, 8px);font-size:.875rem;font-weight:500;cursor:pointer;transition:background .12s,color .12s}.neu-confirm-dialog__btn:focus-visible{outline:2px solid var(--neu-focus-ring, #0ea5e9);outline-offset:2px}.neu-confirm-dialog__btn--reject{color:var(--neu-text-secondary, #4b5563);background:var(--neu-surface-2, #f3f4f6)}.neu-confirm-dialog__btn--reject:hover{background:var(--neu-surface-3, #e5e7eb)}.neu-confirm-dialog__btn--reject.neu-confirm-dialog__btn--danger{background:var(--neu-color-danger, #ef4444);color:var(--neu-primary-fg)}.neu-confirm-dialog__btn--reject.neu-confirm-dialog__btn--danger:hover{filter:brightness(1.08)}.neu-confirm-dialog__btn--primary{background:var(--neu-color-primary, #0ea5e9);color:var(--neu-primary-solid-fg, var(--neu-primary-fg))}.neu-confirm-dialog__btn--primary:hover{filter:brightness(1.08)}.neu-confirm-dialog__btn--danger{background:var(--neu-color-danger, #ef4444);color:var(--neu-primary-fg)}.neu-confirm-dialog__btn--danger:hover{filter:brightness(1.08)}@keyframes neu-confirm-in{0%{opacity:0;transform:translateY(8px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}.neu-confirm-dialog-backdrop{background:var(--neu-overlay-bg);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
43
43
|
}
|
|
44
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuConfirmDialogComponent, decorators: [{
|
|
45
45
|
type: Component,
|
|
46
46
|
args: [{ selector: 'neu-confirm-dialog', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
47
47
|
class: 'neu-confirm-dialog',
|
|
@@ -102,10 +102,10 @@ class NeuConfirmDialogService {
|
|
|
102
102
|
ref.closed.subscribe((result) => resolve(result ?? false));
|
|
103
103
|
});
|
|
104
104
|
}
|
|
105
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
106
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
105
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuConfirmDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
106
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuConfirmDialogService, providedIn: 'root' });
|
|
107
107
|
}
|
|
108
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
108
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuConfirmDialogService, decorators: [{
|
|
109
109
|
type: Injectable,
|
|
110
110
|
args: [{ providedIn: 'root' }]
|
|
111
111
|
}] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-confirm-dialog.mjs","sources":["../../../../projects/ui-core/confirm-dialog/neu-confirm-dialog.component.ts","../../../../projects/ui-core/confirm-dialog/neural-ui-core-confirm-dialog.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n ViewEncapsulation,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { Dialog, DialogRef, DIALOG_DATA } from '@angular/cdk/dialog';\n\nexport interface NeuConfirmDialogData {\n /** Título del diálogo / Dialog title */\n title?: string;\n /** Mensaje principal / Main message */\n message: string;\n /** Etiqueta botón aceptar / Accept button label */\n acceptLabel?: string;\n /** Etiqueta botón cancelar / Cancel button label */\n rejectLabel?: string;\n /** Variante del botón cancelar / Reject button variant */\n rejectVariant?: 'secondary' | 'danger';\n /** Variante del botón aceptar / Accept button variant */\n acceptVariant?: 'primary' | 'danger';\n}\n\n/**\n * NeuralUI ConfirmDialog Component (internal — usado por NeuConfirmDialogService)\n */\n@Component({\n selector: 'neu-confirm-dialog',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-confirm-dialog',\n role: 'alertdialog',\n 'aria-modal': 'true',\n '[attr.aria-labelledby]': '\"neu-confirm-title\"',\n '[attr.aria-describedby]': '\"neu-confirm-msg\"',\n },\n template: `\n @if (data.title) {\n <h2 class=\"neu-confirm-dialog__title\" id=\"neu-confirm-title\">{{ data.title }}</h2>\n }\n <p class=\"neu-confirm-dialog__message\" id=\"neu-confirm-msg\">{{ data.message }}</p>\n <div class=\"neu-confirm-dialog__actions\">\n <button\n type=\"button\"\n class=\"neu-confirm-dialog__btn neu-confirm-dialog__btn--reject\"\n [class.neu-confirm-dialog__btn--danger]=\"data.rejectVariant === 'danger'\"\n (click)=\"reject()\"\n >\n {{ data.rejectLabel ?? 'Cancelar' }}\n </button>\n <button\n type=\"button\"\n class=\"neu-confirm-dialog__btn\"\n [class.neu-confirm-dialog__btn--primary]=\"(data.acceptVariant ?? 'primary') === 'primary'\"\n [class.neu-confirm-dialog__btn--danger]=\"data.acceptVariant === 'danger'\"\n (click)=\"accept()\"\n >\n {{ data.acceptLabel ?? 'Aceptar' }}\n </button>\n </div>\n `,\n styleUrl: './neu-confirm-dialog.component.scss',\n})\nexport class NeuConfirmDialogComponent {\n readonly data: NeuConfirmDialogData = inject(DIALOG_DATA);\n private readonly _dialogRef = inject(DialogRef<boolean>);\n\n accept(): void {\n this._dialogRef.close(true);\n }\n\n reject(): void {\n this._dialogRef.close(false);\n }\n}\n\n/**\n * NeuralUI ConfirmDialog Service\n *\n * Abre un diálogo de confirmación y retorna una promesa con el resultado.\n *\n * Uso:\n * inject(NeuConfirmDialogService)\n * .confirm({ message: '¿Eliminar este registro?', acceptVariant: 'danger' })\n * .then(ok => ok && doDelete());\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuConfirmDialogService {\n private readonly _dialog = inject(Dialog);\n\n /**\n * Abre el diálogo y resuelve con `true` si el usuario acepta,\n * `false` si cancela o cierra el diálogo.\n */\n confirm(data: NeuConfirmDialogData): Promise<boolean> {\n const ref = this._dialog.open<boolean, NeuConfirmDialogData>(NeuConfirmDialogComponent, {\n data,\n panelClass: 'neu-confirm-dialog-panel',\n backdropClass: 'neu-confirm-dialog-backdrop',\n disableClose: true,\n });\n return new Promise<boolean>((resolve) => {\n ref.closed.subscribe((result) => resolve(result ?? false));\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;AA0BA;;AAEG;MAwCU,yBAAyB,CAAA;AAC3B,IAAA,IAAI,GAAyB,MAAM,CAAC,WAAW,CAAC;AACxC,IAAA,UAAU,GAAG,MAAM,EAAC,SAAkB,EAAC;IAExD,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IAC7B;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9B;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-confirm-dialog.mjs","sources":["../../../../projects/ui-core/confirm-dialog/neu-confirm-dialog.component.ts","../../../../projects/ui-core/confirm-dialog/neural-ui-core-confirm-dialog.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n ViewEncapsulation,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { Dialog, DialogRef, DIALOG_DATA } from '@angular/cdk/dialog';\n\nexport interface NeuConfirmDialogData {\n /** Título del diálogo / Dialog title */\n title?: string;\n /** Mensaje principal / Main message */\n message: string;\n /** Etiqueta botón aceptar / Accept button label */\n acceptLabel?: string;\n /** Etiqueta botón cancelar / Cancel button label */\n rejectLabel?: string;\n /** Variante del botón cancelar / Reject button variant */\n rejectVariant?: 'secondary' | 'danger';\n /** Variante del botón aceptar / Accept button variant */\n acceptVariant?: 'primary' | 'danger';\n}\n\n/**\n * NeuralUI ConfirmDialog Component (internal — usado por NeuConfirmDialogService)\n */\n@Component({\n selector: 'neu-confirm-dialog',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-confirm-dialog',\n role: 'alertdialog',\n 'aria-modal': 'true',\n '[attr.aria-labelledby]': '\"neu-confirm-title\"',\n '[attr.aria-describedby]': '\"neu-confirm-msg\"',\n },\n template: `\n @if (data.title) {\n <h2 class=\"neu-confirm-dialog__title\" id=\"neu-confirm-title\">{{ data.title }}</h2>\n }\n <p class=\"neu-confirm-dialog__message\" id=\"neu-confirm-msg\">{{ data.message }}</p>\n <div class=\"neu-confirm-dialog__actions\">\n <button\n type=\"button\"\n class=\"neu-confirm-dialog__btn neu-confirm-dialog__btn--reject\"\n [class.neu-confirm-dialog__btn--danger]=\"data.rejectVariant === 'danger'\"\n (click)=\"reject()\"\n >\n {{ data.rejectLabel ?? 'Cancelar' }}\n </button>\n <button\n type=\"button\"\n class=\"neu-confirm-dialog__btn\"\n [class.neu-confirm-dialog__btn--primary]=\"(data.acceptVariant ?? 'primary') === 'primary'\"\n [class.neu-confirm-dialog__btn--danger]=\"data.acceptVariant === 'danger'\"\n (click)=\"accept()\"\n >\n {{ data.acceptLabel ?? 'Aceptar' }}\n </button>\n </div>\n `,\n styleUrl: './neu-confirm-dialog.component.scss',\n})\nexport class NeuConfirmDialogComponent {\n readonly data: NeuConfirmDialogData = inject(DIALOG_DATA);\n private readonly _dialogRef = inject(DialogRef<boolean>);\n\n accept(): void {\n this._dialogRef.close(true);\n }\n\n reject(): void {\n this._dialogRef.close(false);\n }\n}\n\n/**\n * NeuralUI ConfirmDialog Service\n *\n * Abre un diálogo de confirmación y retorna una promesa con el resultado.\n *\n * Uso:\n * inject(NeuConfirmDialogService)\n * .confirm({ message: '¿Eliminar este registro?', acceptVariant: 'danger' })\n * .then(ok => ok && doDelete());\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuConfirmDialogService {\n private readonly _dialog = inject(Dialog);\n\n /**\n * Abre el diálogo y resuelve con `true` si el usuario acepta,\n * `false` si cancela o cierra el diálogo.\n */\n confirm(data: NeuConfirmDialogData): Promise<boolean> {\n const ref = this._dialog.open<boolean, NeuConfirmDialogData>(NeuConfirmDialogComponent, {\n data,\n panelClass: 'neu-confirm-dialog-panel',\n backdropClass: 'neu-confirm-dialog-backdrop',\n disableClose: true,\n });\n return new Promise<boolean>((resolve) => {\n ref.closed.subscribe((result) => resolve(result ?? false));\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;AA0BA;;AAEG;MAwCU,yBAAyB,CAAA;AAC3B,IAAA,IAAI,GAAyB,MAAM,CAAC,WAAW,CAAC;AACxC,IAAA,UAAU,GAAG,MAAM,EAAC,SAAkB,EAAC;IAExD,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IAC7B;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9B;wGAVW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,aAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3B1B;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,48DAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAGU,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAvCrC,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,EAAE,EAAA,aAAA,EACI,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,oBAAoB;AAC3B,wBAAA,IAAI,EAAE,aAAa;AACnB,wBAAA,YAAY,EAAE,MAAM;AACpB,wBAAA,wBAAwB,EAAE,qBAAqB;AAC/C,wBAAA,yBAAyB,EAAE,mBAAmB;qBAC/C,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,48DAAA,CAAA,EAAA;;AAgBH;;;;;;;;;AASG;MAEU,uBAAuB,CAAA;AACjB,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AAEzC;;;AAGG;AACH,IAAA,OAAO,CAAC,IAA0B,EAAA;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAgC,yBAAyB,EAAE;YACtF,IAAI;AACJ,YAAA,UAAU,EAAE,0BAA0B;AACtC,YAAA,aAAa,EAAE,6BAA6B;AAC5C,YAAA,YAAY,EAAE,IAAI;AACnB,SAAA,CAAC;AACF,QAAA,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,KAAI;AACtC,YAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AAC5D,QAAA,CAAC,CAAC;IACJ;wGAjBW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADV,MAAM,EAAA,CAAA;;4FACnB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC3FlC;;AAEG;;;;"}
|
|
@@ -8,8 +8,7 @@ let _seq = 0;
|
|
|
8
8
|
* NeuralUI ContextMenu Overlay Component (internal)
|
|
9
9
|
*/
|
|
10
10
|
class NeuContextMenuOverlayComponent {
|
|
11
|
-
_items = signal([], /*
|
|
12
|
-
...(ngDevMode ? [{ debugName: "_items" }] : /* istanbul ignore next */ []));
|
|
11
|
+
_items = signal([], ...(ngDevMode ? [{ debugName: "_items" }] : /* istanbul ignore next */ []));
|
|
13
12
|
_selectFn = null;
|
|
14
13
|
_escapeFn = null;
|
|
15
14
|
select(item) {
|
|
@@ -19,8 +18,8 @@ class NeuContextMenuOverlayComponent {
|
|
|
19
18
|
_onEscape() {
|
|
20
19
|
this._escapeFn?.();
|
|
21
20
|
}
|
|
22
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
23
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
21
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuContextMenuOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
22
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuContextMenuOverlayComponent, isStandalone: true, selector: "neu-context-menu-overlay", host: { attributes: { "role": "menu", "tabindex": "-1" }, listeners: { "keydown.escape": "_onEscape()" }, classAttribute: "neu-context-menu" }, ngImport: i0, template: `
|
|
24
23
|
@for (item of _items(); track item.key) {
|
|
25
24
|
@if (item.separator && !$first) {
|
|
26
25
|
<hr class="neu-context-menu__separator" role="separator" />
|
|
@@ -43,7 +42,7 @@ class NeuContextMenuOverlayComponent {
|
|
|
43
42
|
}
|
|
44
43
|
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-context-menu{background:var(--neu-context-menu-bg, var(--neu-surface-1, #ffffff));border:1px solid var(--neu-context-menu-border, var(--neu-border-color, #e5e7eb));border-radius:var(--neu-radius-lg, 12px);box-shadow:0 8px 24px -4px #00000024;padding:6px;min-width:180px;max-width:260px;z-index:2000;outline:none;animation:neu-ctx-in 80ms ease}@keyframes neu-ctx-in{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}.neu-context-menu__item{all:unset;display:flex;align-items:center;gap:8px;width:100%;box-sizing:border-box;padding:7px 10px;border-radius:var(--neu-radius-md, 8px);font-size:.875rem;color:var(--neu-context-menu-color, var(--neu-text, var(--neu-text-primary, #111827)));cursor:pointer;transition:background .1s}.neu-context-menu__item:hover:not(.neu-context-menu__item--disabled){background:var(--neu-context-menu-hover, var(--neu-surface-2, #f3f4f6))}.neu-context-menu__item:focus-visible{background:var(--neu-context-menu-hover, var(--neu-surface-2, #f3f4f6));outline:2px solid var(--neu-focus-ring, #0ea5e9);outline-offset:-2px}.neu-context-menu__item.neu-context-menu__item--danger{color:var(--neu-color-danger, #ef4444)}.neu-context-menu__item.neu-context-menu__item--disabled{color:var(--neu-context-menu-disabled-color, var(--neu-text-muted, #6b7280));opacity:.56;cursor:not-allowed;pointer-events:none}.neu-context-menu__icon{flex-shrink:0;font-style:normal;font-size:1em}.neu-context-menu__separator{all:unset;display:block;height:1px;background:var(--neu-context-menu-border, var(--neu-border-color, #e5e7eb));margin:4px 0}.neu-context-menu-backdrop{background:transparent}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
45
44
|
}
|
|
46
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuContextMenuOverlayComponent, decorators: [{
|
|
47
46
|
type: Component,
|
|
48
47
|
args: [{ selector: 'neu-context-menu-overlay', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
49
48
|
class: 'neu-context-menu',
|
|
@@ -85,11 +84,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
|
|
|
85
84
|
*/
|
|
86
85
|
class NeuContextMenuDirective {
|
|
87
86
|
/** Ítems del menú / Menu items */
|
|
88
|
-
neuContextMenu = input([], /*
|
|
89
|
-
...(ngDevMode ? [{ debugName: "neuContextMenu" }] : /* istanbul ignore next */ []));
|
|
87
|
+
neuContextMenu = input([], ...(ngDevMode ? [{ debugName: "neuContextMenu" }] : /* istanbul ignore next */ []));
|
|
90
88
|
/** Desactiva el menú / Disables the menu */
|
|
91
|
-
neuContextMenuDisabled = input(false, /*
|
|
92
|
-
...(ngDevMode ? [{ debugName: "neuContextMenuDisabled" }] : /* istanbul ignore next */ []));
|
|
89
|
+
neuContextMenuDisabled = input(false, ...(ngDevMode ? [{ debugName: "neuContextMenuDisabled" }] : /* istanbul ignore next */ []));
|
|
93
90
|
/** Emitido al seleccionar un ítem / Emitted when an item is selected */
|
|
94
91
|
menuItemClick = output();
|
|
95
92
|
/** Emitido al abrir / Emitted on open */
|
|
@@ -139,10 +136,10 @@ class NeuContextMenuDirective {
|
|
|
139
136
|
ngOnDestroy() {
|
|
140
137
|
this._close();
|
|
141
138
|
}
|
|
142
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
143
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
139
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuContextMenuDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
140
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.17", type: NeuContextMenuDirective, isStandalone: true, selector: "[neuContextMenu]", inputs: { neuContextMenu: { classPropertyName: "neuContextMenu", publicName: "neuContextMenu", isSignal: true, isRequired: false, transformFunction: null }, neuContextMenuDisabled: { classPropertyName: "neuContextMenuDisabled", publicName: "neuContextMenuDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuItemClick: "menuItemClick", menuOpened: "menuOpened", menuClosed: "menuClosed" }, host: { listeners: { "contextmenu": "onContextMenu($event)" } }, exportAs: ["neuContextMenu"], ngImport: i0 });
|
|
144
141
|
}
|
|
145
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
142
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuContextMenuDirective, decorators: [{
|
|
146
143
|
type: Directive,
|
|
147
144
|
args: [{
|
|
148
145
|
selector: '[neuContextMenu]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-context-menu.mjs","sources":["../../../../projects/ui-core/context-menu/neu-context-menu.component.ts","../../../../projects/ui-core/context-menu/neural-ui-core-context-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n HostListener,\n Injector,\n OnDestroy,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport interface NeuContextMenuItem {\n /** Key para identificar la acción / Key to identify the action */\n key: string;\n /** Texto visible / Visible text */\n label: string;\n /** Icono opcional (texto/emoji) / Optional icon (text/emoji) */\n icon?: string;\n /** Separador antes de este item / Separator before this item */\n separator?: boolean;\n /** Desactiva el item / Disables the item */\n disabled?: boolean;\n /** Variante de color / Color variant */\n variant?: 'default' | 'danger';\n}\n\nlet _seq = 0;\n\n/**\n * NeuralUI ContextMenu Overlay Component (internal)\n */\n@Component({\n selector: 'neu-context-menu-overlay',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-context-menu',\n role: 'menu',\n tabindex: '-1',\n '(keydown.escape)': '_onEscape()',\n },\n template: `\n @for (item of _items(); track item.key) {\n @if (item.separator && !$first) {\n <hr class=\"neu-context-menu__separator\" role=\"separator\" />\n }\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"neu-context-menu__item\"\n [class.neu-context-menu__item--danger]=\"item.variant === 'danger'\"\n [class.neu-context-menu__item--disabled]=\"item.disabled\"\n [disabled]=\"item.disabled ?? false\"\n [attr.aria-disabled]=\"item.disabled ?? false\"\n (click)=\"select(item)\"\n >\n @if (item.icon) {\n <span class=\"neu-context-menu__icon\" aria-hidden=\"true\">{{ item.icon }}</span>\n }\n {{ item.label }}\n </button>\n }\n `,\n styleUrl: './neu-context-menu.component.scss',\n})\nexport class NeuContextMenuOverlayComponent {\n readonly _items = signal<NeuContextMenuItem[]>([]);\n _selectFn: ((item: NeuContextMenuItem) => void) | null = null;\n _escapeFn: (() => void) | null = null;\n\n select(item: NeuContextMenuItem): void {\n if (!item.disabled) this._selectFn?.(item);\n }\n\n _onEscape(): void {\n this._escapeFn?.();\n }\n}\n\n/**\n * NeuralUI ContextMenu Directive\n *\n * Muestra un menú contextual al hacer clic derecho sobre el elemento host.\n *\n * Uso:\n * <div [neuContextMenu]=\"menuItems\" (menuItemClick)=\"onItem($event)\">\n * Clic derecho aquí\n * </div>\n */\n@Directive({\n selector: '[neuContextMenu]',\n exportAs: 'neuContextMenu',\n})\nexport class NeuContextMenuDirective implements OnDestroy {\n /** Ítems del menú / Menu items */\n readonly neuContextMenu = input<NeuContextMenuItem[]>([]);\n\n /** Desactiva el menú / Disables the menu */\n readonly neuContextMenuDisabled = input<boolean>(false);\n\n /** Emitido al seleccionar un ítem / Emitted when an item is selected */\n readonly menuItemClick = output<NeuContextMenuItem>();\n\n /** Emitido al abrir / Emitted on open */\n readonly menuOpened = output<void>();\n\n /** Emitido al cerrar / Emitted on close */\n readonly menuClosed = output<void>();\n\n private readonly _overlay = inject(Overlay);\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _injector = inject(Injector);\n private readonly _vcr = inject(ViewContainerRef);\n private _overlayRef: OverlayRef | null = null;\n private _compRef: ComponentRef<NeuContextMenuOverlayComponent> | null = null;\n\n @HostListener('contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n event.preventDefault();\n if (this.neuContextMenuDisabled()) return;\n this._open(event.clientX, event.clientY);\n }\n\n private _open(x: number, y: number): void {\n this._close();\n this._overlayRef = this._overlay.create({\n hasBackdrop: true,\n backdropClass: 'neu-context-menu-backdrop',\n positionStrategy: this._overlay.position().global().left(`${x}px`).top(`${y}px`),\n scrollStrategy: this._overlay.scrollStrategies.close(),\n });\n\n const portal = new ComponentPortal(NeuContextMenuOverlayComponent, this._vcr, this._injector);\n this._compRef = this._overlayRef.attach(portal);\n this._compRef.instance._items.set(this.neuContextMenu());\n this._compRef.instance._selectFn = (item) => {\n this.menuItemClick.emit(item);\n this._close();\n };\n this._compRef.instance._escapeFn = () => this._close();\n\n this._overlayRef.backdropClick().subscribe(() => this._close());\n this.menuOpened.emit();\n }\n\n private _close(): void {\n if (this._overlayRef?.hasAttached()) {\n this._overlayRef.detach();\n this.menuClosed.emit();\n }\n this._overlayRef?.dispose();\n this._overlayRef = null;\n this._compRef = null;\n }\n\n ngOnDestroy(): void {\n this._close();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;AAmCA,IAAI,IAAI,GAAG,CAAC;AAEZ;;AAEG;MAoCU,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-context-menu.mjs","sources":["../../../../projects/ui-core/context-menu/neu-context-menu.component.ts","../../../../projects/ui-core/context-menu/neural-ui-core-context-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n HostListener,\n Injector,\n OnDestroy,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport interface NeuContextMenuItem {\n /** Key para identificar la acción / Key to identify the action */\n key: string;\n /** Texto visible / Visible text */\n label: string;\n /** Icono opcional (texto/emoji) / Optional icon (text/emoji) */\n icon?: string;\n /** Separador antes de este item / Separator before this item */\n separator?: boolean;\n /** Desactiva el item / Disables the item */\n disabled?: boolean;\n /** Variante de color / Color variant */\n variant?: 'default' | 'danger';\n}\n\nlet _seq = 0;\n\n/**\n * NeuralUI ContextMenu Overlay Component (internal)\n */\n@Component({\n selector: 'neu-context-menu-overlay',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-context-menu',\n role: 'menu',\n tabindex: '-1',\n '(keydown.escape)': '_onEscape()',\n },\n template: `\n @for (item of _items(); track item.key) {\n @if (item.separator && !$first) {\n <hr class=\"neu-context-menu__separator\" role=\"separator\" />\n }\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"neu-context-menu__item\"\n [class.neu-context-menu__item--danger]=\"item.variant === 'danger'\"\n [class.neu-context-menu__item--disabled]=\"item.disabled\"\n [disabled]=\"item.disabled ?? false\"\n [attr.aria-disabled]=\"item.disabled ?? false\"\n (click)=\"select(item)\"\n >\n @if (item.icon) {\n <span class=\"neu-context-menu__icon\" aria-hidden=\"true\">{{ item.icon }}</span>\n }\n {{ item.label }}\n </button>\n }\n `,\n styleUrl: './neu-context-menu.component.scss',\n})\nexport class NeuContextMenuOverlayComponent {\n readonly _items = signal<NeuContextMenuItem[]>([]);\n _selectFn: ((item: NeuContextMenuItem) => void) | null = null;\n _escapeFn: (() => void) | null = null;\n\n select(item: NeuContextMenuItem): void {\n if (!item.disabled) this._selectFn?.(item);\n }\n\n _onEscape(): void {\n this._escapeFn?.();\n }\n}\n\n/**\n * NeuralUI ContextMenu Directive\n *\n * Muestra un menú contextual al hacer clic derecho sobre el elemento host.\n *\n * Uso:\n * <div [neuContextMenu]=\"menuItems\" (menuItemClick)=\"onItem($event)\">\n * Clic derecho aquí\n * </div>\n */\n@Directive({\n selector: '[neuContextMenu]',\n exportAs: 'neuContextMenu',\n})\nexport class NeuContextMenuDirective implements OnDestroy {\n /** Ítems del menú / Menu items */\n readonly neuContextMenu = input<NeuContextMenuItem[]>([]);\n\n /** Desactiva el menú / Disables the menu */\n readonly neuContextMenuDisabled = input<boolean>(false);\n\n /** Emitido al seleccionar un ítem / Emitted when an item is selected */\n readonly menuItemClick = output<NeuContextMenuItem>();\n\n /** Emitido al abrir / Emitted on open */\n readonly menuOpened = output<void>();\n\n /** Emitido al cerrar / Emitted on close */\n readonly menuClosed = output<void>();\n\n private readonly _overlay = inject(Overlay);\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _injector = inject(Injector);\n private readonly _vcr = inject(ViewContainerRef);\n private _overlayRef: OverlayRef | null = null;\n private _compRef: ComponentRef<NeuContextMenuOverlayComponent> | null = null;\n\n @HostListener('contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n event.preventDefault();\n if (this.neuContextMenuDisabled()) return;\n this._open(event.clientX, event.clientY);\n }\n\n private _open(x: number, y: number): void {\n this._close();\n this._overlayRef = this._overlay.create({\n hasBackdrop: true,\n backdropClass: 'neu-context-menu-backdrop',\n positionStrategy: this._overlay.position().global().left(`${x}px`).top(`${y}px`),\n scrollStrategy: this._overlay.scrollStrategies.close(),\n });\n\n const portal = new ComponentPortal(NeuContextMenuOverlayComponent, this._vcr, this._injector);\n this._compRef = this._overlayRef.attach(portal);\n this._compRef.instance._items.set(this.neuContextMenu());\n this._compRef.instance._selectFn = (item) => {\n this.menuItemClick.emit(item);\n this._close();\n };\n this._compRef.instance._escapeFn = () => this._close();\n\n this._overlayRef.backdropClick().subscribe(() => this._close());\n this.menuOpened.emit();\n }\n\n private _close(): void {\n if (this._overlayRef?.hasAttached()) {\n this._overlayRef.detach();\n this.menuClosed.emit();\n }\n this._overlayRef?.dispose();\n this._overlayRef = null;\n this._compRef = null;\n }\n\n ngOnDestroy(): void {\n this._close();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -14,16 +14,12 @@ import { moveItemInArray, CdkDrag, CdkDragPlaceholder, CdkDragPreview, CdkDropLi
|
|
|
14
14
|
*/
|
|
15
15
|
class NeuDashboardGridComponent {
|
|
16
16
|
_host = inject(ElementRef);
|
|
17
|
-
tiles = input([], /*
|
|
18
|
-
...(ngDevMode ? [{ debugName: "
|
|
19
|
-
columns = input(3, /* @ts-ignore */
|
|
20
|
-
...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
|
|
17
|
+
tiles = input([], ...(ngDevMode ? [{ debugName: "tiles" }] : /* istanbul ignore next */ []));
|
|
18
|
+
columns = input(3, ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
|
|
21
19
|
/** Emitido cuando el orden cambia / Emitted when order changes */
|
|
22
20
|
orderChange = output();
|
|
23
|
-
_orderedTiles = signal([], /*
|
|
24
|
-
...(ngDevMode ? [{ debugName: "
|
|
25
|
-
_tileSlots = viewChildren('tileSlot', /* @ts-ignore */
|
|
26
|
-
...(ngDevMode ? [{ debugName: "_tileSlots" }] : /* istanbul ignore next */ []));
|
|
21
|
+
_orderedTiles = signal([], ...(ngDevMode ? [{ debugName: "_orderedTiles" }] : /* istanbul ignore next */ []));
|
|
22
|
+
_tileSlots = viewChildren('tileSlot', ...(ngDevMode ? [{ debugName: "_tileSlots" }] : /* istanbul ignore next */ []));
|
|
27
23
|
constructor() {
|
|
28
24
|
effect(() => {
|
|
29
25
|
const t = this.tiles();
|
|
@@ -55,8 +51,8 @@ class NeuDashboardGridComponent {
|
|
|
55
51
|
}
|
|
56
52
|
}
|
|
57
53
|
}
|
|
58
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
59
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
54
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuDashboardGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
55
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuDashboardGridComponent, isStandalone: true, selector: "neu-dashboard-grid", inputs: { tiles: { classPropertyName: "tiles", publicName: "tiles", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { orderChange: "orderChange" }, host: { properties: { "style.--neu-dg-cols": "columns()" }, classAttribute: "neu-dg" }, viewQueries: [{ propertyName: "_tileSlots", predicate: ["tileSlot"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
60
56
|
<div class="neu-dg__projection-source" aria-hidden="true">
|
|
61
57
|
<ng-content />
|
|
62
58
|
</div>
|
|
@@ -95,7 +91,7 @@ class NeuDashboardGridComponent {
|
|
|
95
91
|
</div>
|
|
96
92
|
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-dg{display:block;width:100%}.neu-dg__projection-source{display:none}.neu-dg__grid{display:grid;grid-template-columns:repeat(var(--neu-dg-cols, 3),1fr);gap:var(--neu-dg-gap, 16px)}.neu-dg__tile{grid-column:span var(--tile-cols, 1);grid-row:span var(--tile-rows, 1);background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:var(--neu-radius-xl, 16px);overflow:hidden;display:flex;flex-direction:column;transition:box-shadow .12s}.neu-dg__tile:hover{box-shadow:0 4px 12px -2px #00000014}.neu-dg__tile-handle{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--neu-border);cursor:grab;-webkit-user-select:none;user-select:none}.neu-dg__tile-handle:active{cursor:grabbing}.neu-dg__tile-title{font-size:.875rem;font-weight:600;color:var(--neu-text)}.neu-dg__handle-icon{font-size:1rem;color:var(--neu-text-muted);letter-spacing:2px}.neu-dg__tile-content{flex:1;overflow:auto;padding:12px 12px 16px}.neu-dg__tile-slot{display:flex;flex-direction:column;gap:var(--neu-dg-content-gap, 12px);min-height:100%}.neu-dg__placeholder{background:color-mix(in srgb,var(--neu-primary) 10%,transparent);border:2px dashed var(--neu-primary);border-radius:var(--neu-radius-xl, 16px)}.neu-dg__preview{display:flex;align-items:center;justify-content:center;padding:12px 20px;background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:var(--neu-radius-xl, 16px);box-shadow:0 8px 20px -4px #00000024;font-size:.875rem;font-weight:500}.cdk-drag-animating{transition:transform .2s cubic-bezier(.25,.8,.25,1)}\n"], dependencies: [{ kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "directive", type: CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
97
93
|
}
|
|
98
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuDashboardGridComponent, decorators: [{
|
|
99
95
|
type: Component,
|
|
100
96
|
args: [{ selector: 'neu-dashboard-grid', imports: [CdkDrag, CdkDragPlaceholder, CdkDragPreview, CdkDropList], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
101
97
|
class: 'neu-dg',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-dashboard-grid.mjs","sources":["../../../../projects/ui-core/dashboard-grid/neu-dashboard-grid.component.ts","../../../../projects/ui-core/dashboard-grid/neural-ui-core-dashboard-grid.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChildren,\n} from '@angular/core';\nimport {\n CdkDrag,\n CdkDragDrop,\n CdkDragPlaceholder,\n CdkDragPreview,\n CdkDropList,\n moveItemInArray,\n} from '@angular/cdk/drag-drop';\n\nexport interface NeuDashboardTileConfig {\n /** Identificador único / Unique identifier */\n id: string;\n /** Número de columnas que ocupa / Column span */\n cols?: number;\n /** Número de filas que ocupa / Row span */\n rows?: number;\n /** Título del tile / Tile title */\n title?: string;\n}\n\n/**\n * NeuralUI DashboardGrid\n *\n * Cuadrícula de tiles reordenables mediante drag-and-drop (CDK DragDrop).\n *\n * Uso:\n * <neu-dashboard-grid [tiles]=\"tileConfigs\" [columns]=\"3\">\n * <ng-template neuDashboardTile id=\"tile-1\">...</ng-template>\n * </neu-dashboard-grid>\n */\n@Component({\n selector: 'neu-dashboard-grid',\n imports: [CdkDrag, CdkDragPlaceholder, CdkDragPreview, CdkDropList],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-dg',\n '[style.--neu-dg-cols]': 'columns()',\n },\n template: `\n <div class=\"neu-dg__projection-source\" aria-hidden=\"true\">\n <ng-content />\n </div>\n\n <div\n class=\"neu-dg__grid\"\n cdkDropList\n [cdkDropListData]=\"_orderedTiles()\"\n (cdkDropListDropped)=\"_onDrop($event)\"\n >\n @for (tile of _orderedTiles(); track tile.id) {\n <div\n class=\"neu-dg__tile\"\n cdkDrag\n [cdkDragData]=\"tile\"\n [style.--tile-cols]=\"tile.cols ?? 1\"\n [style.--tile-rows]=\"tile.rows ?? 1\"\n >\n <!-- Drag handle -->\n <div class=\"neu-dg__tile-handle\" cdkDragHandle>\n @if (tile.title) {\n <span class=\"neu-dg__tile-title\">{{ tile.title }}</span>\n }\n <span class=\"neu-dg__handle-icon\" aria-hidden=\"true\">⠿</span>\n </div>\n <!-- Drag placeholder -->\n <div *cdkDragPlaceholder class=\"neu-dg__placeholder\"></div>\n <!-- Drag preview -->\n <div *cdkDragPreview class=\"neu-dg__preview\">{{ tile.title ?? tile.id }}</div>\n <!-- Content slot -->\n <div class=\"neu-dg__tile-content\" tabindex=\"0\">\n <div class=\"neu-dg__tile-slot\" #tileSlot [attr.data-slot-id]=\"tile.id\"></div>\n </div>\n </div>\n }\n </div>\n `,\n styleUrl: './neu-dashboard-grid.component.scss',\n})\nexport class NeuDashboardGridComponent {\n private readonly _host = inject(ElementRef) as ElementRef<HTMLElement>;\n\n readonly tiles = input<NeuDashboardTileConfig[]>([]);\n readonly columns = input<number>(3);\n\n /** Emitido cuando el orden cambia / Emitted when order changes */\n readonly orderChange = output<NeuDashboardTileConfig[]>();\n\n readonly _orderedTiles = signal<NeuDashboardTileConfig[]>([]);\n readonly _tileSlots = viewChildren<ElementRef<HTMLElement>>('tileSlot');\n\n constructor() {\n effect(() => {\n const t = this.tiles();\n untracked(() => this._orderedTiles.set([...t]));\n });\n\n effect(() => {\n this._orderedTiles();\n this._tileSlots();\n queueMicrotask(() => this._attachProjectedTiles());\n });\n }\n\n _onDrop(event: CdkDragDrop<NeuDashboardTileConfig[]>): void {\n const tiles = [...this._orderedTiles()];\n moveItemInArray(tiles, event.previousIndex, event.currentIndex);\n this._orderedTiles.set(tiles);\n this.orderChange.emit(tiles);\n }\n\n private _attachProjectedTiles(): void {\n const slots = new Map(\n this._tileSlots().map((slotRef) => [\n slotRef.nativeElement.dataset['slotId'],\n slotRef.nativeElement,\n ]),\n );\n\n const projectedTiles = this._host.nativeElement.querySelectorAll(\n '[data-tile-id]',\n ) as NodeListOf<HTMLElement>;\n\n for (const tileContent of projectedTiles) {\n const tileId = tileContent.dataset['tileId'];\n const slot = slots.get(tileId);\n\n if (slot && tileContent.parentElement !== slot) {\n slot.appendChild(tileContent);\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;AAiCA;;;;;;;;;AASG;MAkDU,yBAAyB,CAAA;AACnB,IAAA,KAAK,GAAG,MAAM,CAAC,UAAU,CAA4B;
|
|
1
|
+
{"version":3,"file":"neural-ui-core-dashboard-grid.mjs","sources":["../../../../projects/ui-core/dashboard-grid/neu-dashboard-grid.component.ts","../../../../projects/ui-core/dashboard-grid/neural-ui-core-dashboard-grid.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChildren,\n} from '@angular/core';\nimport {\n CdkDrag,\n CdkDragDrop,\n CdkDragPlaceholder,\n CdkDragPreview,\n CdkDropList,\n moveItemInArray,\n} from '@angular/cdk/drag-drop';\n\nexport interface NeuDashboardTileConfig {\n /** Identificador único / Unique identifier */\n id: string;\n /** Número de columnas que ocupa / Column span */\n cols?: number;\n /** Número de filas que ocupa / Row span */\n rows?: number;\n /** Título del tile / Tile title */\n title?: string;\n}\n\n/**\n * NeuralUI DashboardGrid\n *\n * Cuadrícula de tiles reordenables mediante drag-and-drop (CDK DragDrop).\n *\n * Uso:\n * <neu-dashboard-grid [tiles]=\"tileConfigs\" [columns]=\"3\">\n * <ng-template neuDashboardTile id=\"tile-1\">...</ng-template>\n * </neu-dashboard-grid>\n */\n@Component({\n selector: 'neu-dashboard-grid',\n imports: [CdkDrag, CdkDragPlaceholder, CdkDragPreview, CdkDropList],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-dg',\n '[style.--neu-dg-cols]': 'columns()',\n },\n template: `\n <div class=\"neu-dg__projection-source\" aria-hidden=\"true\">\n <ng-content />\n </div>\n\n <div\n class=\"neu-dg__grid\"\n cdkDropList\n [cdkDropListData]=\"_orderedTiles()\"\n (cdkDropListDropped)=\"_onDrop($event)\"\n >\n @for (tile of _orderedTiles(); track tile.id) {\n <div\n class=\"neu-dg__tile\"\n cdkDrag\n [cdkDragData]=\"tile\"\n [style.--tile-cols]=\"tile.cols ?? 1\"\n [style.--tile-rows]=\"tile.rows ?? 1\"\n >\n <!-- Drag handle -->\n <div class=\"neu-dg__tile-handle\" cdkDragHandle>\n @if (tile.title) {\n <span class=\"neu-dg__tile-title\">{{ tile.title }}</span>\n }\n <span class=\"neu-dg__handle-icon\" aria-hidden=\"true\">⠿</span>\n </div>\n <!-- Drag placeholder -->\n <div *cdkDragPlaceholder class=\"neu-dg__placeholder\"></div>\n <!-- Drag preview -->\n <div *cdkDragPreview class=\"neu-dg__preview\">{{ tile.title ?? tile.id }}</div>\n <!-- Content slot -->\n <div class=\"neu-dg__tile-content\" tabindex=\"0\">\n <div class=\"neu-dg__tile-slot\" #tileSlot [attr.data-slot-id]=\"tile.id\"></div>\n </div>\n </div>\n }\n </div>\n `,\n styleUrl: './neu-dashboard-grid.component.scss',\n})\nexport class NeuDashboardGridComponent {\n private readonly _host = inject(ElementRef) as ElementRef<HTMLElement>;\n\n readonly tiles = input<NeuDashboardTileConfig[]>([]);\n readonly columns = input<number>(3);\n\n /** Emitido cuando el orden cambia / Emitted when order changes */\n readonly orderChange = output<NeuDashboardTileConfig[]>();\n\n readonly _orderedTiles = signal<NeuDashboardTileConfig[]>([]);\n readonly _tileSlots = viewChildren<ElementRef<HTMLElement>>('tileSlot');\n\n constructor() {\n effect(() => {\n const t = this.tiles();\n untracked(() => this._orderedTiles.set([...t]));\n });\n\n effect(() => {\n this._orderedTiles();\n this._tileSlots();\n queueMicrotask(() => this._attachProjectedTiles());\n });\n }\n\n _onDrop(event: CdkDragDrop<NeuDashboardTileConfig[]>): void {\n const tiles = [...this._orderedTiles()];\n moveItemInArray(tiles, event.previousIndex, event.currentIndex);\n this._orderedTiles.set(tiles);\n this.orderChange.emit(tiles);\n }\n\n private _attachProjectedTiles(): void {\n const slots = new Map(\n this._tileSlots().map((slotRef) => [\n slotRef.nativeElement.dataset['slotId'],\n slotRef.nativeElement,\n ]),\n );\n\n const projectedTiles = this._host.nativeElement.querySelectorAll(\n '[data-tile-id]',\n ) as NodeListOf<HTMLElement>;\n\n for (const tileContent of projectedTiles) {\n const tileId = tileContent.dataset['tileId'];\n const slot = slots.get(tileId);\n\n if (slot && tileContent.parentElement !== slot) {\n slot.appendChild(tileContent);\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|