@neural-ui/core 1.7.6 → 1.8.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 (77) hide show
  1. package/fesm2022/neural-ui-core-accordion.mjs +22 -8
  2. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  3. package/fesm2022/neural-ui-core-alert.mjs +1 -1
  4. package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
  5. package/fesm2022/neural-ui-core-autocomplete.mjs +50 -9
  6. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  7. package/fesm2022/neural-ui-core-button.mjs +1 -1
  8. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  9. package/fesm2022/neural-ui-core-calendar.mjs +26 -18
  10. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
  11. package/fesm2022/neural-ui-core-command-palette.mjs +22 -8
  12. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
  13. package/fesm2022/neural-ui-core-context-menu.mjs +24 -8
  14. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
  15. package/fesm2022/neural-ui-core-empty-state.mjs +1 -1
  16. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
  17. package/fesm2022/neural-ui-core-icon.mjs +9 -2
  18. package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
  19. package/fesm2022/neural-ui-core-inline-editor.mjs +1 -1
  20. package/fesm2022/neural-ui-core-inline-editor.mjs.map +1 -1
  21. package/fesm2022/neural-ui-core-input.mjs +1 -1
  22. package/fesm2022/neural-ui-core-input.mjs.map +1 -1
  23. package/fesm2022/neural-ui-core-listbox.mjs +50 -5
  24. package/fesm2022/neural-ui-core-listbox.mjs.map +1 -1
  25. package/fesm2022/neural-ui-core-menu.mjs +38 -16
  26. package/fesm2022/neural-ui-core-menu.mjs.map +1 -1
  27. package/fesm2022/neural-ui-core-modal.mjs +1 -1
  28. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  29. package/fesm2022/neural-ui-core-multiselect.mjs +67 -7
  30. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  31. package/fesm2022/neural-ui-core-nav.mjs +1 -1
  32. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  33. package/fesm2022/neural-ui-core-pick-list.mjs +43 -16
  34. package/fesm2022/neural-ui-core-pick-list.mjs.map +1 -1
  35. package/fesm2022/neural-ui-core-select.mjs +64 -5
  36. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  37. package/fesm2022/neural-ui-core-sidebar.mjs +1 -1
  38. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  39. package/fesm2022/neural-ui-core-split-button.mjs +22 -8
  40. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-stats-card.mjs +1 -1
  42. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
  43. package/fesm2022/neural-ui-core-table.mjs +1 -1
  44. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  45. package/fesm2022/neural-ui-core-tabs.mjs +22 -9
  46. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  47. package/fesm2022/neural-ui-core-tags.mjs +40 -13
  48. package/fesm2022/neural-ui-core-tags.mjs.map +1 -1
  49. package/fesm2022/neural-ui-core-timeline.mjs +39 -10
  50. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
  51. package/fesm2022/neural-ui-core-toast.mjs +1 -1
  52. package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
  53. package/fesm2022/neural-ui-core-toggle-button-group.mjs +22 -8
  54. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  55. package/fesm2022/neural-ui-core-tree-select.mjs +86 -12
  56. package/fesm2022/neural-ui-core-tree-select.mjs.map +1 -1
  57. package/fesm2022/neural-ui-core-tree.mjs +21 -6
  58. package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
  59. package/package.json +1 -1
  60. package/types/neural-ui-core-accordion.d.ts +16 -2
  61. package/types/neural-ui-core-autocomplete.d.ts +23 -2
  62. package/types/neural-ui-core-calendar.d.ts +18 -3
  63. package/types/neural-ui-core-command-palette.d.ts +24 -10
  64. package/types/neural-ui-core-context-menu.d.ts +17 -3
  65. package/types/neural-ui-core-icon.d.ts +5 -1
  66. package/types/neural-ui-core-listbox.d.ts +23 -2
  67. package/types/neural-ui-core-menu.d.ts +23 -3
  68. package/types/neural-ui-core-multiselect.d.ts +33 -2
  69. package/types/neural-ui-core-pick-list.d.ts +32 -3
  70. package/types/neural-ui-core-select.d.ts +30 -2
  71. package/types/neural-ui-core-split-button.d.ts +15 -3
  72. package/types/neural-ui-core-tabs.d.ts +16 -3
  73. package/types/neural-ui-core-tags.d.ts +35 -4
  74. package/types/neural-ui-core-timeline.d.ts +27 -2
  75. package/types/neural-ui-core-toggle-button-group.d.ts +16 -2
  76. package/types/neural-ui-core-tree-select.d.ts +51 -3
  77. package/types/neural-ui-core-tree.d.ts +18 -3
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-toast.mjs","sources":["../../../../projects/ui-core/toast/neu-toast.service.ts","../../../../projects/ui-core/toast/neu-toast.component.ts","../../../../projects/ui-core/toast/neural-ui-core-toast.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport { NeuToastItem, NeuToastOptions, NeuToastPosition } from './neu-toast.types';\n\n/**\n * NeuralUI Toast Service\n *\n * Lanza notificaciones flotantes desde cualquier punto de la app.\n * Requiere que `<neu-toast-container>` esté presente en la raíz del app.\n *\n * Uso:\n * const toast = inject(NeuToastService);\n * toast.success('Guardado correctamente');\n * toast.error('Ha ocurrido un error', { title: 'Error', duration: 8000 });\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuToastService {\n /** Lista reactiva de toasts activos / Reactive list of active toasts */\n readonly toasts = signal<NeuToastItem[]>([]);\n\n /** Posición del contenedor de toasts / Toast container position */\n readonly position = signal<NeuToastPosition>('top-right');\n\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n setPosition(position: NeuToastPosition): void {\n this.position.set(position);\n }\n\n show(options: NeuToastOptions): string {\n const id = `neu-toast-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n const duration = options.duration ?? 4000;\n\n const item: NeuToastItem = {\n id,\n message: options.message,\n title: options.title ?? '',\n type: options.type ?? 'info',\n duration,\n };\n\n this.toasts.update((list) => [...list, item]);\n\n if (duration > 0) {\n const timer = setTimeout(() => this.dismiss(id), duration);\n this.timers.set(id, timer);\n }\n\n return id;\n }\n\n success(message: string, opts?: Partial<NeuToastOptions>): string {\n return this.show({ ...opts, message, type: 'success' });\n }\n\n error(message: string, opts?: Partial<NeuToastOptions>): string {\n return this.show({ ...opts, message, type: 'error' });\n }\n\n info(message: string, opts?: Partial<NeuToastOptions>): string {\n return this.show({ ...opts, message, type: 'info' });\n }\n\n warning(message: string, opts?: Partial<NeuToastOptions>): string {\n return this.show({ ...opts, message, type: 'warning' });\n }\n\n dismiss(id: string): void {\n this.clearTimer(id);\n this.toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n clear(): void {\n for (const timer of this.timers.values()) {\n clearTimeout(timer);\n }\n this.timers.clear();\n this.toasts.set([]);\n }\n\n private clearTimer(id: string): void {\n const timer = this.timers.get(id);\n if (!timer) return;\n clearTimeout(timer);\n this.timers.delete(id);\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject } from '@angular/core';\nimport { NeuToastService } from './neu-toast.service';\nimport { NeuToastType } from './neu-toast.types';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\n/** Mapa de iconos Lucide por tipo de toast / Map of Lucide icons by toast type */\nconst TOAST_ICONS: Record<NeuToastType, string> = {\n success: 'lucideCheckCircle',\n error: 'lucideXCircle',\n warning: 'lucideAlertTriangle',\n info: 'lucideInfo',\n};\n\n/**\n * NeuralUI Toast Container Component\n *\n * Renderiza los toasts activos del NeuToastService.\n * Añade este componente una sola vez en la raíz del app (app.html).\n *\n * Diseño mobile-first:\n * - < 400px: banner inferior centrado\n * - ≥ 400px: stack en la esquina superior derecha\n *\n * Uso:\n * <!-- en app.html -->\n * <neu-toast-container />\n */\n@Component({\n selector: 'neu-toast-container',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NeuIconComponent],\n host: {\n class: 'neu-toast-container',\n 'aria-live': 'polite',\n 'aria-atomic': 'false',\n '[class.neu-toast-container--top-right]': 'toastService.position() === \"top-right\"',\n '[class.neu-toast-container--top-left]': 'toastService.position() === \"top-left\"',\n '[class.neu-toast-container--bottom-right]': 'toastService.position() === \"bottom-right\"',\n '[class.neu-toast-container--bottom-left]': 'toastService.position() === \"bottom-left\"',\n },\n template: `\n @for (toast of toastService.toasts(); track toast.id) {\n <div\n class=\"neu-toast\"\n [class]=\"'neu-toast neu-toast--' + toast.type\"\n [attr.role]=\"toast.type === 'error' || toast.type === 'warning' ? 'alert' : 'status'\"\n [attr.aria-live]=\"\n toast.type === 'error' || toast.type === 'warning' ? 'assertive' : 'polite'\n \"\n >\n <span class=\"neu-toast__icon-wrap\" aria-hidden=\"true\">\n <neu-icon [name]=\"getIcon(toast.type)\" size=\"1rem\" />\n </span>\n <div class=\"neu-toast__body\">\n @if (toast.title) {\n <p class=\"neu-toast__title\">{{ toast.title }}</p>\n }\n <p class=\"neu-toast__message\">{{ toast.message }}</p>\n </div>\n <button\n class=\"neu-toast__close\"\n type=\"button\"\n [attr.aria-label]=\"'Cerrar'\"\n (click)=\"toastService.dismiss(toast.id)\"\n >\n <neu-icon name=\"lucideX\" size=\"1rem\" />\n </button>\n </div>\n }\n `,\n styleUrl: './neu-toast.component.scss',\n})\nexport class NeuToastContainerComponent {\n readonly toastService = inject(NeuToastService);\n\n getIcon(type: NeuToastType): string {\n return TOAST_ICONS[type];\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-toast.mjs","sources":["../../../../projects/ui-core/toast/neu-toast.service.ts","../../../../projects/ui-core/toast/neu-toast.component.ts","../../../../projects/ui-core/toast/neural-ui-core-toast.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport { NeuToastItem, NeuToastOptions, NeuToastPosition } from './neu-toast.types';\n\n/**\n * NeuralUI Toast Service\n *\n * Lanza notificaciones flotantes desde cualquier punto de la app.\n * Requiere que `<neu-toast-container>` esté presente en la raíz del app.\n *\n * Uso:\n * const toast = inject(NeuToastService);\n * toast.success('Guardado correctamente');\n * toast.error('Ha ocurrido un error', { title: 'Error', duration: 8000 });\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuToastService {\n /** Lista reactiva de toasts activos / Reactive list of active toasts */\n readonly toasts = signal<NeuToastItem[]>([]);\n\n /** Posición del contenedor de toasts / Toast container position */\n readonly position = signal<NeuToastPosition>('top-right');\n\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n setPosition(position: NeuToastPosition): void {\n this.position.set(position);\n }\n\n show(options: NeuToastOptions): string {\n const id = `neu-toast-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n const duration = options.duration ?? 4000;\n\n const item: NeuToastItem = {\n id,\n message: options.message,\n title: options.title ?? '',\n type: options.type ?? 'info',\n duration,\n };\n\n this.toasts.update((list) => [...list, item]);\n\n if (duration > 0) {\n const timer = setTimeout(() => this.dismiss(id), duration);\n this.timers.set(id, timer);\n }\n\n return id;\n }\n\n success(message: string, opts?: Partial<NeuToastOptions>): string {\n return this.show({ ...opts, message, type: 'success' });\n }\n\n error(message: string, opts?: Partial<NeuToastOptions>): string {\n return this.show({ ...opts, message, type: 'error' });\n }\n\n info(message: string, opts?: Partial<NeuToastOptions>): string {\n return this.show({ ...opts, message, type: 'info' });\n }\n\n warning(message: string, opts?: Partial<NeuToastOptions>): string {\n return this.show({ ...opts, message, type: 'warning' });\n }\n\n dismiss(id: string): void {\n this.clearTimer(id);\n this.toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n clear(): void {\n for (const timer of this.timers.values()) {\n clearTimeout(timer);\n }\n this.timers.clear();\n this.toasts.set([]);\n }\n\n private clearTimer(id: string): void {\n const timer = this.timers.get(id);\n if (!timer) return;\n clearTimeout(timer);\n this.timers.delete(id);\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject } from '@angular/core';\nimport { NeuToastService } from './neu-toast.service';\nimport { NeuToastType } from './neu-toast.types';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\n/** Mapa de iconos Lucide por tipo de toast / Map of Lucide icons by toast type */\nconst TOAST_ICONS: Record<NeuToastType, string> = {\n success: 'lucideCheckCircle',\n error: 'lucideXCircle',\n warning: 'lucideAlertTriangle',\n info: 'lucideInfo',\n};\n\n/**\n * NeuralUI Toast Container Component\n *\n * Renderiza los toasts activos del NeuToastService.\n * Añade este componente una sola vez en la raíz del app (app.html).\n *\n * Diseño mobile-first:\n * - < 400px: banner inferior centrado\n * - ≥ 400px: stack en la esquina superior derecha\n *\n * Uso:\n * <!-- en app.html -->\n * <neu-toast-container />\n */\n@Component({\n selector: 'neu-toast-container',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NeuIconComponent],\n host: {\n class: 'neu-toast-container',\n 'aria-live': 'polite',\n 'aria-atomic': 'false',\n '[class.neu-toast-container--top-right]': 'toastService.position() === \"top-right\"',\n '[class.neu-toast-container--top-left]': 'toastService.position() === \"top-left\"',\n '[class.neu-toast-container--bottom-right]': 'toastService.position() === \"bottom-right\"',\n '[class.neu-toast-container--bottom-left]': 'toastService.position() === \"bottom-left\"',\n },\n template: `\n @for (toast of toastService.toasts(); track toast.id) {\n <div\n class=\"neu-toast\"\n [class]=\"'neu-toast neu-toast--' + toast.type\"\n [attr.role]=\"toast.type === 'error' || toast.type === 'warning' ? 'alert' : 'status'\"\n [attr.aria-live]=\"\n toast.type === 'error' || toast.type === 'warning' ? 'assertive' : 'polite'\n \"\n >\n <span class=\"neu-toast__icon-wrap\" aria-hidden=\"true\">\n <neu-icon [name]=\"getIcon(toast.type)\" size=\"1rem\" />\n </span>\n <div class=\"neu-toast__body\">\n @if (toast.title) {\n <p class=\"neu-toast__title\">{{ toast.title }}</p>\n }\n <p class=\"neu-toast__message\">{{ toast.message }}</p>\n </div>\n <button\n class=\"neu-toast__close\"\n type=\"button\"\n [attr.aria-label]=\"'Cerrar'\"\n (click)=\"toastService.dismiss(toast.id)\"\n >\n <neu-icon name=\"lucideX\" size=\"1rem\" />\n </button>\n </div>\n }\n `,\n styleUrl: './neu-toast.component.scss',\n})\nexport class NeuToastContainerComponent {\n readonly toastService = inject(NeuToastService);\n\n getIcon(type: NeuToastType): string {\n return TOAST_ICONS[type];\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,21 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, output, signal, computed, forwardRef, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
2
+ import { Directive, contentChild, input, output, signal, computed, forwardRef, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { NgTemplateOutlet } from '@angular/common';
3
4
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
5
  import { NeuIconComponent } from '@neural-ui/core/icon';
5
6
 
7
+ class NeuToggleButtonItemDirective {
8
+ templateRef;
9
+ constructor(templateRef) {
10
+ this.templateRef = templateRef;
11
+ }
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuToggleButtonItemDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
13
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuToggleButtonItemDirective, isStandalone: true, selector: "ng-template[neuToggleButtonItem]", ngImport: i0 });
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuToggleButtonItemDirective, decorators: [{
16
+ type: Directive,
17
+ args: [{ selector: 'ng-template[neuToggleButtonItem]' }]
18
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
6
19
  /**
7
20
  * NeuralUI ToggleButtonGroup Component
8
21
  *
@@ -16,6 +29,7 @@ import { NeuIconComponent } from '@neural-ui/core/icon';
16
29
  * <neu-toggle-button-group [options]="opts" [multiple]="true" [formControl]="valuesCtrl" />
17
30
  */
18
31
  class NeuToggleButtonGroupComponent {
32
+ itemTpl = contentChild((NeuToggleButtonItemDirective), ...(ngDevMode ? [{ debugName: "itemTpl" }] : /* istanbul ignore next */ []));
19
33
  /** Lista de opciones del grupo / Group option list */
20
34
  options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
21
35
  /**
@@ -91,7 +105,7 @@ class NeuToggleButtonGroupComponent {
91
105
  useExisting: forwardRef(() => NeuToggleButtonGroupComponent),
92
106
  multi: true,
93
107
  },
94
- ], ngImport: i0, template: `
108
+ ], queries: [{ propertyName: "itemTpl", first: true, predicate: (NeuToggleButtonItemDirective), descendants: true, isSignal: true }], ngImport: i0, template: `
95
109
  <div
96
110
  class="neu-toggle-group"
97
111
  [class]="groupClasses()"
@@ -109,18 +123,18 @@ class NeuToggleButtonGroupComponent {
109
123
  (click)="toggle(opt)"
110
124
  (blur)="onBlur()"
111
125
  >
112
- @if (opt.icon) {
126
+ @if (itemTpl()) { <ng-container [ngTemplateOutlet]="itemTpl()!.templateRef" [ngTemplateOutletContext]="{ $implicit: opt, selected: isSelected(opt.value) }" /> } @else if (opt.icon) {
113
127
  <neu-icon [name]="opt.icon" size="16px" strokeWidth="2" />
114
128
  }
115
129
  {{ opt.label }}
116
130
  </button>
117
131
  }
118
132
  </div>
119
- `, isInline: true, styles: [".neu-toggle-group-host{display:inline-block}.neu-toggle-group{display:inline-flex;border:1px solid var(--neu-border);border-radius:var(--neu-radius);overflow:hidden;background:var(--neu-surface)}.neu-toggle-group__btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--neu-space-2);border:none;border-right:1px solid var(--neu-border);background:transparent;color:var(--neu-text-muted);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;padding:.5rem var(--neu-space-4);transition:background-color .15s ease,color .15s ease,border-color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.neu-toggle-group__btn:last-child{border-right:none}.neu-toggle-group__btn:hover:not(:disabled):not(.neu-toggle-group__btn--disabled){background:var(--neu-surface-2);color:var(--neu-text)}.neu-toggle-group__btn:focus-visible{position:relative;z-index:1;box-shadow:inset 0 0 0 2px var(--neu-primary)}.neu-toggle-group__btn--active{background:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));color:var(--neu-primary-solid-fg, var(--neu-primary-fg));border-right-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-toggle-group__btn--active:hover:not(:disabled):not(.neu-toggle-group__btn--disabled){background:var(--neu-primary-solid-hover, var(--neu-primary-dark));color:var(--neu-primary-solid-fg, var(--neu-primary-fg))}.neu-toggle-group__btn--active+.neu-toggle-group__btn{border-left-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-toggle-group__btn--disabled{opacity:.45;cursor:not-allowed}.neu-toggle-group--disabled{opacity:.6;pointer-events:none}.neu-toggle-group--sm .neu-toggle-group__btn{font-size:var(--neu-text-xs);padding:.375rem var(--neu-space-3)}.neu-toggle-group--md .neu-toggle-group__btn{font-size:var(--neu-text-sm);padding:.5rem var(--neu-space-4)}.neu-toggle-group--lg .neu-toggle-group__btn{font-size:var(--neu-text-base);padding:.625rem var(--neu-space-5)}html[data-theme=dark] .neu-toggle-group__btn{color:#f2f7fb}html[data-theme=dark] .neu-toggle-group__btn--active{background:#0b66d4;color:#fff;border-right-color:#0b66d4}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
133
+ `, isInline: true, styles: [".neu-toggle-group-host{display:inline-block}.neu-toggle-group{display:inline-flex;border:1px solid var(--neu-border);border-radius:var(--neu-radius);overflow:hidden;background:var(--neu-surface)}.neu-toggle-group__btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--neu-space-2);border:none;border-right:1px solid var(--neu-border);background:transparent;color:var(--neu-text-muted);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;padding:.5rem var(--neu-space-4);transition:background-color .15s ease,color .15s ease,border-color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.neu-toggle-group__btn:last-child{border-right:none}.neu-toggle-group__btn:hover:not(:disabled):not(.neu-toggle-group__btn--disabled){background:var(--neu-surface-2);color:var(--neu-text)}.neu-toggle-group__btn:focus-visible{position:relative;z-index:1;box-shadow:inset 0 0 0 2px var(--neu-primary)}.neu-toggle-group__btn--active{background:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));color:var(--neu-primary-solid-fg, var(--neu-primary-fg));border-right-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-toggle-group__btn--active:hover:not(:disabled):not(.neu-toggle-group__btn--disabled){background:var(--neu-primary-solid-hover, var(--neu-primary-dark));color:var(--neu-primary-solid-fg, var(--neu-primary-fg))}.neu-toggle-group__btn--active+.neu-toggle-group__btn{border-left-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-toggle-group__btn--disabled{opacity:.45;cursor:not-allowed}.neu-toggle-group--disabled{opacity:.6;pointer-events:none}.neu-toggle-group--sm .neu-toggle-group__btn{font-size:var(--neu-text-xs);padding:.375rem var(--neu-space-3)}.neu-toggle-group--md .neu-toggle-group__btn{font-size:var(--neu-text-sm);padding:.5rem var(--neu-space-4)}.neu-toggle-group--lg .neu-toggle-group__btn{font-size:var(--neu-text-base);padding:.625rem var(--neu-space-5)}html[data-theme=dark] .neu-toggle-group__btn{color:#f2f7fb}html[data-theme=dark] .neu-toggle-group__btn--active{background:#0b66d4;color:#fff;border-right-color:#0b66d4}\n"], dependencies: [{ kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "decorative", "ariaLabel", "strokeWidth", "size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
120
134
  }
121
135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuToggleButtonGroupComponent, decorators: [{
122
136
  type: Component,
123
- args: [{ selector: 'neu-toggle-button-group', imports: [NeuIconComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
137
+ args: [{ selector: 'neu-toggle-button-group', imports: [NeuIconComponent, NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
124
138
  {
125
139
  provide: NG_VALUE_ACCESSOR,
126
140
  useExisting: forwardRef(() => NeuToggleButtonGroupComponent),
@@ -144,7 +158,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
144
158
  (click)="toggle(opt)"
145
159
  (blur)="onBlur()"
146
160
  >
147
- @if (opt.icon) {
161
+ @if (itemTpl()) { <ng-container [ngTemplateOutlet]="itemTpl()!.templateRef" [ngTemplateOutletContext]="{ $implicit: opt, selected: isSelected(opt.value) }" /> } @else if (opt.icon) {
148
162
  <neu-icon [name]="opt.icon" size="16px" strokeWidth="2" />
149
163
  }
150
164
  {{ opt.label }}
@@ -152,11 +166,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
152
166
  }
153
167
  </div>
154
168
  `, styles: [".neu-toggle-group-host{display:inline-block}.neu-toggle-group{display:inline-flex;border:1px solid var(--neu-border);border-radius:var(--neu-radius);overflow:hidden;background:var(--neu-surface)}.neu-toggle-group__btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--neu-space-2);border:none;border-right:1px solid var(--neu-border);background:transparent;color:var(--neu-text-muted);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;padding:.5rem var(--neu-space-4);transition:background-color .15s ease,color .15s ease,border-color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.neu-toggle-group__btn:last-child{border-right:none}.neu-toggle-group__btn:hover:not(:disabled):not(.neu-toggle-group__btn--disabled){background:var(--neu-surface-2);color:var(--neu-text)}.neu-toggle-group__btn:focus-visible{position:relative;z-index:1;box-shadow:inset 0 0 0 2px var(--neu-primary)}.neu-toggle-group__btn--active{background:var(--neu-primary-solid, var(--neu-primary-dark, var(--neu-primary)));color:var(--neu-primary-solid-fg, var(--neu-primary-fg));border-right-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-toggle-group__btn--active:hover:not(:disabled):not(.neu-toggle-group__btn--disabled){background:var(--neu-primary-solid-hover, var(--neu-primary-dark));color:var(--neu-primary-solid-fg, var(--neu-primary-fg))}.neu-toggle-group__btn--active+.neu-toggle-group__btn{border-left-color:var(--neu-primary-solid-hover, var(--neu-primary-dark))}.neu-toggle-group__btn--disabled{opacity:.45;cursor:not-allowed}.neu-toggle-group--disabled{opacity:.6;pointer-events:none}.neu-toggle-group--sm .neu-toggle-group__btn{font-size:var(--neu-text-xs);padding:.375rem var(--neu-space-3)}.neu-toggle-group--md .neu-toggle-group__btn{font-size:var(--neu-text-sm);padding:.5rem var(--neu-space-4)}.neu-toggle-group--lg .neu-toggle-group__btn{font-size:var(--neu-text-base);padding:.625rem var(--neu-space-5)}html[data-theme=dark] .neu-toggle-group__btn{color:#f2f7fb}html[data-theme=dark] .neu-toggle-group__btn--active{background:#0b66d4;color:#fff;border-right-color:#0b66d4}\n"] }]
155
- }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], neuChange: [{ type: i0.Output, args: ["neuChange"] }] } });
169
+ }], propDecorators: { itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuToggleButtonItemDirective), { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], neuChange: [{ type: i0.Output, args: ["neuChange"] }] } });
156
170
 
157
171
  /**
158
172
  * Generated bundle index. Do not edit.
159
173
  */
160
174
 
161
- export { NeuToggleButtonGroupComponent };
175
+ export { NeuToggleButtonGroupComponent, NeuToggleButtonItemDirective };
162
176
  //# sourceMappingURL=neural-ui-core-toggle-button-group.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-toggle-button-group.mjs","sources":["../../../../projects/ui-core/toggle-button-group/neu-toggle-button-group.component.ts","../../../../projects/ui-core/toggle-button-group/neural-ui-core-toggle-button-group.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuButtonSize } from '@neural-ui/core/button';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\nexport interface NeuToggleOption<T = unknown> {\n /** Texto visible del botón / Visible button text */\n label: string;\n /** Valor asociado a esta opción / Value associated with this option */\n value: T;\n /** Nombre de icono Lucide (opcional) / Lucide icon name (optional) */\n icon?: string;\n /** Deshabilita solo esta opción / Disables this option only */\n disabled?: boolean;\n}\n\n/**\n * NeuralUI ToggleButtonGroup Component\n *\n * Grupo de botones de selección (single o múltiple). / Selection button group (single or multiple).\n * Selector segmentado para selección única o múltiple. / Segmented selector for single or multiple selection.\n *\n * Uso (single):\n * <neu-toggle-button-group [options]=\"opts\" [formControl]=\"valueCtrl\" />\n *\n * Uso (múltiple):\n * <neu-toggle-button-group [options]=\"opts\" [multiple]=\"true\" [formControl]=\"valuesCtrl\" />\n */\n@Component({\n selector: 'neu-toggle-button-group',\n imports: [NeuIconComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuToggleButtonGroupComponent),\n multi: true,\n },\n ],\n host: { class: 'neu-toggle-group-host' },\n template: `\n <div\n class=\"neu-toggle-group\"\n [class]=\"groupClasses()\"\n role=\"group\"\n [attr.aria-disabled]=\"_isDisabled() || null\"\n >\n @for (opt of options(); track opt.value) {\n <button\n type=\"button\"\n class=\"neu-toggle-group__btn\"\n [class.neu-toggle-group__btn--active]=\"isSelected(opt.value)\"\n [class.neu-toggle-group__btn--disabled]=\"opt.disabled || _isDisabled()\"\n [attr.aria-pressed]=\"isSelected(opt.value)\"\n [disabled]=\"opt.disabled || _isDisabled() ? '' : null\"\n (click)=\"toggle(opt)\"\n (blur)=\"onBlur()\"\n >\n @if (opt.icon) {\n <neu-icon [name]=\"opt.icon\" size=\"16px\" strokeWidth=\"2\" />\n }\n {{ opt.label }}\n </button>\n }\n </div>\n `,\n styleUrl: './neu-toggle-button-group.component.scss',\n})\nexport class NeuToggleButtonGroupComponent<T = unknown> implements ControlValueAccessor {\n /** Lista de opciones del grupo / Group option list */\n options = input<NeuToggleOption<T>[]>([]);\n\n /**\n * Permite seleccionar múltiples opciones.\n * - false (por defecto): valor es `T | null`\n * - true: valor es `T[]`\n */\n multiple = input<boolean>(false);\n\n /** Tamaño visual / Visual size */\n size = input<NeuButtonSize>('md');\n\n /** Deshabilita todo el grupo / Disables the entire group */\n disabled = input<boolean>(false);\n\n /** Emite el nuevo valor al cambiar (útil sin formControl) / Emits the new value on change (useful without formControl) */\n neuChange = output<T | T[] | null>();\n\n readonly _value = signal<T | T[] | null>(null);\n readonly _isDisabled = signal(false);\n\n readonly groupClasses = computed(() => ({\n 'neu-toggle-group': true,\n [`neu-toggle-group--${this.size()}`]: true,\n 'neu-toggle-group--disabled': this._isDisabled(),\n }));\n\n isSelected(value: T): boolean {\n const v = this._value();\n if (this.multiple()) {\n return Array.isArray(v) && (v as T[]).includes(value);\n }\n return v === value;\n }\n\n toggle(opt: NeuToggleOption<T>): void {\n if (opt.disabled || this._isDisabled()) return;\n\n let next: T | T[] | null;\n\n if (this.multiple()) {\n const current: T[] = Array.isArray(this._value()) ? (this._value() as T[]) : [];\n const idx = current.indexOf(opt.value);\n next = idx >= 0 ? current.filter((_, i) => i !== idx) : [...current, opt.value];\n } else {\n next = this._value() === opt.value ? null : opt.value;\n }\n\n this._value.set(next);\n this._onChange(next);\n this._onTouched();\n this.neuChange.emit(next);\n }\n\n onBlur(): void {\n this._onTouched();\n }\n\n // ---- CVA ----\n\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: T | T[] | null): void {\n if (val === null || val === undefined) {\n this._value.set(this.multiple() ? ([] as T[]) : null);\n } else {\n this._value.set(val);\n }\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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-toggle-button-group.mjs","sources":["../../../../projects/ui-core/toggle-button-group/neu-toggle-button-group.component.ts","../../../../projects/ui-core/toggle-button-group/neural-ui-core-toggle-button-group.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n ViewEncapsulation,\n computed,\n contentChild,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuButtonSize } from '@neural-ui/core/button';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\n\nexport interface NeuToggleOption<T = unknown> {\n /** Texto visible del botón / Visible button text */\n label: string;\n /** Valor asociado a esta opción / Value associated with this option */\n value: T;\n /** Nombre de icono Lucide (opcional) / Lucide icon name (optional) */\n icon?: string;\n /** Deshabilita solo esta opción / Disables this option only */\n disabled?: boolean;\n}\n@Directive({ selector: 'ng-template[neuToggleButtonItem]' })\nexport class NeuToggleButtonItemDirective<T = unknown> { constructor(readonly templateRef: TemplateRef<{ $implicit: NeuToggleOption<T>; selected: boolean }>) {} }\n\n/**\n * NeuralUI ToggleButtonGroup Component\n *\n * Grupo de botones de selección (single o múltiple). / Selection button group (single or multiple).\n * Selector segmentado para selección única o múltiple. / Segmented selector for single or multiple selection.\n *\n * Uso (single):\n * <neu-toggle-button-group [options]=\"opts\" [formControl]=\"valueCtrl\" />\n *\n * Uso (múltiple):\n * <neu-toggle-button-group [options]=\"opts\" [multiple]=\"true\" [formControl]=\"valuesCtrl\" />\n */\n@Component({\n selector: 'neu-toggle-button-group',\n imports: [NeuIconComponent, NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuToggleButtonGroupComponent),\n multi: true,\n },\n ],\n host: { class: 'neu-toggle-group-host' },\n template: `\n <div\n class=\"neu-toggle-group\"\n [class]=\"groupClasses()\"\n role=\"group\"\n [attr.aria-disabled]=\"_isDisabled() || null\"\n >\n @for (opt of options(); track opt.value) {\n <button\n type=\"button\"\n class=\"neu-toggle-group__btn\"\n [class.neu-toggle-group__btn--active]=\"isSelected(opt.value)\"\n [class.neu-toggle-group__btn--disabled]=\"opt.disabled || _isDisabled()\"\n [attr.aria-pressed]=\"isSelected(opt.value)\"\n [disabled]=\"opt.disabled || _isDisabled() ? '' : null\"\n (click)=\"toggle(opt)\"\n (blur)=\"onBlur()\"\n >\n @if (itemTpl()) { <ng-container [ngTemplateOutlet]=\"itemTpl()!.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: opt, selected: isSelected(opt.value) }\" /> } @else if (opt.icon) {\n <neu-icon [name]=\"opt.icon\" size=\"16px\" strokeWidth=\"2\" />\n }\n {{ opt.label }}\n </button>\n }\n </div>\n `,\n styleUrl: './neu-toggle-button-group.component.scss',\n})\nexport class NeuToggleButtonGroupComponent<T = unknown> implements ControlValueAccessor {\n readonly itemTpl = contentChild(NeuToggleButtonItemDirective<T>);\n /** Lista de opciones del grupo / Group option list */\n options = input<NeuToggleOption<T>[]>([]);\n\n /**\n * Permite seleccionar múltiples opciones.\n * - false (por defecto): valor es `T | null`\n * - true: valor es `T[]`\n */\n multiple = input<boolean>(false);\n\n /** Tamaño visual / Visual size */\n size = input<NeuButtonSize>('md');\n\n /** Deshabilita todo el grupo / Disables the entire group */\n disabled = input<boolean>(false);\n\n /** Emite el nuevo valor al cambiar (útil sin formControl) / Emits the new value on change (useful without formControl) */\n neuChange = output<T | T[] | null>();\n\n readonly _value = signal<T | T[] | null>(null);\n readonly _isDisabled = signal(false);\n\n readonly groupClasses = computed(() => ({\n 'neu-toggle-group': true,\n [`neu-toggle-group--${this.size()}`]: true,\n 'neu-toggle-group--disabled': this._isDisabled(),\n }));\n\n isSelected(value: T): boolean {\n const v = this._value();\n if (this.multiple()) {\n return Array.isArray(v) && (v as T[]).includes(value);\n }\n return v === value;\n }\n\n toggle(opt: NeuToggleOption<T>): void {\n if (opt.disabled || this._isDisabled()) return;\n\n let next: T | T[] | null;\n\n if (this.multiple()) {\n const current: T[] = Array.isArray(this._value()) ? (this._value() as T[]) : [];\n const idx = current.indexOf(opt.value);\n next = idx >= 0 ? current.filter((_, i) => i !== idx) : [...current, opt.value];\n } else {\n next = this._value() === opt.value ? null : opt.value;\n }\n\n this._value.set(next);\n this._onChange(next);\n this._onTouched();\n this.neuChange.emit(next);\n }\n\n onBlur(): void {\n this._onTouched();\n }\n\n // ---- CVA ----\n\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: T | T[] | null): void {\n if (val === null || val === undefined) {\n this._value.set(this.multiple() ? ([] as T[]) : null);\n } else {\n this._value.set(val);\n }\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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -1,10 +1,76 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, output, signal, computed, forwardRef, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
2
+ import { Directive, contentChild, input, output, signal, computed, forwardRef, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { NgTemplateOutlet } from '@angular/common';
3
4
  import * as i1 from '@angular/cdk/overlay';
4
5
  import { OverlayModule } from '@angular/cdk/overlay';
5
6
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
7
 
8
+ class NeuTreeSelectNodeDirective {
9
+ templateRef;
10
+ constructor(templateRef) {
11
+ this.templateRef = templateRef;
12
+ }
13
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectNodeDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
14
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuTreeSelectNodeDirective, isStandalone: true, selector: "ng-template[neuTreeSelectNode]", ngImport: i0 });
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectNodeDirective, decorators: [{
17
+ type: Directive,
18
+ args: [{ selector: 'ng-template[neuTreeSelectNode]' }]
19
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
20
+ class NeuTreeSelectSelectedDirective {
21
+ templateRef;
22
+ constructor(templateRef) {
23
+ this.templateRef = templateRef;
24
+ }
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectSelectedDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
26
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuTreeSelectSelectedDirective, isStandalone: true, selector: "ng-template[neuTreeSelectSelected]", ngImport: i0 });
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectSelectedDirective, decorators: [{
29
+ type: Directive,
30
+ args: [{ selector: 'ng-template[neuTreeSelectSelected]' }]
31
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
32
+ class NeuTreeSelectHeaderDirective {
33
+ templateRef;
34
+ constructor(templateRef) {
35
+ this.templateRef = templateRef;
36
+ }
37
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectHeaderDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
38
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuTreeSelectHeaderDirective, isStandalone: true, selector: "ng-template[neuTreeSelectHeader]", ngImport: i0 });
39
+ }
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectHeaderDirective, decorators: [{
41
+ type: Directive,
42
+ args: [{ selector: 'ng-template[neuTreeSelectHeader]' }]
43
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
44
+ class NeuTreeSelectFooterDirective {
45
+ templateRef;
46
+ constructor(templateRef) {
47
+ this.templateRef = templateRef;
48
+ }
49
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectFooterDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
50
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuTreeSelectFooterDirective, isStandalone: true, selector: "ng-template[neuTreeSelectFooter]", ngImport: i0 });
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectFooterDirective, decorators: [{
53
+ type: Directive,
54
+ args: [{ selector: 'ng-template[neuTreeSelectFooter]' }]
55
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
56
+ class NeuTreeSelectEmptyDirective {
57
+ templateRef;
58
+ constructor(templateRef) {
59
+ this.templateRef = templateRef;
60
+ }
61
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectEmptyDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
62
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuTreeSelectEmptyDirective, isStandalone: true, selector: "ng-template[neuTreeSelectEmpty]", ngImport: i0 });
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectEmptyDirective, decorators: [{
65
+ type: Directive,
66
+ args: [{ selector: 'ng-template[neuTreeSelectEmpty]' }]
67
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
7
68
  class NeuTreeSelectComponent {
69
+ nodeTpl = contentChild(NeuTreeSelectNodeDirective, ...(ngDevMode ? [{ debugName: "nodeTpl" }] : /* istanbul ignore next */ []));
70
+ selectedTpl = contentChild(NeuTreeSelectSelectedDirective, ...(ngDevMode ? [{ debugName: "selectedTpl" }] : /* istanbul ignore next */ []));
71
+ headerTpl = contentChild(NeuTreeSelectHeaderDirective, ...(ngDevMode ? [{ debugName: "headerTpl" }] : /* istanbul ignore next */ []));
72
+ footerTpl = contentChild(NeuTreeSelectFooterDirective, ...(ngDevMode ? [{ debugName: "footerTpl" }] : /* istanbul ignore next */ []));
73
+ emptyTpl = contentChild(NeuTreeSelectEmptyDirective, ...(ngDevMode ? [{ debugName: "emptyTpl" }] : /* istanbul ignore next */ []));
8
74
  nodes = input([], ...(ngDevMode ? [{ debugName: "nodes" }] : /* istanbul ignore next */ []));
9
75
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
10
76
  placeholder = input('Select...', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
@@ -30,6 +96,7 @@ class NeuTreeSelectComponent {
30
96
  }
31
97
  return this.multiple() ? `${selected.length} selected` : selected[0]?.node.label ?? '';
32
98
  }, ...(ngDevMode ? [{ debugName: "selectedLabel" }] : /* istanbul ignore next */ []));
99
+ selectedNode = computed(() => this.flatten(this.nodes()).find((item) => this.values().includes(item.node.value))?.node ?? null, ...(ngDevMode ? [{ debugName: "selectedNode" }] : /* istanbul ignore next */ []));
33
100
  visibleNodes = computed(() => {
34
101
  const q = this.query().trim().toLowerCase();
35
102
  const all = this.flattenVisible(this.nodes(), 0);
@@ -92,6 +159,9 @@ class NeuTreeSelectComponent {
92
159
  }
93
160
  this.expanded.set(next);
94
161
  }
162
+ toggleExpandedFromTemplate(node) {
163
+ this.toggleExpanded(node, new Event('toggle'));
164
+ }
95
165
  commit(values) {
96
166
  this.values.set(values);
97
167
  this.onTouched();
@@ -114,7 +184,7 @@ class NeuTreeSelectComponent {
114
184
  useExisting: forwardRef(() => NeuTreeSelectComponent),
115
185
  multi: true,
116
186
  },
117
- ], ngImport: i0, template: `
187
+ ], queries: [{ propertyName: "nodeTpl", first: true, predicate: NeuTreeSelectNodeDirective, descendants: true, isSignal: true }, { propertyName: "selectedTpl", first: true, predicate: NeuTreeSelectSelectedDirective, descendants: true, isSignal: true }, { propertyName: "headerTpl", first: true, predicate: NeuTreeSelectHeaderDirective, descendants: true, isSignal: true }, { propertyName: "footerTpl", first: true, predicate: NeuTreeSelectFooterDirective, descendants: true, isSignal: true }, { propertyName: "emptyTpl", first: true, predicate: NeuTreeSelectEmptyDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
118
188
  @if (label()) {
119
189
  <label class="neu-tree-select__label" [for]="triggerId">{{ label() }}</label>
120
190
  }
@@ -128,7 +198,7 @@ class NeuTreeSelectComponent {
128
198
  [attr.aria-expanded]="open()"
129
199
  (click)="toggle()"
130
200
  >
131
- <span [class.neu-tree-select__placeholder]="!selectedLabel()">{{ selectedLabel() || placeholder() }}</span>
201
+ <span [class.neu-tree-select__placeholder]="!selectedLabel()">@if (selectedTpl() && selectedNode()) { <ng-container [ngTemplateOutlet]="selectedTpl()!.templateRef" [ngTemplateOutletContext]="{ $implicit: selectedNode() }" /> } @else { {{ selectedLabel() || placeholder() }} }</span>
132
202
  @if (clearable() && values().length) {
133
203
  <span class="neu-tree-select__clear" aria-hidden="true" (click)="clear($event)">×</span>
134
204
  }
@@ -143,6 +213,7 @@ class NeuTreeSelectComponent {
143
213
  (detach)="close()"
144
214
  >
145
215
  <div class="neu-tree-select__panel" role="tree" [attr.aria-label]="label() || placeholder()">
216
+ @if (headerTpl()) { <ng-container [ngTemplateOutlet]="headerTpl()!.templateRef" /> }
146
217
  @if (searchable()) {
147
218
  <input
148
219
  class="neu-tree-select__search"
@@ -168,19 +239,20 @@ class NeuTreeSelectComponent {
168
239
  {{ expanded().has(item.node.value) ? '−' : '+' }}
169
240
  </span>
170
241
  }
171
- {{ item.node.label }}
242
+ @if (nodeTpl()) { <ng-container [ngTemplateOutlet]="nodeTpl()!.templateRef" [ngTemplateOutletContext]="{ $implicit: item.node, level: item.level, selected: isSelected(item.node.value), toggle: toggleExpandedFromTemplate.bind(this, item.node) }" /> } @else { {{ item.node.label }} }
172
243
  </button>
173
244
  }
174
245
  @if (!visibleNodes().length) {
175
- <div class="neu-tree-select__empty">{{ emptyLabel() }}</div>
246
+ @if (emptyTpl()) { <ng-container [ngTemplateOutlet]="emptyTpl()!.templateRef" /> } @else { <div class="neu-tree-select__empty">{{ emptyLabel() }}</div> }
176
247
  }
248
+ @if (footerTpl()) { <ng-container [ngTemplateOutlet]="footerTpl()!.templateRef" /> }
177
249
  </div>
178
250
  </ng-template>
179
- `, isInline: true, styles: [".neu-tree-select{display:grid;gap:.375rem}.neu-tree-select__label{font-size:.875rem;font-weight:600;color:var(--neu-text, #111827)}.neu-tree-select__trigger,.neu-tree-select__search{min-height:2.5rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);color:var(--neu-text, #111827);padding:0 .75rem}.neu-tree-select__trigger{display:flex;align-items:center;justify-content:space-between;min-width:14rem}.neu-tree-select__placeholder,.neu-tree-select__empty{color:var(--neu-text-muted, #6b7280)}.neu-tree-select__panel{display:grid;gap:.25rem;min-width:16rem;max-height:20rem;overflow:auto;border:1px solid var(--neu-border, #d1d5db);border-radius:.75rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.5rem}.neu-tree-select__search{width:100%;margin-bottom:.25rem}.neu-tree-select__node{border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.5rem .75rem;text-align:left}.neu-tree-select__node--selected{background:color-mix(in srgb,var(--neu-primary, #2563eb) 14%,transparent)}.neu-tree-select__twisty{display:inline-flex;width:1rem;justify-content:center;margin-right:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
251
+ `, isInline: true, styles: [".neu-tree-select{display:grid;gap:.375rem}.neu-tree-select__label{font-size:.875rem;font-weight:600;color:var(--neu-text, #111827)}.neu-tree-select__trigger,.neu-tree-select__search{min-height:2.5rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);color:var(--neu-text, #111827);padding:0 .75rem}.neu-tree-select__trigger{display:flex;align-items:center;justify-content:space-between;min-width:14rem}.neu-tree-select__placeholder,.neu-tree-select__empty{color:var(--neu-text-muted, #6b7280)}.neu-tree-select__panel{display:grid;gap:.25rem;min-width:16rem;max-height:20rem;overflow:auto;border:1px solid var(--neu-border, #d1d5db);border-radius:.75rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.5rem}.neu-tree-select__search{width:100%;margin-bottom:.25rem}.neu-tree-select__node{border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.5rem .75rem;text-align:left}.neu-tree-select__node--selected{background:color-mix(in srgb,var(--neu-primary, #2563eb) 14%,transparent)}.neu-tree-select__twisty{display:inline-flex;width:1rem;justify-content:center;margin-right:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
180
252
  }
181
253
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuTreeSelectComponent, decorators: [{
182
254
  type: Component,
183
- args: [{ selector: 'neu-tree-select', imports: [OverlayModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
255
+ args: [{ selector: 'neu-tree-select', imports: [OverlayModule, NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
184
256
  {
185
257
  provide: NG_VALUE_ACCESSOR,
186
258
  useExisting: forwardRef(() => NeuTreeSelectComponent),
@@ -200,7 +272,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
200
272
  [attr.aria-expanded]="open()"
201
273
  (click)="toggle()"
202
274
  >
203
- <span [class.neu-tree-select__placeholder]="!selectedLabel()">{{ selectedLabel() || placeholder() }}</span>
275
+ <span [class.neu-tree-select__placeholder]="!selectedLabel()">@if (selectedTpl() && selectedNode()) { <ng-container [ngTemplateOutlet]="selectedTpl()!.templateRef" [ngTemplateOutletContext]="{ $implicit: selectedNode() }" /> } @else { {{ selectedLabel() || placeholder() }} }</span>
204
276
  @if (clearable() && values().length) {
205
277
  <span class="neu-tree-select__clear" aria-hidden="true" (click)="clear($event)">×</span>
206
278
  }
@@ -215,6 +287,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
215
287
  (detach)="close()"
216
288
  >
217
289
  <div class="neu-tree-select__panel" role="tree" [attr.aria-label]="label() || placeholder()">
290
+ @if (headerTpl()) { <ng-container [ngTemplateOutlet]="headerTpl()!.templateRef" /> }
218
291
  @if (searchable()) {
219
292
  <input
220
293
  class="neu-tree-select__search"
@@ -240,20 +313,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
240
313
  {{ expanded().has(item.node.value) ? '−' : '+' }}
241
314
  </span>
242
315
  }
243
- {{ item.node.label }}
316
+ @if (nodeTpl()) { <ng-container [ngTemplateOutlet]="nodeTpl()!.templateRef" [ngTemplateOutletContext]="{ $implicit: item.node, level: item.level, selected: isSelected(item.node.value), toggle: toggleExpandedFromTemplate.bind(this, item.node) }" /> } @else { {{ item.node.label }} }
244
317
  </button>
245
318
  }
246
319
  @if (!visibleNodes().length) {
247
- <div class="neu-tree-select__empty">{{ emptyLabel() }}</div>
320
+ @if (emptyTpl()) { <ng-container [ngTemplateOutlet]="emptyTpl()!.templateRef" /> } @else { <div class="neu-tree-select__empty">{{ emptyLabel() }}</div> }
248
321
  }
322
+ @if (footerTpl()) { <ng-container [ngTemplateOutlet]="footerTpl()!.templateRef" /> }
249
323
  </div>
250
324
  </ng-template>
251
325
  `, styles: [".neu-tree-select{display:grid;gap:.375rem}.neu-tree-select__label{font-size:.875rem;font-weight:600;color:var(--neu-text, #111827)}.neu-tree-select__trigger,.neu-tree-select__search{min-height:2.5rem;border:1px solid var(--neu-border, #d1d5db);border-radius:.625rem;background:var(--neu-surface, #fff);color:var(--neu-text, #111827);padding:0 .75rem}.neu-tree-select__trigger{display:flex;align-items:center;justify-content:space-between;min-width:14rem}.neu-tree-select__placeholder,.neu-tree-select__empty{color:var(--neu-text-muted, #6b7280)}.neu-tree-select__panel{display:grid;gap:.25rem;min-width:16rem;max-height:20rem;overflow:auto;border:1px solid var(--neu-border, #d1d5db);border-radius:.75rem;background:var(--neu-surface, #fff);box-shadow:var(--neu-shadow-lg, 0 18px 40px rgba(15, 23, 42, .18));padding:.5rem}.neu-tree-select__search{width:100%;margin-bottom:.25rem}.neu-tree-select__node{border:0;border-radius:.5rem;background:transparent;color:var(--neu-text, #111827);padding:.5rem .75rem;text-align:left}.neu-tree-select__node--selected{background:color-mix(in srgb,var(--neu-primary, #2563eb) 14%,transparent)}.neu-tree-select__twisty{display:inline-flex;width:1rem;justify-content:center;margin-right:.25rem}\n"] }]
252
- }], propDecorators: { nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], emptyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyLabel", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }] } });
326
+ }], propDecorators: { nodeTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuTreeSelectNodeDirective), { isSignal: true }] }], selectedTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuTreeSelectSelectedDirective), { isSignal: true }] }], headerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuTreeSelectHeaderDirective), { isSignal: true }] }], footerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuTreeSelectFooterDirective), { isSignal: true }] }], emptyTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuTreeSelectEmptyDirective), { isSignal: true }] }], nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], emptyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyLabel", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }] } });
253
327
 
