@neural-ui/core 1.6.3 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -166,10 +166,12 @@ For the full token list, see `styles/_tokens.scss` in the published package sour
166
166
  | `@angular/common` | `>=19.0.0 <23.0.0` |
167
167
  | `@angular/forms` | `>=19.0.0 <23.0.0` |
168
168
  | `@angular/router` | `>=19.0.0 <23.0.0` |
169
- | `@ng-icons/core` | `>=33.0.0` |
170
- | `@ng-icons/lucide` | `>=33.0.0` |
171
- | `apexcharts` | `>=5.0.0` |
172
- | `ng-apexcharts` | `>=2.0.0` |
169
+ | `@ng-icons/core` | `>=31.4.0 <34.0.0` |
170
+ | `@ng-icons/lucide` | `>=31.4.0 <34.0.0` |
171
+ | `apexcharts` | `>=4.0.0 <6.0.0` |
172
+ | `ng-apexcharts` | `>=1.15.0 <3.0.0` |
173
+
174
+ For Angular 19 projects, use `ng-apexcharts@1.15.x` with `apexcharts@4.x` or newer. Angular 20+ projects can use the newer `ng-apexcharts@2.x` line.
173
175
 
174
176
  ---
175
177
 
@@ -530,7 +530,7 @@ class NeuNavComponent {
530
530
  </button>
531
531
  }
532
532
  </div>
533
- `, isInline: true, styles: ["@charset \"UTF-8\";.neu-nav{display:flex;flex-direction:column;width:268px;height:100%;background:var(--neu-surface);border-right:1px solid var(--neu-border);transition:width .28s cubic-bezier(.4,0,.2,1);overflow:hidden;flex-shrink:0;-webkit-user-select:none;user-select:none}.neu-nav--collapsed{width:64px}.neu-nav--collapsed .neu-nav__brand{justify-content:center;padding:0;gap:0}.neu-nav--collapsed .neu-nav__brand-content{flex:0 0 0;width:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav--collapsed .neu-nav__items{padding-left:0;padding-right:0}.neu-nav--collapsed .neu-nav__item{justify-content:center;width:64px;padding:0;gap:0}.neu-nav--collapsed .neu-nav__item--parent .neu-nav__group-chevron{margin-left:0}.neu-nav--collapsed .neu-nav__item-label,.neu-nav--collapsed .neu-nav__item-badge,.neu-nav--collapsed .neu-nav__group-chevron,.neu-nav--collapsed .neu-nav__external-icon{flex:0 0 0;width:0;margin:0;opacity:0;overflow:hidden;pointer-events:none;white-space:nowrap}.neu-nav--collapsed .neu-nav__footer{height:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav__brand{display:flex;align-items:center;justify-content:space-between;min-height:64px;padding:0 var(--neu-space-4);border-bottom:1px solid var(--neu-border);flex-shrink:0;gap:var(--neu-space-3)}.neu-nav__brand-content{flex:1;min-width:0;display:flex;align-items:center;gap:10px;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1);overflow:hidden}.neu-nav__brand-icon{display:none;align-items:center;justify-content:center;width:64px;height:64px;flex-shrink:0;background:none;border:none;cursor:pointer;padding:0;color:inherit}.neu-nav__brand-icon:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav--collapsed .neu-nav__brand-icon{display:flex}.neu-nav-wrapper{position:relative;height:100%;flex-shrink:0;display:flex}.neu-nav__toggle-tab{position:absolute;right:-13px;top:16px;transform:none;width:13px;height:40px;display:flex;align-items:center;justify-content:center;background:var(--neu-surface);border:1px solid var(--neu-border);border-left:none;border-radius:0 6px 6px 0;color:var(--neu-text-muted);cursor:pointer;padding:0;z-index:10;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__toggle-tab:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__toggle-tab:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-nav__items{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--neu-space-3) var(--neu-space-2);display:flex;flex-direction:column;gap:2px}.neu-nav__items::-webkit-scrollbar{width:4px}.neu-nav__items::-webkit-scrollbar-track{background:transparent}.neu-nav__items::-webkit-scrollbar-thumb{background:var(--neu-border);border-radius:4px}.neu-nav__item{position:relative;display:flex;align-items:center;gap:10px;height:40px;padding:0 var(--neu-space-3);border-radius:8px;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;background:none;border:none;font-family:inherit;width:100%;text-align:left;transition:background var(--neu-transition),color var(--neu-transition);white-space:nowrap;flex-shrink:0}.neu-nav__item:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav__item:hover:not(.neu-nav__item--disabled){background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__item:hover:not(.neu-nav__item--disabled) .neu-nav__item-icon{color:var(--neu-text)}.neu-nav__item--active{background:var(--neu-primary-50);color:var(--neu-primary-dark, var(--neu-primary));font-weight:600}.neu-nav__item--active .neu-nav__item-icon{color:var(--neu-primary-dark, var(--neu-primary))}.neu-nav__item--active:before{content:\"\";position:absolute;left:0;top:6px;bottom:6px;width:3px;background:var(--neu-primary-dark, var(--neu-primary));border-radius:0 var(--neu-radius-full) var(--neu-radius-full) 0}.neu-nav__item--disabled{opacity:1;color:var(--neu-text-disabled);cursor:not-allowed;pointer-events:none}.neu-nav__item--disabled .neu-nav__item-icon{color:var(--neu-text-disabled)}.neu-nav__item--child{height:36px;padding-left:calc(var(--neu-space-3) + 6px);font-size:.8125rem}.neu-nav__item--parent .neu-nav__group-chevron{margin-left:auto;flex-shrink:0;transition:transform var(--neu-transition);color:var(--neu-text-disabled)}.neu-nav__item-icon{flex-shrink:0;color:var(--neu-text-disabled);transition:color var(--neu-transition)}.neu-nav__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1)}.neu-nav__item-badge{flex-shrink:0;font-size:10px;font-weight:700;line-height:1;padding:2px 6px;border-radius:var(--neu-radius-full);text-transform:uppercase;letter-spacing:.04em;transition:opacity .2s ease}.neu-nav__item-badge--default{background:var(--neu-surface-3);color:var(--neu-text-muted)}.neu-nav__item-badge--success{background:var(--neu-success-bg);color:var(--neu-success-text)}.neu-nav__item-badge--warning{background:var(--neu-warning-bg);color:var(--neu-warning-text)}.neu-nav__item-badge--danger{background:var(--neu-error-bg);color:var(--neu-error-text)}.neu-nav__item-badge--info{background:var(--neu-info-bg);color:var(--neu-info-text)}.neu-nav__group{display:flex;flex-direction:column}.neu-nav__group--open .neu-nav__group-chevron{transform:rotate(90deg)}.neu-nav__group--open>.neu-nav__item--parent{color:var(--neu-text);background:var(--neu-surface-2)}.neu-nav__group--open>.neu-nav__item--parent .neu-nav__item-icon{color:var(--neu-text-muted)}.neu-nav__submenu{display:flex;flex-direction:column;gap:1px;padding:2px 0 4px var(--neu-space-3);margin-top:2px;border-left:2px solid var(--neu-border);margin-left:calc(var(--neu-space-3) + 9px)}.neu-nav__submenu--nested{padding-left:var(--neu-space-2);margin-left:calc(var(--neu-space-2) + 7px);border-color:var(--neu-border);border-left-style:dashed}.neu-nav__item--grandchild{height:32px;padding-left:calc(var(--neu-space-2) + 4px);font-size:.75rem}.neu-nav__external-icon{flex-shrink:0;margin-left:auto;color:var(--neu-text-disabled);opacity:.7;transition:opacity var(--neu-transition),color var(--neu-transition)}.neu-nav__item:hover .neu-nav__external-icon{opacity:1;color:var(--neu-text-muted)}.neu-nav__footer{border-top:1px solid var(--neu-border);padding:var(--neu-space-3) var(--neu-space-4);flex-shrink:0;font-size:var(--neu-text-xs);color:var(--neu-text-muted);transition:opacity .2s ease,height .28s cubic-bezier(.4,0,.2,1)}.neu-nav--collapsed .neu-nav__item--parent:after{content:\"\\203a\";position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:11px;line-height:1;color:var(--neu-text-disabled);pointer-events:none}.neu-nav__flyout{position:fixed;z-index:1000;min-width:200px;max-width:240px;background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:8px;box-shadow:0 4px 20px #0000001f;padding:6px;margin-left:6px}.neu-nav__flyout-title{font-size:.6875rem;font-weight:700;color:var(--neu-text-muted);text-transform:uppercase;letter-spacing:.06em;padding:4px 8px 6px}.neu-nav__flyout-item{display:flex;align-items:center;gap:8px;height:34px;padding:0 8px;border-radius:6px;font-size:.8125rem;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;white-space:nowrap;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__flyout-item:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__flyout-item--active{background:var(--neu-primary-50);color:var(--neu-primary);font-weight:600}.neu-nav__flyout-item .neu-nav__external-icon{margin-left:auto;opacity:.6}.neu-nav__flyout-group{margin-top:4px;padding-top:4px;border-top:1px solid var(--neu-border)}.neu-nav__flyout-group-label{display:block;font-size:.6875rem;font-weight:600;color:var(--neu-text-disabled);text-transform:uppercase;letter-spacing:.05em;padding:2px 8px 4px}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }, { kind: "directive", type: NeuTooltipDirective, selector: "[neuTooltip]", inputs: ["neuTooltip", "neuTooltipPosition", "neuTooltipDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
533
+ `, isInline: true, styles: ["@charset \"UTF-8\";.neu-nav{display:flex;flex-direction:column;width:268px;height:100%;background:var(--neu-surface);border-right:1px solid var(--neu-border);transition:width .28s cubic-bezier(.4,0,.2,1);overflow:hidden;flex-shrink:0;-webkit-user-select:none;user-select:none}.neu-nav--collapsed{width:64px}.neu-nav--collapsed .neu-nav__brand{justify-content:center;padding:0;gap:0}.neu-nav--collapsed .neu-nav__brand-content{flex:0 0 0;width:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav--collapsed .neu-nav__items{padding-left:0;padding-right:0}.neu-nav--collapsed .neu-nav__item{justify-content:center;width:64px;padding:0;gap:0}.neu-nav--collapsed .neu-nav__item--parent .neu-nav__group-chevron{margin-left:0}.neu-nav--collapsed .neu-nav__item-label,.neu-nav--collapsed .neu-nav__item-badge,.neu-nav--collapsed .neu-nav__group-chevron,.neu-nav--collapsed .neu-nav__external-icon{flex:0 0 0;width:0;margin:0;opacity:0;overflow:hidden;pointer-events:none;white-space:nowrap}.neu-nav--collapsed .neu-nav__footer{height:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav__brand{display:flex;align-items:center;justify-content:space-between;min-height:64px;padding:0 var(--neu-space-4);border-bottom:1px solid var(--neu-border);flex-shrink:0;gap:var(--neu-space-3)}.neu-nav__brand-content{flex:1;min-width:0;display:flex;align-items:center;gap:10px;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1);overflow:hidden}.neu-nav__brand-icon{display:none;align-items:center;justify-content:center;width:64px;height:64px;flex-shrink:0;background:none;border:none;cursor:pointer;padding:0;color:inherit}.neu-nav__brand-icon:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav--collapsed .neu-nav__brand-icon{display:flex}.neu-nav-wrapper{position:relative;height:100%;flex-shrink:0;display:flex;--neu-nav-toggle-size: 28px;--neu-nav-toggle-offset-top: 18px;--neu-nav-toggle-bg: var(--neu-surface);--neu-nav-toggle-bg-hover: var(--neu-surface-2);--neu-nav-toggle-border: var(--neu-border);--neu-nav-toggle-color: var(--neu-text-muted);--neu-nav-toggle-color-hover: var(--neu-text);--neu-nav-toggle-shadow: 0 6px 14px color-mix(in srgb, var(--neu-text) 10%, transparent), inset 0 1px 0 color-mix(in srgb, var(--neu-surface) 82%, white)}.neu-nav__toggle-tab{position:absolute;right:calc(var(--neu-nav-toggle-size) / -2);top:var(--neu-nav-toggle-offset-top);transform:none;width:var(--neu-nav-toggle-size);height:var(--neu-nav-toggle-size);display:flex;align-items:center;justify-content:center;background:var(--neu-nav-toggle-bg);border:1px solid var(--neu-nav-toggle-border);border-radius:8px;color:var(--neu-nav-toggle-color);cursor:pointer;padding:0;z-index:10;box-shadow:var(--neu-nav-toggle-shadow);transition:background var(--neu-transition),border-color var(--neu-transition),box-shadow var(--neu-transition),color var(--neu-transition),transform .16s ease}.neu-nav__toggle-tab:hover{background:var(--neu-nav-toggle-bg-hover);border-color:color-mix(in srgb,var(--neu-nav-toggle-border) 55%,var(--neu-text));color:var(--neu-nav-toggle-color-hover);transform:translate(-1px)}.neu-nav__toggle-tab:active{transform:translate(-1px) scale(.96)}.neu-nav__toggle-tab:focus-visible{outline:none;box-shadow:var(--neu-focus-ring-strong),var(--neu-nav-toggle-shadow)}.neu-nav-wrapper--collapsed .neu-nav__toggle-tab:hover{transform:translate(1px)}.neu-nav-wrapper--collapsed .neu-nav__toggle-tab:active{transform:translate(1px) scale(.96)}.neu-nav__items{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--neu-space-3) var(--neu-space-2);display:flex;flex-direction:column;gap:2px}.neu-nav__items::-webkit-scrollbar{width:4px}.neu-nav__items::-webkit-scrollbar-track{background:transparent}.neu-nav__items::-webkit-scrollbar-thumb{background:var(--neu-border);border-radius:4px}.neu-nav__item{position:relative;display:flex;align-items:center;gap:10px;height:40px;padding:0 var(--neu-space-3);border-radius:8px;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;background:none;border:none;font-family:inherit;width:100%;text-align:left;transition:background var(--neu-transition),color var(--neu-transition);white-space:nowrap;flex-shrink:0}.neu-nav__item:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav__item:hover:not(.neu-nav__item--disabled){background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__item:hover:not(.neu-nav__item--disabled) .neu-nav__item-icon{color:var(--neu-text)}.neu-nav__item--active{background:var(--neu-primary-50);color:var(--neu-primary-dark, var(--neu-primary));font-weight:600}.neu-nav__item--active .neu-nav__item-icon{color:var(--neu-primary-dark, var(--neu-primary))}.neu-nav__item--active:before{content:\"\";position:absolute;left:0;top:6px;bottom:6px;width:3px;background:var(--neu-primary-dark, var(--neu-primary));border-radius:0 var(--neu-radius-full) var(--neu-radius-full) 0}.neu-nav__item--disabled{opacity:1;color:var(--neu-text-disabled);cursor:not-allowed;pointer-events:none}.neu-nav__item--disabled .neu-nav__item-icon{color:var(--neu-text-disabled)}.neu-nav__item--child{height:36px;padding-left:calc(var(--neu-space-3) + 6px);font-size:.8125rem}.neu-nav__item--parent .neu-nav__group-chevron{margin-left:auto;flex-shrink:0;transition:transform var(--neu-transition);color:var(--neu-text-disabled)}.neu-nav__item-icon{flex-shrink:0;color:var(--neu-text-disabled);transition:color var(--neu-transition)}.neu-nav__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1)}.neu-nav__item-badge{flex-shrink:0;font-size:10px;font-weight:700;line-height:1;padding:2px 6px;border-radius:var(--neu-radius-full);text-transform:uppercase;letter-spacing:.04em;transition:opacity .2s ease}.neu-nav__item-badge--default{background:var(--neu-surface-3);color:var(--neu-text-muted)}.neu-nav__item-badge--success{background:var(--neu-success-bg);color:var(--neu-success-text)}.neu-nav__item-badge--warning{background:var(--neu-warning-bg);color:var(--neu-warning-text)}.neu-nav__item-badge--danger{background:var(--neu-error-bg);color:var(--neu-error-text)}.neu-nav__item-badge--info{background:var(--neu-info-bg);color:var(--neu-info-text)}.neu-nav__group{display:flex;flex-direction:column}.neu-nav__group--open .neu-nav__group-chevron{transform:rotate(90deg)}.neu-nav__group--open>.neu-nav__item--parent{color:var(--neu-text);background:var(--neu-surface-2)}.neu-nav__group--open>.neu-nav__item--parent .neu-nav__item-icon{color:var(--neu-text-muted)}.neu-nav__submenu{display:flex;flex-direction:column;gap:1px;padding:2px 0 4px var(--neu-space-3);margin-top:2px;border-left:2px solid var(--neu-border);margin-left:calc(var(--neu-space-3) + 9px)}.neu-nav__submenu--nested{padding-left:var(--neu-space-2);margin-left:calc(var(--neu-space-2) + 7px);border-color:var(--neu-border);border-left-style:dashed}.neu-nav__item--grandchild{height:32px;padding-left:calc(var(--neu-space-2) + 4px);font-size:.75rem}.neu-nav__external-icon{flex-shrink:0;margin-left:auto;color:var(--neu-text-disabled);opacity:.7;transition:opacity var(--neu-transition),color var(--neu-transition)}.neu-nav__item:hover .neu-nav__external-icon{opacity:1;color:var(--neu-text-muted)}.neu-nav__footer{border-top:1px solid var(--neu-border);padding:var(--neu-space-3) var(--neu-space-4);flex-shrink:0;font-size:var(--neu-text-xs);color:var(--neu-text-muted);transition:opacity .2s ease,height .28s cubic-bezier(.4,0,.2,1)}.neu-nav--collapsed .neu-nav__item--parent:after{content:\"\\203a\";position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:11px;line-height:1;color:var(--neu-text-disabled);pointer-events:none}.neu-nav__flyout{position:fixed;z-index:1000;min-width:200px;max-width:240px;background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:8px;box-shadow:0 4px 20px #0000001f;padding:6px;margin-left:6px}.neu-nav__flyout-title{font-size:.6875rem;font-weight:700;color:var(--neu-text-muted);text-transform:uppercase;letter-spacing:.06em;padding:4px 8px 6px}.neu-nav__flyout-item{display:flex;align-items:center;gap:8px;height:34px;padding:0 8px;border-radius:6px;font-size:.8125rem;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;white-space:nowrap;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__flyout-item:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__flyout-item--active{background:var(--neu-primary-50);color:var(--neu-primary);font-weight:600}.neu-nav__flyout-item .neu-nav__external-icon{margin-left:auto;opacity:.6}.neu-nav__flyout-group{margin-top:4px;padding-top:4px;border-top:1px solid var(--neu-border)}.neu-nav__flyout-group-label{display:block;font-size:.6875rem;font-weight:600;color:var(--neu-text-disabled);text-transform:uppercase;letter-spacing:.05em;padding:2px 8px 4px}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: NeuIconComponent, selector: "neu-icon", inputs: ["name", "strokeWidth", "size"] }, { kind: "directive", type: NeuTooltipDirective, selector: "[neuTooltip]", inputs: ["neuTooltip", "neuTooltipPosition", "neuTooltipDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
534
534
  }
