@neural-ui/core 1.2.1 → 1.3.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 (239) hide show
  1. package/README.md +56 -88
  2. package/accordion/package.json +4 -0
  3. package/alert/package.json +4 -0
  4. package/autocomplete/package.json +4 -0
  5. package/avatar/package.json +4 -0
  6. package/badge/package.json +4 -0
  7. package/block-ui/package.json +4 -0
  8. package/breadcrumb/package.json +4 -0
  9. package/button/package.json +4 -0
  10. package/card/package.json +4 -0
  11. package/chart/package.json +4 -0
  12. package/checkbox/package.json +4 -0
  13. package/chip/package.json +4 -0
  14. package/code-block/package.json +4 -0
  15. package/color-picker/package.json +4 -0
  16. package/command-palette/package.json +4 -0
  17. package/confirm-dialog/package.json +4 -0
  18. package/context-menu/package.json +4 -0
  19. package/dashboard-grid/package.json +4 -0
  20. package/date-input/package.json +4 -0
  21. package/divider/package.json +4 -0
  22. package/empty-state/package.json +4 -0
  23. package/fesm2022/neural-ui-core-accordion.mjs +162 -0
  24. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -0
  25. package/fesm2022/neural-ui-core-alert.mjs +116 -0
  26. package/fesm2022/neural-ui-core-alert.mjs.map +1 -0
  27. package/fesm2022/neural-ui-core-autocomplete.mjs +332 -0
  28. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -0
  29. package/fesm2022/neural-ui-core-avatar.mjs +109 -0
  30. package/fesm2022/neural-ui-core-avatar.mjs.map +1 -0
  31. package/fesm2022/neural-ui-core-badge.mjs +54 -0
  32. package/fesm2022/neural-ui-core-badge.mjs.map +1 -0
  33. package/fesm2022/neural-ui-core-block-ui.mjs +95 -0
  34. package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -0
  35. package/fesm2022/neural-ui-core-breadcrumb.mjs +84 -0
  36. package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -0
  37. package/fesm2022/neural-ui-core-button.mjs +125 -0
  38. package/fesm2022/neural-ui-core-button.mjs.map +1 -0
  39. package/fesm2022/neural-ui-core-card.mjs +69 -0
  40. package/fesm2022/neural-ui-core-card.mjs.map +1 -0
  41. package/fesm2022/neural-ui-core-chart.mjs +287 -0
  42. package/fesm2022/neural-ui-core-chart.mjs.map +1 -0
  43. package/fesm2022/neural-ui-core-checkbox.mjs +138 -0
  44. package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -0
  45. package/fesm2022/neural-ui-core-chip.mjs +130 -0
  46. package/fesm2022/neural-ui-core-chip.mjs.map +1 -0
  47. package/fesm2022/neural-ui-core-code-block.mjs +250 -0
  48. package/fesm2022/neural-ui-core-code-block.mjs.map +1 -0
  49. package/fesm2022/neural-ui-core-color-picker.mjs +435 -0
  50. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -0
  51. package/fesm2022/neural-ui-core-command-palette.mjs +235 -0
  52. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -0
  53. package/fesm2022/neural-ui-core-confirm-dialog.mjs +118 -0
  54. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -0
  55. package/fesm2022/neural-ui-core-context-menu.mjs +158 -0
  56. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -0
  57. package/fesm2022/neural-ui-core-dashboard-grid.mjs +144 -0
  58. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -0
  59. package/fesm2022/neural-ui-core-date-input.mjs +1332 -0
  60. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -0
  61. package/fesm2022/neural-ui-core-divider.mjs +54 -0
  62. package/fesm2022/neural-ui-core-divider.mjs.map +1 -0
  63. package/fesm2022/neural-ui-core-empty-state.mjs +84 -0
  64. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -0
  65. package/fesm2022/neural-ui-core-filter-bar.mjs +118 -0
  66. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -0
  67. package/fesm2022/neural-ui-core-icon.mjs +50 -0
  68. package/fesm2022/neural-ui-core-icon.mjs.map +1 -0
  69. package/fesm2022/neural-ui-core-image-viewer.mjs +309 -0
  70. package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -0
  71. package/fesm2022/neural-ui-core-input-otp.mjs +192 -0
  72. package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -0
  73. package/fesm2022/neural-ui-core-input.mjs +320 -0
  74. package/fesm2022/neural-ui-core-input.mjs.map +1 -0
  75. package/fesm2022/neural-ui-core-knob.mjs +323 -0
  76. package/fesm2022/neural-ui-core-knob.mjs.map +1 -0
  77. package/fesm2022/neural-ui-core-meter-group.mjs +122 -0
  78. package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -0
  79. package/fesm2022/neural-ui-core-modal.mjs +156 -0
  80. package/fesm2022/neural-ui-core-modal.mjs.map +1 -0
  81. package/fesm2022/neural-ui-core-multiselect.mjs +748 -0
  82. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -0
  83. package/fesm2022/neural-ui-core-nav.mjs +952 -0
  84. package/fesm2022/neural-ui-core-nav.mjs.map +1 -0
  85. package/fesm2022/neural-ui-core-notification-center.mjs +264 -0
  86. package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -0
  87. package/fesm2022/neural-ui-core-number-input.mjs +331 -0
  88. package/fesm2022/neural-ui-core-number-input.mjs.map +1 -0
  89. package/fesm2022/neural-ui-core-pagination.mjs +198 -0
  90. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -0
  91. package/fesm2022/neural-ui-core-popover.mjs +207 -0
  92. package/fesm2022/neural-ui-core-popover.mjs.map +1 -0
  93. package/fesm2022/neural-ui-core-progress-bar.mjs +105 -0
  94. package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -0
  95. package/fesm2022/neural-ui-core-radio.mjs +171 -0
  96. package/fesm2022/neural-ui-core-radio.mjs.map +1 -0
  97. package/fesm2022/neural-ui-core-rating.mjs +151 -0
  98. package/fesm2022/neural-ui-core-rating.mjs.map +1 -0
  99. package/fesm2022/neural-ui-core-select.mjs +638 -0
  100. package/fesm2022/neural-ui-core-select.mjs.map +1 -0
  101. package/fesm2022/neural-ui-core-sidebar.mjs +214 -0
  102. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -0
  103. package/fesm2022/neural-ui-core-skeleton.mjs +40 -0
  104. package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -0
  105. package/fesm2022/neural-ui-core-slider.mjs +146 -0
  106. package/fesm2022/neural-ui-core-slider.mjs.map +1 -0
  107. package/fesm2022/neural-ui-core-spinner.mjs +113 -0
  108. package/fesm2022/neural-ui-core-spinner.mjs.map +1 -0
  109. package/fesm2022/neural-ui-core-split-button.mjs +252 -0
  110. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -0
  111. package/fesm2022/neural-ui-core-splitter.mjs +174 -0
  112. package/fesm2022/neural-ui-core-splitter.mjs.map +1 -0
  113. package/fesm2022/neural-ui-core-stats-card.mjs +163 -0
  114. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -0
  115. package/fesm2022/neural-ui-core-stepper.mjs +204 -0
  116. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -0
  117. package/fesm2022/neural-ui-core-switch.mjs +111 -0
  118. package/fesm2022/neural-ui-core-switch.mjs.map +1 -0
  119. package/fesm2022/neural-ui-core-table.mjs +1860 -0
  120. package/fesm2022/neural-ui-core-table.mjs.map +1 -0
  121. package/fesm2022/neural-ui-core-tabs.mjs +246 -0
  122. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -0
  123. package/fesm2022/neural-ui-core-textarea.mjs +188 -0
  124. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -0
  125. package/fesm2022/neural-ui-core-timeline.mjs +117 -0
  126. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -0
  127. package/fesm2022/neural-ui-core-toast.mjs +171 -0
  128. package/fesm2022/neural-ui-core-toast.mjs.map +1 -0
  129. package/fesm2022/neural-ui-core-toggle-button-group.mjs +162 -0
  130. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -0
  131. package/fesm2022/neural-ui-core-toolbar.mjs +67 -0
  132. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -0
  133. package/fesm2022/neural-ui-core-tooltip.mjs +151 -0
  134. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -0
  135. package/fesm2022/neural-ui-core-url-state.mjs +96 -0
  136. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -0
  137. package/fesm2022/neural-ui-core-virtual-list.mjs +126 -0
  138. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -0
  139. package/fesm2022/neural-ui-core.mjs +11 -8544
  140. package/fesm2022/neural-ui-core.mjs.map +1 -1
  141. package/filter-bar/package.json +4 -0
  142. package/icon/package.json +4 -0
  143. package/image-viewer/package.json +4 -0
  144. package/input/package.json +4 -0
  145. package/input-otp/package.json +4 -0
  146. package/knob/package.json +4 -0
  147. package/meter-group/package.json +4 -0
  148. package/modal/package.json +4 -0
  149. package/multiselect/package.json +4 -0
  150. package/nav/package.json +4 -0
  151. package/notification-center/package.json +4 -0
  152. package/number-input/package.json +4 -0
  153. package/package.json +252 -5
  154. package/pagination/package.json +4 -0
  155. package/popover/package.json +4 -0
  156. package/progress-bar/package.json +4 -0
  157. package/radio/package.json +4 -0
  158. package/rating/package.json +4 -0
  159. package/select/package.json +4 -0
  160. package/sidebar/package.json +4 -0
  161. package/skeleton/package.json +4 -0
  162. package/slider/package.json +4 -0
  163. package/spinner/package.json +4 -0
  164. package/split-button/package.json +4 -0
  165. package/splitter/package.json +4 -0
  166. package/stats-card/package.json +4 -0
  167. package/stepper/package.json +4 -0
  168. package/styles/_tokens.scss +202 -0
  169. package/styles.scss +1 -0
  170. package/switch/package.json +4 -0
  171. package/table/package.json +4 -0
  172. package/tabs/package.json +4 -0
  173. package/textarea/package.json +4 -0
  174. package/timeline/package.json +4 -0
  175. package/toast/package.json +4 -0
  176. package/toggle-button-group/package.json +4 -0
  177. package/toolbar/package.json +4 -0
  178. package/tooltip/package.json +4 -0
  179. package/types/neural-ui-core-accordion.d.ts +55 -0
  180. package/types/neural-ui-core-alert.d.ts +47 -0
  181. package/types/neural-ui-core-autocomplete.d.ts +69 -0
  182. package/types/neural-ui-core-avatar.d.ts +39 -0
  183. package/types/neural-ui-core-badge.d.ts +36 -0
  184. package/types/neural-ui-core-block-ui.d.ts +46 -0
  185. package/types/neural-ui-core-breadcrumb.d.ts +38 -0
  186. package/types/neural-ui-core-button.d.ts +55 -0
  187. package/types/neural-ui-core-card.d.ts +37 -0
  188. package/types/neural-ui-core-chart.d.ts +236 -0
  189. package/types/neural-ui-core-checkbox.d.ts +33 -0
  190. package/types/neural-ui-core-chip.d.ts +53 -0
  191. package/types/neural-ui-core-code-block.d.ts +55 -0
  192. package/types/neural-ui-core-color-picker.d.ts +55 -0
  193. package/types/neural-ui-core-command-palette.d.ts +56 -0
  194. package/types/neural-ui-core-confirm-dialog.d.ts +50 -0
  195. package/types/neural-ui-core-context-menu.d.ts +66 -0
  196. package/types/neural-ui-core-dashboard-grid.d.ts +41 -0
  197. package/types/neural-ui-core-date-input.d.ts +178 -0
  198. package/types/neural-ui-core-divider.d.ts +20 -0
  199. package/types/neural-ui-core-empty-state.d.ts +32 -0
  200. package/types/neural-ui-core-filter-bar.d.ts +49 -0
  201. package/types/neural-ui-core-icon.d.ts +33 -0
  202. package/types/neural-ui-core-image-viewer.d.ts +67 -0
  203. package/types/neural-ui-core-input-otp.d.ts +49 -0
  204. package/types/neural-ui-core-input.d.ts +86 -0
  205. package/types/neural-ui-core-knob.d.ts +68 -0
  206. package/types/neural-ui-core-meter-group.d.ts +52 -0
  207. package/types/neural-ui-core-modal.d.ts +54 -0
  208. package/types/neural-ui-core-multiselect.d.ts +129 -0
  209. package/types/neural-ui-core-nav.d.ts +69 -0
  210. package/types/neural-ui-core-notification-center.d.ts +60 -0
  211. package/types/neural-ui-core-number-input.d.ts +63 -0
  212. package/types/neural-ui-core-pagination.d.ts +30 -0
  213. package/types/neural-ui-core-popover.d.ts +73 -0
  214. package/types/neural-ui-core-progress-bar.d.ts +35 -0
  215. package/types/neural-ui-core-radio.d.ts +51 -0
  216. package/types/neural-ui-core-rating.d.ts +34 -0
  217. package/types/neural-ui-core-select.d.ts +161 -0
  218. package/types/neural-ui-core-sidebar.d.ts +57 -0
  219. package/types/neural-ui-core-skeleton.d.ts +22 -0
  220. package/types/neural-ui-core-slider.d.ts +42 -0
  221. package/types/neural-ui-core-spinner.d.ts +38 -0
  222. package/types/neural-ui-core-split-button.d.ts +65 -0
  223. package/types/neural-ui-core-splitter.d.ts +28 -0
  224. package/types/neural-ui-core-stats-card.d.ts +39 -0
  225. package/types/neural-ui-core-stepper.d.ts +51 -0
  226. package/types/neural-ui-core-switch.d.ts +34 -0
  227. package/types/neural-ui-core-table.d.ts +282 -0
  228. package/types/neural-ui-core-tabs.d.ts +76 -0
  229. package/types/neural-ui-core-textarea.d.ts +52 -0
  230. package/types/neural-ui-core-timeline.d.ts +33 -0
  231. package/types/neural-ui-core-toast.d.ts +70 -0
  232. package/types/neural-ui-core-toggle-button-group.d.ts +63 -0
  233. package/types/neural-ui-core-toolbar.d.ts +36 -0
  234. package/types/neural-ui-core-tooltip.d.ts +48 -0
  235. package/types/neural-ui-core-url-state.d.ts +58 -0
  236. package/types/neural-ui-core-virtual-list.d.ts +60 -0
  237. package/types/neural-ui-core.d.ts +3 -2105
  238. package/url-state/package.json +4 -0
  239. package/virtual-list/package.json +4 -0