254
328
  /**
255
329
  * Generated bundle index. Do not edit.
256
330
  */
257
331
 
258
- export { NeuTreeSelectComponent };
332
+ export { NeuTreeSelectComponent, NeuTreeSelectEmptyDirective, NeuTreeSelectFooterDirective, NeuTreeSelectHeaderDirective, NeuTreeSelectNodeDirective, NeuTreeSelectSelectedDirective };
259
333
  //# sourceMappingURL=neural-ui-core-tree-select.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-tree-select.mjs","sources":["../../../../projects/ui-core/tree-select/neu-tree-select.component.ts","../../../../projects/ui-core/tree-select/neural-ui-core-tree-select.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface NeuTreeSelectNode {\n value: string;\n label: string;\n disabled?: boolean;\n children?: NeuTreeSelectNode[];\n lazy?: boolean;\n data?: unknown;\n}\n\ninterface FlatNode {\n node: NeuTreeSelectNode;\n level: number;\n}\n\n@Component({\n selector: 'neu-tree-select',\n imports: [OverlayModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuTreeSelectComponent),\n multi: true,\n },\n ],\n host: { class: 'neu-tree-select' },\n template: `\n @if (label()) {\n <label class=\"neu-tree-select__label\" [for]=\"triggerId\">{{ label() }}</label>\n }\n <button\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"neu-tree-select__trigger\"\n [id]=\"triggerId\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n <span [class.neu-tree-select__placeholder]=\"!selectedLabel()\">{{ selectedLabel() || placeholder() }}</span>\n @if (clearable() && values().length) {\n <span class=\"neu-tree-select__clear\" aria-hidden=\"true\" (click)=\"clear($event)\">×</span>\n }\n </button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n >\n <div class=\"neu-tree-select__panel\" role=\"tree\" [attr.aria-label]=\"label() || placeholder()\">\n @if (searchable()) {\n <input\n class=\"neu-tree-select__search\"\n type=\"search\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"query()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n }\n @for (item of visibleNodes(); track item.node.value) {\n <button\n type=\"button\"\n role=\"treeitem\"\n class=\"neu-tree-select__node\"\n [class.neu-tree-select__node--selected]=\"isSelected(item.node.value)\"\n [disabled]=\"item.node.disabled\"\n [style.padding-left.rem]=\"0.75 + item.level * 1\"\n [attr.aria-selected]=\"isSelected(item.node.value)\"\n (click)=\"selectNode(item.node)\"\n >\n @if (item.node.children?.length || item.node.lazy) {\n <span class=\"neu-tree-select__twisty\" (click)=\"toggleExpanded(item.node, $event)\">\n {{ expanded().has(item.node.value) ? '−' : '+' }}\n </span>\n }\n {{ item.node.label }}\n </button>\n }\n @if (!visibleNodes().length) {\n <div class=\"neu-tree-select__empty\">{{ emptyLabel() }}</div>\n }\n </div>\n </ng-template>\n `,\n styleUrl: './neu-tree-select.component.scss',\n})\nexport class NeuTreeSelectComponent implements ControlValueAccessor {\n readonly nodes = input<NeuTreeSelectNode[]>([]);\n readonly label = input('');\n readonly placeholder = input('Select...');\n readonly emptyLabel = input('No options found');\n readonly searchPlaceholder = input('Search...');\n readonly searchable = input(true);\n readonly multiple = input(false);\n readonly clearable = input(false);\n readonly disabled = input(false);\n\n readonly selectionChange = output<NeuTreeSelectNode[]>();\n readonly nodeExpand = output<NeuTreeSelectNode>();\n\n readonly triggerId = `neu-tree-select-${Math.random().toString(36).slice(2)}`;\n readonly open = signal(false);\n readonly query = signal('');\n readonly values = signal<string[]>([]);\n readonly expanded = signal(new Set<string>());\n readonly cvaDisabled = signal(false);\n\n readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n readonly selectedLabel = computed(() => {\n const selected = this.flatten(this.nodes()).filter((item) => this.values().includes(item.node.value));\n if (!selected.length) {\n return '';\n }\n return this.multiple() ? `${selected.length} selected` : selected[0]?.node.label ?? '';\n });\n readonly visibleNodes = computed(() => {\n const q = this.query().trim().toLowerCase();\n const all = this.flattenVisible(this.nodes(), 0);\n return q ? this.flatten(this.nodes()).filter((item) => item.node.label.toLowerCase().includes(q)) : all;\n });\n\n private onChange: (value: string | string[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: string | string[] | null): void {\n this.values.set(Array.isArray(value) ? value : value ? [value] : []);\n }\n\n registerOnChange(fn: (value: string | string[] | null) => 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.cvaDisabled.set(isDisabled);\n }\n\n toggle(): void {\n if (!this.isDisabled()) {\n this.open.set(!this.open());\n }\n }\n\n close(): void {\n this.open.set(false);\n }\n\n clear(event: Event): void {\n event.stopPropagation();\n this.commit([]);\n }\n\n isSelected(value: string): boolean {\n return this.values().includes(value);\n }\n\n selectNode(node: NeuTreeSelectNode): void {\n if (node.disabled) {\n return;\n }\n const next = this.multiple()\n ? this.isSelected(node.value)\n ? this.values().filter((value) => value !== node.value)\n : [...this.values(), node.value]\n : [node.value];\n this.commit(next);\n if (!this.multiple()) {\n this.close();\n }\n }\n\n toggleExpanded(node: NeuTreeSelectNode, event: Event): void {\n event.stopPropagation();\n const next = new Set(this.expanded());\n if (next.has(node.value)) {\n next.delete(node.value);\n } else {\n next.add(node.value);\n if (node.lazy && !node.children?.length) {\n this.nodeExpand.emit(node);\n }\n }\n this.expanded.set(next);\n }\n\n private commit(values: string[]): void {\n this.values.set(values);\n this.onTouched();\n this.onChange(this.multiple() ? values : (values[0] ?? null));\n this.selectionChange.emit(this.flatten(this.nodes()).map((item) => item.node).filter((node) => values.includes(node.value)));\n }\n\n private flatten(nodes: NeuTreeSelectNode[], level = 0): FlatNode[] {\n return nodes.flatMap((node) => [{ node, level }, ...this.flatten(node.children ?? [], level + 1)]);\n }\n\n private flattenVisible(nodes: NeuTreeSelectNode[], level: number): FlatNode[] {\n return nodes.flatMap((node) => [\n { node, level },\n ...(this.expanded().has(node.value) ? this.flattenVisible(node.children ?? [], level + 1) : []),\n ]);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-tree-select.mjs","sources":["../../../../projects/ui-core/tree-select/neu-tree-select.component.ts","../../../../projects/ui-core/tree-select/neural-ui-core-tree-select.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n ViewEncapsulation,\n computed,\n contentChild,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface NeuTreeSelectNode {\n value: string;\n label: string;\n disabled?: boolean;\n children?: NeuTreeSelectNode[];\n lazy?: boolean;\n data?: unknown;\n}\n\ninterface FlatNode {\n node: NeuTreeSelectNode;\n level: number;\n}\nexport interface NeuTreeSelectNodeTemplateContext { $implicit: NeuTreeSelectNode; level: number; selected: boolean; toggle: () => void; }\n@Directive({ selector: 'ng-template[neuTreeSelectNode]' })\nexport class NeuTreeSelectNodeDirective { constructor(readonly templateRef: TemplateRef<NeuTreeSelectNodeTemplateContext>) {} }\n@Directive({ selector: 'ng-template[neuTreeSelectSelected]' })\nexport class NeuTreeSelectSelectedDirective { constructor(readonly templateRef: TemplateRef<{ $implicit: NeuTreeSelectNode | null }>) {} }\n@Directive({ selector: 'ng-template[neuTreeSelectHeader]' })\nexport class NeuTreeSelectHeaderDirective { constructor(readonly templateRef: TemplateRef<void>) {} }\n@Directive({ selector: 'ng-template[neuTreeSelectFooter]' })\nexport class NeuTreeSelectFooterDirective { constructor(readonly templateRef: TemplateRef<void>) {} }\n@Directive({ selector: 'ng-template[neuTreeSelectEmpty]' })\nexport class NeuTreeSelectEmptyDirective { constructor(readonly templateRef: TemplateRef<void>) {} }\n\n@Component({\n selector: 'neu-tree-select',\n imports: [OverlayModule, NgTemplateOutlet],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuTreeSelectComponent),\n multi: true,\n },\n ],\n host: { class: 'neu-tree-select' },\n template: `\n @if (label()) {\n <label class=\"neu-tree-select__label\" [for]=\"triggerId\">{{ label() }}</label>\n }\n <button\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n type=\"button\"\n class=\"neu-tree-select__trigger\"\n [id]=\"triggerId\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n <span [class.neu-tree-select__placeholder]=\"!selectedLabel()\">@if (selectedTpl() && selectedNode()) { <ng-container [ngTemplateOutlet]=\"selectedTpl()!.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: selectedNode() }\" /> } @else { {{ selectedLabel() || placeholder() }} }</span>\n @if (clearable() && values().length) {\n <span class=\"neu-tree-select__clear\" aria-hidden=\"true\" (click)=\"clear($event)\">×</span>\n }\n </button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n >\n <div class=\"neu-tree-select__panel\" role=\"tree\" [attr.aria-label]=\"label() || placeholder()\">\n @if (headerTpl()) { <ng-container [ngTemplateOutlet]=\"headerTpl()!.templateRef\" /> }\n @if (searchable()) {\n <input\n class=\"neu-tree-select__search\"\n type=\"search\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"query()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n }\n @for (item of visibleNodes(); track item.node.value) {\n <button\n type=\"button\"\n role=\"treeitem\"\n class=\"neu-tree-select__node\"\n [class.neu-tree-select__node--selected]=\"isSelected(item.node.value)\"\n [disabled]=\"item.node.disabled\"\n [style.padding-left.rem]=\"0.75 + item.level * 1\"\n [attr.aria-selected]=\"isSelected(item.node.value)\"\n (click)=\"selectNode(item.node)\"\n >\n @if (item.node.children?.length || item.node.lazy) {\n <span class=\"neu-tree-select__twisty\" (click)=\"toggleExpanded(item.node, $event)\">\n {{ expanded().has(item.node.value) ? '−' : '+' }}\n </span>\n }\n @if (nodeTpl()) { <ng-container [ngTemplateOutlet]=\"nodeTpl()!.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: item.node, level: item.level, selected: isSelected(item.node.value), toggle: toggleExpandedFromTemplate.bind(this, item.node) }\" /> } @else { {{ item.node.label }} }\n </button>\n }\n @if (!visibleNodes().length) {\n @if (emptyTpl()) { <ng-container [ngTemplateOutlet]=\"emptyTpl()!.templateRef\" /> } @else { <div class=\"neu-tree-select__empty\">{{ emptyLabel() }}</div> }\n }\n @if (footerTpl()) { <ng-container [ngTemplateOutlet]=\"footerTpl()!.templateRef\" /> }\n </div>\n </ng-template>\n `,\n styleUrl: './neu-tree-select.component.scss',\n})\nexport class NeuTreeSelectComponent implements ControlValueAccessor {\n readonly nodeTpl = contentChild(NeuTreeSelectNodeDirective);\n readonly selectedTpl = contentChild(NeuTreeSelectSelectedDirective);\n readonly headerTpl = contentChild(NeuTreeSelectHeaderDirective);\n readonly footerTpl = contentChild(NeuTreeSelectFooterDirective);\n readonly emptyTpl = contentChild(NeuTreeSelectEmptyDirective);\n readonly nodes = input<NeuTreeSelectNode[]>([]);\n readonly label = input('');\n readonly placeholder = input('Select...');\n readonly emptyLabel = input('No options found');\n readonly searchPlaceholder = input('Search...');\n readonly searchable = input(true);\n readonly multiple = input(false);\n readonly clearable = input(false);\n readonly disabled = input(false);\n\n readonly selectionChange = output<NeuTreeSelectNode[]>();\n readonly nodeExpand = output<NeuTreeSelectNode>();\n\n readonly triggerId = `neu-tree-select-${Math.random().toString(36).slice(2)}`;\n readonly open = signal(false);\n readonly query = signal('');\n readonly values = signal<string[]>([]);\n readonly expanded = signal(new Set<string>());\n readonly cvaDisabled = signal(false);\n\n readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n readonly selectedLabel = computed(() => {\n const selected = this.flatten(this.nodes()).filter((item) => this.values().includes(item.node.value));\n if (!selected.length) {\n return '';\n }\n return this.multiple() ? `${selected.length} selected` : selected[0]?.node.label ?? '';\n });\n readonly selectedNode = computed(() => this.flatten(this.nodes()).find((item) => this.values().includes(item.node.value))?.node ?? null);\n readonly visibleNodes = computed(() => {\n const q = this.query().trim().toLowerCase();\n const all = this.flattenVisible(this.nodes(), 0);\n return q ? this.flatten(this.nodes()).filter((item) => item.node.label.toLowerCase().includes(q)) : all;\n });\n\n private onChange: (value: string | string[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(value: string | string[] | null): void {\n this.values.set(Array.isArray(value) ? value : value ? [value] : []);\n }\n\n registerOnChange(fn: (value: string | string[] | null) => 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.cvaDisabled.set(isDisabled);\n }\n\n toggle(): void {\n if (!this.isDisabled()) {\n this.open.set(!this.open());\n }\n }\n\n close(): void {\n this.open.set(false);\n }\n\n clear(event: Event): void {\n event.stopPropagation();\n this.commit([]);\n }\n\n isSelected(value: string): boolean {\n return this.values().includes(value);\n }\n\n selectNode(node: NeuTreeSelectNode): void {\n if (node.disabled) {\n return;\n }\n const next = this.multiple()\n ? this.isSelected(node.value)\n ? this.values().filter((value) => value !== node.value)\n : [...this.values(), node.value]\n : [node.value];\n this.commit(next);\n if (!this.multiple()) {\n this.close();\n }\n }\n\n toggleExpanded(node: NeuTreeSelectNode, event: Event): void {\n event.stopPropagation();\n const next = new Set(this.expanded());\n if (next.has(node.value)) {\n next.delete(node.value);\n } else {\n next.add(node.value);\n if (node.lazy && !node.children?.length) {\n this.nodeExpand.emit(node);\n }\n }\n this.expanded.set(next);\n }\n\n toggleExpandedFromTemplate(node: NeuTreeSelectNode): void {\n this.toggleExpanded(node, new Event('toggle'));\n }\n\n private commit(values: string[]): void {\n this.values.set(values);\n this.onTouched();\n this.onChange(this.multiple() ? values : (values[0] ?? null));\n this.selectionChange.emit(this.flatten(this.nodes()).map((item) => item.node).filter((node) => values.includes(node.value)));\n }\n\n private flatten(nodes: NeuTreeSelectNode[], level = 0): FlatNode[] {\n return nodes.flatMap((node) => [{ node, level }, ...this.flatten(node.children ?? [], level + 1)]);\n }\n\n private flattenVisible(nodes: NeuTreeSelectNode[], level: number): FlatNode[] {\n return nodes.flatMap((node) => [\n { node, level },\n ...(this.expanded().has(node.value) ? this.flattenVisible(node.children ?? [], level + 1) : []),\n ]);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}