535
535
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuNavComponent, decorators: [{
536
536
  type: Component,
@@ -939,7 +939,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
939
939
  </button>
940
940
  }
941
941
  </div>
942
- `, styles: ["@charset \"UTF-8\";.neu-nav{display:flex;flex-direction:column;width:268px;height:100%;background:var(--neu-surface);border-right:1px solid var(--neu-border);transition:width .28s cubic-bezier(.4,0,.2,1);overflow:hidden;flex-shrink:0;-webkit-user-select:none;user-select:none}.neu-nav--collapsed{width:64px}.neu-nav--collapsed .neu-nav__brand{justify-content:center;padding:0;gap:0}.neu-nav--collapsed .neu-nav__brand-content{flex:0 0 0;width:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav--collapsed .neu-nav__items{padding-left:0;padding-right:0}.neu-nav--collapsed .neu-nav__item{justify-content:center;width:64px;padding:0;gap:0}.neu-nav--collapsed .neu-nav__item--parent .neu-nav__group-chevron{margin-left:0}.neu-nav--collapsed .neu-nav__item-label,.neu-nav--collapsed .neu-nav__item-badge,.neu-nav--collapsed .neu-nav__group-chevron,.neu-nav--collapsed .neu-nav__external-icon{flex:0 0 0;width:0;margin:0;opacity:0;overflow:hidden;pointer-events:none;white-space:nowrap}.neu-nav--collapsed .neu-nav__footer{height:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav__brand{display:flex;align-items:center;justify-content:space-between;min-height:64px;padding:0 var(--neu-space-4);border-bottom:1px solid var(--neu-border);flex-shrink:0;gap:var(--neu-space-3)}.neu-nav__brand-content{flex:1;min-width:0;display:flex;align-items:center;gap:10px;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1);overflow:hidden}.neu-nav__brand-icon{display:none;align-items:center;justify-content:center;width:64px;height:64px;flex-shrink:0;background:none;border:none;cursor:pointer;padding:0;color:inherit}.neu-nav__brand-icon:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav--collapsed .neu-nav__brand-icon{display:flex}.neu-nav-wrapper{position:relative;height:100%;flex-shrink:0;display:flex}.neu-nav__toggle-tab{position:absolute;right:-13px;top:16px;transform:none;width:13px;height:40px;display:flex;align-items:center;justify-content:center;background:var(--neu-surface);border:1px solid var(--neu-border);border-left:none;border-radius:0 6px 6px 0;color:var(--neu-text-muted);cursor:pointer;padding:0;z-index:10;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__toggle-tab:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__toggle-tab:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-nav__items{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--neu-space-3) var(--neu-space-2);display:flex;flex-direction:column;gap:2px}.neu-nav__items::-webkit-scrollbar{width:4px}.neu-nav__items::-webkit-scrollbar-track{background:transparent}.neu-nav__items::-webkit-scrollbar-thumb{background:var(--neu-border);border-radius:4px}.neu-nav__item{position:relative;display:flex;align-items:center;gap:10px;height:40px;padding:0 var(--neu-space-3);border-radius:8px;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;background:none;border:none;font-family:inherit;width:100%;text-align:left;transition:background var(--neu-transition),color var(--neu-transition);white-space:nowrap;flex-shrink:0}.neu-nav__item:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav__item:hover:not(.neu-nav__item--disabled){background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__item:hover:not(.neu-nav__item--disabled) .neu-nav__item-icon{color:var(--neu-text)}.neu-nav__item--active{background:var(--neu-primary-50);color:var(--neu-primary-dark, var(--neu-primary));font-weight:600}.neu-nav__item--active .neu-nav__item-icon{color:var(--neu-primary-dark, var(--neu-primary))}.neu-nav__item--active:before{content:\"\";position:absolute;left:0;top:6px;bottom:6px;width:3px;background:var(--neu-primary-dark, var(--neu-primary));border-radius:0 var(--neu-radius-full) var(--neu-radius-full) 0}.neu-nav__item--disabled{opacity:1;color:var(--neu-text-disabled);cursor:not-allowed;pointer-events:none}.neu-nav__item--disabled .neu-nav__item-icon{color:var(--neu-text-disabled)}.neu-nav__item--child{height:36px;padding-left:calc(var(--neu-space-3) + 6px);font-size:.8125rem}.neu-nav__item--parent .neu-nav__group-chevron{margin-left:auto;flex-shrink:0;transition:transform var(--neu-transition);color:var(--neu-text-disabled)}.neu-nav__item-icon{flex-shrink:0;color:var(--neu-text-disabled);transition:color var(--neu-transition)}.neu-nav__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1)}.neu-nav__item-badge{flex-shrink:0;font-size:10px;font-weight:700;line-height:1;padding:2px 6px;border-radius:var(--neu-radius-full);text-transform:uppercase;letter-spacing:.04em;transition:opacity .2s ease}.neu-nav__item-badge--default{background:var(--neu-surface-3);color:var(--neu-text-muted)}.neu-nav__item-badge--success{background:var(--neu-success-bg);color:var(--neu-success-text)}.neu-nav__item-badge--warning{background:var(--neu-warning-bg);color:var(--neu-warning-text)}.neu-nav__item-badge--danger{background:var(--neu-error-bg);color:var(--neu-error-text)}.neu-nav__item-badge--info{background:var(--neu-info-bg);color:var(--neu-info-text)}.neu-nav__group{display:flex;flex-direction:column}.neu-nav__group--open .neu-nav__group-chevron{transform:rotate(90deg)}.neu-nav__group--open>.neu-nav__item--parent{color:var(--neu-text);background:var(--neu-surface-2)}.neu-nav__group--open>.neu-nav__item--parent .neu-nav__item-icon{color:var(--neu-text-muted)}.neu-nav__submenu{display:flex;flex-direction:column;gap:1px;padding:2px 0 4px var(--neu-space-3);margin-top:2px;border-left:2px solid var(--neu-border);margin-left:calc(var(--neu-space-3) + 9px)}.neu-nav__submenu--nested{padding-left:var(--neu-space-2);margin-left:calc(var(--neu-space-2) + 7px);border-color:var(--neu-border);border-left-style:dashed}.neu-nav__item--grandchild{height:32px;padding-left:calc(var(--neu-space-2) + 4px);font-size:.75rem}.neu-nav__external-icon{flex-shrink:0;margin-left:auto;color:var(--neu-text-disabled);opacity:.7;transition:opacity var(--neu-transition),color var(--neu-transition)}.neu-nav__item:hover .neu-nav__external-icon{opacity:1;color:var(--neu-text-muted)}.neu-nav__footer{border-top:1px solid var(--neu-border);padding:var(--neu-space-3) var(--neu-space-4);flex-shrink:0;font-size:var(--neu-text-xs);color:var(--neu-text-muted);transition:opacity .2s ease,height .28s cubic-bezier(.4,0,.2,1)}.neu-nav--collapsed .neu-nav__item--parent:after{content:\"\\203a\";position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:11px;line-height:1;color:var(--neu-text-disabled);pointer-events:none}.neu-nav__flyout{position:fixed;z-index:1000;min-width:200px;max-width:240px;background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:8px;box-shadow:0 4px 20px #0000001f;padding:6px;margin-left:6px}.neu-nav__flyout-title{font-size:.6875rem;font-weight:700;color:var(--neu-text-muted);text-transform:uppercase;letter-spacing:.06em;padding:4px 8px 6px}.neu-nav__flyout-item{display:flex;align-items:center;gap:8px;height:34px;padding:0 8px;border-radius:6px;font-size:.8125rem;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;white-space:nowrap;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__flyout-item:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__flyout-item--active{background:var(--neu-primary-50);color:var(--neu-primary);font-weight:600}.neu-nav__flyout-item .neu-nav__external-icon{margin-left:auto;opacity:.6}.neu-nav__flyout-group{margin-top:4px;padding-top:4px;border-top:1px solid var(--neu-border)}.neu-nav__flyout-group-label{display:block;font-size:.6875rem;font-weight:600;color:var(--neu-text-disabled);text-transform:uppercase;letter-spacing:.05em;padding:2px 8px 4px}\n"] }]
942
+ `, styles: ["@charset \"UTF-8\";.neu-nav{display:flex;flex-direction:column;width:268px;height:100%;background:var(--neu-surface);border-right:1px solid var(--neu-border);transition:width .28s cubic-bezier(.4,0,.2,1);overflow:hidden;flex-shrink:0;-webkit-user-select:none;user-select:none}.neu-nav--collapsed{width:64px}.neu-nav--collapsed .neu-nav__brand{justify-content:center;padding:0;gap:0}.neu-nav--collapsed .neu-nav__brand-content{flex:0 0 0;width:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav--collapsed .neu-nav__items{padding-left:0;padding-right:0}.neu-nav--collapsed .neu-nav__item{justify-content:center;width:64px;padding:0;gap:0}.neu-nav--collapsed .neu-nav__item--parent .neu-nav__group-chevron{margin-left:0}.neu-nav--collapsed .neu-nav__item-label,.neu-nav--collapsed .neu-nav__item-badge,.neu-nav--collapsed .neu-nav__group-chevron,.neu-nav--collapsed .neu-nav__external-icon{flex:0 0 0;width:0;margin:0;opacity:0;overflow:hidden;pointer-events:none;white-space:nowrap}.neu-nav--collapsed .neu-nav__footer{height:0;opacity:0;overflow:hidden;pointer-events:none}.neu-nav__brand{display:flex;align-items:center;justify-content:space-between;min-height:64px;padding:0 var(--neu-space-4);border-bottom:1px solid var(--neu-border);flex-shrink:0;gap:var(--neu-space-3)}.neu-nav__brand-content{flex:1;min-width:0;display:flex;align-items:center;gap:10px;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1);overflow:hidden}.neu-nav__brand-icon{display:none;align-items:center;justify-content:center;width:64px;height:64px;flex-shrink:0;background:none;border:none;cursor:pointer;padding:0;color:inherit}.neu-nav__brand-icon:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav--collapsed .neu-nav__brand-icon{display:flex}.neu-nav-wrapper{position:relative;height:100%;flex-shrink:0;display:flex;--neu-nav-toggle-size: 28px;--neu-nav-toggle-offset-top: 18px;--neu-nav-toggle-bg: var(--neu-surface);--neu-nav-toggle-bg-hover: var(--neu-surface-2);--neu-nav-toggle-border: var(--neu-border);--neu-nav-toggle-color: var(--neu-text-muted);--neu-nav-toggle-color-hover: var(--neu-text);--neu-nav-toggle-shadow: 0 6px 14px color-mix(in srgb, var(--neu-text) 10%, transparent), inset 0 1px 0 color-mix(in srgb, var(--neu-surface) 82%, white)}.neu-nav__toggle-tab{position:absolute;right:calc(var(--neu-nav-toggle-size) / -2);top:var(--neu-nav-toggle-offset-top);transform:none;width:var(--neu-nav-toggle-size);height:var(--neu-nav-toggle-size);display:flex;align-items:center;justify-content:center;background:var(--neu-nav-toggle-bg);border:1px solid var(--neu-nav-toggle-border);border-radius:8px;color:var(--neu-nav-toggle-color);cursor:pointer;padding:0;z-index:10;box-shadow:var(--neu-nav-toggle-shadow);transition:background var(--neu-transition),border-color var(--neu-transition),box-shadow var(--neu-transition),color var(--neu-transition),transform .16s ease}.neu-nav__toggle-tab:hover{background:var(--neu-nav-toggle-bg-hover);border-color:color-mix(in srgb,var(--neu-nav-toggle-border) 55%,var(--neu-text));color:var(--neu-nav-toggle-color-hover);transform:translate(-1px)}.neu-nav__toggle-tab:active{transform:translate(-1px) scale(.96)}.neu-nav__toggle-tab:focus-visible{outline:none;box-shadow:var(--neu-focus-ring-strong),var(--neu-nav-toggle-shadow)}.neu-nav-wrapper--collapsed .neu-nav__toggle-tab:hover{transform:translate(1px)}.neu-nav-wrapper--collapsed .neu-nav__toggle-tab:active{transform:translate(1px) scale(.96)}.neu-nav__items{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--neu-space-3) var(--neu-space-2);display:flex;flex-direction:column;gap:2px}.neu-nav__items::-webkit-scrollbar{width:4px}.neu-nav__items::-webkit-scrollbar-track{background:transparent}.neu-nav__items::-webkit-scrollbar-thumb{background:var(--neu-border);border-radius:4px}.neu-nav__item{position:relative;display:flex;align-items:center;gap:10px;height:40px;padding:0 var(--neu-space-3);border-radius:8px;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;background:none;border:none;font-family:inherit;width:100%;text-align:left;transition:background var(--neu-transition),color var(--neu-transition);white-space:nowrap;flex-shrink:0}.neu-nav__item:focus-visible{outline:2px solid var(--neu-primary);outline-offset:-2px}.neu-nav__item:hover:not(.neu-nav__item--disabled){background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__item:hover:not(.neu-nav__item--disabled) .neu-nav__item-icon{color:var(--neu-text)}.neu-nav__item--active{background:var(--neu-primary-50);color:var(--neu-primary-dark, var(--neu-primary));font-weight:600}.neu-nav__item--active .neu-nav__item-icon{color:var(--neu-primary-dark, var(--neu-primary))}.neu-nav__item--active:before{content:\"\";position:absolute;left:0;top:6px;bottom:6px;width:3px;background:var(--neu-primary-dark, var(--neu-primary));border-radius:0 var(--neu-radius-full) var(--neu-radius-full) 0}.neu-nav__item--disabled{opacity:1;color:var(--neu-text-disabled);cursor:not-allowed;pointer-events:none}.neu-nav__item--disabled .neu-nav__item-icon{color:var(--neu-text-disabled)}.neu-nav__item--child{height:36px;padding-left:calc(var(--neu-space-3) + 6px);font-size:.8125rem}.neu-nav__item--parent .neu-nav__group-chevron{margin-left:auto;flex-shrink:0;transition:transform var(--neu-transition);color:var(--neu-text-disabled)}.neu-nav__item-icon{flex-shrink:0;color:var(--neu-text-disabled);transition:color var(--neu-transition)}.neu-nav__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s ease,width .28s cubic-bezier(.4,0,.2,1)}.neu-nav__item-badge{flex-shrink:0;font-size:10px;font-weight:700;line-height:1;padding:2px 6px;border-radius:var(--neu-radius-full);text-transform:uppercase;letter-spacing:.04em;transition:opacity .2s ease}.neu-nav__item-badge--default{background:var(--neu-surface-3);color:var(--neu-text-muted)}.neu-nav__item-badge--success{background:var(--neu-success-bg);color:var(--neu-success-text)}.neu-nav__item-badge--warning{background:var(--neu-warning-bg);color:var(--neu-warning-text)}.neu-nav__item-badge--danger{background:var(--neu-error-bg);color:var(--neu-error-text)}.neu-nav__item-badge--info{background:var(--neu-info-bg);color:var(--neu-info-text)}.neu-nav__group{display:flex;flex-direction:column}.neu-nav__group--open .neu-nav__group-chevron{transform:rotate(90deg)}.neu-nav__group--open>.neu-nav__item--parent{color:var(--neu-text);background:var(--neu-surface-2)}.neu-nav__group--open>.neu-nav__item--parent .neu-nav__item-icon{color:var(--neu-text-muted)}.neu-nav__submenu{display:flex;flex-direction:column;gap:1px;padding:2px 0 4px var(--neu-space-3);margin-top:2px;border-left:2px solid var(--neu-border);margin-left:calc(var(--neu-space-3) + 9px)}.neu-nav__submenu--nested{padding-left:var(--neu-space-2);margin-left:calc(var(--neu-space-2) + 7px);border-color:var(--neu-border);border-left-style:dashed}.neu-nav__item--grandchild{height:32px;padding-left:calc(var(--neu-space-2) + 4px);font-size:.75rem}.neu-nav__external-icon{flex-shrink:0;margin-left:auto;color:var(--neu-text-disabled);opacity:.7;transition:opacity var(--neu-transition),color var(--neu-transition)}.neu-nav__item:hover .neu-nav__external-icon{opacity:1;color:var(--neu-text-muted)}.neu-nav__footer{border-top:1px solid var(--neu-border);padding:var(--neu-space-3) var(--neu-space-4);flex-shrink:0;font-size:var(--neu-text-xs);color:var(--neu-text-muted);transition:opacity .2s ease,height .28s cubic-bezier(.4,0,.2,1)}.neu-nav--collapsed .neu-nav__item--parent:after{content:\"\\203a\";position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:11px;line-height:1;color:var(--neu-text-disabled);pointer-events:none}.neu-nav__flyout{position:fixed;z-index:1000;min-width:200px;max-width:240px;background:var(--neu-surface);border:1px solid var(--neu-border);border-radius:8px;box-shadow:0 4px 20px #0000001f;padding:6px;margin-left:6px}.neu-nav__flyout-title{font-size:.6875rem;font-weight:700;color:var(--neu-text-muted);text-transform:uppercase;letter-spacing:.06em;padding:4px 8px 6px}.neu-nav__flyout-item{display:flex;align-items:center;gap:8px;height:34px;padding:0 8px;border-radius:6px;font-size:.8125rem;color:var(--neu-text-muted);text-decoration:none;cursor:pointer;white-space:nowrap;transition:background var(--neu-transition),color var(--neu-transition)}.neu-nav__flyout-item:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-nav__flyout-item--active{background:var(--neu-primary-50);color:var(--neu-primary);font-weight:600}.neu-nav__flyout-item .neu-nav__external-icon{margin-left:auto;opacity:.6}.neu-nav__flyout-group{margin-top:4px;padding-top:4px;border-top:1px solid var(--neu-border)}.neu-nav__flyout-group-label{display:block;font-size:.6875rem;font-weight:600;color:var(--neu-text-disabled);text-transform:uppercase;letter-spacing:.05em;padding:2px 8px 4px}\n"] }]
943
943
  }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], expandLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandLabel", required: false }] }], collapseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseLabel", required: false }] }], collapsedChange: [{ type: i0.Output, args: ["collapsedChange"] }] } });
