@neural-ui/core 1.5.14 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/fesm2022/neural-ui-core-accordion.mjs +13 -9
  2. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  3. package/fesm2022/neural-ui-core-alert.mjs +25 -14
  4. package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
  5. package/fesm2022/neural-ui-core-autocomplete.mjs +53 -28
  6. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  7. package/fesm2022/neural-ui-core-avatar.mjs +23 -13
  8. package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
  9. package/fesm2022/neural-ui-core-badge.mjs +15 -9
  10. package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
  11. package/fesm2022/neural-ui-core-block-ui.mjs +16 -11
  12. package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
  13. package/fesm2022/neural-ui-core-breadcrumb.mjs +8 -6
  14. package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
  15. package/fesm2022/neural-ui-core-button.mjs +29 -16
  16. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  17. package/fesm2022/neural-ui-core-calendar.mjs +75 -50
  18. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
  19. package/fesm2022/neural-ui-core-card.mjs +13 -8
  20. package/fesm2022/neural-ui-core-card.mjs.map +1 -1
  21. package/fesm2022/neural-ui-core-chart.mjs +45 -24
  22. package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
  23. package/fesm2022/neural-ui-core-checkbox.mjs +15 -9
  24. package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
  25. package/fesm2022/neural-ui-core-chip.mjs +23 -13
  26. package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
  27. package/fesm2022/neural-ui-core-code-block.mjs +32 -17
  28. package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
  29. package/fesm2022/neural-ui-core-color-picker.mjs +19 -11
  30. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
  31. package/fesm2022/neural-ui-core-command-palette.mjs +16 -11
  32. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
  33. package/fesm2022/neural-ui-core-confirm-dialog.mjs +6 -6
  34. package/fesm2022/neural-ui-core-context-menu.mjs +12 -9
  35. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
  36. package/fesm2022/neural-ui-core-dashboard-grid.mjs +11 -7
  37. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
  38. package/fesm2022/neural-ui-core-date-input.mjs +111 -57
  39. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
  40. package/fesm2022/neural-ui-core-divider.mjs +7 -5
  41. package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
  42. package/fesm2022/neural-ui-core-empty-state.mjs +13 -8
  43. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
  44. package/fesm2022/neural-ui-core-filter-bar.mjs +19 -11
  45. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
  46. package/fesm2022/neural-ui-core-icon.mjs +11 -7
  47. package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
  48. package/fesm2022/neural-ui-core-image-gallery.mjs +23 -13
  49. package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
  50. package/fesm2022/neural-ui-core-image-viewer.mjs +22 -14
  51. package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
  52. package/fesm2022/neural-ui-core-input-otp.mjs +19 -11
  53. package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
  54. package/fesm2022/neural-ui-core-input.mjs +67 -35
  55. package/fesm2022/neural-ui-core-input.mjs.map +1 -1
  56. package/fesm2022/neural-ui-core-kanban.mjs +17 -11
  57. package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
  58. package/fesm2022/neural-ui-core-knob.mjs +41 -22
  59. package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
  60. package/fesm2022/neural-ui-core-meter-group.mjs +23 -13
  61. package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
  62. package/fesm2022/neural-ui-core-modal.mjs +16 -11
  63. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  64. package/fesm2022/neural-ui-core-multiselect.mjs +72 -39
  65. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  66. package/fesm2022/neural-ui-core-nav.mjs +22 -13
  67. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  68. package/fesm2022/neural-ui-core-notification-center.mjs +27 -10
  69. package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
  70. package/fesm2022/neural-ui-core-number-input.mjs +35 -19
  71. package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
  72. package/fesm2022/neural-ui-core-pagination.mjs +15 -9
  73. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
  74. package/fesm2022/neural-ui-core-popover.mjs +22 -14
  75. package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
  76. package/fesm2022/neural-ui-core-progress-bar.mjs +19 -11
  77. package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
  78. package/fesm2022/neural-ui-core-radio.mjs +24 -15
  79. package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
  80. package/fesm2022/neural-ui-core-rating.mjs +13 -8
  81. package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
  82. package/fesm2022/neural-ui-core-rich-text-editor.mjs +773 -0
  83. package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -0
  84. package/fesm2022/neural-ui-core-scheduler-gantt.mjs +41 -22
  85. package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
  86. package/fesm2022/neural-ui-core-select.mjs +77 -43
  87. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  88. package/fesm2022/neural-ui-core-sidebar.mjs +23 -14
  89. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  90. package/fesm2022/neural-ui-core-skeleton.mjs +11 -7
  91. package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
  92. package/fesm2022/neural-ui-core-slider.mjs +23 -13
  93. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  94. package/fesm2022/neural-ui-core-spinner.mjs +17 -10
  95. package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
  96. package/fesm2022/neural-ui-core-split-button.mjs +27 -15
  97. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  98. package/fesm2022/neural-ui-core-splitter.mjs +9 -6
  99. package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
  100. package/fesm2022/neural-ui-core-stats-card.mjs +19 -11
  101. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
  102. package/fesm2022/neural-ui-core-stepper.mjs +13 -8
  103. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  104. package/fesm2022/neural-ui-core-switch.mjs +15 -9
  105. package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
  106. package/fesm2022/neural-ui-core-table.mjs +242 -124
  107. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  108. package/fesm2022/neural-ui-core-tabs.mjs +30 -18
  109. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  110. package/fesm2022/neural-ui-core-textarea.mjs +43 -23
  111. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
  112. package/fesm2022/neural-ui-core-timeline-grid.mjs +21 -12
  113. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
  114. package/fesm2022/neural-ui-core-timeline.mjs +5 -4
  115. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
  116. package/fesm2022/neural-ui-core-toast.mjs +25 -9
  117. package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
  118. package/fesm2022/neural-ui-core-toggle-button-group.mjs +17 -10
  119. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  120. package/fesm2022/neural-ui-core-toolbar.mjs +13 -8
  121. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
  122. package/fesm2022/neural-ui-core-tooltip.mjs +16 -11
  123. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
  124. package/fesm2022/neural-ui-core-tree-table.mjs +57 -30
  125. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
  126. package/fesm2022/neural-ui-core-tree.mjs +31 -17
  127. package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
  128. package/fesm2022/neural-ui-core-uploader.mjs +91 -47
  129. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
  130. package/fesm2022/neural-ui-core-url-state.mjs +7 -5
  131. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
  132. package/fesm2022/neural-ui-core-virtual-list.mjs +32 -19
  133. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  134. package/package.json +5 -1
  135. package/types/neural-ui-core-notification-center.d.ts +2 -0
  136. package/types/neural-ui-core-rich-text-editor.d.ts +97 -0
  137. package/types/neural-ui-core-toast.d.ts +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-number-input.mjs","sources":["../../../../projects/ui-core/number-input/neu-number-input.component.ts","../../../../projects/ui-core/number-input/neural-ui-core-number-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nlet _seq = 0;\n\n/**\n * NeuralUI NumberInput Component\n *\n * Input numérico con botones de incremento/decremento. Implementa CVA.\n * Soporta layout apilado (stacked), horizontal y vertical.\n *\n * Numeric input with increment/decrement buttons. Implements CVA.\n * Supports stacked, horizontal and vertical layouts.\n *\n * Uso: <neu-number-input [min]=\"0\" [max]=\"99\" label=\"Cantidad\" />\n */\n@Component({\n selector: 'neu-number-input',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClasses()' },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuNumberInputComponent),\n multi: true,\n },\n ],\n template: `\n @if (!effectiveFloatingLabel() && label()) {\n <label class=\"neu-number-input__label\" [for]=\"_id\">{{ label() }}</label>\n }\n <div\n class=\"neu-number-input__control\"\n [class.neu-number-input__control--focused]=\"_focused()\"\n [class.neu-number-input__control--has-value]=\"hasValue()\"\n [class.neu-number-input__control--no-float]=\"!effectiveFloatingLabel()\"\n >\n @if (vertical()) {\n <!-- layout vertical: [▲] [input] [▼] -->\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n ▲\n </button>\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n ▼\n </button>\n } @else if (stacked()) {\n <!-- layout apilado: [input | ▲▼ apilados] -->\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"neu-number-input__stack\">\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n ▲\n </button>\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n ▼\n </button>\n </span>\n } @else {\n <!-- layout horizontal: [−] [input] [+] -->\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n −\n </button>\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n +\n </button>\n }\n\n @if (effectiveFloatingLabel() && label()) {\n <label class=\"neu-number-input__floating-label\" [for]=\"_id\">{{ label() }}</label>\n }\n </div>\n `,\n styleUrl: './neu-number-input.component.scss',\n})\nexport class NeuNumberInputComponent implements ControlValueAccessor {\n /** Valor mínimo / Min value */\n readonly min = input<number>(-Infinity);\n /** Valor máximo / Max value */\n readonly max = input<number>(Infinity);\n /** Incremento / Step */\n readonly step = input<number>(1);\n /** Etiqueta para el input (accesibilidad) / Label for the input (accessibility) */\n readonly label = input<string>('');\n /** Muestra el label como flotante dentro del campo. No compatible con vertical=true. / Shows the label as floating inside the field. Not compatible with vertical=true. */\n readonly floatingLabel = input<boolean>(false);\n /** Aria-label del botón de decremento */\n readonly decrementLabel = input<string>('Disminuir');\n /** Aria-label del botón de incremento */\n readonly incrementLabel = input<string>('Aumentar');\n /** Muestra los botones en vertical / Shows buttons vertically */\n readonly vertical = input<boolean>(false);\n /** Agrupa ambos botones apilados al final del input / Groups both buttons stacked at input end */\n readonly stacked = input<boolean>(true);\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n /** Emitido en cada cambio / Emitted on each change */\n readonly valueChange = output<number>();\n\n readonly _id = `neu-number-input-${++_seq}`;\n readonly _cvaDisabled = signal(false);\n readonly _value = signal(0);\n readonly _focused = signal(false);\n\n readonly hasValue = computed(() => Number.isFinite(this._value()));\n readonly effectiveFloatingLabel = computed(() => this.floatingLabel() && !this.vertical());\n\n readonly hostClasses = computed(() => ({\n 'neu-number-input': true,\n 'neu-number-input--vertical': this.vertical(),\n 'neu-number-input--stacked': this.stacked(),\n 'neu-number-input--horizontal': !this.vertical() && !this.stacked(),\n 'neu-number-input--disabled': this._cvaDisabled(),\n 'neu-number-input--sm': this.size() === 'sm',\n 'neu-number-input--lg': this.size() === 'lg',\n }));\n\n private _onChange: (v: number) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: number | null): void {\n this._value.set(this._clamp(val ?? 0));\n }\n\n registerOnChange(fn: (v: number) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this._cvaDisabled.set(disabled);\n }\n\n increment(): void {\n this._emit(this._clamp(this._value() + this.step()));\n }\n\n decrement(): void {\n this._emit(this._clamp(this._value() - this.step()));\n }\n\n onInputChange(event: Event): void {\n const raw = parseFloat((event.target as HTMLInputElement).value);\n this._emit(this._clamp(isNaN(raw) ? 0 : raw));\n }\n\n onFocus(): void {\n this._focused.set(true);\n }\n\n onBlur(): void {\n this._focused.set(false);\n this._onTouched();\n }\n\n private _emit(value: number): void {\n this._value.set(value);\n this._onChange(value);\n this.valueChange.emit(value);\n }\n\n private _clamp(v: number): number {\n return Math.min(this.max(), Math.max(this.min(), v));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-number-input.mjs","sources":["../../../../projects/ui-core/number-input/neu-number-input.component.ts","../../../../projects/ui-core/number-input/neural-ui-core-number-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nlet _seq = 0;\n\n/**\n * NeuralUI NumberInput Component\n *\n * Input numérico con botones de incremento/decremento. Implementa CVA.\n * Soporta layout apilado (stacked), horizontal y vertical.\n *\n * Numeric input with increment/decrement buttons. Implements CVA.\n * Supports stacked, horizontal and vertical layouts.\n *\n * Uso: <neu-number-input [min]=\"0\" [max]=\"99\" label=\"Cantidad\" />\n */\n@Component({\n selector: 'neu-number-input',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClasses()' },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuNumberInputComponent),\n multi: true,\n },\n ],\n template: `\n @if (!effectiveFloatingLabel() && label()) {\n <label class=\"neu-number-input__label\" [for]=\"_id\">{{ label() }}</label>\n }\n <div\n class=\"neu-number-input__control\"\n [class.neu-number-input__control--focused]=\"_focused()\"\n [class.neu-number-input__control--has-value]=\"hasValue()\"\n [class.neu-number-input__control--no-float]=\"!effectiveFloatingLabel()\"\n >\n @if (vertical()) {\n <!-- layout vertical: [▲] [input] [▼] -->\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n ▲\n </button>\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n ▼\n </button>\n } @else if (stacked()) {\n <!-- layout apilado: [input | ▲▼ apilados] -->\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"neu-number-input__stack\">\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n ▲\n </button>\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n ▼\n </button>\n </span>\n } @else {\n <!-- layout horizontal: [−] [input] [+] -->\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--dec\"\n [disabled]=\"_cvaDisabled() || _value() <= min()\"\n [attr.aria-label]=\"decrementLabel()\"\n (click)=\"decrement()\"\n >\n −\n </button>\n <input\n class=\"neu-number-input__field\"\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n [id]=\"_id\"\n [attr.aria-valuenow]=\"_value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [disabled]=\"_cvaDisabled()\"\n [value]=\"_value()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"neu-number-input__btn neu-number-input__btn--inc\"\n [disabled]=\"_cvaDisabled() || _value() >= max()\"\n [attr.aria-label]=\"incrementLabel()\"\n (click)=\"increment()\"\n >\n +\n </button>\n }\n\n @if (effectiveFloatingLabel() && label()) {\n <label class=\"neu-number-input__floating-label\" [for]=\"_id\">{{ label() }}</label>\n }\n </div>\n `,\n styleUrl: './neu-number-input.component.scss',\n})\nexport class NeuNumberInputComponent implements ControlValueAccessor {\n /** Valor mínimo / Min value */\n readonly min = input<number>(-Infinity);\n /** Valor máximo / Max value */\n readonly max = input<number>(Infinity);\n /** Incremento / Step */\n readonly step = input<number>(1);\n /** Etiqueta para el input (accesibilidad) / Label for the input (accessibility) */\n readonly label = input<string>('');\n /** Muestra el label como flotante dentro del campo. No compatible con vertical=true. / Shows the label as floating inside the field. Not compatible with vertical=true. */\n readonly floatingLabel = input<boolean>(false);\n /** Aria-label del botón de decremento */\n readonly decrementLabel = input<string>('Disminuir');\n /** Aria-label del botón de incremento */\n readonly incrementLabel = input<string>('Aumentar');\n /** Muestra los botones en vertical / Shows buttons vertically */\n readonly vertical = input<boolean>(false);\n /** Agrupa ambos botones apilados al final del input / Groups both buttons stacked at input end */\n readonly stacked = input<boolean>(true);\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n /** Emitido en cada cambio / Emitted on each change */\n readonly valueChange = output<number>();\n\n readonly _id = `neu-number-input-${++_seq}`;\n readonly _cvaDisabled = signal(false);\n readonly _value = signal(0);\n readonly _focused = signal(false);\n\n readonly hasValue = computed(() => Number.isFinite(this._value()));\n readonly effectiveFloatingLabel = computed(() => this.floatingLabel() && !this.vertical());\n\n readonly hostClasses = computed(() => ({\n 'neu-number-input': true,\n 'neu-number-input--vertical': this.vertical(),\n 'neu-number-input--stacked': this.stacked(),\n 'neu-number-input--horizontal': !this.vertical() && !this.stacked(),\n 'neu-number-input--disabled': this._cvaDisabled(),\n 'neu-number-input--sm': this.size() === 'sm',\n 'neu-number-input--lg': this.size() === 'lg',\n }));\n\n private _onChange: (v: number) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: number | null): void {\n this._value.set(this._clamp(val ?? 0));\n }\n\n registerOnChange(fn: (v: number) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this._cvaDisabled.set(disabled);\n }\n\n increment(): void {\n this._emit(this._clamp(this._value() + this.step()));\n }\n\n decrement(): void {\n this._emit(this._clamp(this._value() - this.step()));\n }\n\n onInputChange(event: Event): void {\n const raw = parseFloat((event.target as HTMLInputElement).value);\n this._emit(this._clamp(isNaN(raw) ? 0 : raw));\n }\n\n onFocus(): void {\n this._focused.set(true);\n }\n\n onBlur(): void {\n this._focused.set(false);\n this._onTouched();\n }\n\n private _emit(value: number): void {\n this._value.set(value);\n this._onChange(value);\n this.valueChange.emit(value);\n }\n\n private _clamp(v: number): number {\n return Math.min(this.max(), Math.max(this.min(), v));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -12,16 +12,21 @@ import { input, output, computed, ChangeDetectionStrategy, ViewEncapsulation, Co
12
12
  */
13
13
  class NeuPaginationComponent {
14
14
  /** Página actual (1-indexed) / Current page (1-indexed) */
15
- page = input(1, ...(ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []));
15
+ page = input(1, /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []));
16
17
  /** Total de ítems / Total items */
17
- total = input(0, ...(ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []));
18
+ total = input(0, /* @ts-ignore */
19
+ ...(ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []));
18
20
  /** Ítems por página / Items per page */
19
- pageSize = input(10, ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
21
+ pageSize = input(10, /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
20
23
  /** Número máximo de botones de página visibles (sin contar anterior/siguiente) / Maximum number of visible page buttons (not counting prev/next) */
21
- maxVisible = input(7, ...(ngDevMode ? [{ debugName: "maxVisible" }] : /* istanbul ignore next */ []));
24
+ maxVisible = input(7, /* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "maxVisible" }] : /* istanbul ignore next */ []));
22
26
  /** Emite la nueva página al hacer click / Emits the new page on click */
23
27
  pageChange = output();
24
- totalPages = computed(() => Math.max(1, Math.ceil(this.total() / this.pageSize())), ...(ngDevMode ? [{ debugName: "totalPages" }] : /* istanbul ignore next */ []));
28
+ totalPages = computed(() => Math.max(1, Math.ceil(this.total() / this.pageSize())), /* @ts-ignore */
29
+ ...(ngDevMode ? [{ debugName: "totalPages" }] : /* istanbul ignore next */ []));
25
30
  pages = computed(() => {
26
31
  const total = this.totalPages();
27
32
  const current = this.page();
@@ -43,15 +48,16 @@ class NeuPaginationComponent {
43
48
  result.push(-1);
44
49
  result.push(total);
45
50
  return result;
46
- }, ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
51
+ }, /* @ts-ignore */
52
+ ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
47
53
  go(page) {
48
54
  const clamped = Math.min(this.totalPages(), Math.max(1, page));
49
55
  if (clamped !== this.page()) {
50
56
  this.pageChange.emit(clamped);
51
57
  }
52
58
  }
53
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
54
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuPaginationComponent, isStandalone: true, selector: "neu-pagination", inputs: { page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, maxVisible: { classPropertyName: "maxVisible", publicName: "maxVisible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: `
59
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
60
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuPaginationComponent, isStandalone: true, selector: "neu-pagination", inputs: { page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, maxVisible: { classPropertyName: "maxVisible", publicName: "maxVisible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: `
55
61
  <nav class="neu-pagination" aria-label="Paginación">
56
62
  <!-- Anterior -->
57
63
  <button
@@ -119,7 +125,7 @@ class NeuPaginationComponent {
119
125
  </nav>
120
126
  `, isInline: true, styles: [".neu-pagination{display:inline-flex;align-items:center;gap:4px;font-family:var(--neu-font-sans)}.neu-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 6px;border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);background:var(--neu-surface);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);cursor:pointer;transition:background var(--neu-transition),border-color var(--neu-transition),color var(--neu-transition);outline:none}.neu-pagination__btn:hover:not(:disabled){background:var(--neu-surface-2);border-color:var(--neu-border-hover);color:var(--neu-text)}.neu-pagination__btn:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-pagination__btn--active{background:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));border-color:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));color:var(--neu-primary-solid-fg, var(--neu-primary-fg));font-weight:600}.neu-pagination__btn--active:hover{background:var(--neu-primary-solid-hover, var(--neu-primary-dark));border-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-pagination__btn--nav{color:var(--neu-text-muted)}.neu-pagination__btn:disabled{opacity:.35;cursor:not-allowed}.neu-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);-webkit-user-select:none;user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
121
127
  }
122
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPaginationComponent, decorators: [{
128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuPaginationComponent, decorators: [{
123
129
  type: Component,
124
130
  args: [{ selector: 'neu-pagination', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
125
131
  <nav class="neu-pagination" aria-label="Paginación">
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-pagination.mjs","sources":["../../../../projects/ui-core/pagination/neu-pagination.component.ts","../../../../projects/ui-core/pagination/neural-ui-core-pagination.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n} from '@angular/core';\n\n/**\n * NeuralUI Pagination Component\n *\n * Paginación accesible con navegación por páginas, primera/última y ellipsis.\n *\n * Uso:\n * <neu-pagination [total]=\"200\" [pageSize]=\"10\" [page]=\"currentPage\"\n * (pageChange)=\"currentPage = $event\" />\n */\n@Component({\n selector: 'neu-pagination',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nav class=\"neu-pagination\" aria-label=\"Paginación\">\n <!-- Anterior -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() <= 1\"\n [attr.aria-label]=\"'Página anterior'\"\n (click)=\"go(page() - 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n\n <!-- Páginas -->\n @for (p of pages(); track p) {\n @if (p === -1) {\n <span class=\"neu-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n } @else {\n <button\n class=\"neu-pagination__btn\"\n [class.neu-pagination__btn--active]=\"p === page()\"\n type=\"button\"\n [attr.aria-label]=\"'Página ' + p\"\n [attr.aria-current]=\"p === page() ? 'page' : null\"\n (click)=\"go(p)\"\n >\n {{ p }}\n </button>\n }\n }\n\n <!-- Siguiente -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() >= totalPages()\"\n [attr.aria-label]=\"'Página siguiente'\"\n (click)=\"go(page() + 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n </nav>\n `,\n styleUrl: './neu-pagination.component.scss',\n})\nexport class NeuPaginationComponent {\n /** Página actual (1-indexed) / Current page (1-indexed) */\n page = input<number>(1);\n\n /** Total de ítems / Total items */\n total = input<number>(0);\n\n /** Ítems por página / Items per page */\n pageSize = input<number>(10);\n\n /** Número máximo de botones de página visibles (sin contar anterior/siguiente) / Maximum number of visible page buttons (not counting prev/next) */\n maxVisible = input<number>(7);\n\n /** Emite la nueva página al hacer click / Emits the new page on click */\n pageChange = output<number>();\n\n readonly totalPages = computed(() => Math.max(1, Math.ceil(this.total() / this.pageSize())));\n\n readonly pages = computed((): (number | -1)[] => {\n const total = this.totalPages();\n const current = this.page();\n const max = this.maxVisible();\n\n if (total <= max) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const half = Math.floor(max / 2);\n let start = Math.max(2, current - half + 1);\n let end = Math.min(total - 1, start + max - 3);\n if (end - start < max - 3) start = Math.max(2, end - (max - 4));\n\n const result: (number | -1)[] = [1];\n if (start > 2) result.push(-1);\n for (let i = start; i <= end; i++) result.push(i);\n if (end < total - 1) result.push(-1);\n result.push(total);\n return result;\n });\n\n go(page: number): void {\n const clamped = Math.min(this.totalPages(), Math.max(1, page));\n if (clamped !== this.page()) {\n this.pageChange.emit(clamped);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-pagination.mjs","sources":["../../../../projects/ui-core/pagination/neu-pagination.component.ts","../../../../projects/ui-core/pagination/neural-ui-core-pagination.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n} from '@angular/core';\n\n/**\n * NeuralUI Pagination Component\n *\n * Paginación accesible con navegación por páginas, primera/última y ellipsis.\n *\n * Uso:\n * <neu-pagination [total]=\"200\" [pageSize]=\"10\" [page]=\"currentPage\"\n * (pageChange)=\"currentPage = $event\" />\n */\n@Component({\n selector: 'neu-pagination',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nav class=\"neu-pagination\" aria-label=\"Paginación\">\n <!-- Anterior -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() <= 1\"\n [attr.aria-label]=\"'Página anterior'\"\n (click)=\"go(page() - 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n\n <!-- Páginas -->\n @for (p of pages(); track p) {\n @if (p === -1) {\n <span class=\"neu-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n } @else {\n <button\n class=\"neu-pagination__btn\"\n [class.neu-pagination__btn--active]=\"p === page()\"\n type=\"button\"\n [attr.aria-label]=\"'Página ' + p\"\n [attr.aria-current]=\"p === page() ? 'page' : null\"\n (click)=\"go(p)\"\n >\n {{ p }}\n </button>\n }\n }\n\n <!-- Siguiente -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() >= totalPages()\"\n [attr.aria-label]=\"'Página siguiente'\"\n (click)=\"go(page() + 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n </nav>\n `,\n styleUrl: './neu-pagination.component.scss',\n})\nexport class NeuPaginationComponent {\n /** Página actual (1-indexed) / Current page (1-indexed) */\n page = input<number>(1);\n\n /** Total de ítems / Total items */\n total = input<number>(0);\n\n /** Ítems por página / Items per page */\n pageSize = input<number>(10);\n\n /** Número máximo de botones de página visibles (sin contar anterior/siguiente) / Maximum number of visible page buttons (not counting prev/next) */\n maxVisible = input<number>(7);\n\n /** Emite la nueva página al hacer click / Emits the new page on click */\n pageChange = output<number>();\n\n readonly totalPages = computed(() => Math.max(1, Math.ceil(this.total() / this.pageSize())));\n\n readonly pages = computed((): (number | -1)[] => {\n const total = this.totalPages();\n const current = this.page();\n const max = this.maxVisible();\n\n if (total <= max) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const half = Math.floor(max / 2);\n let start = Math.max(2, current - half + 1);\n let end = Math.min(total - 1, start + max - 3);\n if (end - start < max - 3) start = Math.max(2, end - (max - 4));\n\n const result: (number | -1)[] = [1];\n if (start > 2) result.push(-1);\n for (let i = start; i <= end; i++) result.push(i);\n if (end < total - 1) result.push(-1);\n result.push(total);\n return result;\n });\n\n go(page: number): void {\n const clamped = Math.min(this.totalPages(), Math.max(1, page));\n if (clamped !== this.page()) {\n this.pageChange.emit(clamped);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -9,11 +9,12 @@ import { ComponentPortal } from '@angular/cdk/portal';
9
9
  * Renderizado por CDK Portal — no usar directamente.
10
10
  */
11
11
  class NeuPopoverOverlayComponent {
12
- _text = signal('', ...(ngDevMode ? [{ debugName: "_text" }] : /* istanbul ignore next */ []));
12
+ _text = signal('', /* @ts-ignore */
13
+ ...(ngDevMode ? [{ debugName: "_text" }] : /* istanbul ignore next */ []));
13
14
  _templateRef = null;
14
15
  _context = {};
15
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPopoverOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuPopoverOverlayComponent, isStandalone: true, selector: "neu-popover-overlay", host: { classAttribute: "neu-popover" }, ngImport: i0, template: `
16
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuPopoverOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
17
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuPopoverOverlayComponent, isStandalone: true, selector: "neu-popover-overlay", host: { classAttribute: "neu-popover" }, ngImport: i0, template: `
17
18
  @if (_templateRef) {
18
19
  <ng-container [ngTemplateOutlet]="_templateRef" [ngTemplateOutletContext]="_context" />
19
20
  } @else {
@@ -21,7 +22,7 @@ class NeuPopoverOverlayComponent {
21
22
  }
22
23
  `, isInline: true, styles: ["@charset \"UTF-8\";.neu-popover{background:var(--neu-popover-bg, var(--neu-surface-1, #ffffff));border:1px solid var(--neu-popover-border, var(--neu-border-color, #e5e7eb));border-radius:var(--neu-popover-radius, var(--neu-radius-lg, 12px));box-shadow:var(--neu-popover-shadow, 0 8px 24px -4px rgba(0, 0, 0, .12));min-width:var(--neu-popover-min-width, 200px);max-width:var(--neu-popover-max-width, 320px);padding:var(--neu-popover-padding, 12px 16px);font-size:.875rem;line-height:1.5;color:var(--neu-popover-color, var(--neu-text, var(--neu-text-primary, #111827)));z-index:1000;animation:neu-popover-in .12s ease}@keyframes neu-popover-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.neu-popover__inner{padding:0}.neu-popover-backdrop{background:transparent}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
23
24
  }
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPopoverOverlayComponent, decorators: [{
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuPopoverOverlayComponent, decorators: [{
25
26
  type: Component,
26
27
  args: [{ selector: 'neu-popover-overlay', imports: [NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'neu-popover' }, template: `
27
28
  @if (_templateRef) {
@@ -44,22 +45,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
44
45
  */
45
46
  class NeuPopoverDirective {
46
47
  /** Template del contenido / Content template */
47
- neuPopover = input(null, ...(ngDevMode ? [{ debugName: "neuPopover" }] : /* istanbul ignore next */ []));
48
+ neuPopover = input(null, /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "neuPopover" }] : /* istanbul ignore next */ []));
48
50
  /** Texto plano cuando no hay template / Plain text when no template */
49
- neuPopoverText = input('', ...(ngDevMode ? [{ debugName: "neuPopoverText" }] : /* istanbul ignore next */ []));
51
+ neuPopoverText = input('', /* @ts-ignore */
52
+ ...(ngDevMode ? [{ debugName: "neuPopoverText" }] : /* istanbul ignore next */ []));
50
53
  /** Posición preferida / Preferred position */
51
- neuPopoverPosition = input('bottom', ...(ngDevMode ? [{ debugName: "neuPopoverPosition" }] : /* istanbul ignore next */ []));
54
+ neuPopoverPosition = input('bottom', /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "neuPopoverPosition" }] : /* istanbul ignore next */ []));
52
56
  /** Trigger del popover / Popover trigger */
53
- neuPopoverTrigger = input('click', ...(ngDevMode ? [{ debugName: "neuPopoverTrigger" }] : /* istanbul ignore next */ []));
57
+ neuPopoverTrigger = input('click', /* @ts-ignore */
58
+ ...(ngDevMode ? [{ debugName: "neuPopoverTrigger" }] : /* istanbul ignore next */ []));
54
59
  /** Desactiva el popover / Disables the popover */
55
- neuPopoverDisabled = input(false, ...(ngDevMode ? [{ debugName: "neuPopoverDisabled" }] : /* istanbul ignore next */ []));
60
+ neuPopoverDisabled = input(false, /* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "neuPopoverDisabled" }] : /* istanbul ignore next */ []));
56
62
  /** Contexto del template / Template context */
57
- neuPopoverContext = input({}, ...(ngDevMode ? [{ debugName: "neuPopoverContext" }] : /* istanbul ignore next */ []));
63
+ neuPopoverContext = input({}, /* @ts-ignore */
64
+ ...(ngDevMode ? [{ debugName: "neuPopoverContext" }] : /* istanbul ignore next */ []));
58
65
  /** Emitido al abrir / Emitted on open */
59
66
  popoverOpened = output();
60
67
  /** Emitido al cerrar / Emitted on close */
61
68
  popoverClosed = output();
62
- _isOpen = signal(false, ...(ngDevMode ? [{ debugName: "_isOpen" }] : /* istanbul ignore next */ []));
69
+ _isOpen = signal(false, /* @ts-ignore */
70
+ ...(ngDevMode ? [{ debugName: "_isOpen" }] : /* istanbul ignore next */ []));
63
71
  _overlay = inject(Overlay);
64
72
  _el = inject((ElementRef));
65
73
  _injector = inject(Injector);
@@ -161,10 +169,10 @@ class NeuPopoverDirective {
161
169
  scrollStrategy: this._overlay.scrollStrategies.reposition(),
162
170
  });
163
171
  }
164
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPopoverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
165
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.8", type: NeuPopoverDirective, isStandalone: true, selector: "[neuPopover]", inputs: { neuPopover: { classPropertyName: "neuPopover", publicName: "neuPopover", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverText: { classPropertyName: "neuPopoverText", publicName: "neuPopoverText", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverPosition: { classPropertyName: "neuPopoverPosition", publicName: "neuPopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverTrigger: { classPropertyName: "neuPopoverTrigger", publicName: "neuPopoverTrigger", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverDisabled: { classPropertyName: "neuPopoverDisabled", publicName: "neuPopoverDisabled", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverContext: { classPropertyName: "neuPopoverContext", publicName: "neuPopoverContext", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { popoverOpened: "popoverOpened", popoverClosed: "popoverClosed" }, host: { listeners: { "click": "onHostClick()", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.aria-haspopup": "_hostAriaHasPopup()", "attr.aria-expanded": "_hostAriaExpanded()" } }, exportAs: ["neuPopover"], ngImport: i0 });
172
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuPopoverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
173
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.4", type: NeuPopoverDirective, isStandalone: true, selector: "[neuPopover]", inputs: { neuPopover: { classPropertyName: "neuPopover", publicName: "neuPopover", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverText: { classPropertyName: "neuPopoverText", publicName: "neuPopoverText", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverPosition: { classPropertyName: "neuPopoverPosition", publicName: "neuPopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverTrigger: { classPropertyName: "neuPopoverTrigger", publicName: "neuPopoverTrigger", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverDisabled: { classPropertyName: "neuPopoverDisabled", publicName: "neuPopoverDisabled", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverContext: { classPropertyName: "neuPopoverContext", publicName: "neuPopoverContext", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { popoverOpened: "popoverOpened", popoverClosed: "popoverClosed" }, host: { listeners: { "click": "onHostClick()", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.aria-haspopup": "_hostAriaHasPopup()", "attr.aria-expanded": "_hostAriaExpanded()" } }, exportAs: ["neuPopover"], ngImport: i0 });
166
174
  }
167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPopoverDirective, decorators: [{
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuPopoverDirective, decorators: [{
168
176
  type: Directive,
169
177
  args: [{
170
178
  selector: '[neuPopover]',
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-popover.mjs","sources":["../../../../projects/ui-core/popover/neu-popover.component.ts","../../../../projects/ui-core/popover/neural-ui-core-popover.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n EnvironmentInjector,\n HostListener,\n Injector,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Overlay, OverlayRef, ConnectedPosition } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport type NeuPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type NeuPopoverTrigger = 'click' | 'hover' | 'focus';\n\n/**\n * NeuralUI Popover Overlay Component (internal)\n * Renderizado por CDK Portal — no usar directamente.\n */\n@Component({\n selector: 'neu-popover-overlay',\n imports: [NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-popover' },\n template: `\n @if (_templateRef) {\n <ng-container [ngTemplateOutlet]=\"_templateRef\" [ngTemplateOutletContext]=\"_context\" />\n } @else {\n <div class=\"neu-popover__inner\">{{ _text() }}</div>\n }\n `,\n styleUrl: './neu-popover.component.scss',\n})\nexport class NeuPopoverOverlayComponent {\n readonly _text = signal('');\n _templateRef: TemplateRef<unknown> | null = null;\n _context: unknown = {};\n}\n\n/**\n * NeuralUI Popover Directive\n *\n * Muestra un popover flotante anclado al elemento host usando CDK Overlay.\n *\n * Uso:\n * <button [neuPopoverTemplate]=\"myTpl\">Info</button>\n * <ng-template #myTpl>Contenido del popover</ng-template>\n *\n * <button [neuPopoverText]=\"'Descripción detallada'\">Hover me</button>\n */\n@Directive({\n selector: '[neuPopover]',\n exportAs: 'neuPopover',\n host: {\n '[attr.aria-haspopup]': '_hostAriaHasPopup()',\n '[attr.aria-expanded]': '_hostAriaExpanded()',\n },\n})\nexport class NeuPopoverDirective implements OnDestroy {\n /** Template del contenido / Content template */\n readonly neuPopover = input<TemplateRef<unknown> | null>(null);\n\n /** Texto plano cuando no hay template / Plain text when no template */\n readonly neuPopoverText = input<string>('');\n\n /** Posición preferida / Preferred position */\n readonly neuPopoverPosition = input<NeuPopoverPosition>('bottom');\n\n /** Trigger del popover / Popover trigger */\n readonly neuPopoverTrigger = input<NeuPopoverTrigger>('click');\n\n /** Desactiva el popover / Disables the popover */\n readonly neuPopoverDisabled = input<boolean>(false);\n\n /** Contexto del template / Template context */\n readonly neuPopoverContext = input<unknown>({});\n\n /** Emitido al abrir / Emitted on open */\n readonly popoverOpened = output<void>();\n\n /** Emitido al cerrar / Emitted on close */\n readonly popoverClosed = output<void>();\n\n readonly _isOpen = signal(false);\n\n private readonly _overlay = inject(Overlay);\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _injector = inject(Injector);\n private readonly _vcr = inject(ViewContainerRef);\n\n private _overlayRef: OverlayRef | null = null;\n private _compRef: ComponentRef<NeuPopoverOverlayComponent> | null = null;\n\n @HostListener('click')\n onHostClick(): void {\n if (this.neuPopoverTrigger() !== 'click') return;\n this._toggle();\n }\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.open();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.close();\n }\n\n @HostListener('focus')\n onFocus(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.open();\n }\n\n @HostListener('blur')\n onBlur(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.close();\n }\n\n /** Abre el popover / Opens the popover */\n open(): void {\n if (this.neuPopoverDisabled() || this._isOpen()) return;\n this._createOverlay();\n const portal = new ComponentPortal(NeuPopoverOverlayComponent, this._vcr, this._injector);\n this._compRef = this._overlayRef!.attach(portal);\n const comp = this._compRef.instance;\n const tpl = this.neuPopover();\n if (tpl) {\n comp._templateRef = tpl;\n comp._context = this.neuPopoverContext();\n } else {\n comp._text.set(this.neuPopoverText());\n }\n this._isOpen.set(true);\n this.popoverOpened.emit();\n\n // Cierra al hacer clic fuera (solo en trigger 'click') / Close on outside click (click trigger only)\n if (this.neuPopoverTrigger() === 'click') {\n this._overlayRef!.backdropClick().subscribe(() => this.close());\n }\n }\n\n /** Cierra el popover / Closes the popover */\n close(): void {\n this._overlayRef?.detach();\n this._isOpen.set(false);\n this.popoverClosed.emit();\n }\n\n /** Alterna la visibilidad / Toggles visibility */\n toggle(): void {\n this._toggle();\n }\n\n ngOnDestroy(): void {\n this._overlayRef?.dispose();\n }\n\n protected _hostAriaHasPopup(): 'dialog' | null {\n return this.neuPopoverTrigger() === 'click' ? 'dialog' : null;\n }\n\n protected _hostAriaExpanded(): 'true' | 'false' | null {\n if (this.neuPopoverTrigger() !== 'click') {\n return null;\n }\n return this._isOpen() ? 'true' : 'false';\n }\n\n private _toggle(): void {\n this._isOpen() ? this.close() : this.open();\n }\n\n private _createOverlay(): void {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n }\n const pos = this.neuPopoverPosition();\n const isClick = this.neuPopoverTrigger() === 'click';\n const positions: ConnectedPosition[] = [\n ...POSITIONS[pos],\n ...POSITIONS[pos === 'bottom' ? 'top' : 'bottom'],\n ];\n this._overlayRef = this._overlay.create({\n // Solo usamos backdrop en trigger 'click' — hover/focus lo cierran con sus propios listeners.\n // Only use backdrop for 'click' trigger — hover/focus close via their own listeners.\n hasBackdrop: isClick,\n backdropClass: 'neu-popover-backdrop',\n positionStrategy: this._overlay\n .position()\n .flexibleConnectedTo(this._el)\n .withPositions(positions),\n scrollStrategy: this._overlay.scrollStrategies.reposition(),\n });\n }\n}\n\nconst POSITIONS: Record<NeuPopoverPosition, ConnectedPosition[]> = {\n bottom: [\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 6 },\n ],\n top: [{ originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -6 }],\n left: [{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -6 }],\n right: [{ originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 6 }],\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-popover.mjs","sources":["../../../../projects/ui-core/popover/neu-popover.component.ts","../../../../projects/ui-core/popover/neural-ui-core-popover.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n EnvironmentInjector,\n HostListener,\n Injector,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Overlay, OverlayRef, ConnectedPosition } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport type NeuPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type NeuPopoverTrigger = 'click' | 'hover' | 'focus';\n\n/**\n * NeuralUI Popover Overlay Component (internal)\n * Renderizado por CDK Portal — no usar directamente.\n */\n@Component({\n selector: 'neu-popover-overlay',\n imports: [NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-popover' },\n template: `\n @if (_templateRef) {\n <ng-container [ngTemplateOutlet]=\"_templateRef\" [ngTemplateOutletContext]=\"_context\" />\n } @else {\n <div class=\"neu-popover__inner\">{{ _text() }}</div>\n }\n `,\n styleUrl: './neu-popover.component.scss',\n})\nexport class NeuPopoverOverlayComponent {\n readonly _text = signal('');\n _templateRef: TemplateRef<unknown> | null = null;\n _context: unknown = {};\n}\n\n/**\n * NeuralUI Popover Directive\n *\n * Muestra un popover flotante anclado al elemento host usando CDK Overlay.\n *\n * Uso:\n * <button [neuPopoverTemplate]=\"myTpl\">Info</button>\n * <ng-template #myTpl>Contenido del popover</ng-template>\n *\n * <button [neuPopoverText]=\"'Descripción detallada'\">Hover me</button>\n */\n@Directive({\n selector: '[neuPopover]',\n exportAs: 'neuPopover',\n host: {\n '[attr.aria-haspopup]': '_hostAriaHasPopup()',\n '[attr.aria-expanded]': '_hostAriaExpanded()',\n },\n})\nexport class NeuPopoverDirective implements OnDestroy {\n /** Template del contenido / Content template */\n readonly neuPopover = input<TemplateRef<unknown> | null>(null);\n\n /** Texto plano cuando no hay template / Plain text when no template */\n readonly neuPopoverText = input<string>('');\n\n /** Posición preferida / Preferred position */\n readonly neuPopoverPosition = input<NeuPopoverPosition>('bottom');\n\n /** Trigger del popover / Popover trigger */\n readonly neuPopoverTrigger = input<NeuPopoverTrigger>('click');\n\n /** Desactiva el popover / Disables the popover */\n readonly neuPopoverDisabled = input<boolean>(false);\n\n /** Contexto del template / Template context */\n readonly neuPopoverContext = input<unknown>({});\n\n /** Emitido al abrir / Emitted on open */\n readonly popoverOpened = output<void>();\n\n /** Emitido al cerrar / Emitted on close */\n readonly popoverClosed = output<void>();\n\n readonly _isOpen = signal(false);\n\n private readonly _overlay = inject(Overlay);\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _injector = inject(Injector);\n private readonly _vcr = inject(ViewContainerRef);\n\n private _overlayRef: OverlayRef | null = null;\n private _compRef: ComponentRef<NeuPopoverOverlayComponent> | null = null;\n\n @HostListener('click')\n onHostClick(): void {\n if (this.neuPopoverTrigger() !== 'click') return;\n this._toggle();\n }\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.open();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.close();\n }\n\n @HostListener('focus')\n onFocus(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.open();\n }\n\n @HostListener('blur')\n onBlur(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.close();\n }\n\n /** Abre el popover / Opens the popover */\n open(): void {\n if (this.neuPopoverDisabled() || this._isOpen()) return;\n this._createOverlay();\n const portal = new ComponentPortal(NeuPopoverOverlayComponent, this._vcr, this._injector);\n this._compRef = this._overlayRef!.attach(portal);\n const comp = this._compRef.instance;\n const tpl = this.neuPopover();\n if (tpl) {\n comp._templateRef = tpl;\n comp._context = this.neuPopoverContext();\n } else {\n comp._text.set(this.neuPopoverText());\n }\n this._isOpen.set(true);\n this.popoverOpened.emit();\n\n // Cierra al hacer clic fuera (solo en trigger 'click') / Close on outside click (click trigger only)\n if (this.neuPopoverTrigger() === 'click') {\n this._overlayRef!.backdropClick().subscribe(() => this.close());\n }\n }\n\n /** Cierra el popover / Closes the popover */\n close(): void {\n this._overlayRef?.detach();\n this._isOpen.set(false);\n this.popoverClosed.emit();\n }\n\n /** Alterna la visibilidad / Toggles visibility */\n toggle(): void {\n this._toggle();\n }\n\n ngOnDestroy(): void {\n this._overlayRef?.dispose();\n }\n\n protected _hostAriaHasPopup(): 'dialog' | null {\n return this.neuPopoverTrigger() === 'click' ? 'dialog' : null;\n }\n\n protected _hostAriaExpanded(): 'true' | 'false' | null {\n if (this.neuPopoverTrigger() !== 'click') {\n return null;\n }\n return this._isOpen() ? 'true' : 'false';\n }\n\n private _toggle(): void {\n this._isOpen() ? this.close() : this.open();\n }\n\n private _createOverlay(): void {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n }\n const pos = this.neuPopoverPosition();\n const isClick = this.neuPopoverTrigger() === 'click';\n const positions: ConnectedPosition[] = [\n ...POSITIONS[pos],\n ...POSITIONS[pos === 'bottom' ? 'top' : 'bottom'],\n ];\n this._overlayRef = this._overlay.create({\n // Solo usamos backdrop en trigger 'click' — hover/focus lo cierran con sus propios listeners.\n // Only use backdrop for 'click' trigger — hover/focus close via their own listeners.\n hasBackdrop: isClick,\n backdropClass: 'neu-popover-backdrop',\n positionStrategy: this._overlay\n .position()\n .flexibleConnectedTo(this._el)\n .withPositions(positions),\n scrollStrategy: this._overlay.scrollStrategies.reposition(),\n });\n }\n}\n\nconst POSITIONS: Record<NeuPopoverPosition, ConnectedPosition[]> = {\n bottom: [\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 6 },\n ],\n top: [{ originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -6 }],\n left: [{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -6 }],\n right: [{ originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 6 }],\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -14,21 +14,29 @@ import { input, computed, ChangeDetectionStrategy, ViewEncapsulation, Component
14
14
  */
15
15
  class NeuProgressBarComponent {
16
16
  /** Valor de 0 a 100 / Value from 0 to 100 */
17
- value = input(0, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
17
+ value = input(0, /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
18
19
  /** Variante de color / Color variant */
19
- variant = input('primary', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
20
+ variant = input('primary', /* @ts-ignore */
21
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
20
22
  /** Etiqueta descriptiva sobre la barra / Descriptive label above the bar */
21
- label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
23
+ label = input('', /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
22
25
  /** Muestra el % a la derecha / Shows the % on the right */
23
- showValue = input(false, ...(ngDevMode ? [{ debugName: "showValue" }] : /* istanbul ignore next */ []));
26
+ showValue = input(false, /* @ts-ignore */
27
+ ...(ngDevMode ? [{ debugName: "showValue" }] : /* istanbul ignore next */ []));
24
28
  /** Modo indeterminado (animación continua) / Indeterminate mode (continuous animation) */
25
- indeterminate = input(false, ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
29
+ indeterminate = input(false, /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
26
31
  /** Altura de la barra / Bar height */
27
- size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
28
- clampedValue = computed(() => Math.min(100, Math.max(0, this.value())), ...(ngDevMode ? [{ debugName: "clampedValue" }] : /* istanbul ignore next */ []));
29
- hostClasses = computed(() => [`neu-progress--${this.variant()}`, `neu-progress--${this.size()}`].join(' '), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
30
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
31
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuProgressBarComponent, isStandalone: true, selector: "neu-progress-bar", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
32
+ size = input('md', /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
34
+ clampedValue = computed(() => Math.min(100, Math.max(0, this.value())), /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "clampedValue" }] : /* istanbul ignore next */ []));
36
+ hostClasses = computed(() => [`neu-progress--${this.variant()}`, `neu-progress--${this.size()}`].join(' '), /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
38
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
39
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuProgressBarComponent, isStandalone: true, selector: "neu-progress-bar", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
32
40
  <div class="neu-progress" [class]="hostClasses()">
33
41
  @if (label()) {
34
42
  <div class="neu-progress__header">
@@ -61,7 +69,7 @@ class NeuProgressBarComponent {
61
69
  </div>
62
70
  `, isInline: true, styles: ["@keyframes neu-progress-indeterminate{0%{transform:translate(-100%) scaleX(.5)}50%{transform:translate(0) scaleX(.7)}to{transform:translate(200%) scaleX(.5)}}.neu-progress{display:flex;flex-direction:column;gap:6px;width:100%;font-family:var(--neu-font-sans)}.neu-progress--sm .neu-progress__track{height:4px}.neu-progress--md .neu-progress__track{height:8px}.neu-progress--lg .neu-progress__track{height:12px}.neu-progress--primary .neu-progress__fill{background:var(--neu-primary)}.neu-progress--success .neu-progress__fill{background:var(--neu-success)}.neu-progress--warning .neu-progress__fill{background:var(--neu-warning)}.neu-progress--danger .neu-progress__fill{background:var(--neu-error)}.neu-progress__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.neu-progress__label{font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted)}.neu-progress__value{font-size:var(--neu-text-xs);font-weight:600;color:var(--neu-text-muted);min-width:32px;text-align:right}.neu-progress__track{width:100%;background:var(--neu-surface-3);border-radius:var(--neu-radius-full);overflow:hidden}.neu-progress__fill{height:100%;border-radius:var(--neu-radius-full);transition:width .4s cubic-bezier(.4,0,.2,1);transform-origin:left center}.neu-progress__fill--indeterminate{width:50%!important;animation:neu-progress-indeterminate 1.4s ease-in-out infinite}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
63
71
  }
64
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuProgressBarComponent, decorators: [{
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuProgressBarComponent, decorators: [{
65
73
  type: Component,
66
74
  args: [{ selector: 'neu-progress-bar', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
67
75
  <div class="neu-progress" [class]="hostClasses()">
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-progress-bar.mjs","sources":["../../../../projects/ui-core/progress-bar/neu-progress-bar.component.ts","../../../../projects/ui-core/progress-bar/neural-ui-core-progress-bar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\n\nexport type NeuProgressVariant = 'primary' | 'success' | 'warning' | 'danger';\n\n/**\n * NeuralUI ProgressBar Component\n *\n * Barra de progreso accesible con valor, etiqueta y variantes semánticas.\n * Soporte para modo indeterminado (animación continua).\n *\n * Uso:\n * <neu-progress-bar [value]=\"75\" />\n * <neu-progress-bar [value]=\"75\" label=\"Cargando...\" variant=\"success\" [showValue]=\"true\" />\n * <neu-progress-bar [indeterminate]=\"true\" />\n */\n@Component({\n selector: 'neu-progress-bar',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-progress\" [class]=\"hostClasses()\">\n @if (label()) {\n <div class=\"neu-progress__header\">\n <span class=\"neu-progress__label\">{{ label() }}</span>\n @if (showValue() && !indeterminate()) {\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n }\n </div>\n } @else if (showValue() && !indeterminate()) {\n <div class=\"neu-progress__header\">\n <span></span>\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n </div>\n }\n <div\n class=\"neu-progress__track\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"indeterminate() ? null : clampedValue()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-label]=\"label() || 'Progreso'\"\n [attr.aria-valuetext]=\"indeterminate() ? 'Cargando...' : clampedValue() + '%'\"\n >\n <div\n class=\"neu-progress__fill\"\n [class.neu-progress__fill--indeterminate]=\"indeterminate()\"\n [style.width.%]=\"indeterminate() ? null : clampedValue()\"\n ></div>\n </div>\n </div>\n `,\n styleUrl: './neu-progress-bar.component.scss',\n})\nexport class NeuProgressBarComponent {\n /** Valor de 0 a 100 / Value from 0 to 100 */\n value = input<number>(0);\n\n /** Variante de color / Color variant */\n variant = input<NeuProgressVariant>('primary');\n\n /** Etiqueta descriptiva sobre la barra / Descriptive label above the bar */\n label = input<string>('');\n\n /** Muestra el % a la derecha / Shows the % on the right */\n showValue = input<boolean>(false);\n\n /** Modo indeterminado (animación continua) / Indeterminate mode (continuous animation) */\n indeterminate = input<boolean>(false);\n\n /** Altura de la barra / Bar height */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n readonly clampedValue = computed(() => Math.min(100, Math.max(0, this.value())));\n\n readonly hostClasses = computed(() =>\n [`neu-progress--${this.variant()}`, `neu-progress--${this.size()}`].join(' '),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-progress-bar.mjs","sources":["../../../../projects/ui-core/progress-bar/neu-progress-bar.component.ts","../../../../projects/ui-core/progress-bar/neural-ui-core-progress-bar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\n\nexport type NeuProgressVariant = 'primary' | 'success' | 'warning' | 'danger';\n\n/**\n * NeuralUI ProgressBar Component\n *\n * Barra de progreso accesible con valor, etiqueta y variantes semánticas.\n * Soporte para modo indeterminado (animación continua).\n *\n * Uso:\n * <neu-progress-bar [value]=\"75\" />\n * <neu-progress-bar [value]=\"75\" label=\"Cargando...\" variant=\"success\" [showValue]=\"true\" />\n * <neu-progress-bar [indeterminate]=\"true\" />\n */\n@Component({\n selector: 'neu-progress-bar',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-progress\" [class]=\"hostClasses()\">\n @if (label()) {\n <div class=\"neu-progress__header\">\n <span class=\"neu-progress__label\">{{ label() }}</span>\n @if (showValue() && !indeterminate()) {\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n }\n </div>\n } @else if (showValue() && !indeterminate()) {\n <div class=\"neu-progress__header\">\n <span></span>\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n </div>\n }\n <div\n class=\"neu-progress__track\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"indeterminate() ? null : clampedValue()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-label]=\"label() || 'Progreso'\"\n [attr.aria-valuetext]=\"indeterminate() ? 'Cargando...' : clampedValue() + '%'\"\n >\n <div\n class=\"neu-progress__fill\"\n [class.neu-progress__fill--indeterminate]=\"indeterminate()\"\n [style.width.%]=\"indeterminate() ? null : clampedValue()\"\n ></div>\n </div>\n </div>\n `,\n styleUrl: './neu-progress-bar.component.scss',\n})\nexport class NeuProgressBarComponent {\n /** Valor de 0 a 100 / Value from 0 to 100 */\n value = input<number>(0);\n\n /** Variante de color / Color variant */\n variant = input<NeuProgressVariant>('primary');\n\n /** Etiqueta descriptiva sobre la barra / Descriptive label above the bar */\n label = input<string>('');\n\n /** Muestra el % a la derecha / Shows the % on the right */\n showValue = input<boolean>(false);\n\n /** Modo indeterminado (animación continua) / Indeterminate mode (continuous animation) */\n indeterminate = input<boolean>(false);\n\n /** Altura de la barra / Bar height */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n readonly clampedValue = computed(() => Math.min(100, Math.max(0, this.value())));\n\n readonly hostClasses = computed(() =>\n [`neu-progress--${this.variant()}`, `neu-progress--${this.size()}`].join(' '),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -17,13 +17,17 @@ const NEU_RADIO_GROUP = new InjectionToken('NEU_RADIO_GROUP');
17
17
  */
18
18
  let _neuRadioGroupIdSeq = 0;
19
19
  class NeuRadioGroupComponent {
20
- direction = input('column', ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
20
+ direction = input('column', /* @ts-ignore */
21
+ ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
21
22
  /** Etiqueta accesible del grupo (WCAG 4.1.2). Usar cuando no hay <legend> visible. / Accessible label for the group (WCAG 4.1.2). Use when there is no visible <legend>. */
22
- ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
23
+ ariaLabel = input('', /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
23
25
  /** Nombre HTML compartido por todos los neu-radio hijos — garantiza la exclusión mutua nativa / HTML name shared by all child neu-radio — guarantees native mutual exclusion */
24
26
  _name = `neu-radio-group-${++_neuRadioGroupIdSeq}`;
25
- _value = signal(null, ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
26
- _isDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_isDisabled" }] : /* istanbul ignore next */ []));
27
+ _value = signal(null, /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
29
+ _isDisabled = signal(false, /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "_isDisabled" }] : /* istanbul ignore next */ []));
27
31
  _onChange = () => { };
28
32
  _onTouched = () => { };
29
33
  select(value) {
@@ -43,8 +47,8 @@ class NeuRadioGroupComponent {
43
47
  setDisabledState(isDisabled) {
44
48
  this._isDisabled.set(isDisabled);
45
49
  }
46
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRadioGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
47
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.8", type: NeuRadioGroupComponent, isStandalone: true, selector: "neu-radio-group", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "radiogroup" }, properties: { "attr.aria-disabled": "_isDisabled()", "attr.aria-label": "ariaLabel() || null" }, classAttribute: "neu-radio-group" }, providers: [
50
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuRadioGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
51
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: NeuRadioGroupComponent, isStandalone: true, selector: "neu-radio-group", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "radiogroup" }, properties: { "attr.aria-disabled": "_isDisabled()", "attr.aria-label": "ariaLabel() || null" }, classAttribute: "neu-radio-group" }, providers: [
48
52
  {
49
53
  provide: NG_VALUE_ACCESSOR,
50
54
  useExisting: forwardRef(() => NeuRadioGroupComponent),
@@ -56,7 +60,7 @@ class NeuRadioGroupComponent {
56
60
  },
57
61
  ], ngImport: i0, template: `<ng-content />`, isInline: true, styles: [".neu-radio-group{display:flex;flex-direction:column;gap:var(--neu-space-3)}.neu-radio-group[dir=row]{flex-direction:row;flex-wrap:wrap}.neu-radio-host{display:inline-block}.neu-radio{display:inline-flex;align-items:center;gap:var(--neu-space-3);cursor:pointer;-webkit-user-select:none;user-select:none}.neu-radio--disabled{opacity:.5;pointer-events:none}.neu-radio__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.neu-radio__input:focus-visible+.neu-radio__circle{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-radio__circle{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;background:var(--neu-surface);border:1.5px solid var(--neu-border-hover);border-radius:var(--neu-radius-full);transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-radio__circle--checked{border-color:var(--neu-primary);box-shadow:var(--neu-focus-ring)}.neu-radio__dot{width:8px;height:8px;border-radius:var(--neu-radius-full);background:var(--neu-primary);transform:scale(0);transition:transform var(--neu-transition-bounce)}.neu-radio--checked .neu-radio__dot{transform:scale(1)}.neu-radio__label{font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);color:var(--neu-text);font-weight:500;line-height:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
58
62
  }
59
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRadioGroupComponent, decorators: [{
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuRadioGroupComponent, decorators: [{
60
64
  type: Component,
61
65
  args: [{ selector: 'neu-radio-group', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
62
66
  class: 'neu-radio-group',
@@ -86,21 +90,26 @@ let _neuRadioIdSeq = 0;
86
90
  * <neu-radio value="opcion-a" label="Opción A" />
87
91
  */
88
92
  class NeuRadioComponent {
89
- value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
90
- label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
91
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
93
+ value = input.required(/* @ts-ignore */
94
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
95
+ label = input('', /* @ts-ignore */
96
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
97
+ disabled = input(false, /* @ts-ignore */
98
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
92
99
  group = inject(NEU_RADIO_GROUP);
93
100
  _id = `neu-radio-${_neuRadioIdSeq++}`;
94
101
  /** Toma el nombre del grupo padre — así todos los radios del grupo comparten el mismo `name` nativo / Takes the parent group name — so all radios in the group share the same native `name` */
95
102
  _groupName = this.group._name;
96
- isChecked = computed(() => this.group._value() === this.value(), ...(ngDevMode ? [{ debugName: "isChecked" }] : /* istanbul ignore next */ []));
97
- isDisabled = computed(() => this.disabled() || this.group._isDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
103
+ isChecked = computed(() => this.group._value() === this.value(), /* @ts-ignore */
104
+ ...(ngDevMode ? [{ debugName: "isChecked" }] : /* istanbul ignore next */ []));
105
+ isDisabled = computed(() => this.disabled() || this.group._isDisabled(), /* @ts-ignore */
106
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
98
107
  onSelect() {
99
108
  this.group.select(this.value());
100
109
  }
101
110
  onBlur() { }
102
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
103
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuRadioComponent, isStandalone: true, selector: "neu-radio", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "neu-radio-host" }, ngImport: i0, template: `
111
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
112
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuRadioComponent, isStandalone: true, selector: "neu-radio", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "neu-radio-host" }, ngImport: i0, template: `
104
113
  <label
105
114
  class="neu-radio"
106
115
  [class.neu-radio--checked]="isChecked()"
@@ -127,7 +136,7 @@ class NeuRadioComponent {
127
136
  </label>
128
137
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
129
138
  }
130
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRadioComponent, decorators: [{
139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuRadioComponent, decorators: [{
131
140
  type: Component,
132
141
  args: [{
133
142
  selector: 'neu-radio',
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-radio.mjs","sources":["../../../../projects/ui-core/radio/neu-radio-group.component.ts","../../../../projects/ui-core/radio/neu-radio.component.ts","../../../../projects/ui-core/radio/neural-ui-core-radio.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n InjectionToken,\n ViewEncapsulation,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Token para que neu-radio encuentre a su grupo padre / Token for neu-radio to find its parent group */\nexport const NEU_RADIO_GROUP = new InjectionToken<NeuRadioGroupComponent>('NEU_RADIO_GROUP');\n\n/**\n * NeuralUI Radio Group Component\n *\n * Contenedor para grupos de radio buttons. Implementa ControlValueAccessor.\n *\n * Uso:\n * <neu-radio-group [formControl]=\"ctrl\">\n * <neu-radio value=\"a\" label=\"Opción A\" />\n * <neu-radio value=\"b\" label=\"Opción B\" />\n * </neu-radio-group>\n */\nlet _neuRadioGroupIdSeq = 0;\n\n@Component({\n selector: 'neu-radio-group',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-radio-group',\n role: 'radiogroup',\n '[attr.aria-disabled]': '_isDisabled()',\n '[attr.aria-label]': 'ariaLabel() || null',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuRadioGroupComponent),\n multi: true,\n },\n {\n provide: NEU_RADIO_GROUP,\n useExisting: NeuRadioGroupComponent,\n },\n ],\n template: `<ng-content />`,\n styleUrl: './neu-radio.component.scss',\n})\nexport class NeuRadioGroupComponent implements ControlValueAccessor {\n readonly direction = input<'row' | 'column'>('column');\n /** Etiqueta accesible del grupo (WCAG 4.1.2). Usar cuando no hay <legend> visible. / Accessible label for the group (WCAG 4.1.2). Use when there is no visible <legend>. */\n readonly ariaLabel = input<string>('');\n\n /** Nombre HTML compartido por todos los neu-radio hijos — garantiza la exclusión mutua nativa / HTML name shared by all child neu-radio — guarantees native mutual exclusion */\n readonly _name = `neu-radio-group-${++_neuRadioGroupIdSeq}`;\n\n readonly _value = signal<unknown>(null);\n readonly _isDisabled = signal(false);\n\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n select(value: unknown): void {\n this._value.set(value);\n this._onChange(value);\n this._onTouched();\n }\n\n writeValue(val: unknown): void {\n this._value.set(val ?? null);\n }\n\n registerOnChange(fn: (v: unknown) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { NEU_RADIO_GROUP } from './neu-radio-group.component';\n\nlet _neuRadioIdSeq = 0;\n\n/**\n * NeuralUI Radio Component\n *\n * Opción individual dentro de un neu-radio-group.\n *\n * Uso:\n * <neu-radio value=\"opcion-a\" label=\"Opción A\" />\n */\n@Component({\n selector: 'neu-radio',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-radio-host' },\n template: `\n <label\n class=\"neu-radio\"\n [class.neu-radio--checked]=\"isChecked()\"\n [class.neu-radio--disabled]=\"isDisabled()\"\n [for]=\"_id\"\n >\n <input\n type=\"radio\"\n class=\"neu-radio__input\"\n [id]=\"_id\"\n [name]=\"_groupName\"\n [value]=\"value()\"\n [checked]=\"isChecked()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onSelect()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"neu-radio__circle\" [class.neu-radio__circle--checked]=\"isChecked()\">\n <span class=\"neu-radio__dot\"></span>\n </span>\n @if (label()) {\n <span class=\"neu-radio__label\">{{ label() }}</span>\n }\n </label>\n `,\n})\nexport class NeuRadioComponent {\n readonly value = input.required<unknown>();\n readonly label = input<string>('');\n readonly disabled = input<boolean>(false);\n\n readonly group = inject(NEU_RADIO_GROUP);\n\n readonly _id = `neu-radio-${_neuRadioIdSeq++}`;\n /** Toma el nombre del grupo padre — así todos los radios del grupo comparten el mismo `name` nativo / Takes the parent group name — so all radios in the group share the same native `name` */\n readonly _groupName = this.group._name;\n\n readonly isChecked = computed(() => this.group._value() === this.value());\n readonly isDisabled = computed(() => this.disabled() || this.group._isDisabled());\n\n onSelect(): void {\n this.group.select(this.value());\n }\n\n onBlur(): void {}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-radio.mjs","sources":["../../../../projects/ui-core/radio/neu-radio-group.component.ts","../../../../projects/ui-core/radio/neu-radio.component.ts","../../../../projects/ui-core/radio/neural-ui-core-radio.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n InjectionToken,\n ViewEncapsulation,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Token para que neu-radio encuentre a su grupo padre / Token for neu-radio to find its parent group */\nexport const NEU_RADIO_GROUP = new InjectionToken<NeuRadioGroupComponent>('NEU_RADIO_GROUP');\n\n/**\n * NeuralUI Radio Group Component\n *\n * Contenedor para grupos de radio buttons. Implementa ControlValueAccessor.\n *\n * Uso:\n * <neu-radio-group [formControl]=\"ctrl\">\n * <neu-radio value=\"a\" label=\"Opción A\" />\n * <neu-radio value=\"b\" label=\"Opción B\" />\n * </neu-radio-group>\n */\nlet _neuRadioGroupIdSeq = 0;\n\n@Component({\n selector: 'neu-radio-group',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-radio-group',\n role: 'radiogroup',\n '[attr.aria-disabled]': '_isDisabled()',\n '[attr.aria-label]': 'ariaLabel() || null',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuRadioGroupComponent),\n multi: true,\n },\n {\n provide: NEU_RADIO_GROUP,\n useExisting: NeuRadioGroupComponent,\n },\n ],\n template: `<ng-content />`,\n styleUrl: './neu-radio.component.scss',\n})\nexport class NeuRadioGroupComponent implements ControlValueAccessor {\n readonly direction = input<'row' | 'column'>('column');\n /** Etiqueta accesible del grupo (WCAG 4.1.2). Usar cuando no hay <legend> visible. / Accessible label for the group (WCAG 4.1.2). Use when there is no visible <legend>. */\n readonly ariaLabel = input<string>('');\n\n /** Nombre HTML compartido por todos los neu-radio hijos — garantiza la exclusión mutua nativa / HTML name shared by all child neu-radio — guarantees native mutual exclusion */\n readonly _name = `neu-radio-group-${++_neuRadioGroupIdSeq}`;\n\n readonly _value = signal<unknown>(null);\n readonly _isDisabled = signal(false);\n\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n select(value: unknown): void {\n this._value.set(value);\n this._onChange(value);\n this._onTouched();\n }\n\n writeValue(val: unknown): void {\n this._value.set(val ?? null);\n }\n\n registerOnChange(fn: (v: unknown) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { NEU_RADIO_GROUP } from './neu-radio-group.component';\n\nlet _neuRadioIdSeq = 0;\n\n/**\n * NeuralUI Radio Component\n *\n * Opción individual dentro de un neu-radio-group.\n *\n * Uso:\n * <neu-radio value=\"opcion-a\" label=\"Opción A\" />\n */\n@Component({\n selector: 'neu-radio',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-radio-host' },\n template: `\n <label\n class=\"neu-radio\"\n [class.neu-radio--checked]=\"isChecked()\"\n [class.neu-radio--disabled]=\"isDisabled()\"\n [for]=\"_id\"\n >\n <input\n type=\"radio\"\n class=\"neu-radio__input\"\n [id]=\"_id\"\n [name]=\"_groupName\"\n [value]=\"value()\"\n [checked]=\"isChecked()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onSelect()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"neu-radio__circle\" [class.neu-radio__circle--checked]=\"isChecked()\">\n <span class=\"neu-radio__dot\"></span>\n </span>\n @if (label()) {\n <span class=\"neu-radio__label\">{{ label() }}</span>\n }\n </label>\n `,\n})\nexport class NeuRadioComponent {\n readonly value = input.required<unknown>();\n readonly label = input<string>('');\n readonly disabled = input<boolean>(false);\n\n readonly group = inject(NEU_RADIO_GROUP);\n\n readonly _id = `neu-radio-${_neuRadioIdSeq++}`;\n /** Toma el nombre del grupo padre — así todos los radios del grupo comparten el mismo `name` nativo / Takes the parent group name — so all radios in the group share the same native `name` */\n readonly _groupName = this.group._name;\n\n readonly isChecked = computed(() => this.group._value() === this.value());\n readonly isDisabled = computed(() => this.disabled() || this.group._isDisabled());\n\n onSelect(): void {\n this.group.select(this.value());\n }\n\n onBlur(): void {}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}