@neural-ui/core 1.6.1 → 1.6.3

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 (202) hide show
  1. package/accordion/package.json +4 -0
  2. package/alert/package.json +4 -0
  3. package/autocomplete/package.json +4 -0
  4. package/avatar/package.json +4 -0
  5. package/badge/package.json +4 -0
  6. package/block-ui/package.json +4 -0
  7. package/breadcrumb/package.json +4 -0
  8. package/button/package.json +4 -0
  9. package/calendar/package.json +4 -0
  10. package/card/package.json +4 -0
  11. package/chart/package.json +4 -0
  12. package/checkbox/package.json +4 -0
  13. package/chip/package.json +4 -0
  14. package/code-block/package.json +4 -0
  15. package/color-picker/package.json +4 -0
  16. package/command-palette/package.json +4 -0
  17. package/confirm-dialog/package.json +4 -0
  18. package/context-menu/package.json +4 -0
  19. package/dashboard-grid/package.json +4 -0
  20. package/date-input/package.json +4 -0
  21. package/divider/package.json +4 -0
  22. package/empty-state/package.json +4 -0
  23. package/fesm2022/neural-ui-core-accordion.mjs +7 -11
  24. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  25. package/fesm2022/neural-ui-core-alert.mjs +14 -25
  26. package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
  27. package/fesm2022/neural-ui-core-autocomplete.mjs +28 -53
  28. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  29. package/fesm2022/neural-ui-core-avatar.mjs +13 -23
  30. package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
  31. package/fesm2022/neural-ui-core-badge.mjs +9 -15
  32. package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
  33. package/fesm2022/neural-ui-core-block-ui.mjs +11 -16
  34. package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
  35. package/fesm2022/neural-ui-core-breadcrumb.mjs +6 -8
  36. package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
  37. package/fesm2022/neural-ui-core-button.mjs +16 -29
  38. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  39. package/fesm2022/neural-ui-core-calendar.mjs +20 -37
  40. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-card.mjs +8 -13
  42. package/fesm2022/neural-ui-core-card.mjs.map +1 -1
  43. package/fesm2022/neural-ui-core-chart.mjs +24 -45
  44. package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
  45. package/fesm2022/neural-ui-core-checkbox.mjs +9 -15
  46. package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
  47. package/fesm2022/neural-ui-core-chip.mjs +13 -23
  48. package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
  49. package/fesm2022/neural-ui-core-code-block.mjs +17 -31
  50. package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
  51. package/fesm2022/neural-ui-core-color-picker.mjs +11 -19
  52. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
  53. package/fesm2022/neural-ui-core-command-palette.mjs +11 -16
  54. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
  55. package/fesm2022/neural-ui-core-confirm-dialog.mjs +6 -6
  56. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -1
  57. package/fesm2022/neural-ui-core-context-menu.mjs +9 -12
  58. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
  59. package/fesm2022/neural-ui-core-dashboard-grid.mjs +7 -11
  60. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
  61. package/fesm2022/neural-ui-core-date-input.mjs +57 -111
  62. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
  63. package/fesm2022/neural-ui-core-divider.mjs +5 -7
  64. package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
  65. package/fesm2022/neural-ui-core-empty-state.mjs +8 -13
  66. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
  67. package/fesm2022/neural-ui-core-filter-bar.mjs +11 -19
  68. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
  69. package/fesm2022/neural-ui-core-icon.mjs +7 -11
  70. package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
  71. package/fesm2022/neural-ui-core-image-gallery.mjs +13 -23
  72. package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
  73. package/fesm2022/neural-ui-core-image-viewer.mjs +14 -22
  74. package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
  75. package/fesm2022/neural-ui-core-input-otp.mjs +11 -19
  76. package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
  77. package/fesm2022/neural-ui-core-input.mjs +35 -67
  78. package/fesm2022/neural-ui-core-input.mjs.map +1 -1
  79. package/fesm2022/neural-ui-core-kanban.mjs +9 -15
  80. package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
  81. package/fesm2022/neural-ui-core-knob.mjs +22 -41
  82. package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
  83. package/fesm2022/neural-ui-core-meter-group.mjs +13 -23
  84. package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
  85. package/fesm2022/neural-ui-core-modal.mjs +11 -16
  86. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  87. package/fesm2022/neural-ui-core-multiselect.mjs +39 -72
  88. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  89. package/fesm2022/neural-ui-core-nav.mjs +13 -22
  90. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  91. package/fesm2022/neural-ui-core-notification-center.mjs +9 -12
  92. package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
  93. package/fesm2022/neural-ui-core-number-input.mjs +19 -35
  94. package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
  95. package/fesm2022/neural-ui-core-pagination.mjs +9 -15
  96. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
  97. package/fesm2022/neural-ui-core-popover.mjs +14 -22
  98. package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
  99. package/fesm2022/neural-ui-core-progress-bar.mjs +11 -19
  100. package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
  101. package/fesm2022/neural-ui-core-radio.mjs +15 -24
  102. package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
  103. package/fesm2022/neural-ui-core-rating.mjs +8 -13
  104. package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
  105. package/fesm2022/neural-ui-core-rich-text-editor.mjs +28 -53
  106. package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -1
  107. package/fesm2022/neural-ui-core-scheduler-gantt.mjs +22 -41
  108. package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
  109. package/fesm2022/neural-ui-core-select.mjs +43 -77
  110. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  111. package/fesm2022/neural-ui-core-sidebar.mjs +12 -21
  112. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  113. package/fesm2022/neural-ui-core-skeleton.mjs +7 -11
  114. package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
  115. package/fesm2022/neural-ui-core-slider.mjs +13 -23
  116. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  117. package/fesm2022/neural-ui-core-spinner.mjs +10 -17
  118. package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
  119. package/fesm2022/neural-ui-core-split-button.mjs +15 -27
  120. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  121. package/fesm2022/neural-ui-core-splitter.mjs +6 -9
  122. package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
  123. package/fesm2022/neural-ui-core-stats-card.mjs +11 -19
  124. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
  125. package/fesm2022/neural-ui-core-stepper.mjs +8 -13
  126. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  127. package/fesm2022/neural-ui-core-switch.mjs +9 -15
  128. package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
  129. package/fesm2022/neural-ui-core-table.mjs +124 -242
  130. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  131. package/fesm2022/neural-ui-core-tabs.mjs +18 -30
  132. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  133. package/fesm2022/neural-ui-core-textarea.mjs +23 -43
  134. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
  135. package/fesm2022/neural-ui-core-timeline-grid.mjs +12 -21
  136. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
  137. package/fesm2022/neural-ui-core-timeline.mjs +4 -5
  138. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
  139. package/fesm2022/neural-ui-core-toast.mjs +8 -10
  140. package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
  141. package/fesm2022/neural-ui-core-toggle-button-group.mjs +10 -17
  142. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  143. package/fesm2022/neural-ui-core-toolbar.mjs +8 -13
  144. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
  145. package/fesm2022/neural-ui-core-tooltip.mjs +11 -16
  146. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
  147. package/fesm2022/neural-ui-core-tree-table.mjs +30 -57
  148. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
  149. package/fesm2022/neural-ui-core-tree.mjs +17 -31
  150. package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
  151. package/fesm2022/neural-ui-core-uploader.mjs +47 -91
  152. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
  153. package/fesm2022/neural-ui-core-url-state.mjs +5 -7
  154. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
  155. package/fesm2022/neural-ui-core-virtual-list.mjs +19 -32
  156. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  157. package/filter-bar/package.json +4 -0
  158. package/icon/package.json +4 -0
  159. package/image-gallery/package.json +4 -0
  160. package/image-viewer/package.json +4 -0
  161. package/input/package.json +4 -0
  162. package/input-otp/package.json +4 -0
  163. package/kanban/package.json +4 -0
  164. package/knob/package.json +4 -0
  165. package/meter-group/package.json +4 -0
  166. package/modal/package.json +4 -0
  167. package/multiselect/package.json +4 -0
  168. package/nav/package.json +4 -0
  169. package/notification-center/package.json +4 -0
  170. package/number-input/package.json +4 -0
  171. package/package.json +6 -6
  172. package/pagination/package.json +4 -0
  173. package/popover/package.json +4 -0
  174. package/progress-bar/package.json +4 -0
  175. package/radio/package.json +4 -0
  176. package/rating/package.json +4 -0
  177. package/rich-text-editor/package.json +4 -0
  178. package/scheduler-gantt/package.json +4 -0
  179. package/select/package.json +4 -0
  180. package/sidebar/package.json +4 -0
  181. package/skeleton/package.json +4 -0
  182. package/slider/package.json +4 -0
  183. package/spinner/package.json +4 -0
  184. package/split-button/package.json +4 -0
  185. package/splitter/package.json +4 -0
  186. package/stats-card/package.json +4 -0
  187. package/stepper/package.json +4 -0
  188. package/switch/package.json +4 -0
  189. package/table/package.json +4 -0
  190. package/tabs/package.json +4 -0
  191. package/textarea/package.json +4 -0
  192. package/timeline/package.json +4 -0
  193. package/timeline-grid/package.json +4 -0
  194. package/toast/package.json +4 -0
  195. package/toggle-button-group/package.json +4 -0
  196. package/toolbar/package.json +4 -0
  197. package/tooltip/package.json +4 -0
  198. package/tree/package.json +4 -0
  199. package/tree-table/package.json +4 -0
  200. package/uploader/package.json +4 -0
  201. package/url-state/package.json +4 -0
  202. package/virtual-list/package.json +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-code-block.mjs","sources":["../../../../projects/ui-core/code-block/neu-code-block.component.ts","../../../../projects/ui-core/code-block/neural-ui-core-code-block.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * NeuralUI Code Block\n *\n * Bloque de código con estilo editor oscuro (Tokyo Night).\n * Incluye botón de copiar al portapapeles, badge del lenguaje\n * y soporte para resaltado futuro con ngx-highlightjs.\n *\n * Uso:\n * <neu-code-block [code]=\"snippet\" lang=\"TypeScript\" />\n *\n * Con ngx-highlightjs instalado, envuelve el <pre> con\n * [highlight]=\"code\" para resaltado automático.\n */\n@Component({\n selector: 'neu-code-block',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-code-block\">\n <!-- Encabezado del editor -->\n <div class=\"neu-code-block__header\">\n <!-- Traffic lights decorativos -->\n <div class=\"neu-code-block__dots\" aria-hidden=\"true\">\n <span></span><span></span><span></span>\n </div>\n <span class=\"neu-code-block__lang\">{{ displayLang() }}</span>\n <button\n class=\"neu-code-block__copy\"\n type=\"button\"\n [attr.aria-label]=\"copied() ? resolvedCopiedAriaLabel() : resolvedCopyAriaLabel()\"\n (click)=\"copy()\"\n >\n @if (copied()) {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n {{ resolvedCopiedLabel() }}\n } @else {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n {{ resolvedCopyLabel() }}\n }\n </button>\n </div>\n\n <!-- Bloque de código -->\n <pre\n class=\"neu-code-block__pre\"\n tabindex=\"0\"\n ><code class=\"neu-code-block__code\">{{ code() }}</code></pre>\n </div>\n `,\n host: { '[attr.lang]': 'null' },\n styleUrl: './neu-code-block.component.scss',\n})\nexport class NeuCodeBlockComponent {\n private readonly doc = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Código fuente a mostrar / Source code to display */\n code = input<string>('');\n\n /** Nombre del lenguaje (decorativo) / Language name (decorative) */\n lang = input<string>('');\n\n /**\n * Identificador de lenguaje estándar (typescript, scss, html, bash…).\n * Genera automáticamente el label legible para el badge.\n * Language identifier — auto-generates a readable badge label.\n */\n language = input<string>('');\n\n /** Label legible derivado de lang o language / Readable label derived from lang or language */\n protected readonly displayLang = computed(() => {\n const explicit = this.lang();\n if (explicit) return explicit;\n const id = this.language().toLowerCase().trim();\n const map: Record<string, string> = {\n typescript: 'TypeScript',\n javascript: 'JavaScript',\n ts: 'TypeScript',\n js: 'JavaScript',\n scss: 'SCSS',\n css: 'CSS',\n less: 'Less',\n html: 'HTML',\n xml: 'XML',\n bash: 'Bash',\n shell: 'Shell',\n sh: 'Shell',\n json: 'JSON',\n yaml: 'YAML',\n yml: 'YAML',\n angular: 'Angular',\n jsx: 'JSX',\n tsx: 'TSX',\n };\n return map[id] ?? (id ? id.toUpperCase() : 'TypeScript');\n });\n\n /** Texto del botón cuando no se ha copiado / Button text when not yet copied */\n copyLabel = input<string | undefined>(undefined);\n\n /** Texto del botón tras copiar / Button text after copying */\n copiedLabel = input<string | undefined>(undefined);\n\n /** Aria-label del botón copiar / Aria-label for the copy button */\n copyAriaLabel = input<string | undefined>(undefined);\n\n /** Aria-label del botón tras copiar / Aria-label for the button after copying */\n copiedAriaLabel = input<string | undefined>(undefined);\n\n private readonly localeLabels = signal(this._getLocaleLabels());\n\n protected readonly resolvedCopyLabel = computed(\n () => this._resolveInputLabel(this.copyLabel()) ?? this.localeLabels().copyLabel,\n );\n\n protected readonly resolvedCopiedLabel = computed(\n () => this._resolveInputLabel(this.copiedLabel()) ?? this.localeLabels().copiedLabel,\n );\n\n protected readonly resolvedCopyAriaLabel = computed(\n () => this._resolveInputLabel(this.copyAriaLabel()) ?? this.localeLabels().copyAriaLabel,\n );\n\n protected readonly resolvedCopiedAriaLabel = computed(\n () => this._resolveInputLabel(this.copiedAriaLabel()) ?? this.localeLabels().copiedAriaLabel,\n );\n\n protected readonly copied = signal(false);\n private _copyTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n const root = this.doc.documentElement;\n const win = this.doc.defaultView;\n\n this.destroyRef.onDestroy(() => clearTimeout(this._copyTimer));\n\n if (!root || !win?.MutationObserver) return;\n\n const observer = new win.MutationObserver(() => {\n this.localeLabels.set(this._getLocaleLabels());\n });\n\n observer.observe(root, {\n attributes: true,\n attributeFilter: ['lang'],\n });\n\n this.destroyRef.onDestroy(() => observer.disconnect());\n }\n\n copy(): void {\n const text = this.code();\n const win = this.doc.defaultView;\n\n if (win?.navigator?.clipboard) {\n void win.navigator.clipboard.writeText(text).then(() => this._markCopied());\n } else {\n // Fallback para HTTP o navegadores sin Clipboard API\n const ta = this.doc.createElement('textarea');\n ta.value = text;\n ta.style.cssText = 'position:fixed;top:0;left:0;opacity:0;pointer-events:none';\n this.doc.body.appendChild(ta);\n ta.focus();\n ta.select();\n try {\n this.doc.execCommand('copy');\n this._markCopied();\n } finally {\n this.doc.body.removeChild(ta);\n }\n }\n }\n\n private _markCopied(): void {\n this.copied.set(true);\n clearTimeout(this._copyTimer);\n this._copyTimer = setTimeout(() => this.copied.set(false), 2000);\n }\n\n private _getLocaleLabels(): {\n copyLabel: string;\n copiedLabel: string;\n copyAriaLabel: string;\n copiedAriaLabel: string;\n } {\n const lang = this.doc.documentElement?.lang?.toLowerCase() ?? 'en';\n\n if (lang.startsWith('es')) {\n return {\n copyLabel: 'Copiar',\n copiedLabel: 'Copiado',\n copyAriaLabel: 'Copiar código',\n copiedAriaLabel: 'Código copiado',\n };\n }\n\n return {\n copyLabel: 'Copy',\n copiedLabel: 'Copied',\n copyAriaLabel: 'Copy code',\n copiedAriaLabel: 'Code copied',\n };\n }\n\n private _resolveInputLabel(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? value : undefined;\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-code-block.mjs","sources":["../../../../projects/ui-core/code-block/neu-code-block.component.ts","../../../../projects/ui-core/code-block/neural-ui-core-code-block.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * NeuralUI Code Block\n *\n * Bloque de código con estilo editor oscuro (Tokyo Night).\n * Incluye botón de copiar al portapapeles, badge del lenguaje\n * y soporte para resaltado futuro con ngx-highlightjs.\n *\n * Uso:\n * <neu-code-block [code]=\"snippet\" lang=\"TypeScript\" />\n *\n * Con ngx-highlightjs instalado, envuelve el <pre> con\n * [highlight]=\"code\" para resaltado automático.\n */\n@Component({\n selector: 'neu-code-block',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-code-block\">\n <!-- Encabezado del editor -->\n <div class=\"neu-code-block__header\">\n <!-- Traffic lights decorativos -->\n <div class=\"neu-code-block__dots\" aria-hidden=\"true\">\n <span></span><span></span><span></span>\n </div>\n <span class=\"neu-code-block__lang\">{{ displayLang() }}</span>\n <button\n class=\"neu-code-block__copy\"\n type=\"button\"\n [attr.aria-label]=\"copied() ? resolvedCopiedAriaLabel() : resolvedCopyAriaLabel()\"\n (click)=\"copy()\"\n >\n @if (copied()) {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n {{ resolvedCopiedLabel() }}\n } @else {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n {{ resolvedCopyLabel() }}\n }\n </button>\n </div>\n\n <!-- Bloque de código -->\n <pre\n class=\"neu-code-block__pre\"\n tabindex=\"0\"\n ><code class=\"neu-code-block__code\">{{ code() }}</code></pre>\n </div>\n `,\n host: { '[attr.lang]': 'null' },\n styleUrl: './neu-code-block.component.scss',\n})\nexport class NeuCodeBlockComponent {\n private readonly doc = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Código fuente a mostrar / Source code to display */\n code = input<string>('');\n\n /** Nombre del lenguaje (decorativo) / Language name (decorative) */\n lang = input<string>('');\n\n /**\n * Identificador de lenguaje estándar (typescript, scss, html, bash…).\n * Genera automáticamente el label legible para el badge.\n * Language identifier — auto-generates a readable badge label.\n */\n language = input<string>('');\n\n /** Label legible derivado de lang o language / Readable label derived from lang or language */\n protected readonly displayLang = computed(() => {\n const explicit = this.lang();\n if (explicit) return explicit;\n const id = this.language().toLowerCase().trim();\n const map: Record<string, string> = {\n typescript: 'TypeScript',\n javascript: 'JavaScript',\n ts: 'TypeScript',\n js: 'JavaScript',\n scss: 'SCSS',\n css: 'CSS',\n less: 'Less',\n html: 'HTML',\n xml: 'XML',\n bash: 'Bash',\n shell: 'Shell',\n sh: 'Shell',\n json: 'JSON',\n yaml: 'YAML',\n yml: 'YAML',\n angular: 'Angular',\n jsx: 'JSX',\n tsx: 'TSX',\n };\n return map[id] ?? (id ? id.toUpperCase() : 'TypeScript');\n });\n\n /** Texto del botón cuando no se ha copiado / Button text when not yet copied */\n copyLabel = input<string | undefined>(undefined);\n\n /** Texto del botón tras copiar / Button text after copying */\n copiedLabel = input<string | undefined>(undefined);\n\n /** Aria-label del botón copiar / Aria-label for the copy button */\n copyAriaLabel = input<string | undefined>(undefined);\n\n /** Aria-label del botón tras copiar / Aria-label for the button after copying */\n copiedAriaLabel = input<string | undefined>(undefined);\n\n private readonly localeLabels = signal(this._getLocaleLabels());\n\n protected readonly resolvedCopyLabel = computed(\n () => this._resolveInputLabel(this.copyLabel()) ?? this.localeLabels().copyLabel,\n );\n\n protected readonly resolvedCopiedLabel = computed(\n () => this._resolveInputLabel(this.copiedLabel()) ?? this.localeLabels().copiedLabel,\n );\n\n protected readonly resolvedCopyAriaLabel = computed(\n () => this._resolveInputLabel(this.copyAriaLabel()) ?? this.localeLabels().copyAriaLabel,\n );\n\n protected readonly resolvedCopiedAriaLabel = computed(\n () => this._resolveInputLabel(this.copiedAriaLabel()) ?? this.localeLabels().copiedAriaLabel,\n );\n\n protected readonly copied = signal(false);\n private _copyTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n const root = this.doc.documentElement;\n const win = this.doc.defaultView;\n\n this.destroyRef.onDestroy(() => clearTimeout(this._copyTimer));\n\n if (!root || !win?.MutationObserver) return;\n\n const observer = new win.MutationObserver(() => {\n this.localeLabels.set(this._getLocaleLabels());\n });\n\n observer.observe(root, {\n attributes: true,\n attributeFilter: ['lang'],\n });\n\n this.destroyRef.onDestroy(() => observer.disconnect());\n }\n\n copy(): void {\n const text = this.code();\n const win = this.doc.defaultView;\n\n if (win?.navigator?.clipboard) {\n void win.navigator.clipboard.writeText(text).then(() => this._markCopied());\n } else {\n // Fallback para HTTP o navegadores sin Clipboard API\n const ta = this.doc.createElement('textarea');\n ta.value = text;\n ta.style.cssText = 'position:fixed;top:0;left:0;opacity:0;pointer-events:none';\n this.doc.body.appendChild(ta);\n ta.focus();\n ta.select();\n try {\n this.doc.execCommand('copy');\n this._markCopied();\n } finally {\n this.doc.body.removeChild(ta);\n }\n }\n }\n\n private _markCopied(): void {\n this.copied.set(true);\n clearTimeout(this._copyTimer);\n this._copyTimer = setTimeout(() => this.copied.set(false), 2000);\n }\n\n private _getLocaleLabels(): {\n copyLabel: string;\n copiedLabel: string;\n copyAriaLabel: string;\n copiedAriaLabel: string;\n } {\n const lang = this.doc.documentElement?.lang?.toLowerCase() ?? 'en';\n\n if (lang.startsWith('es')) {\n return {\n copyLabel: 'Copiar',\n copiedLabel: 'Copiado',\n copyAriaLabel: 'Copiar código',\n copiedAriaLabel: 'Código copiado',\n };\n }\n\n return {\n copyLabel: 'Copy',\n copiedLabel: 'Copied',\n copyAriaLabel: 'Copy code',\n copiedAriaLabel: 'Code copied',\n };\n }\n\n private _resolveInputLabel(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? value : undefined;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -101,8 +101,7 @@ let _seq = 0;
101
101
  */
102
102
  class NeuColorPickerComponent {
103
103
  // ── Inputs / Outputs ────────────────────────────────────────────
104
- mode = input('hex', /* @ts-ignore */
105
- ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
104
+ mode = input('hex', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
106
105
  /** Emitido al cambiar el color / Emitted when color changes */
107
106
  colorChange = output();
108
107
  // ── Internal state ───────────────────────────────────────────────
@@ -120,16 +119,11 @@ class NeuColorPickerComponent {
120
119
  '#a855f7',
121
120
  '#ec4899',
122
121
  ];
123
- _isOpen = signal(false, /* @ts-ignore */
124
- ...(ngDevMode ? [{ debugName: "_isOpen" }] : /* istanbul ignore next */ []));
125
- _cvaDisabled = signal(false, /* @ts-ignore */
126
- ...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
127
- _hue = signal(210, /* @ts-ignore */
128
- ...(ngDevMode ? [{ debugName: "_hue" }] : /* istanbul ignore next */ []));
129
- _sv = signal({ s: 80, v: 90 }, /* @ts-ignore */
130
- ...(ngDevMode ? [{ debugName: "_sv" }] : /* istanbul ignore next */ []));
131
- _activeMode = linkedSignal(() => this.mode(), /* @ts-ignore */
132
- ...(ngDevMode ? [{ debugName: "_activeMode" }] : /* istanbul ignore next */ []));
122
+ _isOpen = signal(false, ...(ngDevMode ? [{ debugName: "_isOpen" }] : /* istanbul ignore next */ []));
123
+ _cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
124
+ _hue = signal(210, ...(ngDevMode ? [{ debugName: "_hue" }] : /* istanbul ignore next */ []));
125
+ _sv = signal({ s: 80, v: 90 }, ...(ngDevMode ? [{ debugName: "_sv" }] : /* istanbul ignore next */ []));
126
+ _activeMode = linkedSignal(() => this.mode(), ...(ngDevMode ? [{ debugName: "_activeMode" }] : /* istanbul ignore next */ []));
133
127
  _dragging = false;
134
128
  _onChange = () => { };
135
129
  _onTouched = () => { };
@@ -169,8 +163,7 @@ class NeuColorPickerComponent {
169
163
  }
170
164
  }
171
165
  // ── Computed ──────────────────────────────────────────────────
172
- _hexValue = computed(() => hsvToHex(this._hue(), this._sv().s, this._sv().v), /* @ts-ignore */
173
- ...(ngDevMode ? [{ debugName: "_hexValue" }] : /* istanbul ignore next */ []));
166
+ _hexValue = computed(() => hsvToHex(this._hue(), this._sv().s, this._sv().v), ...(ngDevMode ? [{ debugName: "_hexValue" }] : /* istanbul ignore next */ []));
174
167
  _textValue = computed(() => {
175
168
  const hex = this._hexValue();
176
169
  const rgb = hexToRgb(hex);
@@ -186,8 +179,7 @@ class NeuColorPickerComponent {
186
179
  default:
187
180
  return hex;
188
181
  }
189
- }, /* @ts-ignore */
190
- ...(ngDevMode ? [{ debugName: "_textValue" }] : /* istanbul ignore next */ []));
182
+ }, ...(ngDevMode ? [{ debugName: "_textValue" }] : /* istanbul ignore next */ []));
191
183
  // ── Canvas interactions ───────────────────────────────────────
192
184
  _canvasDown(e) {
193
185
  this._dragging = true;
@@ -268,8 +260,8 @@ class NeuColorPickerComponent {
268
260
  setDisabledState(d) {
269
261
  this._cvaDisabled.set(d);
270
262
  }
271
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
272
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuColorPickerComponent, isStandalone: true, selector: "neu-color-picker", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { colorChange: "colorChange" }, host: { listeners: { "document:mousedown": "_outsideClick($event)" }, properties: { "class.neu-cp--open": "_isOpen()", "class.neu-cp--disabled": "_cvaDisabled()" }, classAttribute: "neu-cp" }, providers: [
263
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
264
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuColorPickerComponent, isStandalone: true, selector: "neu-color-picker", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { colorChange: "colorChange" }, host: { listeners: { "document:mousedown": "_outsideClick($event)" }, properties: { "class.neu-cp--open": "_isOpen()", "class.neu-cp--disabled": "_cvaDisabled()" }, classAttribute: "neu-cp" }, providers: [
273
265
  {
274
266
  provide: NG_VALUE_ACCESSOR,
275
267
  useExisting: forwardRef(() => NeuColorPickerComponent),
@@ -373,7 +365,7 @@ class NeuColorPickerComponent {
373
365
  </ng-template>
374
366
  `, isInline: true, styles: ["@charset \"UTF-8\";.neu-cp{position:relative;display:inline-block}.neu-cp--disabled{opacity:.55;pointer-events:none}.neu-cp__trigger{all:unset;display:inline-flex;align-items:center;gap:8px;padding:6px 12px 6px 8px;border:1px solid var(--neu-border-color, #d1d5db);border-radius:var(--neu-radius-md, 8px);background:var(--neu-surface-1, #ffffff);cursor:pointer;box-sizing:border-box;transition:border-color .12s}.neu-cp__trigger:hover:not([disabled]){border-color:var(--neu-color-primary, #0ea5e9)}.neu-cp__trigger[disabled]{background:var(--neu-surface-2, #f3f4f6)}.neu-cp__swatch{width:22px;height:22px;border-radius:var(--neu-radius-sm, 4px);border:1px solid rgba(0,0,0,.1);display:inline-block}.neu-cp__swatch-sm{width:28px;height:28px;border-radius:var(--neu-radius-md, 8px);border:1px solid rgba(0,0,0,.1);display:inline-block;flex-shrink:0}.neu-cp__hex-label{font-size:.8125rem;color:var(--neu-text-primary, #111);font-family:monospace}.neu-cp__panel{position:relative;width:272px;background:var(--neu-surface-1, #ffffff);border:1px solid var(--neu-border-color, #e5e7eb);border-radius:var(--neu-radius-xl, 16px);box-shadow:0 10px 24px -4px #00000024;padding:16px;z-index:1001;display:flex;flex-direction:column;gap:12px;animation:neu-cp-in 80ms ease}@keyframes neu-cp-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-cp__canvas-wrap{position:relative;width:100%;height:150px;border-radius:var(--neu-radius-md, 8px);overflow:hidden;cursor:crosshair;-webkit-user-select:none;user-select:none;touch-action:none}.neu-cp__canvas-wrap:before{content:\"\";position:absolute;inset:0;background:linear-gradient(to right,#fff,transparent)}.neu-cp__canvas-wrap:after{content:\"\";position:absolute;inset:0;background:linear-gradient(to top,#000,transparent)}.neu-cp__canvas-cursor{position:absolute;width:14px;height:14px;border-radius:50%;border:2px solid #fff;box-shadow:0 1px 4px #00000073;transform:translate(-50%,-50%);pointer-events:none;z-index:1}.neu-cp__hue-slider{width:100%;height:10px;border-radius:999px;cursor:pointer;appearance:none;-webkit-appearance:none;background:linear-gradient(to right,red,#ff8000,#ff0,#80ff00,#0f0,#00ff80,#0ff,#0080ff,#00f,#7f00ff,#f0f,#ff0080,red)}.neu-cp__hue-slider::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid rgba(0,0,0,.25);box-shadow:0 1px 3px #0003;cursor:pointer}.neu-cp__hue-slider::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid rgba(0,0,0,.25);box-shadow:0 1px 3px #0003;cursor:pointer}.neu-cp__swatches{display:flex;gap:5px;flex-wrap:wrap}.neu-cp__sw{all:unset;box-sizing:border-box;width:20px;height:20px;border-radius:4px;cursor:pointer;border:1.5px solid rgba(0,0,0,.1);transition:transform 80ms}.neu-cp__sw:hover{transform:scale(1.2)}.neu-cp__sw:focus-visible{outline:2px solid var(--neu-color-primary, #0ea5e9);outline-offset:1px}.neu-cp__mode-tabs{display:flex;background:var(--neu-surface-2, #f3f4f6);border-radius:var(--neu-radius-md, 8px);padding:3px;gap:2px}.neu-cp__mode-btn{all:unset;flex:1;text-align:center;font-size:.6875rem;font-weight:600;padding:4px 0;border-radius:6px;cursor:pointer;transition:background 80ms,color 80ms}.neu-cp__mode-btn--active{background:var(--neu-surface-1, #ffffff);color:var(--neu-color-primary, #0ea5e9);box-shadow:0 1px 4px #00000014}.neu-cp__input-row{display:flex;gap:8px;align-items:center}.neu-cp__text-input{flex:1;padding:6px 10px;border:1px solid var(--neu-border-color, #d1d5db);border-radius:var(--neu-radius-md, 8px);font-size:.8125rem;font-family:monospace;background:var(--neu-surface-1, #fff);color:var(--neu-text-primary, #111);outline:none}.neu-cp__text-input:focus{border-color:var(--neu-color-primary, #0ea5e9)}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
375
367
  }
376
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuColorPickerComponent, decorators: [{
368
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuColorPickerComponent, decorators: [{
377
369
  type: Component,
378
370
  args: [{ selector: 'neu-color-picker', imports: [OverlayModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
379
371
  {
@@ -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]',