@neural-ui/core 1.3.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +14 -7
  2. package/calendar/package.json +4 -0
  3. package/fesm2022/neural-ui-core-accordion.mjs +8 -6
  4. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  5. package/fesm2022/neural-ui-core-autocomplete.mjs +121 -29
  6. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  7. package/fesm2022/neural-ui-core-badge.mjs +2 -2
  8. package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
  9. package/fesm2022/neural-ui-core-block-ui.mjs +2 -2
  10. package/fesm2022/neural-ui-core-button.mjs +2 -2
  11. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  12. package/fesm2022/neural-ui-core-calendar.mjs +551 -0
  13. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -0
  14. package/fesm2022/neural-ui-core-chip.mjs +2 -2
  15. package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
  16. package/fesm2022/neural-ui-core-color-picker.mjs +3 -9
  17. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
  18. package/fesm2022/neural-ui-core-confirm-dialog.mjs +2 -2
  19. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -1
  20. package/fesm2022/neural-ui-core-dashboard-grid.mjs +2 -2
  21. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
  22. package/fesm2022/neural-ui-core-date-input.mjs +2 -2
  23. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
  24. package/fesm2022/neural-ui-core-filter-bar.mjs +2 -2
  25. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
  26. package/fesm2022/neural-ui-core-image-gallery.mjs +224 -0
  27. package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -0
  28. package/fesm2022/neural-ui-core-input.mjs +2 -2
  29. package/fesm2022/neural-ui-core-kanban.mjs +270 -0
  30. package/fesm2022/neural-ui-core-kanban.mjs.map +1 -0
  31. package/fesm2022/neural-ui-core-meter-group.mjs +2 -2
  32. package/fesm2022/neural-ui-core-modal.mjs +81 -31
  33. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  34. package/fesm2022/neural-ui-core-multiselect.mjs +269 -99
  35. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  36. package/fesm2022/neural-ui-core-nav.mjs +4 -6
  37. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  38. package/fesm2022/neural-ui-core-number-input.mjs +2 -2
  39. package/fesm2022/neural-ui-core-pagination.mjs +2 -2
  40. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-progress-bar.mjs +2 -2
  42. package/fesm2022/neural-ui-core-scheduler-gantt.mjs +289 -0
  43. package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -0
  44. package/fesm2022/neural-ui-core-select.mjs +276 -101
  45. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  46. package/fesm2022/neural-ui-core-sidebar.mjs +3 -2
  47. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  48. package/fesm2022/neural-ui-core-slider.mjs +2 -2
  49. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  50. package/fesm2022/neural-ui-core-split-button.mjs +2 -2
  51. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  52. package/fesm2022/neural-ui-core-stepper.mjs +2 -2
  53. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  54. package/fesm2022/neural-ui-core-table.mjs +435 -34
  55. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  56. package/fesm2022/neural-ui-core-tabs.mjs +11 -4
  57. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  58. package/fesm2022/neural-ui-core-textarea.mjs +2 -2
  59. package/fesm2022/neural-ui-core-timeline-grid.mjs +215 -0
  60. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -0
  61. package/fesm2022/neural-ui-core-toggle-button-group.mjs +2 -2
  62. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  63. package/fesm2022/neural-ui-core-toolbar.mjs +2 -2
  64. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
  65. package/fesm2022/neural-ui-core-tree-table.mjs +262 -0
  66. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -0
  67. package/fesm2022/neural-ui-core-tree.mjs +413 -0
  68. package/fesm2022/neural-ui-core-tree.mjs.map +1 -0
  69. package/fesm2022/neural-ui-core-uploader.mjs +624 -0
  70. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -0
  71. package/fesm2022/neural-ui-core-url-state.mjs +90 -10
  72. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
  73. package/fesm2022/neural-ui-core-virtual-list.mjs +53 -23
  74. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  75. package/fesm2022/neural-ui-core.mjs +3 -1
  76. package/fesm2022/neural-ui-core.mjs.map +1 -1
  77. package/image-gallery/package.json +4 -0
  78. package/kanban/package.json +4 -0
  79. package/package.json +34 -2
  80. package/scheduler-gantt/package.json +4 -0
  81. package/styles/_tokens.scss +13 -4
  82. package/timeline-grid/package.json +4 -0
  83. package/tree/package.json +4 -0
  84. package/tree-table/package.json +4 -0
  85. package/types/neural-ui-core-autocomplete.d.ts +10 -1
  86. package/types/neural-ui-core-calendar.d.ts +79 -0
  87. package/types/neural-ui-core-color-picker.d.ts +0 -1
  88. package/types/neural-ui-core-image-gallery.d.ts +26 -0
  89. package/types/neural-ui-core-kanban.d.ts +52 -0
  90. package/types/neural-ui-core-modal.d.ts +22 -16
  91. package/types/neural-ui-core-multiselect.d.ts +13 -1
  92. package/types/neural-ui-core-scheduler-gantt.d.ts +68 -0
  93. package/types/neural-ui-core-select.d.ts +14 -1
  94. package/types/neural-ui-core-sidebar.d.ts +1 -0
  95. package/types/neural-ui-core-table.d.ts +66 -4
  96. package/types/neural-ui-core-tabs.d.ts +1 -0
  97. package/types/neural-ui-core-timeline-grid.d.ts +55 -0
  98. package/types/neural-ui-core-tree-table.d.ts +72 -0
  99. package/types/neural-ui-core-tree.d.ts +52 -0
  100. package/types/neural-ui-core-uploader.d.ts +98 -0
  101. package/types/neural-ui-core-url-state.d.ts +9 -0
  102. package/types/neural-ui-core-virtual-list.d.ts +17 -1
  103. package/uploader/package.json +4 -0
