@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.
Files changed (135) hide show
  1. package/fesm2022/neural-ui-core-accordion.mjs +7 -11
  2. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  3. package/fesm2022/neural-ui-core-alert.mjs +14 -25
  4. package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
  5. package/fesm2022/neural-ui-core-autocomplete.mjs +28 -53
  6. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  7. package/fesm2022/neural-ui-core-avatar.mjs +13 -23
  8. package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
  9. package/fesm2022/neural-ui-core-badge.mjs +9 -15
  10. package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
  11. package/fesm2022/neural-ui-core-block-ui.mjs +11 -16
  12. package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
  13. package/fesm2022/neural-ui-core-breadcrumb.mjs +6 -8
  14. package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
  15. package/fesm2022/neural-ui-core-button.mjs +16 -29
  16. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  17. package/fesm2022/neural-ui-core-calendar.mjs +20 -37
  18. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
  19. package/fesm2022/neural-ui-core-card.mjs +8 -13
  20. package/fesm2022/neural-ui-core-card.mjs.map +1 -1
  21. package/fesm2022/neural-ui-core-chart.mjs +24 -45
  22. package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
  23. package/fesm2022/neural-ui-core-checkbox.mjs +9 -15
  24. package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
  25. package/fesm2022/neural-ui-core-chip.mjs +13 -23
  26. package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
  27. package/fesm2022/neural-ui-core-code-block.mjs +17 -31
  28. package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
  29. package/fesm2022/neural-ui-core-color-picker.mjs +11 -19
  30. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
  31. package/fesm2022/neural-ui-core-command-palette.mjs +11 -16
  32. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
  33. package/fesm2022/neural-ui-core-confirm-dialog.mjs +6 -6
  34. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -1
  35. package/fesm2022/neural-ui-core-context-menu.mjs +9 -12
  36. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
  37. package/fesm2022/neural-ui-core-dashboard-grid.mjs +7 -11
  38. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
  39. package/fesm2022/neural-ui-core-date-input.mjs +57 -111
  40. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-divider.mjs +5 -7
  42. package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
  43. package/fesm2022/neural-ui-core-empty-state.mjs +8 -13
  44. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
  45. package/fesm2022/neural-ui-core-filter-bar.mjs +11 -19
  46. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
  47. package/fesm2022/neural-ui-core-icon.mjs +7 -11
  48. package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
  49. package/fesm2022/neural-ui-core-image-gallery.mjs +13 -23
  50. package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
  51. package/fesm2022/neural-ui-core-image-viewer.mjs +14 -22
  52. package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
  53. package/fesm2022/neural-ui-core-input-otp.mjs +11 -19
  54. package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
  55. package/fesm2022/neural-ui-core-input.mjs +35 -67
  56. package/fesm2022/neural-ui-core-input.mjs.map +1 -1
  57. package/fesm2022/neural-ui-core-kanban.mjs +9 -15
  58. package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
  59. package/fesm2022/neural-ui-core-knob.mjs +22 -41
  60. package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
  61. package/fesm2022/neural-ui-core-meter-group.mjs +13 -23
  62. package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
  63. package/fesm2022/neural-ui-core-modal.mjs +11 -16
  64. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  65. package/fesm2022/neural-ui-core-multiselect.mjs +39 -72
  66. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  67. package/fesm2022/neural-ui-core-nav.mjs +13 -22
  68. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  69. package/fesm2022/neural-ui-core-notification-center.mjs +9 -12
  70. package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
  71. package/fesm2022/neural-ui-core-number-input.mjs +19 -35
  72. package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
  73. package/fesm2022/neural-ui-core-pagination.mjs +9 -15
  74. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
  75. package/fesm2022/neural-ui-core-popover.mjs +14 -22
  76. package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
  77. package/fesm2022/neural-ui-core-progress-bar.mjs +11 -19
  78. package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
  79. package/fesm2022/neural-ui-core-radio.mjs +15 -24
  80. package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
  81. package/fesm2022/neural-ui-core-rating.mjs +8 -13
  82. package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
  83. package/fesm2022/neural-ui-core-rich-text-editor.mjs +28 -53
  84. package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -1
  85. package/fesm2022/neural-ui-core-scheduler-gantt.mjs +22 -41
  86. package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
  87. package/fesm2022/neural-ui-core-select.mjs +43 -77
  88. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  89. package/fesm2022/neural-ui-core-sidebar.mjs +12 -21
  90. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  91. package/fesm2022/neural-ui-core-skeleton.mjs +7 -11
  92. package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
  93. package/fesm2022/neural-ui-core-slider.mjs +13 -23
  94. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  95. package/fesm2022/neural-ui-core-spinner.mjs +10 -17
  96. package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
  97. package/fesm2022/neural-ui-core-split-button.mjs +15 -27
  98. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  99. package/fesm2022/neural-ui-core-splitter.mjs +6 -9
  100. package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
  101. package/fesm2022/neural-ui-core-stats-card.mjs +11 -19
  102. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
  103. package/fesm2022/neural-ui-core-stepper.mjs +8 -13
  104. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  105. package/fesm2022/neural-ui-core-switch.mjs +9 -15
  106. package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
  107. package/fesm2022/neural-ui-core-table.mjs +124 -242
  108. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  109. package/fesm2022/neural-ui-core-tabs.mjs +18 -30
  110. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  111. package/fesm2022/neural-ui-core-textarea.mjs +23 -43
  112. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
  113. package/fesm2022/neural-ui-core-timeline-grid.mjs +12 -21
  114. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
  115. package/fesm2022/neural-ui-core-timeline.mjs +4 -5
  116. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
  117. package/fesm2022/neural-ui-core-toast.mjs +8 -10
  118. package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
  119. package/fesm2022/neural-ui-core-toggle-button-group.mjs +10 -17
  120. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  121. package/fesm2022/neural-ui-core-toolbar.mjs +8 -13
  122. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
  123. package/fesm2022/neural-ui-core-tooltip.mjs +11 -16
  124. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
  125. package/fesm2022/neural-ui-core-tree-table.mjs +30 -57
  126. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
  127. package/fesm2022/neural-ui-core-tree.mjs +17 -31
  128. package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
  129. package/fesm2022/neural-ui-core-uploader.mjs +47 -91
  130. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
  131. package/fesm2022/neural-ui-core-url-state.mjs +5 -7
  132. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
  133. package/fesm2022/neural-ui-core-virtual-list.mjs +19 -32
  134. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  135. 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([], /* @ts-ignore */
15
- ...(ngDevMode ? [{ debugName: "_commands" }] : /* istanbul ignore next */ []));
16
- isOpen = signal(false, /* @ts-ignore */
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
- }, /* @ts-ignore */
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: "22.0.4", ngImport: i0, type: NeuCommandPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
52
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuCommandPaletteService, providedIn: 'root' });
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: "22.0.4", ngImport: i0, type: NeuCommandPaletteService, decorators: [{
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, /* @ts-ignore */
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: "22.0.4", ngImport: i0, type: NeuCommandPaletteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
100
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuCommandPaletteComponent, isStandalone: true, selector: "neu-command-palette", host: { listeners: { "document:keydown": "_onDocKey($event)" } }, ngImport: i0, template: `
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: "22.0.4", ngImport: i0, type: NeuCommandPaletteComponent, decorators: [{
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: "22.0.4", ngImport: i0, type: NeuConfirmDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", 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: `
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: "22.0.4", ngImport: i0, type: NeuConfirmDialogComponent, decorators: [{
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: "22.0.4", ngImport: i0, type: NeuConfirmDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
106
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuConfirmDialogService, providedIn: 'root' });
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: "22.0.4", ngImport: i0, type: NeuConfirmDialogService, decorators: [{
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":"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"}
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":"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"}
@@ -8,8 +8,7 @@ let _seq = 0;
8
8
  * NeuralUI ContextMenu Overlay Component (internal)
9
9
  */
10
10
  class NeuContextMenuOverlayComponent {
11
- _items = signal([], /* @ts-ignore */
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: "22.0.4", ngImport: i0, type: NeuContextMenuOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", 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: `
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: "22.0.4", ngImport: i0, type: NeuContextMenuOverlayComponent, decorators: [{
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([], /* @ts-ignore */
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, /* @ts-ignore */
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: "22.0.4", ngImport: i0, type: NeuContextMenuDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
143
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.4", 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 });
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: "22.0.4", ngImport: i0, type: NeuContextMenuDirective, decorators: [{
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":"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"}
1
+ {"version":3,"file":"neural-ui-core-context-menu.mjs","sources":["../../../../projects/ui-core/context-menu/neu-context-menu.component.ts","../../../../projects/ui-core/context-menu/neural-ui-core-context-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n HostListener,\n Injector,\n OnDestroy,\n 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;AAChC,IAAA,MAAM,GAAG,MAAM,CAAuB,EAAE,6EAAC;IAClD,SAAS,GAAgD,IAAI;IAC7D,SAAS,GAAwB,IAAI;AAErC,IAAA,MAAM,CAAC,IAAwB,EAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC5C;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,IAAI;IACpB;wGAXW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxB/B;;;;;;;;;;;;;;;;;;;;;AAqBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0mDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAGU,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAnC1C,SAAS;+BACE,0BAA0B,EAAA,OAAA,EAC3B,EAAE,EAAA,aAAA,EACI,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,kBAAkB;AACzB,wBAAA,IAAI,EAAE,MAAM;AACZ,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,kBAAkB,EAAE,aAAa;qBAClC,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;AAqBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,0mDAAA,CAAA,EAAA;;AAiBH;;;;;;;;;AASG;MAKU,uBAAuB,CAAA;;AAEzB,IAAA,cAAc,GAAG,KAAK,CAAuB,EAAE,qFAAC;;AAGhD,IAAA,sBAAsB,GAAG,KAAK,CAAU,KAAK,6FAAC;;IAG9C,aAAa,GAAG,MAAM,EAAsB;;IAG5C,UAAU,GAAG,MAAM,EAAQ;;IAG3B,UAAU,GAAG,MAAM,EAAQ;AAEnB,IAAA,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;AAC1B,IAAA,GAAG,GAAG,MAAM,EAAC,UAAuB,EAAC;AACrC,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACxC,WAAW,GAAsB,IAAI;IACrC,QAAQ,GAAwD,IAAI;AAG5E,IAAA,aAAa,CAAC,KAAiB,EAAA;QAC7B,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAAE;QACnC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;IAC1C;IAEQ,KAAK,CAAC,CAAS,EAAE,CAAS,EAAA;QAChC,IAAI,CAAC,MAAM,EAAE;QACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AACtC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,aAAa,EAAE,2BAA2B;YAC1C,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI,CAAC;YAChF,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACvD,SAAA,CAAC;AAEF,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,8BAA8B,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;QAC7F,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;AAC/C,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,IAAI,KAAI;AAC1C,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,IAAI,CAAC,MAAM,EAAE;AACf,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;AAEtD,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE;AACnC,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AACzB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACxB;AACA,QAAA,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE;AAC3B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,MAAM,EAAE;IACf;wGAhEW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAJnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,QAAQ,EAAE,gBAAgB;AAC3B,iBAAA;;sBAwBE,YAAY;uBAAC,aAAa,EAAE,CAAC,QAAQ,CAAC;;;AC9HzC;;AAEG;;;;"}
@@ -14,16 +14,12 @@ import { moveItemInArray, CdkDrag, CdkDragPlaceholder, CdkDragPreview, CdkDropLi
14
14
  */
15
15
  class NeuDashboardGridComponent {
16
16
  _host = inject(ElementRef);
17
- tiles = input([], /* @ts-ignore */
18
- ...(ngDevMode ? [{ debugName: "tiles" }] : /* istanbul ignore next */ []));
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([], /* @ts-ignore */
24
- ...(ngDevMode ? [{ debugName: "_orderedTiles" }] : /* istanbul ignore next */ []));
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: "22.0.4", ngImport: i0, type: NeuDashboardGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", 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: `
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: "22.0.4", ngImport: i0, type: NeuDashboardGridComponent, decorators: [{
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":"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"}
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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"}