@neural-ui/core 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +56 -88
  2. package/accordion/package.json +4 -0
  3. package/alert/package.json +4 -0
  4. package/autocomplete/package.json +4 -0
  5. package/avatar/package.json +4 -0
  6. package/badge/package.json +4 -0
  7. package/block-ui/package.json +4 -0
  8. package/breadcrumb/package.json +4 -0
  9. package/button/package.json +4 -0
  10. package/card/package.json +4 -0
  11. package/chart/package.json +4 -0
  12. package/checkbox/package.json +4 -0
  13. package/chip/package.json +4 -0
  14. package/code-block/package.json +4 -0
  15. package/color-picker/package.json +4 -0
  16. package/command-palette/package.json +4 -0
  17. package/confirm-dialog/package.json +4 -0
  18. package/context-menu/package.json +4 -0
  19. package/dashboard-grid/package.json +4 -0
  20. package/date-input/package.json +4 -0
  21. package/divider/package.json +4 -0
  22. package/empty-state/package.json +4 -0
  23. package/fesm2022/neural-ui-core-accordion.mjs +162 -0
  24. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -0
  25. package/fesm2022/neural-ui-core-alert.mjs +116 -0
  26. package/fesm2022/neural-ui-core-alert.mjs.map +1 -0
  27. package/fesm2022/neural-ui-core-autocomplete.mjs +332 -0
  28. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -0
  29. package/fesm2022/neural-ui-core-avatar.mjs +109 -0
  30. package/fesm2022/neural-ui-core-avatar.mjs.map +1 -0
  31. package/fesm2022/neural-ui-core-badge.mjs +54 -0
  32. package/fesm2022/neural-ui-core-badge.mjs.map +1 -0
  33. package/fesm2022/neural-ui-core-block-ui.mjs +95 -0
  34. package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -0
  35. package/fesm2022/neural-ui-core-breadcrumb.mjs +84 -0
  36. package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -0
  37. package/fesm2022/neural-ui-core-button.mjs +125 -0
  38. package/fesm2022/neural-ui-core-button.mjs.map +1 -0
  39. package/fesm2022/neural-ui-core-card.mjs +69 -0
  40. package/fesm2022/neural-ui-core-card.mjs.map +1 -0
  41. package/fesm2022/neural-ui-core-chart.mjs +287 -0
  42. package/fesm2022/neural-ui-core-chart.mjs.map +1 -0
  43. package/fesm2022/neural-ui-core-checkbox.mjs +138 -0
  44. package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -0
  45. package/fesm2022/neural-ui-core-chip.mjs +130 -0
  46. package/fesm2022/neural-ui-core-chip.mjs.map +1 -0
  47. package/fesm2022/neural-ui-core-code-block.mjs +250 -0
  48. package/fesm2022/neural-ui-core-code-block.mjs.map +1 -0
  49. package/fesm2022/neural-ui-core-color-picker.mjs +435 -0
  50. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -0
  51. package/fesm2022/neural-ui-core-command-palette.mjs +235 -0
  52. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -0
  53. package/fesm2022/neural-ui-core-confirm-dialog.mjs +118 -0
  54. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -0
  55. package/fesm2022/neural-ui-core-context-menu.mjs +158 -0
  56. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -0
  57. package/fesm2022/neural-ui-core-dashboard-grid.mjs +144 -0
  58. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -0
  59. package/fesm2022/neural-ui-core-date-input.mjs +1332 -0
  60. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -0
  61. package/fesm2022/neural-ui-core-divider.mjs +54 -0
  62. package/fesm2022/neural-ui-core-divider.mjs.map +1 -0
  63. package/fesm2022/neural-ui-core-empty-state.mjs +84 -0
  64. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -0
  65. package/fesm2022/neural-ui-core-filter-bar.mjs +118 -0
  66. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -0
  67. package/fesm2022/neural-ui-core-icon.mjs +50 -0
  68. package/fesm2022/neural-ui-core-icon.mjs.map +1 -0
  69. package/fesm2022/neural-ui-core-image-viewer.mjs +309 -0
  70. package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -0
  71. package/fesm2022/neural-ui-core-input-otp.mjs +192 -0
  72. package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -0
  73. package/fesm2022/neural-ui-core-input.mjs +320 -0
  74. package/fesm2022/neural-ui-core-input.mjs.map +1 -0
  75. package/fesm2022/neural-ui-core-knob.mjs +323 -0
  76. package/fesm2022/neural-ui-core-knob.mjs.map +1 -0
  77. package/fesm2022/neural-ui-core-meter-group.mjs +122 -0
  78. package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -0
  79. package/fesm2022/neural-ui-core-modal.mjs +156 -0
  80. package/fesm2022/neural-ui-core-modal.mjs.map +1 -0
  81. package/fesm2022/neural-ui-core-multiselect.mjs +748 -0
  82. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -0
  83. package/fesm2022/neural-ui-core-nav.mjs +952 -0
  84. package/fesm2022/neural-ui-core-nav.mjs.map +1 -0
  85. package/fesm2022/neural-ui-core-notification-center.mjs +264 -0
  86. package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -0
  87. package/fesm2022/neural-ui-core-number-input.mjs +331 -0
  88. package/fesm2022/neural-ui-core-number-input.mjs.map +1 -0
  89. package/fesm2022/neural-ui-core-pagination.mjs +198 -0
  90. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -0
  91. package/fesm2022/neural-ui-core-popover.mjs +207 -0
  92. package/fesm2022/neural-ui-core-popover.mjs.map +1 -0
  93. package/fesm2022/neural-ui-core-progress-bar.mjs +105 -0
  94. package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -0
  95. package/fesm2022/neural-ui-core-radio.mjs +171 -0
  96. package/fesm2022/neural-ui-core-radio.mjs.map +1 -0
  97. package/fesm2022/neural-ui-core-rating.mjs +151 -0
  98. package/fesm2022/neural-ui-core-rating.mjs.map +1 -0
  99. package/fesm2022/neural-ui-core-select.mjs +638 -0
  100. package/fesm2022/neural-ui-core-select.mjs.map +1 -0
  101. package/fesm2022/neural-ui-core-sidebar.mjs +214 -0
  102. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -0
  103. package/fesm2022/neural-ui-core-skeleton.mjs +40 -0
  104. package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -0
  105. package/fesm2022/neural-ui-core-slider.mjs +146 -0
  106. package/fesm2022/neural-ui-core-slider.mjs.map +1 -0
  107. package/fesm2022/neural-ui-core-spinner.mjs +113 -0
  108. package/fesm2022/neural-ui-core-spinner.mjs.map +1 -0
  109. package/fesm2022/neural-ui-core-split-button.mjs +252 -0
  110. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -0
  111. package/fesm2022/neural-ui-core-splitter.mjs +174 -0
  112. package/fesm2022/neural-ui-core-splitter.mjs.map +1 -0
  113. package/fesm2022/neural-ui-core-stats-card.mjs +163 -0
  114. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -0
  115. package/fesm2022/neural-ui-core-stepper.mjs +204 -0
  116. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -0
  117. package/fesm2022/neural-ui-core-switch.mjs +111 -0
  118. package/fesm2022/neural-ui-core-switch.mjs.map +1 -0
  119. package/fesm2022/neural-ui-core-table.mjs +1860 -0
  120. package/fesm2022/neural-ui-core-table.mjs.map +1 -0
  121. package/fesm2022/neural-ui-core-tabs.mjs +246 -0
  122. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -0
  123. package/fesm2022/neural-ui-core-textarea.mjs +188 -0
  124. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -0
  125. package/fesm2022/neural-ui-core-timeline.mjs +117 -0
  126. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -0
  127. package/fesm2022/neural-ui-core-toast.mjs +171 -0
  128. package/fesm2022/neural-ui-core-toast.mjs.map +1 -0
  129. package/fesm2022/neural-ui-core-toggle-button-group.mjs +162 -0
  130. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -0
  131. package/fesm2022/neural-ui-core-toolbar.mjs +67 -0
  132. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -0
  133. package/fesm2022/neural-ui-core-tooltip.mjs +151 -0
  134. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -0
  135. package/fesm2022/neural-ui-core-url-state.mjs +96 -0
  136. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -0
  137. package/fesm2022/neural-ui-core-virtual-list.mjs +126 -0
  138. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -0
  139. package/fesm2022/neural-ui-core.mjs +11 -8544
  140. package/fesm2022/neural-ui-core.mjs.map +1 -1
  141. package/filter-bar/package.json +4 -0
  142. package/icon/package.json +4 -0
  143. package/image-viewer/package.json +4 -0
  144. package/input/package.json +4 -0
  145. package/input-otp/package.json +4 -0
  146. package/knob/package.json +4 -0
  147. package/meter-group/package.json +4 -0
  148. package/modal/package.json +4 -0
  149. package/multiselect/package.json +4 -0
  150. package/nav/package.json +4 -0
  151. package/notification-center/package.json +4 -0
  152. package/number-input/package.json +4 -0
  153. package/package.json +252 -5
  154. package/pagination/package.json +4 -0
  155. package/popover/package.json +4 -0
  156. package/progress-bar/package.json +4 -0
  157. package/radio/package.json +4 -0
  158. package/rating/package.json +4 -0
  159. package/select/package.json +4 -0
  160. package/sidebar/package.json +4 -0
  161. package/skeleton/package.json +4 -0
  162. package/slider/package.json +4 -0
  163. package/spinner/package.json +4 -0
  164. package/split-button/package.json +4 -0
  165. package/splitter/package.json +4 -0
  166. package/stats-card/package.json +4 -0
  167. package/stepper/package.json +4 -0
  168. package/styles/_tokens.scss +202 -0
  169. package/styles.scss +1 -0
  170. package/switch/package.json +4 -0
  171. package/table/package.json +4 -0
  172. package/tabs/package.json +4 -0
  173. package/textarea/package.json +4 -0
  174. package/timeline/package.json +4 -0
  175. package/toast/package.json +4 -0
  176. package/toggle-button-group/package.json +4 -0
  177. package/toolbar/package.json +4 -0
  178. package/tooltip/package.json +4 -0
  179. package/types/neural-ui-core-accordion.d.ts +55 -0
  180. package/types/neural-ui-core-alert.d.ts +47 -0
  181. package/types/neural-ui-core-autocomplete.d.ts +69 -0
  182. package/types/neural-ui-core-avatar.d.ts +39 -0
  183. package/types/neural-ui-core-badge.d.ts +36 -0
  184. package/types/neural-ui-core-block-ui.d.ts +46 -0
  185. package/types/neural-ui-core-breadcrumb.d.ts +38 -0
  186. package/types/neural-ui-core-button.d.ts +55 -0
  187. package/types/neural-ui-core-card.d.ts +37 -0
  188. package/types/neural-ui-core-chart.d.ts +236 -0
  189. package/types/neural-ui-core-checkbox.d.ts +33 -0
  190. package/types/neural-ui-core-chip.d.ts +53 -0
  191. package/types/neural-ui-core-code-block.d.ts +55 -0
  192. package/types/neural-ui-core-color-picker.d.ts +55 -0
  193. package/types/neural-ui-core-command-palette.d.ts +56 -0
  194. package/types/neural-ui-core-confirm-dialog.d.ts +50 -0
  195. package/types/neural-ui-core-context-menu.d.ts +66 -0
  196. package/types/neural-ui-core-dashboard-grid.d.ts +41 -0
  197. package/types/neural-ui-core-date-input.d.ts +178 -0
  198. package/types/neural-ui-core-divider.d.ts +20 -0
  199. package/types/neural-ui-core-empty-state.d.ts +32 -0
  200. package/types/neural-ui-core-filter-bar.d.ts +49 -0
  201. package/types/neural-ui-core-icon.d.ts +33 -0
  202. package/types/neural-ui-core-image-viewer.d.ts +67 -0
  203. package/types/neural-ui-core-input-otp.d.ts +49 -0
  204. package/types/neural-ui-core-input.d.ts +86 -0
  205. package/types/neural-ui-core-knob.d.ts +68 -0
  206. package/types/neural-ui-core-meter-group.d.ts +52 -0
  207. package/types/neural-ui-core-modal.d.ts +54 -0
  208. package/types/neural-ui-core-multiselect.d.ts +129 -0
  209. package/types/neural-ui-core-nav.d.ts +69 -0
  210. package/types/neural-ui-core-notification-center.d.ts +60 -0
  211. package/types/neural-ui-core-number-input.d.ts +63 -0
  212. package/types/neural-ui-core-pagination.d.ts +30 -0
  213. package/types/neural-ui-core-popover.d.ts +73 -0
  214. package/types/neural-ui-core-progress-bar.d.ts +35 -0
  215. package/types/neural-ui-core-radio.d.ts +51 -0
  216. package/types/neural-ui-core-rating.d.ts +34 -0
  217. package/types/neural-ui-core-select.d.ts +161 -0
  218. package/types/neural-ui-core-sidebar.d.ts +57 -0
  219. package/types/neural-ui-core-skeleton.d.ts +22 -0
  220. package/types/neural-ui-core-slider.d.ts +42 -0
  221. package/types/neural-ui-core-spinner.d.ts +38 -0
  222. package/types/neural-ui-core-split-button.d.ts +65 -0
  223. package/types/neural-ui-core-splitter.d.ts +28 -0
  224. package/types/neural-ui-core-stats-card.d.ts +39 -0
  225. package/types/neural-ui-core-stepper.d.ts +51 -0
  226. package/types/neural-ui-core-switch.d.ts +34 -0
  227. package/types/neural-ui-core-table.d.ts +282 -0
  228. package/types/neural-ui-core-tabs.d.ts +76 -0
  229. package/types/neural-ui-core-textarea.d.ts +52 -0
  230. package/types/neural-ui-core-timeline.d.ts +33 -0
  231. package/types/neural-ui-core-toast.d.ts +70 -0
  232. package/types/neural-ui-core-toggle-button-group.d.ts +63 -0
  233. package/types/neural-ui-core-toolbar.d.ts +36 -0
  234. package/types/neural-ui-core-tooltip.d.ts +48 -0
  235. package/types/neural-ui-core-url-state.d.ts +58 -0
  236. package/types/neural-ui-core-virtual-list.d.ts +60 -0
  237. package/types/neural-ui-core.d.ts +3 -2105
  238. package/url-state/package.json +4 -0
  239. package/virtual-list/package.json +4 -0