@@ -13,6 +13,9 @@
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;
@@ -39,8 +42,8 @@
39
42
  // Tipografía (Slate scale)
40
43
  // ------------------------------------------------
41
44
  --neu-text: #0f172a; // Slate-900
42
- --neu-text-muted: #64748b; // Slate-500
43
- --neu-text-disabled: #94a3b8; // Slate-400
45
+ --neu-text-muted: #475569; // Slate-600
46
+ --neu-text-disabled: #64748b; // Slate-500
44
47
  --neu-text-inverse: #ffffff;
45
48
  --neu-knob-display-color: var(--neu-text);
46
49
  --neu-knob-label-color: var(--neu-text-muted);
@@ -60,7 +63,7 @@
60
63
  // ------------------------------------------------
61
64
  // Estados semánticos
62
65
  // ------------------------------------------------
63
- --neu-success: #10b981;
66
+ --neu-success: #15803d;
64
67
  --neu-success-bg: #d1fae5;
65
68
  --neu-success-text: #065f46;
66
69
 
@@ -68,7 +71,7 @@
68
71
  --neu-warning-bg: #fef3c7;
69
72
  --neu-warning-text: #92400e;
70
73
 
71
- --neu-error: #ef4444;
74
+ --neu-error: #dc2626;
72
75
  --neu-error-bg: #fee2e2;
73
76
  --neu-error-text: #991b1b;
74
77
 
