@neural-ui/core 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +406 -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 +825 -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 +710 -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 +1872 -0
  120. package/fesm2022/neural-ui-core-table.mjs.map +1 -0
  121. package/fesm2022/neural-ui-core-tabs.mjs +338 -0
  122. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -0
  123. package/fesm2022/neural-ui-core-textarea.mjs +188 -0
  124. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -0
  125. package/fesm2022/neural-ui-core-timeline.mjs +117 -0
  126. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -0
  127. package/fesm2022/neural-ui-core-toast.mjs +171 -0
  128. package/fesm2022/neural-ui-core-toast.mjs.map +1 -0
  129. package/fesm2022/neural-ui-core-toggle-button-group.mjs +162 -0
  130. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -0
  131. package/fesm2022/neural-ui-core-toolbar.mjs +67 -0
  132. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -0
  133. package/fesm2022/neural-ui-core-tooltip.mjs +151 -0
  134. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -0
  135. package/fesm2022/neural-ui-core-url-state.mjs +96 -0
  136. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -0
  137. package/fesm2022/neural-ui-core-virtual-list.mjs +126 -0
  138. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -0
  139. package/fesm2022/neural-ui-core.mjs +11 -8544
  140. package/fesm2022/neural-ui-core.mjs.map +1 -1
  141. package/filter-bar/package.json +4 -0
  142. package/icon/package.json +4 -0
  143. package/image-viewer/package.json +4 -0
  144. package/input/package.json +4 -0
  145. package/input-otp/package.json +4 -0
  146. package/knob/package.json +4 -0
  147. package/meter-group/package.json +4 -0
  148. package/modal/package.json +4 -0
  149. package/multiselect/package.json +4 -0
  150. package/nav/package.json +4 -0
  151. package/notification-center/package.json +4 -0
  152. package/number-input/package.json +4 -0
  153. package/package.json +252 -5
  154. package/pagination/package.json +4 -0
  155. package/popover/package.json +4 -0
  156. package/progress-bar/package.json +4 -0
  157. package/radio/package.json +4 -0
  158. package/rating/package.json +4 -0
  159. package/select/package.json +4 -0
  160. package/sidebar/package.json +4 -0
  161. package/skeleton/package.json +4 -0
  162. package/slider/package.json +4 -0
  163. package/spinner/package.json +4 -0
  164. package/split-button/package.json +4 -0
  165. package/splitter/package.json +4 -0
  166. package/stats-card/package.json +4 -0
  167. package/stepper/package.json +4 -0
  168. package/styles/_tokens.scss +202 -0
  169. package/styles.scss +1 -0
  170. package/switch/package.json +4 -0
  171. package/table/package.json +4 -0
  172. package/tabs/package.json +4 -0
  173. package/textarea/package.json +4 -0
  174. package/timeline/package.json +4 -0
  175. package/toast/package.json +4 -0
  176. package/toggle-button-group/package.json +4 -0
  177. package/toolbar/package.json +4 -0
  178. package/tooltip/package.json +4 -0
  179. package/types/neural-ui-core-accordion.d.ts +55 -0
  180. package/types/neural-ui-core-alert.d.ts +47 -0
  181. package/types/neural-ui-core-autocomplete.d.ts +75 -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 +138 -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 +170 -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 +285 -0
  228. package/types/neural-ui-core-tabs.d.ts +88 -0
  229. package/types/neural-ui-core-textarea.d.ts +52 -0
  230. package/types/neural-ui-core-timeline.d.ts +33 -0
  231. package/types/neural-ui-core-toast.d.ts +70 -0
  232. package/types/neural-ui-core-toggle-button-group.d.ts +63 -0
  233. package/types/neural-ui-core-toolbar.d.ts +36 -0
  234. package/types/neural-ui-core-tooltip.d.ts +48 -0
  235. package/types/neural-ui-core-url-state.d.ts +58 -0
  236. package/types/neural-ui-core-virtual-list.d.ts +60 -0
  237. package/types/neural-ui-core.d.ts +3 -2105
  238. package/url-state/package.json +4 -0
  239. package/virtual-list/package.json +4 -0