944
944
 
945
945
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-nav.mjs","sources":["../../../../projects/ui-core/nav/neu-nav.component.ts","../../../../projects/ui-core/nav/neural-ui-core-nav.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ViewEncapsulation,\n afterNextRender,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n} from '@angular/core';\nimport { RouterLink, RouterLinkActive, Router, NavigationEnd } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\nimport { NeuTooltipDirective } from '@neural-ui/core/tooltip';\n\n// ---- Tipos públicos / Public types ----\n\n/**\n * Ítem de navegación con soporte para 3 niveles de profundidad.\n *\n * Destino del enlace — usa UNO de los dos:\n * - `route` → navegación interna Angular (RouterLink)\n * - `href` → URL externa, se abre en nueva pestaña con rel=\"noopener noreferrer\"\n *\n * Los ítems con `children` actúan como grupo acordeón (sin destino propio).\n * Máximo 3 niveles: raíz → hijos → nietos.\n * Los nietos no pueden tener `children`.\n */\nexport interface NeuNavItem {\n id: string;\n label: string;\n icon: string;\n /** Ruta Angular interna (RouterLink). Excluye `href`. / Internal Angular route (RouterLink). Excludes `href`. */\n route?: string;\n /** URL externa. Se abre en nueva pestaña. Excluye `route`. / External URL. Opens in a new tab. Excludes `route`. */\n href?: string;\n /** Ítems hijo (nivel 2). Cada hijo puede tener sus propios `children` (nivel 3). / Child items (level 2). Each child can have its own `children` (level 3). */\n children?: NeuNavItem[];\n badge?: string;\n badgeVariant?: 'default' | 'success' | 'warning' | 'danger' | 'info';\n disabled?: boolean;\n}\n\n@Component({\n selector: 'neu-nav',\n imports: [RouterLink, RouterLinkActive, NeuIconComponent, NeuTooltipDirective],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-nav-wrapper\" [class.neu-nav-wrapper--collapsed]=\"isCollapsed()\">\n <nav\n class=\"neu-nav\"\n [class.neu-nav--collapsed]=\"isCollapsed()\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <!-- Brand slot -->\n <div class=\"neu-nav__brand\">\n <!-- Icono visible solo en modo colapsado -->\n <div class=\"neu-nav__brand-icon\">\n <ng-content select=\"[neu-nav-brand-icon]\" />\n </div>\n <!-- Contenido completo visible en modo expandido -->\n <div class=\"neu-nav__brand-content\">\n <ng-content select=\"[neu-nav-brand]\" />\n </div>\n </div>\n\n <!-- Items (nivel 1) -->\n <div class=\"neu-nav__items\" role=\"list\">\n @for (item of items(); track item.id) {\n @if (item.children?.length) {\n <!-- NIVEL 1 — Grupo acordeón -->\n <div\n class=\"neu-nav__group\"\n [class.neu-nav__group--open]=\"isGroupOpen(item.id)\"\n role=\"listitem\"\n (mouseenter)=\"onGroupMouseEnter(item, $event)\"\n (mouseleave)=\"onGroupMouseLeave()\"\n >\n <button\n class=\"neu-nav__item neu-nav__item--parent\"\n type=\"button\"\n [class.neu-nav__item--active]=\"isGroupActive(item)\"\n [class.neu-nav__item--disabled]=\"item.disabled\"\n [attr.aria-expanded]=\"isGroupOpen(item.id)\"\n [attr.aria-haspopup]=\"true\"\n [attr.disabled]=\"item.disabled ? '' : null\"\n [neuTooltip]=\"isCollapsed() ? item.label : ''\"\n neuTooltipPosition=\"right\"\n (click)=\"!isCollapsed() && toggleGroup(item.id)\"\n >\n <neu-icon\n [name]=\"item.icon\"\n size=\"18px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ item.label }}</span>\n @if (item.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n item.badgeVariant ?? 'default'\n }}\"\n >{{ item.badge }}</span\n >\n }\n <neu-icon\n name=\"lucideChevronRight\"\n size=\"14px\"\n class=\"neu-nav__group-chevron\"\n aria-hidden=\"true\"\n />\n </button>\n\n <!-- Submenú nivel 2 -->\n @if (!isCollapsed() && isGroupOpen(item.id)) {\n <div class=\"neu-nav__submenu\" role=\"list\">\n @for (child of item.children; track child.id) {\n @if (child.children?.length) {\n <!-- NIVEL 2 — Subgrupo acordeón -->\n <div\n class=\"neu-nav__group neu-nav__group--nested\"\n [class.neu-nav__group--open]=\"isGroupOpen(child.id)\"\n role=\"listitem\"\n >\n <button\n class=\"neu-nav__item neu-nav__item--child neu-nav__item--parent\"\n type=\"button\"\n [class.neu-nav__item--active]=\"isGroupActive(child)\"\n [class.neu-nav__item--disabled]=\"child.disabled\"\n [attr.aria-expanded]=\"isGroupOpen(child.id)\"\n [attr.aria-haspopup]=\"true\"\n [attr.disabled]=\"child.disabled ? '' : null\"\n (click)=\"toggleGroup(child.id)\"\n >\n <neu-icon\n [name]=\"child.icon\"\n size=\"15px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ child.label }}</span>\n @if (child.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n child.badgeVariant ?? 'default'\n }}\"\n >{{ child.badge }}</span\n >\n }\n <neu-icon\n name=\"lucideChevronRight\"\n size=\"13px\"\n class=\"neu-nav__group-chevron\"\n aria-hidden=\"true\"\n />\n </button>\n\n <!-- Submenú nivel 3 -->\n @if (isGroupOpen(child.id)) {\n <div class=\"neu-nav__submenu neu-nav__submenu--nested\" role=\"list\">\n @for (grand of child.children; track grand.id) {\n @if (grand.href) {\n <!-- NIVEL 3 — Enlace externo -->\n <a\n class=\"neu-nav__item neu-nav__item--grandchild\"\n [class.neu-nav__item--disabled]=\"grand.disabled\"\n [href]=\"grand.disabled ? null : grand.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-disabled]=\"grand.disabled ? 'true' : null\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"grand.icon\"\n size=\"14px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ grand.label }}</span>\n <neu-icon\n name=\"lucideExternalLink\"\n size=\"11px\"\n class=\"neu-nav__external-icon\"\n aria-hidden=\"true\"\n />\n </a>\n } @else {\n <!-- NIVEL 3 — Enlace interno -->\n <a\n class=\"neu-nav__item neu-nav__item--grandchild\"\n [class.neu-nav__item--disabled]=\"grand.disabled\"\n [routerLink]=\"grand.disabled ? null : (grand.route ?? null)\"\n routerLinkActive=\"neu-nav__item--active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n [attr.aria-current]=\"\n isCurrentRoute(grand.route ?? '') ? 'page' : null\n \"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"grand.icon\"\n size=\"14px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ grand.label }}</span>\n @if (grand.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n grand.badgeVariant ?? 'default'\n }}\"\n >{{ grand.badge }}</span\n >\n }\n </a>\n }\n }\n </div>\n }\n </div>\n } @else if (child.href) {\n <!-- NIVEL 2 — Enlace externo -->\n <a\n class=\"neu-nav__item neu-nav__item--child\"\n [class.neu-nav__item--disabled]=\"child.disabled\"\n [href]=\"child.disabled ? null : child.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"child.icon\"\n size=\"15px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ child.label }}</span>\n @if (child.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n child.badgeVariant ?? 'default'\n }}\"\n >{{ child.badge }}</span\n >\n }\n <neu-icon\n name=\"lucideExternalLink\"\n size=\"12px\"\n class=\"neu-nav__external-icon\"\n aria-hidden=\"true\"\n />\n </a>\n } @else {\n <!-- NIVEL 2 — Enlace interno -->\n <a\n class=\"neu-nav__item neu-nav__item--child\"\n [class.neu-nav__item--disabled]=\"child.disabled\"\n [routerLink]=\"child.disabled ? null : (child.route ?? null)\"\n routerLinkActive=\"neu-nav__item--active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n [attr.aria-current]=\"isCurrentRoute(child.route ?? '') ? 'page' : null\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"child.icon\"\n size=\"15px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ child.label }}</span>\n @if (child.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n child.badgeVariant ?? 'default'\n }}\"\n >{{ child.badge }}</span\n >\n }\n </a>\n }\n }\n </div>\n }\n </div>\n } @else if (item.href) {\n <!-- NIVEL 1 — Enlace externo -->\n <a\n class=\"neu-nav__item\"\n [class.neu-nav__item--disabled]=\"item.disabled\"\n [href]=\"item.disabled ? null : item.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [neuTooltip]=\"isCollapsed() ? item.label : ''\"\n neuTooltipPosition=\"right\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"item.icon\"\n size=\"18px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ item.label }}</span>\n @if (item.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n item.badgeVariant ?? 'default'\n }}\"\n >{{ item.badge }}</span\n >\n }\n <neu-icon\n name=\"lucideExternalLink\"\n size=\"13px\"\n class=\"neu-nav__external-icon\"\n aria-hidden=\"true\"\n />\n </a>\n } @else {\n <!-- NIVEL 1 — Enlace interno -->\n <a\n class=\"neu-nav__item\"\n [class.neu-nav__item--disabled]=\"item.disabled\"\n [routerLink]=\"item.disabled ? null : (item.route ?? null)\"\n routerLinkActive=\"neu-nav__item--active\"\n [routerLinkActiveOptions]=\"{ exact: item.route === '/' }\"\n [attr.aria-current]=\"isCurrentRoute(item.route ?? '') ? 'page' : null\"\n [neuTooltip]=\"isCollapsed() ? item.label : ''\"\n neuTooltipPosition=\"right\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"item.icon\"\n size=\"18px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ item.label }}</span>\n @if (item.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n item.badgeVariant ?? 'default'\n }}\"\n >{{ item.badge }}</span\n >\n }\n </a>\n }\n }\n </div>\n\n <!-- Footer slot -->\n <div class=\"neu-nav__footer\">\n <ng-content select=\"[neu-nav-footer]\" />\n </div>\n </nav>\n\n <!-- Flyout panel para grupos en modo colapsado -->\n @if (flyoutState(); as flyout) {\n <div\n class=\"neu-nav__flyout\"\n [style.top.px]=\"flyout.top\"\n [style.left.px]=\"flyout.left\"\n role=\"menu\"\n (mouseenter)=\"onFlyoutMouseEnter()\"\n (mouseleave)=\"onFlyoutMouseLeave()\"\n >\n <div class=\"neu-nav__flyout-title\">{{ flyout.item.label }}</div>\n @for (child of flyout.item.children ?? []; track child.id) {\n @if (child.children?.length) {\n <div class=\"neu-nav__flyout-group\">\n <span class=\"neu-nav__flyout-group-label\">{{ child.label }}</span>\n @for (grand of child.children; track grand.id) {\n @if (grand.href) {\n <a\n class=\"neu-nav__flyout-item\"\n role=\"menuitem\"\n [href]=\"grand.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"flyoutState.set(null)\"\n >\n <neu-icon [name]=\"grand.icon\" size=\"13px\" aria-hidden=\"true\" />\n <span>{{ grand.label }}</span>\n <neu-icon\n name=\"lucideExternalLink\"\n size=\"10px\"\n class=\"neu-nav__external-icon\"\n />\n </a>\n } @else {\n <a\n class=\"neu-nav__flyout-item\"\n role=\"menuitem\"\n [routerLink]=\"grand.route\"\n routerLinkActive=\"neu-nav__flyout-item--active\"\n (click)=\"flyoutState.set(null)\"\n >\n <neu-icon [name]=\"grand.icon\" size=\"13px\" aria-hidden=\"true\" />\n <span>{{ grand.label }}</span>\n </a>\n }\n }\n </div>\n } @else if (child.href) {\n <a\n class=\"neu-nav__flyout-item\"\n role=\"menuitem\"\n [href]=\"child.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"flyoutState.set(null)\"\n >\n <neu-icon [name]=\"child.icon\" size=\"13px\" aria-hidden=\"true\" />\n <span>{{ child.label }}</span>\n <neu-icon name=\"lucideExternalLink\" size=\"10px\" class=\"neu-nav__external-icon\" />\n </a>\n } @else {\n <a\n class=\"neu-nav__flyout-item\"\n role=\"menuitem\"\n [routerLink]=\"child.route\"\n routerLinkActive=\"neu-nav__flyout-item--active\"\n (click)=\"flyoutState.set(null)\"\n >\n <neu-icon [name]=\"child.icon\" size=\"13px\" aria-hidden=\"true\" />\n <span>{{ child.label }}</span>\n </a>\n }\n }\n </div>\n }\n\n <!-- Pestaña collapse/expand — fuera del nav para no ser recortada -->\n @if (collapsible()) {\n <button\n class=\"neu-nav__toggle-tab\"\n type=\"button\"\n [attr.aria-label]=\"isCollapsed() ? expandLabel() : collapseLabel()\"\n [attr.aria-expanded]=\"!isCollapsed()\"\n (click)=\"toggleCollapse()\"\n >\n <neu-icon\n [name]=\"isCollapsed() ? 'lucideChevronRight' : 'lucideChevronLeft'\"\n size=\"12px\"\n aria-hidden=\"true\"\n />\n </button>\n }\n </div>\n `,\n styleUrl: './neu-nav.component.scss',\n})\nexport class NeuNavComponent {\n private readonly router = inject(Router);\n\n // ---- Señal reactiva de ruta activa / Reactive active route signal ----\n private readonly currentUrl = toSignal(\n this.router.events.pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd)),\n { initialValue: null },\n );\n\n // ---- Inputs ----\n\n /** Lista de ítems de navegación / Navigation item list */\n items = input<NeuNavItem[]>([]);\n\n /** Estado inicial colapsado / Initial collapsed state */\n collapsed = input<boolean>(false);\n\n /** Muestra el botón de colapsar/expandir / Shows the collapse/expand button */\n collapsible = input<boolean>(true);\n\n /** Etiqueta accesible del <nav> / Accessible label for the <nav> */\n ariaLabel = input<string>('Navegación principal');\n\n /** Aria-label del botón cuando el nav está colapsado / Aria-label for the button when the nav is collapsed */\n expandLabel = input<string>('Expandir menú');\n\n /** Aria-label del botón cuando el nav está expandido / Aria-label for the button when the nav is expanded */\n collapseLabel = input<string>('Colapsar menú');\n\n /** Emite cuando cambia el estado colapsado / Emits when the collapsed state changes */\n collapsedChange = output<boolean>();\n\n // ---- Estado interno / Internal state ----\n\n // Sigue el input `collapsed` del padre (permite el configurador)\n // pero puede ser sobreescrito localmente con toggleCollapse()\n readonly isCollapsed = linkedSignal(() => this.collapsed());\n private readonly openGroups = signal<Set<string>>(new Set());\n\n // ---- Flyout para modo colapsado / Flyout for collapsed mode ----\n readonly flyoutState = signal<{ item: NeuNavItem; top: number; left: number } | null>(null);\n private _flyoutTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n // Abrimos el grupo activo DESPUÉS de que el padre haya pasado los inputs\n afterNextRender(() => this._openActiveGroup());\n // Limpiamos el timer del flyout al destruir el componente\n inject(DestroyRef).onDestroy(() => {\n if (this._flyoutTimer) clearTimeout(this._flyoutTimer);\n });\n }\n\n // ---- Helpers de estado / State helpers ----\n\n toggleCollapse(): void {\n this.isCollapsed.update((v) => {\n const next = !v;\n this.collapsedChange.emit(next);\n return next;\n });\n }\n\n toggleGroup(id: string): void {\n this.openGroups.update((s) => {\n const next = new Set(s);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n isGroupOpen(id: string): boolean {\n return this.openGroups().has(id);\n }\n\n isCurrentRoute(route: string): boolean {\n if (!route) return false;\n // Consume la señal para que OnPush re-evalúe tras navegación\n this.currentUrl();\n return this.router.url === route || this.router.url.startsWith(route + '?');\n }\n\n isGroupActive(item: NeuNavItem): boolean {\n if (!item.children?.length) return false;\n return item.children.some(\n (c) =>\n this.isCurrentRoute(c.route ?? '') ||\n (c.children?.some((g) => this.isCurrentRoute(g.route ?? '')) ?? false),\n );\n }\n\n // ---- Flyout handlers ----\n\n onGroupMouseEnter(item: NeuNavItem, event: MouseEvent): void {\n if (!this.isCollapsed() || !item.children?.length) return;\n if (this._flyoutTimer) {\n clearTimeout(this._flyoutTimer);\n this._flyoutTimer = null;\n }\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.flyoutState.set({ item, top: rect.top, left: rect.right });\n }\n\n onGroupMouseLeave(): void {\n if (!this.isCollapsed()) return;\n this._flyoutTimer = setTimeout(() => this.flyoutState.set(null), 150);\n }\n\n onFlyoutMouseEnter(): void {\n if (this._flyoutTimer) {\n clearTimeout(this._flyoutTimer);\n this._flyoutTimer = null;\n }\n }\n\n onFlyoutMouseLeave(): void {\n this._flyoutTimer = setTimeout(() => this.flyoutState.set(null), 150);\n }\n\n private _openActiveGroup(): void {\n const toOpen = new Set<string>();\n for (const item of this.items()) {\n if (!item.children) continue;\n for (const child of item.children) {\n if (child.route && this.router.url.startsWith(child.route)) {\n toOpen.add(item.id);\n }\n if (child.children) {\n for (const grand of child.children) {\n if (grand.route && this.router.url.startsWith(grand.route)) {\n toOpen.add(item.id);\n toOpen.add(child.id);\n }\n }\n }\n }\n }\n if (toOpen.size > 0) {\n this.openGroups.set(toOpen);\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-nav.mjs","sources":["../../../../projects/ui-core/nav/neu-nav.component.ts","../../../../projects/ui-core/nav/neural-ui-core-nav.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ViewEncapsulation,\n afterNextRender,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n} from '@angular/core';\nimport { RouterLink, RouterLinkActive, Router, NavigationEnd } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NeuIconComponent } from '@neural-ui/core/icon';\nimport { NeuTooltipDirective } from '@neural-ui/core/tooltip';\n\n// ---- Tipos públicos / Public types ----\n\n/**\n * Ítem de navegación con soporte para 3 niveles de profundidad.\n *\n * Destino del enlace — usa UNO de los dos:\n * - `route` → navegación interna Angular (RouterLink)\n * - `href` → URL externa, se abre en nueva pestaña con rel=\"noopener noreferrer\"\n *\n * Los ítems con `children` actúan como grupo acordeón (sin destino propio).\n * Máximo 3 niveles: raíz → hijos → nietos.\n * Los nietos no pueden tener `children`.\n */\nexport interface NeuNavItem {\n id: string;\n label: string;\n icon: string;\n /** Ruta Angular interna (RouterLink). Excluye `href`. / Internal Angular route (RouterLink). Excludes `href`. */\n route?: string;\n /** URL externa. Se abre en nueva pestaña. Excluye `route`. / External URL. Opens in a new tab. Excludes `route`. */\n href?: string;\n /** Ítems hijo (nivel 2). Cada hijo puede tener sus propios `children` (nivel 3). / Child items (level 2). Each child can have its own `children` (level 3). */\n children?: NeuNavItem[];\n badge?: string;\n badgeVariant?: 'default' | 'success' | 'warning' | 'danger' | 'info';\n disabled?: boolean;\n}\n\n@Component({\n selector: 'neu-nav',\n imports: [RouterLink, RouterLinkActive, NeuIconComponent, NeuTooltipDirective],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"neu-nav-wrapper\" [class.neu-nav-wrapper--collapsed]=\"isCollapsed()\">\n <nav\n class=\"neu-nav\"\n [class.neu-nav--collapsed]=\"isCollapsed()\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <!-- Brand slot -->\n <div class=\"neu-nav__brand\">\n <!-- Icono visible solo en modo colapsado -->\n <div class=\"neu-nav__brand-icon\">\n <ng-content select=\"[neu-nav-brand-icon]\" />\n </div>\n <!-- Contenido completo visible en modo expandido -->\n <div class=\"neu-nav__brand-content\">\n <ng-content select=\"[neu-nav-brand]\" />\n </div>\n </div>\n\n <!-- Items (nivel 1) -->\n <div class=\"neu-nav__items\" role=\"list\">\n @for (item of items(); track item.id) {\n @if (item.children?.length) {\n <!-- NIVEL 1 — Grupo acordeón -->\n <div\n class=\"neu-nav__group\"\n [class.neu-nav__group--open]=\"isGroupOpen(item.id)\"\n role=\"listitem\"\n (mouseenter)=\"onGroupMouseEnter(item, $event)\"\n (mouseleave)=\"onGroupMouseLeave()\"\n >\n <button\n class=\"neu-nav__item neu-nav__item--parent\"\n type=\"button\"\n [class.neu-nav__item--active]=\"isGroupActive(item)\"\n [class.neu-nav__item--disabled]=\"item.disabled\"\n [attr.aria-expanded]=\"isGroupOpen(item.id)\"\n [attr.aria-haspopup]=\"true\"\n [attr.disabled]=\"item.disabled ? '' : null\"\n [neuTooltip]=\"isCollapsed() ? item.label : ''\"\n neuTooltipPosition=\"right\"\n (click)=\"!isCollapsed() && toggleGroup(item.id)\"\n >\n <neu-icon\n [name]=\"item.icon\"\n size=\"18px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ item.label }}</span>\n @if (item.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n item.badgeVariant ?? 'default'\n }}\"\n >{{ item.badge }}</span\n >\n }\n <neu-icon\n name=\"lucideChevronRight\"\n size=\"14px\"\n class=\"neu-nav__group-chevron\"\n aria-hidden=\"true\"\n />\n </button>\n\n <!-- Submenú nivel 2 -->\n @if (!isCollapsed() && isGroupOpen(item.id)) {\n <div class=\"neu-nav__submenu\" role=\"list\">\n @for (child of item.children; track child.id) {\n @if (child.children?.length) {\n <!-- NIVEL 2 — Subgrupo acordeón -->\n <div\n class=\"neu-nav__group neu-nav__group--nested\"\n [class.neu-nav__group--open]=\"isGroupOpen(child.id)\"\n role=\"listitem\"\n >\n <button\n class=\"neu-nav__item neu-nav__item--child neu-nav__item--parent\"\n type=\"button\"\n [class.neu-nav__item--active]=\"isGroupActive(child)\"\n [class.neu-nav__item--disabled]=\"child.disabled\"\n [attr.aria-expanded]=\"isGroupOpen(child.id)\"\n [attr.aria-haspopup]=\"true\"\n [attr.disabled]=\"child.disabled ? '' : null\"\n (click)=\"toggleGroup(child.id)\"\n >\n <neu-icon\n [name]=\"child.icon\"\n size=\"15px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ child.label }}</span>\n @if (child.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n child.badgeVariant ?? 'default'\n }}\"\n >{{ child.badge }}</span\n >\n }\n <neu-icon\n name=\"lucideChevronRight\"\n size=\"13px\"\n class=\"neu-nav__group-chevron\"\n aria-hidden=\"true\"\n />\n </button>\n\n <!-- Submenú nivel 3 -->\n @if (isGroupOpen(child.id)) {\n <div class=\"neu-nav__submenu neu-nav__submenu--nested\" role=\"list\">\n @for (grand of child.children; track grand.id) {\n @if (grand.href) {\n <!-- NIVEL 3 — Enlace externo -->\n <a\n class=\"neu-nav__item neu-nav__item--grandchild\"\n [class.neu-nav__item--disabled]=\"grand.disabled\"\n [href]=\"grand.disabled ? null : grand.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-disabled]=\"grand.disabled ? 'true' : null\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"grand.icon\"\n size=\"14px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ grand.label }}</span>\n <neu-icon\n name=\"lucideExternalLink\"\n size=\"11px\"\n class=\"neu-nav__external-icon\"\n aria-hidden=\"true\"\n />\n </a>\n } @else {\n <!-- NIVEL 3 — Enlace interno -->\n <a\n class=\"neu-nav__item neu-nav__item--grandchild\"\n [class.neu-nav__item--disabled]=\"grand.disabled\"\n [routerLink]=\"grand.disabled ? null : (grand.route ?? null)\"\n routerLinkActive=\"neu-nav__item--active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n [attr.aria-current]=\"\n isCurrentRoute(grand.route ?? '') ? 'page' : null\n \"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"grand.icon\"\n size=\"14px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ grand.label }}</span>\n @if (grand.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n grand.badgeVariant ?? 'default'\n }}\"\n >{{ grand.badge }}</span\n >\n }\n </a>\n }\n }\n </div>\n }\n </div>\n } @else if (child.href) {\n <!-- NIVEL 2 — Enlace externo -->\n <a\n class=\"neu-nav__item neu-nav__item--child\"\n [class.neu-nav__item--disabled]=\"child.disabled\"\n [href]=\"child.disabled ? null : child.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-disabled]=\"child.disabled ? 'true' : null\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"child.icon\"\n size=\"15px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ child.label }}</span>\n @if (child.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n child.badgeVariant ?? 'default'\n }}\"\n >{{ child.badge }}</span\n >\n }\n <neu-icon\n name=\"lucideExternalLink\"\n size=\"12px\"\n class=\"neu-nav__external-icon\"\n aria-hidden=\"true\"\n />\n </a>\n } @else {\n <!-- NIVEL 2 — Enlace interno -->\n <a\n class=\"neu-nav__item neu-nav__item--child\"\n [class.neu-nav__item--disabled]=\"child.disabled\"\n [routerLink]=\"child.disabled ? null : (child.route ?? null)\"\n routerLinkActive=\"neu-nav__item--active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n [attr.aria-current]=\"isCurrentRoute(child.route ?? '') ? 'page' : null\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"child.icon\"\n size=\"15px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ child.label }}</span>\n @if (child.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n child.badgeVariant ?? 'default'\n }}\"\n >{{ child.badge }}</span\n >\n }\n </a>\n }\n }\n </div>\n }\n </div>\n } @else if (item.href) {\n <!-- NIVEL 1 — Enlace externo -->\n <a\n class=\"neu-nav__item\"\n [class.neu-nav__item--disabled]=\"item.disabled\"\n [href]=\"item.disabled ? null : item.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [neuTooltip]=\"isCollapsed() ? item.label : ''\"\n neuTooltipPosition=\"right\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"item.icon\"\n size=\"18px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ item.label }}</span>\n @if (item.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n item.badgeVariant ?? 'default'\n }}\"\n >{{ item.badge }}</span\n >\n }\n <neu-icon\n name=\"lucideExternalLink\"\n size=\"13px\"\n class=\"neu-nav__external-icon\"\n aria-hidden=\"true\"\n />\n </a>\n } @else {\n <!-- NIVEL 1 — Enlace interno -->\n <a\n class=\"neu-nav__item\"\n [class.neu-nav__item--disabled]=\"item.disabled\"\n [routerLink]=\"item.disabled ? null : (item.route ?? null)\"\n routerLinkActive=\"neu-nav__item--active\"\n [routerLinkActiveOptions]=\"{ exact: item.route === '/' }\"\n [attr.aria-current]=\"isCurrentRoute(item.route ?? '') ? 'page' : null\"\n [neuTooltip]=\"isCollapsed() ? item.label : ''\"\n neuTooltipPosition=\"right\"\n role=\"listitem\"\n >\n <neu-icon\n [name]=\"item.icon\"\n size=\"18px\"\n class=\"neu-nav__item-icon\"\n aria-hidden=\"true\"\n />\n <span class=\"neu-nav__item-label\">{{ item.label }}</span>\n @if (item.badge) {\n <span\n class=\"neu-nav__item-badge neu-nav__item-badge--{{\n item.badgeVariant ?? 'default'\n }}\"\n >{{ item.badge }}</span\n >\n }\n </a>\n }\n }\n </div>\n\n <!-- Footer slot -->\n <div class=\"neu-nav__footer\">\n <ng-content select=\"[neu-nav-footer]\" />\n </div>\n </nav>\n\n <!-- Flyout panel para grupos en modo colapsado -->\n @if (flyoutState(); as flyout) {\n <div\n class=\"neu-nav__flyout\"\n [style.top.px]=\"flyout.top\"\n [style.left.px]=\"flyout.left\"\n role=\"menu\"\n (mouseenter)=\"onFlyoutMouseEnter()\"\n (mouseleave)=\"onFlyoutMouseLeave()\"\n >\n <div class=\"neu-nav__flyout-title\">{{ flyout.item.label }}</div>\n @for (child of flyout.item.children ?? []; track child.id) {\n @if (child.children?.length) {\n <div class=\"neu-nav__flyout-group\">\n <span class=\"neu-nav__flyout-group-label\">{{ child.label }}</span>\n @for (grand of child.children; track grand.id) {\n @if (grand.href) {\n <a\n class=\"neu-nav__flyout-item\"\n role=\"menuitem\"\n [href]=\"grand.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"flyoutState.set(null)\"\n >\n <neu-icon [name]=\"grand.icon\" size=\"13px\" aria-hidden=\"true\" />\n <span>{{ grand.label }}</span>\n <neu-icon\n name=\"lucideExternalLink\"\n size=\"10px\"\n class=\"neu-nav__external-icon\"\n />\n </a>\n } @else {\n <a\n class=\"neu-nav__flyout-item\"\n role=\"menuitem\"\n [routerLink]=\"grand.route\"\n routerLinkActive=\"neu-nav__flyout-item--active\"\n (click)=\"flyoutState.set(null)\"\n >\n <neu-icon [name]=\"grand.icon\" size=\"13px\" aria-hidden=\"true\" />\n <span>{{ grand.label }}</span>\n </a>\n }\n }\n </div>\n } @else if (child.href) {\n <a\n class=\"neu-nav__flyout-item\"\n role=\"menuitem\"\n [href]=\"child.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"flyoutState.set(null)\"\n >\n <neu-icon [name]=\"child.icon\" size=\"13px\" aria-hidden=\"true\" />\n <span>{{ child.label }}</span>\n <neu-icon name=\"lucideExternalLink\" size=\"10px\" class=\"neu-nav__external-icon\" />\n </a>\n } @else {\n <a\n class=\"neu-nav__flyout-item\"\n role=\"menuitem\"\n [routerLink]=\"child.route\"\n routerLinkActive=\"neu-nav__flyout-item--active\"\n (click)=\"flyoutState.set(null)\"\n >\n <neu-icon [name]=\"child.icon\" size=\"13px\" aria-hidden=\"true\" />\n <span>{{ child.label }}</span>\n </a>\n }\n }\n </div>\n }\n\n <!-- Pestaña collapse/expand — fuera del nav para no ser recortada -->\n @if (collapsible()) {\n <button\n class=\"neu-nav__toggle-tab\"\n type=\"button\"\n [attr.aria-label]=\"isCollapsed() ? expandLabel() : collapseLabel()\"\n [attr.aria-expanded]=\"!isCollapsed()\"\n (click)=\"toggleCollapse()\"\n >\n <neu-icon\n [name]=\"isCollapsed() ? 'lucideChevronRight' : 'lucideChevronLeft'\"\n size=\"12px\"\n aria-hidden=\"true\"\n />\n </button>\n }\n </div>\n `,\n styleUrl: './neu-nav.component.scss',\n})\nexport class NeuNavComponent {\n private readonly router = inject(Router);\n\n // ---- Señal reactiva de ruta activa / Reactive active route signal ----\n private readonly currentUrl = toSignal(\n this.router.events.pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd)),\n { initialValue: null },\n );\n\n // ---- Inputs ----\n\n /** Lista de ítems de navegación / Navigation item list */\n items = input<NeuNavItem[]>([]);\n\n /** Estado inicial colapsado / Initial collapsed state */\n collapsed = input<boolean>(false);\n\n /** Muestra el botón de colapsar/expandir / Shows the collapse/expand button */\n collapsible = input<boolean>(true);\n\n /** Etiqueta accesible del <nav> / Accessible label for the <nav> */\n ariaLabel = input<string>('Navegación principal');\n\n /** Aria-label del botón cuando el nav está colapsado / Aria-label for the button when the nav is collapsed */\n expandLabel = input<string>('Expandir menú');\n\n /** Aria-label del botón cuando el nav está expandido / Aria-label for the button when the nav is expanded */\n collapseLabel = input<string>('Colapsar menú');\n\n /** Emite cuando cambia el estado colapsado / Emits when the collapsed state changes */\n collapsedChange = output<boolean>();\n\n // ---- Estado interno / Internal state ----\n\n // Sigue el input `collapsed` del padre (permite el configurador)\n // pero puede ser sobreescrito localmente con toggleCollapse()\n readonly isCollapsed = linkedSignal(() => this.collapsed());\n private readonly openGroups = signal<Set<string>>(new Set());\n\n // ---- Flyout para modo colapsado / Flyout for collapsed mode ----\n readonly flyoutState = signal<{ item: NeuNavItem; top: number; left: number } | null>(null);\n private _flyoutTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n // Abrimos el grupo activo DESPUÉS de que el padre haya pasado los inputs\n afterNextRender(() => this._openActiveGroup());\n // Limpiamos el timer del flyout al destruir el componente\n inject(DestroyRef).onDestroy(() => {\n if (this._flyoutTimer) clearTimeout(this._flyoutTimer);\n });\n }\n\n // ---- Helpers de estado / State helpers ----\n\n toggleCollapse(): void {\n this.isCollapsed.update((v) => {\n const next = !v;\n this.collapsedChange.emit(next);\n return next;\n });\n }\n\n toggleGroup(id: string): void {\n this.openGroups.update((s) => {\n const next = new Set(s);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n isGroupOpen(id: string): boolean {\n return this.openGroups().has(id);\n }\n\n isCurrentRoute(route: string): boolean {\n if (!route) return false;\n // Consume la señal para que OnPush re-evalúe tras navegación\n this.currentUrl();\n return this.router.url === route || this.router.url.startsWith(route + '?');\n }\n\n isGroupActive(item: NeuNavItem): boolean {\n if (!item.children?.length) return false;\n return item.children.some(\n (c) =>\n this.isCurrentRoute(c.route ?? '') ||\n (c.children?.some((g) => this.isCurrentRoute(g.route ?? '')) ?? false),\n );\n }\n\n // ---- Flyout handlers ----\n\n onGroupMouseEnter(item: NeuNavItem, event: MouseEvent): void {\n if (!this.isCollapsed() || !item.children?.length) return;\n if (this._flyoutTimer) {\n clearTimeout(this._flyoutTimer);\n this._flyoutTimer = null;\n }\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.flyoutState.set({ item, top: rect.top, left: rect.right });\n }\n\n onGroupMouseLeave(): void {\n if (!this.isCollapsed()) return;\n this._flyoutTimer = setTimeout(() => this.flyoutState.set(null), 150);\n }\n\n onFlyoutMouseEnter(): void {\n if (this._flyoutTimer) {\n clearTimeout(this._flyoutTimer);\n this._flyoutTimer = null;\n }\n }\n\n onFlyoutMouseLeave(): void {\n this._flyoutTimer = setTimeout(() => this.flyoutState.set(null), 150);\n }\n\n private _openActiveGroup(): void {\n const toOpen = new Set<string>();\n for (const item of this.items()) {\n if (!item.children) continue;\n for (const child of item.children) {\n if (child.route && this.router.url.startsWith(child.route)) {\n toOpen.add(item.id);\n }\n if (child.children) {\n for (const grand of child.children) {\n if (grand.route && this.router.url.startsWith(grand.route)) {\n toOpen.add(item.id);\n toOpen.add(child.id);\n }\n }\n }\n }\n }\n if (toOpen.size > 0) {\n this.openGroups.set(toOpen);\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,6 +1,6 @@
1
1
  import { makeEnvironmentProviders } from '@angular/core';