@@ -0,0 +1,435 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, signal, inject, ElementRef, effect, computed, forwardRef, HostListener, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+
5
+ /** Parse hex → { r, g, b } */
6
+ function hexToRgb(hex) {
7
+ const clean = hex.replace('#', '').padEnd(6, '0');
8
+ if (!/^[0-9a-fA-F]{6}$/.test(clean))
9
+ return null;
10
+ return {
11
+ r: parseInt(clean.slice(0, 2), 16),
12
+ g: parseInt(clean.slice(2, 4), 16),
13
+ b: parseInt(clean.slice(4, 6), 16),
14
+ };
15
+ }
16
+ function rgbToHex(r, g, b) {
17
+ return ('#' +
18
+ [r, g, b]
19
+ .map((v) => Math.round(Math.max(0, Math.min(255, v)))
20
+ .toString(16)
21
+ .padStart(2, '0'))
22
+ .join(''));
23
+ }
24
+ function rgbToHsl(r, g, b) {
25
+ const _r = r / 255, _g = g / 255, _b = b / 255;
26
+ const max = Math.max(_r, _g, _b), min = Math.min(_r, _g, _b);
27
+ let h = 0, s = 0;
28
+ const l = (max + min) / 2;
29
+ if (max !== min) {
30
+ const d = max - min;
31
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
32
+ switch (max) {
33
+ case _r:
34
+ h = ((_g - _b) / d + (_g < _b ? 6 : 0)) / 6;
35
+ break;
36
+ case _g:
37
+ h = ((_b - _r) / d + 2) / 6;
38
+ break;
39
+ case _b:
40
+ h = ((_r - _g) / d + 4) / 6;
41
+ break;
42
+ }
43
+ }
44
+ return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };
45
+ }
46
+ function rgbToHsv(r, g, b) {
47
+ const _r = r / 255, _g = g / 255, _b = b / 255;
48
+ const max = Math.max(_r, _g, _b), min = Math.min(_r, _g, _b);
49
+ const v = max;
50
+ const s = max === 0 ? 0 : (max - min) / max;
51
+ let h = 0;
52
+ if (max !== min) {
53
+ const d = max - min;
54
+ switch (max) {
55
+ case _r:
56
+ h = ((_g - _b) / d + (_g < _b ? 6 : 0)) / 6;
57
+ break;
58
+ case _g:
59
+ h = ((_b - _r) / d + 2) / 6;
60
+ break;
61
+ case _b:
62
+ h = ((_r - _g) / d + 4) / 6;
63
+ break;
64
+ }
65
+ }
66
+ return { h: Math.round(h * 360), s: Math.round(s * 100), v: Math.round(v * 100) };
67
+ }
68
+ function hsvToHex(h, s, v) {
69
+ const _s = s / 100, _v = v / 100;
70
+ const f = (n) => {
71
+ const k = (n + h / 60) % 6;
72
+ const val = _v - _v * _s * Math.max(0, Math.min(k, 4 - k, 1));
73
+ return Math.round(val * 255)
74
+ .toString(16)
75
+ .padStart(2, '0');
76
+ };
77
+ return `#${f(5)}${f(3)}${f(1)}`;
78
+ }
79
+ function hslToHex(h, s, l) {
80
+ const _s = s / 100, _l = l / 100;
81
+ const a = _s * Math.min(_l, 1 - _l);
82
+ const f = (n) => {
83
+ const k = (n + h / 30) % 12;
84
+ const color = _l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
85
+ return Math.round(255 * color)
86
+ .toString(16)
87
+ .padStart(2, '0');
88
+ };
89
+ return `#${f(0)}${f(8)}${f(4)}`;
90
+ }
91
+ let _seq = 0;
92
+ /**
93
+ * NeuralUI ColorPicker
94
+ *
95
+ * Selector de color con swatch, hue slider y modos hex/rgb/hsl. CVA.
96
+ *
97
+ * Uso:
98
+ * <neu-color-picker [formControl]="colorCtrl" mode="hex" />
99
+ */
100
+ class NeuColorPickerComponent {
101
+ // ── Inputs / Outputs ────────────────────────────────────────────
102
+ mode = input('hex', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
103
+ /** Emitido al cambiar el color / Emitted when color changes */
104
+ colorChange = output();
105
+ // ── Internal state ───────────────────────────────────────────────
106
+ _id = `neu-cp-${++_seq}`;
107
+ _modes = ['hex', 'rgb', 'hsl'];
108
+ _swatches = [
109
+ '#ef4444',
110
+ '#f97316',
111
+ '#eab308',
112
+ '#22c55e',
113
+ '#10b981',
114
+ '#06b6d4',
115
+ '#3b82f6',
116
+ '#6366f1',
117
+ '#a855f7',
118
+ '#ec4899',
119
+ ];
120
+ _isOpen = signal(false, ...(ngDevMode ? [{ debugName: "_isOpen" }] : /* istanbul ignore next */ []));
121
+ _cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
122
+ _hue = signal(210, ...(ngDevMode ? [{ debugName: "_hue" }] : /* istanbul ignore next */ []));
123
+ _sv = signal({ s: 80, v: 90 }, ...(ngDevMode ? [{ debugName: "_sv" }] : /* istanbul ignore next */ []));
124
+ _activeMode = signal('hex', ...(ngDevMode ? [{ debugName: "_activeMode" }] : /* istanbul ignore next */ []));
125
+ _dragging = false;
126
+ _onChange = () => { };
127
+ _onTouched = () => { };
128
+ _el = inject((ElementRef));
129
+ constructor() {
130
+ // Sync mode input → internal active mode
131
+ effect(() => {
132
+ this._activeMode.set(this.mode());
133
+ });
134
+ }
135
+ // ── Close on outside click ─────────────────────────────────────
136
+ _outsideClick(e) {
137
+ if (!this._el.nativeElement.contains(e.target)) {
138
+ this._isOpen.set(false);
139
+ }
140
+ }
141
+ // ── Computed ──────────────────────────────────────────────────
142
+ _hexValue = computed(() => hsvToHex(this._hue(), this._sv().s, this._sv().v), ...(ngDevMode ? [{ debugName: "_hexValue" }] : /* istanbul ignore next */ []));
143
+ _textValue = computed(() => {
144
+ const hex = this._hexValue();
145
+ const rgb = hexToRgb(hex);
146
+ if (!rgb)
147
+ return hex;
148
+ switch (this._activeMode()) {
149
+ case 'rgb':
150
+ return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;
151
+ case 'hsl': {
152
+ const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);
153
+ return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;
154
+ }
155
+ default:
156
+ return hex;
157
+ }
158
+ }, ...(ngDevMode ? [{ debugName: "_textValue" }] : /* istanbul ignore next */ []));
159
+ // ── Canvas interactions ───────────────────────────────────────
160
+ _canvasDown(e) {
161
+ this._dragging = true;
162
+ e.currentTarget.setPointerCapture(e.pointerId);
163
+ this._updateFromCanvas(e);
164
+ }
165
+ _canvasDrag(e) {
166
+ if (!this._dragging)
167
+ return;
168
+ this._updateFromCanvas(e);
169
+ }
170
+ _canvasUp(e) {
171
+ this._dragging = false;
172
+ e.currentTarget.releasePointerCapture(e.pointerId);
173
+ }
174
+ _updateFromCanvas(e) {
175
+ const rect = e.currentTarget.getBoundingClientRect();
176
+ const s = Math.round(Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width)) * 100);
177
+ const v = Math.round(Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height)) * 100);
178
+ this._sv.set({ s, v });
179
+ this._emit();
180
+ }
181
+ // ── Event handlers ────────────────────────────────────────────
182
+ _toggle() {
183
+ this._isOpen.update((v) => !v);
184
+ }
185
+ _onHueChange(v) {
186
+ this._hue.set(Number(v));
187
+ this._emit();
188
+ }
189
+ _pickSwatch(hex) {
190
+ this._applyHex(hex);
191
+ this._emit();
192
+ }
193
+ _onTextChange(text) {
194
+ const t = text.trim();
195
+ if (t.startsWith('#')) {
196
+ this._applyHex(t);
197
+ }
198
+ else if (t.startsWith('rgb')) {
199
+ const m = t.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
200
+ if (m)
201
+ this._applyHex(rgbToHex(+m[1], +m[2], +m[3]));
202
+ }
203
+ else if (t.startsWith('hsl')) {
204
+ const m = t.match(/hsl\((\d+),\s*(\d+)%?,\s*(\d+)%?\)/);
205
+ if (m)
206
+ this._applyHex(hslToHex(+m[1], +m[2], +m[3]));
207
+ }
208
+ this._emit();
209
+ }
210
+ // ── Helpers ───────────────────────────────────────────────────
211
+ _applyHex(hex) {
212
+ const rgb = hexToRgb(hex);
213
+ if (!rgb)
214
+ return;
215
+ const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);
216
+ this._hue.set(hsv.h);
217
+ this._sv.set({ s: hsv.s, v: hsv.v });
218
+ }
219
+ _emit() {
220
+ const val = this._textValue();
221
+ this._onChange(val);
222
+ this.colorChange.emit(val);
223
+ }
224
+ // ── CVA ──────────────────────────────────────────────────────
225
+ writeValue(val) {
226
+ if (!val)
227
+ return;
228
+ this._onTextChange(val);
229
+ }
230
+ registerOnChange(fn) {
231
+ this._onChange = fn;
232
+ }
233
+ registerOnTouched(fn) {
234
+ this._onTouched = fn;
235
+ }
236
+ setDisabledState(d) {
237
+ this._cvaDisabled.set(d);
238
+ }
239
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
240
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuColorPickerComponent, isStandalone: true, selector: "neu-color-picker", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { colorChange: "colorChange" }, host: { listeners: { "document:mousedown": "_outsideClick($event)" }, properties: { "class.neu-cp--open": "_isOpen()", "class.neu-cp--disabled": "_cvaDisabled()" }, classAttribute: "neu-cp" }, providers: [
241
+ {
242
+ provide: NG_VALUE_ACCESSOR,
243
+ useExisting: forwardRef(() => NeuColorPickerComponent),
244
+ multi: true,
245
+ },
246
+ ], ngImport: i0, template: `
247
+ <!-- Swatch trigger -->
248
+ <button
249
+ type="button"
250
+ class="neu-cp__trigger"
251
+ [attr.aria-expanded]="_isOpen()"
252
+ [attr.aria-label]="'Color: ' + _hexValue()"
253
+ [disabled]="_cvaDisabled()"
254
+ (click)="_toggle()"
255
+ >
256
+ <span class="neu-cp__swatch" [style.background]="_hexValue()"></span>
257
+ <span class="neu-cp__hex-label">{{ _hexValue() }}</span>
258
+ </button>
259
+
260
+ @if (_isOpen()) {
261
+ <div class="neu-cp__panel" role="dialog" aria-label="Selector de color">
262
+ <!-- HSV Canvas -->
263
+ <div
264
+ class="neu-cp__canvas-wrap"
265
+ [style.background-color]="'hsl(' + _hue() + ', 100%, 50%)'"
266
+ (pointerdown)="_canvasDown($event)"
267
+ (pointermove)="_canvasDrag($event)"
268
+ (pointerup)="_canvasUp($event)"
269
+ >
270
+ <div
271
+ class="neu-cp__canvas-cursor"
272
+ [style.left]="_sv().s + '%'"
273
+ [style.top]="100 - _sv().v + '%'"
274
+ ></div>
275
+ </div>
276
+
277
+ <!-- Hue slider -->
278
+ <input
279
+ type="range"
280
+ class="neu-cp__hue-slider"
281
+ min="0"
282
+ max="360"
283
+ [value]="_hue()"
284
+ (input)="_onHueChange(+$any($event.target).value)"
285
+ [attr.aria-label]="'Tono ' + _hue() + '°'"
286
+ />
287
+
288
+ <!-- Swatches -->
289
+ <div class="neu-cp__swatches" role="group" aria-label="Colores predefinidos">
290
+ @for (sw of _swatches; track sw) {
291
+ <button
292
+ type="button"
293
+ class="neu-cp__sw"
294
+ [style.background]="sw"
295
+ [attr.aria-label]="'Color ' + sw"
296
+ (click)="_pickSwatch(sw)"
297
+ ></button>
298
+ }
299
+ </div>
300
+
301
+ <!-- Mode tabs -->
302
+ <div class="neu-cp__mode-tabs">
303
+ @for (m of _modes; track m) {
304
+ <button
305
+ type="button"
306
+ class="neu-cp__mode-btn"
307
+ [class.neu-cp__mode-btn--active]="_activeMode() === m"
308
+ (click)="_activeMode.set(m)"
309
+ >
310
+ {{ m.toUpperCase() }}
311
+ </button>
312
+ }
313
+ </div>
314
+
315
+ <!-- Value input -->
316
+ <div class="neu-cp__input-row">
317
+ <input
318
+ class="neu-cp__text-input"
319
+ type="text"
320
+ [value]="_textValue()"
321
+ (input)="_onTextChange($any($event.target).value)"
322
+ [attr.aria-label]="'Valor ' + _activeMode()"
323
+ />
324
+ <span class="neu-cp__swatch-sm" [style.background]="_hexValue()"></span>
325
+ </div>
326
+ </div>
327
+ }
328
+ `, isInline: true, styles: ["@charset \"UTF-8\";.neu-cp{position:relative;display:inline-block}.neu-cp--disabled{opacity:.55;pointer-events:none}.neu-cp__trigger{all:unset;display:inline-flex;align-items:center;gap:8px;padding:6px 12px 6px 8px;border:1px solid var(--neu-border-color, #d1d5db);border-radius:var(--neu-radius-md, 8px);background:var(--neu-surface-1, #ffffff);cursor:pointer;box-sizing:border-box;transition:border-color .12s}.neu-cp__trigger:hover:not([disabled]){border-color:var(--neu-color-primary, #0ea5e9)}.neu-cp__trigger[disabled]{background:var(--neu-surface-2, #f3f4f6)}.neu-cp__swatch{width:22px;height:22px;border-radius:var(--neu-radius-sm, 4px);border:1px solid rgba(0,0,0,.1);display:inline-block}.neu-cp__swatch-sm{width:28px;height:28px;border-radius:var(--neu-radius-md, 8px);border:1px solid rgba(0,0,0,.1);display:inline-block;flex-shrink:0}.neu-cp__hex-label{font-size:.8125rem;color:var(--neu-text-primary, #111);font-family:monospace}.neu-cp__panel{position:absolute;top:calc(100% + 6px);left:0;width:272px;background:var(--neu-surface-1, #ffffff);border:1px solid var(--neu-border-color, #e5e7eb);border-radius:var(--neu-radius-xl, 16px);box-shadow:0 10px 24px -4px #00000024;padding:16px;z-index:1001;display:flex;flex-direction:column;gap:12px;animation:neu-cp-in 80ms ease}@keyframes neu-cp-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-cp__canvas-wrap{position:relative;width:100%;height:150px;border-radius:var(--neu-radius-md, 8px);overflow:hidden;cursor:crosshair;-webkit-user-select:none;user-select:none;touch-action:none}.neu-cp__canvas-wrap:before{content:\"\";position:absolute;inset:0;background:linear-gradient(to right,#fff,transparent)}.neu-cp__canvas-wrap:after{content:\"\";position:absolute;inset:0;background:linear-gradient(to top,#000,transparent)}.neu-cp__canvas-cursor{position:absolute;width:14px;height:14px;border-radius:50%;border:2px solid #fff;box-shadow:0 1px 4px #00000073;transform:translate(-50%,-50%);pointer-events:none;z-index:1}.neu-cp__hue-slider{width:100%;height:10px;border-radius:999px;cursor:pointer;appearance:none;-webkit-appearance:none;background:linear-gradient(to right,red,#ff8000,#ff0,#80ff00,#0f0,#00ff80,#0ff,#0080ff,#00f,#7f00ff,#f0f,#ff0080,red)}.neu-cp__hue-slider::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid rgba(0,0,0,.25);box-shadow:0 1px 3px #0003;cursor:pointer}.neu-cp__hue-slider::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid rgba(0,0,0,.25);box-shadow:0 1px 3px #0003;cursor:pointer}.neu-cp__swatches{display:flex;gap:5px;flex-wrap:wrap}.neu-cp__sw{all:unset;box-sizing:border-box;width:20px;height:20px;border-radius:4px;cursor:pointer;border:1.5px solid rgba(0,0,0,.1);transition:transform 80ms}.neu-cp__sw:hover{transform:scale(1.2)}.neu-cp__sw:focus-visible{outline:2px solid var(--neu-color-primary, #0ea5e9);outline-offset:1px}.neu-cp__mode-tabs{display:flex;background:var(--neu-surface-2, #f3f4f6);border-radius:var(--neu-radius-md, 8px);padding:3px;gap:2px}.neu-cp__mode-btn{all:unset;flex:1;text-align:center;font-size:.6875rem;font-weight:600;padding:4px 0;border-radius:6px;cursor:pointer;transition:background 80ms,color 80ms}.neu-cp__mode-btn--active{background:var(--neu-surface-1, #ffffff);color:var(--neu-color-primary, #0ea5e9);box-shadow:0 1px 4px #00000014}.neu-cp__input-row{display:flex;gap:8px;align-items:center}.neu-cp__text-input{flex:1;padding:6px 10px;border:1px solid var(--neu-border-color, #d1d5db);border-radius:var(--neu-radius-md, 8px);font-size:.8125rem;font-family:monospace;background:var(--neu-surface-1, #fff);color:var(--neu-text-primary, #111);outline:none}.neu-cp__text-input:focus{border-color:var(--neu-color-primary, #0ea5e9)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
329
+ }
330
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuColorPickerComponent, decorators: [{
331
+ type: Component,
332
+ args: [{ selector: 'neu-color-picker', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
333
+ {
334
+ provide: NG_VALUE_ACCESSOR,
335
+ useExisting: forwardRef(() => NeuColorPickerComponent),
336
+ multi: true,
337
+ },
338
+ ], host: {
339
+ class: 'neu-cp',
340
+ '[class.neu-cp--open]': '_isOpen()',
341
+ '[class.neu-cp--disabled]': '_cvaDisabled()',
342
+ }, template: `
343
+ <!-- Swatch trigger -->
344
+ <button
345
+ type="button"
346
+ class="neu-cp__trigger"
347
+ [attr.aria-expanded]="_isOpen()"
348
+ [attr.aria-label]="'Color: ' + _hexValue()"
349
+ [disabled]="_cvaDisabled()"
350
+ (click)="_toggle()"
351
+ >
352
+ <span class="neu-cp__swatch" [style.background]="_hexValue()"></span>
353
+ <span class="neu-cp__hex-label">{{ _hexValue() }}</span>
354
+ </button>
355
+
356
+ @if (_isOpen()) {
357
+ <div class="neu-cp__panel" role="dialog" aria-label="Selector de color">
358
+ <!-- HSV Canvas -->
359
+ <div
360
+ class="neu-cp__canvas-wrap"
361
+ [style.background-color]="'hsl(' + _hue() + ', 100%, 50%)'"
362
+ (pointerdown)="_canvasDown($event)"
363
+ (pointermove)="_canvasDrag($event)"
364
+ (pointerup)="_canvasUp($event)"
365
+ >
366
+ <div
367
+ class="neu-cp__canvas-cursor"
368
+ [style.left]="_sv().s + '%'"
369
+ [style.top]="100 - _sv().v + '%'"
370
+ ></div>
371
+ </div>
372
+
373
+ <!-- Hue slider -->
374
+ <input
375
+ type="range"
376
+ class="neu-cp__hue-slider"
377
+ min="0"
378
+ max="360"
379
+ [value]="_hue()"
380
+ (input)="_onHueChange(+$any($event.target).value)"
381
+ [attr.aria-label]="'Tono ' + _hue() + '°'"
382
+ />
383
+
384
+ <!-- Swatches -->
385
+ <div class="neu-cp__swatches" role="group" aria-label="Colores predefinidos">
386
+ @for (sw of _swatches; track sw) {
387
+ <button
388
+ type="button"
389
+ class="neu-cp__sw"
390
+ [style.background]="sw"
391
+ [attr.aria-label]="'Color ' + sw"
392
+ (click)="_pickSwatch(sw)"
393
+ ></button>
394
+ }
395
+ </div>
396
+
397
+ <!-- Mode tabs -->
398
+ <div class="neu-cp__mode-tabs">
399
+ @for (m of _modes; track m) {
400
+ <button
401
+ type="button"
402
+ class="neu-cp__mode-btn"
403
+ [class.neu-cp__mode-btn--active]="_activeMode() === m"
404
+ (click)="_activeMode.set(m)"
405
+ >
406
+ {{ m.toUpperCase() }}
407
+ </button>
408
+ }
409
+ </div>
410
+
411
+ <!-- Value input -->
412
+ <div class="neu-cp__input-row">
413
+ <input
414
+ class="neu-cp__text-input"
415
+ type="text"
416
+ [value]="_textValue()"
417
+ (input)="_onTextChange($any($event.target).value)"
418
+ [attr.aria-label]="'Valor ' + _activeMode()"
419
+ />
420
+ <span class="neu-cp__swatch-sm" [style.background]="_hexValue()"></span>
421
+ </div>
422
+ </div>
423
+ }
424
+ `, styles: ["@charset \"UTF-8\";.neu-cp{position:relative;display:inline-block}.neu-cp--disabled{opacity:.55;pointer-events:none}.neu-cp__trigger{all:unset;display:inline-flex;align-items:center;gap:8px;padding:6px 12px 6px 8px;border:1px solid var(--neu-border-color, #d1d5db);border-radius:var(--neu-radius-md, 8px);background:var(--neu-surface-1, #ffffff);cursor:pointer;box-sizing:border-box;transition:border-color .12s}.neu-cp__trigger:hover:not([disabled]){border-color:var(--neu-color-primary, #0ea5e9)}.neu-cp__trigger[disabled]{background:var(--neu-surface-2, #f3f4f6)}.neu-cp__swatch{width:22px;height:22px;border-radius:var(--neu-radius-sm, 4px);border:1px solid rgba(0,0,0,.1);display:inline-block}.neu-cp__swatch-sm{width:28px;height:28px;border-radius:var(--neu-radius-md, 8px);border:1px solid rgba(0,0,0,.1);display:inline-block;flex-shrink:0}.neu-cp__hex-label{font-size:.8125rem;color:var(--neu-text-primary, #111);font-family:monospace}.neu-cp__panel{position:absolute;top:calc(100% + 6px);left:0;width:272px;background:var(--neu-surface-1, #ffffff);border:1px solid var(--neu-border-color, #e5e7eb);border-radius:var(--neu-radius-xl, 16px);box-shadow:0 10px 24px -4px #00000024;padding:16px;z-index:1001;display:flex;flex-direction:column;gap:12px;animation:neu-cp-in 80ms ease}@keyframes neu-cp-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-cp__canvas-wrap{position:relative;width:100%;height:150px;border-radius:var(--neu-radius-md, 8px);overflow:hidden;cursor:crosshair;-webkit-user-select:none;user-select:none;touch-action:none}.neu-cp__canvas-wrap:before{content:\"\";position:absolute;inset:0;background:linear-gradient(to right,#fff,transparent)}.neu-cp__canvas-wrap:after{content:\"\";position:absolute;inset:0;background:linear-gradient(to top,#000,transparent)}.neu-cp__canvas-cursor{position:absolute;width:14px;height:14px;border-radius:50%;border:2px solid #fff;box-shadow:0 1px 4px #00000073;transform:translate(-50%,-50%);pointer-events:none;z-index:1}.neu-cp__hue-slider{width:100%;height:10px;border-radius:999px;cursor:pointer;appearance:none;-webkit-appearance:none;background:linear-gradient(to right,red,#ff8000,#ff0,#80ff00,#0f0,#00ff80,#0ff,#0080ff,#00f,#7f00ff,#f0f,#ff0080,red)}.neu-cp__hue-slider::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid rgba(0,0,0,.25);box-shadow:0 1px 3px #0003;cursor:pointer}.neu-cp__hue-slider::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:#fff;border:2px solid rgba(0,0,0,.25);box-shadow:0 1px 3px #0003;cursor:pointer}.neu-cp__swatches{display:flex;gap:5px;flex-wrap:wrap}.neu-cp__sw{all:unset;box-sizing:border-box;width:20px;height:20px;border-radius:4px;cursor:pointer;border:1.5px solid rgba(0,0,0,.1);transition:transform 80ms}.neu-cp__sw:hover{transform:scale(1.2)}.neu-cp__sw:focus-visible{outline:2px solid var(--neu-color-primary, #0ea5e9);outline-offset:1px}.neu-cp__mode-tabs{display:flex;background:var(--neu-surface-2, #f3f4f6);border-radius:var(--neu-radius-md, 8px);padding:3px;gap:2px}.neu-cp__mode-btn{all:unset;flex:1;text-align:center;font-size:.6875rem;font-weight:600;padding:4px 0;border-radius:6px;cursor:pointer;transition:background 80ms,color 80ms}.neu-cp__mode-btn--active{background:var(--neu-surface-1, #ffffff);color:var(--neu-color-primary, #0ea5e9);box-shadow:0 1px 4px #00000014}.neu-cp__input-row{display:flex;gap:8px;align-items:center}.neu-cp__text-input{flex:1;padding:6px 10px;border:1px solid var(--neu-border-color, #d1d5db);border-radius:var(--neu-radius-md, 8px);font-size:.8125rem;font-family:monospace;background:var(--neu-surface-1, #fff);color:var(--neu-text-primary, #111);outline:none}.neu-cp__text-input:focus{border-color:var(--neu-color-primary, #0ea5e9)}\n"] }]
425
+ }], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], colorChange: [{ type: i0.Output, args: ["colorChange"] }], _outsideClick: [{
426
+ type: HostListener,
427
+ args: ['document:mousedown', ['$event']]
428
+ }] } });
429
+
430
+ /**
431
+ * Generated bundle index. Do not edit.
432
+ */
433
+
434
+ export { NeuColorPickerComponent };
435
+ //# sourceMappingURL=neural-ui-core-color-picker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-color-picker.mjs","sources":["../../../../projects/ui-core/color-picker/neu-color-picker.component.ts","../../../../projects/ui-core/color-picker/neural-ui-core-color-picker.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n ViewEncapsulation,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type NeuColorMode = 'hex' | 'rgb' | 'hsl';\n\n/** Parse hex → { r, g, b } */\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const clean = hex.replace('#', '').padEnd(6, '0');\n if (!/^[0-9a-fA-F]{6}$/.test(clean)) return null;\n return {\n r: parseInt(clean.slice(0, 2), 16),\n g: parseInt(clean.slice(2, 4), 16),\n b: parseInt(clean.slice(4, 6), 16),\n };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return (\n '#' +\n [r, g, b]\n .map((v) =>\n Math.round(Math.max(0, Math.min(255, v)))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')\n );\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n const _r = r / 255,\n _g = g / 255,\n _b = b / 255;\n const max = Math.max(_r, _g, _b),\n min = Math.min(_r, _g, _b);\n let h = 0,\n s = 0;\n const l = (max + min) / 2;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case _r:\n h = ((_g - _b) / d + (_g < _b ? 6 : 0)) / 6;\n break;\n case _g:\n h = ((_b - _r) / d + 2) / 6;\n break;\n case _b:\n h = ((_r - _g) / d + 4) / 6;\n break;\n }\n }\n return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\nfunction rgbToHsv(r: number, g: number, b: number): { h: number; s: number; v: number } {\n const _r = r / 255,\n _g = g / 255,\n _b = b / 255;\n const max = Math.max(_r, _g, _b),\n min = Math.min(_r, _g, _b);\n const v = max;\n const s = max === 0 ? 0 : (max - min) / max;\n let h = 0;\n if (max !== min) {\n const d = max - min;\n switch (max) {\n case _r:\n h = ((_g - _b) / d + (_g < _b ? 6 : 0)) / 6;\n break;\n case _g:\n h = ((_b - _r) / d + 2) / 6;\n break;\n case _b:\n h = ((_r - _g) / d + 4) / 6;\n break;\n }\n }\n return { h: Math.round(h * 360), s: Math.round(s * 100), v: Math.round(v * 100) };\n}\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const _s = s / 100,\n _v = v / 100;\n const f = (n: number) => {\n const k = (n + h / 60) % 6;\n const val = _v - _v * _s * Math.max(0, Math.min(k, 4 - k, 1));\n return Math.round(val * 255)\n .toString(16)\n .padStart(2, '0');\n };\n return `#${f(5)}${f(3)}${f(1)}`;\n}\n\nfunction hslToHex(h: number, s: number, l: number): string {\n const _s = s / 100,\n _l = l / 100;\n const a = _s * Math.min(_l, 1 - _l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = _l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0');\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\nlet _seq = 0;\n\n/**\n * NeuralUI ColorPicker\n *\n * Selector de color con swatch, hue slider y modos hex/rgb/hsl. CVA.\n *\n * Uso:\n * <neu-color-picker [formControl]=\"colorCtrl\" mode=\"hex\" />\n */\n@Component({\n selector: 'neu-color-picker',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuColorPickerComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-cp',\n '[class.neu-cp--open]': '_isOpen()',\n '[class.neu-cp--disabled]': '_cvaDisabled()',\n },\n template: `\n <!-- Swatch trigger -->\n <button\n type=\"button\"\n class=\"neu-cp__trigger\"\n [attr.aria-expanded]=\"_isOpen()\"\n [attr.aria-label]=\"'Color: ' + _hexValue()\"\n [disabled]=\"_cvaDisabled()\"\n (click)=\"_toggle()\"\n >\n <span class=\"neu-cp__swatch\" [style.background]=\"_hexValue()\"></span>\n <span class=\"neu-cp__hex-label\">{{ _hexValue() }}</span>\n </button>\n\n @if (_isOpen()) {\n <div class=\"neu-cp__panel\" role=\"dialog\" aria-label=\"Selector de color\">\n <!-- HSV Canvas -->\n <div\n class=\"neu-cp__canvas-wrap\"\n [style.background-color]=\"'hsl(' + _hue() + ', 100%, 50%)'\"\n (pointerdown)=\"_canvasDown($event)\"\n (pointermove)=\"_canvasDrag($event)\"\n (pointerup)=\"_canvasUp($event)\"\n >\n <div\n class=\"neu-cp__canvas-cursor\"\n [style.left]=\"_sv().s + '%'\"\n [style.top]=\"100 - _sv().v + '%'\"\n ></div>\n </div>\n\n <!-- Hue slider -->\n <input\n type=\"range\"\n class=\"neu-cp__hue-slider\"\n min=\"0\"\n max=\"360\"\n [value]=\"_hue()\"\n (input)=\"_onHueChange(+$any($event.target).value)\"\n [attr.aria-label]=\"'Tono ' + _hue() + '°'\"\n />\n\n <!-- Swatches -->\n <div class=\"neu-cp__swatches\" role=\"group\" aria-label=\"Colores predefinidos\">\n @for (sw of _swatches; track sw) {\n <button\n type=\"button\"\n class=\"neu-cp__sw\"\n [style.background]=\"sw\"\n [attr.aria-label]=\"'Color ' + sw\"\n (click)=\"_pickSwatch(sw)\"\n ></button>\n }\n </div>\n\n <!-- Mode tabs -->\n <div class=\"neu-cp__mode-tabs\">\n @for (m of _modes; track m) {\n <button\n type=\"button\"\n class=\"neu-cp__mode-btn\"\n [class.neu-cp__mode-btn--active]=\"_activeMode() === m\"\n (click)=\"_activeMode.set(m)\"\n >\n {{ m.toUpperCase() }}\n </button>\n }\n </div>\n\n <!-- Value input -->\n <div class=\"neu-cp__input-row\">\n <input\n class=\"neu-cp__text-input\"\n type=\"text\"\n [value]=\"_textValue()\"\n (input)=\"_onTextChange($any($event.target).value)\"\n [attr.aria-label]=\"'Valor ' + _activeMode()\"\n />\n <span class=\"neu-cp__swatch-sm\" [style.background]=\"_hexValue()\"></span>\n </div>\n </div>\n }\n `,\n styleUrl: './neu-color-picker.component.scss',\n})\nexport class NeuColorPickerComponent implements ControlValueAccessor {\n // ── Inputs / Outputs ────────────────────────────────────────────\n readonly mode = input<NeuColorMode>('hex');\n\n /** Emitido al cambiar el color / Emitted when color changes */\n readonly colorChange = output<string>();\n\n // ── Internal state ───────────────────────────────────────────────\n readonly _id = `neu-cp-${++_seq}`;\n readonly _modes: NeuColorMode[] = ['hex', 'rgb', 'hsl'];\n readonly _swatches: string[] = [\n '#ef4444',\n '#f97316',\n '#eab308',\n '#22c55e',\n '#10b981',\n '#06b6d4',\n '#3b82f6',\n '#6366f1',\n '#a855f7',\n '#ec4899',\n ];\n\n readonly _isOpen = signal(false);\n readonly _cvaDisabled = signal(false);\n readonly _hue = signal(210);\n readonly _sv = signal({ s: 80, v: 90 });\n readonly _activeMode = signal<NeuColorMode>('hex');\n\n private _dragging = false;\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n private readonly _el = inject(ElementRef<HTMLElement>);\n\n constructor() {\n // Sync mode input → internal active mode\n effect(() => {\n this._activeMode.set(this.mode());\n });\n }\n\n // ── Close on outside click ─────────────────────────────────────\n @HostListener('document:mousedown', ['$event'])\n _outsideClick(e: MouseEvent): void {\n if (!this._el.nativeElement.contains(e.target as Node)) {\n this._isOpen.set(false);\n }\n }\n\n // ── Computed ──────────────────────────────────────────────────\n readonly _hexValue = computed(() => hsvToHex(this._hue(), this._sv().s, this._sv().v));\n\n readonly _textValue = computed(() => {\n const hex = this._hexValue();\n const rgb = hexToRgb(hex);\n if (!rgb) return hex;\n switch (this._activeMode()) {\n case 'rgb':\n return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n case 'hsl': {\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n default:\n return hex;\n }\n });\n\n // ── Canvas interactions ───────────────────────────────────────\n _canvasDown(e: PointerEvent): void {\n this._dragging = true;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n this._updateFromCanvas(e);\n }\n\n _canvasDrag(e: PointerEvent): void {\n if (!this._dragging) return;\n this._updateFromCanvas(e);\n }\n\n _canvasUp(e: PointerEvent): void {\n this._dragging = false;\n (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n }\n\n private _updateFromCanvas(e: PointerEvent): void {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const s = Math.round(Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width)) * 100);\n const v = Math.round(Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height)) * 100);\n this._sv.set({ s, v });\n this._emit();\n }\n\n // ── Event handlers ────────────────────────────────────────────\n _toggle(): void {\n this._isOpen.update((v) => !v);\n }\n\n _onHueChange(v: number): void {\n this._hue.set(Number(v));\n this._emit();\n }\n\n _pickSwatch(hex: string): void {\n this._applyHex(hex);\n this._emit();\n }\n\n _onTextChange(text: string): void {\n const t = text.trim();\n if (t.startsWith('#')) {\n this._applyHex(t);\n } else if (t.startsWith('rgb')) {\n const m = t.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (m) this._applyHex(rgbToHex(+m[1], +m[2], +m[3]));\n } else if (t.startsWith('hsl')) {\n const m = t.match(/hsl\\((\\d+),\\s*(\\d+)%?,\\s*(\\d+)%?\\)/);\n if (m) this._applyHex(hslToHex(+m[1], +m[2], +m[3]));\n }\n this._emit();\n }\n\n // ── Helpers ───────────────────────────────────────────────────\n private _applyHex(hex: string): void {\n const rgb = hexToRgb(hex);\n if (!rgb) return;\n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);\n this._hue.set(hsv.h);\n this._sv.set({ s: hsv.s, v: hsv.v });\n }\n\n private _emit(): void {\n const val = this._textValue();\n this._onChange(val);\n this.colorChange.emit(val);\n }\n\n // ── CVA ──────────────────────────────────────────────────────\n writeValue(val: string | null): void {\n if (!val) return;\n this._onTextChange(val);\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(d: boolean): void {\n this._cvaDisabled.set(d);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}