@@ -0,0 +1,207 @@
1
+ import * as i0 from '@angular/core';
2
+ import { signal, ChangeDetectionStrategy, ViewEncapsulation, Component, input, output, inject, ElementRef, Injector, ViewContainerRef, HostListener, Directive } from '@angular/core';
3
+ import { NgTemplateOutlet } from '@angular/common';
4
+ import { Overlay } from '@angular/cdk/overlay';
5
+ import { ComponentPortal } from '@angular/cdk/portal';
6
+
7
+ /**
8
+ * NeuralUI Popover Overlay Component (internal)
9
+ * Renderizado por CDK Portal — no usar directamente.
10
+ */
11
+ class NeuPopoverOverlayComponent {
12
+ _text = signal('', ...(ngDevMode ? [{ debugName: "_text" }] : /* istanbul ignore next */ []));
13
+ _templateRef = null;
14
+ _context = {};
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPopoverOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuPopoverOverlayComponent, isStandalone: true, selector: "neu-popover-overlay", host: { classAttribute: "neu-popover" }, ngImport: i0, template: `
17
+ @if (_templateRef) {
18
+ <ng-container [ngTemplateOutlet]="_templateRef" [ngTemplateOutletContext]="_context" />
19
+ } @else {
20
+ <div class="neu-popover__inner">{{ _text() }}</div>
21
+ }
22
+ `, isInline: true, styles: ["@charset \"UTF-8\";.neu-popover{background:var(--neu-popover-bg, var(--neu-surface-1, #ffffff));border:1px solid var(--neu-popover-border, var(--neu-border-color, #e5e7eb));border-radius:var(--neu-popover-radius, var(--neu-radius-lg, 12px));box-shadow:var(--neu-popover-shadow, 0 8px 24px -4px rgba(0, 0, 0, .12));min-width:var(--neu-popover-min-width, 200px);max-width:var(--neu-popover-max-width, 320px);padding:var(--neu-popover-padding, 12px 16px);font-size:.875rem;line-height:1.5;color:var(--neu-popover-color, var(--neu-text, var(--neu-text-primary, #111827)));z-index:1000;animation:neu-popover-in .12s ease}@keyframes neu-popover-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.neu-popover__inner{padding:0}.neu-popover-backdrop{background:transparent}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPopoverOverlayComponent, decorators: [{
25
+ type: Component,
26
+ args: [{ selector: 'neu-popover-overlay', imports: [NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'neu-popover' }, template: `
27
+ @if (_templateRef) {
28
+ <ng-container [ngTemplateOutlet]="_templateRef" [ngTemplateOutletContext]="_context" />
29
+ } @else {
30
+ <div class="neu-popover__inner">{{ _text() }}</div>
31
+ }
32
+ `, styles: ["@charset \"UTF-8\";.neu-popover{background:var(--neu-popover-bg, var(--neu-surface-1, #ffffff));border:1px solid var(--neu-popover-border, var(--neu-border-color, #e5e7eb));border-radius:var(--neu-popover-radius, var(--neu-radius-lg, 12px));box-shadow:var(--neu-popover-shadow, 0 8px 24px -4px rgba(0, 0, 0, .12));min-width:var(--neu-popover-min-width, 200px);max-width:var(--neu-popover-max-width, 320px);padding:var(--neu-popover-padding, 12px 16px);font-size:.875rem;line-height:1.5;color:var(--neu-popover-color, var(--neu-text, var(--neu-text-primary, #111827)));z-index:1000;animation:neu-popover-in .12s ease}@keyframes neu-popover-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.neu-popover__inner{padding:0}.neu-popover-backdrop{background:transparent}\n"] }]
33
+ }] });
34
+ /**
35
+ * NeuralUI Popover Directive
36
+ *
37
+ * Muestra un popover flotante anclado al elemento host usando CDK Overlay.
38
+ *
39
+ * Uso:
40
+ * <button [neuPopoverTemplate]="myTpl">Info</button>
41
+ * <ng-template #myTpl>Contenido del popover</ng-template>
42
+ *
43
+ * <button [neuPopoverText]="'Descripción detallada'">Hover me</button>
44
+ */
45
+ class NeuPopoverDirective {
46
+ /** Template del contenido / Content template */
47
+ neuPopover = input(null, ...(ngDevMode ? [{ debugName: "neuPopover" }] : /* istanbul ignore next */ []));
48
+ /** Texto plano cuando no hay template / Plain text when no template */
49
+ neuPopoverText = input('', ...(ngDevMode ? [{ debugName: "neuPopoverText" }] : /* istanbul ignore next */ []));
50
+ /** Posición preferida / Preferred position */
51
+ neuPopoverPosition = input('bottom', ...(ngDevMode ? [{ debugName: "neuPopoverPosition" }] : /* istanbul ignore next */ []));
52
+ /** Trigger del popover / Popover trigger */
53
+ neuPopoverTrigger = input('click', ...(ngDevMode ? [{ debugName: "neuPopoverTrigger" }] : /* istanbul ignore next */ []));
54
+ /** Desactiva el popover / Disables the popover */
55
+ neuPopoverDisabled = input(false, ...(ngDevMode ? [{ debugName: "neuPopoverDisabled" }] : /* istanbul ignore next */ []));
56
+ /** Contexto del template / Template context */
57
+ neuPopoverContext = input({}, ...(ngDevMode ? [{ debugName: "neuPopoverContext" }] : /* istanbul ignore next */ []));
58
+ /** Emitido al abrir / Emitted on open */
59
+ popoverOpened = output();
60
+ /** Emitido al cerrar / Emitted on close */
61
+ popoverClosed = output();
62
+ _isOpen = signal(false, ...(ngDevMode ? [{ debugName: "_isOpen" }] : /* istanbul ignore next */ []));
63
+ _overlay = inject(Overlay);
64
+ _el = inject((ElementRef));
65
+ _injector = inject(Injector);
66
+ _vcr = inject(ViewContainerRef);
67
+ _overlayRef = null;
68
+ _compRef = null;
69
+ onHostClick() {
70
+ if (this.neuPopoverTrigger() !== 'click')
71
+ return;
72
+ this._toggle();
73
+ }
74
+ onMouseEnter() {
75
+ if (this.neuPopoverTrigger() !== 'hover')
76
+ return;
77
+ this.open();
78
+ }
79
+ onMouseLeave() {
80
+ if (this.neuPopoverTrigger() !== 'hover')
81
+ return;
82
+ this.close();
83
+ }
84
+ onFocus() {
85
+ if (this.neuPopoverTrigger() !== 'focus')
86
+ return;
87
+ this.open();
88
+ }
89
+ onBlur() {
90
+ if (this.neuPopoverTrigger() !== 'focus')
91
+ return;
92
+ this.close();
93
+ }
94
+ /** Abre el popover / Opens the popover */
95
+ open() {
96
+ if (this.neuPopoverDisabled() || this._isOpen())
97
+ return;
98
+ this._createOverlay();
99
+ const portal = new ComponentPortal(NeuPopoverOverlayComponent, this._vcr, this._injector);
100
+ this._compRef = this._overlayRef.attach(portal);
101
+ const comp = this._compRef.instance;
102
+ const tpl = this.neuPopover();
103
+ if (tpl) {
104
+ comp._templateRef = tpl;
105
+ comp._context = this.neuPopoverContext();
106
+ }
107
+ else {
108
+ comp._text.set(this.neuPopoverText());
109
+ }
110
+ this._isOpen.set(true);
111
+ this.popoverOpened.emit();
112
+ // Cierra al hacer clic fuera (solo en trigger 'click') / Close on outside click (click trigger only)
113
+ if (this.neuPopoverTrigger() === 'click') {
114
+ this._overlayRef.backdropClick().subscribe(() => this.close());
115
+ }
116
+ }
117
+ /** Cierra el popover / Closes the popover */
118
+ close() {
119
+ this._overlayRef?.detach();
120
+ this._isOpen.set(false);
121
+ this.popoverClosed.emit();
122
+ }
123
+ /** Alterna la visibilidad / Toggles visibility */
124
+ toggle() {
125
+ this._toggle();
126
+ }
127
+ ngOnDestroy() {
128
+ this._overlayRef?.dispose();
129
+ }
130
+ _hostAriaHasPopup() {
131
+ return this.neuPopoverTrigger() === 'click' ? 'dialog' : null;
132
+ }
133
+ _hostAriaExpanded() {
134
+ if (this.neuPopoverTrigger() !== 'click') {
135
+ return null;
136
+ }
137
+ return this._isOpen() ? 'true' : 'false';
138
+ }
139
+ _toggle() {
140
+ this._isOpen() ? this.close() : this.open();
141
+ }
142
+ _createOverlay() {
143
+ if (this._overlayRef) {
144
+ this._overlayRef.dispose();
145
+ }
146
+ const pos = this.neuPopoverPosition();
147
+ const isClick = this.neuPopoverTrigger() === 'click';
148
+ const positions = [
149
+ ...POSITIONS[pos],
150
+ ...POSITIONS[pos === 'bottom' ? 'top' : 'bottom'],
151
+ ];
152
+ this._overlayRef = this._overlay.create({
153
+ // Solo usamos backdrop en trigger 'click' — hover/focus lo cierran con sus propios listeners.
154
+ // Only use backdrop for 'click' trigger — hover/focus close via their own listeners.
155
+ hasBackdrop: isClick,
156
+ backdropClass: 'neu-popover-backdrop',
157
+ positionStrategy: this._overlay
158
+ .position()
159
+ .flexibleConnectedTo(this._el)
160
+ .withPositions(positions),
161
+ scrollStrategy: this._overlay.scrollStrategies.reposition(),
162
+ });
163
+ }
164
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPopoverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
165
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.8", type: NeuPopoverDirective, isStandalone: true, selector: "[neuPopover]", inputs: { neuPopover: { classPropertyName: "neuPopover", publicName: "neuPopover", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverText: { classPropertyName: "neuPopoverText", publicName: "neuPopoverText", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverPosition: { classPropertyName: "neuPopoverPosition", publicName: "neuPopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverTrigger: { classPropertyName: "neuPopoverTrigger", publicName: "neuPopoverTrigger", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverDisabled: { classPropertyName: "neuPopoverDisabled", publicName: "neuPopoverDisabled", isSignal: true, isRequired: false, transformFunction: null }, neuPopoverContext: { classPropertyName: "neuPopoverContext", publicName: "neuPopoverContext", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { popoverOpened: "popoverOpened", popoverClosed: "popoverClosed" }, host: { listeners: { "click": "onHostClick()", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.aria-haspopup": "_hostAriaHasPopup()", "attr.aria-expanded": "_hostAriaExpanded()" } }, exportAs: ["neuPopover"], ngImport: i0 });
166
+ }
167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuPopoverDirective, decorators: [{
168
+ type: Directive,
169
+ args: [{
170
+ selector: '[neuPopover]',
171
+ exportAs: 'neuPopover',
172
+ host: {
173
+ '[attr.aria-haspopup]': '_hostAriaHasPopup()',
174
+ '[attr.aria-expanded]': '_hostAriaExpanded()',
175
+ },
176
+ }]
177
+ }], propDecorators: { neuPopover: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuPopover", required: false }] }], neuPopoverText: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuPopoverText", required: false }] }], neuPopoverPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuPopoverPosition", required: false }] }], neuPopoverTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuPopoverTrigger", required: false }] }], neuPopoverDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuPopoverDisabled", required: false }] }], neuPopoverContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "neuPopoverContext", required: false }] }], popoverOpened: [{ type: i0.Output, args: ["popoverOpened"] }], popoverClosed: [{ type: i0.Output, args: ["popoverClosed"] }], onHostClick: [{
178
+ type: HostListener,
179
+ args: ['click']
180
+ }], onMouseEnter: [{
181
+ type: HostListener,
182
+ args: ['mouseenter']
183
+ }], onMouseLeave: [{
184
+ type: HostListener,
185
+ args: ['mouseleave']
186
+ }], onFocus: [{
187
+ type: HostListener,
188
+ args: ['focus']
189
+ }], onBlur: [{
190
+ type: HostListener,
191
+ args: ['blur']
192
+ }] } });
193
+ const POSITIONS = {
194
+ bottom: [
195
+ { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 6 },
196
+ ],
197
+ top: [{ originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -6 }],
198
+ left: [{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -6 }],
199
+ right: [{ originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 6 }],
200
+ };
201
+
202
+ /**
203
+ * Generated bundle index. Do not edit.
204
+ */
205
+
206
+ export { NeuPopoverDirective, NeuPopoverOverlayComponent };
207
+ //# sourceMappingURL=neural-ui-core-popover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-popover.mjs","sources":["../../../../projects/ui-core/popover/neu-popover.component.ts","../../../../projects/ui-core/popover/neural-ui-core-popover.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Directive,\n ElementRef,\n EnvironmentInjector,\n HostListener,\n Injector,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Overlay, OverlayRef, ConnectedPosition } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\nexport type NeuPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type NeuPopoverTrigger = 'click' | 'hover' | 'focus';\n\n/**\n * NeuralUI Popover Overlay Component (internal)\n * Renderizado por CDK Portal — no usar directamente.\n */\n@Component({\n selector: 'neu-popover-overlay',\n imports: [NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-popover' },\n template: `\n @if (_templateRef) {\n <ng-container [ngTemplateOutlet]=\"_templateRef\" [ngTemplateOutletContext]=\"_context\" />\n } @else {\n <div class=\"neu-popover__inner\">{{ _text() }}</div>\n }\n `,\n styleUrl: './neu-popover.component.scss',\n})\nexport class NeuPopoverOverlayComponent {\n readonly _text = signal('');\n _templateRef: TemplateRef<unknown> | null = null;\n _context: unknown = {};\n}\n\n/**\n * NeuralUI Popover Directive\n *\n * Muestra un popover flotante anclado al elemento host usando CDK Overlay.\n *\n * Uso:\n * <button [neuPopoverTemplate]=\"myTpl\">Info</button>\n * <ng-template #myTpl>Contenido del popover</ng-template>\n *\n * <button [neuPopoverText]=\"'Descripción detallada'\">Hover me</button>\n */\n@Directive({\n selector: '[neuPopover]',\n exportAs: 'neuPopover',\n host: {\n '[attr.aria-haspopup]': '_hostAriaHasPopup()',\n '[attr.aria-expanded]': '_hostAriaExpanded()',\n },\n})\nexport class NeuPopoverDirective implements OnDestroy {\n /** Template del contenido / Content template */\n readonly neuPopover = input<TemplateRef<unknown> | null>(null);\n\n /** Texto plano cuando no hay template / Plain text when no template */\n readonly neuPopoverText = input<string>('');\n\n /** Posición preferida / Preferred position */\n readonly neuPopoverPosition = input<NeuPopoverPosition>('bottom');\n\n /** Trigger del popover / Popover trigger */\n readonly neuPopoverTrigger = input<NeuPopoverTrigger>('click');\n\n /** Desactiva el popover / Disables the popover */\n readonly neuPopoverDisabled = input<boolean>(false);\n\n /** Contexto del template / Template context */\n readonly neuPopoverContext = input<unknown>({});\n\n /** Emitido al abrir / Emitted on open */\n readonly popoverOpened = output<void>();\n\n /** Emitido al cerrar / Emitted on close */\n readonly popoverClosed = output<void>();\n\n readonly _isOpen = signal(false);\n\n private readonly _overlay = inject(Overlay);\n private readonly _el = inject(ElementRef<HTMLElement>);\n private readonly _injector = inject(Injector);\n private readonly _vcr = inject(ViewContainerRef);\n\n private _overlayRef: OverlayRef | null = null;\n private _compRef: ComponentRef<NeuPopoverOverlayComponent> | null = null;\n\n @HostListener('click')\n onHostClick(): void {\n if (this.neuPopoverTrigger() !== 'click') return;\n this._toggle();\n }\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.open();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.neuPopoverTrigger() !== 'hover') return;\n this.close();\n }\n\n @HostListener('focus')\n onFocus(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.open();\n }\n\n @HostListener('blur')\n onBlur(): void {\n if (this.neuPopoverTrigger() !== 'focus') return;\n this.close();\n }\n\n /** Abre el popover / Opens the popover */\n open(): void {\n if (this.neuPopoverDisabled() || this._isOpen()) return;\n this._createOverlay();\n const portal = new ComponentPortal(NeuPopoverOverlayComponent, this._vcr, this._injector);\n this._compRef = this._overlayRef!.attach(portal);\n const comp = this._compRef.instance;\n const tpl = this.neuPopover();\n if (tpl) {\n comp._templateRef = tpl;\n comp._context = this.neuPopoverContext();\n } else {\n comp._text.set(this.neuPopoverText());\n }\n this._isOpen.set(true);\n this.popoverOpened.emit();\n\n // Cierra al hacer clic fuera (solo en trigger 'click') / Close on outside click (click trigger only)\n if (this.neuPopoverTrigger() === 'click') {\n this._overlayRef!.backdropClick().subscribe(() => this.close());\n }\n }\n\n /** Cierra el popover / Closes the popover */\n close(): void {\n this._overlayRef?.detach();\n this._isOpen.set(false);\n this.popoverClosed.emit();\n }\n\n /** Alterna la visibilidad / Toggles visibility */\n toggle(): void {\n this._toggle();\n }\n\n ngOnDestroy(): void {\n this._overlayRef?.dispose();\n }\n\n protected _hostAriaHasPopup(): 'dialog' | null {\n return this.neuPopoverTrigger() === 'click' ? 'dialog' : null;\n }\n\n protected _hostAriaExpanded(): 'true' | 'false' | null {\n if (this.neuPopoverTrigger() !== 'click') {\n return null;\n }\n return this._isOpen() ? 'true' : 'false';\n }\n\n private _toggle(): void {\n this._isOpen() ? this.close() : this.open();\n }\n\n private _createOverlay(): void {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n }\n const pos = this.neuPopoverPosition();\n const isClick = this.neuPopoverTrigger() === 'click';\n const positions: ConnectedPosition[] = [\n ...POSITIONS[pos],\n ...POSITIONS[pos === 'bottom' ? 'top' : 'bottom'],\n ];\n this._overlayRef = this._overlay.create({\n // Solo usamos backdrop en trigger 'click' — hover/focus lo cierran con sus propios listeners.\n // Only use backdrop for 'click' trigger — hover/focus close via their own listeners.\n hasBackdrop: isClick,\n backdropClass: 'neu-popover-backdrop',\n positionStrategy: this._overlay\n .position()\n .flexibleConnectedTo(this._el)\n .withPositions(positions),\n scrollStrategy: this._overlay.scrollStrategies.reposition(),\n });\n }\n}\n\nconst POSITIONS: Record<NeuPopoverPosition, ConnectedPosition[]> = {\n bottom: [\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 6 },\n ],\n top: [{ originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -6 }],\n left: [{ originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -6 }],\n right: [{ originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 6 }],\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,105 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+
4
+ /**
5
+ * NeuralUI ProgressBar Component
6
+ *
7
+ * Barra de progreso accesible con valor, etiqueta y variantes semánticas.
8
+ * Soporte para modo indeterminado (animación continua).
9
+ *
10
+ * Uso:
11
+ * <neu-progress-bar [value]="75" />
12
+ * <neu-progress-bar [value]="75" label="Cargando..." variant="success" [showValue]="true" />
13
+ * <neu-progress-bar [indeterminate]="true" />
14
+ */
15
+ class NeuProgressBarComponent {
16
+ /** Valor de 0 a 100 / Value from 0 to 100 */
17
+ value = input(0, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
18
+ /** Variante de color / Color variant */
19
+ variant = input('primary', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
20
+ /** Etiqueta descriptiva sobre la barra / Descriptive label above the bar */
21
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
22
+ /** Muestra el % a la derecha / Shows the % on the right */
23
+ showValue = input(false, ...(ngDevMode ? [{ debugName: "showValue" }] : /* istanbul ignore next */ []));
24
+ /** Modo indeterminado (animación continua) / Indeterminate mode (continuous animation) */
25
+ indeterminate = input(false, ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
26
+ /** Altura de la barra / Bar height */
27
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
28
+ clampedValue = computed(() => Math.min(100, Math.max(0, this.value())), ...(ngDevMode ? [{ debugName: "clampedValue" }] : /* istanbul ignore next */ []));
29
+ hostClasses = computed(() => [`neu-progress--${this.variant()}`, `neu-progress--${this.size()}`].join(' '), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
30
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
31
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuProgressBarComponent, isStandalone: true, selector: "neu-progress-bar", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
32
+ <div class="neu-progress" [class]="hostClasses()">
33
+ @if (label()) {
34
+ <div class="neu-progress__header">
35
+ <span class="neu-progress__label">{{ label() }}</span>
36
+ @if (showValue() && !indeterminate()) {
37
+ <span class="neu-progress__value">{{ clampedValue() }}%</span>
38
+ }
39
+ </div>
40
+ } @else if (showValue() && !indeterminate()) {
41
+ <div class="neu-progress__header">
42
+ <span></span>
43
+ <span class="neu-progress__value">{{ clampedValue() }}%</span>
44
+ </div>
45
+ }
46
+ <div
47
+ class="neu-progress__track"
48
+ role="progressbar"
49
+ [attr.aria-valuenow]="indeterminate() ? null : clampedValue()"
50
+ [attr.aria-valuemin]="0"
51
+ [attr.aria-valuemax]="100"
52
+ [attr.aria-label]="label() || 'Progreso'"
53
+ [attr.aria-valuetext]="indeterminate() ? 'Cargando...' : clampedValue() + '%'"
54
+ >
55
+ <div
56
+ class="neu-progress__fill"
57
+ [class.neu-progress__fill--indeterminate]="indeterminate()"
58
+ [style.width.%]="indeterminate() ? null : clampedValue()"
59
+ ></div>
60
+ </div>
61
+ </div>
62
+ `, isInline: true, styles: ["@keyframes neu-progress-indeterminate{0%{transform:translate(-100%) scaleX(.5)}50%{transform:translate(0) scaleX(.7)}to{transform:translate(200%) scaleX(.5)}}.neu-progress{display:flex;flex-direction:column;gap:6px;width:100%;font-family:var(--neu-font-sans)}.neu-progress__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.neu-progress__label{font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted)}.neu-progress__value{font-size:var(--neu-text-xs);font-weight:600;color:var(--neu-text-muted);min-width:32px;text-align:right}.neu-progress__track{width:100%;background:var(--neu-surface-3);border-radius:var(--neu-radius-full);overflow:hidden}.neu-progress--sm .neu-progress__track{height:4px}.neu-progress--md .neu-progress__track{height:8px}.neu-progress--lg .neu-progress__track{height:12px}.neu-progress__fill{height:100%;border-radius:var(--neu-radius-full);transition:width .4s cubic-bezier(.4,0,.2,1);transform-origin:left center}.neu-progress__fill--indeterminate{width:50%!important;animation:neu-progress-indeterminate 1.4s ease-in-out infinite}.neu-progress--primary .neu-progress__fill{background:var(--neu-primary)}.neu-progress--success .neu-progress__fill{background:var(--neu-success)}.neu-progress--warning .neu-progress__fill{background:var(--neu-warning)}.neu-progress--danger .neu-progress__fill{background:var(--neu-error)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuProgressBarComponent, decorators: [{
65
+ type: Component,
66
+ args: [{ selector: 'neu-progress-bar', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
67
+ <div class="neu-progress" [class]="hostClasses()">
68
+ @if (label()) {
69
+ <div class="neu-progress__header">
70
+ <span class="neu-progress__label">{{ label() }}</span>
71
+ @if (showValue() && !indeterminate()) {
72
+ <span class="neu-progress__value">{{ clampedValue() }}%</span>
73
+ }
74
+ </div>
75
+ } @else if (showValue() && !indeterminate()) {
76
+ <div class="neu-progress__header">
77
+ <span></span>
78
+ <span class="neu-progress__value">{{ clampedValue() }}%</span>
79
+ </div>
80
+ }
81
+ <div
82
+ class="neu-progress__track"
83
+ role="progressbar"
84
+ [attr.aria-valuenow]="indeterminate() ? null : clampedValue()"
85
+ [attr.aria-valuemin]="0"
86
+ [attr.aria-valuemax]="100"
87
+ [attr.aria-label]="label() || 'Progreso'"
88
+ [attr.aria-valuetext]="indeterminate() ? 'Cargando...' : clampedValue() + '%'"
89
+ >
90
+ <div
91
+ class="neu-progress__fill"
92
+ [class.neu-progress__fill--indeterminate]="indeterminate()"
93
+ [style.width.%]="indeterminate() ? null : clampedValue()"
94
+ ></div>
95
+ </div>
96
+ </div>
97
+ `, styles: ["@keyframes neu-progress-indeterminate{0%{transform:translate(-100%) scaleX(.5)}50%{transform:translate(0) scaleX(.7)}to{transform:translate(200%) scaleX(.5)}}.neu-progress{display:flex;flex-direction:column;gap:6px;width:100%;font-family:var(--neu-font-sans)}.neu-progress__header{display:flex;align-items:center;justify-content:space-between;gap:8px}.neu-progress__label{font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted)}.neu-progress__value{font-size:var(--neu-text-xs);font-weight:600;color:var(--neu-text-muted);min-width:32px;text-align:right}.neu-progress__track{width:100%;background:var(--neu-surface-3);border-radius:var(--neu-radius-full);overflow:hidden}.neu-progress--sm .neu-progress__track{height:4px}.neu-progress--md .neu-progress__track{height:8px}.neu-progress--lg .neu-progress__track{height:12px}.neu-progress__fill{height:100%;border-radius:var(--neu-radius-full);transition:width .4s cubic-bezier(.4,0,.2,1);transform-origin:left center}.neu-progress__fill--indeterminate{width:50%!important;animation:neu-progress-indeterminate 1.4s ease-in-out infinite}.neu-progress--primary .neu-progress__fill{background:var(--neu-primary)}.neu-progress--success .neu-progress__fill{background:var(--neu-success)}.neu-progress--warning .neu-progress__fill{background:var(--neu-warning)}.neu-progress--danger .neu-progress__fill{background:var(--neu-error)}\n"] }]
98
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], showValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValue", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
99
+
100
+ /**
101
+ * Generated bundle index. Do not edit.
102
+ */
103
+
104
+ export { NeuProgressBarComponent };
105
+ //# sourceMappingURL=neural-ui-core-progress-bar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-progress-bar.mjs","sources":["../../../../projects/ui-core/progress-bar/neu-progress-bar.component.ts","../../../../projects/ui-core/progress-bar/neural-ui-core-progress-bar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\n\nexport type NeuProgressVariant = 'primary' | 'success' | 'warning' | 'danger';\n\n/**\n * NeuralUI ProgressBar Component\n *\n * Barra de progreso accesible con valor, etiqueta y variantes semánticas.\n * Soporte para modo indeterminado (animación continua).\n *\n * Uso:\n * <neu-progress-bar [value]=\"75\" />\n * <neu-progress-bar [value]=\"75\" label=\"Cargando...\" variant=\"success\" [showValue]=\"true\" />\n * <neu-progress-bar [indeterminate]=\"true\" />\n */\n@Component({\n selector: 'neu-progress-bar',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-progress\" [class]=\"hostClasses()\">\n @if (label()) {\n <div class=\"neu-progress__header\">\n <span class=\"neu-progress__label\">{{ label() }}</span>\n @if (showValue() && !indeterminate()) {\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n }\n </div>\n } @else if (showValue() && !indeterminate()) {\n <div class=\"neu-progress__header\">\n <span></span>\n <span class=\"neu-progress__value\">{{ clampedValue() }}%</span>\n </div>\n }\n <div\n class=\"neu-progress__track\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"indeterminate() ? null : clampedValue()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-label]=\"label() || 'Progreso'\"\n [attr.aria-valuetext]=\"indeterminate() ? 'Cargando...' : clampedValue() + '%'\"\n >\n <div\n class=\"neu-progress__fill\"\n [class.neu-progress__fill--indeterminate]=\"indeterminate()\"\n [style.width.%]=\"indeterminate() ? null : clampedValue()\"\n ></div>\n </div>\n </div>\n `,\n styleUrl: './neu-progress-bar.component.scss',\n})\nexport class NeuProgressBarComponent {\n /** Valor de 0 a 100 / Value from 0 to 100 */\n value = input<number>(0);\n\n /** Variante de color / Color variant */\n variant = input<NeuProgressVariant>('primary');\n\n /** Etiqueta descriptiva sobre la barra / Descriptive label above the bar */\n label = input<string>('');\n\n /** Muestra el % a la derecha / Shows the % on the right */\n showValue = input<boolean>(false);\n\n /** Modo indeterminado (animación continua) / Indeterminate mode (continuous animation) */\n indeterminate = input<boolean>(false);\n\n /** Altura de la barra / Bar height */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n readonly clampedValue = computed(() => Math.min(100, Math.max(0, this.value())));\n\n readonly hostClasses = computed(() =>\n [`neu-progress--${this.variant()}`, `neu-progress--${this.size()}`].join(' '),\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,171 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, input, signal, forwardRef, ChangeDetectionStrategy, ViewEncapsulation, Component, inject, computed } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+
5
+ /** Token para que neu-radio encuentre a su grupo padre / Token for neu-radio to find its parent group */
6
+ const NEU_RADIO_GROUP = new InjectionToken('NEU_RADIO_GROUP');
7
+ /**
8
+ * NeuralUI Radio Group Component
9
+ *
10
+ * Contenedor para grupos de radio buttons. Implementa ControlValueAccessor.
11
+ *
12
+ * Uso:
13
+ * <neu-radio-group [formControl]="ctrl">
14
+ * <neu-radio value="a" label="Opción A" />
15
+ * <neu-radio value="b" label="Opción B" />
16
+ * </neu-radio-group>
17
+ */
18
+ let _neuRadioGroupIdSeq = 0;
19
+ class NeuRadioGroupComponent {
20
+ direction = input('column', ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
21
+ /** Etiqueta accesible del grupo (WCAG 4.1.2). Usar cuando no hay <legend> visible. / Accessible label for the group (WCAG 4.1.2). Use when there is no visible <legend>. */
22
+ ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
23
+ /** Nombre HTML compartido por todos los neu-radio hijos — garantiza la exclusión mutua nativa / HTML name shared by all child neu-radio — guarantees native mutual exclusion */
24
+ _name = `neu-radio-group-${++_neuRadioGroupIdSeq}`;
25
+ _value = signal(null, ...(ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []));
26
+ _isDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_isDisabled" }] : /* istanbul ignore next */ []));
27
+ _onChange = () => { };
28
+ _onTouched = () => { };
29
+ select(value) {
30
+ this._value.set(value);
31
+ this._onChange(value);
32
+ this._onTouched();
33
+ }
34
+ writeValue(val) {
35
+ this._value.set(val ?? null);
36
+ }
37
+ registerOnChange(fn) {
38
+ this._onChange = fn;
39
+ }
40
+ registerOnTouched(fn) {
41
+ this._onTouched = fn;
42
+ }
43
+ setDisabledState(isDisabled) {
44
+ this._isDisabled.set(isDisabled);
45
+ }
46
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRadioGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
47
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.8", type: NeuRadioGroupComponent, isStandalone: true, selector: "neu-radio-group", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "radiogroup" }, properties: { "attr.aria-disabled": "_isDisabled()", "attr.aria-label": "ariaLabel() || null" }, classAttribute: "neu-radio-group" }, providers: [
48
+ {
49
+ provide: NG_VALUE_ACCESSOR,
50
+ useExisting: forwardRef(() => NeuRadioGroupComponent),
51
+ multi: true,
52
+ },
53
+ {
54
+ provide: NEU_RADIO_GROUP,
55
+ useExisting: NeuRadioGroupComponent,
56
+ },
57
+ ], ngImport: i0, template: `<ng-content />`, isInline: true, styles: [".neu-radio-group{display:flex;flex-direction:column;gap:var(--neu-space-3)}.neu-radio-group[dir=row]{flex-direction:row;flex-wrap:wrap}.neu-radio-host{display:inline-block}.neu-radio{display:inline-flex;align-items:center;gap:var(--neu-space-3);cursor:pointer;-webkit-user-select:none;user-select:none}.neu-radio--disabled{opacity:.5;pointer-events:none}.neu-radio__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.neu-radio__input:focus-visible+.neu-radio__circle{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-radio__circle{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;background:var(--neu-surface);border:1.5px solid var(--neu-border-hover);border-radius:var(--neu-radius-full);transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-radio__circle--checked{border-color:var(--neu-primary);box-shadow:var(--neu-focus-ring)}.neu-radio__dot{width:8px;height:8px;border-radius:var(--neu-radius-full);background:var(--neu-primary);transform:scale(0);transition:transform var(--neu-transition-bounce)}.neu-radio--checked .neu-radio__dot{transform:scale(1)}.neu-radio__label{font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);color:var(--neu-text);font-weight:500;line-height:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRadioGroupComponent, decorators: [{
60
+ type: Component,
61
+ args: [{ selector: 'neu-radio-group', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
62
+ class: 'neu-radio-group',
63
+ role: 'radiogroup',
64
+ '[attr.aria-disabled]': '_isDisabled()',
65
+ '[attr.aria-label]': 'ariaLabel() || null',
66
+ }, providers: [
67
+ {
68
+ provide: NG_VALUE_ACCESSOR,
69
+ useExisting: forwardRef(() => NeuRadioGroupComponent),
70
+ multi: true,
71
+ },
72
+ {
73
+ provide: NEU_RADIO_GROUP,
74
+ useExisting: NeuRadioGroupComponent,
75
+ },
76
+ ], template: `<ng-content />`, styles: [".neu-radio-group{display:flex;flex-direction:column;gap:var(--neu-space-3)}.neu-radio-group[dir=row]{flex-direction:row;flex-wrap:wrap}.neu-radio-host{display:inline-block}.neu-radio{display:inline-flex;align-items:center;gap:var(--neu-space-3);cursor:pointer;-webkit-user-select:none;user-select:none}.neu-radio--disabled{opacity:.5;pointer-events:none}.neu-radio__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.neu-radio__input:focus-visible+.neu-radio__circle{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-radio__circle{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:18px;background:var(--neu-surface);border:1.5px solid var(--neu-border-hover);border-radius:var(--neu-radius-full);transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-radio__circle--checked{border-color:var(--neu-primary);box-shadow:var(--neu-focus-ring)}.neu-radio__dot{width:8px;height:8px;border-radius:var(--neu-radius-full);background:var(--neu-primary);transform:scale(0);transition:transform var(--neu-transition-bounce)}.neu-radio--checked .neu-radio__dot{transform:scale(1)}.neu-radio__label{font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);color:var(--neu-text);font-weight:500;line-height:1}\n"] }]
77
+ }], propDecorators: { direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
78
+
79
+ let _neuRadioIdSeq = 0;
80
+ /**
81
+ * NeuralUI Radio Component
82
+ *
83
+ * Opción individual dentro de un neu-radio-group.
84
+ *
85
+ * Uso:
86
+ * <neu-radio value="opcion-a" label="Opción A" />
87
+ */
88
+ class NeuRadioComponent {
89
+ value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
90
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
91
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
92
+ group = inject(NEU_RADIO_GROUP);
93
+ _id = `neu-radio-${_neuRadioIdSeq++}`;
94
+ /** Toma el nombre del grupo padre — así todos los radios del grupo comparten el mismo `name` nativo / Takes the parent group name — so all radios in the group share the same native `name` */
95
+ _groupName = this.group._name;
96
+ isChecked = computed(() => this.group._value() === this.value(), ...(ngDevMode ? [{ debugName: "isChecked" }] : /* istanbul ignore next */ []));
97
+ isDisabled = computed(() => this.disabled() || this.group._isDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
98
+ onSelect() {
99
+ this.group.select(this.value());
100
+ }
101
+ onBlur() { }
102
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
103
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuRadioComponent, isStandalone: true, selector: "neu-radio", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "neu-radio-host" }, ngImport: i0, template: `
104
+ <label
105
+ class="neu-radio"
106
+ [class.neu-radio--checked]="isChecked()"
107
+ [class.neu-radio--disabled]="isDisabled()"
108
+ [for]="_id"
109
+ >
110
+ <input
111
+ type="radio"
112
+ class="neu-radio__input"
113
+ [id]="_id"
114
+ [name]="_groupName"
115
+ [value]="value()"
116
+ [checked]="isChecked()"
117
+ [disabled]="isDisabled()"
118
+ (change)="onSelect()"
119
+ (blur)="onBlur()"
120
+ />
121
+ <span class="neu-radio__circle" [class.neu-radio__circle--checked]="isChecked()">
122
+ <span class="neu-radio__dot"></span>
123
+ </span>
124
+ @if (label()) {
125
+ <span class="neu-radio__label">{{ label() }}</span>
126
+ }
127
+ </label>
128
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRadioComponent, decorators: [{
131
+ type: Component,
132
+ args: [{
133
+ selector: 'neu-radio',
134
+ encapsulation: ViewEncapsulation.None,
135
+ changeDetection: ChangeDetectionStrategy.OnPush,
136
+ host: { class: 'neu-radio-host' },
137
+ template: `
138
+ <label
139
+ class="neu-radio"
140
+ [class.neu-radio--checked]="isChecked()"
141
+ [class.neu-radio--disabled]="isDisabled()"
142
+ [for]="_id"
143
+ >
144
+ <input
145
+ type="radio"
146
+ class="neu-radio__input"
147
+ [id]="_id"
148
+ [name]="_groupName"
149
+ [value]="value()"
150
+ [checked]="isChecked()"
151
+ [disabled]="isDisabled()"
152
+ (change)="onSelect()"
153
+ (blur)="onBlur()"
154
+ />
155
+ <span class="neu-radio__circle" [class.neu-radio__circle--checked]="isChecked()">
156
+ <span class="neu-radio__dot"></span>
157
+ </span>
158
+ @if (label()) {
159
+ <span class="neu-radio__label">{{ label() }}</span>
160
+ }
161
+ </label>
162
+ `,
163
+ }]
164
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
165
+
166
+ /**
167
+ * Generated bundle index. Do not edit.
168
+ */
169
+
170
+ export { NEU_RADIO_GROUP, NeuRadioComponent, NeuRadioGroupComponent };
171
+ //# sourceMappingURL=neural-ui-core-radio.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-radio.mjs","sources":["../../../../projects/ui-core/radio/neu-radio-group.component.ts","../../../../projects/ui-core/radio/neu-radio.component.ts","../../../../projects/ui-core/radio/neural-ui-core-radio.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n InjectionToken,\n ViewEncapsulation,\n forwardRef,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Token para que neu-radio encuentre a su grupo padre / Token for neu-radio to find its parent group */\nexport const NEU_RADIO_GROUP = new InjectionToken<NeuRadioGroupComponent>('NEU_RADIO_GROUP');\n\n/**\n * NeuralUI Radio Group Component\n *\n * Contenedor para grupos de radio buttons. Implementa ControlValueAccessor.\n *\n * Uso:\n * <neu-radio-group [formControl]=\"ctrl\">\n * <neu-radio value=\"a\" label=\"Opción A\" />\n * <neu-radio value=\"b\" label=\"Opción B\" />\n * </neu-radio-group>\n */\nlet _neuRadioGroupIdSeq = 0;\n\n@Component({\n selector: 'neu-radio-group',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-radio-group',\n role: 'radiogroup',\n '[attr.aria-disabled]': '_isDisabled()',\n '[attr.aria-label]': 'ariaLabel() || null',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuRadioGroupComponent),\n multi: true,\n },\n {\n provide: NEU_RADIO_GROUP,\n useExisting: NeuRadioGroupComponent,\n },\n ],\n template: `<ng-content />`,\n styleUrl: './neu-radio.component.scss',\n})\nexport class NeuRadioGroupComponent implements ControlValueAccessor {\n readonly direction = input<'row' | 'column'>('column');\n /** Etiqueta accesible del grupo (WCAG 4.1.2). Usar cuando no hay <legend> visible. / Accessible label for the group (WCAG 4.1.2). Use when there is no visible <legend>. */\n readonly ariaLabel = input<string>('');\n\n /** Nombre HTML compartido por todos los neu-radio hijos — garantiza la exclusión mutua nativa / HTML name shared by all child neu-radio — guarantees native mutual exclusion */\n readonly _name = `neu-radio-group-${++_neuRadioGroupIdSeq}`;\n\n readonly _value = signal<unknown>(null);\n readonly _isDisabled = signal(false);\n\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n select(value: unknown): void {\n this._value.set(value);\n this._onChange(value);\n this._onTouched();\n }\n\n writeValue(val: unknown): void {\n this._value.set(val ?? null);\n }\n\n registerOnChange(fn: (v: unknown) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._isDisabled.set(isDisabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { NEU_RADIO_GROUP } from './neu-radio-group.component';\n\nlet _neuRadioIdSeq = 0;\n\n/**\n * NeuralUI Radio Component\n *\n * Opción individual dentro de un neu-radio-group.\n *\n * Uso:\n * <neu-radio value=\"opcion-a\" label=\"Opción A\" />\n */\n@Component({\n selector: 'neu-radio',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'neu-radio-host' },\n template: `\n <label\n class=\"neu-radio\"\n [class.neu-radio--checked]=\"isChecked()\"\n [class.neu-radio--disabled]=\"isDisabled()\"\n [for]=\"_id\"\n >\n <input\n type=\"radio\"\n class=\"neu-radio__input\"\n [id]=\"_id\"\n [name]=\"_groupName\"\n [value]=\"value()\"\n [checked]=\"isChecked()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onSelect()\"\n (blur)=\"onBlur()\"\n />\n <span class=\"neu-radio__circle\" [class.neu-radio__circle--checked]=\"isChecked()\">\n <span class=\"neu-radio__dot\"></span>\n </span>\n @if (label()) {\n <span class=\"neu-radio__label\">{{ label() }}</span>\n }\n </label>\n `,\n})\nexport class NeuRadioComponent {\n readonly value = input.required<unknown>();\n readonly label = input<string>('');\n readonly disabled = input<boolean>(false);\n\n readonly group = inject(NEU_RADIO_GROUP);\n\n readonly _id = `neu-radio-${_neuRadioIdSeq++}`;\n /** Toma el nombre del grupo padre — así todos los radios del grupo comparten el mismo `name` nativo / Takes the parent group name — so all radios in the group share the same native `name` */\n readonly _groupName = this.group._name;\n\n readonly isChecked = computed(() => this.group._value() === this.value());\n readonly isDisabled = computed(() => this.disabled() || this.group._isDisabled());\n\n onSelect(): void {\n this.group.select(this.value());\n }\n\n onBlur(): void {}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}