@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
package/README.md CHANGED
@@ -4,12 +4,12 @@
4
4
  <a href="https://www.npmjs.com/package/@neural-ui/core"><img src="https://img.shields.io/npm/v/@neural-ui/core?color=0ea5e9&label=npm" alt="npm version" /></a>
5
5
  <a href="https://www.npmjs.com/package/@neural-ui/core"><img src="https://img.shields.io/npm/dm/@neural-ui/core?color=6366f1" alt="npm downloads" /></a>
6
6
  <img src="https://img.shields.io/badge/Angular-19--22-dd0031?logo=angular" alt="Angular 19-22" />
7
- <img src="https://img.shields.io/badge/tests-534%20passing-22c55e" alt="534 tests passing" />
8
- <img src="https://img.shields.io/badge/coverage-91%25-22c55e" alt="91% coverage" />
7
+ <img src="https://img.shields.io/badge/tests-1440%20passing-22c55e" alt="1440 tests passing" />
8
+ <img src="https://img.shields.io/badge/coverage-96.33%25-22c55e" alt="96.33% coverage" />
9
9
  <img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license" />
10
10
  </p>
11
11
 
12
- Modern Angular UI component library — **signals-first**, fully **standalone**, zero Zone.js dependency.
12
+ Modern Angular UI component library — **signals-first**, fully **standalone**, with dedicated subpath entry points and no Zone.js requirement.
13
13
  Built for Angular 19–22 with OnPush change detection and no Zone.js requirement.
14
14
 