2
2
  import { provideIcons, provideNgIconsConfig } from '@ng-icons/core';
3
- import { lucideUpload, lucideMinus, lucideTrendingDown, lucideTrendingUp, lucideInbox, lucideExternalLink, lucideChevronLeft, lucideChevronRight, lucideX, lucideInfo, lucideAlertTriangle, lucideXCircle, lucideCheckCircle, lucideAlertCircle } from '@ng-icons/lucide';
3
+ import { lucideUpload, lucideMinus, lucideTrendingDown, lucideTrendingUp, lucideInbox, lucideExternalLink, lucideChevronLeft, lucideChevronRight, lucideX, lucideInfo, lucideTriangleAlert, lucideCircleX, lucideCircleCheck, lucideCircleAlert } from '@ng-icons/lucide';
4
4
 
5
5
  /**
6
6
  * Registra los providers necesarios para NeuralUI.
@@ -25,11 +25,11 @@ function provideNeuralUI(config = {}) {
25
25
  return makeEnvironmentProviders([
26
26
  provideIcons({
27
27
  // Input validation
28
- lucideAlertCircle,
28
+ lucideAlertCircle: lucideCircleAlert,
29
29
  // Toast severity icons
30
- lucideCheckCircle,
31
- lucideXCircle,
32
- lucideAlertTriangle,
30
+ lucideCheckCircle: lucideCircleCheck,
31
+ lucideXCircle: lucideCircleX,
32
+ lucideAlertTriangle: lucideTriangleAlert,
33
33
  lucideInfo,
34
34
  // Close buttons (sidebar, modal, toast)
35
35
  lucideX,
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core.mjs","sources":["../../../../projects/ui-core/provide-neural-ui.ts","../../../../projects/ui-core/public-api.ts","../../../../projects/ui-core/neural-ui-core.ts"],"sourcesContent":["import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideIcons, provideNgIconsConfig } from '@ng-icons/core';\nimport {\n lucideAlertCircle,\n lucideAlertTriangle,\n lucideCheckCircle,\n lucideChevronLeft,\n lucideChevronRight,\n lucideExternalLink,\n lucideInbox,\n lucideInfo,\n lucideMinus,\n lucideTrendingDown,\n lucideTrendingUp,\n lucideUpload,\n lucideX,\n lucideXCircle,\n} from '@ng-icons/lucide';\n\nexport interface NeuralUIConfig {\n /** Tamaño por defecto de los iconos. Por defecto: '1.25rem' / Default icon size. Default: '1.25rem' */\n iconSize?: string;\n /** Grosor de trazo de los iconos. Por defecto: '2' / Icon stroke width. Default: '2' */\n iconStrokeWidth?: string;\n}\n\n/**\n * Registra los providers necesarios para NeuralUI.\n *\n * Incluye los iconos internos de la librería y la configuración\n * por defecto de @ng-icons.\n *\n * @example\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideNeuralUI(),\n * ],\n * };\n *\n * @example\n * // Con opciones personalizadas\n * provideNeuralUI({ iconSize: '1rem', iconStrokeWidth: '1.5' })\n */\nexport function provideNeuralUI(config: NeuralUIConfig = {}): EnvironmentProviders {\n const { iconSize = '1.25rem', iconStrokeWidth = '2' } = config;\n\n return makeEnvironmentProviders([\n provideIcons({\n // Input validation\n lucideAlertCircle,\n // Toast severity icons\n lucideCheckCircle,\n lucideXCircle,\n lucideAlertTriangle,\n lucideInfo,\n // Close buttons (sidebar, modal, toast)\n lucideX,\n // Nav chevrons + collapse toggle\n lucideChevronRight,\n lucideChevronLeft,\n // Nav external link\n lucideExternalLink,\n // EmptyState default icon\n lucideInbox,\n // StatsCard trend icons\n lucideTrendingUp,\n lucideTrendingDown,\n lucideMinus,\n // Uploader picker-only trigger\n lucideUpload,\n }),\n provideNgIconsConfig({ size: iconSize, strokeWidth: iconStrokeWidth }),\n ]);\n}\n","/*\n * Public API Surface of @neural-ui/core\n *\n * The root entry point only exports the setup function.\n * Import individual components from their specific entry points:\n * import { NeuButtonComponent } from '@neural-ui/core/button';\n * import { NeuTableComponent } from '@neural-ui/core/table';\n *\n * La raíz solo exporta la función de setup.\n * Importa los componentes individuales desde sus entry points específicos.\n */\n\n// ── Setup ─────────────────────────────────────────────────────────────────\nexport * from './provide-neural-ui';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AA0BA;;;;;;;;;;;;;;;;;AAiBG;AACG,SAAU,eAAe,CAAC,MAAA,GAAyB,EAAE,EAAA;IACzD,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,eAAe,GAAG,GAAG,EAAE,GAAG,MAAM;AAE9D,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,YAAY,CAAC;;YAEX,iBAAiB;;YAEjB,iBAAiB;YACjB,aAAa;YACb,mBAAmB;YACnB,UAAU;;YAEV,OAAO;;YAEP,kBAAkB;YAClB,iBAAiB;;YAEjB,kBAAkB;;YAElB,WAAW;;YAEX,gBAAgB;YAChB,kBAAkB;YAClB,WAAW;;YAEX,YAAY;SACb,CAAC;QACF,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AACvE,KAAA,CAAC;AACJ;;AC1EA;;;;;;;;;;AAUG;AAEH;;ACZA;;AAEG;;;;"}
1
+ {"version":3,"file":"neural-ui-core.mjs","sources":["../../../../projects/ui-core/provide-neural-ui.ts","../../../../projects/ui-core/public-api.ts","../../../../projects/ui-core/neural-ui-core.ts"],"sourcesContent":["import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideIcons, provideNgIconsConfig } from '@ng-icons/core';\nimport {\n lucideChevronLeft,\n lucideChevronRight,\n lucideCircleAlert,\n lucideCircleCheck,\n lucideCircleX,\n lucideExternalLink,\n lucideInbox,\n lucideInfo,\n lucideMinus,\n lucideTriangleAlert,\n lucideTrendingDown,\n lucideTrendingUp,\n lucideUpload,\n lucideX,\n} from '@ng-icons/lucide';\n\nexport interface NeuralUIConfig {\n /** Tamaño por defecto de los iconos. Por defecto: '1.25rem' / Default icon size. Default: '1.25rem' */\n iconSize?: string;\n /** Grosor de trazo de los iconos. Por defecto: '2' / Icon stroke width. Default: '2' */\n iconStrokeWidth?: string;\n}\n\n/**\n * Registra los providers necesarios para NeuralUI.\n *\n * Incluye los iconos internos de la librería y la configuración\n * por defecto de @ng-icons.\n *\n * @example\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideNeuralUI(),\n * ],\n * };\n *\n * @example\n * // Con opciones personalizadas\n * provideNeuralUI({ iconSize: '1rem', iconStrokeWidth: '1.5' })\n */\nexport function provideNeuralUI(config: NeuralUIConfig = {}): EnvironmentProviders {\n const { iconSize = '1.25rem', iconStrokeWidth = '2' } = config;\n\n return makeEnvironmentProviders([\n provideIcons({\n // Input validation\n lucideAlertCircle: lucideCircleAlert,\n // Toast severity icons\n lucideCheckCircle: lucideCircleCheck,\n lucideXCircle: lucideCircleX,\n lucideAlertTriangle: lucideTriangleAlert,\n lucideInfo,\n // Close buttons (sidebar, modal, toast)\n lucideX,\n // Nav chevrons + collapse toggle\n lucideChevronRight,\n lucideChevronLeft,\n // Nav external link\n lucideExternalLink,\n // EmptyState default icon\n lucideInbox,\n // StatsCard trend icons\n lucideTrendingUp,\n lucideTrendingDown,\n lucideMinus,\n // Uploader picker-only trigger\n lucideUpload,\n }),\n provideNgIconsConfig({ size: iconSize, strokeWidth: iconStrokeWidth }),\n ]);\n}\n","/*\n * Public API Surface of @neural-ui/core\n *\n * The root entry point only exports the setup function.\n * Import individual components from their specific entry points:\n * import { NeuButtonComponent } from '@neural-ui/core/button';\n * import { NeuTableComponent } from '@neural-ui/core/table';\n *\n * La raíz solo exporta la función de setup.\n * Importa los componentes individuales desde sus entry points específicos.\n */\n\n// ── Setup ─────────────────────────────────────────────────────────────────\nexport * from './provide-neural-ui';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AA0BA;;;;;;;;;;;;;;;;;AAiBG;AACG,SAAU,eAAe,CAAC,MAAA,GAAyB,EAAE,EAAA;IACzD,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,eAAe,GAAG,GAAG,EAAE,GAAG,MAAM;AAE9D,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,YAAY,CAAC;;AAEX,YAAA,iBAAiB,EAAE,iBAAiB;;AAEpC,YAAA,iBAAiB,EAAE,iBAAiB;AACpC,YAAA,aAAa,EAAE,aAAa;AAC5B,YAAA,mBAAmB,EAAE,mBAAmB;YACxC,UAAU;;YAEV,OAAO;;YAEP,kBAAkB;YAClB,iBAAiB;;YAEjB,kBAAkB;;YAElB,WAAW;;YAEX,gBAAgB;YAChB,kBAAkB;YAClB,WAAW;;YAEX,YAAY;SACb,CAAC;QACF,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AACvE,KAAA,CAAC;AACJ;;AC1EA;;;;;;;;;;AAUG;AAEH;;ACZA;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neural-ui/core",
3
- "version": "1.6.3",
3
+ "version": "1.7.1",
4
4
  "description": "Modern Angular UI component library built with signals, standalone components, and OnPush change detection.",
5
5
  "author": "PedroMorenoTrujillo",
6
6
  "keywords": [
@@ -14,15 +14,15 @@
14
14
  ],
15
15
  "license": "MIT",
16
16
  "peerDependencies": {
17
- "@angular/cdk": ">=19.0.0 <22.0.0",
18
- "@angular/common": ">=19.0.0 <22.0.0",
19
- "@angular/core": ">=19.0.0 <22.0.0",
20
- "@angular/forms": ">=19.0.0 <22.0.0",
21
- "@angular/router": ">=19.0.0 <22.0.0",
22
- "@ng-icons/core": ">=33.0.0",
23
- "@ng-icons/lucide": ">=33.0.0",
24
- "apexcharts": ">=5.0.0",
25
- "ng-apexcharts": ">=2.0.0"
17
+ "@angular/cdk": ">=19.0.0 <23.0.0",
18
+ "@angular/common": ">=19.0.0 <23.0.0",
19
+ "@angular/core": ">=19.0.0 <23.0.0",
20
+ "@angular/forms": ">=19.0.0 <23.0.0",
21
+ "@angular/router": ">=19.0.0 <23.0.0",
22
+ "@ng-icons/core": ">=31.4.0 <34.0.0",
23
+ "@ng-icons/lucide": ">=31.4.0 <34.0.0",
24
+ "apexcharts": ">=4.0.0 <6.0.0",
25
+ "ng-apexcharts": ">=1.15.0 <3.0.0"
26
26
  },
27
27
  "dependencies": {
28
28
  "tslib": "^2.3.0"
@@ -33,7 +33,7 @@
33
33
  ],
34
34
  "repository": {
35
35
  "type": "git",
36
- "url": "https://github.com/PedroMorenoTrujillo/neural-ui-workspace.git",
36
+ "url": "git+https://github.com/PedroMorenoTrujillo/neural-ui-workspace.git",
37
37
  "directory": "projects/ui-core"
38
38
  },
39
39
  "homepage": "https://neural-ui-three.vercel.app",