@neural-ui/core 1.2.0 → 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 +209 -7
  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 +5 -2107
  238. package/url-state/package.json +4 -0
  239. package/virtual-list/package.json +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-date-input.mjs","sources":["../../../../projects/ui-core/date-input/neu-date-input.component.ts","../../../../projects/ui-core/date-input/neural-ui-core-date-input.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n OnDestroy,\n ViewEncapsulation,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n// ── Exported types ───────────────────────────────────────────────────────────\n\n/** Rango de fechas seleccionado / Selected date range */\nexport interface NeuDateRange {\n start: Date | null;\n end: Date | null;\n}\n\n// ── Private helpers ──────────────────────────────────────────────────────────\n\nlet _neuDateInputIdSeq = 0;\n\ninterface CalendarDay {\n date: Date;\n inMonth: boolean;\n isToday: boolean;\n isSelected: boolean;\n}\n\ninterface DrumSlot {\n value: number;\n offset: number;\n label: string;\n}\n\ninterface RangeCell {\n date: Date;\n day: number;\n ts: number;\n current: boolean;\n today: boolean;\n selected: boolean;\n rangeStart: boolean;\n rangeEnd: boolean;\n inRange: boolean;\n label: string;\n}\n\nfunction sameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction cloneDate(d: Date): Date {\n return new Date(d.getTime());\n}\n\n// ── Component ────────────────────────────────────────────────────────────────\n\n/**\n * NeuralUI DateInput — campo de fecha/hora unificado con modo rango.\n * Unified date/time field with range mode.\n *\n * Uso básico / Basic usage:\n * <neu-date-input type=\"date\" [formControl]=\"dateCtrl\" />\n * <neu-date-input type=\"time\" [formControl]=\"timeCtrl\" />\n * <neu-date-input type=\"datetime-local\" [formControl]=\"dateTimeCtrl\" />\n * <neu-date-input type=\"range\" [formControl]=\"rangeCtrl\" />\n */\n@Component({\n selector: 'neu-date-input',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-date-input-host',\n '[class.neu-date-input-host--sm]': 'size() === \"sm\"',\n '[class.neu-date-input-host--lg]': 'size() === \"lg\"',\n '[class.neu-drp]': '_isRange()',\n '[class.neu-drp--open]': '_isRange() && isOpen()',\n '[class.neu-drp--disabled]': '_isRange() && isDisabledFinal()',\n '(keydown.escape)': 'close()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuDateInputComponent),\n multi: true,\n },\n ],\n template: `\n @if (_isRange()) {\n @if (label()) {\n <label class=\"neu-drp__label\" [for]=\"_id\">{{ label() }}</label>\n }\n <button\n type=\"button\"\n [id]=\"_id\"\n class=\"neu-drp__trigger\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-label]=\"label() || _texts().rangeAriaLabel\"\n [disabled]=\"isDisabledFinal()\"\n (click)=\"toggle()\"\n >\n <span class=\"neu-drp__icon\" aria-hidden=\"true\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n </span>\n <span class=\"neu-drp__value\" [class.neu-drp__value--placeholder]=\"!_hasRange()\">\n {{ _hasRange() ? _rangeDisplayValue() : _rangePlaceholderText() }}\n </span>\n </button>\n @if (isOpen()) {\n <div\n class=\"neu-drp__panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"_texts().rangeAriaLabel\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"neu-drp__calendars\">\n <div class=\"neu-drp__cal\">\n <div class=\"neu-drp__cal-nav\">\n <button type=\"button\" [attr.aria-label]=\"_texts().prevMonth\" (click)=\"_prevLeft()\">\n ‹\n </button>\n <span class=\"neu-drp__cal-title\">{{ _leftTitle() }}</span>\n <button type=\"button\" [attr.aria-label]=\"_texts().nextMonth\" (click)=\"_nextLeft()\">\n ›\n </button>\n </div>\n <div class=\"neu-drp__cal-grid\">\n @for (d of _weekDayLabels(); track d) {\n <span class=\"neu-drp__day-label\">{{ d }}</span>\n }\n @for (cell of _leftDays(); track cell.ts) {\n <button\n type=\"button\"\n class=\"neu-drp__cell\"\n [class.neu-drp__cell--other-month]=\"!cell.current\"\n [class.neu-drp__cell--today]=\"cell.today\"\n [class.neu-drp__cell--selected]=\"cell.selected\"\n [class.neu-drp__cell--range-start]=\"cell.rangeStart\"\n [class.neu-drp__cell--range-end]=\"cell.rangeEnd\"\n [class.neu-drp__cell--in-range]=\"cell.inRange\"\n [attr.aria-label]=\"cell.label\"\n [attr.aria-pressed]=\"cell.selected\"\n (click)=\"_selectDay(cell.date)\"\n (mouseenter)=\"_hoverDay(cell.date)\"\n >\n {{ cell.day }}\n </button>\n }\n </div>\n </div>\n <div class=\"neu-drp__cal\">\n <div class=\"neu-drp__cal-nav\">\n <button type=\"button\" [attr.aria-label]=\"_texts().prevMonth\" (click)=\"_prevRight()\">\n ‹\n </button>\n <span class=\"neu-drp__cal-title\">{{ _rightTitle() }}</span>\n <button type=\"button\" [attr.aria-label]=\"_texts().nextMonth\" (click)=\"_nextRight()\">\n ›\n </button>\n </div>\n <div class=\"neu-drp__cal-grid\">\n @for (d of _weekDayLabels(); track d) {\n <span class=\"neu-drp__day-label\">{{ d }}</span>\n }\n @for (cell of _rightDays(); track cell.ts) {\n <button\n type=\"button\"\n class=\"neu-drp__cell\"\n [class.neu-drp__cell--other-month]=\"!cell.current\"\n [class.neu-drp__cell--today]=\"cell.today\"\n [class.neu-drp__cell--selected]=\"cell.selected\"\n [class.neu-drp__cell--range-start]=\"cell.rangeStart\"\n [class.neu-drp__cell--range-end]=\"cell.rangeEnd\"\n [class.neu-drp__cell--in-range]=\"cell.inRange\"\n [attr.aria-label]=\"cell.label\"\n [attr.aria-pressed]=\"cell.selected\"\n (click)=\"_selectDay(cell.date)\"\n (mouseenter)=\"_hoverDay(cell.date)\"\n >\n {{ cell.day }}\n </button>\n }\n </div>\n </div>\n </div>\n <div class=\"neu-drp__footer\">\n <button type=\"button\" class=\"neu-drp__clear\" (click)=\"_clearRange()\">\n {{ _texts().clear }}\n </button>\n <button\n type=\"button\"\n class=\"neu-drp__apply\"\n [disabled]=\"!_canApply()\"\n (click)=\"_applyRange()\"\n >\n {{ _texts().apply }}\n </button>\n </div>\n </div>\n }\n } @else {\n @if (label()) {\n <label class=\"neu-date-input__label\" [for]=\"_id\">{{ label() }}</label>\n }\n <div\n class=\"neu-date-input\"\n [class.neu-date-input--open]=\"isOpen()\"\n [class.neu-date-input--disabled]=\"isDisabledFinal()\"\n [class.neu-date-input--error]=\"hasError()\"\n >\n <button\n class=\"neu-date-input__trigger\"\n type=\"button\"\n [id]=\"_id\"\n [disabled]=\"isDisabledFinal() || readonly()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'dialog'\"\n (click)=\"toggle()\"\n >\n <span class=\"neu-date-input__icon\" aria-hidden=\"true\">\n @if (type() === 'time') {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n } @else {\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n }\n </span>\n <span\n class=\"neu-date-input__display\"\n [class.neu-date-input__display--placeholder]=\"!_value()\"\n >\n {{ displayValue() || placeholderText() }}\n </span>\n </button>\n @if (isOpen()) {\n <div\n class=\"neu-date-input__panel\"\n [class.neu-date-input__panel--time-only]=\"type() === 'time'\"\n role=\"dialog\"\n [attr.aria-label]=\"_texts().chooseDate + (monthLabel() ? ': ' + monthLabel() : '')\"\n (click)=\"$event.stopPropagation()\"\n >\n @if (type() !== 'time') {\n <div class=\"neu-date-input__calendar\">\n <div class=\"neu-date-input__cal-nav\">\n <button\n class=\"neu-date-input__cal-arrow\"\n type=\"button\"\n (click)=\"prevMonth()\"\n [attr.aria-label]=\"_texts().prevMonth\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n <span class=\"neu-date-input__cal-title\">{{ monthLabel() }}</span>\n <button\n class=\"neu-date-input__cal-arrow\"\n type=\"button\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"_texts().nextMonth\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n </div>\n <div class=\"neu-date-input__cal-weekdays\">\n @for (d of weekdays(); track d) {\n <span>{{ d }}</span>\n }\n </div>\n <div class=\"neu-date-input__cal-grid\">\n @for (day of calendarDays(); track day.date.getTime()) {\n <button\n class=\"neu-date-input__cal-day\"\n type=\"button\"\n [class.neu-date-input__cal-day--other]=\"!day.inMonth\"\n [class.neu-date-input__cal-day--today]=\"day.isToday\"\n [class.neu-date-input__cal-day--selected]=\"day.isSelected\"\n [attr.aria-label]=\"formatDayLabel(day.date)\"\n [attr.aria-pressed]=\"day.isSelected\"\n (click)=\"selectDay(day)\"\n >\n {{ day.date.getDate() }}\n </button>\n }\n </div>\n <div class=\"neu-date-input__cal-footer\">\n <button class=\"neu-date-input__cal-footer-btn\" type=\"button\" (click)=\"clear()\">\n {{ _texts().delete }}\n </button>\n <button\n class=\"neu-date-input__cal-footer-btn neu-date-input__cal-footer-btn--today\"\n type=\"button\"\n (click)=\"today()\"\n >\n {{ _texts().today }}\n </button>\n </div>\n </div>\n }\n @if (type() === 'datetime-local') {\n <div class=\"neu-date-input__sep\"></div>\n }\n @if (type() !== 'date') {\n <div class=\"neu-date-input__time\">\n <div class=\"neu-date-input__drum\">\n <button\n class=\"neu-date-input__drum-arrow\"\n type=\"button\"\n (click)=\"changeHour(-1)\"\n [attr.aria-label]=\"_texts().prevHour\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n </button>\n <div class=\"neu-date-input__drum-track\" (wheel)=\"onHourWheel($event)\">\n @for (slot of hourSlots(); track slot.offset) {\n <div\n class=\"neu-date-input__drum-item\"\n [class.neu-date-input__drum-item--selected]=\"slot.offset === 0\"\n [class.neu-date-input__drum-item--adjacent]=\"slot.offset !== 0\"\n (click)=\"slot.offset !== 0 && changeHour(slot.offset)\"\n >\n {{ slot.label }}\n </div>\n }\n </div>\n <button\n class=\"neu-date-input__drum-arrow\"\n type=\"button\"\n (click)=\"changeHour(1)\"\n [attr.aria-label]=\"_texts().nextHour\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n </div>\n <span class=\"neu-date-input__time-colon\">:</span>\n <div class=\"neu-date-input__drum\">\n <button\n class=\"neu-date-input__drum-arrow\"\n type=\"button\"\n (click)=\"changeMinute(-1)\"\n [attr.aria-label]=\"_texts().prevMinute\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n </button>\n <div class=\"neu-date-input__drum-track\" (wheel)=\"onMinuteWheel($event)\">\n @for (slot of minuteSlots(); track slot.offset) {\n <div\n class=\"neu-date-input__drum-item\"\n [class.neu-date-input__drum-item--selected]=\"slot.offset === 0\"\n [class.neu-date-input__drum-item--adjacent]=\"slot.offset !== 0\"\n (click)=\"slot.offset !== 0 && changeMinute(slot.offset)\"\n >\n {{ slot.label }}\n </div>\n }\n </div>\n <button\n class=\"neu-date-input__drum-arrow\"\n type=\"button\"\n (click)=\"changeMinute(1)\"\n [attr.aria-label]=\"_texts().nextMinute\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n @if (hasError()) {\n <p class=\"neu-date-input__error\" role=\"alert\">{{ errorMessage() }}</p>\n } @else if (hint()) {\n <p class=\"neu-date-input__hint\">{{ hint() }}</p>\n }\n }\n `,\n styleUrl: './neu-date-input.component.scss',\n})\nexport class NeuDateInputComponent implements ControlValueAccessor, OnDestroy {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly doc = inject(DOCUMENT);\n private _langObserver?: MutationObserver;\n\n /** Tipo del campo / Field type */\n type = input<'date' | 'time' | 'datetime-local' | 'range'>('date');\n /** Etiqueta / Label */\n label = input<string>('');\n /** Texto de ayuda / Help text */\n hint = input<string>('');\n /** Mensaje de error / Error message */\n errorMessage = input<string>('');\n /** Deshabilita / Disabled */\n disabled = input<boolean>(false);\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n /** Solo lectura / Read only */\n readonly = input<boolean>(false);\n /** Nombre / Field name */\n name = input<string>('');\n /** ID accesible / Accessible ID */\n inputId = input<string>('');\n /** Requerido / Required */\n required = input<boolean>(false);\n /** Mínimo / Minimum */\n min = input<string | null>(null);\n /** Máximo / Maximum */\n max = input<string | null>(null);\n /** Paso / Step */\n step = input<number | null>(null);\n /** Locale explícito opcional / Optional explicit locale */\n locale = input<string | null>(null);\n\n // ── Range-mode inputs ────────────────────────────────────────────\n /** Placeholder del trigger de rango / Range trigger placeholder */\n placeholder = input<string>('');\n /** Formato de fecha en modo rango / Date display format in range mode */\n dateFormat = input<'short' | 'medium' | 'long' | 'full' | 'numeric'>('short');\n\n // ── Outputs ──────────────────────────────────────────────────────\n /** Emitido al confirmar el rango / Emitted when range is confirmed */\n readonly rangeChange = output<NeuDateRange>();\n\n // ── Estado interno / Internal state ──────────────────────────────\n protected readonly _id = `neu-date-input-${++_neuDateInputIdSeq}`;\n readonly isOpen = signal(false);\n readonly _isRange = computed(() => this.type() === 'range');\n private readonly _cvaDisabled = signal(false);\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n readonly hasError = computed(() => !!this.errorMessage());\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onChange: (v: any) => void = () => {};\n private _onTouched: () => void = () => {};\n\n // ── State — single ────────────────────────────────────────────────\n protected readonly _value = signal<string>('');\n protected readonly _viewYear = signal(new Date().getFullYear());\n protected readonly _viewMonth = signal(new Date().getMonth());\n protected readonly _selYear = signal<number | null>(null);\n protected readonly _selMonth = signal<number | null>(null);\n protected readonly _selDay = signal<number | null>(null);\n protected readonly _selHour = signal(0);\n protected readonly _selMinute = signal(0);\n\n // ── State — range ─────────────────────────────────────────────────\n private readonly _today = new Date();\n private readonly _documentLang = signal(\n this.#normalizedLocale(this.doc.documentElement.lang) || 'es',\n );\n private readonly _pickStart = signal<Date | null>(null);\n private readonly _pickEnd = signal<Date | null>(null);\n private readonly _hoverDate = signal<Date | null>(null);\n readonly _leftCursor = signal<Date>(\n new Date(this._today.getFullYear(), this._today.getMonth(), 1),\n );\n readonly _rightCursor = computed(() => {\n const l = this._leftCursor();\n return new Date(l.getFullYear(), l.getMonth() + 1, 1);\n });\n readonly _hasRange = computed(() => !!this._pickStart());\n readonly _canApply = computed(() => this._pickStart() !== null && this._pickEnd() !== null);\n readonly _resolvedLocale = computed(\n () => this.#normalizedLocale(this.locale()) || this._documentLang() || 'es',\n );\n readonly _texts = computed(() => {\n const spanish = this._resolvedLocale().toLowerCase().startsWith('es');\n return spanish\n ? {\n rangeAriaLabel: 'Seleccionar rango de fechas',\n prevMonth: 'Mes anterior',\n nextMonth: 'Mes siguiente',\n clear: 'Limpiar',\n apply: 'Aplicar',\n chooseDate: 'Seleccionar fecha',\n delete: 'Borrar',\n today: 'Hoy',\n prevHour: 'Hora anterior',\n nextHour: 'Hora siguiente',\n prevMinute: 'Minuto anterior',\n nextMinute: 'Minuto siguiente',\n rangePlaceholder: 'Seleccionar fechas',\n timePlaceholder: 'hh:mm',\n datePlaceholder: 'dd/mm/aaaa',\n dateTimePlaceholder: 'dd/mm/aaaa, hh:mm',\n }\n : {\n rangeAriaLabel: 'Select date range',\n prevMonth: 'Previous month',\n nextMonth: 'Next month',\n clear: 'Clear',\n apply: 'Apply',\n chooseDate: 'Choose date',\n delete: 'Clear',\n today: 'Today',\n prevHour: 'Previous hour',\n nextHour: 'Next hour',\n prevMinute: 'Previous minute',\n nextMinute: 'Next minute',\n rangePlaceholder: 'Select dates',\n timePlaceholder: 'hh:mm',\n datePlaceholder: 'mm/dd/yyyy',\n dateTimePlaceholder: 'mm/dd/yyyy, hh:mm',\n };\n });\n\n readonly _weekDayLabels = computed(() => this.#buildWeekdayLabels('short'));\n readonly _leftTitle = computed(() => this._monthTitle(this._leftCursor()));\n readonly _rightTitle = computed(() => this._monthTitle(this._rightCursor()));\n readonly _leftDays = computed(() => this._buildRangeMonth(this._leftCursor()));\n readonly _rightDays = computed(() => this._buildRangeMonth(this._rightCursor()));\n readonly _rangePlaceholderText = computed(\n () => this.placeholder() || this._texts().rangePlaceholder,\n );\n\n constructor() {\n if (typeof MutationObserver !== 'undefined') {\n this._langObserver = new MutationObserver(() => {\n this._documentLang.set(this.#normalizedLocale(this.doc.documentElement.lang) || 'es');\n });\n this._langObserver.observe(this.doc.documentElement, {\n attributes: true,\n attributeFilter: ['lang'],\n });\n }\n }\n\n ngOnDestroy(): void {\n this._langObserver?.disconnect();\n }\n\n private _monthTitle(d: Date): string {\n return this.#capitalize(\n new Intl.DateTimeFormat(this._resolvedLocale(), { month: 'long', year: 'numeric' }).format(d),\n );\n }\n\n readonly _rangeDisplayValue = computed(() => {\n const s = this._pickStart();\n const e = this._pickEnd();\n if (!s) return this.placeholder();\n if (!e) return this._fmtDate(s);\n return `${this._fmtDate(s)} – ${this._fmtDate(e)}`;\n });\n\n private _fmtDate(d: Date): string {\n const fmt = this.dateFormat();\n const opts: Record<string, Intl.DateTimeFormatOptions> = {\n short: { day: '2-digit', month: '2-digit', year: 'numeric' },\n medium: { day: '2-digit', month: 'short', year: 'numeric' },\n long: { day: 'numeric', month: 'long', year: 'numeric' },\n full: { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' },\n numeric: { day: 'numeric', month: 'numeric', year: '2-digit' },\n };\n return d.toLocaleDateString(this._resolvedLocale(), opts[fmt] ?? opts['short']);\n }\n\n private _buildRangeMonth(cursor: Date): RangeCell[] {\n const year = cursor.getFullYear();\n const month = cursor.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const startOffset = (firstDay.getDay() + 6) % 7;\n const cells: RangeCell[] = [];\n for (let i = startOffset - 1; i >= 0; i--) {\n cells.push(this._rangeCell(new Date(year, month, -i), false));\n }\n for (let d = 1; d <= lastDay.getDate(); d++) {\n cells.push(this._rangeCell(new Date(year, month, d), true));\n }\n while (cells.length % 7 !== 0 || cells.length < 42) {\n cells.push(\n this._rangeCell(\n new Date(year, month + 1, cells.length - startOffset - lastDay.getDate() + 1),\n false,\n ),\n );\n }\n return cells;\n }\n\n private _rangeCell(date: Date, current: boolean): RangeCell {\n const s = this._pickStart();\n const e = this._pickEnd();\n const h = this._hoverDate();\n const rangeEnd = e ?? h;\n const inRange =\n s && rangeEnd\n ? (date > s && date < rangeEnd) || (rangeEnd < s && date > rangeEnd && date < s)\n : false;\n return {\n date,\n day: date.getDate(),\n ts: date.getTime(),\n current,\n today: sameDay(date, this._today),\n selected: (s && sameDay(date, s)) || (e && sameDay(date, e)) || false,\n rangeStart: s ? sameDay(date, s) : false,\n rangeEnd: e ? sameDay(date, e) : false,\n inRange: !!inRange,\n label: date.toLocaleDateString(this._resolvedLocale()),\n };\n }\n\n // ── Range actions ─────────────────────────────────────────────────\n _prevLeft(): void {\n this._leftCursor.update((d) => new Date(d.getFullYear(), d.getMonth() - 1, 1));\n }\n _nextLeft(): void {\n this._leftCursor.update((d) => new Date(d.getFullYear(), d.getMonth() + 1, 1));\n }\n _prevRight(): void {\n this._leftCursor.update((d) => new Date(d.getFullYear(), d.getMonth() - 1, 1));\n }\n _nextRight(): void {\n this._leftCursor.update((d) => new Date(d.getFullYear(), d.getMonth() + 1, 1));\n }\n\n _selectDay(date: Date): void {\n const s = this._pickStart();\n if (!s || this._pickEnd()) {\n this._pickStart.set(cloneDate(date));\n this._pickEnd.set(null);\n this._hoverDate.set(null);\n } else {\n if (date < s) {\n this._pickEnd.set(cloneDate(s));\n this._pickStart.set(cloneDate(date));\n } else {\n this._pickEnd.set(cloneDate(date));\n }\n this._hoverDate.set(null);\n }\n }\n\n _hoverDay(date: Date): void {\n if (this._pickStart() && !this._pickEnd()) this._hoverDate.set(date);\n }\n\n _applyRange(): void {\n const range: NeuDateRange = { start: this._pickStart(), end: this._pickEnd() };\n this._onChange(range);\n this.rangeChange.emit(range);\n this._onTouched();\n this.isOpen.set(false);\n }\n\n _clearRange(): void {\n this._pickStart.set(null);\n this._pickEnd.set(null);\n this._hoverDate.set(null);\n const range: NeuDateRange = { start: null, end: null };\n this._onChange(range);\n this.rangeChange.emit(range);\n }\n\n // ── Single computed ───────────────────────────────────────────────\n readonly displayValue = computed(() => {\n const v = this._value();\n if (!v) return '';\n const t = this.type();\n if (t === 'date') {\n const d = new Date(v + 'T00:00:00');\n return isNaN(d.getTime())\n ? v\n : d.toLocaleDateString(this._resolvedLocale(), {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n }\n if (t === 'time') return v;\n const [datePart, timePart] = v.split('T');\n const d = new Date(datePart + 'T00:00:00');\n return (\n (isNaN(d.getTime())\n ? datePart\n : d.toLocaleDateString(this._resolvedLocale(), {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n })) +\n ', ' +\n (timePart?.slice(0, 5) ?? '')\n );\n });\n\n readonly placeholderText = computed(() => {\n switch (this.type()) {\n case 'time':\n return this._texts().timePlaceholder;\n case 'datetime-local':\n return this._texts().dateTimePlaceholder;\n default:\n return this._texts().datePlaceholder;\n }\n });\n\n readonly monthLabel = computed(() =>\n this.#capitalize(\n new Date(this._viewYear(), this._viewMonth(), 1).toLocaleDateString(this._resolvedLocale(), {\n month: 'long',\n year: 'numeric',\n }),\n ),\n );\n\n readonly weekdays = computed(() => this.#buildWeekdayLabels('narrow'));\n\n readonly calendarDays = computed((): CalendarDay[] => {\n const year = this._viewYear();\n const month = this._viewMonth();\n const today = new Date();\n const firstDay = new Date(year, month, 1);\n const startDow = (firstDay.getDay() + 6) % 7;\n const days: CalendarDay[] = [];\n for (let i = startDow; i > 0; i--) {\n days.push({\n date: new Date(year, month, 1 - i),\n inMonth: false,\n isToday: false,\n isSelected: false,\n });\n }\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n for (let d = 1; d <= daysInMonth; d++) {\n const date = new Date(year, month, d);\n days.push({\n date,\n inMonth: true,\n isToday: date.toDateString() === today.toDateString(),\n isSelected: this._selYear() === year && this._selMonth() === month && this._selDay() === d,\n });\n }\n let next = 1;\n while (days.length < 42) {\n days.push({\n date: new Date(year, month + 1, next++),\n inMonth: false,\n isToday: false,\n isSelected: false,\n });\n }\n return days;\n });\n\n readonly hourSlots = computed(() => this._drumSlots(this._selHour(), 24));\n readonly minuteSlots = computed(() => this._drumSlots(this._selMinute(), 60));\n\n private _drumSlots(value: number, max: number): DrumSlot[] {\n return [-1, 0, 1].map((offset) => {\n const v = (((value + offset) % max) + max) % max;\n return { value: v, offset, label: String(v).padStart(2, '0') };\n });\n }\n\n // ── Single actions ────────────────────────────────────────────────\n toggle(): void {\n if (this.isDisabledFinal()) return;\n if (!this._isRange() && this.readonly()) return;\n this.isOpen.update((v) => !v);\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.el.nativeElement.contains(event.target as Node)) this.close();\n }\n\n prevMonth(): void {\n if (this._viewMonth() === 0) {\n this._viewMonth.set(11);\n this._viewYear.update((y) => y - 1);\n } else this._viewMonth.update((m) => m - 1);\n }\n\n nextMonth(): void {\n if (this._viewMonth() === 11) {\n this._viewMonth.set(0);\n this._viewYear.update((y) => y + 1);\n } else this._viewMonth.update((m) => m + 1);\n }\n\n selectDay(day: CalendarDay): void {\n if (!day.inMonth) return;\n this._selYear.set(day.date.getFullYear());\n this._selMonth.set(day.date.getMonth());\n this._selDay.set(day.date.getDate());\n this._emitValue();\n if (this.type() === 'date') this.close();\n }\n\n formatDayLabel(date: Date): string {\n return date.toLocaleDateString(this._resolvedLocale(), {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n }\n\n today(): void {\n const d = new Date();\n this._viewYear.set(d.getFullYear());\n this._viewMonth.set(d.getMonth());\n this.selectDay({ date: d, inMonth: true, isToday: true, isSelected: false });\n }\n\n clear(): void {\n this._selYear.set(null);\n this._selMonth.set(null);\n this._selDay.set(null);\n this._value.set('');\n this._onChange('');\n this.close();\n }\n\n changeHour(delta: number): void {\n this._selHour.update((h) => (((h + delta) % 24) + 24) % 24);\n this._emitValue();\n }\n\n changeMinute(delta: number): void {\n this._selMinute.update((m) => (((m + delta) % 60) + 60) % 60);\n this._emitValue();\n }\n\n onHourWheel(e: WheelEvent): void {\n e.preventDefault();\n this.changeHour(e.deltaY > 0 ? 1 : -1);\n }\n onMinuteWheel(e: WheelEvent): void {\n e.preventDefault();\n this.changeMinute(e.deltaY > 0 ? 1 : -1);\n }\n\n private _emitValue(): void {\n const t = this.type();\n let v = '';\n if (t === 'date' || t === 'datetime-local') {\n if (this._selYear() === null) return;\n const y = this._selYear()!;\n const mo = String(this._selMonth()! + 1).padStart(2, '0');\n const d = String(this._selDay()!).padStart(2, '0');\n const ds = `${y}-${mo}-${d}`;\n v =\n t === 'date'\n ? ds\n : `${ds}T${String(this._selHour()).padStart(2, '0')}:${String(this._selMinute()).padStart(2, '0')}`;\n } else {\n v = `${String(this._selHour()).padStart(2, '0')}:${String(this._selMinute()).padStart(2, '0')}`;\n }\n this._value.set(v);\n this._onChange(v);\n }\n\n // ── CVA ───────────────────────────────────────────────────────────\n writeValue(value: string | NeuDateRange | null): void {\n if (this.type() === 'range') {\n const v = value as NeuDateRange | null;\n this._pickStart.set(v?.start ?? null);\n this._pickEnd.set(v?.end ?? null);\n } else {\n const v = (value as string) ?? '';\n this._value.set(v);\n if (!v) return;\n const t = this.type();\n if (t === 'date') {\n const d = new Date(v + 'T00:00:00');\n if (!isNaN(d.getTime())) {\n this._selYear.set(d.getFullYear());\n this._selMonth.set(d.getMonth());\n this._selDay.set(d.getDate());\n this._viewYear.set(d.getFullYear());\n this._viewMonth.set(d.getMonth());\n }\n } else if (t === 'time') {\n const [h, m] = v.split(':').map(Number);\n if (!isNaN(h)) this._selHour.set(h);\n if (!isNaN(m)) this._selMinute.set(m);\n } else {\n const [datePart, timePart] = v.split('T');\n if (datePart) {\n const d = new Date(datePart + 'T00:00:00');\n if (!isNaN(d.getTime())) {\n this._selYear.set(d.getFullYear());\n this._selMonth.set(d.getMonth());\n this._selDay.set(d.getDate());\n this._viewYear.set(d.getFullYear());\n this._viewMonth.set(d.getMonth());\n }\n }\n if (timePart) {\n const [h, m] = timePart.split(':').map(Number);\n if (!isNaN(h)) this._selHour.set(h);\n if (!isNaN(m)) this._selMinute.set(m);\n }\n }\n }\n }\n\n registerOnChange(fn: (v: string | NeuDateRange) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n #normalizedLocale(locale: string | null | undefined): string {\n return locale?.trim() || '';\n }\n\n #capitalize(value: string): string {\n return value ? value.charAt(0).toUpperCase() + value.slice(1) : value;\n }\n\n #buildWeekdayLabels(style: 'short' | 'narrow'): string[] {\n const formatter = new Intl.DateTimeFormat(this._resolvedLocale(), {\n weekday: style,\n timeZone: 'UTC',\n });\n return Array.from({ length: 7 }, (_, index) => {\n const label = formatter\n .format(new Date(Date.UTC(2024, 0, 1 + index)))\n .replace(/\\.$/, '')\n .trim();\n if (style === 'narrow') {\n return label.slice(0, 1).toUpperCase();\n }\n return this.#capitalize(label);\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+
