@neural-ui/core 1.4.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) 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-sidebar.mjs +103 -7
  36. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  37. package/fesm2022/neural-ui-core-slider.mjs +2 -2
  38. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  39. package/fesm2022/neural-ui-core-split-button.mjs +2 -2
  40. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-stepper.mjs +2 -2
  42. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  43. package/fesm2022/neural-ui-core-table.mjs +273 -19
  44. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  45. package/fesm2022/neural-ui-core-textarea.mjs +2 -2
  46. package/fesm2022/neural-ui-core-timeline-grid.mjs +215 -0
  47. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -0
  48. package/fesm2022/neural-ui-core-toggle-button-group.mjs +2 -2
  49. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  50. package/fesm2022/neural-ui-core-tree-table.mjs +262 -0
  51. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -0
  52. package/fesm2022/neural-ui-core-tree.mjs +413 -0
  53. package/fesm2022/neural-ui-core-tree.mjs.map +1 -0
  54. package/fesm2022/neural-ui-core-uploader.mjs +624 -0
  55. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -0
  56. package/fesm2022/neural-ui-core-virtual-list.mjs +2 -2
  57. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  58. package/fesm2022/neural-ui-core.mjs +3 -1
  59. package/fesm2022/neural-ui-core.mjs.map +1 -1
  60. package/image-gallery/package.json +4 -0
  61. package/kanban/package.json +4 -0
  62. package/package.json +34 -2
  63. package/scheduler-gantt/package.json +4 -0
  64. package/styles/_tokens.scss +13 -4
  65. package/timeline-grid/package.json +4 -0
  66. package/tree/package.json +4 -0
  67. package/tree-table/package.json +4 -0
  68. package/types/neural-ui-core-calendar.d.ts +79 -0
  69. package/types/neural-ui-core-image-gallery.d.ts +26 -0
  70. package/types/neural-ui-core-kanban.d.ts +52 -0
  71. package/types/neural-ui-core-multiselect.d.ts +1 -0
  72. package/types/neural-ui-core-scheduler-gantt.d.ts +68 -0
  73. package/types/neural-ui-core-select.d.ts +2 -0
  74. package/types/neural-ui-core-sidebar.d.ts +18 -1
  75. package/types/neural-ui-core-table.d.ts +44 -2
  76. package/types/neural-ui-core-timeline-grid.d.ts +55 -0
  77. package/types/neural-ui-core-tree-table.d.ts +72 -0
  78. package/types/neural-ui-core-tree.d.ts +52 -0
  79. package/types/neural-ui-core-uploader.d.ts +98 -0
  80. package/uploader/package.json +4 -0
@@ -117,7 +117,7 @@ class NeuPaginationComponent {
117
117
  </svg>
118
118
  </button>
119
119
  </nav>
120
- `, isInline: true, styles: [".neu-pagination{display:inline-flex;align-items:center;gap:4px;font-family:var(--neu-font-sans)}.neu-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 6px;border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);background:var(--neu-surface);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);cursor:pointer;transition:background var(--neu-transition),border-color var(--neu-transition),color var(--neu-transition);outline:none}.neu-pagination__btn:hover:not(:disabled){background:var(--neu-surface-2);border-color:var(--neu-border-hover);color:var(--neu-text)}.neu-pagination__btn:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-pagination__btn--active{background:var(--neu-primary);border-color:var(--neu-primary);color:var(--neu-primary-fg);font-weight:600}.neu-pagination__btn--active:hover{background:var(--neu-primary-dark);border-color:var(--neu-primary-dark)}.neu-pagination__btn--nav{color:var(--neu-text-muted)}.neu-pagination__btn:disabled{opacity:.35;cursor:not-allowed}.neu-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);-webkit-user-select:none;user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
120
+ `, isInline: true, styles: [".neu-pagination{display:inline-flex;align-items:center;gap:4px;font-family:var(--neu-font-sans)}.neu-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 6px;border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);background:var(--neu-surface);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);cursor:pointer;transition:background var(--neu-transition),border-color var(--neu-transition),color var(--neu-transition);outline:none}.neu-pagination__btn:hover:not(:disabled){background:var(--neu-surface-2);border-color:var(--neu-border-hover);color:var(--neu-text)}.neu-pagination__btn:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-pagination__btn--active{background:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));border-color:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));color:var(--neu-primary-solid-fg, var(--neu-primary-fg));font-weight:600}.neu-pagination__btn--active:hover{background:var(--neu-primary-solid-hover, var(--neu-primary-dark));border-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-pagination__btn--nav{color:var(--neu-text-muted)}.neu-pagination__btn:disabled{opacity:.35;cursor:not-allowed}.neu-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);-webkit-user-select:none;user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
121
121
  }
122
122
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPaginationComponent, decorators: [{
123
123
  type: Component,
@@ -187,7 +187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
187
187
  </svg>
188
188
  </button>
189
189
  </nav>
190
- `, styles: [".neu-pagination{display:inline-flex;align-items:center;gap:4px;font-family:var(--neu-font-sans)}.neu-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 6px;border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);background:var(--neu-surface);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);cursor:pointer;transition:background var(--neu-transition),border-color var(--neu-transition),color var(--neu-transition);outline:none}.neu-pagination__btn:hover:not(:disabled){background:var(--neu-surface-2);border-color:var(--neu-border-hover);color:var(--neu-text)}.neu-pagination__btn:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-pagination__btn--active{background:var(--neu-primary);border-color:var(--neu-primary);color:var(--neu-primary-fg);font-weight:600}.neu-pagination__btn--active:hover{background:var(--neu-primary-dark);border-color:var(--neu-primary-dark)}.neu-pagination__btn--nav{color:var(--neu-text-muted)}.neu-pagination__btn:disabled{opacity:.35;cursor:not-allowed}.neu-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);-webkit-user-select:none;user-select:none}\n"] }]
190
+ `, styles: [".neu-pagination{display:inline-flex;align-items:center;gap:4px;font-family:var(--neu-font-sans)}.neu-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 6px;border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);background:var(--neu-surface);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);cursor:pointer;transition:background var(--neu-transition),border-color var(--neu-transition),color var(--neu-transition);outline:none}.neu-pagination__btn:hover:not(:disabled){background:var(--neu-surface-2);border-color:var(--neu-border-hover);color:var(--neu-text)}.neu-pagination__btn:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-pagination__btn--active{background:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));border-color:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));color:var(--neu-primary-solid-fg, var(--neu-primary-fg));font-weight:600}.neu-pagination__btn--active:hover{background:var(--neu-primary-solid-hover, var(--neu-primary-dark));border-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-pagination__btn--nav{color:var(--neu-text-muted)}.neu-pagination__btn:disabled{opacity:.35;cursor:not-allowed}.neu-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);-webkit-user-select:none;user-select:none}\n"] }]
191
191
  }], propDecorators: { page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }], total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], maxVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisible", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }] } });