15
15
  > Live documentation and examples → [neural-ui-three.vercel.app](https://neural-ui-three.vercel.app)
@@ -18,15 +18,28 @@ Built for Angular 19–22 with OnPush change detection and no Zone.js requiremen
18
18
 
19
19
  ## Features
20
20
 
21
- - **40+ components** — forms, navigation, layout, feedback, and data display
22
- - **Signals API** — all inputs/outputs use `input()`, `output()`, `model()` no `@Input()` decorators
21
+ - **50+ entry points** — components, overlays, data display primitives, utilities, and styles
22
+ - **Signals API** — inputs, outputs and internal state are built with `input()`, `output()`, `signal()`, `computed()` and `effect()`
23
23
  - **Standalone** — every component is standalone, import only what you need
24
24
  - **OnPush everywhere** — maximum performance out of the box
25
- - **Accessible** — ARIA attributes, keyboard navigation and focus management built in
25
+ - **Accessible by design** — ARIA attributes, keyboard navigation and focus management across the main interactive components
26
+ - **Well-tested** — 1440 passing tests with 96.33% statements coverage and 95.59% branch coverage
26
27
  - **Themeable** — full design token system via CSS custom properties
27
28
 
28
29
  ---
29
30
 
31
+ ## Quality Snapshot
32
+
33
+ - Signals-first architecture across `ui-core`
34
+ - Standalone + OnPush component model
35
+ - Zoneless-oriented test setup
36
+ - Global coverage above 90% in all main metrics
37
+ - Strong accessibility baseline validated in showcase and reinforced in core components
38
+
39
+ For the current quality checklist and accessibility audit snapshot, see [QUALITY_STATUS.md](./QUALITY_STATUS.md).
40
+
41
+ ---
42
+
30
43
  ## Installation
31
44
 
32
45
  ```bash
@@ -61,6 +74,15 @@ Import the global stylesheet in your `styles.scss`:
61
74
  @use '@neural-ui/core/styles' as *;
62
75
  ```
63
76
 
77
+ Component APIs are imported from dedicated subpaths. The package root is reserved for setup utilities such as `provideNeuralUI()`.
78
+
79
+ ```typescript
80
+ import { NeuButtonComponent } from '@neural-ui/core/button';
81
+ import { NeuInputComponent } from '@neural-ui/core/input';
82
+ import { NeuTableComponent } from '@neural-ui/core/table';
83
+ import { NeuToastService } from '@neural-ui/core/toast';
84
+ ```
85
+
64
86
  ---
65
87
 
66
88
  ## Usage
@@ -68,8 +90,9 @@ Import the global stylesheet in your `styles.scss`:
68
90
  Import any component directly into your standalone component:
69
91
 
70
92
  ```typescript
71
- import { NeuButtonComponent, NeuInputComponent } from '@neural-ui/core';
72
93
  import { FormControl, ReactiveFormsModule } from '@angular/forms';
94
+ import { NeuButtonComponent } from '@neural-ui/core/button';
95
+ import { NeuInputComponent } from '@neural-ui/core/input';
73
96
 
74
97
  @Component({
75
98
  imports: [NeuButtonComponent, NeuInputComponent, ReactiveFormsModule],
@@ -87,13 +110,15 @@ export class LoginComponent {
87
110
 
88
111
  ## Components
89
112
 
90
- | Category | Components |
91
- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
92
- | **Forms** | `NeuCheckbox` · `NeuDateInput` · `NeuInput` · `NeuMultiselect` · `NeuRadio` · `NeuRadioGroup` · `NeuSelect` · `NeuSlider` · `NeuSwitch` · `NeuTextarea` · `NeuToggleButtonGroup` |
93
- | **Navigation** | `NeuBreadcrumb` · `NeuNav` · `NeuPagination` · `NeuSidebar` · `NeuStepper` · `NeuTabs` |
94
- | **Layout** | `NeuAccordion` · `NeuCard` · `NeuDivider` · `NeuModal` · `NeuTable` |
95
- | **UI Elements** | `NeuAvatar` · `NeuBadge` · `NeuButton` · `NeuChart` · `NeuChip` · `NeuCodeBlock` · `NeuEmptyState` · `NeuIcon` · `NeuProgressBar` · `NeuRating` · `NeuSkeleton` · `NeuSpinner` · `NeuSplitButton` · `NeuStatsCard` · `NeuTimeline` |
96
- | **Feedback** | `NeuToast` · `NeuToastService` · `NeuTooltip` |
113
+ Representative entry points in 1.3.0:
114
+
115
+ - **Forms**: `@neural-ui/core/input`, `@neural-ui/core/select`, `@neural-ui/core/multiselect`, `@neural-ui/core/date-input`, `@neural-ui/core/number-input`, `@neural-ui/core/input-otp`
116
+ - **Navigation and layout**: `@neural-ui/core/tabs`, `@neural-ui/core/nav`, `@neural-ui/core/sidebar`, `@neural-ui/core/accordion`, `@neural-ui/core/toolbar`, `@neural-ui/core/dashboard-grid`
117
+ - **Data and overlays**: `@neural-ui/core/table`, `@neural-ui/core/popover`, `@neural-ui/core/context-menu`, `@neural-ui/core/command-palette`, `@neural-ui/core/virtual-list`, `@neural-ui/core/confirm-dialog`
118
+ - **Feedback and utilities**: `@neural-ui/core/alert`, `@neural-ui/core/toast`, `@neural-ui/core/tooltip`, `@neural-ui/core/block-ui`, `@neural-ui/core/url-state`
119
+ - **Visualization and display**: `@neural-ui/core/chart`, `@neural-ui/core/stats-card`, `@neural-ui/core/timeline`, `@neural-ui/core/meter-group`, `@neural-ui/core/knob`
120
+
121
+ For the complete catalog, examples, and API tables, use the live docs at [neural-ui-three.vercel.app](https://neural-ui-three.vercel.app).
97
122
 
98
123
  ---
99
124
 
@@ -103,40 +128,26 @@ All visual properties are controlled via CSS custom properties. Override them in
103
128
 
104
129
  ```scss
105
130
  :root {
106
- // Brand colors
107
- --neu-color-primary: #6366f1;
108
- --neu-color-primary-hover: #4f46e5;
109
-
110
- // Neutral scale
111
- --neu-color-surface: #ffffff;
112
- --neu-color-surface-alt: #f8fafc;
113
- --neu-color-border: #e2e8f0;
114
- --neu-color-text: #0f172a;
115
- --neu-color-text-muted: #64748b;
116
-
117
- // Feedback
118
- --neu-color-error: #ef4444;
119
- --neu-color-success: #22c55e;
120
- --neu-color-warning: #f59e0b;
121
-
122
- // Shape & spacing
123
- --neu-radius-sm: 0.25rem;
124
- --neu-radius-md: 0.5rem;
125
- --neu-radius-lg: 0.75rem;
126
- --neu-radius-xl: 1rem;
127
- --neu-spacing-xs: 0.25rem;
128
- --neu-spacing-sm: 0.5rem;
129
- --neu-spacing-md: 1rem;
130
- --neu-spacing-lg: 1.5rem;
131
-
132
- // Typography
133
- --neu-font-family: 'Inter', system-ui, sans-serif;
134
- --neu-font-size-sm: 0.875rem;
135
- --neu-font-size-base: 1rem;
136
- --neu-font-size-lg: 1.125rem;
131
+ --neu-primary: #2563eb;
132
+ --neu-primary-dark: #1d4ed8;
133
+ --neu-primary-50: #eff6ff;
134
+ --neu-surface: #ffffff;
135
+ --neu-surface-2: #f8fafc;
136
+ --neu-border: rgba(15, 23, 42, 0.08);
137
+ --neu-text: #0f172a;
138
+ --neu-text-muted: #64748b;
139
+ --neu-success: #10b981;
140
+ --neu-warning: #f59e0b;
141
+ --neu-error: #ef4444;
142
+ --neu-radius: 10px;
143
+ --neu-space-4: 1rem;
144
+ --neu-shadow: 0 4px 12px rgba(15, 23, 42, 0.08);
145
+ --neu-focus-ring: 0 0 0 3px rgba(37, 99, 235, 0.18);
137
146
  }
138
147
  ```
139
148
 
149
+ For the full token list, see `styles/_tokens.scss` in the published package source.
150
+
140
151
  ---
141
152
 
142
153
  ## Peer dependencies
@@ -158,46 +169,3 @@ All visual properties are controlled via CSS custom properties. Override them in
158
169
  ## License
159
170
 
160
171
  MIT © [Pedro Moreno Trujillo](https://github.com/PedroMorenoTrujillo)
161
-
162
- ```scss
163
- @use '@neural-ui/core/styles' as *;
164
- ```
165
-
166
- ## Usage
167
-
168
- Import components directly into your standalone component or NgModule:
169
-
170
- ```typescript
171
- import { NeuButtonComponent } from '@neural-ui/core';
172
-
173
- @Component({
174
- imports: [NeuButtonComponent],
175
- template: `<neu-button variant="primary">Click me</neu-button>`,
176
- })
177
- export class AppComponent {}
178
- ```
179
-
180
- ## Components
181
-
182
- | Category | Components |
183
- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
184
- | **Forms** | `NeuCheckbox`, `NeuDateInput`, `NeuInput`, `NeuMultiselect`, `NeuRadio`, `NeuRadioGroup`, `NeuSelect`, `NeuSlider`, `NeuSwitch`, `NeuTextarea`, `NeuToggleButtonGroup` |
185
- | **Navigation** | `NeuBreadcrumb`, `NeuNav`, `NeuPagination`, `NeuSidebar`, `NeuStepper`, `NeuTabs` |
186
- | **Layout** | `NeuAccordion`, `NeuCard`, `NeuDivider`, `NeuDialog` / `NeuDialogService`, `NeuTable` |
187
- | **UI Elements** | `NeuAvatar`, `NeuBadge`, `NeuButton`, `NeuChart`, `NeuChip`, `NeuCodeBlock`, `NeuEmptyState`, `NeuIcon`, `NeuProgressBar`, `NeuRating`, `NeuSkeleton`, `NeuSpinner`, `NeuSplitButton`, `NeuStatsCard`, `NeuTimeline` |
188
- | **Feedback** | `NeuToast` / `NeuToastService`, `NeuTooltip` |
189
-
190
- ## Peer Dependencies
191
-
192
- | Package | Version |
193
- | ------------------ | ------------------ |
194
- | `@angular/core` | `>=19.0.0 <23.0.0` |
195
- | `@angular/cdk` | `>=19.0.0 <23.0.0` |
196
- | `@ng-icons/core` | `>=33.0.0` |
197
- | `@ng-icons/lucide` | `>=33.0.0` |
198
- | `apexcharts` | `>=5.0.0` |
199
- | `ng-apexcharts` | `>=2.0.0` |
200
-
201
- ## License
202
-
203
- MIT
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-accordion.mjs",
3
+ "typings": "../types/neural-ui-core-accordion.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-alert.mjs",
3
+ "typings": "../types/neural-ui-core-alert.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-autocomplete.mjs",
3
+ "typings": "../types/neural-ui-core-autocomplete.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-avatar.mjs",
3
+ "typings": "../types/neural-ui-core-avatar.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-badge.mjs",
3
+ "typings": "../types/neural-ui-core-badge.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-block-ui.mjs",
3
+ "typings": "../types/neural-ui-core-block-ui.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-breadcrumb.mjs",
3
+ "typings": "../types/neural-ui-core-breadcrumb.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-button.mjs",
3
+ "typings": "../types/neural-ui-core-button.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-card.mjs",
3
+ "typings": "../types/neural-ui-core-card.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-chart.mjs",
3
+ "typings": "../types/neural-ui-core-chart.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-checkbox.mjs",
3
+ "typings": "../types/neural-ui-core-checkbox.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-chip.mjs",
3
+ "typings": "../types/neural-ui-core-chip.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-code-block.mjs",
3
+ "typings": "../types/neural-ui-core-code-block.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-color-picker.mjs",
3
+ "typings": "../types/neural-ui-core-color-picker.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-command-palette.mjs",
3
+ "typings": "../types/neural-ui-core-command-palette.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-confirm-dialog.mjs",
3
+ "typings": "../types/neural-ui-core-confirm-dialog.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-context-menu.mjs",
3
+ "typings": "../types/neural-ui-core-context-menu.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-dashboard-grid.mjs",
3
+ "typings": "../types/neural-ui-core-dashboard-grid.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-date-input.mjs",
3
+ "typings": "../types/neural-ui-core-date-input.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-divider.mjs",
3
+ "typings": "../types/neural-ui-core-divider.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-empty-state.mjs",
3
+ "typings": "../types/neural-ui-core-empty-state.d.ts"
4
+ }
@@ -0,0 +1,162 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, input, output, signal, effect, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { DomSanitizer } from '@angular/platform-browser';
4
+
5
+ /**
6
+ * NeuralUI Accordion Component
7
+ *
8
+ * Paneles expandibles / colapsables con animación suave.
9
+ * Soporta modo múltiple (varios abiertos a la vez) o exclusivo. / Supports multiple (several open at once) or exclusive mode.
10
+ *
11
+ * Uso:
12
+ * <neu-accordion [items]="items" />
13
+ * <neu-accordion [items]="items" [multiple]="true" />
14
+ */
15
+ class NeuAccordionComponent {
16
+ _sanitizer = inject(DomSanitizer);
17
+ /** Lista de paneles / Panel list */
18
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
19
+ /** Permite varios paneles abiertos a la vez / Allows multiple panels open at once */
20
+ multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
21
+ /** Borde exterior alrededor del accordion / Outer border around the accordion */
22
+ bordered = input(true, ...(ngDevMode ? [{ debugName: "bordered" }] : /* istanbul ignore next */ []));
23
+ /** Emite el id del panel al abrirse/cerrarse / Emits the panel id on open/close */
24
+ panelToggle = output();
25
+ /**
26
+ * Set de IDs actualmente expandidos.
27
+ * Se inicializa desde los ítems con `expanded: true` en el primer render.
28
+ * Después se vuelve un signal mutable independiente (no se resetea al cambiar items).
29
+ */
30
+ _expandedInit = false;
31
+ _expanded = signal(new Set(), ...(ngDevMode ? [{ debugName: "_expanded" }] : /* istanbul ignore next */ []));
32
+ constructor() {
33
+ // Inicialización única desde items.expanded (equivalente a linkedSignal source+computation)
34
+ effect(() => {
35
+ const items = this.items();
36
+ if (!this._expandedInit) {
37
+ this._expanded.set(new Set(items.filter((i) => i.expanded).map((i) => i.id)));
38
+ this._expandedInit = true;
39
+ }
40
+ }, { allowSignalWrites: true });
41
+ }
42
+ isExpanded = (id) => this._expanded().has(id);
43
+ sanitize(html) {
44
+ return this._sanitizer.sanitize(1 /* HTML */, html) ?? '';
45
+ }
46
+ toggle(id) {
47
+ const current = new Set(this._expanded());
48
+ const willExpand = !current.has(id);
49
+ if (!this.multiple()) {
50
+ current.clear();
51
+ }
52
+ if (willExpand) {
53
+ current.add(id);
54
+ }
55
+ else {
56
+ current.delete(id);
57
+ }
58
+ this._expanded.set(current);
59
+ this.panelToggle.emit({ id, expanded: willExpand });
60
+ }
61
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
62
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuAccordionComponent, isStandalone: true, selector: "neu-accordion", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { panelToggle: "panelToggle" }, ngImport: i0, template: `
63
+ <div class="neu-accordion" [class.neu-accordion--bordered]="bordered()">
64
+ @for (item of items(); track item.id) {
65
+ <div
66
+ class="neu-accordion__item"
67
+ [class.neu-accordion__item--expanded]="isExpanded(item.id)"
68
+ [class.neu-accordion__item--disabled]="item.disabled"
69
+ >
70
+ <button
71
+ class="neu-accordion__header"
72
+ type="button"
73
+ [id]="'neu-acc-btn-' + item.id"
74
+ [attr.aria-expanded]="isExpanded(item.id)"
75
+ [attr.aria-controls]="'neu-acc-panel-' + item.id"
76
+ [disabled]="item.disabled"
77
+ (click)="toggle(item.id)"
78
+ >
79
+ <span class="neu-accordion__title">{{ item.title }}</span>
80
+ <span class="neu-accordion__chevron" aria-hidden="true">
81
+ <svg
82
+ width="16"
83
+ height="16"
84
+ viewBox="0 0 24 24"
85
+ fill="none"
86
+ stroke="currentColor"
87
+ stroke-width="2.5"
88
+ stroke-linecap="round"
89
+ stroke-linejoin="round"
90
+ >
91
+ <polyline points="6 9 12 15 18 9" />
92
+ </svg>
93
+ </span>
94
+ </button>
95
+ <div
96
+ class="neu-accordion__panel"
97
+ [id]="'neu-acc-panel-' + item.id"
98
+ role="region"
99
+ [attr.aria-labelledby]="'neu-acc-btn-' + item.id"
100
+ >
101
+ <div class="neu-accordion__body" [innerHTML]="sanitize(item.content)"></div>
102
+ </div>
103
+ </div>
104
+ }
105
+ </div>
106
+ `, isInline: true, styles: [".neu-accordion{width:100%;font-family:var(--neu-font-sans)}.neu-accordion--bordered{border:1.5px solid var(--neu-border);border-radius:var(--neu-radius-lg);overflow:hidden}.neu-accordion__item{border-bottom:1.5px solid var(--neu-border)}.neu-accordion__item:last-child{border-bottom:none}.neu-accordion__item--disabled{opacity:.45;pointer-events:none}.neu-accordion__header{width:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--neu-space-4);padding:var(--neu-space-4) var(--neu-space-5);background:var(--neu-surface);border:none;cursor:pointer;font-family:var(--neu-font-sans);text-align:left;transition:background var(--neu-transition);outline:none}.neu-accordion__header:hover{background:var(--neu-surface-2)}.neu-accordion__header:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-accordion__title{font-size:var(--neu-text-base);font-weight:600;color:var(--neu-text)}.neu-accordion__chevron{display:inline-flex;flex-shrink:0;color:var(--neu-text-muted);transition:transform .25s cubic-bezier(.4,0,.2,1)}.neu-accordion__item--expanded .neu-accordion__chevron{transform:rotate(180deg)}.neu-accordion__panel{display:grid;grid-template-rows:0fr;transition:grid-template-rows .28s cubic-bezier(.4,0,.2,1)}.neu-accordion__item--expanded .neu-accordion__panel{grid-template-rows:1fr}.neu-accordion__body{overflow:hidden;font-size:var(--neu-text-sm);color:var(--neu-text-muted);line-height:1.7;padding:0;transition:padding .28s cubic-bezier(.4,0,.2,1)}.neu-accordion__item--expanded .neu-accordion__body{padding:var(--neu-space-4) var(--neu-space-5);padding-top:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
107
+ }
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuAccordionComponent, decorators: [{
109
+ type: Component,
110
+ args: [{ selector: 'neu-accordion', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
111
+ <div class="neu-accordion" [class.neu-accordion--bordered]="bordered()">
112
+ @for (item of items(); track item.id) {
113
+ <div
114
+ class="neu-accordion__item"
115
+ [class.neu-accordion__item--expanded]="isExpanded(item.id)"
116
+ [class.neu-accordion__item--disabled]="item.disabled"
117
+ >
118
+ <button
119
+ class="neu-accordion__header"
120
+ type="button"
121
+ [id]="'neu-acc-btn-' + item.id"
122
+ [attr.aria-expanded]="isExpanded(item.id)"
123
+ [attr.aria-controls]="'neu-acc-panel-' + item.id"
124
+ [disabled]="item.disabled"
125
+ (click)="toggle(item.id)"
126
+ >
127
+ <span class="neu-accordion__title">{{ item.title }}</span>
128
+ <span class="neu-accordion__chevron" aria-hidden="true">
129
+ <svg
130
+ width="16"
131
+ height="16"
132
+ viewBox="0 0 24 24"
133
+ fill="none"
134
+ stroke="currentColor"
135
+ stroke-width="2.5"
136
+ stroke-linecap="round"
137
+ stroke-linejoin="round"
138
+ >
139
+ <polyline points="6 9 12 15 18 9" />
140
+ </svg>
141
+ </span>
142
+ </button>
143
+ <div
144
+ class="neu-accordion__panel"
145
+ [id]="'neu-acc-panel-' + item.id"
146
+ role="region"
147
+ [attr.aria-labelledby]="'neu-acc-btn-' + item.id"
148
+ >
149
+ <div class="neu-accordion__body" [innerHTML]="sanitize(item.content)"></div>
150
+ </div>
151
+ </div>
152
+ }
153
+ </div>
154
+ `, styles: [".neu-accordion{width:100%;font-family:var(--neu-font-sans)}.neu-accordion--bordered{border:1.5px solid var(--neu-border);border-radius:var(--neu-radius-lg);overflow:hidden}.neu-accordion__item{border-bottom:1.5px solid var(--neu-border)}.neu-accordion__item:last-child{border-bottom:none}.neu-accordion__item--disabled{opacity:.45;pointer-events:none}.neu-accordion__header{width:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--neu-space-4);padding:var(--neu-space-4) var(--neu-space-5);background:var(--neu-surface);border:none;cursor:pointer;font-family:var(--neu-font-sans);text-align:left;transition:background var(--neu-transition);outline:none}.neu-accordion__header:hover{background:var(--neu-surface-2)}.neu-accordion__header:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-accordion__title{font-size:var(--neu-text-base);font-weight:600;color:var(--neu-text)}.neu-accordion__chevron{display:inline-flex;flex-shrink:0;color:var(--neu-text-muted);transition:transform .25s cubic-bezier(.4,0,.2,1)}.neu-accordion__item--expanded .neu-accordion__chevron{transform:rotate(180deg)}.neu-accordion__panel{display:grid;grid-template-rows:0fr;transition:grid-template-rows .28s cubic-bezier(.4,0,.2,1)}.neu-accordion__item--expanded .neu-accordion__panel{grid-template-rows:1fr}.neu-accordion__body{overflow:hidden;font-size:var(--neu-text-sm);color:var(--neu-text-muted);line-height:1.7;padding:0;transition:padding .28s cubic-bezier(.4,0,.2,1)}.neu-accordion__item--expanded .neu-accordion__body{padding:var(--neu-space-4) var(--neu-space-5);padding-top:0}\n"] }]
155
+ }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], bordered: [{ type: i0.Input, args: [{ isSignal: true, alias: "bordered", required: false }] }], panelToggle: [{ type: i0.Output, args: ["panelToggle"] }] } });
156
+
157
+ /**
158
+ * Generated bundle index. Do not edit.
159
+ */
160
+
161
+ export { NeuAccordionComponent };
162
+ //# sourceMappingURL=neural-ui-core-accordion.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural-ui-core-accordion.mjs","sources":["../../../../projects/ui-core/accordion/neu-accordion.component.ts","../../../../projects/ui-core/accordion/neural-ui-core-accordion.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nexport interface NeuAccordionItem {\n /** ID único del panel / Unique panel ID */\n id: string;\n /** Título del encabezado / Header title */\n title: string;\n /** Contenido del cuerpo (HTML o texto plano) / Body content (HTML or plain text) */\n content: string;\n /** Inicia expandido / Starts expanded */\n expanded?: boolean;\n /** Deshabilita este panel / Disables this panel */\n disabled?: boolean;\n}\n\n/**\n * NeuralUI Accordion Component\n *\n * Paneles expandibles / colapsables con animación suave.\n * Soporta modo múltiple (varios abiertos a la vez) o exclusivo. / Supports multiple (several open at once) or exclusive mode.\n *\n * Uso:\n * <neu-accordion [items]=\"items\" />\n * <neu-accordion [items]=\"items\" [multiple]=\"true\" />\n */\n@Component({\n selector: 'neu-accordion',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-accordion\" [class.neu-accordion--bordered]=\"bordered()\">\n @for (item of items(); track item.id) {\n <div\n class=\"neu-accordion__item\"\n [class.neu-accordion__item--expanded]=\"isExpanded(item.id)\"\n [class.neu-accordion__item--disabled]=\"item.disabled\"\n >\n <button\n class=\"neu-accordion__header\"\n type=\"button\"\n [id]=\"'neu-acc-btn-' + item.id\"\n [attr.aria-expanded]=\"isExpanded(item.id)\"\n [attr.aria-controls]=\"'neu-acc-panel-' + item.id\"\n [disabled]=\"item.disabled\"\n (click)=\"toggle(item.id)\"\n >\n <span class=\"neu-accordion__title\">{{ item.title }}</span>\n <span class=\"neu-accordion__chevron\" aria-hidden=\"true\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </span>\n </button>\n <div\n class=\"neu-accordion__panel\"\n [id]=\"'neu-acc-panel-' + item.id\"\n role=\"region\"\n [attr.aria-labelledby]=\"'neu-acc-btn-' + item.id\"\n >\n <div class=\"neu-accordion__body\" [innerHTML]=\"sanitize(item.content)\"></div>\n </div>\n </div>\n }\n </div>\n `,\n styleUrl: './neu-accordion.component.scss',\n})\nexport class NeuAccordionComponent {\n private readonly _sanitizer = inject(DomSanitizer);\n\n /** Lista de paneles / Panel list */\n items = input<NeuAccordionItem[]>([]);\n\n /** Permite varios paneles abiertos a la vez / Allows multiple panels open at once */\n multiple = input<boolean>(false);\n\n /** Borde exterior alrededor del accordion / Outer border around the accordion */\n bordered = input<boolean>(true);\n\n /** Emite el id del panel al abrirse/cerrarse / Emits the panel id on open/close */\n panelToggle = output<{ id: string; expanded: boolean }>();\n\n /**\n * Set de IDs actualmente expandidos.\n * Se inicializa desde los ítems con `expanded: true` en el primer render.\n * Después se vuelve un signal mutable independiente (no se resetea al cambiar items).\n */\n private _expandedInit = false;\n private readonly _expanded = signal<Set<string>>(new Set());\n\n constructor() {\n // Inicialización única desde items.expanded (equivalente a linkedSignal source+computation)\n effect(\n () => {\n const items = this.items();\n if (!this._expandedInit) {\n this._expanded.set(new Set(items.filter((i) => i.expanded).map((i) => i.id)));\n this._expandedInit = true;\n }\n },\n { allowSignalWrites: true },\n );\n }\n\n readonly isExpanded = (id: string) => this._expanded().has(id);\n\n sanitize(html: string): SafeHtml {\n return this._sanitizer.sanitize(1 /* HTML */, html) ?? '';\n }\n\n toggle(id: string): void {\n const current = new Set(this._expanded());\n const willExpand = !current.has(id);\n\n if (!this.multiple()) {\n current.clear();\n }\n\n if (willExpand) {\n current.add(id);\n } else {\n current.delete(id);\n }\n\n this._expanded.set(current);\n this.panelToggle.emit({ id, expanded: willExpand });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}