@neural-ui/core 1.6.1 → 1.6.3

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 (202) hide show
  1. package/accordion/package.json +4 -0
  2. package/alert/package.json +4 -0
  3. package/autocomplete/package.json +4 -0
  4. package/avatar/package.json +4 -0
  5. package/badge/package.json +4 -0
  6. package/block-ui/package.json +4 -0
  7. package/breadcrumb/package.json +4 -0
  8. package/button/package.json +4 -0
  9. package/calendar/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 +7 -11
  24. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  25. package/fesm2022/neural-ui-core-alert.mjs +14 -25
  26. package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
  27. package/fesm2022/neural-ui-core-autocomplete.mjs +28 -53
  28. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  29. package/fesm2022/neural-ui-core-avatar.mjs +13 -23
  30. package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
  31. package/fesm2022/neural-ui-core-badge.mjs +9 -15
  32. package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
  33. package/fesm2022/neural-ui-core-block-ui.mjs +11 -16
  34. package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
  35. package/fesm2022/neural-ui-core-breadcrumb.mjs +6 -8
  36. package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
  37. package/fesm2022/neural-ui-core-button.mjs +16 -29
  38. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  39. package/fesm2022/neural-ui-core-calendar.mjs +20 -37
  40. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-card.mjs +8 -13
  42. package/fesm2022/neural-ui-core-card.mjs.map +1 -1
  43. package/fesm2022/neural-ui-core-chart.mjs +24 -45
  44. package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
  45. package/fesm2022/neural-ui-core-checkbox.mjs +9 -15
  46. package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
  47. package/fesm2022/neural-ui-core-chip.mjs +13 -23
  48. package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
  49. package/fesm2022/neural-ui-core-code-block.mjs +17 -31
  50. package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
  51. package/fesm2022/neural-ui-core-color-picker.mjs +11 -19
  52. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
  53. package/fesm2022/neural-ui-core-command-palette.mjs +11 -16
  54. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
  55. package/fesm2022/neural-ui-core-confirm-dialog.mjs +6 -6
  56. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -1
  57. package/fesm2022/neural-ui-core-context-menu.mjs +9 -12
  58. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
  59. package/fesm2022/neural-ui-core-dashboard-grid.mjs +7 -11
  60. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
  61. package/fesm2022/neural-ui-core-date-input.mjs +57 -111
  62. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
  63. package/fesm2022/neural-ui-core-divider.mjs +5 -7
  64. package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
  65. package/fesm2022/neural-ui-core-empty-state.mjs +8 -13
  66. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
  67. package/fesm2022/neural-ui-core-filter-bar.mjs +11 -19
  68. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
  69. package/fesm2022/neural-ui-core-icon.mjs +7 -11
  70. package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
  71. package/fesm2022/neural-ui-core-image-gallery.mjs +13 -23
  72. package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
  73. package/fesm2022/neural-ui-core-image-viewer.mjs +14 -22
  74. package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
  75. package/fesm2022/neural-ui-core-input-otp.mjs +11 -19
  76. package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
  77. package/fesm2022/neural-ui-core-input.mjs +35 -67
  78. package/fesm2022/neural-ui-core-input.mjs.map +1 -1
  79. package/fesm2022/neural-ui-core-kanban.mjs +9 -15
  80. package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
  81. package/fesm2022/neural-ui-core-knob.mjs +22 -41
  82. package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
  83. package/fesm2022/neural-ui-core-meter-group.mjs +13 -23
  84. package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
  85. package/fesm2022/neural-ui-core-modal.mjs +11 -16
  86. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  87. package/fesm2022/neural-ui-core-multiselect.mjs +39 -72
  88. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  89. package/fesm2022/neural-ui-core-nav.mjs +13 -22
  90. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  91. package/fesm2022/neural-ui-core-notification-center.mjs +9 -12
  92. package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
  93. package/fesm2022/neural-ui-core-number-input.mjs +19 -35
  94. package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
  95. package/fesm2022/neural-ui-core-pagination.mjs +9 -15
  96. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
  97. package/fesm2022/neural-ui-core-popover.mjs +14 -22
  98. package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
  99. package/fesm2022/neural-ui-core-progress-bar.mjs +11 -19
  100. package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
  101. package/fesm2022/neural-ui-core-radio.mjs +15 -24
  102. package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
  103. package/fesm2022/neural-ui-core-rating.mjs +8 -13
  104. package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
  105. package/fesm2022/neural-ui-core-rich-text-editor.mjs +28 -53
  106. package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -1
  107. package/fesm2022/neural-ui-core-scheduler-gantt.mjs +22 -41
  108. package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
  109. package/fesm2022/neural-ui-core-select.mjs +43 -77
  110. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  111. package/fesm2022/neural-ui-core-sidebar.mjs +12 -21
  112. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  113. package/fesm2022/neural-ui-core-skeleton.mjs +7 -11
  114. package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
  115. package/fesm2022/neural-ui-core-slider.mjs +13 -23
  116. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  117. package/fesm2022/neural-ui-core-spinner.mjs +10 -17
  118. package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
  119. package/fesm2022/neural-ui-core-split-button.mjs +15 -27
  120. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  121. package/fesm2022/neural-ui-core-splitter.mjs +6 -9
  122. package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
  123. package/fesm2022/neural-ui-core-stats-card.mjs +11 -19
  124. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
  125. package/fesm2022/neural-ui-core-stepper.mjs +8 -13
  126. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  127. package/fesm2022/neural-ui-core-switch.mjs +9 -15
  128. package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
  129. package/fesm2022/neural-ui-core-table.mjs +124 -242
  130. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  131. package/fesm2022/neural-ui-core-tabs.mjs +18 -30
  132. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  133. package/fesm2022/neural-ui-core-textarea.mjs +23 -43
  134. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
  135. package/fesm2022/neural-ui-core-timeline-grid.mjs +12 -21
  136. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
  137. package/fesm2022/neural-ui-core-timeline.mjs +4 -5
  138. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
  139. package/fesm2022/neural-ui-core-toast.mjs +8 -10
  140. package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
  141. package/fesm2022/neural-ui-core-toggle-button-group.mjs +10 -17
  142. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  143. package/fesm2022/neural-ui-core-toolbar.mjs +8 -13
  144. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
  145. package/fesm2022/neural-ui-core-tooltip.mjs +11 -16
  146. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
  147. package/fesm2022/neural-ui-core-tree-table.mjs +30 -57
  148. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
  149. package/fesm2022/neural-ui-core-tree.mjs +17 -31
  150. package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
  151. package/fesm2022/neural-ui-core-uploader.mjs +47 -91
  152. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
  153. package/fesm2022/neural-ui-core-url-state.mjs +5 -7
  154. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
  155. package/fesm2022/neural-ui-core-virtual-list.mjs +19 -32
  156. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  157. package/filter-bar/package.json +4 -0
  158. package/icon/package.json +4 -0
  159. package/image-gallery/package.json +4 -0
  160. package/image-viewer/package.json +4 -0
  161. package/input/package.json +4 -0
  162. package/input-otp/package.json +4 -0
  163. package/kanban/package.json +4 -0
  164. package/knob/package.json +4 -0
  165. package/meter-group/package.json +4 -0
  166. package/modal/package.json +4 -0
  167. package/multiselect/package.json +4 -0
  168. package/nav/package.json +4 -0
  169. package/notification-center/package.json +4 -0
  170. package/number-input/package.json +4 -0
  171. package/package.json +6 -6
  172. package/pagination/package.json +4 -0
  173. package/popover/package.json +4 -0
  174. package/progress-bar/package.json +4 -0
  175. package/radio/package.json +4 -0
  176. package/rating/package.json +4 -0
  177. package/rich-text-editor/package.json +4 -0
  178. package/scheduler-gantt/package.json +4 -0
  179. package/select/package.json +4 -0
  180. package/sidebar/package.json +4 -0
  181. package/skeleton/package.json +4 -0
  182. package/slider/package.json +4 -0
  183. package/spinner/package.json +4 -0
  184. package/split-button/package.json +4 -0
  185. package/splitter/package.json +4 -0
  186. package/stats-card/package.json +4 -0
  187. package/stepper/package.json +4 -0
  188. package/switch/package.json +4 -0
  189. package/table/package.json +4 -0
  190. package/tabs/package.json +4 -0
  191. package/textarea/package.json +4 -0
  192. package/timeline/package.json +4 -0
  193. package/timeline-grid/package.json +4 -0
  194. package/toast/package.json +4 -0
  195. package/toggle-button-group/package.json +4 -0
  196. package/toolbar/package.json +4 -0
  197. package/tooltip/package.json +4 -0
  198. package/tree/package.json +4 -0
  199. package/tree-table/package.json +4 -0
  200. package/uploader/package.json +4 -0
  201. package/url-state/package.json +4 -0
  202. package/virtual-list/package.json +4 -0
@@ -19,88 +19,58 @@ let _neuInputIdSeq = 0;
19
19
  */