192
192
 
193
193
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-pagination.mjs","sources":["../../../../projects/ui-core/pagination/neu-pagination.component.ts","../../../../projects/ui-core/pagination/neural-ui-core-pagination.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n} from '@angular/core';\n\n/**\n * NeuralUI Pagination Component\n *\n * Paginación accesible con navegación por páginas, primera/última y ellipsis.\n *\n * Uso:\n * <neu-pagination [total]=\"200\" [pageSize]=\"10\" [page]=\"currentPage\"\n * (pageChange)=\"currentPage = $event\" />\n */\n@Component({\n selector: 'neu-pagination',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nav class=\"neu-pagination\" aria-label=\"Paginación\">\n <!-- Anterior -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() <= 1\"\n [attr.aria-label]=\"'Página anterior'\"\n (click)=\"go(page() - 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n\n <!-- Páginas -->\n @for (p of pages(); track p) {\n @if (p === -1) {\n <span class=\"neu-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n } @else {\n <button\n class=\"neu-pagination__btn\"\n [class.neu-pagination__btn--active]=\"p === page()\"\n type=\"button\"\n [attr.aria-label]=\"'Página ' + p\"\n [attr.aria-current]=\"p === page() ? 'page' : null\"\n (click)=\"go(p)\"\n >\n {{ p }}\n </button>\n }\n }\n\n <!-- Siguiente -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() >= totalPages()\"\n [attr.aria-label]=\"'Página siguiente'\"\n (click)=\"go(page() + 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n </nav>\n `,\n styleUrl: './neu-pagination.component.scss',\n})\nexport class NeuPaginationComponent {\n /** Página actual (1-indexed) / Current page (1-indexed) */\n page = input<number>(1);\n\n /** Total de ítems / Total items */\n total = input<number>(0);\n\n /** Ítems por página / Items per page */\n pageSize = input<number>(10);\n\n /** Número máximo de botones de página visibles (sin contar anterior/siguiente) / Maximum number of visible page buttons (not counting prev/next) */\n maxVisible = input<number>(7);\n\n /** Emite la nueva página al hacer click / Emits the new page on click */\n pageChange = output<number>();\n\n readonly totalPages = computed(() => Math.max(1, Math.ceil(this.total() / this.pageSize())));\n\n readonly pages = computed((): (number | -1)[] => {\n const total = this.totalPages();\n const current = this.page();\n const max = this.maxVisible();\n\n if (total <= max) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const half = Math.floor(max / 2);\n let start = Math.max(2, current - half + 1);\n let end = Math.min(total - 1, start + max - 3);\n if (end - start < max - 3) start = Math.max(2, end - (max - 4));\n\n const result: (number | -1)[] = [1];\n if (start > 2) result.push(-1);\n for (let i = start; i <= end; i++) result.push(i);\n if (end < total - 1) result.push(-1);\n result.push(total);\n return result;\n });\n\n go(page: number): void {\n const clamped = Math.min(this.totalPages(), Math.max(1, page));\n if (clamped !== this.page()) {\n this.pageChange.emit(clamped);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-pagination.mjs","sources":["../../../../projects/ui-core/pagination/neu-pagination.component.ts","../../../../projects/ui-core/pagination/neural-ui-core-pagination.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n} from '@angular/core';\n\n/**\n * NeuralUI Pagination Component\n *\n * Paginación accesible con navegación por páginas, primera/última y ellipsis.\n *\n * Uso:\n * <neu-pagination [total]=\"200\" [pageSize]=\"10\" [page]=\"currentPage\"\n * (pageChange)=\"currentPage = $event\" />\n */\n@Component({\n selector: 'neu-pagination',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nav class=\"neu-pagination\" aria-label=\"Paginación\">\n <!-- Anterior -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() <= 1\"\n [attr.aria-label]=\"'Página anterior'\"\n (click)=\"go(page() - 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n\n <!-- Páginas -->\n @for (p of pages(); track p) {\n @if (p === -1) {\n <span class=\"neu-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n } @else {\n <button\n class=\"neu-pagination__btn\"\n [class.neu-pagination__btn--active]=\"p === page()\"\n type=\"button\"\n [attr.aria-label]=\"'Página ' + p\"\n [attr.aria-current]=\"p === page() ? 'page' : null\"\n (click)=\"go(p)\"\n >\n {{ p }}\n </button>\n }\n }\n\n <!-- Siguiente -->\n <button\n class=\"neu-pagination__btn neu-pagination__btn--nav\"\n type=\"button\"\n [disabled]=\"page() >= totalPages()\"\n [attr.aria-label]=\"'Página siguiente'\"\n (click)=\"go(page() + 1)\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n </nav>\n `,\n styleUrl: './neu-pagination.component.scss',\n})\nexport class NeuPaginationComponent {\n /** Página actual (1-indexed) / Current page (1-indexed) */\n page = input<number>(1);\n\n /** Total de ítems / Total items */\n total = input<number>(0);\n\n /** Ítems por página / Items per page */\n pageSize = input<number>(10);\n\n /** Número máximo de botones de página visibles (sin contar anterior/siguiente) / Maximum number of visible page buttons (not counting prev/next) */\n maxVisible = input<number>(7);\n\n /** Emite la nueva página al hacer click / Emits the new page on click */\n pageChange = output<number>();\n\n readonly totalPages = computed(() => Math.max(1, Math.ceil(this.total() / this.pageSize())));\n\n readonly pages = computed((): (number | -1)[] => {\n const total = this.totalPages();\n const current = this.page();\n const max = this.maxVisible();\n\n if (total <= max) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const half = Math.floor(max / 2);\n let start = Math.max(2, current - half + 1);\n let end = Math.min(total - 1, start + max - 3);\n if (end - start < max - 3) start = Math.max(2, end - (max - 4));\n\n const result: (number | -1)[] = [1];\n if (start > 2) result.push(-1);\n for (let i = start; i <= end; i++) result.push(i);\n if (end < total - 1) result.push(-1);\n result.push(total);\n return result;\n });\n\n go(page: number): void {\n const clamped = Math.min(this.totalPages(), Math.max(1, page));\n if (clamped !== this.page()) {\n this.pageChange.emit(clamped);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -59,7 +59,7 @@ class NeuProgressBarComponent {
59
59
  ></div>
60
60
  </div>
61
61
  </div>
62
- `, isInline: true, styles: ["@keyframes neu-progress-indeterminate{0%{transform:translate(-100%) scaleX(.5)}50%{transform:translate(0) scaleX(.7)}to{transform:translate(200%) scaleX(.5)}}.neu-progress{display:flex;flex-direction:column;gap:6px;width:100%;font-family:var(--neu-font-sans)}.neu-progress__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.neu-progress__label{font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted)}.neu-progress__value{font-size:var(--neu-text-xs);font-weight:600;color:var(--neu-text-muted);min-width:32px;text-align:right}.neu-progress__track{width:100%;background:var(--neu-surface-3);border-radius:var(--neu-radius-full);overflow:hidden}.neu-progress--sm .neu-progress__track{height:4px}.neu-progress--md .neu-progress__track{height:8px}.neu-progress--lg .neu-progress__track{height:12px}.neu-progress__fill{height:100%;border-radius:var(--neu-radius-full);transition:width .4s cubic-bezier(.4,0,.2,1);transform-origin:left center}.neu-progress__fill--indeterminate{width:50%!important;animation:neu-progress-indeterminate 1.4s ease-in-out infinite}.neu-progress--primary .neu-progress__fill{background:var(--neu-primary)}.neu-progress--success .neu-progress__fill{background:var(--neu-success)}.neu-progress--warning .neu-progress__fill{background:var(--neu-warning)}.neu-progress--danger .neu-progress__fill{background:var(--neu-error)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
62
+ `, isInline: true, styles: ["@keyframes neu-progress-indeterminate{0%{transform:translate(-100%) scaleX(.5)}50%{transform:translate(0) scaleX(.7)}to{transform:translate(200%) scaleX(.5)}}.neu-progress{display:flex;flex-direction:column;gap:6px;width:100%;font-family:var(--neu-font-sans)}.neu-progress--sm .neu-progress__track{height:4px}.neu-progress--md .neu-progress__track{height:8px}.neu-progress--lg .neu-progress__track{height:12px}.neu-progress--primary .neu-progress__fill{background:var(--neu-primary)}.neu-progress--success .neu-progress__fill{background:var(--neu-success)}.neu-progress--warning .neu-progress__fill{background:var(--neu-warning)}.neu-progress--danger .neu-progress__fill{background:var(--neu-error)}.neu-progress__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.neu-progress__label{font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted)}.neu-progress__value{font-size:var(--neu-text-xs);font-weight:600;color:var(--neu-text-muted);min-width:32px;text-align:right}.neu-progress__track{width:100%;background:var(--neu-surface-3);border-radius:var(--neu-radius-full);overflow:hidden}.neu-progress__fill{height:100%;border-radius:var(--neu-radius-full);transition:width .4s cubic-bezier(.4,0,.2,1);transform-origin:left center}.neu-progress__fill--indeterminate{width:50%!important;animation:neu-progress-indeterminate 1.4s ease-in-out infinite}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
63
63
  }
64
64
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuProgressBarComponent, decorators: [{
65
65
  type: Component,
@@ -94,7 +94,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
94
94
  ></div>
95
95
  </div>
96
96
  </div>
97
- `, styles: ["@keyframes neu-progress-indeterminate{0%{transform:translate(-100%) scaleX(.5)}50%{transform:translate(0) scaleX(.7)}to{transform:translate(200%) scaleX(.5)}}.neu-progress{display:flex;flex-direction:column;gap:6px;width:100%;font-family:var(--neu-font-sans)}.neu-progress__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.neu-progress__label{font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted)}.neu-progress__value{font-size:var(--neu-text-xs);font-weight:600;color:var(--neu-text-muted);min-width:32px;text-align:right}.neu-progress__track{width:100%;background:var(--neu-surface-3);border-radius:var(--neu-radius-full);overflow:hidden}.neu-progress--sm .neu-progress__track{height:4px}.neu-progress--md .neu-progress__track{height:8px}.neu-progress--lg .neu-progress__track{height:12px}.neu-progress__fill{height:100%;border-radius:var(--neu-radius-full);transition:width .4s cubic-bezier(.4,0,.2,1);transform-origin:left center}.neu-progress__fill--indeterminate{width:50%!important;animation:neu-progress-indeterminate 1.4s ease-in-out infinite}.neu-progress--primary .neu-progress__fill{background:var(--neu-primary)}.neu-progress--success .neu-progress__fill{background:var(--neu-success)}.neu-progress--warning .neu-progress__fill{background:var(--neu-warning)}.neu-progress--danger .neu-progress__fill{background:var(--neu-error)}\n"] }]
97
+ `, styles: ["@keyframes neu-progress-indeterminate{0%{transform:translate(-100%) scaleX(.5)}50%{transform:translate(0) scaleX(.7)}to{transform:translate(200%) scaleX(.5)}}.neu-progress{display:flex;flex-direction:column;gap:6px;width:100%;font-family:var(--neu-font-sans)}.neu-progress--sm .neu-progress__track{height:4px}.neu-progress--md .neu-progress__track{height:8px}.neu-progress--lg .neu-progress__track{height:12px}.neu-progress--primary .neu-progress__fill{background:var(--neu-primary)}.neu-progress--success .neu-progress__fill{background:var(--neu-success)}.neu-progress--warning .neu-progress__fill{background:var(--neu-warning)}.neu-progress--danger .neu-progress__fill{background:var(--neu-error)}.neu-progress__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.neu-progress__label{font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted)}.neu-progress__value{font-size:var(--neu-text-xs);font-weight:600;color:var(--neu-text-muted);min-width:32px;text-align:right}.neu-progress__track{width:100%;background:var(--neu-surface-3);border-radius:var(--neu-radius-full);overflow:hidden}.neu-progress__fill{height:100%;border-radius:var(--neu-radius-full);transition:width .4s cubic-bezier(.4,0,.2,1);transform-origin:left center}.neu-progress__fill--indeterminate{width:50%!important;animation:neu-progress-indeterminate 1.4s ease-in-out infinite}\n"] }]
98
98
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], showValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValue", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
99
99
 
100
100
  /**
@@ -0,0 +1,289 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, computed, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { NeuTimelineGridComponent } from '@neural-ui/core/timeline-grid';
4
+
5
+ class NeuSchedulerGanttComponent {
6
+ rows = input([], ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
7
+ startDate = input(null, ...(ngDevMode ? [{ debugName: "startDate" }] : /* istanbul ignore next */ []));
8
+ endDate = input(null, ...(ngDevMode ? [{ debugName: "endDate" }] : /* istanbul ignore next */ []));
9
+ locale = input(undefined, ...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
10
+ scale = input('day', ...(ngDevMode ? [{ debugName: "scale" }] : /* istanbul ignore next */ []));
11
+ title = input('Delivery timeline', ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
12
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
13
+ stickyLabels = input(true, ...(ngDevMode ? [{ debugName: "stickyLabels" }] : /* istanbul ignore next */ []));
14
+ minColumnWidth = input('112px', ...(ngDevMode ? [{ debugName: "minColumnWidth" }] : /* istanbul ignore next */ []));
15
+ showSummary = input(true, ...(ngDevMode ? [{ debugName: "showSummary" }] : /* istanbul ignore next */ []));
16
+ selectedTaskId = input(null, ...(ngDevMode ? [{ debugName: "selectedTaskId" }] : /* istanbul ignore next */ []));
17
+ selectedSlot = input(null, ...(ngDevMode ? [{ debugName: "selectedSlot" }] : /* istanbul ignore next */ []));
18
+ taskClick = output();
19
+ slotClick = output();
20
+ _bounds = computed(() => {
21
+ const explicitStart = normalizeDate(this.startDate());
22
+ const explicitEnd = normalizeDate(this.endDate());
23
+ const inferred = inferBounds(this.rows());
24
+ const rawStart = explicitStart ?? inferred.start ?? normalizeDate(new Date());
25
+ const rawEnd = explicitEnd ?? inferred.end ?? rawStart;
26
+ const min = rawStart.getTime() <= rawEnd.getTime() ? rawStart : rawEnd;
27
+ const max = rawStart.getTime() <= rawEnd.getTime() ? rawEnd : rawStart;
28
+ if (this.scale() === 'week') {
29
+ return {
30
+ start: startOfUtcWeek(min),
31
+ end: endOfUtcWeek(max),
32
+ };
33
+ }
34
+ return { start: min, end: max };
35
+ }, ...(ngDevMode ? [{ debugName: "_bounds" }] : /* istanbul ignore next */ []));
36
+ gridColumns = computed(() => buildColumns(this._bounds().start, this._bounds().end, this.scale(), this.locale()), ...(ngDevMode ? [{ debugName: "gridColumns" }] : /* istanbul ignore next */ []));
37
+ gridRows = computed(() => {
38
+ const bounds = this._bounds();
39
+ const scale = this.scale();
40
+ return this.rows().map((row) => ({
41
+ id: row.id,
42
+ label: row.label,
43
+ description: row.description,
44
+ items: row.tasks
45
+ .map((task) => mapTask(task, bounds.start, bounds.end, scale))
46
+ .filter((task) => task !== null),
47
+ }));
48
+ }, ...(ngDevMode ? [{ debugName: "gridRows" }] : /* istanbul ignore next */ []));
49
+ taskCount = computed(() => this.rows().reduce((total, row) => total + row.tasks.length, 0), ...(ngDevMode ? [{ debugName: "taskCount" }] : /* istanbul ignore next */ []));
50
+ rangeLabel = computed(() => {
51
+ const bounds = this._bounds();
52
+ return `${formatRangeDate(bounds.start, this.locale())} - ${formatRangeDate(bounds.end, this.locale())}`;
53
+ }, ...(ngDevMode ? [{ debugName: "rangeLabel" }] : /* istanbul ignore next */ []));
54
+ gridSelectedSlot = computed(() => {
55
+ const selectedSlot = this.selectedSlot();
56
+ const date = normalizeDate(selectedSlot?.date ?? null);
57
+ if (!selectedSlot || !date) {
58
+ return null;
59
+ }
60
+ const columnId = this.scale() === 'week' ? toDateKey(startOfUtcWeek(date)) : toDateKey(startOfUtcDay(date));
61
+ return { rowId: selectedSlot.rowId, columnId };
62
+ }, ...(ngDevMode ? [{ debugName: "gridSelectedSlot" }] : /* istanbul ignore next */ []));
63
+ _taskIndex = computed(() => new Map(this.rows().flatMap((row) => row.tasks.map((task) => [task.id, { rowId: row.id, rowLabel: row.label, task }]))), ...(ngDevMode ? [{ debugName: "_taskIndex" }] : /* istanbul ignore next */ []));
64
+ onTaskClick(item) {
65
+ const match = this._taskIndex().get(item.id);
66
+ if (!match) {
67
+ return;
68
+ }
69
+ this.taskClick.emit(match);
70
+ }
71
+ onSlotClick(selection) {
72
+ this.slotClick.emit({
73
+ rowId: selection.rowId,
74
+ columnId: selection.columnId,
75
+ date: selection.columnId,
76
+ scale: this.scale(),
77
+ });
78
+ }
79
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuSchedulerGanttComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
80
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuSchedulerGanttComponent, isStandalone: true, selector: "neu-scheduler-gantt", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, stickyLabels: { classPropertyName: "stickyLabels", publicName: "stickyLabels", isSignal: true, isRequired: false, transformFunction: null }, minColumnWidth: { classPropertyName: "minColumnWidth", publicName: "minColumnWidth", isSignal: true, isRequired: false, transformFunction: null }, showSummary: { classPropertyName: "showSummary", publicName: "showSummary", isSignal: true, isRequired: false, transformFunction: null }, selectedTaskId: { classPropertyName: "selectedTaskId", publicName: "selectedTaskId", isSignal: true, isRequired: false, transformFunction: null }, selectedSlot: { classPropertyName: "selectedSlot", publicName: "selectedSlot", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { taskClick: "taskClick", slotClick: "slotClick" }, host: { classAttribute: "neu-scheduler-gantt" }, ngImport: i0, template: `
81
+ @if (showSummary()) {
82
+ <header class="neu-scheduler-gantt__summary">
83
+ <div class="neu-scheduler-gantt__summary-copy">
84
+ <span class="neu-scheduler-gantt__title">{{ title() }}</span>
85
+ <span class="neu-scheduler-gantt__range">{{ rangeLabel() }}</span>
86
+ </div>
87
+ <span class="neu-scheduler-gantt__count">{{ taskCount() }} tasks</span>
88
+ </header>
89
+ }
90
+
91
+ <neu-timeline-grid
92
+ [columns]="gridColumns()"
93
+ [rows]="gridRows()"
94
+ [compact]="compact()"
95
+ [stickyLabels]="stickyLabels()"
96
+ [minColumnWidth]="minColumnWidth()"
97
+ [selectedItemId]="selectedTaskId()"
98
+ [selectedSlot]="gridSelectedSlot()"
99
+ (itemClick)="onTaskClick($event)"
100
+ (slotClick)="onSlotClick($event)"
101
+ />
102
+ `, isInline: true, styles: [".neu-scheduler-gantt{display:grid;gap:1rem;min-width:0}neu-scheduler-gantt{min-width:0}.neu-scheduler-gantt .neu-timeline-grid__row-label{min-inline-size:14rem}.neu-scheduler-gantt .neu-timeline-grid__column-label{text-transform:capitalize}.neu-scheduler-gantt .neu-timeline-grid__column-desc{white-space:nowrap}.neu-scheduler-gantt__summary{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.75rem;padding:.875rem 1rem;border:1px solid var(--neu-border);border-radius:calc(var(--neu-radius, 1rem) * .9);background:linear-gradient(135deg,color-mix(in srgb,var(--neu-primary) 8%,transparent),transparent 48%),var(--neu-surface);color:var(--neu-text)}.neu-scheduler-gantt__summary-copy{display:grid;gap:.2rem}.neu-scheduler-gantt__title{font-size:.95rem;font-weight:700}.neu-scheduler-gantt__range,.neu-scheduler-gantt__count{color:var(--neu-text-muted, #64748b);font-size:.875rem}.neu-scheduler-gantt__count{font-weight:600}@media(max-width:720px){.neu-scheduler-gantt .neu-timeline-grid__row-label{min-inline-size:10rem}.neu-scheduler-gantt__summary{align-items:flex-start;flex-direction:column}}\n"], dependencies: [{ kind: "component", type: NeuTimelineGridComponent, selector: "neu-timeline-grid", inputs: ["columns", "rows", "compact", "stickyLabels", "minColumnWidth", "selectedItemId", "selectedSlot"], outputs: ["itemClick", "slotClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
103
+ }
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuSchedulerGanttComponent, decorators: [{
105
+ type: Component,
106
+ args: [{ selector: 'neu-scheduler-gantt', standalone: true, imports: [NeuTimelineGridComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
107
+ class: 'neu-scheduler-gantt',
108
+ }, template: `
109
+ @if (showSummary()) {
110
+ <header class="neu-scheduler-gantt__summary">
111
+ <div class="neu-scheduler-gantt__summary-copy">
112
+ <span class="neu-scheduler-gantt__title">{{ title() }}</span>
113
+ <span class="neu-scheduler-gantt__range">{{ rangeLabel() }}</span>
114
+ </div>
115
+ <span class="neu-scheduler-gantt__count">{{ taskCount() }} tasks</span>
116
+ </header>
117
+ }
118
+
119
+ <neu-timeline-grid
120
+ [columns]="gridColumns()"
121
+ [rows]="gridRows()"
122
+ [compact]="compact()"
123
+ [stickyLabels]="stickyLabels()"
124
+ [minColumnWidth]="minColumnWidth()"
125
+ [selectedItemId]="selectedTaskId()"
126
+ [selectedSlot]="gridSelectedSlot()"
127
+ (itemClick)="onTaskClick($event)"
128
+ (slotClick)="onSlotClick($event)"
129
+ />
130
+ `, styles: [".neu-scheduler-gantt{display:grid;gap:1rem;min-width:0}neu-scheduler-gantt{min-width:0}.neu-scheduler-gantt .neu-timeline-grid__row-label{min-inline-size:14rem}.neu-scheduler-gantt .neu-timeline-grid__column-label{text-transform:capitalize}.neu-scheduler-gantt .neu-timeline-grid__column-desc{white-space:nowrap}.neu-scheduler-gantt__summary{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.75rem;padding:.875rem 1rem;border:1px solid var(--neu-border);border-radius:calc(var(--neu-radius, 1rem) * .9);background:linear-gradient(135deg,color-mix(in srgb,var(--neu-primary) 8%,transparent),transparent 48%),var(--neu-surface);color:var(--neu-text)}.neu-scheduler-gantt__summary-copy{display:grid;gap:.2rem}.neu-scheduler-gantt__title{font-size:.95rem;font-weight:700}.neu-scheduler-gantt__range,.neu-scheduler-gantt__count{color:var(--neu-text-muted, #64748b);font-size:.875rem}.neu-scheduler-gantt__count{font-weight:600}@media(max-width:720px){.neu-scheduler-gantt .neu-timeline-grid__row-label{min-inline-size:10rem}.neu-scheduler-gantt__summary{align-items:flex-start;flex-direction:column}}\n"] }]
131
+ }], propDecorators: { rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], startDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "startDate", required: false }] }], endDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "endDate", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], scale: [{ type: i0.Input, args: [{ isSignal: true, alias: "scale", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], stickyLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyLabels", required: false }] }], minColumnWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "minColumnWidth", required: false }] }], showSummary: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSummary", required: false }] }], selectedTaskId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedTaskId", required: false }] }], selectedSlot: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedSlot", required: false }] }], taskClick: [{ type: i0.Output, args: ["taskClick"] }], slotClick: [{ type: i0.Output, args: ["slotClick"] }] } });
132
+ function inferBounds(rows) {
133
+ let start = null;
134
+ let end = null;
135
+ for (const row of rows) {
136
+ for (const task of row.tasks) {
137
+ const taskStart = normalizeDate(task.start);
138
+ const taskEnd = normalizeDate(task.end ?? task.start);
139
+ if (taskStart && (!start || taskStart.getTime() < start.getTime())) {
140
+ start = taskStart;
141
+ }
142
+ if (taskEnd && (!end || taskEnd.getTime() > end.getTime())) {
143
+ end = taskEnd;
144
+ }
145
+ }
146
+ }
147
+ return { start, end };
148
+ }
149
+ function buildColumns(start, end, scale, locale) {
150
+ const columns = [];
151
+ let cursor = scale === 'week' ? startOfUtcWeek(start) : startOfUtcDay(start);
152
+ const limit = scale === 'week' ? startOfUtcWeek(end) : startOfUtcDay(end);
153
+ while (cursor.getTime() <= limit.getTime()) {
154
+ columns.push(scale === 'week'
155
+ ? {
156
+ id: toDateKey(cursor),
157
+ label: `W${getIsoWeek(cursor)}`,
158
+ description: formatRangeDate(cursor, locale),
159
+ }
160
+ : {
161
+ id: toDateKey(cursor),
162
+ label: formatWeekday(cursor, locale),
163
+ description: formatShortDate(cursor, locale),
164
+ });
165
+ cursor = scale === 'week' ? addUtcDays(cursor, 7) : addUtcDays(cursor, 1);
166
+ }
167
+ return columns;
168
+ }
169
+ function mapTask(task, min, max, scale) {
170
+ const rawStart = normalizeDate(task.start);
171
+ const rawEnd = normalizeDate(task.end ?? task.start);
172
+ if (!rawStart || !rawEnd) {
173
+ return null;
174
+ }
175
+ const start = rawStart.getTime() <= rawEnd.getTime() ? rawStart : rawEnd;
176
+ const end = rawStart.getTime() <= rawEnd.getTime() ? rawEnd : rawStart;
177
+ if (end.getTime() < min.getTime() || start.getTime() > max.getTime()) {
178
+ return null;
179
+ }
180
+ const clampedStart = clampDate(start, min, max);
181
+ const clampedEnd = clampDate(end, min, max);
182
+ if (clampedStart.getTime() > clampedEnd.getTime()) {
183
+ return null;
184
+ }
185
+ if (scale === 'week') {
186
+ const weekStart = startOfUtcWeek(clampedStart);
187
+ const weekEnd = startOfUtcWeek(clampedEnd);
188
+ return {
189
+ id: task.id,
190
+ title: task.title,
191
+ start: toDateKey(weekStart),
192
+ span: diffInWeeks(weekStart, weekEnd) + 1,
193
+ subtitle: task.subtitle,
194
+ meta: taskMeta(task),
195
+ variant: task.variant,
196
+ };
197
+ }
198
+ return {
199
+ id: task.id,
200
+ title: task.title,
201
+ start: toDateKey(clampedStart),
202
+ span: diffInDays(clampedStart, clampedEnd) + 1,
203
+ subtitle: task.subtitle,
204
+ meta: taskMeta(task),
205
+ variant: task.variant,
206
+ };
207
+ }
208
+ function taskMeta(task) {
209
+ const progress = task.progress == null ? null : `${Math.max(0, Math.min(100, task.progress))}%`;
210
+ if (task.meta && progress) {
211
+ return `${task.meta} · ${progress}`;
212
+ }
213
+ return task.meta ?? progress ?? undefined;
214
+ }
215
+ function normalizeDate(value) {
216
+ if (!value) {
217
+ return null;
218
+ }
219
+ const date = value instanceof Date ? value : new Date(value);
220
+ if (Number.isNaN(date.getTime())) {
221
+ return null;
222
+ }
223
+ return startOfUtcDay(date);
224
+ }
225
+ function startOfUtcDay(date) {
226
+ return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
227
+ }
228
+ function startOfUtcWeek(date) {
229
+ const day = date.getUTCDay() || 7;
230
+ return addUtcDays(startOfUtcDay(date), 1 - day);
231
+ }
232
+ function endOfUtcWeek(date) {
233
+ return addUtcDays(startOfUtcWeek(date), 6);
234
+ }
235
+ function addUtcDays(date, days) {
236
+ const copy = new Date(date);
237
+ copy.setUTCDate(copy.getUTCDate() + days);
238
+ return startOfUtcDay(copy);
239
+ }
240
+ function diffInDays(start, end) {
241
+ return Math.round((end.getTime() - start.getTime()) / 86400000);
242
+ }
243
+ function diffInWeeks(start, end) {
244
+ return Math.round((startOfUtcWeek(end).getTime() - startOfUtcWeek(start).getTime()) / 604800000);
245
+ }
246
+ function clampDate(date, min, max) {
247
+ if (date.getTime() < min.getTime()) {
248
+ return min;
249
+ }
250
+ if (date.getTime() > max.getTime()) {
251
+ return max;
252
+ }
253
+ return date;
254
+ }
255
+ function toDateKey(date) {
256
+ return date.toISOString().slice(0, 10);
257
+ }
258
+ function formatWeekday(date, locale) {
259
+ return new Intl.DateTimeFormat(locale, { weekday: 'short', timeZone: 'UTC' }).format(date);
260
+ }
261
+ function formatShortDate(date, locale) {
262
+ return new Intl.DateTimeFormat(locale, {
263
+ month: 'short',
264
+ day: 'numeric',
265
+ timeZone: 'UTC',
266
+ }).format(date);
267
+ }
268
+ function formatRangeDate(date, locale) {
269
+ return new Intl.DateTimeFormat(locale, {
270
+ month: 'short',
271
+ day: 'numeric',
272
+ year: 'numeric',
273
+ timeZone: 'UTC',
274
+ }).format(date);
275
+ }
276
+ function getIsoWeek(date) {
277
+ const target = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
278
+ const dayNr = target.getUTCDay() || 7;
279
+ target.setUTCDate(target.getUTCDate() + 4 - dayNr);
280
+ const yearStart = new Date(Date.UTC(target.getUTCFullYear(), 0, 1));
281
+ return Math.ceil(((target.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
282
+ }
283
+
284
+ /**
285
+ * Generated bundle index. Do not edit.
286
+ */
287
+
288
+ export { NeuSchedulerGanttComponent };
289
+ //# sourceMappingURL=neural-ui-core-scheduler-gantt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-scheduler-gantt.mjs","sources":["../../../../projects/ui-core/scheduler-gantt/neu-scheduler-gantt.component.ts","../../../../projects/ui-core/scheduler-gantt/neural-ui-core-scheduler-gantt.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n} from '@angular/core';\nimport {\n NeuTimelineGridComponent,\n type NeuTimelineGridColumn,\n type NeuTimelineGridItem,\n type NeuTimelineGridItemVariant,\n type NeuTimelineGridRow,\n type NeuTimelineGridSlotSelection,\n} from '@neural-ui/core/timeline-grid';\n\nexport type NeuSchedulerGanttScale = 'day' | 'week';\n\nexport interface NeuSchedulerGanttTask {\n id: string;\n title: string;\n start: string | Date;\n end?: string | Date;\n subtitle?: string;\n meta?: string;\n variant?: NeuTimelineGridItemVariant;\n progress?: number;\n}\n\nexport interface NeuSchedulerGanttRow {\n id: string;\n label: string;\n description?: string;\n tasks: NeuSchedulerGanttTask[];\n}\n\nexport interface NeuSchedulerGanttTaskClick {\n rowId: string;\n rowLabel: string;\n task: NeuSchedulerGanttTask;\n}\n\nexport interface NeuSchedulerGanttSlotClick {\n rowId: string;\n columnId: string;\n date: string;\n scale: NeuSchedulerGanttScale;\n}\n\nexport interface NeuSchedulerGanttSelectedSlot {\n rowId: string;\n date: string | Date;\n}\n\n@Component({\n selector: 'neu-scheduler-gantt',\n standalone: true,\n imports: [NeuTimelineGridComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-scheduler-gantt',\n },\n template: `\n @if (showSummary()) {\n <header class=\"neu-scheduler-gantt__summary\">\n <div class=\"neu-scheduler-gantt__summary-copy\">\n <span class=\"neu-scheduler-gantt__title\">{{ title() }}</span>\n <span class=\"neu-scheduler-gantt__range\">{{ rangeLabel() }}</span>\n </div>\n <span class=\"neu-scheduler-gantt__count\">{{ taskCount() }} tasks</span>\n </header>\n }\n\n <neu-timeline-grid\n [columns]=\"gridColumns()\"\n [rows]=\"gridRows()\"\n [compact]=\"compact()\"\n [stickyLabels]=\"stickyLabels()\"\n [minColumnWidth]=\"minColumnWidth()\"\n [selectedItemId]=\"selectedTaskId()\"\n [selectedSlot]=\"gridSelectedSlot()\"\n (itemClick)=\"onTaskClick($event)\"\n (slotClick)=\"onSlotClick($event)\"\n />\n `,\n styleUrl: './neu-scheduler-gantt.component.scss',\n})\nexport class NeuSchedulerGanttComponent {\n readonly rows = input<NeuSchedulerGanttRow[]>([]);\n readonly startDate = input<string | Date | null>(null);\n readonly endDate = input<string | Date | null>(null);\n readonly locale = input<string | undefined>(undefined);\n readonly scale = input<NeuSchedulerGanttScale>('day');\n readonly title = input('Delivery timeline');\n readonly compact = input(false);\n readonly stickyLabels = input(true);\n readonly minColumnWidth = input('112px');\n readonly showSummary = input(true);\n readonly selectedTaskId = input<string | null>(null);\n readonly selectedSlot = input<NeuSchedulerGanttSelectedSlot | null>(null);\n\n readonly taskClick = output<NeuSchedulerGanttTaskClick>();\n readonly slotClick = output<NeuSchedulerGanttSlotClick>();\n\n readonly _bounds = computed(() => {\n const explicitStart = normalizeDate(this.startDate());\n const explicitEnd = normalizeDate(this.endDate());\n const inferred = inferBounds(this.rows());\n const rawStart = explicitStart ?? inferred.start ?? normalizeDate(new Date())!;\n const rawEnd = explicitEnd ?? inferred.end ?? rawStart;\n const min = rawStart.getTime() <= rawEnd.getTime() ? rawStart : rawEnd;\n const max = rawStart.getTime() <= rawEnd.getTime() ? rawEnd : rawStart;\n\n if (this.scale() === 'week') {\n return {\n start: startOfUtcWeek(min),\n end: endOfUtcWeek(max),\n };\n }\n\n return { start: min, end: max };\n });\n\n readonly gridColumns = computed<NeuTimelineGridColumn[]>(() =>\n buildColumns(this._bounds().start, this._bounds().end, this.scale(), this.locale()),\n );\n\n readonly gridRows = computed<NeuTimelineGridRow[]>(() => {\n const bounds = this._bounds();\n const scale = this.scale();\n\n return this.rows().map((row) => ({\n id: row.id,\n label: row.label,\n description: row.description,\n items: row.tasks\n .map((task) => mapTask(task, bounds.start, bounds.end, scale))\n .filter((task): task is NeuTimelineGridItem => task !== null),\n }));\n });\n\n readonly taskCount = computed(() =>\n this.rows().reduce((total, row) => total + row.tasks.length, 0),\n );\n\n readonly rangeLabel = computed(() => {\n const bounds = this._bounds();\n return `${formatRangeDate(bounds.start, this.locale())} - ${formatRangeDate(bounds.end, this.locale())}`;\n });\n\n readonly gridSelectedSlot = computed<NeuTimelineGridSlotSelection | null>(() => {\n const selectedSlot = this.selectedSlot();\n const date = normalizeDate(selectedSlot?.date ?? null);\n if (!selectedSlot || !date) {\n return null;\n }\n\n const columnId =\n this.scale() === 'week' ? toDateKey(startOfUtcWeek(date)) : toDateKey(startOfUtcDay(date));\n\n return { rowId: selectedSlot.rowId, columnId };\n });\n\n private readonly _taskIndex = computed(\n () =>\n new Map(\n this.rows().flatMap((row) =>\n row.tasks.map((task) => [task.id, { rowId: row.id, rowLabel: row.label, task }] as const),\n ),\n ),\n );\n\n onTaskClick(item: NeuTimelineGridItem): void {\n const match = this._taskIndex().get(item.id);\n if (!match) {\n return;\n }\n\n this.taskClick.emit(match);\n }\n\n onSlotClick(selection: NeuTimelineGridSlotSelection): void {\n this.slotClick.emit({\n rowId: selection.rowId,\n columnId: selection.columnId,\n date: selection.columnId,\n scale: this.scale(),\n });\n }\n}\n\nfunction inferBounds(rows: NeuSchedulerGanttRow[]): { start: Date | null; end: Date | null } {\n let start: Date | null = null;\n let end: Date | null = null;\n\n for (const row of rows) {\n for (const task of row.tasks) {\n const taskStart = normalizeDate(task.start);\n const taskEnd = normalizeDate(task.end ?? task.start);\n if (taskStart && (!start || taskStart.getTime() < start.getTime())) {\n start = taskStart;\n }\n if (taskEnd && (!end || taskEnd.getTime() > end.getTime())) {\n end = taskEnd;\n }\n }\n }\n\n return { start, end };\n}\n\nfunction buildColumns(\n start: Date,\n end: Date,\n scale: NeuSchedulerGanttScale,\n locale?: string,\n): NeuTimelineGridColumn[] {\n const columns: NeuTimelineGridColumn[] = [];\n let cursor = scale === 'week' ? startOfUtcWeek(start) : startOfUtcDay(start);\n const limit = scale === 'week' ? startOfUtcWeek(end) : startOfUtcDay(end);\n\n while (cursor.getTime() <= limit.getTime()) {\n columns.push(\n scale === 'week'\n ? {\n id: toDateKey(cursor),\n label: `W${getIsoWeek(cursor)}`,\n description: formatRangeDate(cursor, locale),\n }\n : {\n id: toDateKey(cursor),\n label: formatWeekday(cursor, locale),\n description: formatShortDate(cursor, locale),\n },\n );\n cursor = scale === 'week' ? addUtcDays(cursor, 7) : addUtcDays(cursor, 1);\n }\n\n return columns;\n}\n\nfunction mapTask(\n task: NeuSchedulerGanttTask,\n min: Date,\n max: Date,\n scale: NeuSchedulerGanttScale,\n): NeuTimelineGridItem | null {\n const rawStart = normalizeDate(task.start);\n const rawEnd = normalizeDate(task.end ?? task.start);\n if (!rawStart || !rawEnd) {\n return null;\n }\n\n const start = rawStart.getTime() <= rawEnd.getTime() ? rawStart : rawEnd;\n const end = rawStart.getTime() <= rawEnd.getTime() ? rawEnd : rawStart;\n if (end.getTime() < min.getTime() || start.getTime() > max.getTime()) {\n return null;\n }\n\n const clampedStart = clampDate(start, min, max);\n const clampedEnd = clampDate(end, min, max);\n if (clampedStart.getTime() > clampedEnd.getTime()) {\n return null;\n }\n\n if (scale === 'week') {\n const weekStart = startOfUtcWeek(clampedStart);\n const weekEnd = startOfUtcWeek(clampedEnd);\n return {\n id: task.id,\n title: task.title,\n start: toDateKey(weekStart),\n span: diffInWeeks(weekStart, weekEnd) + 1,\n subtitle: task.subtitle,\n meta: taskMeta(task),\n variant: task.variant,\n };\n }\n\n return {\n id: task.id,\n title: task.title,\n start: toDateKey(clampedStart),\n span: diffInDays(clampedStart, clampedEnd) + 1,\n subtitle: task.subtitle,\n meta: taskMeta(task),\n variant: task.variant,\n };\n}\n\nfunction taskMeta(task: NeuSchedulerGanttTask): string | undefined {\n const progress = task.progress == null ? null : `${Math.max(0, Math.min(100, task.progress))}%`;\n if (task.meta && progress) {\n return `${task.meta} · ${progress}`;\n }\n return task.meta ?? progress ?? undefined;\n}\n\nfunction normalizeDate(value: string | Date | null | undefined): Date | null {\n if (!value) {\n return null;\n }\n\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return startOfUtcDay(date);\n}\n\nfunction startOfUtcDay(date: Date): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));\n}\n\nfunction startOfUtcWeek(date: Date): Date {\n const day = date.getUTCDay() || 7;\n return addUtcDays(startOfUtcDay(date), 1 - day);\n}\n\nfunction endOfUtcWeek(date: Date): Date {\n return addUtcDays(startOfUtcWeek(date), 6);\n}\n\nfunction addUtcDays(date: Date, days: number): Date {\n const copy = new Date(date);\n copy.setUTCDate(copy.getUTCDate() + days);\n return startOfUtcDay(copy);\n}\n\nfunction diffInDays(start: Date, end: Date): number {\n return Math.round((end.getTime() - start.getTime()) / 86400000);\n}\n\nfunction diffInWeeks(start: Date, end: Date): number {\n return Math.round((startOfUtcWeek(end).getTime() - startOfUtcWeek(start).getTime()) / 604800000);\n}\n\nfunction clampDate(date: Date, min: Date, max: Date): Date {\n if (date.getTime() < min.getTime()) {\n return min;\n }\n if (date.getTime() > max.getTime()) {\n return max;\n }\n return date;\n}\n\nfunction toDateKey(date: Date): string {\n return date.toISOString().slice(0, 10);\n}\n\nfunction formatWeekday(date: Date, locale?: string): string {\n return new Intl.DateTimeFormat(locale, { weekday: 'short', timeZone: 'UTC' }).format(date);\n}\n\nfunction formatShortDate(date: Date, locale?: string): string {\n return new Intl.DateTimeFormat(locale, {\n month: 'short',\n day: 'numeric',\n timeZone: 'UTC',\n }).format(date);\n}\n\nfunction formatRangeDate(date: Date, locale?: string): string {\n return new Intl.DateTimeFormat(locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n }).format(date);\n}\n\nfunction getIsoWeek(date: Date): number {\n const target = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));\n const dayNr = target.getUTCDay() || 7;\n target.setUTCDate(target.getUTCDate() + 4 - dayNr);\n const yearStart = new Date(Date.UTC(target.getUTCFullYear(), 0, 1));\n return Math.ceil(((target.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}