4
+ /**
5
+ * NeuralUI Divider
6
+ *
7
+ * Separador visual para secciones de contenido.
8
+ *
9
+ * Uso:
10
+ * <neu-divider />
11
+ * <neu-divider label="O continúa con" />
12
+ * <neu-divider orientation="vertical" />
13
+ */
14
+ class NeuDividerComponent {
15
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
16
+ orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
17
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuDividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuDividerComponent, isStandalone: true, selector: "neu-divider", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
19
+ <div
20
+ class="neu-divider"
21
+ [class.neu-divider--vertical]="orientation() === 'vertical'"
22
+ [class.neu-divider--has-label]="!!label()"
23
+ role="separator"
24
+ [attr.aria-orientation]="orientation()"
25
+ >
26
+ @if (label()) {
27
+ <span class="neu-divider__label">{{ label() }}</span>
28
+ }
29
+ </div>
30
+ `, isInline: true, styles: [".neu-divider{display:flex;align-items:center;gap:var(--neu-space-3);color:var(--neu-text-muted);font-size:var(--neu-text-xs);font-family:var(--neu-font-sans)}.neu-divider:before,.neu-divider:after{content:\"\";flex:1;height:1px;background:var(--neu-border)}.neu-divider:not(.neu-divider--has-label):after{display:none}.neu-divider:not(.neu-divider--has-label):before{flex:1}.neu-divider--vertical{flex-direction:column;align-self:stretch;height:auto;width:auto}.neu-divider--vertical:before,.neu-divider--vertical:after{flex:1;width:1px;height:auto}.neu-divider__label{white-space:nowrap;padding:0 var(--neu-space-2);letter-spacing:.04em;font-weight:500}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuDividerComponent, decorators: [{
33
+ type: Component,
34
+ args: [{ selector: 'neu-divider', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
35
+ <div
36
+ class="neu-divider"
37
+ [class.neu-divider--vertical]="orientation() === 'vertical'"
38
+ [class.neu-divider--has-label]="!!label()"
39
+ role="separator"
40
+ [attr.aria-orientation]="orientation()"
41
+ >
42
+ @if (label()) {
43
+ <span class="neu-divider__label">{{ label() }}</span>
44
+ }
45
+ </div>
46
+ `, styles: [".neu-divider{display:flex;align-items:center;gap:var(--neu-space-3);color:var(--neu-text-muted);font-size:var(--neu-text-xs);font-family:var(--neu-font-sans)}.neu-divider:before,.neu-divider:after{content:\"\";flex:1;height:1px;background:var(--neu-border)}.neu-divider:not(.neu-divider--has-label):after{display:none}.neu-divider:not(.neu-divider--has-label):before{flex:1}.neu-divider--vertical{flex-direction:column;align-self:stretch;height:auto;width:auto}.neu-divider--vertical:before,.neu-divider--vertical:after{flex:1;width:1px;height:auto}.neu-divider__label{white-space:nowrap;padding:0 var(--neu-space-2);letter-spacing:.04em;font-weight:500}\n"] }]
47
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }] } });
48
+
49
+ /**
50
+ * Generated bundle index. Do not edit.
51
+ */
52
+
53
+ export { NeuDividerComponent };
54
+ //# sourceMappingURL=neural-ui-core-divider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-divider.mjs","sources":["../../../../projects/ui-core/divider/neu-divider.component.ts","../../../../projects/ui-core/divider/neural-ui-core-divider.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\n\n/**\n * NeuralUI Divider\n *\n * Separador visual para secciones de contenido.\n *\n * Uso:\n * <neu-divider />\n * <neu-divider label=\"O continúa con\" />\n * <neu-divider orientation=\"vertical\" />\n */\n@Component({\n selector: 'neu-divider',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"neu-divider\"\n [class.neu-divider--vertical]=\"orientation() === 'vertical'\"\n [class.neu-divider--has-label]=\"!!label()\"\n role=\"separator\"\n [attr.aria-orientation]=\"orientation()\"\n >\n @if (label()) {\n <span class=\"neu-divider__label\">{{ label() }}</span>\n }\n </div>\n `,\n styles: [\n `\n .neu-divider {\n display: flex;\n align-items: center;\n gap: var(--neu-space-3);\n color: var(--neu-text-muted);\n font-size: var(--neu-text-xs);\n font-family: var(--neu-font-sans);\n\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--neu-border);\n }\n\n &:not(.neu-divider--has-label)::after {\n display: none;\n }\n &:not(.neu-divider--has-label)::before {\n flex: 1;\n }\n }\n\n .neu-divider--vertical {\n flex-direction: column;\n align-self: stretch;\n height: auto;\n width: auto;\n\n &::before,\n &::after {\n flex: 1;\n width: 1px;\n height: auto;\n }\n }\n\n .neu-divider__label {\n white-space: nowrap;\n padding: 0 var(--neu-space-2);\n letter-spacing: 0.04em;\n font-weight: 500;\n }\n `,\n ],\n})\nexport class NeuDividerComponent {\n label = input<string>('');\n orientation = input<'horizontal' | 'vertical'>('horizontal');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;AAEA;;;;;;;;;AASG;MAoEU,mBAAmB,CAAA;AAC9B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AACzB,IAAA,WAAW,GAAG,KAAK,CAA4B,YAAY,kFAAC;uGAFjD,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9DpB;;;;;;;;;;;;AAYT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,kpBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAkDU,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAnE/B,SAAS;+BACE,aAAa,EAAA,OAAA,EACd,EAAE,EAAA,aAAA,EACI,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;AAYT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,kpBAAA,CAAA,EAAA;;;AC7BH;;AAEG;;;;"}
@@ -0,0 +1,84 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { NeuIconComponent } from '@neural-ui/core/icon';
4
+ import { NeuButtonComponent } from '@neural-ui/core/button';
5
+
6
+ /**
7
+ * NeuEmptyState — Estado vacío con icono Lucide, título, descripción y acción.
8
+ *
9
+ * Uso:
10
+ * <neu-empty-state
11
+ * icon="lucideInbox"
12
+ * title="Sin resultados"
13
+ * description="Prueba con otros filtros."
14
+ * actionLabel="Limpiar filtros"
15
+ * (action)="clearFilters()"
16
+ * />
17
+ */
18
+ class NeuEmptyStateComponent {
19
+ /** Nombre del icono Lucide registrado con provideIcons(). / Lucide icon name registered with provideIcons(). */
20
+ icon = input('lucideInbox', ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
21
+ /** Tamaño del icono. Por defecto 3rem. / Icon size. Default 3rem. */
22
+ iconSize = input('3rem', ...(ngDevMode ? [{ debugName: "iconSize" }] : /* istanbul ignore next */ []));
23
+ /** Título principal del estado vacío. / Main title of the empty state. */
24
+ title = input('No hay nada aquí', ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
25
+ /** Descripción secundaria opcional. / Optional secondary description. */
26
+ description = input('', ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
27
+ /** Texto del botón de acción. Si está vacío, no se muestra el botón. / Action button text. If empty, the button is not shown. */
28
+ actionLabel = input('', ...(ngDevMode ? [{ debugName: "actionLabel" }] : /* istanbul ignore next */ []));
29
+ /** Emite cuando el usuario hace clic en el botón de acción. / Emits when the user clicks the action button. */
30
+ action = output();
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuEmptyStateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuEmptyStateComponent, isStandalone: true, selector: "neu-empty-state", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconSize: { classPropertyName: "iconSize", publicName: "iconSize", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, actionLabel: { classPropertyName: "actionLabel", publicName: "actionLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { action: "action" }, host: { classAttribute: "neu-empty-state" }, ngImport: i0, template: `
33
+ <div class="neu-empty-state__inner">
34
+ @if (icon()) {
35
+ <span class="neu-empty-state__icon">
36
+ <neu-icon [name]="icon()" [size]="iconSize()" />
37
+ </span>
38
+ }
39
+
40
+ <p class="neu-empty-state__title">{{ title() }}</p>
41
+
42
+ @if (description()) {
43
+ <p class="neu-empty-state__desc">{{ description() }}</p>
44
+ }
45
+
46
+ @if (actionLabel()) {
47
+ <button neu-button variant="primary" size="md" (click)="action.emit()">
48
+ {{ actionLabel() }}
49
+ </button>
50
+ }
51
+ </div>
52
+ `, isInline: true, styles: [".neu-empty-state{display:flex;align-items:center;justify-content:center;padding:var(--neu-space-10, 2.5rem) var(--neu-space-6, 1.5rem);text-align:center;width:100%}.neu-empty-state__inner{display:flex;flex-direction:column;align-items:center;gap:var(--neu-space-3, .75rem);max-width:380px}.neu-empty-state__icon{display:flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:var(--neu-radius-lg, 16px);background:var(--neu-surface-2, #f8fafc);color:var(--neu-text-muted, #94a3b8);margin-bottom:var(--neu-space-2, .5rem);border:1px solid var(--neu-border, #e2e8f0)}.neu-empty-state__title{margin:0;font-size:var(--neu-text-base, 1rem);font-weight:600;color:var(--neu-text, #0f172a)}.neu-empty-state__desc{margin:0;font-size:var(--neu-text-sm, .875rem);color:var(--neu-text-muted, #64748b);line-height:1.5}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }, { kind: "component", type: NeuButtonComponent, selector: "button[neu-button]", inputs: ["variant", "size", "disabled", "loading", "fullWidth", "icon", "iconPosition", "iconOnly", "ariaLabel"], outputs: ["neuClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
53
+ }
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuEmptyStateComponent, decorators: [{
55
+ type: Component,
56
+ args: [{ selector: 'neu-empty-state', imports: [NeuIconComponent, NeuButtonComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'neu-empty-state' }, template: `
57
+ <div class="neu-empty-state__inner">
58
+ @if (icon()) {
59
+ <span class="neu-empty-state__icon">
60
+ <neu-icon [name]="icon()" [size]="iconSize()" />
61
+ </span>
62
+ }
63
+
64
+ <p class="neu-empty-state__title">{{ title() }}</p>
65
+
66
+ @if (description()) {
67
+ <p class="neu-empty-state__desc">{{ description() }}</p>
68
+ }
69
+
70
+ @if (actionLabel()) {
71
+ <button neu-button variant="primary" size="md" (click)="action.emit()">
72
+ {{ actionLabel() }}
73
+ </button>
74
+ }
75
+ </div>
76
+ `, styles: [".neu-empty-state{display:flex;align-items:center;justify-content:center;padding:var(--neu-space-10, 2.5rem) var(--neu-space-6, 1.5rem);text-align:center;width:100%}.neu-empty-state__inner{display:flex;flex-direction:column;align-items:center;gap:var(--neu-space-3, .75rem);max-width:380px}.neu-empty-state__icon{display:flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:var(--neu-radius-lg, 16px);background:var(--neu-surface-2, #f8fafc);color:var(--neu-text-muted, #94a3b8);margin-bottom:var(--neu-space-2, .5rem);border:1px solid var(--neu-border, #e2e8f0)}.neu-empty-state__title{margin:0;font-size:var(--neu-text-base, 1rem);font-weight:600;color:var(--neu-text, #0f172a)}.neu-empty-state__desc{margin:0;font-size:var(--neu-text-sm, .875rem);color:var(--neu-text-muted, #64748b);line-height:1.5}\n"] }]
77
+ }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconSize", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], actionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionLabel", required: false }] }], action: [{ type: i0.Output, args: ["action"] }] } });
78
+
79
+ /**
80
+ * Generated bundle index. Do not edit.
81
+ */
82
+
83
+ export { NeuEmptyStateComponent };
84
+ //# sourceMappingURL=neural-ui-core-empty-state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-empty-state.mjs","sources":["../../../../projects/ui-core/empty-state/neu-empty-state.component.ts","../../../../projects/ui-core/empty-state/neural-ui-core-empty-state.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n output,\n} from '@angular/core';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\n\n/**\n * NeuEmptyState — Estado vacío con icono Lucide, título, descripción y acción.\n *\n * Uso:\n * <neu-empty-state\n * icon=\"lucideInbox\"\n * title=\"Sin resultados\"\n * description=\"Prueba con otros filtros.\"\n * actionLabel=\"Limpiar filtros\"\n * (action)=\"clearFilters()\"\n * />\n */\n@Component({\n selector: 'neu-empty-state',\n imports: [NeuIconComponent, NeuButtonComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-empty-state' },\n template: `\n <div class=\"neu-empty-state__inner\">\n @if (icon()) {\n <span class=\"neu-empty-state__icon\">\n <neu-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </span>\n }\n\n <p class=\"neu-empty-state__title\">{{ title() }}</p>\n\n @if (description()) {\n <p class=\"neu-empty-state__desc\">{{ description() }}</p>\n }\n\n @if (actionLabel()) {\n <button neu-button variant=\"primary\" size=\"md\" (click)=\"action.emit()\">\n {{ actionLabel() }}\n </button>\n }\n </div>\n `,\n styleUrl: './neu-empty-state.component.scss',\n})\nexport class NeuEmptyStateComponent {\n /** Nombre del icono Lucide registrado con provideIcons(). / Lucide icon name registered with provideIcons(). */\n icon = input<string>('lucideInbox');\n /** Tamaño del icono. Por defecto 3rem. / Icon size. Default 3rem. */\n iconSize = input<string>('3rem');\n /** Título principal del estado vacío. / Main title of the empty state. */\n title = input<string>('No hay nada aquí');\n /** Descripción secundaria opcional. / Optional secondary description. */\n description = input<string>('');\n /** Texto del botón de acción. Si está vacío, no se muestra el botón. / Action button text. If empty, the button is not shown. */\n actionLabel = input<string>('');\n\n /** Emite cuando el usuario hace clic en el botón de acción. / Emits when the user clicks the action button. */\n action = output<void>();\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;AAUA;;;;;;;;;;;AAWG;MA8BU,sBAAsB,CAAA;;AAEjC,IAAA,IAAI,GAAG,KAAK,CAAS,aAAa,2EAAC;;AAEnC,IAAA,QAAQ,GAAG,KAAK,CAAS,MAAM,+EAAC;;AAEhC,IAAA,KAAK,GAAG,KAAK,CAAS,kBAAkB,4EAAC;;AAEzC,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;;AAE/B,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;;IAG/B,MAAM,GAAG,MAAM,EAAQ;uGAbZ,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvBvB;;;;;;;;;;;;;;;;;;;;GAoBT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,q0BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAxBS,gBAAgB,8FAAE,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FA2BnC,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA7BlC,SAAS;+BACE,iBAAiB,EAAA,OAAA,EAClB,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,mBACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAA,QAAA,EACxB;;;;;;;;;;;;;;;;;;;;AAoBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,q0BAAA,CAAA,EAAA;;;AChDH;;AAEG;;;;"}
@@ -0,0 +1,118 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, signal, computed, effect, untracked, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+
4
+ let _seq = 0;
5
+ /**
6
+ * NeuralUI FilterBar Component
7
+ *
8
+ * Fila de chips de filtro con selección individual y botón "Limpiar todo".
9
+ *
10
+ * Uso:
11
+ * <neu-filter-bar [filters]="chips" (filterChange)="onFilter($event)" />
12
+ */
13
+ class NeuFilterBarComponent {
14
+ /** Lista inicial de filtros / Initial filter chips list */
15
+ filters = input([], ...(ngDevMode ? [{ debugName: "filters" }] : /* istanbul ignore next */ []));
16
+ /** Muestra el botón "Limpiar todo" cuando hay activos / Shows "Clear all" when any active */
17
+ clearable = input(true, ...(ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []));
18
+ /** Texto del botón de limpiar / Clear button text */
19
+ clearLabel = input('Limpiar todo', ...(ngDevMode ? [{ debugName: "clearLabel" }] : /* istanbul ignore next */ []));
20
+ /** Permite selección múltiple / Allows multi-selection */
21
+ multi = input(true, ...(ngDevMode ? [{ debugName: "multi" }] : /* istanbul ignore next */ []));
22
+ /** Aria-label de la barra / Aria-label for the bar */
23
+ ariaLabel = input('Filtros', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
24
+ /** Emitido con los chips activos al cambiar / Emitted with active chips on change */
25
+ filterChange = output();
26
+ _id = `neu-filter-bar-${++_seq}`;
27
+ _chips = signal([], ...(ngDevMode ? [{ debugName: "_chips" }] : /* istanbul ignore next */ []));
28
+ _hasActive = computed(() => this._chips().some((c) => c.active), ...(ngDevMode ? [{ debugName: "_hasActive" }] : /* istanbul ignore next */ []));
29
+ hostClasses = computed(() => ({
30
+ 'neu-filter-bar': true,
31
+ 'neu-filter-bar--multi': this.multi(),
32
+ }), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
33
+ constructor() {
34
+ effect(() => {
35
+ const src = this.filters();
36
+ untracked(() => this._chips.set(src.map((f) => ({ ...f }))));
37
+ });
38
+ }
39
+ toggle(chip) {
40
+ this._chips.update((chips) => {
41
+ if (this.multi()) {
42
+ return chips.map((c) => (c.key === chip.key ? { ...c, active: !c.active } : c));
43
+ }
44
+ return chips.map((c) => ({ ...c, active: c.key === chip.key ? !c.active : false }));
45
+ });
46
+ this.filterChange.emit(this._chips().filter((c) => c.active));
47
+ }
48
+ clearAll() {
49
+ this._chips.update((chips) => chips.map((c) => ({ ...c, active: false })));
50
+ this.filterChange.emit([]);
51
+ }
52
+ /** Activa chips por sus keys programáticamente / Activate chips by keys programmatically */
53
+ setActive(keys) {
54
+ this._chips.update((chips) => chips.map((c) => ({ ...c, active: keys.includes(c.key) })));
55
+ this.filterChange.emit(this._chips().filter((c) => c.active));
56
+ }
57
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuFilterBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
58
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuFilterBarComponent, isStandalone: true, selector: "neu-filter-bar", inputs: { filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, multi: { classPropertyName: "multi", publicName: "multi", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filterChange: "filterChange" }, host: { attributes: { "role": "group" }, properties: { "class": "hostClasses()", "attr.aria-label": "ariaLabel()" } }, ngImport: i0, template: `
59
+ <div class="neu-filter-bar__chips">
60
+ @for (filter of _chips(); track filter.key) {
61
+ <button
62
+ type="button"
63
+ class="neu-filter-bar__chip"
64
+ [class.neu-filter-bar__chip--active]="filter.active"
65
+ [attr.aria-pressed]="filter.active ?? false"
66
+ (click)="toggle(filter)"
67
+ >
68
+ {{ filter.label }}
69
+ </button>
70
+ }
71
+ </div>
72
+ @if (clearable() && _hasActive()) {
73
+ <button
74
+ type="button"
75
+ class="neu-filter-bar__clear"
76
+ [attr.aria-label]="clearLabel()"
77
+ (click)="clearAll()"
78
+ >
79
+ {{ clearLabel() }}
80
+ </button>
81
+ }
82
+ `, isInline: true, styles: ["@charset \"UTF-8\";.neu-filter-bar{display:flex;align-items:center;flex-wrap:wrap;gap:8px}.neu-filter-bar__chips{display:flex;flex-wrap:wrap;gap:6px}.neu-filter-bar__chip{all:unset;cursor:pointer;display:inline-flex;align-items:center;gap:4px;padding:4px 12px;border-radius:var(--neu-radius-full, 9999px);border:1px solid var(--neu-border-color, #d1d5db);background:var(--neu-surface-1, #ffffff);color:var(--neu-text-secondary, #6b7280);font-size:.8125rem;font-weight:500;line-height:1.4;transition:background .12s,border-color .12s,color .12s;-webkit-user-select:none;user-select:none}.neu-filter-bar__chip:hover{border-color:var(--neu-color-primary, #0ea5e9);color:var(--neu-color-primary, #0ea5e9)}.neu-filter-bar__chip:focus-visible{outline:2px solid var(--neu-focus-ring, #0ea5e9);outline-offset:2px}.neu-filter-bar__chip.neu-filter-bar__chip--active{background:var(--neu-color-primary, #0ea5e9);border-color:var(--neu-color-primary, #0ea5e9);color:#fff}.neu-filter-bar__clear{all:unset;cursor:pointer;font-size:.8125rem;color:var(--neu-text-secondary, #6b7280);text-decoration:underline;text-underline-offset:2px;transition:color .12s}.neu-filter-bar__clear:hover{color:var(--neu-text-primary, #111)}.neu-filter-bar__clear:focus-visible{outline:2px solid var(--neu-focus-ring, #0ea5e9);outline-offset:2px;border-radius:2px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
83
+ }
84
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuFilterBarComponent, decorators: [{
85
+ type: Component,
86
+ args: [{ selector: 'neu-filter-bar', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class]': 'hostClasses()', role: 'group', '[attr.aria-label]': 'ariaLabel()' }, template: `
87
+ <div class="neu-filter-bar__chips">
88
+ @for (filter of _chips(); track filter.key) {
89
+ <button
90
+ type="button"
91
+ class="neu-filter-bar__chip"
92
+ [class.neu-filter-bar__chip--active]="filter.active"
93
+ [attr.aria-pressed]="filter.active ?? false"
94
+ (click)="toggle(filter)"
95
+ >
96
+ {{ filter.label }}
97
+ </button>
98
+ }
99
+ </div>
100
+ @if (clearable() && _hasActive()) {
101
+ <button
102
+ type="button"
103
+ class="neu-filter-bar__clear"
104
+ [attr.aria-label]="clearLabel()"
105
+ (click)="clearAll()"
106
+ >
107
+ {{ clearLabel() }}
108
+ </button>
109
+ }
110
+ `, styles: ["@charset \"UTF-8\";.neu-filter-bar{display:flex;align-items:center;flex-wrap:wrap;gap:8px}.neu-filter-bar__chips{display:flex;flex-wrap:wrap;gap:6px}.neu-filter-bar__chip{all:unset;cursor:pointer;display:inline-flex;align-items:center;gap:4px;padding:4px 12px;border-radius:var(--neu-radius-full, 9999px);border:1px solid var(--neu-border-color, #d1d5db);background:var(--neu-surface-1, #ffffff);color:var(--neu-text-secondary, #6b7280);font-size:.8125rem;font-weight:500;line-height:1.4;transition:background .12s,border-color .12s,color .12s;-webkit-user-select:none;user-select:none}.neu-filter-bar__chip:hover{border-color:var(--neu-color-primary, #0ea5e9);color:var(--neu-color-primary, #0ea5e9)}.neu-filter-bar__chip:focus-visible{outline:2px solid var(--neu-focus-ring, #0ea5e9);outline-offset:2px}.neu-filter-bar__chip.neu-filter-bar__chip--active{background:var(--neu-color-primary, #0ea5e9);border-color:var(--neu-color-primary, #0ea5e9);color:#fff}.neu-filter-bar__clear{all:unset;cursor:pointer;font-size:.8125rem;color:var(--neu-text-secondary, #6b7280);text-decoration:underline;text-underline-offset:2px;transition:color .12s}.neu-filter-bar__clear:hover{color:var(--neu-text-primary, #111)}.neu-filter-bar__clear:focus-visible{outline:2px solid var(--neu-focus-ring, #0ea5e9);outline-offset:2px;border-radius:2px}\n"] }]
111
+ }], ctorParameters: () => [], propDecorators: { filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], multi: [{ type: i0.Input, args: [{ isSignal: true, alias: "multi", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], filterChange: [{ type: i0.Output, args: ["filterChange"] }] } });
112
+
113
+ /**
114
+ * Generated bundle index. Do not edit.
115
+ */
116
+
117
+ export { NeuFilterBarComponent };
118
+ //# sourceMappingURL=neural-ui-core-filter-bar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-filter-bar.mjs","sources":["../../../../projects/ui-core/filter-bar/neu-filter-bar.component.ts","../../../../projects/ui-core/filter-bar/neural-ui-core-filter-bar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\n\nexport interface NeuFilterChip {\n /** Identificador único del filtro / Unique filter identifier */\n key: string;\n /** Etiqueta visible / Visible label */\n label: string;\n /** Si el chip está activo / Whether the chip is active */\n active?: boolean;\n}\n\nlet _seq = 0;\n\n/**\n * NeuralUI FilterBar Component\n *\n * Fila de chips de filtro con selección individual y botón \"Limpiar todo\".\n *\n * Uso:\n * <neu-filter-bar [filters]=\"chips\" (filterChange)=\"onFilter($event)\" />\n */\n@Component({\n selector: 'neu-filter-bar',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class]': 'hostClasses()', role: 'group', '[attr.aria-label]': 'ariaLabel()' },\n template: `\n <div class=\"neu-filter-bar__chips\">\n @for (filter of _chips(); track filter.key) {\n <button\n type=\"button\"\n class=\"neu-filter-bar__chip\"\n [class.neu-filter-bar__chip--active]=\"filter.active\"\n [attr.aria-pressed]=\"filter.active ?? false\"\n (click)=\"toggle(filter)\"\n >\n {{ filter.label }}\n </button>\n }\n </div>\n @if (clearable() && _hasActive()) {\n <button\n type=\"button\"\n class=\"neu-filter-bar__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (click)=\"clearAll()\"\n >\n {{ clearLabel() }}\n </button>\n }\n `,\n styleUrl: './neu-filter-bar.component.scss',\n})\nexport class NeuFilterBarComponent {\n /** Lista inicial de filtros / Initial filter chips list */\n readonly filters = input<NeuFilterChip[]>([]);\n\n /** Muestra el botón \"Limpiar todo\" cuando hay activos / Shows \"Clear all\" when any active */\n readonly clearable = input<boolean>(true);\n\n /** Texto del botón de limpiar / Clear button text */\n readonly clearLabel = input<string>('Limpiar todo');\n\n /** Permite selección múltiple / Allows multi-selection */\n readonly multi = input<boolean>(true);\n\n /** Aria-label de la barra / Aria-label for the bar */\n readonly ariaLabel = input<string>('Filtros');\n\n /** Emitido con los chips activos al cambiar / Emitted with active chips on change */\n readonly filterChange = output<NeuFilterChip[]>();\n\n readonly _id = `neu-filter-bar-${++_seq}`;\n readonly _chips = signal<NeuFilterChip[]>([]);\n\n readonly _hasActive = computed(() => this._chips().some((c) => c.active));\n\n readonly hostClasses = computed(() => ({\n 'neu-filter-bar': true,\n 'neu-filter-bar--multi': this.multi(),\n }));\n\n constructor() {\n effect(() => {\n const src = this.filters();\n untracked(() => this._chips.set(src.map((f) => ({ ...f }))));\n });\n }\n\n toggle(chip: NeuFilterChip): void {\n this._chips.update((chips) => {\n if (this.multi()) {\n return chips.map((c) => (c.key === chip.key ? { ...c, active: !c.active } : c));\n }\n return chips.map((c) => ({ ...c, active: c.key === chip.key ? !c.active : false }));\n });\n this.filterChange.emit(this._chips().filter((c) => c.active));\n }\n\n clearAll(): void {\n this._chips.update((chips) => chips.map((c) => ({ ...c, active: false })));\n this.filterChange.emit([]);\n }\n\n /** Activa chips por sus keys programáticamente / Activate chips by keys programmatically */\n setActive(keys: string[]): void {\n this._chips.update((chips) => chips.map((c) => ({ ...c, active: keys.includes(c.key) })));\n this.filterChange.emit(this._chips().filter((c) => c.active));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { NgIcon } from '@ng-icons/core';
4
+
5
+ /**
6
+ * NeuIconComponent — Wrapper delgado sobre NgIcon de @ng-icons/core
7
+ *
8
+ * Hereda el color del elemento padre mediante `color: currentColor`.
9
+ * El grosor del trazo se controla con la variable CSS `--ng-icon__stroke-width`
10
+ * que viene configurada globalmente vía `provideNgIconsConfig`.
11
+ *
12
+ * Uso básico:
13
+ * <neu-icon name="lucideX" />
14
+ * <neu-icon name="lucideAlertCircle" size="1rem" />
15
+ */
16
+ class NeuIconComponent {
17
+ /** Nombre del icono registrado con provideIcons() / Icon name registered with provideIcons() */
18
+ name = input.required(...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
19
+ /**
20
+ * Grosor del trazo. Default '2' para estética fina y técnica.
21
+ * Puede sobrescribirse por instancia.
22
+ */
23
+ strokeWidth = input('2', ...(ngDevMode ? [{ debugName: "strokeWidth" }] : /* istanbul ignore next */ []));
24
+ /**
25
+ * Tamaño del icono. Acepta cualquier unidad CSS válida.
26
+ * Si no se especifica, usa la variable CSS `--neu-icon-size` (1.25rem por defecto).
27
+ */
28
+ size = input('', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
29
+ /** Tamaño resuelto: usa el input `size` o cae al token CSS. / Resolved size: uses the `size` input or falls back to the CSS token. */
30
+ resolvedSize = computed(() => this.size() || 'var(--neu-icon-size, 1.25rem)', ...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.8", type: NeuIconComponent, isStandalone: true, selector: "neu-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "\"inline-flex\"", "style.align-items": "\"center\"", "style.line-height": "\"1\"", "style.color": "\"inherit\"" }, classAttribute: "neu-icon" }, ngImport: i0, template: `<ng-icon [name]="name()" [size]="resolvedSize()" [strokeWidth]="strokeWidth()" />`, isInline: true, styles: [".neu-icon{color:inherit;vertical-align:middle;flex-shrink:0}\n"], dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuIconComponent, decorators: [{
35
+ type: Component,
36
+ args: [{ selector: 'neu-icon', imports: [NgIcon], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
37
+ class: 'neu-icon',
38
+ '[style.display]': '"inline-flex"',
39
+ '[style.align-items]': '"center"',
40
+ '[style.line-height]': '"1"',
41
+ '[style.color]': '"inherit"',
42
+ }, template: `<ng-icon [name]="name()" [size]="resolvedSize()" [strokeWidth]="strokeWidth()" />`, styles: [".neu-icon{color:inherit;vertical-align:middle;flex-shrink:0}\n"] }]
43
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
44
+
45
+ /**
46
+ * Generated bundle index. Do not edit.
47
+ */
48
+
49
+ export { NeuIconComponent };
50
+ //# sourceMappingURL=neural-ui-core-icon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-icon.mjs","sources":["../../../../projects/ui-core/icon/neu-icon.component.ts","../../../../projects/ui-core/icon/neural-ui-core-icon.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\nimport { NgIcon } from '@ng-icons/core';\n\n/**\n * NeuIconComponent — Wrapper delgado sobre NgIcon de @ng-icons/core\n *\n * Hereda el color del elemento padre mediante `color: currentColor`.\n * El grosor del trazo se controla con la variable CSS `--ng-icon__stroke-width`\n * que viene configurada globalmente vía `provideNgIconsConfig`.\n *\n * Uso básico:\n * <neu-icon name=\"lucideX\" />\n * <neu-icon name=\"lucideAlertCircle\" size=\"1rem\" />\n */\n@Component({\n selector: 'neu-icon',\n imports: [NgIcon],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-icon',\n '[style.display]': '\"inline-flex\"',\n '[style.align-items]': '\"center\"',\n '[style.line-height]': '\"1\"',\n '[style.color]': '\"inherit\"',\n },\n template: `<ng-icon [name]=\"name()\" [size]=\"resolvedSize()\" [strokeWidth]=\"strokeWidth()\" />`,\n styleUrl: './neu-icon.component.scss',\n})\nexport class NeuIconComponent {\n /** Nombre del icono registrado con provideIcons() / Icon name registered with provideIcons() */\n name = input.required<string>();\n\n /**\n * Grosor del trazo. Default '2' para estética fina y técnica.\n * Puede sobrescribirse por instancia.\n */\n strokeWidth = input<string>('2');\n\n /**\n * Tamaño del icono. Acepta cualquier unidad CSS válida.\n * Si no se especifica, usa la variable CSS `--neu-icon-size` (1.25rem por defecto).\n */\n size = input<string>('');\n\n /** Tamaño resuelto: usa el input `size` o cae al token CSS. / Resolved size: uses the `size` input or falls back to the CSS token. */\n readonly resolvedSize = computed(() => this.size() || 'var(--neu-icon-size, 1.25rem)');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;AASA;;;;;;;;;;AAUG;MAgBU,gBAAgB,CAAA;;AAE3B,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAU;AAE/B;;;AAGG;AACH,IAAA,WAAW,GAAG,KAAK,CAAS,GAAG,kFAAC;AAEhC;;;AAGG;AACH,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;;AAGf,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,+BAA+B,mFAAC;uGAjB3E,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHjB,CAAA,iFAAA,CAAmF,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAVnF,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,KAAA,EAAA,MAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAaL,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAf5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,OAAA,EACX,CAAC,MAAM,CAAC,EAAA,aAAA,EACF,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,iBAAiB,EAAE,eAAe;AAClC,wBAAA,qBAAqB,EAAE,UAAU;AACjC,wBAAA,qBAAqB,EAAE,KAAK;AAC5B,wBAAA,eAAe,EAAE,WAAW;AAC7B,qBAAA,EAAA,QAAA,EACS,CAAA,iFAAA,CAAmF,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA;;;AChC/F;;AAEG;;;;"}