@neural-ui/core 1.3.2 → 1.5.0

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 (103) hide show
  1. package/README.md +14 -7
  2. package/calendar/package.json +4 -0
  3. package/fesm2022/neural-ui-core-accordion.mjs +8 -6
  4. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  5. package/fesm2022/neural-ui-core-autocomplete.mjs +121 -29
  6. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  7. package/fesm2022/neural-ui-core-badge.mjs +2 -2
  8. package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
  9. package/fesm2022/neural-ui-core-block-ui.mjs +2 -2
  10. package/fesm2022/neural-ui-core-button.mjs +2 -2
  11. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  12. package/fesm2022/neural-ui-core-calendar.mjs +551 -0
  13. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -0
  14. package/fesm2022/neural-ui-core-chip.mjs +2 -2
  15. package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
  16. package/fesm2022/neural-ui-core-color-picker.mjs +3 -9
  17. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
  18. package/fesm2022/neural-ui-core-confirm-dialog.mjs +2 -2
  19. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -1
  20. package/fesm2022/neural-ui-core-dashboard-grid.mjs +2 -2
  21. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
  22. package/fesm2022/neural-ui-core-date-input.mjs +2 -2
  23. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
  24. package/fesm2022/neural-ui-core-filter-bar.mjs +2 -2
  25. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
  26. package/fesm2022/neural-ui-core-image-gallery.mjs +224 -0
  27. package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -0
  28. package/fesm2022/neural-ui-core-input.mjs +2 -2
  29. package/fesm2022/neural-ui-core-kanban.mjs +270 -0
  30. package/fesm2022/neural-ui-core-kanban.mjs.map +1 -0
  31. package/fesm2022/neural-ui-core-meter-group.mjs +2 -2
  32. package/fesm2022/neural-ui-core-modal.mjs +81 -31
  33. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  34. package/fesm2022/neural-ui-core-multiselect.mjs +269 -99
  35. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  36. package/fesm2022/neural-ui-core-nav.mjs +4 -6
  37. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  38. package/fesm2022/neural-ui-core-number-input.mjs +2 -2
  39. package/fesm2022/neural-ui-core-pagination.mjs +2 -2
  40. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-progress-bar.mjs +2 -2
  42. package/fesm2022/neural-ui-core-scheduler-gantt.mjs +289 -0
  43. package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -0
  44. package/fesm2022/neural-ui-core-select.mjs +276 -101
  45. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  46. package/fesm2022/neural-ui-core-sidebar.mjs +3 -2
  47. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  48. package/fesm2022/neural-ui-core-slider.mjs +2 -2
  49. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  50. package/fesm2022/neural-ui-core-split-button.mjs +2 -2
  51. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  52. package/fesm2022/neural-ui-core-stepper.mjs +2 -2
  53. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  54. package/fesm2022/neural-ui-core-table.mjs +435 -34
  55. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  56. package/fesm2022/neural-ui-core-tabs.mjs +11 -4
  57. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  58. package/fesm2022/neural-ui-core-textarea.mjs +2 -2
  59. package/fesm2022/neural-ui-core-timeline-grid.mjs +215 -0
  60. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -0
  61. package/fesm2022/neural-ui-core-toggle-button-group.mjs +2 -2
  62. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  63. package/fesm2022/neural-ui-core-toolbar.mjs +2 -2
  64. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
  65. package/fesm2022/neural-ui-core-tree-table.mjs +262 -0
  66. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -0
  67. package/fesm2022/neural-ui-core-tree.mjs +413 -0
  68. package/fesm2022/neural-ui-core-tree.mjs.map +1 -0
  69. package/fesm2022/neural-ui-core-uploader.mjs +624 -0
  70. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -0
  71. package/fesm2022/neural-ui-core-url-state.mjs +90 -10
  72. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
  73. package/fesm2022/neural-ui-core-virtual-list.mjs +53 -23
  74. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  75. package/fesm2022/neural-ui-core.mjs +3 -1
  76. package/fesm2022/neural-ui-core.mjs.map +1 -1
  77. package/image-gallery/package.json +4 -0
  78. package/kanban/package.json +4 -0
  79. package/package.json +34 -2
  80. package/scheduler-gantt/package.json +4 -0
  81. package/styles/_tokens.scss +13 -4
  82. package/timeline-grid/package.json +4 -0
  83. package/tree/package.json +4 -0
  84. package/tree-table/package.json +4 -0
  85. package/types/neural-ui-core-autocomplete.d.ts +10 -1
  86. package/types/neural-ui-core-calendar.d.ts +79 -0
  87. package/types/neural-ui-core-color-picker.d.ts +0 -1
  88. package/types/neural-ui-core-image-gallery.d.ts +26 -0
  89. package/types/neural-ui-core-kanban.d.ts +52 -0
  90. package/types/neural-ui-core-modal.d.ts +22 -16
  91. package/types/neural-ui-core-multiselect.d.ts +13 -1
  92. package/types/neural-ui-core-scheduler-gantt.d.ts +68 -0
  93. package/types/neural-ui-core-select.d.ts +14 -1
  94. package/types/neural-ui-core-sidebar.d.ts +1 -0
  95. package/types/neural-ui-core-table.d.ts +66 -4
  96. package/types/neural-ui-core-tabs.d.ts +1 -0
  97. package/types/neural-ui-core-timeline-grid.d.ts +55 -0
  98. package/types/neural-ui-core-tree-table.d.ts +72 -0
  99. package/types/neural-ui-core-tree.d.ts +52 -0
  100. package/types/neural-ui-core-uploader.d.ts +98 -0
  101. package/types/neural-ui-core-url-state.d.ts +9 -0
  102. package/types/neural-ui-core-virtual-list.d.ts +17 -1
  103. package/uploader/package.json +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-uploader.mjs","sources":["../../../../projects/ui-core/uploader/neu-uploader.component.ts","../../../../projects/ui-core/uploader/neural-ui-core-uploader.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\nimport { NeuProgressBarComponent } from '@neural-ui/core/progress-bar';\nimport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nexport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nlet _neuUploaderIdSeq = 0;\n\n@Component({\n selector: 'neu-uploader',\n imports: [NeuButtonComponent, NeuProgressBarComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuUploaderComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-uploader-host',\n '[class.neu-uploader-host--sm]': 'size() === \"sm\"',\n '[class.neu-uploader-host--lg]': 'size() === \"lg\"',\n },\n template: `\n @if (label()) {\n <label class=\"neu-uploader__label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n\n <input\n #fileInput\n class=\"neu-uploader__native-input\"\n [id]=\"inputId()\"\n type=\"file\"\n [attr.accept]=\"accept() || null\"\n [attr.multiple]=\"multiple() ? '' : null\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n (change)=\"onNativeInputChange($event)\"\n />\n\n <div\n class=\"neu-uploader\"\n [class.neu-uploader--disabled]=\"isDisabledFinal()\"\n [class.neu-uploader--drag-over]=\"isDragOver()\"\n [class.neu-uploader--error]=\"hasError()\"\n [class.neu-uploader--has-files]=\"fileItems().length > 0\"\n [class.neu-uploader--picker-only]=\"!dropzone()\"\n >\n @if (dropzone()) {\n <div\n class=\"neu-uploader__dropzone\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"neu-uploader__empty-icon\" aria-hidden=\"true\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </div>\n\n <div class=\"neu-uploader__copy\">\n <p class=\"neu-uploader__headline\">{{ headlineText() }}</p>\n <p class=\"neu-uploader__description\">{{ descriptionText() }}</p>\n </div>\n\n <div class=\"neu-uploader__actions\">\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n (click)=\"openFilePicker(); $event.stopPropagation()\"\n >\n {{ chooseLabel() }}\n </button>\n @if (fileItems().length > 0) {\n <button\n neu-button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n (click)=\"clearFiles($event)\"\n >\n {{ clearLabel() }}\n </button>\n }\n </div>\n </div>\n } @else {\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n icon=\"lucideUpload\"\n class=\"neu-uploader__picker-trigger\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"pickerButtonAriaLabel()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n >\n @if (showPickerText() && chooseLabel()) {\n {{ chooseLabel() }}\n }\n </button>\n }\n\n @if (shouldShowProgress()) {\n <div class=\"neu-uploader__progress\">\n <neu-progress-bar\n [value]=\"progress() ?? 0\"\n [label]=\"progressLabel()\"\n [showValue]=\"true\"\n size=\"sm\"\n />\n </div>\n }\n\n @if (fileItems().length > 0) {\n <div class=\"neu-uploader__summary\">\n <span>{{ summaryText() }}</span>\n @if (maxFiles() !== null) {\n <span>{{ fileItems().length }}/{{ maxFiles() }}</span>\n }\n </div>\n\n <ul class=\"neu-uploader__list\" [attr.aria-label]=\"listAriaLabel()\">\n @for (item of fileItems(); track item.id) {\n <li class=\"neu-uploader__item\">\n <div class=\"neu-uploader__item-main\">\n <span class=\"neu-uploader__item-name\">{{ item.name }}</span>\n <span class=\"neu-uploader__item-meta\">{{ formatBytes(item.size) }}</span>\n </div>\n <button\n class=\"neu-uploader__remove\"\n type=\"button\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"removeAriaLabel() + ' ' + item.name\"\n (click)=\"removeFile(item.id, $event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n\n @if (hasError()) {\n <p class=\"neu-uploader__error\" [id]=\"inputId() + '-error'\" role=\"alert\">\n {{ displayErrorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-uploader__hint\" [id]=\"inputId() + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-uploader.component.scss',\n})\nexport class NeuUploaderComponent implements ControlValueAccessor {\n readonly fileInput = viewChild.required<ElementRef<HTMLInputElement>>('fileInput');\n\n label = input<string>('');\n hint = input<string>('');\n errorMessage = input<string>('');\n placeholder = input<string>('Drag files here or select them from your device.');\n pickerDescription = input<string>('Use the button below to choose files from your device.');\n dropzoneLabel = input<string>('Drop files here to add them');\n chooseLabel = input<string>('Choose files');\n clearLabel = input<string>('Clear');\n progressLabel = input<string>('Upload in progress');\n showPickerText = input<boolean>(false);\n showProgress = input<boolean>(true);\n listAriaLabel = input<string>('Selected files');\n removeAriaLabel = input<string>('Remove file');\n acceptedTypesLabel = input<string>('Allowed types');\n maxFileSizeTextLabel = input<string>('Max size');\n fileCountSingularLabel = input<string>('file');\n fileCountPluralLabel = input<string>('files');\n emptySelectionMessage = input<string>('No file was selected.');\n invalidTypeMessage = input<string>('File {{fileName}} does not match the allowed file types.');\n maxFileSizeMessage = input<string>('File {{fileName}} exceeds the allowed maximum size.');\n duplicateFileMessage = input<string>('File {{fileName}} has already been selected.');\n maxFilesMessage = input<string>('You can only select up to {{maxFiles}} files.');\n accept = input<string>('');\n multiple = input<boolean>(true);\n dropzone = input<boolean>(true);\n disabled = input<boolean>(false);\n size = input<NeuUploaderSize>('md');\n maxFiles = input<number | null>(null);\n maxFileSize = input<number | null>(null);\n progress = input<number | null>(null);\n\n readonly filesSelected = output<File[]>();\n readonly fileRemoved = output<File>();\n readonly filesRejected = output<NeuUploaderError[]>();\n readonly cleared = output<void>();\n\n readonly inputId = input<string>(`neu-uploader-${++_neuUploaderIdSeq}`);\n\n protected readonly isDragOver = signal(false);\n protected readonly internalErrors = signal<NeuUploaderError[]>([]);\n protected readonly fileItems = signal<NeuUploaderFileItem[]>([]);\n\n private readonly cvaDisabled = signal(false);\n private onChange: (value: File[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n readonly isDisabledFinal = computed(() => this.disabled() || this.cvaDisabled());\n readonly hasError = computed(() => !!this.displayErrorMessage());\n readonly shouldShowProgress = computed(() => this.showProgress() && this.progress() !== null);\n readonly pickerButtonAriaLabel = computed(() =>\n this.showPickerText() && this.chooseLabel() ? null : this.chooseLabel(),\n );\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this.inputId()}-error`;\n }\n return this.hint() ? `${this.inputId()}-hint` : null;\n });\n readonly headlineText = computed(() =>\n this.isDragOver() && this.dropzone() ? this.dropzoneLabel() : this.chooseLabel(),\n );\n readonly descriptionText = computed(() => {\n const parts: string[] = [this.dropzone() ? this.placeholder() : this.pickerDescription()];\n if (this.accept()) {\n parts.push(`${this.acceptedTypesLabel()}: ${this.accept()}`);\n }\n if (this.maxFileSize() !== null) {\n parts.push(`${this.maxFileSizeTextLabel()}: ${this.formatBytes(this.maxFileSize() ?? 0)}`);\n }\n return parts.join(' · ');\n });\n readonly summaryText = computed(() => {\n const totalSize = this.fileItems().reduce((acc, item) => acc + item.size, 0);\n const fileCount = this.fileItems().length;\n return `${fileCount} ${fileCount === 1 ? this.fileCountSingularLabel() : this.fileCountPluralLabel()} · ${this.formatBytes(totalSize)}`;\n });\n readonly displayErrorMessage = computed(() => {\n if (this.errorMessage()) {\n return this.errorMessage();\n }\n const [first] = this.internalErrors();\n return first?.message ?? '';\n });\n\n writeValue(value: File[] | File | null | undefined): void {\n if (!value) {\n this.fileItems.set([]);\n return;\n }\n\n const files = Array.isArray(value) ? value : [value];\n this.fileItems.set(files.map((file) => this.toItem(file)));\n }\n\n registerOnChange(fn: (value: File[]) => 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.cvaDisabled.set(isDisabled);\n }\n\n openFilePicker(): void {\n if (this.isDisabledFinal()) {\n return;\n }\n\n this.onTouched();\n this.fileInput().nativeElement.click();\n }\n\n onDropzoneKey(event: KeyboardEvent): void {\n event.preventDefault();\n this.openFilePicker();\n }\n\n onNativeInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.consumeFiles(input.files);\n input.value = '';\n }\n\n onDragOver(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n onDragLeave(event: DragEvent): void {\n if (!this.dropzone()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n }\n\n onDrop(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n this.consumeFiles(event.dataTransfer?.files ?? null);\n }\n\n removeFile(id: string, event?: Event): void {\n event?.stopPropagation();\n const current = this.fileItems();\n const match = current.find((item) => item.id === id);\n if (!match) {\n return;\n }\n\n const next = current.filter((item) => item.id !== id);\n this.fileItems.set(next);\n this.internalErrors.set([]);\n this.emitValue(next);\n this.fileRemoved.emit(match.file);\n this.onTouched();\n }\n\n clearFiles(event?: Event): void {\n event?.stopPropagation();\n this.fileItems.set([]);\n this.internalErrors.set([]);\n this.fileInput().nativeElement.value = '';\n this.emitValue([]);\n this.cleared.emit();\n this.onTouched();\n }\n\n formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B';\n }\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const base = 1024;\n const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n const size = bytes / Math.pow(base, exponent);\n return `${size.toFixed(size >= 10 || exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n }\n\n private consumeFiles(list: FileList | null): void {\n if (!list || list.length === 0) {\n this.reportErrors([\n {\n code: 'empty-selection',\n message: this.emptySelectionMessage(),\n },\n ]);\n return;\n }\n\n this.onTouched();\n const incoming = Array.from(list);\n const current = this.fileItems();\n const nextItems = this.multiple() ? [...current] : [];\n const errors: NeuUploaderError[] = [];\n const existingIds = new Set(nextItems.map((item) => item.id));\n\n for (const file of incoming) {\n if (!this.isAcceptedType(file)) {\n errors.push({\n code: 'accept',\n file,\n message: this.interpolate(this.invalidTypeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFileSize() !== null && file.size > (this.maxFileSize() ?? 0)) {\n errors.push({\n code: 'max-file-size',\n file,\n message: this.interpolate(this.maxFileSizeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n const item = this.toItem(file);\n if (existingIds.has(item.id)) {\n errors.push({\n code: 'duplicate',\n file,\n message: this.interpolate(this.duplicateFileMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFiles() !== null && nextItems.length >= (this.maxFiles() ?? 0)) {\n errors.push({\n code: 'max-files',\n file,\n message: this.interpolate(this.maxFilesMessage(), {\n maxFiles: String(this.maxFiles() ?? 0),\n }),\n });\n continue;\n }\n\n nextItems.push(item);\n existingIds.add(item.id);\n\n if (!this.multiple()) {\n break;\n }\n }\n\n this.fileItems.set(nextItems);\n this.internalErrors.set(errors);\n this.emitValue(nextItems);\n this.filesSelected.emit(nextItems.map((item) => item.file));\n\n if (errors.length > 0) {\n this.filesRejected.emit(errors);\n }\n }\n\n private emitValue(items: NeuUploaderFileItem[]): void {\n this.onChange(items.map((item) => item.file));\n }\n\n private toItem(file: File): NeuUploaderFileItem {\n return {\n id: this.fileSignature(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n progress: this.progress(),\n };\n }\n\n private fileSignature(file: File): string {\n return `${file.name}__${file.size}__${file.lastModified}`;\n }\n\n private reportErrors(errors: NeuUploaderError[]): void {\n this.internalErrors.set(errors);\n this.filesRejected.emit(errors);\n }\n\n private interpolate(template: string, values: Record<string, string>): string {\n return Object.entries(values).reduce(\n (result, [key, value]) => result.replaceAll(`{{${key}}}`, value),\n template,\n );\n }\n\n private isAcceptedType(file: File): boolean {\n const accept = this.accept().trim();\n if (!accept) {\n return true;\n }\n\n const acceptedTypes = accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean);\n\n const fileName = file.name.toLowerCase();\n const mimeType = file.type.toLowerCase();\n\n return acceptedTypes.some((rule) => {\n if (rule.startsWith('.')) {\n return fileName.endsWith(rule);\n }\n\n if (rule.endsWith('/*')) {\n const prefix = rule.slice(0, -1);\n return mimeType.startsWith(prefix);\n }\n\n return mimeType === rule;\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,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { computed, Injectable } from '@angular/core';
2
+ import { signal, computed, Injectable } from '@angular/core';
3
3
  import { toSignal } from '@angular/core/rxjs-interop';
4
4
  import * as i1 from '@angular/router';
5
5
  import { NavigationEnd } from '@angular/router';
@@ -20,6 +20,11 @@ import { filter, startWith, map } from 'rxjs/operators';
20
20
  class NeuUrlStateService {
21
21
  injector;
22
22
  router;
23
+ _pendingParams = {};
24
+ _pendingReplaceUrl = true;
25
+ _batchScheduled = false;
26
+ _pendingParamsState = signal({}, ...(ngDevMode ? [{ debugName: "_pendingParamsState" }] : /* istanbul ignore next */ []));
27
+ _routerParams;
23
28
  /**
24
29
  * Signal con el mapa completo de queryParams actual.
25
30
  * Se actualiza automáticamente en cada NavigationEnd.
@@ -28,10 +33,26 @@ class NeuUrlStateService {
28
33
  constructor(injector, router) {
29
34
  this.injector = injector;
30
35
  this.router = router;
31
- this.params = toSignal(this.router.events.pipe(filter((e) => e instanceof NavigationEnd), startWith(null), map(() => this.router.parseUrl(this.router.url).queryParams)), {
36
+ this._routerParams = toSignal(this.router.events.pipe(filter((e) => e instanceof NavigationEnd), startWith(null), map(() => this.router.parseUrl(this.router.url).queryParams)), {
32
37
  initialValue: this.router.parseUrl(this.router.url).queryParams,
33
38
  injector: this.injector,
34
39
  });
40
+ this.params = computed(() => {
41
+ const currentParams = this._routerParams();
42
+ const pendingParams = this._pendingParamsState();
43
+ if (Object.keys(pendingParams).length === 0) {
44
+ return currentParams;
45
+ }
46
+ const mergedParams = { ...currentParams };
47
+ for (const [key, value] of Object.entries(pendingParams)) {
48
+ if (value === null) {
49
+ delete mergedParams[key];
50
+ continue;
51
+ }
52
+ mergedParams[key] = value;
53
+ }
54
+ return mergedParams;
55
+ }, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
35
56
  }
36
57
  /**
37
58
  * Devuelve un Signal reactivo con el valor del parámetro indicado.
@@ -52,12 +73,65 @@ class NeuUrlStateService {
52
73
  * Pasar false para acciones que el usuario debe poder deshacer con Atrás.
53
74
  */
54
75
  setParam(key, value, replaceUrl = true) {
55
- void this.router.navigate([], {
56
- queryParams: { [key]: value },
57
- queryParamsHandling: 'merge',
58
- replaceUrl,
76
+ this._pendingParams[key] = value;
77
+ this._pendingParamsState.set({ ...this._pendingParams });
78
+ this._pendingReplaceUrl = this._pendingReplaceUrl && replaceUrl;
79
+ this._schedulePendingNavigation();
80
+ }
81
+ _schedulePendingNavigation() {
82
+ if (this._batchScheduled) {
83
+ return;
84
+ }
85
+ this._batchScheduled = true;
86
+ queueMicrotask(() => {
87
+ const pending = this._consumePendingNavigation();
88
+ if (!pending) {
89
+ return;
90
+ }
91
+ void this.router
92
+ .navigate([], {
93
+ queryParams: pending.params,
94
+ queryParamsHandling: 'merge',
95
+ replaceUrl: pending.replaceUrl,
96
+ })
97
+ .finally(() => this._finalizePendingNavigation(pending.params));
59
98
  });
60
99
  }
100
+ _consumePendingNavigation() {
101
+ const hasPendingParams = Object.keys(this._pendingParams).length > 0;
102
+ const replaceUrl = this._pendingReplaceUrl;
103
+ const params = { ...this._pendingParams };
104
+ this._pendingParams = {};
105
+ this._pendingParamsState.set({});
106
+ this._pendingReplaceUrl = true;
107
+ this._batchScheduled = false;
108
+ if (!hasPendingParams) {
109
+ return null;
110
+ }
111
+ return { params, replaceUrl };
112
+ }
113
+ _resetPendingNavigation() {
114
+ this._pendingParams = {};
115
+ this._pendingParamsState.set({});
116
+ this._pendingReplaceUrl = true;
117
+ this._batchScheduled = false;
118
+ }
119
+ _finalizePendingNavigation(flushedParams) {
120
+ const currentVisiblePending = { ...this._pendingParamsState() };
121
+ let changed = false;
122
+ for (const [key, value] of Object.entries(flushedParams)) {
123
+ if (Object.prototype.hasOwnProperty.call(this._pendingParams, key)) {
124
+ continue;
125
+ }
126
+ if (currentVisiblePending[key] === value) {
127
+ delete currentVisiblePending[key];
128
+ changed = true;
129
+ }
130
+ }
131
+ if (changed) {
132
+ this._pendingParamsState.set(currentVisiblePending);
133
+ }
134
+ }
61
135
  /**
62
136
  * Actualiza múltiples queryParams en una sola navegación.
63
137
  *
@@ -65,16 +139,22 @@ class NeuUrlStateService {
65
139
  * urlState.patchParams({ page: '1', q: 'Angular' });
66
140
  */
67
141
  patchParams(params, replaceUrl = true) {
68
- void this.router.navigate([], {
69
- queryParams: params,
142
+ const pending = this._consumePendingNavigation();
143
+ const mergedParams = pending ? { ...pending.params, ...params } : params;
144
+ this._pendingParamsState.set({ ...this._pendingParamsState(), ...mergedParams });
145
+ void this.router
146
+ .navigate([], {
147
+ queryParams: mergedParams,
70
148
  queryParamsHandling: 'merge',
71
- replaceUrl,
72
- });
149
+ replaceUrl: pending ? pending.replaceUrl && replaceUrl : replaceUrl,
150
+ })
151
+ .finally(() => this._finalizePendingNavigation(mergedParams));
73
152
  }
74
153
  /**
75
154
  * Elimina todos los queryParams de la URL de una vez.
76
155
  */
77
156
  clearParams(replaceUrl = true) {
157
+ this._resetPendingNavigation();
78
158
  void this.router.navigate([], {
79
159
  queryParams: {},
80
160
  replaceUrl,
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-url-state.mjs","sources":["../../../../projects/ui-core/url-state/neu-url-state.service.ts","../../../../projects/ui-core/url-state/neural-ui-core-url-state.ts"],"sourcesContent":["import { Injectable, Injector, Signal, computed } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs/operators';\n\n/**\n * NeuUrlStateService — El Sistema Nervioso de NeuralUI\n *\n * Sincroniza el estado de la UI con los QueryParams de la URL.\n * Completamente reactivo via Angular Signals.\n *\n * Uso:\n * const urlState = inject(NeuUrlStateService);\n * const page = urlState.getParam('page'); // Signal<string | null>\n * urlState.setParam('menu', 'open'); // Actualiza ?menu=open\n * urlState.patchParams({ page: '2', q: 'filter' }); // Actualiza múltiples\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuUrlStateService {\n /**\n * Signal con el mapa completo de queryParams actual.\n * Se actualiza automáticamente en cada NavigationEnd.\n */\n readonly params: Signal<Params>;\n\n constructor(\n private readonly injector: Injector,\n private readonly router: Router,\n ) {\n this.params = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n startWith(null as null),\n map(() => this.router.parseUrl(this.router.url).queryParams as Params),\n ),\n {\n initialValue: this.router.parseUrl(this.router.url).queryParams as Params,\n injector: this.injector,\n },\n );\n }\n\n /**\n * Devuelve un Signal reactivo con el valor del parámetro indicado.\n * Memorizar el resultado: no llamar en bucle pues crea un computed nuevo c/vez.\n *\n * @example\n * readonly menuOpen = computed(() => this.urlState.getParam('menu')() === 'open');\n */\n getParam(key: string): Signal<string | null> {\n return computed(() => (this.params()[key] as string | undefined) ?? null);\n }\n\n /**\n * Establece un único queryParam en la URL.\n *\n * @param key Nombre del parámetro\n * @param value Valor. Pasar `null` para eliminarlo de la URL.\n * @param replaceUrl Si true (default) usa replaceState — no ensucia el historial.\n * Pasar false para acciones que el usuario debe poder deshacer con Atrás.\n */\n setParam(key: string, value: string | null, replaceUrl = true): void {\n void this.router.navigate([], {\n queryParams: { [key]: value },\n queryParamsHandling: 'merge',\n replaceUrl,\n });\n }\n\n /**\n * Actualiza múltiples queryParams en una sola navegación.\n *\n * @example\n * urlState.patchParams({ page: '1', q: 'Angular' });\n */\n patchParams(params: Record<string, string | null>, replaceUrl = true): void {\n void this.router.navigate([], {\n queryParams: params,\n queryParamsHandling: 'merge',\n replaceUrl,\n });\n }\n\n /**\n * Elimina todos los queryParams de la URL de una vez.\n */\n clearParams(replaceUrl = true): void {\n void this.router.navigate([], {\n queryParams: {},\n replaceUrl,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;AAKA;;;;;;;;;;;AAWG;MAEU,kBAAkB,CAAA;AAQV,IAAA,QAAA;AACA,IAAA,MAAA;AARnB;;;AAGG;AACM,IAAA,MAAM;IAEf,WAAA,CACmB,QAAkB,EAClB,MAAc,EAAA;QADd,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,MAAM,GAAN,MAAM;QAEvB,IAAI,CAAC,MAAM,GAAG,QAAQ,CACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACrB,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,YAAY,aAAa,CAAC,EAC7D,SAAS,CAAC,IAAY,CAAC,EACvB,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAqB,CAAC,CACvE,EACD;AACE,YAAA,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAqB;YACzE,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CACF;IACH;AAEA;;;;;;AAMG;AACH,IAAA,QAAQ,CAAC,GAAW,EAAA;AAClB,QAAA,OAAO,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAwB,IAAI,IAAI,CAAC;IAC3E;AAEA;;;;;;;AAOG;AACH,IAAA,QAAQ,CAAC,GAAW,EAAE,KAAoB,EAAE,UAAU,GAAG,IAAI,EAAA;AAC3D,QAAA,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;AAC5B,YAAA,WAAW,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE;AAC7B,YAAA,mBAAmB,EAAE,OAAO;YAC5B,UAAU;AACX,SAAA,CAAC;IACJ;AAEA;;;;;AAKG;AACH,IAAA,WAAW,CAAC,MAAqC,EAAE,UAAU,GAAG,IAAI,EAAA;AAClE,QAAA,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;AAC5B,YAAA,WAAW,EAAE,MAAM;AACnB,YAAA,mBAAmB,EAAE,OAAO;YAC5B,UAAU;AACX,SAAA,CAAC;IACJ;AAEA;;AAEG;IACH,WAAW,CAAC,UAAU,GAAG,IAAI,EAAA;AAC3B,QAAA,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;AAC5B,YAAA,WAAW,EAAE,EAAE;YACf,UAAU;AACX,SAAA,CAAC;IACJ;uGAzEW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA;;2FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACjBlC;;AAEG;;;;"}
1
+ {"version":3,"file":"neural-ui-core-url-state.mjs","sources":["../../../../projects/ui-core/url-state/neu-url-state.service.ts","../../../../projects/ui-core/url-state/neural-ui-core-url-state.ts"],"sourcesContent":["import { Injectable, Injector, Signal, computed, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs/operators';\n\n/**\n * NeuUrlStateService — El Sistema Nervioso de NeuralUI\n *\n * Sincroniza el estado de la UI con los QueryParams de la URL.\n * Completamente reactivo via Angular Signals.\n *\n * Uso:\n * const urlState = inject(NeuUrlStateService);\n * const page = urlState.getParam('page'); // Signal<string | null>\n * urlState.setParam('menu', 'open'); // Actualiza ?menu=open\n * urlState.patchParams({ page: '2', q: 'filter' }); // Actualiza múltiples\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuUrlStateService {\n private _pendingParams: Record<string, string | null> = {};\n private _pendingReplaceUrl = true;\n private _batchScheduled = false;\n private readonly _pendingParamsState = signal<Record<string, string | null>>({});\n private readonly _routerParams: Signal<Params>;\n\n /**\n * Signal con el mapa completo de queryParams actual.\n * Se actualiza automáticamente en cada NavigationEnd.\n */\n readonly params: Signal<Params>;\n\n constructor(\n private readonly injector: Injector,\n private readonly router: Router,\n ) {\n this._routerParams = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n startWith(null as null),\n map(() => this.router.parseUrl(this.router.url).queryParams as Params),\n ),\n {\n initialValue: this.router.parseUrl(this.router.url).queryParams as Params,\n injector: this.injector,\n },\n );\n\n this.params = computed(() => {\n const currentParams = this._routerParams();\n const pendingParams = this._pendingParamsState();\n if (Object.keys(pendingParams).length === 0) {\n return currentParams;\n }\n\n const mergedParams: Params = { ...currentParams };\n for (const [key, value] of Object.entries(pendingParams)) {\n if (value === null) {\n delete mergedParams[key];\n continue;\n }\n mergedParams[key] = value;\n }\n\n return mergedParams;\n });\n }\n\n /**\n * Devuelve un Signal reactivo con el valor del parámetro indicado.\n * Memorizar el resultado: no llamar en bucle pues crea un computed nuevo c/vez.\n *\n * @example\n * readonly menuOpen = computed(() => this.urlState.getParam('menu')() === 'open');\n */\n getParam(key: string): Signal<string | null> {\n return computed(() => (this.params()[key] as string | undefined) ?? null);\n }\n\n /**\n * Establece un único queryParam en la URL.\n *\n * @param key Nombre del parámetro\n * @param value Valor. Pasar `null` para eliminarlo de la URL.\n * @param replaceUrl Si true (default) usa replaceState — no ensucia el historial.\n * Pasar false para acciones que el usuario debe poder deshacer con Atrás.\n */\n setParam(key: string, value: string | null, replaceUrl = true): void {\n this._pendingParams[key] = value;\n this._pendingParamsState.set({ ...this._pendingParams });\n this._pendingReplaceUrl = this._pendingReplaceUrl && replaceUrl;\n this._schedulePendingNavigation();\n }\n\n private _schedulePendingNavigation(): void {\n if (this._batchScheduled) {\n return;\n }\n\n this._batchScheduled = true;\n queueMicrotask(() => {\n const pending = this._consumePendingNavigation();\n if (!pending) {\n return;\n }\n\n void this.router\n .navigate([], {\n queryParams: pending.params,\n queryParamsHandling: 'merge',\n replaceUrl: pending.replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(pending.params));\n });\n }\n\n private _consumePendingNavigation(): {\n params: Record<string, string | null>;\n replaceUrl: boolean;\n } | null {\n const hasPendingParams = Object.keys(this._pendingParams).length > 0;\n const replaceUrl = this._pendingReplaceUrl;\n const params = { ...this._pendingParams };\n\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n\n if (!hasPendingParams) {\n return null;\n }\n\n return { params, replaceUrl };\n }\n\n private _resetPendingNavigation(): void {\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n }\n\n private _finalizePendingNavigation(flushedParams: Record<string, string | null>): void {\n const currentVisiblePending = { ...this._pendingParamsState() };\n let changed = false;\n\n for (const [key, value] of Object.entries(flushedParams)) {\n if (Object.prototype.hasOwnProperty.call(this._pendingParams, key)) {\n continue;\n }\n\n if (currentVisiblePending[key] === value) {\n delete currentVisiblePending[key];\n changed = true;\n }\n }\n\n if (changed) {\n this._pendingParamsState.set(currentVisiblePending);\n }\n }\n\n /**\n * Actualiza múltiples queryParams en una sola navegación.\n *\n * @example\n * urlState.patchParams({ page: '1', q: 'Angular' });\n */\n patchParams(params: Record<string, string | null>, replaceUrl = true): void {\n const pending = this._consumePendingNavigation();\n const mergedParams = pending ? { ...pending.params, ...params } : params;\n this._pendingParamsState.set({ ...this._pendingParamsState(), ...mergedParams });\n void this.router\n .navigate([], {\n queryParams: mergedParams,\n queryParamsHandling: 'merge',\n replaceUrl: pending ? pending.replaceUrl && replaceUrl : replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(mergedParams));\n }\n\n /**\n * Elimina todos los queryParams de la URL de una vez.\n */\n clearParams(replaceUrl = true): void {\n this._resetPendingNavigation();\n void this.router.navigate([], {\n queryParams: {},\n replaceUrl,\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,9 +1,45 @@
1
1
  import * as i0 from '@angular/core';
2
- import { afterNextRender, input, output, computed, TemplateRef, ContentChild, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
2
+ import { input, computed, ChangeDetectionStrategy, Component, afterNextRender, output, TemplateRef, ContentChild, ViewChild, ViewEncapsulation } from '@angular/core';
3
3
  import * as i1 from '@angular/cdk/scrolling';
4
4
  import { ScrollingModule, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
5
5
  import { NgTemplateOutlet } from '@angular/common';
6
6
 
7
+ class NeuVirtualListRowComponent {
8
+ item = input.required(...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
9
+ index = input.required(...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
10
+ itemSize = input.required(...(ngDevMode ? [{ debugName: "itemSize" }] : /* istanbul ignore next */ []));
11
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
12
+ template = input(null, ...(ngDevMode ? [{ debugName: "template" }] : /* istanbul ignore next */ []));
13
+ context = computed(() => ({ $implicit: this.item(), index: this.index() }), ...(ngDevMode ? [{ debugName: "context" }] : /* istanbul ignore next */ []));
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuVirtualListRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuVirtualListRowComponent, isStandalone: true, selector: "neu-virtual-list-row", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
16
+ @if (template(); as projectedTemplate) {
17
+ <ng-container [ngTemplateOutlet]="projectedTemplate" [ngTemplateOutletContext]="context()" />
18
+ } @else {
19
+ <div class="neu-virtual-list__item-default" [style.height.px]="itemSize()">
20
+ {{ label() }}
21
+ </div>
22
+ }
23
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuVirtualListRowComponent, decorators: [{
26
+ type: Component,
27
+ args: [{
28
+ selector: 'neu-virtual-list-row',
29
+ standalone: true,
30
+ imports: [NgTemplateOutlet],
31
+ changeDetection: ChangeDetectionStrategy.OnPush,
32
+ template: `
33
+ @if (template(); as projectedTemplate) {
34
+ <ng-container [ngTemplateOutlet]="projectedTemplate" [ngTemplateOutletContext]="context()" />
35
+ } @else {
36
+ <div class="neu-virtual-list__item-default" [style.height.px]="itemSize()">
37
+ {{ label() }}
38
+ </div>
39
+ }
40
+ `,
41
+ }]
42
+ }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: true }] }], itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], template: [{ type: i0.Input, args: [{ isSignal: true, alias: "template", required: false }] }] } });
7
43
  /**
8
44
  * NeuralUI VirtualList
9
45
  *
@@ -57,12 +93,6 @@ class NeuVirtualListComponent {
57
93
  }
58
94
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuVirtualListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
95
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuVirtualListComponent, isStandalone: true, selector: "neu-virtual-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, visibleRows: { classPropertyName: "visibleRows", publicName: "visibleRows", isSignal: true, isRequired: false, transformFunction: null }, emptyLabel: { classPropertyName: "emptyLabel", publicName: "emptyLabel", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { properties: { "style.height": "_containerHeight()" }, classAttribute: "neu-virtual-list" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "_viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], ngImport: i0, template: `
60
- <ng-template #defaultItem let-item>
61
- <div class="neu-virtual-list__item-default" [style.height.px]="itemSize()">
62
- {{ _defaultItemLabel(item) }}
63
- </div>
64
- </ng-template>
65
-
66
96
  <cdk-virtual-scroll-viewport
67
97
  class="neu-virtual-list__viewport"
68
98
  [itemSize]="itemSize()"
@@ -70,29 +100,26 @@ class NeuVirtualListComponent {
70
100
  tabindex="0"
71
101
  >
72
102
  <ng-container *cdkVirtualFor="let item of items(); let index = index; trackBy: _trackBy">
73
- <ng-container
74
- [ngTemplateOutlet]="_itemTemplateOrDefault(defaultItem)"
75
- [ngTemplateOutletContext]="_itemContext(item, index)"
103
+ <neu-virtual-list-row
104
+ [item]="item"
105
+ [index]="index"
106
+ [itemSize]="itemSize()"
107
+ [label]="_defaultItemLabel(item)"
108
+ [template]="itemTemplate"
76
109
  />
77
110
  </ng-container>
78
111
  </cdk-virtual-scroll-viewport>
79
112
  @if (_isEmpty()) {
80
113
  <div class="neu-virtual-list__empty" role="status">{{ emptyLabel() }}</div>
81
114
  }
82
- `, isInline: true, styles: [".neu-virtual-list{display:block;overflow:hidden}.neu-virtual-list__viewport{width:100%;overflow-y:auto}.neu-virtual-list__item-default{display:flex;align-items:center;padding:0 12px;border-bottom:1px solid var(--neu-border-color, #e5e7eb);font-size:.875rem;color:var(--neu-text-primary, #111)}.neu-virtual-list__empty{display:flex;align-items:center;justify-content:center;padding:32px;color:var(--neu-text-secondary, #6b7280);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
115
+ `, isInline: true, styles: [".neu-virtual-list{display:block;overflow:hidden}.neu-virtual-list__viewport{width:100%;overflow-y:auto}.neu-virtual-list__item-default{display:flex;align-items:center;padding:0 12px;border-bottom:1px solid var(--neu-border);font-size:.875rem;color:var(--neu-text)}.neu-virtual-list__empty{display:flex;align-items:center;justify-content:center;padding:32px;color:var(--neu-text-muted);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: NeuVirtualListRowComponent, selector: "neu-virtual-list-row", inputs: ["item", "index", "itemSize", "label", "template"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
83
116
  }
84
117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuVirtualListComponent, decorators: [{
85
118
  type: Component,
86
- args: [{ selector: 'neu-virtual-list', imports: [ScrollingModule, NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
119
+ args: [{ selector: 'neu-virtual-list', imports: [ScrollingModule, NeuVirtualListRowComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
87
120
  class: 'neu-virtual-list',
88
121
  '[style.height]': '_containerHeight()',
89
122
  }, template: `
90
- <ng-template #defaultItem let-item>
91
- <div class="neu-virtual-list__item-default" [style.height.px]="itemSize()">
92
- {{ _defaultItemLabel(item) }}
93
- </div>
94
- </ng-template>
95
-
96
123
  <cdk-virtual-scroll-viewport
97
124
  class="neu-virtual-list__viewport"
98
125
  [itemSize]="itemSize()"
@@ -100,16 +127,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
100
127
  tabindex="0"
101
128
  >
102
129
  <ng-container *cdkVirtualFor="let item of items(); let index = index; trackBy: _trackBy">
103
- <ng-container
104
- [ngTemplateOutlet]="_itemTemplateOrDefault(defaultItem)"
105
- [ngTemplateOutletContext]="_itemContext(item, index)"
130
+ <neu-virtual-list-row
131
+ [item]="item"
132
+ [index]="index"
133
+ [itemSize]="itemSize()"
134
+ [label]="_defaultItemLabel(item)"
135
+ [template]="itemTemplate"
106
136
  />
107
137
  </ng-container>
108
138
  </cdk-virtual-scroll-viewport>
109
139
  @if (_isEmpty()) {
110
140
  <div class="neu-virtual-list__empty" role="status">{{ emptyLabel() }}</div>
111
141
  }
112
- `, styles: [".neu-virtual-list{display:block;overflow:hidden}.neu-virtual-list__viewport{width:100%;overflow-y:auto}.neu-virtual-list__item-default{display:flex;align-items:center;padding:0 12px;border-bottom:1px solid var(--neu-border-color, #e5e7eb);font-size:.875rem;color:var(--neu-text-primary, #111)}.neu-virtual-list__empty{display:flex;align-items:center;justify-content:center;padding:32px;color:var(--neu-text-secondary, #6b7280);font-size:.875rem}\n"] }]
142
+ `, styles: [".neu-virtual-list{display:block;overflow:hidden}.neu-virtual-list__viewport{width:100%;overflow-y:auto}.neu-virtual-list__item-default{display:flex;align-items:center;padding:0 12px;border-bottom:1px solid var(--neu-border);font-size:.875rem;color:var(--neu-text)}.neu-virtual-list__empty{display:flex;align-items:center;justify-content:center;padding:32px;color:var(--neu-text-muted);font-size:.875rem}\n"] }]
113
143
  }], ctorParameters: () => [], propDecorators: { _viewport: [{
114
144
  type: ViewChild,
115
145
  args: [CdkVirtualScrollViewport]
@@ -122,5 +152,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
122
152
  * Generated bundle index. Do not edit.
123
153
  */
124
154
 
125
- export { NeuVirtualListComponent };
155
+ export { NeuVirtualListComponent, NeuVirtualListRowComponent };
126
156
  //# sourceMappingURL=neural-ui-core-virtual-list.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-virtual-list.mjs","sources":["../../../../projects/ui-core/virtual-list/neu-virtual-list.component.ts","../../../../projects/ui-core/virtual-list/neural-ui-core-virtual-list.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n afterNextRender,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/**\n * NeuralUI VirtualList\n *\n * Wrapper sobre CDK VirtualScrollViewport para listas de miles de ítems.\n * Proyecta contenido mediante `ng-template` con let-item.\n *\n * Uso:\n * <neu-virtual-list [items]=\"bigArray\" [itemSize]=\"40\">\n * <ng-template neuVirtualItem let-item>\n * <div class=\"my-row\">{{ item.name }}</div>\n * </ng-template>\n * </neu-virtual-list>\n */\n@Component({\n selector: 'neu-virtual-list',\n imports: [ScrollingModule, NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-virtual-list',\n '[style.height]': '_containerHeight()',\n },\n template: `\n <ng-template #defaultItem let-item>\n <div class=\"neu-virtual-list__item-default\" [style.height.px]=\"itemSize()\">\n {{ _defaultItemLabel(item) }}\n </div>\n </ng-template>\n\n <cdk-virtual-scroll-viewport\n class=\"neu-virtual-list__viewport\"\n [itemSize]=\"itemSize()\"\n [style.height]=\"_containerHeight()\"\n tabindex=\"0\"\n >\n <ng-container *cdkVirtualFor=\"let item of items(); let index = index; trackBy: _trackBy\">\n <ng-container\n [ngTemplateOutlet]=\"_itemTemplateOrDefault(defaultItem)\"\n [ngTemplateOutletContext]=\"_itemContext(item, index)\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n @if (_isEmpty()) {\n <div class=\"neu-virtual-list__empty\" role=\"status\">{{ emptyLabel() }}</div>\n }\n `,\n styleUrl: './neu-virtual-list.component.scss',\n})\nexport class NeuVirtualListComponent<T = unknown> implements AfterViewInit {\n /** Referencia al viewport CDK — para forzar remeasure tras render / CDK viewport ref — to force remeasure after render */\n @ViewChild(CdkVirtualScrollViewport) private readonly _viewport?: CdkVirtualScrollViewport;\n\n constructor() {\n // Fuerza checkViewportSize() tras el primer paint completo (necesario en modo zoneless)\n // Forces checkViewportSize() after the first full paint (needed in zoneless mode)\n afterNextRender(() => this._viewport?.checkViewportSize());\n }\n\n ngAfterViewInit(): void {\n // Segundo intento de medición sincrona por si afterNextRender no cubre todos los casos\n // Second synchronous measurement pass as a fallback\n this._viewport?.checkViewportSize();\n }\n /** Array de ítems / Item array */\n readonly items = input<T[]>([]);\n\n /** Altura de cada fila en px / Row height in px */\n readonly itemSize = input<number>(48);\n\n /** Número de filas visibles / Visible row count (sets container height) */\n readonly visibleRows = input<number>(10);\n\n /** Texto cuando la lista está vacía / Empty state text */\n readonly emptyLabel = input<string>('Sin resultados');\n\n /** Función de tracking / Tracking function */\n readonly trackBy = input<(index: number, item: T) => unknown>((i) => i);\n\n /** Emitido al hacer click en un ítem / Emitted on item click */\n readonly itemClick = output<{ item: T; index: number }>();\n\n @ContentChild(TemplateRef) itemTemplate: TemplateRef<{ $implicit: T; index: number }> | null =\n null;\n\n readonly _containerHeight = computed(() => `${this.itemSize() * this.visibleRows()}px`);\n readonly _isEmpty = computed(() => this.items().length === 0);\n\n _trackBy = (index: number, item: T) => this.trackBy()(index, item);\n\n protected _itemTemplateOrDefault(\n fallback: TemplateRef<{ $implicit: T; index: number }>,\n ): TemplateRef<{ $implicit: T; index: number }> {\n return this.itemTemplate ?? fallback;\n }\n\n protected _itemContext(item: T, index: number): { $implicit: T; index: number } {\n return { $implicit: item, index };\n }\n\n protected _defaultItemLabel(item: T): string {\n return String(item);\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-virtual-list.mjs","sources":["../../../../projects/ui-core/virtual-list/neu-virtual-list.component.ts","../../../../projects/ui-core/virtual-list/neural-ui-core-virtual-list.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n afterNextRender,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\n\n@Component({\n selector: 'neu-virtual-list-row',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (template(); as projectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"projectedTemplate\" [ngTemplateOutletContext]=\"context()\" />\n } @else {\n <div class=\"neu-virtual-list__item-default\" [style.height.px]=\"itemSize()\">\n {{ label() }}\n </div>\n }\n `,\n})\nexport class NeuVirtualListRowComponent {\n readonly item = input.required<unknown>();\n readonly index = input.required<number>();\n readonly itemSize = input.required<number>();\n readonly label = input.required<string>();\n readonly template = input<TemplateRef<{ $implicit: unknown; index: number }> | null>(null);\n\n readonly context = computed(() => ({ $implicit: this.item(), index: this.index() }));\n}\n\n/**\n * NeuralUI VirtualList\n *\n * Wrapper sobre CDK VirtualScrollViewport para listas de miles de ítems.\n * Proyecta contenido mediante `ng-template` con let-item.\n *\n * Uso:\n * <neu-virtual-list [items]=\"bigArray\" [itemSize]=\"40\">\n * <ng-template neuVirtualItem let-item>\n * <div class=\"my-row\">{{ item.name }}</div>\n * </ng-template>\n * </neu-virtual-list>\n */\n@Component({\n selector: 'neu-virtual-list',\n imports: [ScrollingModule, NeuVirtualListRowComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-virtual-list',\n '[style.height]': '_containerHeight()',\n },\n template: `\n <cdk-virtual-scroll-viewport\n class=\"neu-virtual-list__viewport\"\n [itemSize]=\"itemSize()\"\n [style.height]=\"_containerHeight()\"\n tabindex=\"0\"\n >\n <ng-container *cdkVirtualFor=\"let item of items(); let index = index; trackBy: _trackBy\">\n <neu-virtual-list-row\n [item]=\"item\"\n [index]=\"index\"\n [itemSize]=\"itemSize()\"\n [label]=\"_defaultItemLabel(item)\"\n [template]=\"itemTemplate\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n @if (_isEmpty()) {\n <div class=\"neu-virtual-list__empty\" role=\"status\">{{ emptyLabel() }}</div>\n }\n `,\n styleUrl: './neu-virtual-list.component.scss',\n})\nexport class NeuVirtualListComponent<T = unknown> implements AfterViewInit {\n /** Referencia al viewport CDK — para forzar remeasure tras render / CDK viewport ref — to force remeasure after render */\n @ViewChild(CdkVirtualScrollViewport) private readonly _viewport?: CdkVirtualScrollViewport;\n\n constructor() {\n // Fuerza checkViewportSize() tras el primer paint completo (necesario en modo zoneless)\n // Forces checkViewportSize() after the first full paint (needed in zoneless mode)\n afterNextRender(() => this._viewport?.checkViewportSize());\n }\n\n ngAfterViewInit(): void {\n // Segundo intento de medición sincrona por si afterNextRender no cubre todos los casos\n // Second synchronous measurement pass as a fallback\n this._viewport?.checkViewportSize();\n }\n /** Array de ítems / Item array */\n readonly items = input<T[]>([]);\n\n /** Altura de cada fila en px / Row height in px */\n readonly itemSize = input<number>(48);\n\n /** Número de filas visibles / Visible row count (sets container height) */\n readonly visibleRows = input<number>(10);\n\n /** Texto cuando la lista está vacía / Empty state text */\n readonly emptyLabel = input<string>('Sin resultados');\n\n /** Función de tracking / Tracking function */\n readonly trackBy = input<(index: number, item: T) => unknown>((i) => i);\n\n /** Emitido al hacer click en un ítem / Emitted on item click */\n readonly itemClick = output<{ item: T; index: number }>();\n\n @ContentChild(TemplateRef) itemTemplate: TemplateRef<{ $implicit: T; index: number }> | null =\n null;\n\n readonly _containerHeight = computed(() => `${this.itemSize() * this.visibleRows()}px`);\n readonly _isEmpty = computed(() => this.items().length === 0);\n\n _trackBy = (index: number, item: T) => this.trackBy()(index, item);\n\n protected _itemTemplateOrDefault(\n fallback: TemplateRef<{ $implicit: T; index: number }>,\n ): TemplateRef<{ $implicit: T; index: number }> {\n return this.itemTemplate ?? fallback;\n }\n\n protected _itemContext(item: T, index: number): { $implicit: T; index: number } {\n return { $implicit: item, index };\n }\n\n protected _defaultItemLabel(item: T): string {\n return String(item);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { makeEnvironmentProviders } from '@angular/core';
2
2
  import { provideIcons, provideNgIconsConfig } from '@ng-icons/core';
3
- import { lucideMinus, lucideTrendingDown, lucideTrendingUp, lucideInbox, lucideExternalLink, lucideChevronLeft, lucideChevronRight, lucideX, lucideInfo, lucideAlertTriangle, lucideXCircle, lucideCheckCircle, lucideAlertCircle } from '@ng-icons/lucide';
3
+ import { lucideUpload, lucideMinus, lucideTrendingDown, lucideTrendingUp, lucideInbox, lucideExternalLink, lucideChevronLeft, lucideChevronRight, lucideX, lucideInfo, lucideAlertTriangle, lucideXCircle, lucideCheckCircle, lucideAlertCircle } from '@ng-icons/lucide';
4
4
 
5
5
  /**
6
6
  * Registra los providers necesarios para NeuralUI.
@@ -44,6 +44,8 @@ function provideNeuralUI(config = {}) {
44
44
  lucideTrendingUp,
45
45
  lucideTrendingDown,
46
46
  lucideMinus,
47
+ // Uploader picker-only trigger
48
+ lucideUpload,
47
49
  }),
48
50
  provideNgIconsConfig({ size: iconSize, strokeWidth: iconStrokeWidth }),
49
51
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core.mjs","sources":["../../../../projects/ui-core/provide-neural-ui.ts","../../../../projects/ui-core/public-api.ts","../../../../projects/ui-core/neural-ui-core.ts"],"sourcesContent":["import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideIcons, provideNgIconsConfig } from '@ng-icons/core';\nimport {\n lucideAlertCircle,\n lucideAlertTriangle,\n lucideCheckCircle,\n lucideChevronLeft,\n lucideChevronRight,\n lucideExternalLink,\n lucideInbox,\n lucideInfo,\n lucideMinus,\n lucideTrendingDown,\n lucideTrendingUp,\n lucideX,\n lucideXCircle,\n} from '@ng-icons/lucide';\n\nexport interface NeuralUIConfig {\n /** Tamaño por defecto de los iconos. Por defecto: '1.25rem' / Default icon size. Default: '1.25rem' */\n iconSize?: string;\n /** Grosor de trazo de los iconos. Por defecto: '2' / Icon stroke width. Default: '2' */\n iconStrokeWidth?: string;\n}\n\n/**\n * Registra los providers necesarios para NeuralUI.\n *\n * Incluye los iconos internos de la librería y la configuración\n * por defecto de @ng-icons.\n *\n * @example\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideNeuralUI(),\n * ],\n * };\n *\n * @example\n * // Con opciones personalizadas\n * provideNeuralUI({ iconSize: '1rem', iconStrokeWidth: '1.5' })\n */\nexport function provideNeuralUI(config: NeuralUIConfig = {}): EnvironmentProviders {\n const { iconSize = '1.25rem', iconStrokeWidth = '2' } = config;\n\n return makeEnvironmentProviders([\n provideIcons({\n // Input validation\n lucideAlertCircle,\n // Toast severity icons\n lucideCheckCircle,\n lucideXCircle,\n lucideAlertTriangle,\n lucideInfo,\n // Close buttons (sidebar, modal, toast)\n lucideX,\n // Nav chevrons + collapse toggle\n lucideChevronRight,\n lucideChevronLeft,\n // Nav external link\n lucideExternalLink,\n // EmptyState default icon\n lucideInbox,\n // StatsCard trend icons\n lucideTrendingUp,\n lucideTrendingDown,\n lucideMinus,\n }),\n provideNgIconsConfig({ size: iconSize, strokeWidth: iconStrokeWidth }),\n ]);\n}\n","/*\n * Public API Surface of @neural-ui/core\n *\n * The root entry point only exports the setup function.\n * Import individual components from their specific entry points:\n * import { NeuButtonComponent } from '@neural-ui/core/button';\n * import { NeuTableComponent } from '@neural-ui/core/table';\n *\n * La raíz solo exporta la función de setup.\n * Importa los componentes individuales desde sus entry points específicos.\n */\n\n// ── Setup ─────────────────────────────────────────────────────────────────\nexport * from './provide-neural-ui';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAyBA;;;;;;;;;;;;;;;;;AAiBG;AACG,SAAU,eAAe,CAAC,MAAA,GAAyB,EAAE,EAAA;IACzD,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,eAAe,GAAG,GAAG,EAAE,GAAG,MAAM;AAE9D,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,YAAY,CAAC;;YAEX,iBAAiB;;YAEjB,iBAAiB;YACjB,aAAa;YACb,mBAAmB;YACnB,UAAU;;YAEV,OAAO;;YAEP,kBAAkB;YAClB,iBAAiB;;YAEjB,kBAAkB;;YAElB,WAAW;;YAEX,gBAAgB;YAChB,kBAAkB;YAClB,WAAW;SACZ,CAAC;QACF,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AACvE,KAAA,CAAC;AACJ;;ACvEA;;;;;;;;;;AAUG;AAEH;;ACZA;;AAEG;;;;"}
1
+ {"version":3,"file":"neural-ui-core.mjs","sources":["../../../../projects/ui-core/provide-neural-ui.ts","../../../../projects/ui-core/public-api.ts","../../../../projects/ui-core/neural-ui-core.ts"],"sourcesContent":["import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideIcons, provideNgIconsConfig } from '@ng-icons/core';\nimport {\n lucideAlertCircle,\n lucideAlertTriangle,\n lucideCheckCircle,\n lucideChevronLeft,\n lucideChevronRight,\n lucideExternalLink,\n lucideInbox,\n lucideInfo,\n lucideMinus,\n lucideTrendingDown,\n lucideTrendingUp,\n lucideUpload,\n lucideX,\n lucideXCircle,\n} from '@ng-icons/lucide';\n\nexport interface NeuralUIConfig {\n /** Tamaño por defecto de los iconos. Por defecto: '1.25rem' / Default icon size. Default: '1.25rem' */\n iconSize?: string;\n /** Grosor de trazo de los iconos. Por defecto: '2' / Icon stroke width. Default: '2' */\n iconStrokeWidth?: string;\n}\n\n/**\n * Registra los providers necesarios para NeuralUI.\n *\n * Incluye los iconos internos de la librería y la configuración\n * por defecto de @ng-icons.\n *\n * @example\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideNeuralUI(),\n * ],\n * };\n *\n * @example\n * // Con opciones personalizadas\n * provideNeuralUI({ iconSize: '1rem', iconStrokeWidth: '1.5' })\n */\nexport function provideNeuralUI(config: NeuralUIConfig = {}): EnvironmentProviders {\n const { iconSize = '1.25rem', iconStrokeWidth = '2' } = config;\n\n return makeEnvironmentProviders([\n provideIcons({\n // Input validation\n lucideAlertCircle,\n // Toast severity icons\n lucideCheckCircle,\n lucideXCircle,\n lucideAlertTriangle,\n lucideInfo,\n // Close buttons (sidebar, modal, toast)\n lucideX,\n // Nav chevrons + collapse toggle\n lucideChevronRight,\n lucideChevronLeft,\n // Nav external link\n lucideExternalLink,\n // EmptyState default icon\n lucideInbox,\n // StatsCard trend icons\n lucideTrendingUp,\n lucideTrendingDown,\n lucideMinus,\n // Uploader picker-only trigger\n lucideUpload,\n }),\n provideNgIconsConfig({ size: iconSize, strokeWidth: iconStrokeWidth }),\n ]);\n}\n","/*\n * Public API Surface of @neural-ui/core\n *\n * The root entry point only exports the setup function.\n * Import individual components from their specific entry points:\n * import { NeuButtonComponent } from '@neural-ui/core/button';\n * import { NeuTableComponent } from '@neural-ui/core/table';\n *\n * La raíz solo exporta la función de setup.\n * Importa los componentes individuales desde sus entry points específicos.\n */\n\n// ── Setup ─────────────────────────────────────────────────────────────────\nexport * from './provide-neural-ui';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AA0BA;;;;;;;;;;;;;;;;;AAiBG;AACG,SAAU,eAAe,CAAC,MAAA,GAAyB,EAAE,EAAA;IACzD,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,eAAe,GAAG,GAAG,EAAE,GAAG,MAAM;AAE9D,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,YAAY,CAAC;;YAEX,iBAAiB;;YAEjB,iBAAiB;YACjB,aAAa;YACb,mBAAmB;YACnB,UAAU;;YAEV,OAAO;;YAEP,kBAAkB;YAClB,iBAAiB;;YAEjB,kBAAkB;;YAElB,WAAW;;YAEX,gBAAgB;YAChB,kBAAkB;YAClB,WAAW;;YAEX,YAAY;SACb,CAAC;QACF,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AACvE,KAAA,CAAC;AACJ;;AC1EA;;;;;;;;;;AAUG;AAEH;;ACZA;;AAEG;;;;"}
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-image-gallery.mjs",
3
+ "typings": "../types/neural-ui-core-image-gallery.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-kanban.mjs",
3
+ "typings": "../types/neural-ui-core-kanban.d.ts"
4
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neural-ui/core",
3
- "version": "1.3.2",
3
+ "version": "1.5.0",
4
4
  "description": "Modern Angular UI component library built with signals, standalone components, and OnPush change detection.",
5
5
  "author": "PedroMorenoTrujillo",
6
6
  "keywords": [
@@ -90,6 +90,10 @@
90
90
  "types": "./types/neural-ui-core-button.d.ts",
91
91
  "default": "./fesm2022/neural-ui-core-button.mjs"
92
92
  },
93
+ "./calendar": {
94
+ "types": "./types/neural-ui-core-calendar.d.ts",
95
+ "default": "./fesm2022/neural-ui-core-calendar.mjs"
96
+ },
93
97
  "./card": {
94
98
  "types": "./types/neural-ui-core-card.d.ts",
95
99
  "default": "./fesm2022/neural-ui-core-card.mjs"
@@ -150,6 +154,10 @@
150
154
  "types": "./types/neural-ui-core-icon.d.ts",
151
155
  "default": "./fesm2022/neural-ui-core-icon.mjs"
152
156
  },
157
+ "./image-gallery": {
158
+ "types": "./types/neural-ui-core-image-gallery.d.ts",
159
+ "default": "./fesm2022/neural-ui-core-image-gallery.mjs"
160
+ },
153
161
  "./image-viewer": {
154
162
  "types": "./types/neural-ui-core-image-viewer.d.ts",
155
163
  "default": "./fesm2022/neural-ui-core-image-viewer.mjs"
@@ -162,6 +170,10 @@
162
170
  "types": "./types/neural-ui-core-input-otp.d.ts",
163
171
  "default": "./fesm2022/neural-ui-core-input-otp.mjs"
164
172
  },
173
+ "./kanban": {
174
+ "types": "./types/neural-ui-core-kanban.d.ts",
175
+ "default": "./fesm2022/neural-ui-core-kanban.mjs"
176
+ },
165
177
  "./knob": {
166
178
  "types": "./types/neural-ui-core-knob.d.ts",
167
179
  "default": "./fesm2022/neural-ui-core-knob.mjs"
@@ -210,6 +222,10 @@
210
222
  "types": "./types/neural-ui-core-rating.d.ts",
211
223
  "default": "./fesm2022/neural-ui-core-rating.mjs"
212
224
  },
225
+ "./scheduler-gantt": {
226
+ "types": "./types/neural-ui-core-scheduler-gantt.d.ts",
227
+ "default": "./fesm2022/neural-ui-core-scheduler-gantt.mjs"
228
+ },
213
229
  "./select": {
214
230
  "types": "./types/neural-ui-core-select.d.ts",
215
231
  "default": "./fesm2022/neural-ui-core-select.mjs"
@@ -266,6 +282,10 @@
266
282
  "types": "./types/neural-ui-core-timeline.d.ts",
267
283
  "default": "./fesm2022/neural-ui-core-timeline.mjs"
268
284
  },
285
+ "./timeline-grid": {
286
+ "types": "./types/neural-ui-core-timeline-grid.d.ts",
287
+ "default": "./fesm2022/neural-ui-core-timeline-grid.mjs"
288
+ },
269
289
  "./toast": {
270
290
  "types": "./types/neural-ui-core-toast.d.ts",
271
291
  "default": "./fesm2022/neural-ui-core-toast.mjs"
@@ -282,6 +302,18 @@
282
302
  "types": "./types/neural-ui-core-tooltip.d.ts",
283
303
  "default": "./fesm2022/neural-ui-core-tooltip.mjs"
284
304
  },
305
+ "./tree": {
306
+ "types": "./types/neural-ui-core-tree.d.ts",
307
+ "default": "./fesm2022/neural-ui-core-tree.mjs"
308
+ },
309
+ "./tree-table": {
310
+ "types": "./types/neural-ui-core-tree-table.d.ts",
311
+ "default": "./fesm2022/neural-ui-core-tree-table.mjs"
312
+ },
313
+ "./uploader": {
314
+ "types": "./types/neural-ui-core-uploader.d.ts",
315
+ "default": "./fesm2022/neural-ui-core-uploader.mjs"
316
+ },
285
317
  "./url-state": {
286
318
  "types": "./types/neural-ui-core-url-state.d.ts",
287
319
  "default": "./fesm2022/neural-ui-core-url-state.mjs"
@@ -296,4 +328,4 @@
296
328
  "module": "fesm2022/neural-ui-core.mjs",
297
329
  "typings": "types/neural-ui-core.d.ts",
298
330
  "type": "module"
299
- }
331
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-scheduler-gantt.mjs",
3
+ "typings": "../types/neural-ui-core-scheduler-gantt.d.ts"
4
+ }