@@ -0,0 +1,282 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { TemplateRef } from '@angular/core';
3
+ import { FormControl } from '@angular/forms';
4
+ import { NeuSelectOption } from '@neural-ui/core/select';
5
+
6
+ /**
7
+ * Directiva para definir el template de expansión de fila en NeuTable.
8
+ *
9
+ * Uso:
10
+ * ```html
11
+ * <neu-table [expandable]="true" [columns]="cols" [data]="rows">
12
+ * <ng-template neuTableExpand let-row>
13
+ * <div>{{ row.details }}</div>
14
+ * </ng-template>
15
+ * </neu-table>
16
+ * ```
17
+ */
18
+ declare class NeuTableExpandDirective {
19
+ readonly templateRef: TemplateRef<{
20
+ $implicit: Record<string, unknown>;
21
+ }>;
22
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTableExpandDirective, never>;
23
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NeuTableExpandDirective, "ng-template[neuTableExpand]", never, {}, {}, never, never, true, never>;
24
+ }
25
+
26
+ type NeuTableBadgeVariant = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'default';
27
+ interface NeuTableBadgeConfig {
28
+ /** Etiqueta visible. Si se omite, se muestra el valor bruto. */
29
+ label?: string;
30
+ variant: NeuTableBadgeVariant;
31
+ }
32
+ interface NeuTableAction<T = Record<string, unknown>> {
33
+ key: string;
34
+ label: string;
35
+ icon: string;
36
+ variant?: 'ghost' | 'primary' | 'danger';
37
+ show?: (row: T) => boolean;
38
+ disabled?: (row: T) => boolean;
39
+ /** Texto de confirmación inline. Requiere segunda pulsación. */
40
+ confirm?: string;
41
+ }
42
+ interface NeuTableActionEvent<T = Record<string, unknown>> {
43
+ action: NeuTableAction<T>;
44
+ row: T;
45
+ }
46
+ interface NeuTableSortEntry {
47
+ key: string;
48
+ dir: 'asc' | 'desc';
49
+ }
50
+ interface NeuTableServerState {
51
+ page: number;
52
+ pageSize: number;
53
+ search: string;
54
+ sortKey: string;
55
+ sortDir: 'asc' | 'desc';
56
+ sortEntries: NeuTableSortEntry[];
57
+ columnFilters: Record<string, unknown>;
58
+ }
59
+ type NeuTableCellType = 'text' | 'badge' | 'date' | 'number' | 'currency' | 'link' | 'actions';
60
+ interface NeuTableColumn<T = Record<string, unknown>> {
61
+ key: string;
62
+ header: string;
63
+ width?: string;
64
+ align?: 'left' | 'center' | 'right';
65
+ cell?: (row: T) => string;
66
+ cellTemplate?: TemplateRef<{
67
+ $implicit: T;
68
+ row: T;
69
+ column: NeuTableColumn<T>;
70
+ }>;
71
+ cellClass?: string;
72
+ sortable?: boolean;
73
+ type?: NeuTableCellType;
74
+ badgeMap?: Record<string, NeuTableBadgeConfig>;
75
+ dateFormat?: Intl.DateTimeFormatOptions;
76
+ locale?: string;
77
+ numberFormat?: Intl.NumberFormatOptions;
78
+ currencyCode?: string;
79
+ linkHref?: (row: T) => string;
80
+ linkTarget?: '_blank' | '_self';
81
+ actions?: NeuTableAction<T>[];
82
+ filterable?: boolean;
83
+ filterType?: 'text' | 'select' | 'number-range' | 'date';
84
+ filterOptions?: string[];
85
+ frozen?: 'left' | 'right';
86
+ headerTemplate?: TemplateRef<{
87
+ $implicit: NeuTableColumn<T>;
88
+ }>;
89
+ }
90
+
91
+ type Row = Record<string, unknown>;
92
+ /**
93
+ * NeuralUI Table — Componente Estrella
94
+ *
95
+ * Tabla de datos con:
96
+ * - Búsqueda/filtrado → ?q=...
97
+ * - Paginación → ?page=...
98
+ * - Ordenación → ?sort=col&sortDir=asc|desc
99
+ * - Selección de filas (múltiple) opcional
100
+ * - Skeleton de carga animado
101
+ * - Scroll horizontal elegante en mobile (<400px)
102
+ *
103
+ * Uso básico:
104
+ * <neu-table [columns]="cols" [data]="rows" />
105
+ *
106
+ * Múltiples tablas por página:
107
+ * <neu-table pageParam="userPage" searchParam="userQ" sortParam="userSort" ... />
108
+ */
109
+ declare class NeuTableComponent {
110
+ private readonly _destroyRef;
111
+ private readonly _urlState;
112
+ private readonly _platformId;
113
+ readonly expandTemplate: _angular_core.Signal<NeuTableExpandDirective | undefined>;
114
+ readonly columns: _angular_core.InputSignal<NeuTableColumn<Record<string, unknown>>[]>;
115
+ readonly data: _angular_core.InputSignal<object[]>;
116
+ readonly pageSize: _angular_core.InputSignal<number>;
117
+ readonly loading: _angular_core.InputSignal<boolean>;
118
+ readonly title: _angular_core.InputSignal<string>;
119
+ readonly emptyMessage: _angular_core.InputSignal<string>;
120
+ readonly skeletonRows: _angular_core.InputSignal<number[]>;
121
+ readonly searchable: _angular_core.InputSignal<boolean>;
122
+ readonly searchPlaceholder: _angular_core.InputSignal<string>;
123
+ readonly exactMatchable: _angular_core.InputSignal<boolean>;
124
+ readonly exactMatchLabel: _angular_core.InputSignal<string>;
125
+ readonly searchAriaLabel: _angular_core.InputSignal<string>;
126
+ readonly clearSearchAriaLabel: _angular_core.InputSignal<string>;
127
+ readonly clearFilterLabel: _angular_core.InputSignal<string>;
128
+ readonly previousPageAriaLabel: _angular_core.InputSignal<string>;
129
+ readonly nextPageAriaLabel: _angular_core.InputSignal<string>;
130
+ readonly pageSizeLabel: _angular_core.InputSignal<string>;
131
+ readonly pageSizeAriaLabel: _angular_core.InputSignal<string>;
132
+ readonly paginationAriaLabel: _angular_core.InputSignal<string>;
133
+ readonly exportCsvTitle: _angular_core.InputSignal<string>;
134
+ readonly exportJsonTitle: _angular_core.InputSignal<string>;
135
+ readonly clearSelectionLabel: _angular_core.InputSignal<string>;
136
+ readonly selectionSummaryLabel: _angular_core.InputSignal<string>;
137
+ readonly tableAriaLabel: _angular_core.InputSignal<string>;
138
+ readonly selectAllAriaLabel: _angular_core.InputSignal<string>;
139
+ readonly selectRowAriaLabel: _angular_core.InputSignal<string>;
140
+ readonly expandRowAriaLabel: _angular_core.InputSignal<string>;
141
+ readonly filterPlaceholder: _angular_core.InputSignal<string>;
142
+ readonly filterAriaPrefix: _angular_core.InputSignal<string>;
143
+ readonly allFilterOptionLabel: _angular_core.InputSignal<string>;
144
+ readonly ofLabel: _angular_core.InputSignal<string>;
145
+ readonly resultLabelSingular: _angular_core.InputSignal<string>;
146
+ readonly resultLabelPlural: _angular_core.InputSignal<string>;
147
+ readonly sortable: _angular_core.InputSignal<boolean>;
148
+ readonly selectable: _angular_core.InputSignal<boolean>;
149
+ readonly expandable: _angular_core.InputSignal<boolean>;
150
+ readonly exportable: _angular_core.InputSignal<boolean>;
151
+ readonly exportFileName: _angular_core.InputSignal<string>;
152
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
153
+ readonly stickyHeader: _angular_core.InputSignal<boolean>;
154
+ readonly rowKey: _angular_core.InputSignal<string>;
155
+ readonly density: _angular_core.InputSignal<"compact" | "normal" | "relaxed">;
156
+ readonly showRowNumbers: _angular_core.InputSignal<boolean>;
157
+ readonly rowClass: _angular_core.InputSignal<((row: Row) => string) | undefined>;
158
+ readonly footerRow: _angular_core.InputSignal<Record<string, string | number> | undefined>;
159
+ readonly emptyStateTemplate: _angular_core.InputSignal<TemplateRef<void> | undefined>;
160
+ readonly serverSide: _angular_core.InputSignal<boolean>;
161
+ readonly totalItems: _angular_core.InputSignal<number | undefined>;
162
+ readonly multiSort: _angular_core.InputSignal<boolean>;
163
+ readonly exportFormats: _angular_core.InputSignal<("csv" | "json")[]>;
164
+ readonly exportColumns: _angular_core.InputSignal<string[]>;
165
+ readonly pageParam: _angular_core.InputSignal<string>;
166
+ readonly searchParam: _angular_core.InputSignal<string>;
167
+ readonly sortParam: _angular_core.InputSignal<string>;
168
+ readonly sortDirParam: _angular_core.InputSignal<string>;
169
+ /** Param used to persist multi-sort state in the URL / Param para persistir multisort en la URL */
170
+ readonly multiSortParam: _angular_core.InputSignal<string>;
171
+ /**
172
+ * Activa o desactiva la sincronización de estado con los queryParams de la URL.
173
+ * Cuando es false, la paginación, búsqueda y ordenación se gestionan con
174
+ * señales internas sin tocar la URL del navegador.
175
+ *
176
+ * Enables or disables URL query-param synchronization.
177
+ * When false, pagination, search and sort are managed with internal signals
178
+ * and the browser URL is never modified.
179
+ */
180
+ readonly useUrlState: _angular_core.InputSignal<boolean>;
181
+ readonly selectionChange: _angular_core.OutputEmitterRef<Row[]>;
182
+ readonly rowClick: _angular_core.OutputEmitterRef<Row>;
183
+ readonly rowDblClick: _angular_core.OutputEmitterRef<Row>;
184
+ readonly actionClick: _angular_core.OutputEmitterRef<NeuTableActionEvent<Row>>;
185
+ readonly serverStateChange: _angular_core.OutputEmitterRef<NeuTableServerState>;
186
+ readonly searchChange: _angular_core.OutputEmitterRef<string>;
187
+ private readonly _internalPage;
188
+ private readonly _internalSearch;
189
+ private readonly _internalSortKey;
190
+ private readonly _internalSortDir;
191
+ private readonly _internalMultiSort;
192
+ readonly currentPage: _angular_core.Signal<number>;
193
+ readonly searchQuery: _angular_core.Signal<string>;
194
+ readonly sortKey: _angular_core.Signal<string>;
195
+ readonly sortDir: _angular_core.Signal<"asc" | "desc">;
196
+ private readonly rows;
197
+ private readonly _exactMatch;
198
+ readonly exactMatch: _angular_core.Signal<boolean>;
199
+ /**
200
+ * Multi-sort entries derived from URL param or internal state.
201
+ * Entradas de multisort derivadas del param de URL o del estado interno.
202
+ */
203
+ readonly _sortEntries: _angular_core.Signal<NeuTableSortEntry[]>;
204
+ readonly _columnFilters: _angular_core.WritableSignal<Record<string, unknown>>;
205
+ readonly _pageSizeControl: FormControl<string>;
206
+ private readonly _columnFilterControls;
207
+ /** True when at least one column has filterable:true / True si alguna columna tiene filterable:true */
208
+ readonly _hasFilterableCol: _angular_core.Signal<boolean>;
209
+ /** Convierte filterOptions de string[] a NeuSelectOption[] con opción "Todos" al inicio.
210
+ * Converts filterOptions from string[] to NeuSelectOption[] with a leading "All" option. */
211
+ _filterOpts(col: NeuTableColumn): NeuSelectOption[];
212
+ readonly _pageSizeOptions: _angular_core.Signal<NeuSelectOption[]>;
213
+ constructor();
214
+ private readonly _confirmPending;
215
+ private readonly _rows;
216
+ readonly filteredData: _angular_core.Signal<Row[]>;
217
+ readonly sortedData: _angular_core.Signal<Row[]>;
218
+ private readonly _dynamicPageSize;
219
+ readonly effectivePageSize: _angular_core.Signal<number>;
220
+ readonly totalPages: _angular_core.Signal<number>;
221
+ readonly paginatedData: _angular_core.Signal<Row[]>;
222
+ readonly pageNumbers: _angular_core.Signal<number[]>;
223
+ readonly paginationInfo: _angular_core.Signal<string>;
224
+ readonly totalColspan: _angular_core.Signal<number>;
225
+ /** Calcula el offset izquierdo acumulado para columnas frozen-left múltiples.
226
+ * Calculates cumulative left offset for multiple frozen-left columns. */
227
+ readonly _frozenLeftOffsets: _angular_core.Signal<Map<string, number>>;
228
+ readonly _lastFrozenLeftKey: _angular_core.Signal<string | null>;
229
+ readonly _firstFrozenRightKey: _angular_core.Signal<string>;
230
+ isLastFrozenLeftColumn(key: string): boolean;
231
+ isFirstFrozenRightColumn(key: string): boolean;
232
+ private readonly _expandedKeys;
233
+ isRowExpanded(row: Row): boolean;
234
+ toggleExpand(row: Row): void;
235
+ private readonly _selectedKeys;
236
+ readonly selectedCount: _angular_core.Signal<number>;
237
+ readonly selectedRowsInfo: _angular_core.Signal<string>;
238
+ /**
239
+ * TRUE cuando TODOS los registros que pasan el filtro activo están seleccionados.
240
+ * A diferencia de una selección global, actúa solo sobre el subconjunto filtrado.
241
+ */
242
+ readonly isAllFilteredSelected: _angular_core.Signal<boolean>;
243
+ readonly isSomeFilteredSelected: _angular_core.Signal<boolean>;
244
+ isRowSelected(row: Row): boolean;
245
+ toggleRow(row: Row): void;
246
+ /** Selecciona/deselecciona SOLO los datos filtrados activos. */
247
+ toggleAll(): void;
248
+ clearSelection(): void;
249
+ private _emitSelection;
250
+ goToPage(page: number): void;
251
+ sortBy(key: string, event?: MouseEvent): void;
252
+ onRowClick(row: Row, _event: MouseEvent): void;
253
+ onSearch(event: Event): void;
254
+ clearSearch(): void;
255
+ onPageSizeChange(value: string | number | {
256
+ target?: {
257
+ value?: unknown;
258
+ };
259
+ } | null): void;
260
+ setExactMatch(value: boolean): void;
261
+ setColumnFilter(colKey: string, value: unknown): void;
262
+ clearColumnFilters(): void;
263
+ isConfirmPending(row: Row, action: NeuTableAction<Row>): boolean;
264
+ handleAction(row: Row, action: NeuTableAction<Row>): void;
265
+ cancelConfirm(): void;
266
+ exportCsv(): void;
267
+ exportJson(): void;
268
+ private _getExportColumns;
269
+ private _downloadBlob;
270
+ getRowKey(row: Row): unknown;
271
+ getRowClass(row: Row): string;
272
+ getCellValue(row: Row, col: NeuTableColumn): string;
273
+ getSortPriority(key: string): number;
274
+ columnFilterControl(key: string): FormControl<string>;
275
+ getColumnFilterValue(key: string): unknown;
276
+ private _emitServerState;
277
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTableComponent, never>;
278
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTableComponent, "neu-table", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "skeletonRows": { "alias": "skeletonRows"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "exactMatchable": { "alias": "exactMatchable"; "required": false; "isSignal": true; }; "exactMatchLabel": { "alias": "exactMatchLabel"; "required": false; "isSignal": true; }; "searchAriaLabel": { "alias": "searchAriaLabel"; "required": false; "isSignal": true; }; "clearSearchAriaLabel": { "alias": "clearSearchAriaLabel"; "required": false; "isSignal": true; }; "clearFilterLabel": { "alias": "clearFilterLabel"; "required": false; "isSignal": true; }; "previousPageAriaLabel": { "alias": "previousPageAriaLabel"; "required": false; "isSignal": true; }; "nextPageAriaLabel": { "alias": "nextPageAriaLabel"; "required": false; "isSignal": true; }; "pageSizeLabel": { "alias": "pageSizeLabel"; "required": false; "isSignal": true; }; "pageSizeAriaLabel": { "alias": "pageSizeAriaLabel"; "required": false; "isSignal": true; }; "paginationAriaLabel": { "alias": "paginationAriaLabel"; "required": false; "isSignal": true; }; "exportCsvTitle": { "alias": "exportCsvTitle"; "required": false; "isSignal": true; }; "exportJsonTitle": { "alias": "exportJsonTitle"; "required": false; "isSignal": true; }; "clearSelectionLabel": { "alias": "clearSelectionLabel"; "required": false; "isSignal": true; }; "selectionSummaryLabel": { "alias": "selectionSummaryLabel"; "required": false; "isSignal": true; }; "tableAriaLabel": { "alias": "tableAriaLabel"; "required": false; "isSignal": true; }; "selectAllAriaLabel": { "alias": "selectAllAriaLabel"; "required": false; "isSignal": true; }; "selectRowAriaLabel": { "alias": "selectRowAriaLabel"; "required": false; "isSignal": true; }; "expandRowAriaLabel": { "alias": "expandRowAriaLabel"; "required": false; "isSignal": true; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; "isSignal": true; }; "filterAriaPrefix": { "alias": "filterAriaPrefix"; "required": false; "isSignal": true; }; "allFilterOptionLabel": { "alias": "allFilterOptionLabel"; "required": false; "isSignal": true; }; "ofLabel": { "alias": "ofLabel"; "required": false; "isSignal": true; }; "resultLabelSingular": { "alias": "resultLabelSingular"; "required": false; "isSignal": true; }; "resultLabelPlural": { "alias": "resultLabelPlural"; "required": false; "isSignal": true; }; "sortable": { "alias": "sortable"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "exportable": { "alias": "exportable"; "required": false; "isSignal": true; }; "exportFileName": { "alias": "exportFileName"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "showRowNumbers": { "alias": "showRowNumbers"; "required": false; "isSignal": true; }; "rowClass": { "alias": "rowClass"; "required": false; "isSignal": true; }; "footerRow": { "alias": "footerRow"; "required": false; "isSignal": true; }; "emptyStateTemplate": { "alias": "emptyStateTemplate"; "required": false; "isSignal": true; }; "serverSide": { "alias": "serverSide"; "required": false; "isSignal": true; }; "totalItems": { "alias": "totalItems"; "required": false; "isSignal": true; }; "multiSort": { "alias": "multiSort"; "required": false; "isSignal": true; }; "exportFormats": { "alias": "exportFormats"; "required": false; "isSignal": true; }; "exportColumns": { "alias": "exportColumns"; "required": false; "isSignal": true; }; "pageParam": { "alias": "pageParam"; "required": false; "isSignal": true; }; "searchParam": { "alias": "searchParam"; "required": false; "isSignal": true; }; "sortParam": { "alias": "sortParam"; "required": false; "isSignal": true; }; "sortDirParam": { "alias": "sortDirParam"; "required": false; "isSignal": true; }; "multiSortParam": { "alias": "multiSortParam"; "required": false; "isSignal": true; }; "useUrlState": { "alias": "useUrlState"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "rowClick": "rowClick"; "rowDblClick": "rowDblClick"; "actionClick": "actionClick"; "serverStateChange": "serverStateChange"; "searchChange": "searchChange"; }, ["expandTemplate"], never, true, never>;
279
+ }
280
+
281
+ export { NeuTableComponent, NeuTableExpandDirective };
282
+ export type { NeuTableAction, NeuTableActionEvent, NeuTableBadgeConfig, NeuTableBadgeVariant, NeuTableCellType, NeuTableColumn, NeuTableServerState, NeuTableSortEntry };
@@ -0,0 +1,76 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, AfterViewInit, OnDestroy } from '@angular/core';
3
+
4
+ declare const NEU_TABS_CONTEXT: InjectionToken<NeuTabsComponent>;
5
+ interface NeuTab {
6
+ /** ID único de la pestaña — se usa como valor en la URL / Unique tab ID — used as the URL value */
7
+ id: string;
8
+ /** Etiqueta visible / Visible label */
9
+ label: string;
10
+ /** Badge opcional junto al label / Optional badge next to the label */
11
+ badge?: string;
12
+ /** Deshabilita la pestaña sin ocultarla / Disables the tab without hiding it */
13
+ disabled?: boolean;
14
+ }
15
+ /**
16
+ * NeuralUI Tabs Component
17
+ *
18
+ * Sistema de pestañas con estado sincronizado a la URL via NeuUrlStateService. / Tab system with state synchronized to the URL via NeuUrlStateService.
19
+ * El panel activo se determina por ?{tabParam}={tabId}. / The active panel is determined by ?{tabParam}={tabId}.
20
+ *
21
+ * Uso:
22
+ * <neu-tabs [tabs]="tabs" tabParam="tab">
23
+ * <neu-tab-panel tabId="preview">...</neu-tab-panel>
24
+ * <neu-tab-panel tabId="api">...</neu-tab-panel>
25
+ * </neu-tabs>
26
+ */
27
+ declare class NeuTabsComponent implements AfterViewInit, OnDestroy {
28
+ private readonly urlState;
29
+ private readonly elRef;
30
+ private resizeObserver?;
31
+ constructor();
32
+ /** Definición de pestañas / Tab definitions */
33
+ tabs: _angular_core.InputSignal<NeuTab[]>;
34
+ /** QueryParam que almacena la pestaña activa / QueryParam that stores the active tab */
35
+ tabParam: _angular_core.InputSignal<string>;
36
+ /** Si true, elimina el padding interno de los paneles / If true, removes the internal padding from panels */
37
+ flush: _angular_core.InputSignal<boolean>;
38
+ /** Etiqueta accesible del rol tablist / Accessible label for the tablist role */
39
+ ariaLabel: _angular_core.InputSignal<string>;
40
+ /** Emite al cambiar de pestaña / Emits when the tab changes */
41
+ tabChange: _angular_core.OutputEmitterRef<string>;
42
+ /** ID de la pestaña activa (de la URL o la primera disponible) / Active tab ID (from the URL or the first available) */
43
+ readonly activeTabId: _angular_core.Signal<string>;
44
+ /** Posición del indicador calculada mediante medición DOM / Indicator position calculated via DOM measurement */
45
+ private readonly _indicatorLeft;
46
+ private readonly _indicatorWidth;
47
+ readonly indicatorStyle: _angular_core.Signal<string>;
48
+ ngAfterViewInit(): void;
49
+ ngOnDestroy(): void;
50
+ private _updateIndicator;
51
+ selectTab(tab: NeuTab): void;
52
+ /** Mueve el foco entre tabs con flechas (roving tabindex — WAI-ARIA Tabs Pattern) / Moves focus between tabs with arrows (roving tabindex — WAI-ARIA Tabs Pattern) */
53
+ focusTab(event: Event, dir: 1 | -1 | 'first' | 'last'): void;
54
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTabsComponent, never>;
55
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTabsComponent, "neu-tabs", never, { "tabs": { "alias": "tabs"; "required": false; "isSignal": true; }; "tabParam": { "alias": "tabParam"; "required": false; "isSignal": true; }; "flush": { "alias": "flush"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "tabChange": "tabChange"; }, never, ["*"], true, never>;
56
+ }
57
+ /**
58
+ * NeuralUI Tab Panel
59
+ *
60
+ * Panel de contenido asociado a una pestaña de NeuTabsComponent. / Content panel associated with a NeuTabsComponent tab.
61
+ * Solo se renderiza (no oculta con CSS) cuando la pestaña está activa. / Only rendered (not hidden with CSS) when the tab is active.
62
+ *
63
+ * Uso: hijo directo de <neu-tabs>
64
+ * <neu-tab-panel tabId="api">...</neu-tab-panel>
65
+ */
66
+ declare class NeuTabPanelComponent {
67
+ private readonly tabs;
68
+ /** ID que debe coincidir con NeuTab.id del padre / ID that must match the parent NeuTab.id */
69
+ tabId: _angular_core.InputSignal<string>;
70
+ readonly isActive: _angular_core.Signal<boolean>;
71
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTabPanelComponent, never>;
72
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTabPanelComponent, "neu-tab-panel", never, { "tabId": { "alias": "tabId"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
73
+ }
74
+
75
+ export { NEU_TABS_CONTEXT, NeuTabPanelComponent, NeuTabsComponent };
76
+ export type { NeuTab };
@@ -0,0 +1,52 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ControlValueAccessor } from '@angular/forms';
3
+
4
+ /**
5
+ * NeuralUI Textarea Component
6
+ *
7
+ * Textarea con floating label y soporte completo para Angular Forms.
8
+ * Soporta auto-resize opcional.
9
+ *
10
+ * Uso:
11
+ * <neu-textarea label="Descripción" [formControl]="ctrl" />
12
+ * <neu-textarea label="Bio" [rows]="5" [autoResize]="true" />
13
+ */
14
+ declare class NeuTextareaComponent implements ControlValueAccessor {
15
+ readonly label: _angular_core.InputSignal<string>;
16
+ readonly rows: _angular_core.InputSignal<number>;
17
+ /** Tamaño del campo: 'sm' = compacto | 'md' = estándar | 'lg' = grande / Field size */
18
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
19
+ readonly autoResize: _angular_core.InputSignal<boolean>;
20
+ /** Permite al usuario redimensionar el campo manualmente (por defecto: true) / Allows the user to manually resize the field (default: true) */
21
+ readonly resizable: _angular_core.InputSignal<boolean>;
22
+ readonly errorMessage: _angular_core.InputSignal<string>;
23
+ readonly hint: _angular_core.InputSignal<string>;
24
+ readonly disabled: _angular_core.InputSignal<boolean>;
25
+ readonly readonly: _angular_core.InputSignal<boolean>;
26
+ readonly required: _angular_core.InputSignal<boolean>;
27
+ readonly name: _angular_core.InputSignal<string>;
28
+ readonly maxlength: _angular_core.InputSignal<number | null>;
29
+ readonly _id: string;
30
+ protected readonly _value: _angular_core.WritableSignal<string>;
31
+ protected readonly _focused: _angular_core.WritableSignal<boolean>;
32
+ protected readonly _isDisabled: _angular_core.WritableSignal<boolean>;
33
+ readonly _isDisabledState: _angular_core.Signal<boolean>;
34
+ readonly hasValue: _angular_core.Signal<boolean>;
35
+ readonly hasError: _angular_core.Signal<boolean>;
36
+ readonly _resizeStyle: _angular_core.Signal<"none" | "vertical">;
37
+ private readonly _textareaRef;
38
+ private _onChange;
39
+ private _onTouched;
40
+ constructor();
41
+ onInput(event: Event): void;
42
+ onFocus(): void;
43
+ onBlur(): void;
44
+ writeValue(val: unknown): void;
45
+ registerOnChange(fn: (v: string) => void): void;
46
+ registerOnTouched(fn: () => void): void;
47
+ setDisabledState(isDisabled: boolean): void;
48
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTextareaComponent, never>;
49
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTextareaComponent, "neu-textarea", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "autoResize": { "alias": "autoResize"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "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; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
50
+ }
51
+
52
+ export { NeuTextareaComponent };
@@ -0,0 +1,33 @@
1
+ import * as i0 from '@angular/core';
2
+
3
+ type NeuTimelineItemVariant = 'default' | 'success' | 'warning' | 'danger' | 'info';
4
+ interface NeuTimelineItem {
5
+ /** Etiqueta de tiempo (ej. "Hace 2h", "12 Mar") / Time label (e.g. "2h ago", "Mar 12") */
6
+ time?: string;
7
+ /** Título del evento / Event title */
8
+ title: string;
9
+ /** Descripción opcional / Optional description */
10
+ description?: string;
11
+ /** Variante de color del punto / Dot color variant */
12
+ variant?: NeuTimelineItemVariant;
13
+ /** Icono SVG path opcional / Optional SVG path icon */
14
+ icon?: string;
15
+ }
16
+ /**
17
+ * NeuralUI Timeline Component
18
+ *
19
+ * Lista vertical de eventos cronológicos con línea conectora. / Vertical list of chronological events with a connector line.
20
+ *
21
+ * Uso:
22
+ * <neu-timeline [items]="events" />
23
+ * <neu-timeline [items]="events" align="right" />
24
+ */
25
+ declare class NeuTimelineComponent {
26
+ /** Eventos a mostrar / Events to display */
27
+ items: i0.InputSignal<NeuTimelineItem[]>;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<NeuTimelineComponent, never>;
29
+ static ɵcmp: i0.ɵɵComponentDeclaration<NeuTimelineComponent, "neu-timeline", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
30
+ }
31
+
32
+ export { NeuTimelineComponent };
33
+ export type { NeuTimelineItem, NeuTimelineItemVariant };
@@ -0,0 +1,70 @@
1
+ import * as i0 from '@angular/core';
2
+
3
+ type NeuToastType = 'success' | 'error' | 'info' | 'warning';
4
+ type NeuToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
5
+ interface NeuToastOptions {
6
+ /** Mensaje del toast / Toast message */
7
+ message: string;
8
+ /** Tipo semántico — controla color e icono / Semantic type — controls color and icon */
9
+ type?: NeuToastType;
10
+ /** Duración en ms antes de ocultarse automáticamente. 0 = sin auto-hide / Duration in ms before auto-hiding. 0 = no auto-hide */
11
+ duration?: number;
12
+ /** Título opcional / Optional title */
13
+ title?: string;
14
+ }
15
+ interface NeuToastItem extends Required<Omit<NeuToastOptions, 'title'>> {
16
+ id: string;
17
+ title: string;
18
+ }
19
+
20
+ /**
21
+ * NeuralUI Toast Service
22
+ *
23
+ * Lanza notificaciones flotantes desde cualquier punto de la app.
24
+ * Requiere que `<neu-toast-container>` esté presente en la raíz del app.
25
+ *
26
+ * Uso:
27
+ * const toast = inject(NeuToastService);
28
+ * toast.success('Guardado correctamente');
29
+ * toast.error('Ha ocurrido un error', { title: 'Error', duration: 8000 });
30
+ */
31
+ declare class NeuToastService {
32
+ /** Lista reactiva de toasts activos / Reactive list of active toasts */
33
+ readonly toasts: i0.WritableSignal<NeuToastItem[]>;
34
+ /** Posición del contenedor de toasts / Toast container position */
35
+ readonly position: i0.WritableSignal<NeuToastPosition>;
36
+ setPosition(position: NeuToastPosition): void;
37
+ show(options: NeuToastOptions): string;
38
+ success(message: string, opts?: Partial<NeuToastOptions>): string;
39
+ error(message: string, opts?: Partial<NeuToastOptions>): string;
40
+ info(message: string, opts?: Partial<NeuToastOptions>): string;
41
+ warning(message: string, opts?: Partial<NeuToastOptions>): string;
42
+ dismiss(id: string): void;
43
+ clear(): void;
44
+ static ɵfac: i0.ɵɵFactoryDeclaration<NeuToastService, never>;
45
+ static ɵprov: i0.ɵɵInjectableDeclaration<NeuToastService>;
46
+ }
47
+
48
+ /**
49
+ * NeuralUI Toast Container Component
50
+ *
51
+ * Renderiza los toasts activos del NeuToastService.
52
+ * Añade este componente una sola vez en la raíz del app (app.html).
53
+ *
54
+ * Diseño mobile-first:
55
+ * - < 400px: banner inferior centrado
56
+ * - ≥ 400px: stack en la esquina superior derecha
57
+ *
58
+ * Uso:
59
+ * <!-- en app.html -->
60
+ * <neu-toast-container />
61
+ */
62
+ declare class NeuToastContainerComponent {
63
+ readonly toastService: NeuToastService;
64
+ getIcon(type: NeuToastType): string;
65
+ static ɵfac: i0.ɵɵFactoryDeclaration<NeuToastContainerComponent, never>;
66
+ static ɵcmp: i0.ɵɵComponentDeclaration<NeuToastContainerComponent, "neu-toast-container", never, {}, {}, never, never, true, never>;
67
+ }
68
+
69
+ export { NeuToastContainerComponent, NeuToastService };
70
+ export type { NeuToastItem, NeuToastOptions, NeuToastPosition, NeuToastType };
@@ -0,0 +1,63 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ControlValueAccessor } from '@angular/forms';
3
+ import { NeuButtonSize } from '@neural-ui/core/button';
4
+
5
+ interface NeuToggleOption<T = unknown> {
6
+ /** Texto visible del botón / Visible button text */
7
+ label: string;
8
+ /** Valor asociado a esta opción / Value associated with this option */
9
+ value: T;
10
+ /** Nombre de icono Lucide (opcional) / Lucide icon name (optional) */
11
+ icon?: string;
12
+ /** Deshabilita solo esta opción / Disables this option only */
13
+ disabled?: boolean;
14
+ }
15
+ /**
16
+ * NeuralUI ToggleButtonGroup Component
17
+ *
18
+ * Grupo de botones de selección (single o múltiple). / Selection button group (single or multiple).
19
+ * Selector segmentado para selección única o múltiple. / Segmented selector for single or multiple selection.
20
+ *
21
+ * Uso (single):
22
+ * <neu-toggle-button-group [options]="opts" [formControl]="valueCtrl" />
23
+ *
24
+ * Uso (múltiple):
25
+ * <neu-toggle-button-group [options]="opts" [multiple]="true" [formControl]="valuesCtrl" />
26
+ */
27
+ declare class NeuToggleButtonGroupComponent<T = unknown> implements ControlValueAccessor {
28
+ /** Lista de opciones del grupo / Group option list */
29
+ options: _angular_core.InputSignal<NeuToggleOption<T>[]>;
30
+ /**
31
+ * Permite seleccionar múltiples opciones.
32
+ * - false (por defecto): valor es `T | null`
33
+ * - true: valor es `T[]`
34
+ */
35
+ multiple: _angular_core.InputSignal<boolean>;
36
+ /** Tamaño visual / Visual size */
37
+ size: _angular_core.InputSignal<NeuButtonSize>;
38
+ /** Deshabilita todo el grupo / Disables the entire group */
39
+ disabled: _angular_core.InputSignal<boolean>;
40
+ /** Emite el nuevo valor al cambiar (útil sin formControl) / Emits the new value on change (useful without formControl) */
41
+ neuChange: _angular_core.OutputEmitterRef<T | T[] | null>;
42
+ readonly _value: _angular_core.WritableSignal<T | T[] | null>;
43
+ readonly _isDisabled: _angular_core.WritableSignal<boolean>;
44
+ readonly groupClasses: _angular_core.Signal<{
45
+ [x: string]: boolean;
46
+ 'neu-toggle-group': boolean;
47
+ 'neu-toggle-group--disabled': boolean;
48
+ }>;
49
+ isSelected(value: T): boolean;
50
+ toggle(opt: NeuToggleOption<T>): void;
51
+ onBlur(): void;
52
+ private _onChange;
53
+ private _onTouched;
54
+ writeValue(val: T | T[] | null): void;
55
+ registerOnChange(fn: (v: unknown) => void): void;
56
+ registerOnTouched(fn: () => void): void;
57
+ setDisabledState(isDisabled: boolean): void;
58
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuToggleButtonGroupComponent<any>, never>;
59
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuToggleButtonGroupComponent<any>, "neu-toggle-button-group", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "neuChange": "neuChange"; }, never, never, true, never>;
60
+ }
61
+
62
+ export { NeuToggleButtonGroupComponent };
63
+ export type { NeuToggleOption };
@@ -0,0 +1,36 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ type NeuToolbarSize = 'sm' | 'md' | 'lg';
4
+ /**
5
+ * NeuralUI Toolbar Component
6
+ *
7
+ * Barra horizontal con tres zonas de contenido: start (izquierda), center (centro) y end (derecha).
8
+ *
9
+ * Uso:
10
+ * <neu-toolbar>
11
+ * <span neu-toolbar-start>Logo</span>
12
+ * <span neu-toolbar-center>Título</span>
13
+ * <span neu-toolbar-end><neu-button>Acción</neu-button></span>
14
+ * </neu-toolbar>
15
+ */
16
+ declare class NeuToolbarComponent {
17
+ /** Tamaño de la toolbar / Toolbar size */
18
+ readonly size: _angular_core.InputSignal<NeuToolbarSize>;
19
+ /** Añade sombra en la parte inferior / Adds shadow at the bottom */
20
+ readonly shadow: _angular_core.InputSignal<boolean>;
21
+ /** Añade separador inferior / Adds bottom separator */
22
+ readonly bordered: _angular_core.InputSignal<boolean>;
23
+ /** Color de fondo personalizado vía CSS (pasa a la variable local) / Custom background color via CSS */
24
+ readonly surface: _angular_core.InputSignal<"primary" | "surface" | "none">;
25
+ readonly hostClasses: _angular_core.Signal<{
26
+ [x: string]: boolean;
27
+ 'neu-toolbar': boolean;
28
+ 'neu-toolbar--shadow': boolean;
29
+ 'neu-toolbar--bordered': boolean;
30
+ }>;
31
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuToolbarComponent, never>;
32
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuToolbarComponent, "neu-toolbar", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "surface": { "alias": "surface"; "required": false; "isSignal": true; }; }, {}, never, ["[neu-toolbar-start]", "[neu-toolbar-center]", "[neu-toolbar-end]", "*"], true, never>;
33
+ }
34
+
35
+ export { NeuToolbarComponent };
36
+ export type { NeuToolbarSize };