@@ -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
+ }
@@ -35,6 +35,10 @@ declare class NeuAutocompleteComponent implements ControlValueAccessor {
35
35
  readonly floatingLabel: _angular_core.InputSignal<boolean>;
36
36
  /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */
37
37
  readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
38
+ /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large result lists */
39
+ readonly virtualScroll: _angular_core.InputSignal<boolean>;
40
+ /** Número de resultados visibles en el viewport virtual / Number of visible results in the virtual viewport */
41
+ readonly virtualScrollVisibleItems: _angular_core.InputSignal<number>;
38
42
  /** Emitido al seleccionar una opción / Emitted when an option is selected */
39
43
  readonly optionSelected: _angular_core.OutputEmitterRef<NeuAutocompleteOption>;
40
44
  /** Emitido al cambiar el texto del input / Emitted on query change */
@@ -46,6 +50,7 @@ declare class NeuAutocompleteComponent implements ControlValueAccessor {
46
50
  readonly _activeIndex: _angular_core.WritableSignal<number>;
47
51
  readonly _cvaDisabled: _angular_core.WritableSignal<boolean>;
48
52
  readonly _focused: _angular_core.WritableSignal<boolean>;
53
+ private readonly _viewport;
49
54
  private _onChange;
50
55
  private _onTouched;
51
56
  readonly _filtered: _angular_core.Signal<NeuAutocompleteOption[]>;
@@ -53,6 +58,9 @@ declare class NeuAutocompleteComponent implements ControlValueAccessor {
53
58
  readonly hasError: _angular_core.Signal<boolean>;
54
59
  readonly describedBy: _angular_core.Signal<string | null>;
55
60
  readonly resultsAnnouncement: _angular_core.Signal<string>;
61
+ readonly virtualScrollItemSize: _angular_core.Signal<36 | 52 | 40>;
62
+ readonly virtualViewportHeight: _angular_core.Signal<string>;
63
+ readonly trackByOption: (index: number, option: NeuAutocompleteOption) => {};
56
64
  _optionId(i: number): string;
57
65
  private readonly _el;
58
66
  onDocClick(e: MouseEvent): void;
@@ -63,12 +71,13 @@ declare class NeuAutocompleteComponent implements ControlValueAccessor {
63
71
  private _moveActiveIndex;
64
72
  selectOption(opt: NeuAutocompleteOption): void;
65
73
  clear(): void;
74
+ private _scrollActiveOptionIntoView;
66
75
  writeValue(val: unknown): void;
67
76
  registerOnChange(fn: (v: unknown) => void): void;
68
77
  registerOnTouched(fn: () => void): void;
69
78
  setDisabledState(d: boolean): void;
70
79
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuAutocompleteComponent, never>;
71
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuAutocompleteComponent, "neu-autocomplete", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "optionSelected": "optionSelected"; "queryChange": "queryChange"; }, never, never, true, never>;
80
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuAutocompleteComponent, "neu-autocomplete", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualScrollVisibleItems": { "alias": "virtualScrollVisibleItems"; "required": false; "isSignal": true; }; }, { "optionSelected": "optionSelected"; "queryChange": "queryChange"; }, never, never, true, never>;
72
81
  }
73
82
 
74
83
  export { NeuAutocompleteComponent };
@@ -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 };
@@ -29,7 +29,6 @@ declare class NeuColorPickerComponent implements ControlValueAccessor {
29
29
  private _onChange;
30
30
  private _onTouched;
31
31
  private readonly _el;
32
- constructor();
33
32
  _outsideClick(e: MouseEvent): void;
34
33
  readonly _hexValue: _angular_core.Signal<string>;
35
34
  readonly _textValue: _angular_core.Signal<string>;
@@ -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 };
@@ -3,22 +3,6 @@ import { Type } from '@angular/core';
3
3
  import { DialogRef } from '@angular/cdk/dialog';
4
4
 
5
5
  type NeuDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
6
- /** Datos que se inyectan en el componente del diálogo / Data injected into the dialog component */
7
- interface NeuDialogData<T = unknown> {
8
- title?: string;
9
- data?: T;
10
- }
11
- declare class NeuDialogService {
12
- private readonly dialog;
13
- open<T = unknown, R = unknown>(component: Type<unknown>, config?: {
14
- title?: string;
15
- data?: T;
16
- size?: NeuDialogSize;
17
- disableClose?: boolean;
18
- }): DialogRef<R>;
19
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuDialogService, never>;
20
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<NeuDialogService>;
21
- }
22
6
  /**
23
7
  * NeuDialogComponent — Diálogo accesible con header, body y footer. / Accessible dialog with header, body and footer.
24
8
  * Úsalo directamente como componente declarativo pasando `open` como signal. / Use it directly as a declarative component passing `open` as a signal.
@@ -44,11 +28,33 @@ declare class NeuDialogComponent {
44
28
  disableClose: _angular_core.InputSignal<boolean>;
45
29
  /** Emite cuando el usuario cierra el diálogo. / Emits when the user closes the dialog. */
46
30
  closed: _angular_core.OutputEmitterRef<void>;
31
+ private readonly panelRef;
47
32
  /** @internal — ID único para aria-labelledby / Unique ID for aria-labelledby */
48
33
  readonly _uid: string;
34
+ constructor();
35
+ onPanelKeydown(event: KeyboardEvent): void;
36
+ private focusInitialElement;
37
+ private getFocusableElements;
49
38
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuDialogComponent, never>;
50
39
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuDialogComponent, "neu-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disableClose": { "alias": "disableClose"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*", "[neu-dialog-footer]"], true, never>;
51
40
  }
52
41
 
42
+ /** Datos que se inyectan en el componente del diálogo / Data injected into the dialog component */
43
+ interface NeuDialogData<T = unknown> {
44
+ title?: string;
45
+ data?: T;
46
+ }
47
+ declare class NeuDialogService {
48
+ private readonly dialog;
49
+ open<T = unknown, R = unknown>(component: Type<unknown>, config?: {
50
+ title?: string;
51
+ data?: T;
52
+ size?: NeuDialogSize;
53
+ disableClose?: boolean;
54
+ }): DialogRef<R>;
55
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuDialogService, never>;
56
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NeuDialogService>;
57
+ }
58
+
53
59
  export { NeuDialogComponent, NeuDialogService };
54
60
  export type { NeuDialogData, NeuDialogSize };
@@ -40,7 +40,9 @@ declare class NeuMultiselectComponent implements ControlValueAccessor {
40
40
  private readonly _urlState;
41
41
  private readonly _mobileViewportMax;
42
42
  private readonly _viewportMargin;
43
+ private readonly _panelMaxHeight;
43
44
  private readonly _urlParamSignals;
45
+ private readonly _viewport;
44
46
  private _getUrlParamSignal;
45
47
  constructor();
46
48
  /** @internal */
@@ -74,6 +76,10 @@ declare class NeuMultiselectComponent implements ControlValueAccessor {
74
76
  clearAllLabel: _angular_core.InputSignal<string>;
75
77
  /** Muestra un botón × en el trigger para limpiar la selección de una vez / Shows a × button in the trigger to clear the selection at once */
76
78
  clearable: _angular_core.InputSignal<boolean>;
79
+ /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */
80
+ virtualScroll: _angular_core.InputSignal<boolean>;
81
+ /** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */
82
+ virtualScrollVisibleItems: _angular_core.InputSignal<number>;
77
83
  /** Aria-label del botón clear que aparece en el trigger / Aria-label for the clear button shown in the trigger */
78
84
  clearAriaLabel: _angular_core.InputSignal<string>;
79
85
  /**
@@ -104,6 +110,9 @@ declare class NeuMultiselectComponent implements ControlValueAccessor {
104
110
  readonly describedBy: Signal<string | null>;
105
111
  readonly filteredOptions: Signal<NeuSelectOption[]>;
106
112
  readonly resultsAnnouncement: Signal<string>;
113
+ readonly virtualScrollItemSize: Signal<36 | 52 | 44>;
114
+ readonly virtualViewportHeight: Signal<string>;
115
+ readonly trackByOptionValue: (_index: number, option: NeuSelectOption) => string;
107
116
  private _onChange;
108
117
  private _onTouched;
109
118
  writeValue(value: string[] | null): void;
@@ -130,9 +139,12 @@ declare class NeuMultiselectComponent implements ControlValueAccessor {
130
139
  onWindowResize(): void;
131
140
  onWindowScroll(): void;
132
141
  private syncPanelPosition;
142
+ private focusFirstOption;
143
+ private focusOption;
133
144
  private resetPanelPosition;
145
+ private refreshVirtualViewport;
134
146
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuMultiselectComponent, never>;
135
- 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; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; "urlParam": { "alias": "urlParam"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, ["itemTpl"], never, true, never>;
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>;
136
148
  }
137
149
 
138
150
  export { NeuMultiselectComponent, NeuMultiselectItemDirective };
@@ -0,0 +1,68 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { NeuTimelineGridItemVariant, NeuTimelineGridColumn, NeuTimelineGridRow, NeuTimelineGridSlotSelection, NeuTimelineGridItem } from '@neural-ui/core/timeline-grid';
3
+
4
+ type NeuSchedulerGanttScale = 'day' | 'week';
5
+ interface NeuSchedulerGanttTask {
6
+ id: string;
7
+ title: string;
8
+ start: string | Date;
9
+ end?: string | Date;
10
+ subtitle?: string;
11
+ meta?: string;
12
+ variant?: NeuTimelineGridItemVariant;
13
+ progress?: number;
14
+ }
15
+ interface NeuSchedulerGanttRow {
16
+ id: string;
17
+ label: string;
18
+ description?: string;
19
+ tasks: NeuSchedulerGanttTask[];
20
+ }
21
+ interface NeuSchedulerGanttTaskClick {
22
+ rowId: string;
23
+ rowLabel: string;
24
+ task: NeuSchedulerGanttTask;
25
+ }
26
+ interface NeuSchedulerGanttSlotClick {
27
+ rowId: string;
28
+ columnId: string;
29
+ date: string;
30
+ scale: NeuSchedulerGanttScale;
31
+ }
32
+ interface NeuSchedulerGanttSelectedSlot {
33
+ rowId: string;
34
+ date: string | Date;
35
+ }
36
+ declare class NeuSchedulerGanttComponent {
37
+ readonly rows: _angular_core.InputSignal<NeuSchedulerGanttRow[]>;
38
+ readonly startDate: _angular_core.InputSignal<string | Date | null>;
39
+ readonly endDate: _angular_core.InputSignal<string | Date | null>;
40
+ readonly locale: _angular_core.InputSignal<string | undefined>;
41
+ readonly scale: _angular_core.InputSignal<NeuSchedulerGanttScale>;
42
+ readonly title: _angular_core.InputSignal<string>;
43
+ readonly compact: _angular_core.InputSignal<boolean>;
44
+ readonly stickyLabels: _angular_core.InputSignal<boolean>;
45
+ readonly minColumnWidth: _angular_core.InputSignal<string>;
46
+ readonly showSummary: _angular_core.InputSignal<boolean>;
47
+ readonly selectedTaskId: _angular_core.InputSignal<string | null>;
48
+ readonly selectedSlot: _angular_core.InputSignal<NeuSchedulerGanttSelectedSlot | null>;
49
+ readonly taskClick: _angular_core.OutputEmitterRef<NeuSchedulerGanttTaskClick>;
50
+ readonly slotClick: _angular_core.OutputEmitterRef<NeuSchedulerGanttSlotClick>;
51
+ readonly _bounds: _angular_core.Signal<{
52
+ start: Date;
53
+ end: Date;
54
+ }>;
55
+ readonly gridColumns: _angular_core.Signal<NeuTimelineGridColumn[]>;
56
+ readonly gridRows: _angular_core.Signal<NeuTimelineGridRow[]>;
57
+ readonly taskCount: _angular_core.Signal<number>;
58
+ readonly rangeLabel: _angular_core.Signal<string>;
59
+ readonly gridSelectedSlot: _angular_core.Signal<NeuTimelineGridSlotSelection | null>;
60
+ private readonly _taskIndex;
61
+ onTaskClick(item: NeuTimelineGridItem): void;
62
+ onSlotClick(selection: NeuTimelineGridSlotSelection): void;
63
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSchedulerGanttComponent, never>;
64
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSchedulerGanttComponent, "neu-scheduler-gantt", never, { "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "startDate": { "alias": "startDate"; "required": false; "isSignal": true; }; "endDate": { "alias": "endDate"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "stickyLabels": { "alias": "stickyLabels"; "required": false; "isSignal": true; }; "minColumnWidth": { "alias": "minColumnWidth"; "required": false; "isSignal": true; }; "showSummary": { "alias": "showSummary"; "required": false; "isSignal": true; }; "selectedTaskId": { "alias": "selectedTaskId"; "required": false; "isSignal": true; }; "selectedSlot": { "alias": "selectedSlot"; "required": false; "isSignal": true; }; }, { "taskClick": "taskClick"; "slotClick": "slotClick"; }, never, never, true, never>;
65
+ }
66
+
67
+ export { NeuSchedulerGanttComponent };
68
+ export type { NeuSchedulerGanttRow, NeuSchedulerGanttScale, NeuSchedulerGanttSelectedSlot, NeuSchedulerGanttSlotClick, NeuSchedulerGanttTask, NeuSchedulerGanttTaskClick };
@@ -75,7 +75,9 @@ declare class NeuSelectComponent implements ControlValueAccessor {
75
75
  private readonly _urlState;
76
76
  private readonly _mobileViewportMax;
77
77
  private readonly _viewportMargin;
78
+ private readonly _panelMaxHeight;
78
79
  private readonly _urlParamSignals;
80
+ private readonly _viewport;
79
81
  private _getUrlParamSignal;
80
82
  constructor();
81
83
  /** @internal — ID \u00fanico para asociar label con trigger */
@@ -107,6 +109,10 @@ declare class NeuSelectComponent implements ControlValueAccessor {
107
109
  searchPlaceholder: _angular_core.InputSignal<string>;
108
110
  /** Muestra un botón para limpiar la selección / Shows a button to clear the selection */
109
111
  clearable: _angular_core.InputSignal<boolean>;
112
+ /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */
113
+ virtualScroll: _angular_core.InputSignal<boolean>;
114
+ /** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */
115
+ virtualScrollVisibleItems: _angular_core.InputSignal<number>;
110
116
  /** Texto cuando no hay opciones tras filtrar / Text when no options remain after filtering */
111
117
  noResultsMessage: _angular_core.InputSignal<string>;
112
118
  /** Aria-label del botón de limpiar / Aria-label for the clear button */
@@ -129,16 +135,21 @@ declare class NeuSelectComponent implements ControlValueAccessor {
129
135
  readonly panelPosition: _angular_core.WritableSignal<{
130
136
  position: string | null;
131
137
  top: string | null;
138
+ bottom: string | null;
132
139
  left: string | null;
133
140
  width: string | null;
134
141
  maxHeight: string | null;
135
142
  }>;
143
+ readonly isPanelAbove: _angular_core.WritableSignal<boolean>;
136
144
  readonly hasError: Signal<boolean>;
137
145
  readonly describedBy: Signal<string | null>;
138
146
  readonly filteredOptions: Signal<NeuSelectOption[]>;
139
147
  readonly selectedLabel: Signal<string | null>;
140
148
  readonly _selectedOption: Signal<NeuSelectOption | null>;
141
149
  readonly resultsAnnouncement: Signal<string>;
150
+ readonly virtualScrollItemSize: Signal<36 | 52 | 44>;
151
+ readonly virtualViewportHeight: Signal<string>;
152
+ readonly trackByOptionValue: (_index: number, option: NeuSelectOption) => string;
142
153
  private _onChange;
143
154
  private _onTouched;
144
155
  writeValue(val: string | null): void;
@@ -161,9 +172,11 @@ declare class NeuSelectComponent implements ControlValueAccessor {
161
172
  onWindowResize(): void;
162
173
  onWindowScroll(): void;
163
174
  private syncPanelPosition;
175
+ private focusFirstOption;
176
+ private focusOption;
164
177
  private resetPanelPosition;
165
178
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSelectComponent, never>;
166
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSelectComponent, "neu-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "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; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "noResultsMessage": { "alias": "noResultsMessage"; "required": false; "isSignal": true; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; "urlParam": { "alias": "urlParam"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, ["itemTpl", "selectedItemTpl"], never, true, never>;
179
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSelectComponent, "neu-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "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; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "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; }; "noResultsMessage": { "alias": "noResultsMessage"; "required": false; "isSignal": true; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; "urlParam": { "alias": "urlParam"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, ["itemTpl", "selectedItemTpl"], never, true, never>;
167
180
  }
168
181
 
169
182
  export { NeuSelectComponent, NeuSelectItemDirective, NeuSelectSelectedDirective };
@@ -23,6 +23,7 @@ import * as _angular_core from '@angular/core';
23
23
  declare class NeuSidebarComponent {
24
24
  private readonly document;
25
25
  private readonly urlState;
26
+ private readonly openParam;
26
27
  /** Posición del sidebar: izquierda o derecha de la pantalla / Sidebar position: left or right of the screen */
27
28
  side: _angular_core.InputSignal<"left" | "right">;
28
29
  /** QueryParam que controla el estado. Default: 'menu' (?menu=open) / QueryParam that controls the state. Default: 'menu' (?menu=open) */