@neural-ui/core 1.4.0 → 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 (77) hide show
  1. package/README.md +2 -1
  2. package/calendar/package.json +4 -0
  3. package/fesm2022/neural-ui-core-autocomplete.mjs +2 -2
  4. package/fesm2022/neural-ui-core-block-ui.mjs +2 -2
  5. package/fesm2022/neural-ui-core-button.mjs +2 -2
  6. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  7. package/fesm2022/neural-ui-core-calendar.mjs +551 -0
  8. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -0
  9. package/fesm2022/neural-ui-core-chip.mjs +2 -2
  10. package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
  11. package/fesm2022/neural-ui-core-confirm-dialog.mjs +2 -2
  12. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -1
  13. package/fesm2022/neural-ui-core-dashboard-grid.mjs +2 -2
  14. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
  15. package/fesm2022/neural-ui-core-date-input.mjs +2 -2
  16. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
  17. package/fesm2022/neural-ui-core-image-gallery.mjs +224 -0
  18. package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -0
  19. package/fesm2022/neural-ui-core-input.mjs +2 -2
  20. package/fesm2022/neural-ui-core-kanban.mjs +270 -0
  21. package/fesm2022/neural-ui-core-kanban.mjs.map +1 -0
  22. package/fesm2022/neural-ui-core-meter-group.mjs +2 -2
  23. package/fesm2022/neural-ui-core-multiselect.mjs +13 -2
  24. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  25. package/fesm2022/neural-ui-core-nav.mjs +2 -2
  26. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  27. package/fesm2022/neural-ui-core-number-input.mjs +2 -2
  28. package/fesm2022/neural-ui-core-pagination.mjs +2 -2
  29. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
  30. package/fesm2022/neural-ui-core-progress-bar.mjs +2 -2
  31. package/fesm2022/neural-ui-core-scheduler-gantt.mjs +289 -0
  32. package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -0
  33. package/fesm2022/neural-ui-core-select.mjs +31 -9
  34. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  35. package/fesm2022/neural-ui-core-slider.mjs +2 -2
  36. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  37. package/fesm2022/neural-ui-core-split-button.mjs +2 -2
  38. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  39. package/fesm2022/neural-ui-core-stepper.mjs +2 -2
  40. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-table.mjs +273 -19
  42. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  43. package/fesm2022/neural-ui-core-textarea.mjs +2 -2
  44. package/fesm2022/neural-ui-core-timeline-grid.mjs +215 -0
  45. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -0
  46. package/fesm2022/neural-ui-core-toggle-button-group.mjs +2 -2
  47. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  48. package/fesm2022/neural-ui-core-tree-table.mjs +262 -0
  49. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -0
  50. package/fesm2022/neural-ui-core-tree.mjs +413 -0
  51. package/fesm2022/neural-ui-core-tree.mjs.map +1 -0
  52. package/fesm2022/neural-ui-core-uploader.mjs +624 -0
  53. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -0
  54. package/fesm2022/neural-ui-core-virtual-list.mjs +2 -2
  55. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  56. package/fesm2022/neural-ui-core.mjs +3 -1
  57. package/fesm2022/neural-ui-core.mjs.map +1 -1
  58. package/image-gallery/package.json +4 -0
  59. package/kanban/package.json +4 -0
  60. package/package.json +34 -2
  61. package/scheduler-gantt/package.json +4 -0
  62. package/styles/_tokens.scss +13 -4
  63. package/timeline-grid/package.json +4 -0
  64. package/tree/package.json +4 -0
  65. package/tree-table/package.json +4 -0
  66. package/types/neural-ui-core-calendar.d.ts +79 -0
  67. package/types/neural-ui-core-image-gallery.d.ts +26 -0
  68. package/types/neural-ui-core-kanban.d.ts +52 -0
  69. package/types/neural-ui-core-multiselect.d.ts +1 -0
  70. package/types/neural-ui-core-scheduler-gantt.d.ts +68 -0
  71. package/types/neural-ui-core-select.d.ts +2 -0
  72. package/types/neural-ui-core-table.d.ts +44 -2
  73. package/types/neural-ui-core-timeline-grid.d.ts +55 -0
  74. package/types/neural-ui-core-tree-table.d.ts +72 -0
  75. package/types/neural-ui-core-tree.d.ts +52 -0
  76. package/types/neural-ui-core-uploader.d.ts +98 -0
  77. 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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"}
@@ -112,7 +112,7 @@ class NeuVirtualListComponent {
112
112
  @if (_isEmpty()) {
113
113
  <div class="neu-virtual-list__empty" role="status">{{ emptyLabel() }}</div>
114
114
  }
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-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: "component", type: NeuVirtualListRowComponent, selector: "neu-virtual-list-row", inputs: ["item", "index", "itemSize", "label", "template"] }], 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 });
116
116
  }