20
20
  class NeuInputComponent {
21
21
  /** Tipo de input HTML / HTML input type */
22
- type = input('text', /* @ts-ignore */
23
- ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
22
+ type = input('text', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
24
23
  /** Texto del floating label / Floating label text */
25
- label = input('', /* @ts-ignore */
26
- ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
24
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
27
25
  /** Placeholder visible cuando floatingLabel=false / Visible placeholder when floatingLabel=false */
28
- placeholder = input('', /* @ts-ignore */
29
- ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
26
+ placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
30
27
  /** Muestra el label como flotante (true) o estático encima del campo (false) / Shows the label as floating (true) or static above the field (false) */
31
- floatingLabel = input(true, /* @ts-ignore */
32
- ...(ngDevMode ? [{ debugName: "floatingLabel" }] : /* istanbul ignore next */ []));
28
+ floatingLabel = input(true, ...(ngDevMode ? [{ debugName: "floatingLabel" }] : /* istanbul ignore next */ []));
33
29
  /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */
34
- size = input('md', /* @ts-ignore */
35
- ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
30
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
36
31
  /** Hint de ayuda (visible cuando no hay error) / Help hint (visible when there is no error) */
37
- hint = input('', /* @ts-ignore */
38
- ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
32
+ hint = input('', ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
39
33
  /** Mensaje de error (activa el estado de error) / Error message (activates the error state) */
40
- errorMessage = input('', /* @ts-ignore */
41
- ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
34
+ errorMessage = input('', ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
42
35
  /** Deshabilita el campo / Disables the field */
43
- disabled = input(false, /* @ts-ignore */
44
- ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
36
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
45
37
  /** Atributo autocomplete HTML / HTML autocomplete attribute */
46
- autocomplete = input('off', /* @ts-ignore */
47
- ...(ngDevMode ? [{ debugName: "autocomplete" }] : /* istanbul ignore next */ []));
38
+ autocomplete = input('off', ...(ngDevMode ? [{ debugName: "autocomplete" }] : /* istanbul ignore next */ []));
48
39
  /** Muestra zona para icono al inicio / Shows icon slot at the start */
49
- startIcon = input(false, /* @ts-ignore */
50
- ...(ngDevMode ? [{ debugName: "startIcon" }] : /* istanbul ignore next */ []));
40
+ startIcon = input(false, ...(ngDevMode ? [{ debugName: "startIcon" }] : /* istanbul ignore next */ []));
51
41
  /** Muestra zona para icono al final / Shows icon slot at the end */
52
- endIcon = input(false, /* @ts-ignore */
53
- ...(ngDevMode ? [{ debugName: "endIcon" }] : /* istanbul ignore next */ []));
42
+ endIcon = input(false, ...(ngDevMode ? [{ debugName: "endIcon" }] : /* istanbul ignore next */ []));
54
43
  /** Nombre del icono lucide a renderizar dentro del campo / Lucide icon name to render inside the field */
55
- icon = input('', /* @ts-ignore */
56
- ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
44
+ icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
57
45
  /** Posición del icono cuando se usa `icon` / Icon position when using `icon` */
58
- iconPosition = input('left', /* @ts-ignore */
59
- ...(ngDevMode ? [{ debugName: "iconPosition" }] : /* istanbul ignore next */ []));
46
+ iconPosition = input('left', ...(ngDevMode ? [{ debugName: "iconPosition" }] : /* istanbul ignore next */ []));
60
47
  /** ID accesible para el input — generado con contador estable (seguro en SSR) / Accessible ID for the input — generated with stable counter (SSR-safe) */
61
- inputId = input(`neu-input-${++_neuInputIdSeq}`, /* @ts-ignore */
62
- ...(ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []));
48
+ inputId = input(`neu-input-${++_neuInputIdSeq}`, ...(ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []));
63
49
  /** Nombre del campo para formularios nativos / Field name for native forms */
64
- name = input('', /* @ts-ignore */
65
- ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
50
+ name = input('', ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
66
51
  /** Marca el campo como requerido / Marks the field as required */
67
- required = input(false, /* @ts-ignore */
68
- ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
52
+ required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
69
53
  /** Hace el campo de solo lectura / Makes the field read-only */
70
- readonly = input(false, /* @ts-ignore */
71
- ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
54
+ readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
72
55
  /** Longitud máxima de caracteres / Maximum character length */
73
- maxlength = input(null, /* @ts-ignore */
74
- ...(ngDevMode ? [{ debugName: "maxlength" }] : /* istanbul ignore next */ []));
56
+ maxlength = input(null, ...(ngDevMode ? [{ debugName: "maxlength" }] : /* istanbul ignore next */ []));
75
57
  /** Longitud mínima de caracteres / Minimum character length */
76
- minlength = input(null, /* @ts-ignore */
77
- ...(ngDevMode ? [{ debugName: "minlength" }] : /* istanbul ignore next */ []));
58
+ minlength = input(null, ...(ngDevMode ? [{ debugName: "minlength" }] : /* istanbul ignore next */ []));
78
59
  /** Valor mínimo (para type=number/date) / Minimum value (for type=number/date) */
79
- min = input(null, /* @ts-ignore */
80
- ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
60
+ min = input(null, ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
81
61
  /** Valor máximo (para type=number/date) / Maximum value (for type=number/date) */
82
- max = input(null, /* @ts-ignore */
83
- ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
62
+ max = input(null, ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
84
63
  /** Patrón de validación HTML5 / HTML5 validation pattern */
85
- pattern = input(null, /* @ts-ignore */
86
- ...(ngDevMode ? [{ debugName: "pattern" }] : /* istanbul ignore next */ []));
64
+ pattern = input(null, ...(ngDevMode ? [{ debugName: "pattern" }] : /* istanbul ignore next */ []));
87
65
  // --- Estado interno reactivo ---
88
- _value = signal('', /* @ts-ignore */
89
- ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
90
- _focused = signal(false, /* @ts-ignore */
91
- ...(ngDevMode ? [{ debugName: "_focused" }] : /* istanbul ignore next */ []));
92
- hasValue = computed(() => this._value().length > 0, /* @ts-ignore */
93
- ...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
94
- hasError = computed(() => !!this.errorMessage(), /* @ts-ignore */
95
- ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
96
- startIconPath = computed(() => '', /* @ts-ignore */
97
- ...(ngDevMode ? [{ debugName: "startIconPath" }] : /* istanbul ignore next */ []));
98
- hasStartContent = computed(() => false, /* @ts-ignore */
99
- ...(ngDevMode ? [{ debugName: "hasStartContent" }] : /* istanbul ignore next */ []));
100
- _hasIconLeft = computed(() => !!this.icon() && this.iconPosition() === 'left', /* @ts-ignore */
101
- ...(ngDevMode ? [{ debugName: "_hasIconLeft" }] : /* istanbul ignore next */ []));
102
- _hasIconRight = computed(() => !!this.icon() && this.iconPosition() === 'right', /* @ts-ignore */
103
- ...(ngDevMode ? [{ debugName: "_hasIconRight" }] : /* istanbul ignore next */ []));
66
+ _value = signal('', ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
67
+ _focused = signal(false, ...(ngDevMode ? [{ debugName: "_focused" }] : /* istanbul ignore next */ []));
68
+ hasValue = computed(() => this._value().length > 0, ...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
69
+ hasError = computed(() => !!this.errorMessage(), ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
70
+ startIconPath = computed(() => '', ...(ngDevMode ? [{ debugName: "startIconPath" }] : /* istanbul ignore next */ []));
71
+ hasStartContent = computed(() => false, ...(ngDevMode ? [{ debugName: "hasStartContent" }] : /* istanbul ignore next */ []));
72
+ _hasIconLeft = computed(() => !!this.icon() && this.iconPosition() === 'left', ...(ngDevMode ? [{ debugName: "_hasIconLeft" }] : /* istanbul ignore next */ []));
73
+ _hasIconRight = computed(() => !!this.icon() && this.iconPosition() === 'right', ...(ngDevMode ? [{ debugName: "_hasIconRight" }] : /* istanbul ignore next */ []));
104
74
  // --- ControlValueAccessor ---
105
75
  _onChange = () => { };
106
76
  _onTouched = () => { };
@@ -113,13 +83,11 @@ class NeuInputComponent {
113
83
  registerOnTouched(fn) {
114
84
  this._onTouched = fn;
115
85
  }
116
- _cvaDisabled = signal(false, /* @ts-ignore */
117
- ...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
86
+ _cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
118
87
  setDisabledState(isDisabled) {
119
88
  this._cvaDisabled.set(isDisabled);
120
89
  }
121
- isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled(), /* @ts-ignore */
122
- ...(ngDevMode ? [{ debugName: "isDisabledFinal" }] : /* istanbul ignore next */ []));
90
+ isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabledFinal" }] : /* istanbul ignore next */ []));
123
91
  onInput(event) {
124
92
  const value = event.target.value;
125
93
  this._value.set(value);
@@ -132,8 +100,8 @@ class NeuInputComponent {
132
100
  this._focused.set(false);
133
101
  this._onTouched();
134
102
  }
135
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
136
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuInputComponent, isStandalone: true, selector: "neu-input", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, floatingLabel: { classPropertyName: "floatingLabel", publicName: "floatingLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, startIcon: { classPropertyName: "startIcon", publicName: "startIcon", isSignal: true, isRequired: false, transformFunction: null }, endIcon: { classPropertyName: "endIcon", publicName: "endIcon", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconPosition: { classPropertyName: "iconPosition", publicName: "iconPosition", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, minlength: { classPropertyName: "minlength", publicName: "minlength", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, pattern: { classPropertyName: "pattern", publicName: "pattern", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.neu-input-host--sm": "size() === \"sm\"", "class.neu-input-host--lg": "size() === \"lg\"" }, classAttribute: "neu-input-host" }, providers: [
103
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
104
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuInputComponent, isStandalone: true, selector: "neu-input", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, floatingLabel: { classPropertyName: "floatingLabel", publicName: "floatingLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, startIcon: { classPropertyName: "startIcon", publicName: "startIcon", isSignal: true, isRequired: false, transformFunction: null }, endIcon: { classPropertyName: "endIcon", publicName: "endIcon", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconPosition: { classPropertyName: "iconPosition", publicName: "iconPosition", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, minlength: { classPropertyName: "minlength", publicName: "minlength", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, pattern: { classPropertyName: "pattern", publicName: "pattern", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.neu-input-host--sm": "size() === \"sm\"", "class.neu-input-host--lg": "size() === \"lg\"" }, classAttribute: "neu-input-host" }, providers: [
137
105
  {
138
106
  provide: NG_VALUE_ACCESSOR,
139
107
  useExisting: forwardRef(() => NeuInputComponent),
@@ -235,7 +203,7 @@ class NeuInputComponent {
235
203
  }
236
204
  `, isInline: true, styles: [".neu-input-host{display:block}.neu-input-host--sm .neu-input__wrapper{height:36px}.neu-input-host--sm .neu-input__field{font-size:var(--neu-text-sm)}.neu-input-host--lg .neu-input__wrapper{height:56px}.neu-input__wrapper{position:relative;display:flex;align-items:center;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);height:48px;transition:border-color var(--neu-transition),box-shadow var(--neu-transition),background-color var(--neu-transition)}.neu-input__wrapper:hover:not(.neu-input__wrapper--disabled){border-color:var(--neu-border-hover)}.neu-input__wrapper--focused{border-color:var(--neu-primary);box-shadow:var(--neu-focus-ring)}.neu-input__wrapper--error{border-color:var(--neu-error)}.neu-input__wrapper--error.neu-input__wrapper--focused{box-shadow:0 0 0 3px #ef44441f}.neu-input__wrapper--disabled{background:var(--neu-surface-2);opacity:.6;cursor:not-allowed}.neu-input__wrapper--has-start-icon .neu-input__field{padding-left:40px}.neu-input__wrapper--has-end-icon .neu-input__field{padding-right:40px}.neu-input__field{width:100%;height:100%;padding:0 var(--neu-space-3);border:none;background:transparent;outline:none;font-family:var(--neu-font-sans);font-size:var(--neu-text-base);color:var(--neu-text);caret-color:var(--neu-primary)}.neu-input__field:disabled{cursor:not-allowed;color:var(--neu-text-disabled)}.neu-input__field::placeholder{color:transparent;transition:color var(--neu-transition)}.neu-input__wrapper--focused .neu-input__field::placeholder{color:var(--neu-text-disabled)}.neu-input__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:var(--neu-text-muted);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6));transition:top var(--neu-transition),font-size var(--neu-transition),color var(--neu-transition),transform var(--neu-transition),padding var(--neu-transition),background var(--neu-transition)}.neu-input__wrapper--focused .neu-input__label,.neu-input__wrapper--has-value .neu-input__label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface);padding:0 4px;left:calc(var(--neu-space-3) - 4px)}.neu-input__wrapper--focused .neu-input__label{color:var(--neu-primary)}.neu-input__wrapper--error .neu-input__label{color:var(--neu-error)}.neu-input__wrapper--disabled .neu-input__label{background:var(--neu-surface-2)}.neu-input__wrapper--has-start-icon .neu-input__label{left:40px}.neu-input__wrapper--has-start-icon .neu-input__label.neu-input__wrapper--focused,.neu-input__wrapper--focused .neu-input__wrapper--has-start-icon .neu-input__label,.neu-input__wrapper--has-value .neu-input__wrapper--has-start-icon .neu-input__label{left:calc(var(--neu-space-3) - 4px)}.neu-input__icon{position:absolute;display:flex;align-items:center;justify-content:center;width:36px;height:36px;color:var(--neu-text-muted);pointer-events:none;flex-shrink:0}.neu-input__icon svg{width:18px;height:18px}.neu-input__icon--start{left:0}.neu-input__icon--end{right:0}.neu-input__error{display:flex;align-items:center;gap:4px;margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text);font-family:var(--neu-font-sans);line-height:1.4}.neu-input__hint{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-text-muted);font-family:var(--neu-font-sans)}.neu-input__static-label{display:block;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);margin-bottom:var(--neu-space-2)}.neu-input__wrapper--no-float .neu-input__field{padding:0 var(--neu-space-3)}.neu-input__wrapper--no-float .neu-input__field::placeholder{color:var(--neu-text-disabled)}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
237
205
  }
238
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuInputComponent, decorators: [{
206
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuInputComponent, decorators: [{
239
207
  type: Component,
240
208
  args: [{ selector: 'neu-input', imports: [NeuIconComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
241
209
  class: 'neu-input-host',
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-input.mjs","sources":["../../../../projects/ui-core/input/neu-input.component.ts","../../../../projects/ui-core/input/neural-ui-core-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\n/** Contador global para IDs estables — seguro en SSR, predecible en hidratación / Global counter for stable IDs — SSR-safe, predictable on hydration */\nlet _neuInputIdSeq = 0;\n\nexport type NeuInputType = 'text' | 'email' | 'password' | 'tel' | 'url' | 'search';\n\n/**\n * NeuralUI Input Component\n *\n * Input con floating label, iconos y soporte completo para Angular Forms.\n * Compatible con Reactive Forms mediante FormControl y formularios reactivos.\n *\n * Uso standalone:\n * <neu-input label=\"Correo\" type=\"email\" />\n *\n * Con Reactive Forms:\n * <neu-input label=\"Correo\" [formControl]=\"emailCtrl\" [errorMessage]=\"emailError()\" />\n */\n@Component({\n selector: 'neu-input',\n imports: [NeuIconComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Los atributos del host (class, style, data-*) no deben llegar al <input> nativo\n // — se gestionan de forma explícita con los inputs del componente.\n host: {\n class: 'neu-input-host',\n '[class.neu-input-host--sm]': 'size() === \"sm\"',\n '[class.neu-input-host--lg]': 'size() === \"lg\"',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuInputComponent),\n multi: true,\n },\n ],\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-input__static-label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n <div\n class=\"neu-input__wrapper\"\n [class.neu-input__wrapper--focused]=\"_focused()\"\n [class.neu-input__wrapper--has-value]=\"hasValue()\"\n [class.neu-input__wrapper--error]=\"hasError()\"\n [class.neu-input__wrapper--disabled]=\"isDisabledFinal()\"\n [class.neu-input__wrapper--has-start-icon]=\"!!startIcon() || _hasIconLeft()\"\n [class.neu-input__wrapper--has-end-icon]=\"!!endIcon() || _hasIconRight()\"\n [class.neu-input__wrapper--no-float]=\"!floatingLabel()\"\n >\n <!-- Icono izquierdo (proyección) -->\n @if (startIcon()) {\n <span class=\"neu-input__icon neu-input__icon--start\" aria-hidden=\"true\">\n <ng-content select=\"[neu-input-start]\" />\n @if (!hasStartContent()) {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [innerHTML]=\"startIconPath()\"\n ></svg>\n }\n </span>\n }\n\n <!-- Icono izquierdo (por nombre) -->\n @if (_hasIconLeft()) {\n <span class=\"neu-input__icon neu-input__icon--start\" aria-hidden=\"true\">\n <neu-icon [name]=\"icon()\" size=\"16px\" />\n </span>\n }\n\n <!-- Campo nativo -->\n <input\n class=\"neu-input__field\"\n [id]=\"inputId()\"\n [type]=\"type()\"\n [disabled]=\"isDisabledFinal()\"\n [attr.name]=\"name() || null\"\n [attr.required]=\"required() ? '' : null\"\n [attr.readonly]=\"readonly() ? '' : null\"\n [attr.maxlength]=\"maxlength() ?? null\"\n [attr.minlength]=\"minlength() ?? null\"\n [attr.min]=\"min() ?? null\"\n [attr.max]=\"max() ?? null\"\n [attr.pattern]=\"pattern() ?? null\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"\n hasError() ? inputId() + '-error' : hint() ? inputId() + '-hint' : null\n \"\n [value]=\"_value()\"\n [attr.placeholder]=\"floatingLabel() ? ' ' : placeholder() || null\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Floating Label -->\n @if (floatingLabel() && label()) {\n <label class=\"neu-input__label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n\n <!-- Icono derecho (proyección) -->\n @if (endIcon()) {\n <span class=\"neu-input__icon neu-input__icon--end\" aria-hidden=\"true\">\n <ng-content select=\"[neu-input-end]\" />\n </span>\n }\n\n <!-- Icono derecho (por nombre) -->\n @if (_hasIconRight()) {\n <span class=\"neu-input__icon neu-input__icon--end\" aria-hidden=\"true\">\n <neu-icon [name]=\"icon()\" size=\"16px\" />\n </span>\n }\n </div>\n\n <!-- Mensajes de ayuda / error -->\n @if (hasError()) {\n <p class=\"neu-input__error\" [id]=\"inputId() + '-error'\" role=\"alert\">\n <neu-icon name=\"lucideAlertCircle\" size=\"13px\" aria-hidden=\"true\" />\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-input__hint\" [id]=\"inputId() + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-input.component.scss',\n})\nexport class NeuInputComponent implements ControlValueAccessor {\n /** Tipo de input HTML / HTML input type */\n type = input<NeuInputType>('text');\n\n /** Texto del floating label / Floating label text */\n label = input<string>('');\n\n /** Placeholder visible cuando floatingLabel=false / Visible placeholder when floatingLabel=false */\n placeholder = input<string>('');\n\n /** Muestra el label como flotante (true) o estático encima del campo (false) / Shows the label as floating (true) or static above the field (false) */\n floatingLabel = input<boolean>(true);\n\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n /** Hint de ayuda (visible cuando no hay error) / Help hint (visible when there is no error) */\n hint = input<string>('');\n\n /** Mensaje de error (activa el estado de error) / Error message (activates the error state) */\n errorMessage = input<string>('');\n\n /** Deshabilita el campo / Disables the field */\n disabled = input<boolean>(false);\n\n /** Atributo autocomplete HTML / HTML autocomplete attribute */\n autocomplete = input<string>('off');\n\n /** Muestra zona para icono al inicio / Shows icon slot at the start */\n startIcon = input<boolean>(false);\n\n /** Muestra zona para icono al final / Shows icon slot at the end */\n endIcon = input<boolean>(false);\n\n /** Nombre del icono lucide a renderizar dentro del campo / Lucide icon name to render inside the field */\n icon = input<string>('');\n\n /** Posición del icono cuando se usa `icon` / Icon position when using `icon` */\n iconPosition = input<'left' | 'right'>('left');\n\n /** ID accesible para el input — generado con contador estable (seguro en SSR) / Accessible ID for the input — generated with stable counter (SSR-safe) */\n inputId = input<string>(`neu-input-${++_neuInputIdSeq}`);\n\n /** Nombre del campo para formularios nativos / Field name for native forms */\n name = input<string>('');\n\n /** Marca el campo como requerido / Marks the field as required */\n required = input<boolean>(false);\n\n /** Hace el campo de solo lectura / Makes the field read-only */\n readonly = input<boolean>(false);\n\n /** Longitud máxima de caracteres / Maximum character length */\n maxlength = input<number | null>(null);\n\n /** Longitud mínima de caracteres / Minimum character length */\n minlength = input<number | null>(null);\n\n /** Valor mínimo (para type=number/date) / Minimum value (for type=number/date) */\n min = input<string | null>(null);\n\n /** Valor máximo (para type=number/date) / Maximum value (for type=number/date) */\n max = input<string | null>(null);\n\n /** Patrón de validación HTML5 / HTML5 validation pattern */\n pattern = input<string | null>(null);\n\n // --- Estado interno reactivo ---\n protected readonly _value = signal('');\n protected readonly _focused = signal(false);\n\n readonly hasValue = computed(() => this._value().length > 0);\n readonly hasError = computed(() => !!this.errorMessage());\n readonly startIconPath = computed(() => '');\n readonly hasStartContent = computed(() => false);\n readonly _hasIconLeft = computed(() => !!this.icon() && this.iconPosition() === 'left');\n readonly _hasIconRight = computed(() => !!this.icon() && this.iconPosition() === 'right');\n\n // --- ControlValueAccessor ---\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: unknown): void {\n this._value.set(val == null ? '' : String(val));\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n onInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this._value.set(value);\n this._onChange(value);\n }\n\n onFocus(): void {\n this._focused.set(true);\n }\n\n onBlur(): void {\n this._focused.set(false);\n this._onTouched();\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-input.mjs","sources":["../../../../projects/ui-core/input/neu-input.component.ts","../../../../projects/ui-core/input/neural-ui-core-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\n/** Contador global para IDs estables — seguro en SSR, predecible en hidratación / Global counter for stable IDs — SSR-safe, predictable on hydration */\nlet _neuInputIdSeq = 0;\n\nexport type NeuInputType = 'text' | 'email' | 'password' | 'tel' | 'url' | 'search';\n\n/**\n * NeuralUI Input Component\n *\n * Input con floating label, iconos y soporte completo para Angular Forms.\n * Compatible con Reactive Forms mediante FormControl y formularios reactivos.\n *\n * Uso standalone:\n * <neu-input label=\"Correo\" type=\"email\" />\n *\n * Con Reactive Forms:\n * <neu-input label=\"Correo\" [formControl]=\"emailCtrl\" [errorMessage]=\"emailError()\" />\n */\n@Component({\n selector: 'neu-input',\n imports: [NeuIconComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Los atributos del host (class, style, data-*) no deben llegar al <input> nativo\n // — se gestionan de forma explícita con los inputs del componente.\n host: {\n class: 'neu-input-host',\n '[class.neu-input-host--sm]': 'size() === \"sm\"',\n '[class.neu-input-host--lg]': 'size() === \"lg\"',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuInputComponent),\n multi: true,\n },\n ],\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-input__static-label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n <div\n class=\"neu-input__wrapper\"\n [class.neu-input__wrapper--focused]=\"_focused()\"\n [class.neu-input__wrapper--has-value]=\"hasValue()\"\n [class.neu-input__wrapper--error]=\"hasError()\"\n [class.neu-input__wrapper--disabled]=\"isDisabledFinal()\"\n [class.neu-input__wrapper--has-start-icon]=\"!!startIcon() || _hasIconLeft()\"\n [class.neu-input__wrapper--has-end-icon]=\"!!endIcon() || _hasIconRight()\"\n [class.neu-input__wrapper--no-float]=\"!floatingLabel()\"\n >\n <!-- Icono izquierdo (proyección) -->\n @if (startIcon()) {\n <span class=\"neu-input__icon neu-input__icon--start\" aria-hidden=\"true\">\n <ng-content select=\"[neu-input-start]\" />\n @if (!hasStartContent()) {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [innerHTML]=\"startIconPath()\"\n ></svg>\n }\n </span>\n }\n\n <!-- Icono izquierdo (por nombre) -->\n @if (_hasIconLeft()) {\n <span class=\"neu-input__icon neu-input__icon--start\" aria-hidden=\"true\">\n <neu-icon [name]=\"icon()\" size=\"16px\" />\n </span>\n }\n\n <!-- Campo nativo -->\n <input\n class=\"neu-input__field\"\n [id]=\"inputId()\"\n [type]=\"type()\"\n [disabled]=\"isDisabledFinal()\"\n [attr.name]=\"name() || null\"\n [attr.required]=\"required() ? '' : null\"\n [attr.readonly]=\"readonly() ? '' : null\"\n [attr.maxlength]=\"maxlength() ?? null\"\n [attr.minlength]=\"minlength() ?? null\"\n [attr.min]=\"min() ?? null\"\n [attr.max]=\"max() ?? null\"\n [attr.pattern]=\"pattern() ?? null\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"\n hasError() ? inputId() + '-error' : hint() ? inputId() + '-hint' : null\n \"\n [value]=\"_value()\"\n [attr.placeholder]=\"floatingLabel() ? ' ' : placeholder() || null\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Floating Label -->\n @if (floatingLabel() && label()) {\n <label class=\"neu-input__label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n\n <!-- Icono derecho (proyección) -->\n @if (endIcon()) {\n <span class=\"neu-input__icon neu-input__icon--end\" aria-hidden=\"true\">\n <ng-content select=\"[neu-input-end]\" />\n </span>\n }\n\n <!-- Icono derecho (por nombre) -->\n @if (_hasIconRight()) {\n <span class=\"neu-input__icon neu-input__icon--end\" aria-hidden=\"true\">\n <neu-icon [name]=\"icon()\" size=\"16px\" />\n </span>\n }\n </div>\n\n <!-- Mensajes de ayuda / error -->\n @if (hasError()) {\n <p class=\"neu-input__error\" [id]=\"inputId() + '-error'\" role=\"alert\">\n <neu-icon name=\"lucideAlertCircle\" size=\"13px\" aria-hidden=\"true\" />\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-input__hint\" [id]=\"inputId() + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-input.component.scss',\n})\nexport class NeuInputComponent implements ControlValueAccessor {\n /** Tipo de input HTML / HTML input type */\n type = input<NeuInputType>('text');\n\n /** Texto del floating label / Floating label text */\n label = input<string>('');\n\n /** Placeholder visible cuando floatingLabel=false / Visible placeholder when floatingLabel=false */\n placeholder = input<string>('');\n\n /** Muestra el label como flotante (true) o estático encima del campo (false) / Shows the label as floating (true) or static above the field (false) */\n floatingLabel = input<boolean>(true);\n\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n /** Hint de ayuda (visible cuando no hay error) / Help hint (visible when there is no error) */\n hint = input<string>('');\n\n /** Mensaje de error (activa el estado de error) / Error message (activates the error state) */\n errorMessage = input<string>('');\n\n /** Deshabilita el campo / Disables the field */\n disabled = input<boolean>(false);\n\n /** Atributo autocomplete HTML / HTML autocomplete attribute */\n autocomplete = input<string>('off');\n\n /** Muestra zona para icono al inicio / Shows icon slot at the start */\n startIcon = input<boolean>(false);\n\n /** Muestra zona para icono al final / Shows icon slot at the end */\n endIcon = input<boolean>(false);\n\n /** Nombre del icono lucide a renderizar dentro del campo / Lucide icon name to render inside the field */\n icon = input<string>('');\n\n /** Posición del icono cuando se usa `icon` / Icon position when using `icon` */\n iconPosition = input<'left' | 'right'>('left');\n\n /** ID accesible para el input — generado con contador estable (seguro en SSR) / Accessible ID for the input — generated with stable counter (SSR-safe) */\n inputId = input<string>(`neu-input-${++_neuInputIdSeq}`);\n\n /** Nombre del campo para formularios nativos / Field name for native forms */\n name = input<string>('');\n\n /** Marca el campo como requerido / Marks the field as required */\n required = input<boolean>(false);\n\n /** Hace el campo de solo lectura / Makes the field read-only */\n readonly = input<boolean>(false);\n\n /** Longitud máxima de caracteres / Maximum character length */\n maxlength = input<number | null>(null);\n\n /** Longitud mínima de caracteres / Minimum character length */\n minlength = input<number | null>(null);\n\n /** Valor mínimo (para type=number/date) / Minimum value (for type=number/date) */\n min = input<string | null>(null);\n\n /** Valor máximo (para type=number/date) / Maximum value (for type=number/date) */\n max = input<string | null>(null);\n\n /** Patrón de validación HTML5 / HTML5 validation pattern */\n pattern = input<string | null>(null);\n\n // --- Estado interno reactivo ---\n protected readonly _value = signal('');\n protected readonly _focused = signal(false);\n\n readonly hasValue = computed(() => this._value().length > 0);\n readonly hasError = computed(() => !!this.errorMessage());\n readonly startIconPath = computed(() => '');\n readonly hasStartContent = computed(() => false);\n readonly _hasIconLeft = computed(() => !!this.icon() && this.iconPosition() === 'left');\n readonly _hasIconRight = computed(() => !!this.icon() && this.iconPosition() === 'right');\n\n // --- ControlValueAccessor ---\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: unknown): void {\n this._value.set(val == null ? '' : String(val));\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n onInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this._value.set(value);\n this._onChange(value);\n }\n\n onFocus(): void {\n this._focused.set(true);\n }\n\n onBlur(): void {\n this._focused.set(false);\n this._onTouched();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -3,20 +3,14 @@ import { input, output, signal, computed, effect, ChangeDetectionStrategy, ViewE
3
3
  import { moveItemInArray, transferArrayItem, CdkDropListGroup, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';
4
4
 
5
5
  class NeuKanbanComponent {
6
- columns = input([], /* @ts-ignore */
7
- ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
8
- columnWidth = input('320px', /* @ts-ignore */
9
- ...(ngDevMode ? [{ debugName: "columnWidth" }] : /* istanbul ignore next */ []));
10
- showCounts = input(true, /* @ts-ignore */
11
- ...(ngDevMode ? [{ debugName: "showCounts" }] : /* istanbul ignore next */ []));
12
- showWipLimit = input(true, /* @ts-ignore */
13
- ...(ngDevMode ? [{ debugName: "showWipLimit" }] : /* istanbul ignore next */ []));
6
+ columns = input([], ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
7
+ columnWidth = input('320px', ...(ngDevMode ? [{ debugName: "columnWidth" }] : /* istanbul ignore next */ []));
8
+ showCounts = input(true, ...(ngDevMode ? [{ debugName: "showCounts" }] : /* istanbul ignore next */ []));
9
+ showWipLimit = input(true, ...(ngDevMode ? [{ debugName: "showWipLimit" }] : /* istanbul ignore next */ []));
14
10
  columnsChange = output();
15
11
  cardDrop = output();
16
- _columns = signal([], /* @ts-ignore */
17
- ...(ngDevMode ? [{ debugName: "_columns" }] : /* istanbul ignore next */ []));
18
- connectedDropLists = computed(() => this._columns().map((column) => column.id), /* @ts-ignore */
19
- ...(ngDevMode ? [{ debugName: "connectedDropLists" }] : /* istanbul ignore next */ []));
12
+ _columns = signal([], ...(ngDevMode ? [{ debugName: "_columns" }] : /* istanbul ignore next */ []));
13
+ connectedDropLists = computed(() => this._columns().map((column) => column.id), ...(ngDevMode ? [{ debugName: "connectedDropLists" }] : /* istanbul ignore next */ []));
20
14
  constructor() {
21
15
  effect(() => {
22
16
  this._columns.set(this._cloneColumns(this.columns()));
@@ -68,8 +62,8 @@ class NeuKanbanComponent {
68
62
  })),
69
63
  }));
70
64
  }
71
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuKanbanComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
72
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuKanbanComponent, isStandalone: true, selector: "neu-kanban", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, showCounts: { classPropertyName: "showCounts", publicName: "showCounts", isSignal: true, isRequired: false, transformFunction: null }, showWipLimit: { classPropertyName: "showWipLimit", publicName: "showWipLimit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { columnsChange: "columnsChange", cardDrop: "cardDrop" }, host: { properties: { "style.--neu-kanban-column-width": "columnWidth()" } }, ngImport: i0, template: `
65
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuKanbanComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
66
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuKanbanComponent, isStandalone: true, selector: "neu-kanban", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, columnWidth: { classPropertyName: "columnWidth", publicName: "columnWidth", isSignal: true, isRequired: false, transformFunction: null }, showCounts: { classPropertyName: "showCounts", publicName: "showCounts", isSignal: true, isRequired: false, transformFunction: null }, showWipLimit: { classPropertyName: "showWipLimit", publicName: "showWipLimit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { columnsChange: "columnsChange", cardDrop: "cardDrop" }, host: { properties: { "style.--neu-kanban-column-width": "columnWidth()" } }, ngImport: i0, template: `
73
67
  <div class="neu-kanban" cdkDropListGroup>
74
68
  @for (column of _columns(); track column.id) {
75
69
  <section class="neu-kanban__column" [attr.aria-label]="column.title">
@@ -166,7 +160,7 @@ class NeuKanbanComponent {
166
160
  </div>
167
161
  `, isInline: true, styles: [".neu-kanban{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(240px,var(--neu-kanban-column-width, 320px));gap:var(--neu-space-4);align-items:start;overflow-x:auto;padding-bottom:var(--neu-space-2)}.neu-kanban__column{display:flex;flex-direction:column;min-height:240px;border:1px solid var(--neu-border);border-radius:var(--neu-radius-lg);background:color-mix(in srgb,var(--neu-surface) 90%,var(--neu-surface-2) 10%);box-shadow:var(--neu-shadow-sm);overflow:hidden}.neu-kanban__column-header{display:flex;align-items:center;justify-content:space-between;gap:var(--neu-space-3);padding:var(--neu-space-4);border-bottom:1px solid var(--neu-border)}.neu-kanban__column-title{display:flex;align-items:center;gap:var(--neu-space-2);min-width:0}.neu-kanban__column-accent{width:10px;height:10px;border-radius:999px;flex:0 0 auto;background:var(--neu-primary)}.neu-kanban__column-name{margin:0;font-size:var(--neu-text-sm);font-weight:700;color:var(--neu-text)}.neu-kanban__column-meta{display:flex;align-items:center;gap:var(--neu-space-2);flex-wrap:wrap;justify-content:flex-end}.neu-kanban__count,.neu-kanban__wip{display:inline-flex;align-items:center;min-height:28px;padding:0 var(--neu-space-2);border-radius:999px;font-size:var(--neu-text-xs);color:var(--neu-text-muted);background:var(--neu-surface-2)}.neu-kanban__wip--alert{background:color-mix(in srgb,var(--neu-danger) 12%,var(--neu-surface-2) 88%);color:var(--neu-danger)}.neu-kanban__list{display:flex;flex-direction:column;gap:var(--neu-space-3);padding:var(--neu-space-4);min-height:180px}.neu-kanban__empty{margin:0;padding:var(--neu-space-4);border:1px dashed var(--neu-border);border-radius:var(--neu-radius);text-align:center;font-size:var(--neu-text-sm);color:var(--neu-text-muted)}.neu-kanban__card{display:grid;gap:var(--neu-space-3);padding:var(--neu-space-4);border:1px solid var(--neu-border);border-radius:var(--neu-radius);background:var(--neu-surface);box-shadow:var(--neu-shadow-xs);cursor:grab}.neu-kanban__card:active{cursor:grabbing}.neu-kanban__card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--neu-space-3)}.neu-kanban__priority{display:inline-flex;align-items:center;min-height:24px;padding:0 var(--neu-space-2);border-radius:999px;font-size:var(--neu-text-xs);font-weight:700;text-transform:uppercase;letter-spacing:.04em}.neu-kanban__priority--low{background:color-mix(in srgb,var(--neu-success) 12%,white 88%);color:#166534}.neu-kanban__priority--medium{background:color-mix(in srgb,var(--neu-warning) 16%,white 84%);color:#78350f}.neu-kanban__priority--high,.neu-kanban__priority--urgent{background:color-mix(in srgb,var(--neu-danger) 12%,white 88%);color:#991b1b}.neu-kanban__title{margin:0;font-size:var(--neu-text-sm);font-weight:700;color:var(--neu-text)}.neu-kanban__description{margin:0;font-size:var(--neu-text-sm);color:var(--neu-text-muted);line-height:1.5}.neu-kanban__tags{display:flex;flex-wrap:wrap;gap:var(--neu-space-2)}.neu-kanban__tag{display:inline-flex;align-items:center;min-height:24px;padding:0 var(--neu-space-2);border-radius:999px;background:var(--neu-surface-2);color:var(--neu-text-muted);font-size:var(--neu-text-xs)}.neu-kanban__footer{display:flex;align-items:center;justify-content:space-between;gap:var(--neu-space-3)}.neu-kanban__meta-value{font-size:var(--neu-text-xs);color:var(--neu-text-muted)}.neu-kanban__assignee{display:inline-flex;align-items:center;gap:var(--neu-space-2)}.neu-kanban__avatar,.neu-kanban__avatar img{width:28px;height:28px;border-radius:999px}.neu-kanban__avatar{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;background:color-mix(in srgb,var(--neu-primary) 12%,white 88%);color:#004b93;font-size:11px;font-weight:700}.neu-kanban__assignee-name{font-size:var(--neu-text-xs);color:var(--neu-text-muted)}.cdk-drag-preview.neu-kanban__card{box-shadow:var(--neu-shadow-lg);border-color:color-mix(in srgb,var(--neu-primary) 40%,var(--neu-border) 60%)}.cdk-drag-placeholder.neu-kanban__card{opacity:.35}\n"], dependencies: [{ kind: "directive", type: CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
168
162
  }
169
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuKanbanComponent, decorators: [{
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuKanbanComponent, decorators: [{
170
164
  type: Component,
171
165
  args: [{ selector: 'neu-kanban', imports: [CdkDropListGroup, CdkDropList, CdkDrag], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
172
166
  '[style.--neu-kanban-column-width]': 'columnWidth()',
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-kanban.mjs","sources":["../../../../projects/ui-core/kanban/neu-kanban.component.ts","../../../../projects/ui-core/kanban/neural-ui-core-kanban.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport {\n CdkDrag,\n CdkDropList,\n CdkDropListGroup,\n type CdkDragDrop,\n moveItemInArray,\n transferArrayItem,\n} from '@angular/cdk/drag-drop';\n\nexport interface NeuKanbanAssignee {\n name: string;\n avatar?: string;\n initials?: string;\n}\n\nexport interface NeuKanbanCard {\n id: string;\n title: string;\n description?: string;\n tags?: string[];\n assignee?: NeuKanbanAssignee;\n dueDate?: string;\n meta?: string;\n priority?: 'low' | 'medium' | 'high' | 'urgent';\n}\n\nexport interface NeuKanbanColumn {\n id: string;\n title: string;\n cards: NeuKanbanCard[];\n color?: string;\n wipLimit?: number;\n}\n\nexport interface NeuKanbanCardDropEvent {\n card: NeuKanbanCard;\n fromColumnId: string;\n toColumnId: string;\n previousIndex: number;\n currentIndex: number;\n columns: NeuKanbanColumn[];\n}\n\n@Component({\n selector: 'neu-kanban',\n imports: [CdkDropListGroup, CdkDropList, CdkDrag],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[style.--neu-kanban-column-width]': 'columnWidth()',\n },\n template: `\n <div class=\"neu-kanban\" cdkDropListGroup>\n @for (column of _columns(); track column.id) {\n <section class=\"neu-kanban__column\" [attr.aria-label]=\"column.title\">\n <header class=\"neu-kanban__column-header\">\n <div class=\"neu-kanban__column-title\">\n <span\n class=\"neu-kanban__column-accent\"\n [style.background]=\"column.color || 'var(--neu-primary)'\"\n aria-hidden=\"true\"\n ></span>\n <h3 class=\"neu-kanban__column-name\">{{ column.title }}</h3>\n </div>\n\n <div class=\"neu-kanban__column-meta\">\n @if (showCounts()) {\n <span class=\"neu-kanban__count\">{{ column.cards.length }}</span>\n }\n @if (showWipLimit() && column.wipLimit) {\n <span\n class=\"neu-kanban__wip\"\n [class.neu-kanban__wip--alert]=\"column.cards.length > column.wipLimit\"\n >\n {{ column.cards.length }}/{{ column.wipLimit }}\n </span>\n }\n </div>\n </header>\n\n <div\n class=\"neu-kanban__list\"\n cdkDropList\n [id]=\"column.id\"\n [cdkDropListData]=\"column.cards\"\n [cdkDropListConnectedTo]=\"connectedDropLists()\"\n (cdkDropListDropped)=\"onCardDrop($event, column.id)\"\n >\n @if (column.cards.length === 0) {\n <p class=\"neu-kanban__empty\">Drop cards here</p>\n }\n\n @for (card of column.cards; track card.id) {\n <article class=\"neu-kanban__card\" cdkDrag [cdkDragData]=\"card\">\n <div class=\"neu-kanban__card-header\">\n <div>\n <h4 class=\"neu-kanban__title\">{{ card.title }}</h4>\n </div>\n @if (card.priority) {\n <span\n class=\"neu-kanban__priority\"\n [class]=\"'neu-kanban__priority neu-kanban__priority--' + card.priority\"\n >\n {{ card.priority }}\n </span>\n }\n </div>\n\n @if (card.description) {\n <p class=\"neu-kanban__description\">{{ card.description }}</p>\n }\n\n @if (card.tags?.length) {\n <div class=\"neu-kanban__tags\">\n @for (tag of card.tags; track tag) {\n <span class=\"neu-kanban__tag\">{{ tag }}</span>\n }\n </div>\n }\n\n @if (card.assignee || card.meta || card.dueDate) {\n <div class=\"neu-kanban__footer\">\n <div class=\"neu-kanban__assignee\">\n @if (card.assignee) {\n <span class=\"neu-kanban__avatar\" [attr.aria-label]=\"card.assignee.name\">\n @if (card.assignee.avatar) {\n <img [src]=\"card.assignee.avatar\" [alt]=\"card.assignee.name\" />\n } @else {\n {{ assigneeInitials(card.assignee) }}\n }\n </span>\n <span class=\"neu-kanban__assignee-name\">{{ card.assignee.name }}</span>\n }\n </div>\n\n @if (card.meta || card.dueDate) {\n <span class=\"neu-kanban__meta-value\">{{ card.meta || card.dueDate }}</span>\n }\n </div>\n }\n </article>\n }\n </div>\n </section>\n }\n </div>\n `,\n styleUrl: './neu-kanban.component.scss',\n})\nexport class NeuKanbanComponent {\n readonly columns = input<NeuKanbanColumn[]>([]);\n readonly columnWidth = input<string>('320px');\n readonly showCounts = input<boolean>(true);\n readonly showWipLimit = input<boolean>(true);\n\n readonly columnsChange = output<NeuKanbanColumn[]>();\n readonly cardDrop = output<NeuKanbanCardDropEvent>();\n\n readonly _columns = signal<NeuKanbanColumn[]>([]);\n readonly connectedDropLists = computed(() => this._columns().map((column) => column.id));\n\n constructor() {\n effect(() => {\n this._columns.set(this._cloneColumns(this.columns()));\n });\n }\n\n assigneeInitials(assignee: NeuKanbanAssignee): string {\n if (assignee.initials) return assignee.initials;\n return assignee.name\n .split(' ')\n .filter(Boolean)\n .slice(0, 2)\n .map((chunk) => chunk[0]?.toUpperCase() ?? '')\n .join('');\n }\n\n onCardDrop(event: CdkDragDrop<NeuKanbanCard[]>, targetColumnId: string): void {\n const nextColumns = this._cloneColumns(this._columns());\n const sourceColumn = nextColumns.find((column) => column.id === event.previousContainer.id);\n const targetColumn = nextColumns.find((column) => column.id === targetColumnId);\n if (!sourceColumn || !targetColumn) return;\n\n if (event.previousContainer.id === targetColumnId) {\n moveItemInArray(targetColumn.cards, event.previousIndex, event.currentIndex);\n } else {\n transferArrayItem(\n sourceColumn.cards,\n targetColumn.cards,\n event.previousIndex,\n event.currentIndex,\n );\n }\n\n this._columns.set(nextColumns);\n this.columnsChange.emit(nextColumns);\n\n const movedCard = targetColumn.cards[event.currentIndex];\n if (movedCard) {\n this.cardDrop.emit({\n card: movedCard,\n fromColumnId: event.previousContainer.id,\n toColumnId: targetColumnId,\n previousIndex: event.previousIndex,\n currentIndex: event.currentIndex,\n columns: nextColumns,\n });\n }\n }\n\n private _cloneColumns(columns: NeuKanbanColumn[]): NeuKanbanColumn[] {\n return columns.map((column) => ({\n ...column,\n cards: column.cards.map((card) => ({\n ...card,\n tags: card.tags ? [...card.tags] : undefined,\n assignee: card.assignee ? { ...card.assignee } : undefined,\n })),\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-kanban.mjs","sources":["../../../../projects/ui-core/kanban/neu-kanban.component.ts","../../../../projects/ui-core/kanban/neural-ui-core-kanban.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport {\n CdkDrag,\n CdkDropList,\n CdkDropListGroup,\n type CdkDragDrop,\n moveItemInArray,\n transferArrayItem,\n} from '@angular/cdk/drag-drop';\n\nexport interface NeuKanbanAssignee {\n name: string;\n avatar?: string;\n initials?: string;\n}\n\nexport interface NeuKanbanCard {\n id: string;\n title: string;\n description?: string;\n tags?: string[];\n assignee?: NeuKanbanAssignee;\n dueDate?: string;\n meta?: string;\n priority?: 'low' | 'medium' | 'high' | 'urgent';\n}\n\nexport interface NeuKanbanColumn {\n id: string;\n title: string;\n cards: NeuKanbanCard[];\n color?: string;\n wipLimit?: number;\n}\n\nexport interface NeuKanbanCardDropEvent {\n card: NeuKanbanCard;\n fromColumnId: string;\n toColumnId: string;\n previousIndex: number;\n currentIndex: number;\n columns: NeuKanbanColumn[];\n}\n\n@Component({\n selector: 'neu-kanban',\n imports: [CdkDropListGroup, CdkDropList, CdkDrag],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[style.--neu-kanban-column-width]': 'columnWidth()',\n },\n template: `\n <div class=\"neu-kanban\" cdkDropListGroup>\n @for (column of _columns(); track column.id) {\n <section class=\"neu-kanban__column\" [attr.aria-label]=\"column.title\">\n <header class=\"neu-kanban__column-header\">\n <div class=\"neu-kanban__column-title\">\n <span\n class=\"neu-kanban__column-accent\"\n [style.background]=\"column.color || 'var(--neu-primary)'\"\n aria-hidden=\"true\"\n ></span>\n <h3 class=\"neu-kanban__column-name\">{{ column.title }}</h3>\n </div>\n\n <div class=\"neu-kanban__column-meta\">\n @if (showCounts()) {\n <span class=\"neu-kanban__count\">{{ column.cards.length }}</span>\n }\n @if (showWipLimit() && column.wipLimit) {\n <span\n class=\"neu-kanban__wip\"\n [class.neu-kanban__wip--alert]=\"column.cards.length > column.wipLimit\"\n >\n {{ column.cards.length }}/{{ column.wipLimit }}\n </span>\n }\n </div>\n </header>\n\n <div\n class=\"neu-kanban__list\"\n cdkDropList\n [id]=\"column.id\"\n [cdkDropListData]=\"column.cards\"\n [cdkDropListConnectedTo]=\"connectedDropLists()\"\n (cdkDropListDropped)=\"onCardDrop($event, column.id)\"\n >\n @if (column.cards.length === 0) {\n <p class=\"neu-kanban__empty\">Drop cards here</p>\n }\n\n @for (card of column.cards; track card.id) {\n <article class=\"neu-kanban__card\" cdkDrag [cdkDragData]=\"card\">\n <div class=\"neu-kanban__card-header\">\n <div>\n <h4 class=\"neu-kanban__title\">{{ card.title }}</h4>\n </div>\n @if (card.priority) {\n <span\n class=\"neu-kanban__priority\"\n [class]=\"'neu-kanban__priority neu-kanban__priority--' + card.priority\"\n >\n {{ card.priority }}\n </span>\n }\n </div>\n\n @if (card.description) {\n <p class=\"neu-kanban__description\">{{ card.description }}</p>\n }\n\n @if (card.tags?.length) {\n <div class=\"neu-kanban__tags\">\n @for (tag of card.tags; track tag) {\n <span class=\"neu-kanban__tag\">{{ tag }}</span>\n }\n </div>\n }\n\n @if (card.assignee || card.meta || card.dueDate) {\n <div class=\"neu-kanban__footer\">\n <div class=\"neu-kanban__assignee\">\n @if (card.assignee) {\n <span class=\"neu-kanban__avatar\" [attr.aria-label]=\"card.assignee.name\">\n @if (card.assignee.avatar) {\n <img [src]=\"card.assignee.avatar\" [alt]=\"card.assignee.name\" />\n } @else {\n {{ assigneeInitials(card.assignee) }}\n }\n </span>\n <span class=\"neu-kanban__assignee-name\">{{ card.assignee.name }}</span>\n }\n </div>\n\n @if (card.meta || card.dueDate) {\n <span class=\"neu-kanban__meta-value\">{{ card.meta || card.dueDate }}</span>\n }\n </div>\n }\n </article>\n }\n </div>\n </section>\n }\n </div>\n `,\n styleUrl: './neu-kanban.component.scss',\n})\nexport class NeuKanbanComponent {\n readonly columns = input<NeuKanbanColumn[]>([]);\n readonly columnWidth = input<string>('320px');\n readonly showCounts = input<boolean>(true);\n readonly showWipLimit = input<boolean>(true);\n\n readonly columnsChange = output<NeuKanbanColumn[]>();\n readonly cardDrop = output<NeuKanbanCardDropEvent>();\n\n readonly _columns = signal<NeuKanbanColumn[]>([]);\n readonly connectedDropLists = computed(() => this._columns().map((column) => column.id));\n\n constructor() {\n effect(() => {\n this._columns.set(this._cloneColumns(this.columns()));\n });\n }\n\n assigneeInitials(assignee: NeuKanbanAssignee): string {\n if (assignee.initials) return assignee.initials;\n return assignee.name\n .split(' ')\n .filter(Boolean)\n .slice(0, 2)\n .map((chunk) => chunk[0]?.toUpperCase() ?? '')\n .join('');\n }\n\n onCardDrop(event: CdkDragDrop<NeuKanbanCard[]>, targetColumnId: string): void {\n const nextColumns = this._cloneColumns(this._columns());\n const sourceColumn = nextColumns.find((column) => column.id === event.previousContainer.id);\n const targetColumn = nextColumns.find((column) => column.id === targetColumnId);\n if (!sourceColumn || !targetColumn) return;\n\n if (event.previousContainer.id === targetColumnId) {\n moveItemInArray(targetColumn.cards, event.previousIndex, event.currentIndex);\n } else {\n transferArrayItem(\n sourceColumn.cards,\n targetColumn.cards,\n event.previousIndex,\n event.currentIndex,\n );\n }\n\n this._columns.set(nextColumns);\n this.columnsChange.emit(nextColumns);\n\n const movedCard = targetColumn.cards[event.currentIndex];\n if (movedCard) {\n this.cardDrop.emit({\n card: movedCard,\n fromColumnId: event.previousContainer.id,\n toColumnId: targetColumnId,\n previousIndex: event.previousIndex,\n currentIndex: event.currentIndex,\n columns: nextColumns,\n });\n }\n }\n\n private _cloneColumns(columns: NeuKanbanColumn[]): NeuKanbanColumn[] {\n return columns.map((column) => ({\n ...column,\n cards: column.cards.map((card) => ({\n ...card,\n tags: card.tags ? [...card.tags] : undefined,\n assignee: card.assignee ? { ...card.assignee } : undefined,\n })),\n }));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -12,48 +12,33 @@ let _seq = 0;
12
12
  */
13
13
  class NeuKnobComponent {
14
14
  /** Valor mínimo / Min value */
15
- min = input(0, /* @ts-ignore */
16
- ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
15
+ min = input(0, ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
17
16
  /** Valor máximo / Max value */
18
- max = input(100, /* @ts-ignore */
19
- ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
17
+ max = input(100, ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
20
18
  /** Incremento por paso / Step increment */
21
- step = input(1, /* @ts-ignore */
22
- ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
19
+ step = input(1, ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
23
20
  /** Tamaño del dial en px / Dial size in px */
24
- size = input(80, /* @ts-ignore */
25
- ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
21
+ size = input(80, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
26
22
  /** Muestra el valor numérico en el centro / Shows the numeric value in the center */
27
- showValue = input(true, /* @ts-ignore */
28
- ...(ngDevMode ? [{ debugName: "showValue" }] : /* istanbul ignore next */ []));
23
+ showValue = input(true, ...(ngDevMode ? [{ debugName: "showValue" }] : /* istanbul ignore next */ []));
29
24
  /** Etiqueta visible / Visible label */
30
- label = input('', /* @ts-ignore */
31
- ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
25
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
32
26
  /** Emitido en cada cambio / Emitted on each change */
33
27
  valueChange = output();
34
28
  _id = `neu-knob-${++_seq}`;
35
- _cvaDisabled = signal(false, /* @ts-ignore */
36
- ...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
37
- _value = signal(0, /* @ts-ignore */
38
- ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
39
- _strokeWidth = computed(() => Math.max(4, this.size() * 0.1), /* @ts-ignore */
40
- ...(ngDevMode ? [{ debugName: "_strokeWidth" }] : /* istanbul ignore next */ []));
41
- _radius = computed(() => (this.size() - this._strokeWidth()) / 2 - 2, /* @ts-ignore */
42
- ...(ngDevMode ? [{ debugName: "_radius" }] : /* istanbul ignore next */ []));
43
- _circumference = computed(() => 2 * Math.PI * this._radius(), /* @ts-ignore */
44
- ...(ngDevMode ? [{ debugName: "_circumference" }] : /* istanbul ignore next */ []));
29
+ _cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
30
+ _value = signal(0, ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
31
+ _strokeWidth = computed(() => Math.max(4, this.size() * 0.1), ...(ngDevMode ? [{ debugName: "_strokeWidth" }] : /* istanbul ignore next */ []));
32
+ _radius = computed(() => (this.size() - this._strokeWidth()) / 2 - 2, ...(ngDevMode ? [{ debugName: "_radius" }] : /* istanbul ignore next */ []));
33
+ _circumference = computed(() => 2 * Math.PI * this._radius(), ...(ngDevMode ? [{ debugName: "_circumference" }] : /* istanbul ignore next */ []));
45
34
  /** Arc spans 260° (from -40° to 220°) */
46
- _arcLength = computed(() => (260 / 360) * this._circumference(), /* @ts-ignore */
47
- ...(ngDevMode ? [{ debugName: "_arcLength" }] : /* istanbul ignore next */ []));
35
+ _arcLength = computed(() => (260 / 360) * this._circumference(), ...(ngDevMode ? [{ debugName: "_arcLength" }] : /* istanbul ignore next */ []));
48
36
  _normalizedValue = computed(() => {
49
37
  const range = this.max() - this.min();
50
38
  return range === 0 ? 0 : (this._value() - this.min()) / range;
51
- }, /* @ts-ignore */
52
- ...(ngDevMode ? [{ debugName: "_normalizedValue" }] : /* istanbul ignore next */ []));
53
- _arcDashArray = computed(() => `${this._arcLength()} ${this._circumference()}`, /* @ts-ignore */
54
- ...(ngDevMode ? [{ debugName: "_arcDashArray" }] : /* istanbul ignore next */ []));
55
- _arcDashOffset = computed(() => this._arcLength() * (1 - this._normalizedValue()), /* @ts-ignore */
56
- ...(ngDevMode ? [{ debugName: "_arcDashOffset" }] : /* istanbul ignore next */ []));
39
+ }, ...(ngDevMode ? [{ debugName: "_normalizedValue" }] : /* istanbul ignore next */ []));
40
+ _arcDashArray = computed(() => `${this._arcLength()} ${this._circumference()}`, ...(ngDevMode ? [{ debugName: "_arcDashArray" }] : /* istanbul ignore next */ []));
41
+ _arcDashOffset = computed(() => this._arcLength() * (1 - this._normalizedValue()), ...(ngDevMode ? [{ debugName: "_arcDashOffset" }] : /* istanbul ignore next */ []));
57
42
  // Indicator position on the track (relative to SVG center)
58
43
  // El arco empieza en rotate(-220°) desde el Este del SVG.
59
44
  // El punto indicador reposa en el Norte (12 en punto).
@@ -62,12 +47,9 @@ class NeuKnobComponent {
62
47
  // (arco de 7:40 → 1:20 pasando por 12:00 en la mitad)
63
48
  // Arc starts at rotate(-220°) from East; indicator natural position is North (12 o'clock).
64
49
  // Correct clockwise rotation formula: θ = 230 + normalizedValue × 260.
65
- _indicatorAngle = computed(() => this._normalizedValue() * 260 + 230, /* @ts-ignore */
66
- ...(ngDevMode ? [{ debugName: "_indicatorAngle" }] : /* istanbul ignore next */ []));
67
- _indicatorX = computed(() => this.size() / 2, /* @ts-ignore */
68
- ...(ngDevMode ? [{ debugName: "_indicatorX" }] : /* istanbul ignore next */ []));
69
- _indicatorY = computed(() => this.size() / 2 - this._radius(), /* @ts-ignore */
70
- ...(ngDevMode ? [{ debugName: "_indicatorY" }] : /* istanbul ignore next */ []));
50
+ _indicatorAngle = computed(() => this._normalizedValue() * 260 + 230, ...(ngDevMode ? [{ debugName: "_indicatorAngle" }] : /* istanbul ignore next */ []));
51
+ _indicatorX = computed(() => this.size() / 2, ...(ngDevMode ? [{ debugName: "_indicatorX" }] : /* istanbul ignore next */ []));
52
+ _indicatorY = computed(() => this.size() / 2 - this._radius(), ...(ngDevMode ? [{ debugName: "_indicatorY" }] : /* istanbul ignore next */ []));
71
53
  _dragStartAngle = 0;
72
54
  _dragStartValue = 0;
73
55
  _onChange = () => { };
@@ -87,8 +69,7 @@ class NeuKnobComponent {
87
69
  hostClasses = computed(() => ({
88
70
  'neu-knob': true,
89
71
  'neu-knob--disabled': this._cvaDisabled(),
90
- }), /* @ts-ignore */
91
- ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
72
+ }), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
92
73
  writeValue(val) {
93
74
  this._value.set(this._clamp(val ?? this.min()));
94
75
  }
@@ -176,8 +157,8 @@ class NeuKnobComponent {
176
157
  _clamp(v) {
177
158
  return Math.min(this.max(), Math.max(this.min(), v));
178
159
  }
179
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuKnobComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
180
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuKnobComponent, isStandalone: true, selector: "neu-knob", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, host: { properties: { "class": "hostClasses()" } }, providers: [
160
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuKnobComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
161
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuKnobComponent, isStandalone: true, selector: "neu-knob", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, host: { properties: { "class": "hostClasses()" } }, providers: [
181
162
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NeuKnobComponent), multi: true },
182
163
  ], ngImport: i0, template: `
183
164
  <div
@@ -254,7 +235,7 @@ class NeuKnobComponent {
254
235
  }
255
236
  `, isInline: true, styles: ["@charset \"UTF-8\";.neu-knob{display:inline-flex;flex-direction:column;align-items:center;gap:6px;-webkit-user-select:none;user-select:none}.neu-knob--disabled{opacity:.5;pointer-events:none}.neu-knob__dial{position:relative;display:flex;align-items:center;justify-content:center;cursor:grab;border-radius:50%;touch-action:none}.neu-knob__dial:focus-visible{outline:2px solid var(--neu-focus-ring, #0ea5e9);outline-offset:3px}.neu-knob__dial:active{cursor:grabbing}.neu-knob__track{stroke:var(--neu-knob-track, var(--neu-border-color, #e5e7eb))}.neu-knob__value-arc{stroke:var(--neu-color-primary, #0ea5e9);transition:stroke-dashoffset 40ms linear}.neu-knob__indicator{fill:var(--neu-color-primary, #0ea5e9)}.neu-knob__display{position:absolute;font-size:.8125rem;font-weight:600;color:var(--neu-knob-display-color, var(--neu-text, #0f172a));-webkit-text-fill-color:var(--neu-knob-display-color, var(--neu-text, #0f172a));pointer-events:none;font-variant-numeric:tabular-nums}.neu-knob__label{font-size:.8125rem;color:var(--neu-knob-label-color, var(--neu-text-muted, #64748b));cursor:pointer}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
256
237
  }
257
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuKnobComponent, decorators: [{
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuKnobComponent, decorators: [{
258
239
  type: Component,
259
240
  args: [{ selector: 'neu-knob', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class]': 'hostClasses()' }, providers: [
260
241
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NeuKnobComponent), multi: true },