117
117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuVirtualListComponent, decorators: [{
118
118
  type: Component,
@@ -139,7 +139,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
139
139
  @if (_isEmpty()) {
140
140
  <div class="neu-virtual-list__empty" role="status">{{ emptyLabel() }}</div>
141
141
  }
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-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"] }]
143
143
  }], ctorParameters: () => [], propDecorators: { _viewport: [{
144
144
  type: ViewChild,
145
145
  args: [CdkVirtualScrollViewport]
@@ -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@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
+ {"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.4.0",
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
+ }
@@ -7,12 +7,15 @@
7
7
  // ------------------------------------------------
8
8
  // Brand — Neural-Blue (inspirado en Apple HIG)
9
9
  // ------------------------------------------------
10
- --neu-primary: #005fcc;
11
- --neu-primary-dark: #004799;
12
- --neu-primary-light: #2d7fff;
10
+ --neu-primary: #007aff;
11
+ --neu-primary-dark: #005fcc;
12
+ --neu-primary-light: #339dff;
13
13
  --neu-primary-50: #eff6ff;
14
14
  --neu-primary-100: #dbeafe;
15
15
  --neu-primary-fg: #ffffff;
16
+ --neu-primary-solid: #006ee6;
17
+ --neu-primary-solid-hover: #005fcc;
18
+ --neu-primary-solid-fg: #ffffff;
16
19
 
17
20
  --neu-secondary: #10b981;
18
21
  --neu-secondary-dark: #059669;
@@ -72,7 +75,7 @@
72
75
  --neu-error-bg: #fee2e2;
73
76
  --neu-error-text: #991b1b;
74
77
 
75
- --neu-info: #005fcc;
78
+ --neu-info: #007aff;
76
79
  --neu-info-bg: #eff6ff;
77
80
  --neu-info-text: #1d4ed8;
78
81
 
@@ -321,8 +324,13 @@
321
324
  // ============================================================
322
325
  [data-theme='dark'] {
323
326
  // ---- Brand (mismo azul / same blue, fondos adaptados / adapted backgrounds) ----
327
+ --neu-primary: #007aff;
328
+ --neu-primary-dark: #005fcc;
329
+ --neu-primary-light: #339dff;
324
330
  --neu-primary-50: rgba(0, 122, 255, 0.12);
325
331
  --neu-primary-100: rgba(0, 122, 255, 0.2);
332
+ --neu-primary-solid: #007aff;
333
+ --neu-primary-solid-hover: #005fcc;
326
334
 
327
335
  // ---- Fondos / Backgrounds ----
328
336
  --neu-bg: #0d1117; // GitHub-dark inspired — fondo base
@@ -351,6 +359,7 @@
351
359
  --neu-error-bg: rgba(239, 68, 68, 0.15);
352
360
  --neu-error-text: #fca5a5;
353
361
 
362
+ --neu-info: #007aff;
354
363
  --neu-info-bg: rgba(0, 122, 255, 0.15);
355
364
  --neu-info-text: #93c5fd;
356
365
 
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-timeline-grid.mjs",
3
+ "typings": "../types/neural-ui-core-timeline-grid.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-tree.mjs",
3
+ "typings": "../types/neural-ui-core-tree.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-tree-table.mjs",
3
+ "typings": "../types/neural-ui-core-tree-table.d.ts"
4
+ }
@@ -0,0 +1,79 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ type NeuCalendarView = 'month' | 'week';
4
+ type NeuCalendarEventVariant = 'default' | 'success' | 'warning' | 'danger' | 'info';
5
+ interface NeuCalendarEvent {
6
+ id: string;
7
+ title: string;
8
+ start: string | Date;
9
+ end?: string | Date;
10
+ description?: string;
11
+ meta?: string;
12
+ allDay?: boolean;
13
+ variant?: NeuCalendarEventVariant;
14
+ }
15
+ interface NeuCalendarLabels {
16
+ previousButtonAriaLabel: string;
17
+ nextButtonAriaLabel: string;
18
+ todayButton: string;
19
+ allDay: string;
20
+ noEvents: string;
21
+ eventCount: (count: number) => string;
22
+ moreEvents: (count: number) => string;
23
+ }
24
+ type NeuCalendarLabelOverrides = Partial<NeuCalendarLabels>;
25
+ interface NormalizedCalendarEvent extends Omit<NeuCalendarEvent, 'start' | 'end'> {
26
+ start: Date;
27
+ end?: Date;
28
+ }
29
+ interface CalendarDayCell {
30
+ date: Date;
31
+ inCurrentMonth: boolean;
32
+ isToday: boolean;
33
+ isSelected: boolean;
34
+ events: NormalizedCalendarEvent[];
35
+ }
36
+ declare class NeuCalendarComponent {
37
+ readonly events: _angular_core.InputSignal<NeuCalendarEvent[]>;
38
+ readonly view: _angular_core.InputSignal<NeuCalendarView>;
39
+ readonly selectedDate: _angular_core.InputSignal<string | Date>;
40
+ readonly locale: _angular_core.InputSignal<string>;
41
+ readonly maxVisibleEvents: _angular_core.InputSignal<number>;
42
+ readonly showHeader: _angular_core.InputSignal<boolean>;
43
+ readonly labels: _angular_core.InputSignal<Partial<NeuCalendarLabels>>;
44
+ readonly selectedDateChange: _angular_core.OutputEmitterRef<Date>;
45
+ readonly dateSelect: _angular_core.OutputEmitterRef<Date>;
46
+ readonly eventClick: _angular_core.OutputEmitterRef<NeuCalendarEvent>;
47
+ private readonly _selectedDate;
48
+ readonly resolvedLabels: _angular_core.Signal<NeuCalendarLabels>;
49
+ readonly normalizedEvents: _angular_core.Signal<NormalizedCalendarEvent[]>;
50
+ readonly weekdays: _angular_core.Signal<string[]>;
51
+ readonly monthDays: _angular_core.Signal<CalendarDayCell[]>;
52
+ readonly weekDays: _angular_core.Signal<CalendarDayCell[]>;
53
+ readonly selectedDay: _angular_core.Signal<CalendarDayCell>;
54
+ readonly selectedDayEvents: _angular_core.Signal<NormalizedCalendarEvent[]>;
55
+ readonly selectedAgendaLabel: _angular_core.Signal<string>;
56
+ readonly currentLabel: _angular_core.Signal<string>;
57
+ constructor();
58
+ prev(): void;
59
+ next(): void;
60
+ today(): void;
61
+ selectDate(date: Date): void;
62
+ visibleEvents(events: NormalizedCalendarEvent[]): NormalizedCalendarEvent[];
63
+ monthVisibleEvents(events: NormalizedCalendarEvent[]): NormalizedCalendarEvent[];
64
+ formatEventMeta(event: NormalizedCalendarEvent): string;
65
+ eventTooltip(event: NormalizedCalendarEvent): string;
66
+ formatWeekDate(date: Date): string;
67
+ formatDayAriaLabel(day: CalendarDayCell): string;
68
+ onDaySpace(event: Event, date: Date): void;
69
+ onDayKeydown(event: KeyboardEvent, date: Date): void;
70
+ onEventClick(event: MouseEvent, calendarEvent: NormalizedCalendarEvent): void;
71
+ private buildDayCell;
72
+ private monthVisibleEventLimit;
73
+ private coerceDate;
74
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuCalendarComponent, never>;
75
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuCalendarComponent, "neu-calendar", never, { "events": { "alias": "events"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "selectedDate": { "alias": "selectedDate"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "maxVisibleEvents": { "alias": "maxVisibleEvents"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "selectedDateChange": "selectedDateChange"; "dateSelect": "dateSelect"; "eventClick": "eventClick"; }, never, never, true, never>;
76
+ }
77
+
78
+ export { NeuCalendarComponent };
79
+ export type { NeuCalendarEvent, NeuCalendarEventVariant, NeuCalendarLabelOverrides, NeuCalendarLabels, NeuCalendarView };
@@ -0,0 +1,26 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { NeuImageViewerItem } from '@neural-ui/core/image-viewer';
3
+ export { NeuImageViewerItem } from '@neural-ui/core/image-viewer';
4
+
5
+ declare class NeuImageGalleryComponent {
6
+ readonly items: _angular_core.InputSignal<NeuImageViewerItem[]>;
7
+ readonly initialIndex: _angular_core.InputSignal<number>;
8
+ readonly showThumbnails: _angular_core.InputSignal<boolean>;
9
+ readonly thumbnailPosition: _angular_core.InputSignal<"bottom" | "left">;
10
+ readonly objectFit: _angular_core.InputSignal<"cover" | "contain">;
11
+ readonly showCounter: _angular_core.InputSignal<boolean>;
12
+ readonly viewerEnabled: _angular_core.InputSignal<boolean>;
13
+ readonly activeIndexChange: _angular_core.OutputEmitterRef<number>;
14
+ private readonly _activeIndex;
15
+ constructor();
16
+ readonly activeIndex: _angular_core.Signal<number>;
17
+ readonly currentItem: _angular_core.Signal<NeuImageViewerItem>;
18
+ setActiveIndex(index: number): void;
19
+ goPrev(): void;
20
+ goNext(): void;
21
+ private _clampIndex;
22
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuImageGalleryComponent, never>;
23
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuImageGalleryComponent, "neu-image-gallery", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "initialIndex": { "alias": "initialIndex"; "required": false; "isSignal": true; }; "showThumbnails": { "alias": "showThumbnails"; "required": false; "isSignal": true; }; "thumbnailPosition": { "alias": "thumbnailPosition"; "required": false; "isSignal": true; }; "objectFit": { "alias": "objectFit"; "required": false; "isSignal": true; }; "showCounter": { "alias": "showCounter"; "required": false; "isSignal": true; }; "viewerEnabled": { "alias": "viewerEnabled"; "required": false; "isSignal": true; }; }, { "activeIndexChange": "activeIndexChange"; }, never, never, true, never>;
24
+ }
25
+
26
+ export { NeuImageGalleryComponent };
@@ -0,0 +1,52 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { CdkDragDrop } from '@angular/cdk/drag-drop';
3
+
4
+ interface NeuKanbanAssignee {
5
+ name: string;
6
+ avatar?: string;
7
+ initials?: string;
8
+ }
9
+ interface NeuKanbanCard {
10
+ id: string;
11
+ title: string;
12
+ description?: string;
13
+ tags?: string[];
14
+ assignee?: NeuKanbanAssignee;
15
+ dueDate?: string;
16
+ meta?: string;
17
+ priority?: 'low' | 'medium' | 'high' | 'urgent';
18
+ }
19
+ interface NeuKanbanColumn {
20
+ id: string;
21
+ title: string;
22
+ cards: NeuKanbanCard[];
23
+ color?: string;
24
+ wipLimit?: number;
25
+ }
26
+ interface NeuKanbanCardDropEvent {
27
+ card: NeuKanbanCard;
28
+ fromColumnId: string;
29
+ toColumnId: string;
30
+ previousIndex: number;
31
+ currentIndex: number;
32
+ columns: NeuKanbanColumn[];
33
+ }
34
+ declare class NeuKanbanComponent {
35
+ readonly columns: _angular_core.InputSignal<NeuKanbanColumn[]>;
36
+ readonly columnWidth: _angular_core.InputSignal<string>;
37
+ readonly showCounts: _angular_core.InputSignal<boolean>;
38
+ readonly showWipLimit: _angular_core.InputSignal<boolean>;
39
+ readonly columnsChange: _angular_core.OutputEmitterRef<NeuKanbanColumn[]>;
40
+ readonly cardDrop: _angular_core.OutputEmitterRef<NeuKanbanCardDropEvent>;
41
+ readonly _columns: _angular_core.WritableSignal<NeuKanbanColumn[]>;
42
+ readonly connectedDropLists: _angular_core.Signal<string[]>;
43
+ constructor();
44
+ assigneeInitials(assignee: NeuKanbanAssignee): string;
45
+ onCardDrop(event: CdkDragDrop<NeuKanbanCard[]>, targetColumnId: string): void;
46
+ private _cloneColumns;
47
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuKanbanComponent, never>;
48
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuKanbanComponent, "neu-kanban", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "columnWidth": { "alias": "columnWidth"; "required": false; "isSignal": true; }; "showCounts": { "alias": "showCounts"; "required": false; "isSignal": true; }; "showWipLimit": { "alias": "showWipLimit"; "required": false; "isSignal": true; }; }, { "columnsChange": "columnsChange"; "cardDrop": "cardDrop"; }, never, never, true, never>;
49
+ }
50
+
51
+ export { NeuKanbanComponent };
52
+ export type { NeuKanbanAssignee, NeuKanbanCard, NeuKanbanCardDropEvent, NeuKanbanColumn };
@@ -142,6 +142,7 @@ declare class NeuMultiselectComponent implements ControlValueAccessor {
142
142
  private focusFirstOption;
143
143
  private focusOption;
144
144
  private resetPanelPosition;
145
+ private refreshVirtualViewport;
145
146
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuMultiselectComponent, never>;
146
147
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuMultiselectComponent, "neu-multiselect", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "noResultsMessage": { "alias": "noResultsMessage"; "required": false; "isSignal": true; }; "clearAllLabel": { "alias": "clearAllLabel"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualScrollVisibleItems": { "alias": "virtualScrollVisibleItems"; "required": false; "isSignal": true; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; "urlParam": { "alias": "urlParam"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, ["itemTpl"], never, true, never>;
147
148
  }