@balinasoftware/balinaui-components 2.2.0 → 4.0.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.
@@ -2,6 +2,9 @@ import * as i0 from '@angular/core';
2
2
  import { Component, EventEmitter, HostListener, Output, Input } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
+ import * as i2 from '@angular/router';
6
+ import { RouterModule } from '@angular/router';
7
+ import { MatIconModule } from '@angular/material/icon';
5
8
 
6
9
  class BalinauiComponents {
7
10
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: BalinauiComponents, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -14,21 +17,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
14
17
 
15
18
  class Navbar {
16
19
  elementRef;
20
+ // Brand
17
21
  brand = 'Aero';
18
- links = [
19
- { label: 'Home', url: '/' },
20
- { label: 'About', url: '/about' },
21
- { label: 'Contact', url: '/contact' }
22
- ];
22
+ logoAlt = 'Aero logo';
23
+ image = '';
24
+ // Navigation
25
+ links = [];
26
+ // Authentication
23
27
  initiallyLoggedIn = false;
24
- userName = 'Guest User';
25
- userEmail = 'guest@example.com';
26
- image = 'https://i.pinimg.com/1200x/4a/57/0c/4a570c4e8dbb4729567848eb69c19055.jpg';
28
+ // User profile
29
+ user = {
30
+ username: 'Guest User',
31
+ email: 'guest@example.com',
32
+ image: '',
33
+ role: 'Guest',
34
+ name: undefined
35
+ };
36
+ // Icons
37
+ notificationIcon = 'notifications';
38
+ profileIcon = 'account_circle';
39
+ userIcon = 'person';
40
+ logoutIcon = 'logout';
41
+ // Events
27
42
  login = new EventEmitter();
28
43
  logout = new EventEmitter();
29
44
  isLoggedIn = false;
30
45
  isDropdownOpen = false;
31
- Aerologo;
32
46
  constructor(elementRef) {
33
47
  this.elementRef = elementRef;
34
48
  }
@@ -47,29 +61,37 @@ class Navbar {
47
61
  this.isDropdownOpen = false;
48
62
  this.logout.emit();
49
63
  }
50
- // Close the dropdown when clicking outside of it
51
64
  onDocumentClick(event) {
52
- if (this.isDropdownOpen && !this.elementRef.nativeElement.contains(event.target)) {
65
+ if (this.isDropdownOpen &&
66
+ !this.elementRef.nativeElement.contains(event.target)) {
53
67
  this.isDropdownOpen = false;
54
68
  }
55
69
  }
56
70
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Navbar, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
57
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: Navbar, isStandalone: true, selector: "lib-navbar", inputs: { brand: "brand", links: "links", initiallyLoggedIn: "initiallyLoggedIn", userName: "userName", userEmail: "userEmail", image: "image" }, outputs: { login: "login", logout: "logout" }, host: { listeners: { "document:mousedown": "onDocumentClick($event)" } }, ngImport: i0, template: "<header class=\"anv-navbar\">\n <div class=\"anv-topbar\"></div>\n <div class=\"anv-stripes\">\n <div class=\"anv-content\">\n <div class=\"anv-brand\">\n <img [src]=\"image\"\n [alt]=\"Aerologo\"\n class=\"anv-brand-icon\" >\n </div>\n\n <nav class=\"anv-links\">\n <a\n *ngFor=\"let link of links\"\n [href]=\"link.url\"\n class=\"anv-link\">\n {{ link.label }}\n </a>\n </nav>\n\n <div class=\"anv-actions\">\n <button class=\"anv-icon-btn\" aria-label=\"Notifications\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\"/>\n <path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\"/>\n </svg>\n </button>\n\n <span class=\"anv-divider\"></span>\n\n <button *ngIf=\"!isLoggedIn\" class=\"anv-login-btn\" (click)=\"handleLoginClick()\">\n Login\n </button>\n\n <div *ngIf=\"isLoggedIn\" class=\"anv-profile-wrap\">\n <button\n class=\"anv-profile-btn\"\n (click)=\"handleProfileClick()\"\n [attr.aria-expanded]=\"isDropdownOpen\"\n aria-haspopup=\"true\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/>\n <circle cx=\"12\" cy=\"7\" r=\"4\"/>\n </svg>\n </button>\n\n <div *ngIf=\"isDropdownOpen\" class=\"anv-dropdown\">\n <div class=\"anv-dropdown-header\">\n <div class=\"anv-dropdown-avatar\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/>\n <circle cx=\"12\" cy=\"7\" r=\"4\"/>\n </svg>\n </div>\n <div class=\"anv-dropdown-info\">\n <span class=\"anv-dropdown-name\">{{ userName }}</span>\n <span class=\"anv-dropdown-email\">{{ userEmail }}</span>\n </div>\n </div>\n <hr class=\"anv-dropdown-sep\" />\n <button class=\"anv-dropdown-item anv-logout\" (click)=\"handleLogoutClick()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/>\n <polyline points=\"16 17 21 12 16 7\"/>\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/>\n </svg>\n Log out\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</header>", styles: ["*,*:before,*:after{box-sizing:border-box}.anv-navbar{width:100%;font-family:Inter,Arial,sans-serif;background:#fff;position:relative;z-index:1000}.anv-topbar{width:100%;height:6px;background:#2755c8}.anv-stripes{width:100%;background:#fff;border-bottom:1px solid #e6e6e6;box-shadow:0 2px 12px #0000000d}.anv-content{width:min(1350px,100%);margin:auto 20px auto auto;display:flex;align-items:center;justify-content:space-between;gap:30px;padding:18px clamp(50px,3vw,60px)}.anv-brand{display:flex;align-items:center;gap:12px;flex-shrink:0}.anv-brand-icon{width:clamp(55px,5vw,90px);height:auto;object-fit:contain;transition:.3s}.anv-brand-icon:hover{transform:scale(1.08)}.anv-brand-name{font-size:22px;font-weight:700;color:#1f4d4a;white-space:nowrap}.anv-links{display:flex;justify-content:right;align-items:center;flex:1;gap:clamp(18px,3vw,40px);min-width:0}.anv-link{position:relative;text-decoration:none;color:#555;font-size:17px;font-weight:600;transition:.3s;white-space:nowrap}.anv-link:hover{color:#1f4d4a}.anv-link:after{content:\"\";position:absolute;left:0;bottom:-8px;width:0;height:2px;background:#1f4d4a;transition:.3s}.anv-link:hover:after{width:100%}.anv-actions{display:flex;align-items:center;gap:18px;flex-shrink:0;margin-left:auto}.anv-icon-btn{width:42px;height:42px;display:flex;justify-content:center;align-items:center;border:none;background:none;cursor:pointer;transition:.3s;border-radius:50%}.anv-icon-btn:hover{background:#f4f4f4;transform:translateY(-2px)}.anv-divider{width:1px;height:32px;background:#d8d8d8}.anv-login-btn{padding:10px 24px;border:none;border-radius:30px;background:#1f4d4a;color:#fff;font-size:15px;font-weight:600;cursor:pointer;transition:.3s}.anv-login-btn:hover{background:#163836;transform:translateY(-2px);box-shadow:0 8px 18px #0000002e}.anv-login-btn:active{transform:scale(.96)}.anv-profile-wrap{position:relative}.anv-profile-btn{width:48px;height:48px;border:none;border-radius:50%;background:#111;color:#fff;cursor:pointer;display:flex;justify-content:center;align-items:center;transition:.3s}.anv-profile-btn:hover{transform:scale(1.08);box-shadow:0 8px 18px #00000026}.anv-dropdown{position:absolute;top:calc(100% + 12px);right:0;width:260px;background:#fff;border-radius:14px;box-shadow:0 12px 30px #0000002e;overflow:hidden;animation:dropdown .25s ease;z-index:999}@keyframes dropdown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.anv-dropdown-header{display:flex;align-items:center;gap:12px;padding:16px}.anv-dropdown-avatar{width:45px;height:45px;border-radius:50%;background:#111;color:#fff;display:flex;justify-content:center;align-items:center;font-weight:700}.anv-dropdown-info{display:flex;flex-direction:column;overflow:hidden}.anv-dropdown-name{font-weight:700;font-size:15px}.anv-dropdown-email{font-size:13px;color:#777;overflow:hidden;text-overflow:ellipsis}.anv-dropdown-sep{border:none;border-top:1px solid #eee;margin:0}.anv-dropdown-item{width:100%;padding:14px 18px;background:none;border:none;cursor:pointer;text-align:left;font-size:15px;transition:.3s}.anv-dropdown-item:hover{background:#f7f7f7}.anv-logout{color:#d32f2f;font-weight:600}@media(max-width:992px){.anv-content{display:flex;align-items:center;justify-content:space-between;width:100%;padding:14px 20px;gap:12px}.anv-brand{flex-shrink:0}.anv-brand-icon{width:60px}.anv-links{flex:1;display:flex;justify-content:center;gap:18px;min-width:0;overflow:hidden}.anv-link{font-size:14px}.anv-actions{display:flex;align-items:center;gap:10px;flex-shrink:0;margin-left:auto}.anv-login-btn{padding:8px 16px;font-size:13px}.anv-profile-btn{width:40px;height:40px}}@media(max-width:768px){.anv-content{padding:12px 16px;gap:10px}.anv-brand-icon{width:50px}.anv-link{font-size:13px}.anv-links{gap:10px;overflow-x:auto;scrollbar-width:none}.anv-links::-webkit-scrollbar{display:none}.anv-login-btn{padding:7px 12px;font-size:12px}.anv-profile-btn{width:36px;height:36px}}.anv-navbar,.anv-stripes{width:100%;background:#fff}.anv-content{width:100%;box-sizing:border-box}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
71
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: Navbar, isStandalone: true, selector: "lib-navbar", inputs: { brand: "brand", logoAlt: "logoAlt", image: "image", links: "links", initiallyLoggedIn: "initiallyLoggedIn", user: "user", notificationIcon: "notificationIcon", profileIcon: "profileIcon", userIcon: "userIcon", logoutIcon: "logoutIcon" }, outputs: { login: "login", logout: "logout" }, host: { listeners: { "document:mousedown": "onDocumentClick($event)" } }, ngImport: i0, template: "<header class=\"anv-navbar\">\n\n <!--TOP STRIPE-->\n <div class=\"anv-topbar\"></div>\n <!--NAVBAR-->\n <div class=\"anv-stripes\">\n <div class=\"anv-content\">\n\n <!--BRAND / LOGO-->\n <img *ngIf=\"image\" [src]=\"image\" [alt]=\"logoAlt\" class=\"anv-brand-icon\" />\n <span *ngIf=\"brand\" class=\"anv-brand-name\">\n {{ brand }}\n </span>\n\n <!--NAVIGATION LINKS-->\n <nav class=\"anv-links\" aria-label=\"Main navigation\">\n <a *ngFor=\"let link of links\" [routerLink]=\"link.url\" routerLinkActive=\"anv-link-active\"\n [routerLinkActiveOptions]=\"{ exact: true }\" class=\"anv-link\">\n {{ link.label }}\n </a>\n </nav>\n\n\n <!--ACTIONS-->\n <div class=\"anv-actions\">\n <!--NOTIFICATION-->\n <button type=\"button\" class=\"anv-icon-btn\" aria-label=\"Notifications\">\n <span class=\"material-icons\">\n {{ notificationIcon }}\n </span>\n </button>\n\n \n <!--DIVIDER-->\n <span class=\"anv-divider\"></span>\n\n <!--LOGIN-->\n <button *ngIf=\"!isLoggedIn\" type=\"button\" class=\"anv-login-btn\" (click)=\"handleLoginClick()\">\n Login\n </button>\n\n <!--PROFILE-->\n <div *ngIf=\"isLoggedIn\" class=\"anv-profile-wrap\">\n\n <!-- PROFILE BUTTON -->\n <button type=\"button\" class=\"anv-profile-btn\" (click)=\"handleProfileClick()\"\n [attr.aria-expanded]=\"isDropdownOpen\" aria-haspopup=\"true\" aria-label=\"User profile\">\n <img *ngIf=\"user.image\" [src]=\"user.image\" [alt]=\"user.name\" class=\"anv-profile-image\" />\n <span *ngIf=\"!user.image\" class=\"material-icons\">\n {{ profileIcon }}\n </span>\n \n </button>\n\n <!-- PROFILE DROPDOWN-->\n\n <div *ngIf=\"isDropdownOpen\" class=\"anv-dropdown\">\n <!-- USER INFORMATION -->\n <div class=\"anv-dropdown-header\">\n <!-- USER IMAGE -->\n <div class=\"anv-dropdown-avatar\">\n <img *ngIf=\"user.image\" [src]=\"user.image\" [alt]=\"user.name\" />\n <span *ngIf=\"!user.image\" class=\"material-icons\">\n {{ userIcon }}\n </span>\n </div>\n\n <!-- USER DETAILS -->\n\n <div class=\"anv-dropdown-info\">\n <span class=\"anv-dropdown-name\">\n {{ user.name }}\n </span>\n <span class=\"anv-dropdown-email\">\n {{ user.email }}\n </span>\n <span *ngIf=\"user.role\" class=\"anv-dropdown-role\">\n {{ user.role }}\n </span>\n </div>\n </div>\n\n <!-- DIVIDER -->\n <hr class=\"anv-dropdown-sep\">\n <!-- LOGOUT -->\n <button type=\"button\" class=\"anv-dropdown-item anv-logout\" (click)=\"handleLogoutClick()\">\n <span class=\"material-icons\">\n {{ logoutIcon }}\n </span>\n <span>\n Log out\n </span>\n </button>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n</header>", styles: ["@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*,*:before,*:after{box-sizing:border-box}.anv-navbar{display:flex;font-family:Inter,Arial,sans-serif;background:#fff;position:relative;z-index:1000}.anv-stripes{width:100%;background:#fff;border-bottom:1px solid #e6e6e6;box-shadow:0 2px 12px #0000000d}.anv-content{width:min(1350px,100%);margin:auto 20px auto auto;display:flex;align-items:center;justify-content:space-between;gap:30px;padding:18px clamp(50px,3vw,60px)}.anv-brand{display:flex;align-items:center;gap:12px;flex-shrink:0}.anv-brand-icon{width:clamp(60px,7vw,100px);height:auto;object-fit:contain;transition:.3s}.anv-brand-icon:hover{transform:scale(1.08)}.anv-brand-name{font-size:22px;font-weight:700;color:#1f4d4a;white-space:nowrap}.anv-links{display:flex;justify-content:right;align-items:center;flex:1;gap:clamp(18px,3vw,40px);min-width:0}.anv-link{position:relative;text-decoration:none;color:#555;font-size:17px;font-weight:600;transition:.3s;white-space:nowrap}.anv-link:hover{color:#1f4d4a}.anv-link:after{content:\"\";position:absolute;left:0;bottom:-8px;width:0;height:2px;background:#1f4d4a;transition:.3s}.anv-link:hover:after{width:100%}.anv-actions{display:flex;align-items:center;gap:18px;flex-shrink:0;margin-left:auto}.anv-icon-btn{width:42px;height:42px;display:flex;justify-content:center;align-items:center;border:none;background:none;cursor:pointer;transition:.3s;border-radius:50%}.anv-icon-btn:hover{background:#f4f4f4;transform:translateY(-2px)}.anv-divider{width:1px;height:32px;background:#d8d8d8}.anv-login-btn{padding:10px 24px;border:none;border-radius:30px;background:#1f4d4a;color:#fff;font-size:15px;font-weight:600;cursor:pointer;transition:.3s}.anv-login-btn:hover{background:#163836;transform:translateY(-2px);box-shadow:0 8px 18px #0000002e}.anv-login-btn:active{transform:scale(.96)}.anv-profile-wrap{position:relative}.anv-profile-btn{width:48px;height:48px;border:none;border-radius:50%;background:#111;color:#fff;cursor:pointer;display:flex;justify-content:center;align-items:center;transition:.3s}.anv-profile-btn:hover{transform:scale(1.08);box-shadow:0 8px 18px #00000026}.anv-dropdown{position:absolute;top:calc(100% + 12px);right:0;width:260px;background:#fff;border-radius:14px;box-shadow:0 12px 30px #0000002e;overflow:hidden;animation:dropdown .25s ease;z-index:999}@keyframes dropdown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.anv-dropdown-header{display:flex;align-items:center;gap:12px;padding:16px}.anv-dropdown-avatar{width:45px;height:45px;border-radius:50%;background:#111;color:#fff;display:flex;justify-content:center;align-items:center;font-weight:700}.anv-dropdown-info{display:flex;flex-direction:column;overflow:hidden}.anv-dropdown-name{font-weight:700;font-size:15px}.anv-dropdown-email{font-size:13px;color:#777;overflow:hidden;text-overflow:ellipsis}.anv-dropdown-sep{border:none;border-top:1px solid #eee;margin:0}.anv-dropdown-item{width:100%;padding:14px 18px;background:none;border:none;cursor:pointer;text-align:left;font-size:15px;transition:.3s}.anv-dropdown-item:hover{background:#f7f7f7}.anv-logout{color:#d32f2f;font-weight:600}@media(max-width:992px){.anv-content{display:flex;align-items:center;justify-content:space-between;width:100%;padding:14px 20px;gap:12px}.anv-brand{flex-shrink:0}.anv-brand-icon{width:90px}.anv-links{flex:1;display:flex;justify-content:center;gap:18px;min-width:0;overflow:hidden}.anv-link{font-size:14px}.anv-actions{display:flex;align-items:center;gap:10px;flex-shrink:0;margin-left:auto}.anv-login-btn{padding:8px 16px;font-size:13px}.anv-profile-btn{width:40px;height:40px}}@media(max-width:768px){.anv-content{padding:12px 16px;gap:10px}.anv-brand-icon{width:80px}.anv-link{font-size:13px}.anv-links{gap:10px;overflow-x:auto;scrollbar-width:none}.anv-links::-webkit-scrollbar{display:none}.anv-login-btn{padding:7px 12px;font-size:12px}.anv-profile-btn{width:36px;height:36px}}.anv-navbar,.anv-stripes{width:100%;background:#fff}.anv-content{width:100%;box-sizing:border-box}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: MatIconModule }] });
58
72
  }
59
73
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Navbar, decorators: [{
60
74
  type: Component,
61
- args: [{ selector: 'lib-navbar', imports: [CommonModule], template: "<header class=\"anv-navbar\">\n <div class=\"anv-topbar\"></div>\n <div class=\"anv-stripes\">\n <div class=\"anv-content\">\n <div class=\"anv-brand\">\n <img [src]=\"image\"\n [alt]=\"Aerologo\"\n class=\"anv-brand-icon\" >\n </div>\n\n <nav class=\"anv-links\">\n <a\n *ngFor=\"let link of links\"\n [href]=\"link.url\"\n class=\"anv-link\">\n {{ link.label }}\n </a>\n </nav>\n\n <div class=\"anv-actions\">\n <button class=\"anv-icon-btn\" aria-label=\"Notifications\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\"/>\n <path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\"/>\n </svg>\n </button>\n\n <span class=\"anv-divider\"></span>\n\n <button *ngIf=\"!isLoggedIn\" class=\"anv-login-btn\" (click)=\"handleLoginClick()\">\n Login\n </button>\n\n <div *ngIf=\"isLoggedIn\" class=\"anv-profile-wrap\">\n <button\n class=\"anv-profile-btn\"\n (click)=\"handleProfileClick()\"\n [attr.aria-expanded]=\"isDropdownOpen\"\n aria-haspopup=\"true\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/>\n <circle cx=\"12\" cy=\"7\" r=\"4\"/>\n </svg>\n </button>\n\n <div *ngIf=\"isDropdownOpen\" class=\"anv-dropdown\">\n <div class=\"anv-dropdown-header\">\n <div class=\"anv-dropdown-avatar\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/>\n <circle cx=\"12\" cy=\"7\" r=\"4\"/>\n </svg>\n </div>\n <div class=\"anv-dropdown-info\">\n <span class=\"anv-dropdown-name\">{{ userName }}</span>\n <span class=\"anv-dropdown-email\">{{ userEmail }}</span>\n </div>\n </div>\n <hr class=\"anv-dropdown-sep\" />\n <button class=\"anv-dropdown-item anv-logout\" (click)=\"handleLogoutClick()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/>\n <polyline points=\"16 17 21 12 16 7\"/>\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/>\n </svg>\n Log out\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</header>", styles: ["*,*:before,*:after{box-sizing:border-box}.anv-navbar{width:100%;font-family:Inter,Arial,sans-serif;background:#fff;position:relative;z-index:1000}.anv-topbar{width:100%;height:6px;background:#2755c8}.anv-stripes{width:100%;background:#fff;border-bottom:1px solid #e6e6e6;box-shadow:0 2px 12px #0000000d}.anv-content{width:min(1350px,100%);margin:auto 20px auto auto;display:flex;align-items:center;justify-content:space-between;gap:30px;padding:18px clamp(50px,3vw,60px)}.anv-brand{display:flex;align-items:center;gap:12px;flex-shrink:0}.anv-brand-icon{width:clamp(55px,5vw,90px);height:auto;object-fit:contain;transition:.3s}.anv-brand-icon:hover{transform:scale(1.08)}.anv-brand-name{font-size:22px;font-weight:700;color:#1f4d4a;white-space:nowrap}.anv-links{display:flex;justify-content:right;align-items:center;flex:1;gap:clamp(18px,3vw,40px);min-width:0}.anv-link{position:relative;text-decoration:none;color:#555;font-size:17px;font-weight:600;transition:.3s;white-space:nowrap}.anv-link:hover{color:#1f4d4a}.anv-link:after{content:\"\";position:absolute;left:0;bottom:-8px;width:0;height:2px;background:#1f4d4a;transition:.3s}.anv-link:hover:after{width:100%}.anv-actions{display:flex;align-items:center;gap:18px;flex-shrink:0;margin-left:auto}.anv-icon-btn{width:42px;height:42px;display:flex;justify-content:center;align-items:center;border:none;background:none;cursor:pointer;transition:.3s;border-radius:50%}.anv-icon-btn:hover{background:#f4f4f4;transform:translateY(-2px)}.anv-divider{width:1px;height:32px;background:#d8d8d8}.anv-login-btn{padding:10px 24px;border:none;border-radius:30px;background:#1f4d4a;color:#fff;font-size:15px;font-weight:600;cursor:pointer;transition:.3s}.anv-login-btn:hover{background:#163836;transform:translateY(-2px);box-shadow:0 8px 18px #0000002e}.anv-login-btn:active{transform:scale(.96)}.anv-profile-wrap{position:relative}.anv-profile-btn{width:48px;height:48px;border:none;border-radius:50%;background:#111;color:#fff;cursor:pointer;display:flex;justify-content:center;align-items:center;transition:.3s}.anv-profile-btn:hover{transform:scale(1.08);box-shadow:0 8px 18px #00000026}.anv-dropdown{position:absolute;top:calc(100% + 12px);right:0;width:260px;background:#fff;border-radius:14px;box-shadow:0 12px 30px #0000002e;overflow:hidden;animation:dropdown .25s ease;z-index:999}@keyframes dropdown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.anv-dropdown-header{display:flex;align-items:center;gap:12px;padding:16px}.anv-dropdown-avatar{width:45px;height:45px;border-radius:50%;background:#111;color:#fff;display:flex;justify-content:center;align-items:center;font-weight:700}.anv-dropdown-info{display:flex;flex-direction:column;overflow:hidden}.anv-dropdown-name{font-weight:700;font-size:15px}.anv-dropdown-email{font-size:13px;color:#777;overflow:hidden;text-overflow:ellipsis}.anv-dropdown-sep{border:none;border-top:1px solid #eee;margin:0}.anv-dropdown-item{width:100%;padding:14px 18px;background:none;border:none;cursor:pointer;text-align:left;font-size:15px;transition:.3s}.anv-dropdown-item:hover{background:#f7f7f7}.anv-logout{color:#d32f2f;font-weight:600}@media(max-width:992px){.anv-content{display:flex;align-items:center;justify-content:space-between;width:100%;padding:14px 20px;gap:12px}.anv-brand{flex-shrink:0}.anv-brand-icon{width:60px}.anv-links{flex:1;display:flex;justify-content:center;gap:18px;min-width:0;overflow:hidden}.anv-link{font-size:14px}.anv-actions{display:flex;align-items:center;gap:10px;flex-shrink:0;margin-left:auto}.anv-login-btn{padding:8px 16px;font-size:13px}.anv-profile-btn{width:40px;height:40px}}@media(max-width:768px){.anv-content{padding:12px 16px;gap:10px}.anv-brand-icon{width:50px}.anv-link{font-size:13px}.anv-links{gap:10px;overflow-x:auto;scrollbar-width:none}.anv-links::-webkit-scrollbar{display:none}.anv-login-btn{padding:7px 12px;font-size:12px}.anv-profile-btn{width:36px;height:36px}}.anv-navbar,.anv-stripes{width:100%;background:#fff}.anv-content{width:100%;box-sizing:border-box}\n"] }]
75
+ args: [{ selector: 'lib-navbar', standalone: true, imports: [CommonModule, RouterModule, MatIconModule], template: "<header class=\"anv-navbar\">\n\n <!--TOP STRIPE-->\n <div class=\"anv-topbar\"></div>\n <!--NAVBAR-->\n <div class=\"anv-stripes\">\n <div class=\"anv-content\">\n\n <!--BRAND / LOGO-->\n <img *ngIf=\"image\" [src]=\"image\" [alt]=\"logoAlt\" class=\"anv-brand-icon\" />\n <span *ngIf=\"brand\" class=\"anv-brand-name\">\n {{ brand }}\n </span>\n\n <!--NAVIGATION LINKS-->\n <nav class=\"anv-links\" aria-label=\"Main navigation\">\n <a *ngFor=\"let link of links\" [routerLink]=\"link.url\" routerLinkActive=\"anv-link-active\"\n [routerLinkActiveOptions]=\"{ exact: true }\" class=\"anv-link\">\n {{ link.label }}\n </a>\n </nav>\n\n\n <!--ACTIONS-->\n <div class=\"anv-actions\">\n <!--NOTIFICATION-->\n <button type=\"button\" class=\"anv-icon-btn\" aria-label=\"Notifications\">\n <span class=\"material-icons\">\n {{ notificationIcon }}\n </span>\n </button>\n\n \n <!--DIVIDER-->\n <span class=\"anv-divider\"></span>\n\n <!--LOGIN-->\n <button *ngIf=\"!isLoggedIn\" type=\"button\" class=\"anv-login-btn\" (click)=\"handleLoginClick()\">\n Login\n </button>\n\n <!--PROFILE-->\n <div *ngIf=\"isLoggedIn\" class=\"anv-profile-wrap\">\n\n <!-- PROFILE BUTTON -->\n <button type=\"button\" class=\"anv-profile-btn\" (click)=\"handleProfileClick()\"\n [attr.aria-expanded]=\"isDropdownOpen\" aria-haspopup=\"true\" aria-label=\"User profile\">\n <img *ngIf=\"user.image\" [src]=\"user.image\" [alt]=\"user.name\" class=\"anv-profile-image\" />\n <span *ngIf=\"!user.image\" class=\"material-icons\">\n {{ profileIcon }}\n </span>\n \n </button>\n\n <!-- PROFILE DROPDOWN-->\n\n <div *ngIf=\"isDropdownOpen\" class=\"anv-dropdown\">\n <!-- USER INFORMATION -->\n <div class=\"anv-dropdown-header\">\n <!-- USER IMAGE -->\n <div class=\"anv-dropdown-avatar\">\n <img *ngIf=\"user.image\" [src]=\"user.image\" [alt]=\"user.name\" />\n <span *ngIf=\"!user.image\" class=\"material-icons\">\n {{ userIcon }}\n </span>\n </div>\n\n <!-- USER DETAILS -->\n\n <div class=\"anv-dropdown-info\">\n <span class=\"anv-dropdown-name\">\n {{ user.name }}\n </span>\n <span class=\"anv-dropdown-email\">\n {{ user.email }}\n </span>\n <span *ngIf=\"user.role\" class=\"anv-dropdown-role\">\n {{ user.role }}\n </span>\n </div>\n </div>\n\n <!-- DIVIDER -->\n <hr class=\"anv-dropdown-sep\">\n <!-- LOGOUT -->\n <button type=\"button\" class=\"anv-dropdown-item anv-logout\" (click)=\"handleLogoutClick()\">\n <span class=\"material-icons\">\n {{ logoutIcon }}\n </span>\n <span>\n Log out\n </span>\n </button>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n</header>", styles: ["@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*,*:before,*:after{box-sizing:border-box}.anv-navbar{display:flex;font-family:Inter,Arial,sans-serif;background:#fff;position:relative;z-index:1000}.anv-stripes{width:100%;background:#fff;border-bottom:1px solid #e6e6e6;box-shadow:0 2px 12px #0000000d}.anv-content{width:min(1350px,100%);margin:auto 20px auto auto;display:flex;align-items:center;justify-content:space-between;gap:30px;padding:18px clamp(50px,3vw,60px)}.anv-brand{display:flex;align-items:center;gap:12px;flex-shrink:0}.anv-brand-icon{width:clamp(60px,7vw,100px);height:auto;object-fit:contain;transition:.3s}.anv-brand-icon:hover{transform:scale(1.08)}.anv-brand-name{font-size:22px;font-weight:700;color:#1f4d4a;white-space:nowrap}.anv-links{display:flex;justify-content:right;align-items:center;flex:1;gap:clamp(18px,3vw,40px);min-width:0}.anv-link{position:relative;text-decoration:none;color:#555;font-size:17px;font-weight:600;transition:.3s;white-space:nowrap}.anv-link:hover{color:#1f4d4a}.anv-link:after{content:\"\";position:absolute;left:0;bottom:-8px;width:0;height:2px;background:#1f4d4a;transition:.3s}.anv-link:hover:after{width:100%}.anv-actions{display:flex;align-items:center;gap:18px;flex-shrink:0;margin-left:auto}.anv-icon-btn{width:42px;height:42px;display:flex;justify-content:center;align-items:center;border:none;background:none;cursor:pointer;transition:.3s;border-radius:50%}.anv-icon-btn:hover{background:#f4f4f4;transform:translateY(-2px)}.anv-divider{width:1px;height:32px;background:#d8d8d8}.anv-login-btn{padding:10px 24px;border:none;border-radius:30px;background:#1f4d4a;color:#fff;font-size:15px;font-weight:600;cursor:pointer;transition:.3s}.anv-login-btn:hover{background:#163836;transform:translateY(-2px);box-shadow:0 8px 18px #0000002e}.anv-login-btn:active{transform:scale(.96)}.anv-profile-wrap{position:relative}.anv-profile-btn{width:48px;height:48px;border:none;border-radius:50%;background:#111;color:#fff;cursor:pointer;display:flex;justify-content:center;align-items:center;transition:.3s}.anv-profile-btn:hover{transform:scale(1.08);box-shadow:0 8px 18px #00000026}.anv-dropdown{position:absolute;top:calc(100% + 12px);right:0;width:260px;background:#fff;border-radius:14px;box-shadow:0 12px 30px #0000002e;overflow:hidden;animation:dropdown .25s ease;z-index:999}@keyframes dropdown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.anv-dropdown-header{display:flex;align-items:center;gap:12px;padding:16px}.anv-dropdown-avatar{width:45px;height:45px;border-radius:50%;background:#111;color:#fff;display:flex;justify-content:center;align-items:center;font-weight:700}.anv-dropdown-info{display:flex;flex-direction:column;overflow:hidden}.anv-dropdown-name{font-weight:700;font-size:15px}.anv-dropdown-email{font-size:13px;color:#777;overflow:hidden;text-overflow:ellipsis}.anv-dropdown-sep{border:none;border-top:1px solid #eee;margin:0}.anv-dropdown-item{width:100%;padding:14px 18px;background:none;border:none;cursor:pointer;text-align:left;font-size:15px;transition:.3s}.anv-dropdown-item:hover{background:#f7f7f7}.anv-logout{color:#d32f2f;font-weight:600}@media(max-width:992px){.anv-content{display:flex;align-items:center;justify-content:space-between;width:100%;padding:14px 20px;gap:12px}.anv-brand{flex-shrink:0}.anv-brand-icon{width:90px}.anv-links{flex:1;display:flex;justify-content:center;gap:18px;min-width:0;overflow:hidden}.anv-link{font-size:14px}.anv-actions{display:flex;align-items:center;gap:10px;flex-shrink:0;margin-left:auto}.anv-login-btn{padding:8px 16px;font-size:13px}.anv-profile-btn{width:40px;height:40px}}@media(max-width:768px){.anv-content{padding:12px 16px;gap:10px}.anv-brand-icon{width:80px}.anv-link{font-size:13px}.anv-links{gap:10px;overflow-x:auto;scrollbar-width:none}.anv-links::-webkit-scrollbar{display:none}.anv-login-btn{padding:7px 12px;font-size:12px}.anv-profile-btn{width:36px;height:36px}}.anv-navbar,.anv-stripes{width:100%;background:#fff}.anv-content{width:100%;box-sizing:border-box}\n"] }]
62
76
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { brand: [{
63
77
  type: Input
78
+ }], logoAlt: [{
79
+ type: Input
80
+ }], image: [{
81
+ type: Input
64
82
  }], links: [{
65
83
  type: Input
66
84
  }], initiallyLoggedIn: [{
67
85
  type: Input
68
- }], userName: [{
86
+ }], user: [{
69
87
  type: Input
70
- }], userEmail: [{
88
+ }], notificationIcon: [{
71
89
  type: Input
72
- }], image: [{
90
+ }], profileIcon: [{
91
+ type: Input
92
+ }], userIcon: [{
93
+ type: Input
94
+ }], logoutIcon: [{
73
95
  type: Input
74
96
  }], login: [{
75
97
  type: Output
@@ -80,6 +102,146 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
80
102
  args: ['document:mousedown', ['$event']]
81
103
  }] } });
82
104
 
105
+ class Button {
106
+ // CONTENT
107
+ text = 'Button';
108
+ // BUTTON TYPE
109
+ type = 'button';
110
+ // VARIANT
111
+ variant = 'solid';
112
+ // STANDARD COLOR
113
+ color = 'primary';
114
+ // CUSTOM COLORS
115
+ customColor;
116
+ hoverColor;
117
+ activeColor;
118
+ textColor;
119
+ borderColor;
120
+ hoverTextColor;
121
+ activeTextColor;
122
+ disabledColor;
123
+ disabledTextColor;
124
+ disabledBorderColor;
125
+ // SIZE
126
+ size = 'md';
127
+ // DISABLED
128
+ disabled = false;
129
+ // CLICK EVENT
130
+ buttonClick = new EventEmitter();
131
+ // CLICK HANDLER
132
+ handleClick(event) {
133
+ if (this.disabled) {
134
+ event.preventDefault();
135
+ return;
136
+ }
137
+ this.buttonClick.emit(event);
138
+ }
139
+ // CSS VARIABLES
140
+ get buttonStyles() {
141
+ const styles = {};
142
+ if (this.customColor) {
143
+ styles['--button-custom-color'] = this.customColor;
144
+ }
145
+ if (this.hoverColor) {
146
+ styles['--button-hover-color'] = this.hoverColor;
147
+ }
148
+ if (this.activeColor) {
149
+ styles['--button-active-color'] = this.activeColor;
150
+ }
151
+ if (this.textColor) {
152
+ styles['--button-text-color'] = this.textColor;
153
+ }
154
+ if (this.borderColor) {
155
+ styles['--button-border-color'] = this.borderColor;
156
+ }
157
+ if (this.hoverTextColor) {
158
+ styles['--button-hover-text-color'] = this.hoverTextColor;
159
+ }
160
+ if (this.activeTextColor) {
161
+ styles['--button-active-text-color'] = this.activeTextColor;
162
+ }
163
+ if (this.disabledColor) {
164
+ styles['--button-disabled-color'] = this.disabledColor;
165
+ }
166
+ if (this.disabledTextColor) {
167
+ styles['--button-disabled-text-color'] =
168
+ this.disabledTextColor;
169
+ }
170
+ if (this.disabledBorderColor) {
171
+ styles['--button-disabled-border-color'] =
172
+ this.disabledBorderColor;
173
+ }
174
+ return styles;
175
+ }
176
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Button, deps: [], target: i0.ɵɵFactoryTarget.Component });
177
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: Button, isStandalone: true, selector: "lib-button", inputs: { text: "text", type: "type", variant: "variant", color: "color", customColor: "customColor", hoverColor: "hoverColor", activeColor: "activeColor", textColor: "textColor", borderColor: "borderColor", hoverTextColor: "hoverTextColor", activeTextColor: "activeTextColor", disabledColor: "disabledColor", disabledTextColor: "disabledTextColor", disabledBorderColor: "disabledBorderColor", size: "size", disabled: "disabled" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n [type]=\"type\"\n [disabled]=\"disabled\"\n\n [ngClass]=\"[\n 'lib-button',\n 'lib-button-' + variant,\n 'lib-button-' + color,\n 'lib-button-' + size\n ]\"\n\n [ngStyle]=\"buttonStyles\"\n\n (click)=\"handleClick($event)\"\n>\n {{ text }}\n</button>", styles: [".lib-button{--button-default-color: #2563eb;--button-default-hover-color: #1d4ed8;--button-default-active-color: #1e40af;--button-custom-color: var(--button-default-color);--button-hover-color: var(--button-default-hover-color);--button-active-color: var(--button-default-active-color);--button-text-color: #ffffff;--button-border-color: var(--button-custom-color);--button-hover-text-color: var(--button-text-color);--button-active-text-color: var(--button-text-color);--button-disabled-color: #e5e7eb;--button-disabled-text-color: #9ca3af;--button-disabled-border-color: #d1d5db;display:inline-flex;align-items:center;justify-content:center;gap:8px;border:1px solid var(--button-border-color);font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-weight:600;line-height:1;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .2s ease,border-color .2s ease,color .2s ease,box-shadow .2s ease,transform .1s ease;outline:none}.lib-button-xs{min-height:28px;padding:5px 10px;font-size:12px;border-radius:6px}.lib-button-sm{min-height:34px;padding:7px 14px;font-size:13px;border-radius:7px}.lib-button-md{min-height:40px;padding:9px 18px;font-size:14px;border-radius:8px}.lib-button-lg{min-height:46px;padding:11px 22px;font-size:16px;border-radius:9px}.lib-button-xl{min-height:54px;padding:13px 28px;font-size:18px;border-radius:10px}.lib-button-solid{background:var(--button-custom-color);border-color:var(--button-border-color);color:var(--button-text-color)}.lib-button-solid:hover:not(:disabled){background:var(--button-hover-color);border-color:var(--button-hover-color);color:var(--button-hover-text-color)}.lib-button-solid:active:not(:disabled){background:var(--button-active-color);border-color:var(--button-active-color);color:var(--button-active-text-color);transform:translateY(1px)}.lib-button-outline{background:transparent;border-color:var(--button-border-color);color:var(--button-custom-color)}.lib-button-outline:hover:not(:disabled){background:var(--button-hover-color);border-color:var(--button-hover-color);color:var(--button-hover-text-color)}.lib-button-outline:active:not(:disabled){background:var(--button-active-color);border-color:var(--button-active-color);color:var(--button-active-text-color);transform:translateY(1px)}.lib-button-ghost{background:transparent;border-color:transparent;color:var(--button-custom-color)}.lib-button-ghost:hover:not(:disabled){background:var(--button-hover-color);border-color:transparent;color:var(--button-hover-text-color)}.lib-button-ghost:active:not(:disabled){background:var(--button-active-color);border-color:transparent;color:var(--button-active-text-color);transform:translateY(1px)}.lib-button-primary{--button-default-color: #2563eb;--button-default-hover-color: #1d4ed8;--button-default-active-color: #1e40af}.lib-button-secondary{--button-default-color: #64748b;--button-default-hover-color: #475569;--button-default-active-color: #334155}.lib-button-success{--button-default-color: #16a34a;--button-default-hover-color: #15803d;--button-default-active-color: #166534}.lib-button-danger{--button-default-color: #dc2626;--button-default-hover-color: #b91c1c;--button-default-active-color: #991b1b}.lib-button-warning{--button-default-color: #f59e0b;--button-default-hover-color: #d97706;--button-default-active-color: #b45309}.lib-button-info{--button-default-color: #0891b2;--button-default-hover-color: #0e7490;--button-default-active-color: #155e75}.lib-button-neutral{--button-default-color: #374151;--button-default-hover-color: #1f2937;--button-default-active-color: #111827}.lib-button-light{--button-default-color: #f8fafc;--button-default-hover-color: #e2e8f0;--button-default-active-color: #cbd5e1;--button-text-color: #1e293b}.lib-button-dark{--button-default-color: #1e293b;--button-default-hover-color: #0f172a;--button-default-active-color: #020617;--button-text-color: #ffffff}.lib-button-link{--button-default-color: #2563eb;--button-default-hover-color: #1d4ed8;--button-default-active-color: #1e40af;background:transparent;border-color:transparent;color:var(--button-custom-color);padding-left:4px;padding-right:4px}.lib-button-link:hover:not(:disabled){background:transparent;border-color:transparent;color:var(--button-hover-color);text-decoration:underline}.lib-button-link:active:not(:disabled){background:transparent;border-color:transparent;color:var(--button-active-color);transform:none}.lib-button:focus-visible{outline:3px solid rgba(37,99,235,.25);outline-offset:2px}.lib-button:disabled{background:var(--button-disabled-color)!important;border-color:var(--button-disabled-border-color)!important;color:var(--button-disabled-text-color)!important;cursor:not-allowed;opacity:.8;transform:none!important;box-shadow:none!important}.lib-button-link:disabled{background:transparent!important;border-color:transparent!important;color:var(--button-disabled-text-color)!important;text-decoration:none}@media(max-width:480px){.lib-button-xl{min-height:50px;padding:11px 22px;font-size:16px}.lib-button-lg{min-height:44px;padding:10px 18px;font-size:15px}.lib-button-md{min-height:38px;padding:8px 16px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
178
+ }
179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Button, decorators: [{
180
+ type: Component,
181
+ args: [{ selector: 'lib-button', standalone: true, imports: [CommonModule], template: "<button\n [type]=\"type\"\n [disabled]=\"disabled\"\n\n [ngClass]=\"[\n 'lib-button',\n 'lib-button-' + variant,\n 'lib-button-' + color,\n 'lib-button-' + size\n ]\"\n\n [ngStyle]=\"buttonStyles\"\n\n (click)=\"handleClick($event)\"\n>\n {{ text }}\n</button>", styles: [".lib-button{--button-default-color: #2563eb;--button-default-hover-color: #1d4ed8;--button-default-active-color: #1e40af;--button-custom-color: var(--button-default-color);--button-hover-color: var(--button-default-hover-color);--button-active-color: var(--button-default-active-color);--button-text-color: #ffffff;--button-border-color: var(--button-custom-color);--button-hover-text-color: var(--button-text-color);--button-active-text-color: var(--button-text-color);--button-disabled-color: #e5e7eb;--button-disabled-text-color: #9ca3af;--button-disabled-border-color: #d1d5db;display:inline-flex;align-items:center;justify-content:center;gap:8px;border:1px solid var(--button-border-color);font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-weight:600;line-height:1;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .2s ease,border-color .2s ease,color .2s ease,box-shadow .2s ease,transform .1s ease;outline:none}.lib-button-xs{min-height:28px;padding:5px 10px;font-size:12px;border-radius:6px}.lib-button-sm{min-height:34px;padding:7px 14px;font-size:13px;border-radius:7px}.lib-button-md{min-height:40px;padding:9px 18px;font-size:14px;border-radius:8px}.lib-button-lg{min-height:46px;padding:11px 22px;font-size:16px;border-radius:9px}.lib-button-xl{min-height:54px;padding:13px 28px;font-size:18px;border-radius:10px}.lib-button-solid{background:var(--button-custom-color);border-color:var(--button-border-color);color:var(--button-text-color)}.lib-button-solid:hover:not(:disabled){background:var(--button-hover-color);border-color:var(--button-hover-color);color:var(--button-hover-text-color)}.lib-button-solid:active:not(:disabled){background:var(--button-active-color);border-color:var(--button-active-color);color:var(--button-active-text-color);transform:translateY(1px)}.lib-button-outline{background:transparent;border-color:var(--button-border-color);color:var(--button-custom-color)}.lib-button-outline:hover:not(:disabled){background:var(--button-hover-color);border-color:var(--button-hover-color);color:var(--button-hover-text-color)}.lib-button-outline:active:not(:disabled){background:var(--button-active-color);border-color:var(--button-active-color);color:var(--button-active-text-color);transform:translateY(1px)}.lib-button-ghost{background:transparent;border-color:transparent;color:var(--button-custom-color)}.lib-button-ghost:hover:not(:disabled){background:var(--button-hover-color);border-color:transparent;color:var(--button-hover-text-color)}.lib-button-ghost:active:not(:disabled){background:var(--button-active-color);border-color:transparent;color:var(--button-active-text-color);transform:translateY(1px)}.lib-button-primary{--button-default-color: #2563eb;--button-default-hover-color: #1d4ed8;--button-default-active-color: #1e40af}.lib-button-secondary{--button-default-color: #64748b;--button-default-hover-color: #475569;--button-default-active-color: #334155}.lib-button-success{--button-default-color: #16a34a;--button-default-hover-color: #15803d;--button-default-active-color: #166534}.lib-button-danger{--button-default-color: #dc2626;--button-default-hover-color: #b91c1c;--button-default-active-color: #991b1b}.lib-button-warning{--button-default-color: #f59e0b;--button-default-hover-color: #d97706;--button-default-active-color: #b45309}.lib-button-info{--button-default-color: #0891b2;--button-default-hover-color: #0e7490;--button-default-active-color: #155e75}.lib-button-neutral{--button-default-color: #374151;--button-default-hover-color: #1f2937;--button-default-active-color: #111827}.lib-button-light{--button-default-color: #f8fafc;--button-default-hover-color: #e2e8f0;--button-default-active-color: #cbd5e1;--button-text-color: #1e293b}.lib-button-dark{--button-default-color: #1e293b;--button-default-hover-color: #0f172a;--button-default-active-color: #020617;--button-text-color: #ffffff}.lib-button-link{--button-default-color: #2563eb;--button-default-hover-color: #1d4ed8;--button-default-active-color: #1e40af;background:transparent;border-color:transparent;color:var(--button-custom-color);padding-left:4px;padding-right:4px}.lib-button-link:hover:not(:disabled){background:transparent;border-color:transparent;color:var(--button-hover-color);text-decoration:underline}.lib-button-link:active:not(:disabled){background:transparent;border-color:transparent;color:var(--button-active-color);transform:none}.lib-button:focus-visible{outline:3px solid rgba(37,99,235,.25);outline-offset:2px}.lib-button:disabled{background:var(--button-disabled-color)!important;border-color:var(--button-disabled-border-color)!important;color:var(--button-disabled-text-color)!important;cursor:not-allowed;opacity:.8;transform:none!important;box-shadow:none!important}.lib-button-link:disabled{background:transparent!important;border-color:transparent!important;color:var(--button-disabled-text-color)!important;text-decoration:none}@media(max-width:480px){.lib-button-xl{min-height:50px;padding:11px 22px;font-size:16px}.lib-button-lg{min-height:44px;padding:10px 18px;font-size:15px}.lib-button-md{min-height:38px;padding:8px 16px}}\n"] }]
182
+ }], propDecorators: { text: [{
183
+ type: Input
184
+ }], type: [{
185
+ type: Input
186
+ }], variant: [{
187
+ type: Input
188
+ }], color: [{
189
+ type: Input
190
+ }], customColor: [{
191
+ type: Input
192
+ }], hoverColor: [{
193
+ type: Input
194
+ }], activeColor: [{
195
+ type: Input
196
+ }], textColor: [{
197
+ type: Input
198
+ }], borderColor: [{
199
+ type: Input
200
+ }], hoverTextColor: [{
201
+ type: Input
202
+ }], activeTextColor: [{
203
+ type: Input
204
+ }], disabledColor: [{
205
+ type: Input
206
+ }], disabledTextColor: [{
207
+ type: Input
208
+ }], disabledBorderColor: [{
209
+ type: Input
210
+ }], size: [{
211
+ type: Input
212
+ }], disabled: [{
213
+ type: Input
214
+ }], buttonClick: [{
215
+ type: Output
216
+ }] } });
217
+
218
+ class Card {
219
+ title = 'Last 24 hours';
220
+ month = 'Jul';
221
+ day = 9;
222
+ description = '156 flights were monitored with 96.8% on-time performance. Minor delays occurred due to weather and air traffic.';
223
+ cardClick = new EventEmitter();
224
+ onCardClick() {
225
+ this.cardClick.emit();
226
+ }
227
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Card, deps: [], target: i0.ɵɵFactoryTarget.Component });
228
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: Card, isStandalone: true, selector: "lib-card", inputs: { title: "title", month: "month", day: "day", description: "description" }, outputs: { cardClick: "cardClick" }, ngImport: i0, template: "<div\n class=\"last-24-hours-card mat-elevation-z1\"\n (click)=\"onCardClick()\"\n role=\"button\"\n tabindex=\"0\"\n>\n\n <!-- Title -->\n <h2 class=\"mat-headline-4 card-title\">\n {{ title }}\n </h2>\n\n <!-- Content -->\n <div class=\"card-content\">\n\n <!-- Date -->\n <div class=\"date-box\">\n\n <div class=\"month mat-title-medium\">\n {{ month }}\n </div>\n\n <div class=\"date-line\"></div>\n\n <div class=\"day mat-headline-5\">\n {{ day }}\n </div>\n\n </div>\n\n <!-- Description -->\n <div class=\"description mat-body-large\">\n {{ description }}\n </div>\n\n </div>\n\n</div>", styles: ["@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";.last-24-hours-card{width:100%;min-height:285px;box-sizing:border-box;border:3px solid #dedede;border-radius:12px;padding:30px 26px;background:#fff;display:flex;flex-direction:column;cursor:pointer;transition:box-shadow .2s ease,transform .2s ease,border-color .2s ease}.last-24-hours-card:hover{border-color:#c8c8c8;box-shadow:0 4px 12px #00000014;transform:translateY(-2px)}.card-title{margin:0 0 34px;font-size:38px;font-weight:700;line-height:1.1}.card-content{display:flex;align-items:center;gap:25px;flex:1}.date-box{width:92px;min-width:92px;height:96px;border-radius:9px;background:#eef5ff;display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box}.month{color:#1e5eff;font-weight:700;font-size:24px;line-height:1}.date-line{width:60px;height:2px;background:#b8b8b8;margin:8px 0 7px}.day{color:#000;font-size:26px;font-weight:700;line-height:1}.description{max-width:560px;color:#222;font-size:20px;font-weight:500;line-height:1.3}@media(max-width:768px){.last-24-hours-card{padding:25px 20px}.card-title{font-size:32px;margin-bottom:25px}.description{font-size:18px}}@media(max-width:500px){.last-24-hours-card{min-height:auto;padding:22px 16px}.card-title{font-size:28px;margin-bottom:22px}.card-content{align-items:flex-start;gap:16px}.date-box{width:75px;min-width:75px;height:85px}.month{font-size:20px}.date-line{width:48px}.day{font-size:23px}.description{font-size:16px}}\n"] });
229
+ }
230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Card, decorators: [{
231
+ type: Component,
232
+ args: [{ selector: 'lib-card', imports: [], template: "<div\n class=\"last-24-hours-card mat-elevation-z1\"\n (click)=\"onCardClick()\"\n role=\"button\"\n tabindex=\"0\"\n>\n\n <!-- Title -->\n <h2 class=\"mat-headline-4 card-title\">\n {{ title }}\n </h2>\n\n <!-- Content -->\n <div class=\"card-content\">\n\n <!-- Date -->\n <div class=\"date-box\">\n\n <div class=\"month mat-title-medium\">\n {{ month }}\n </div>\n\n <div class=\"date-line\"></div>\n\n <div class=\"day mat-headline-5\">\n {{ day }}\n </div>\n\n </div>\n\n <!-- Description -->\n <div class=\"description mat-body-large\">\n {{ description }}\n </div>\n\n </div>\n\n</div>", styles: ["@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";.last-24-hours-card{width:100%;min-height:285px;box-sizing:border-box;border:3px solid #dedede;border-radius:12px;padding:30px 26px;background:#fff;display:flex;flex-direction:column;cursor:pointer;transition:box-shadow .2s ease,transform .2s ease,border-color .2s ease}.last-24-hours-card:hover{border-color:#c8c8c8;box-shadow:0 4px 12px #00000014;transform:translateY(-2px)}.card-title{margin:0 0 34px;font-size:38px;font-weight:700;line-height:1.1}.card-content{display:flex;align-items:center;gap:25px;flex:1}.date-box{width:92px;min-width:92px;height:96px;border-radius:9px;background:#eef5ff;display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box}.month{color:#1e5eff;font-weight:700;font-size:24px;line-height:1}.date-line{width:60px;height:2px;background:#b8b8b8;margin:8px 0 7px}.day{color:#000;font-size:26px;font-weight:700;line-height:1}.description{max-width:560px;color:#222;font-size:20px;font-weight:500;line-height:1.3}@media(max-width:768px){.last-24-hours-card{padding:25px 20px}.card-title{font-size:32px;margin-bottom:25px}.description{font-size:18px}}@media(max-width:500px){.last-24-hours-card{min-height:auto;padding:22px 16px}.card-title{font-size:28px;margin-bottom:22px}.card-content{align-items:flex-start;gap:16px}.date-box{width:75px;min-width:75px;height:85px}.month{font-size:20px}.date-line{width:48px}.day{font-size:23px}.description{font-size:16px}}\n"] }]
233
+ }], propDecorators: { title: [{
234
+ type: Input
235
+ }], month: [{
236
+ type: Input
237
+ }], day: [{
238
+ type: Input
239
+ }], description: [{
240
+ type: Input
241
+ }], cardClick: [{
242
+ type: Output
243
+ }] } });
244
+
83
245
  /*
84
246
  * Public API Surface of balinaui-components
85
247
  */
@@ -88,5 +250,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
88
250
  * Generated bundle index. Do not edit.
89
251
  */
90
252
 
91
- export { BalinauiComponents, Navbar };
253
+ export { BalinauiComponents, Button, Card, Navbar };
92
254
  //# sourceMappingURL=balinasoftware-balinaui-components.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"balinasoftware-balinaui-components.mjs","sources":["../../../projects/balinaui-components/src/lib/balinaui-components.ts","../../../projects/balinaui-components/src/lib/navbar/navbar.ts","../../../projects/balinaui-components/src/lib/navbar/navbar.html","../../../projects/balinaui-components/src/public-api.ts","../../../projects/balinaui-components/src/balinasoftware-balinaui-components.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-balinaui-components',\n imports: [],\n template: ` <p>balinaui-components works!</p> `,\n styles: ``,\n})\nexport class BalinauiComponents {}\n","import { Component,ElementRef,HostListener,Input,Output,ViewEncapsulation, } from '@angular/core';\nimport { EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface NavLink {\n label: string;\n url: string;\n}\n\n@Component({\n selector: 'lib-navbar',\n imports: [CommonModule],\n templateUrl: './navbar.html',\n styleUrl: './navbar.css',\n})\nexport class Navbar {\n @Input() brand = 'Aero';\n @Input() links: NavLink[] = [\n { label: 'Home', url: '/' },\n { label: 'About', url: '/about' },\n { label: 'Contact', url: '/contact' }\n ];\n @Input() initiallyLoggedIn = false;\n @Input() userName = 'Guest User';\n @Input() userEmail = 'guest@example.com';\n \n @Input()image = 'https://i.pinimg.com/1200x/4a/57/0c/4a570c4e8dbb4729567848eb69c19055.jpg';\n\n @Output() login = new EventEmitter();\n @Output() logout = new EventEmitter();\n\n isLoggedIn = false;\n isDropdownOpen = false;\nAerologo: any;\n\n constructor(private elementRef: ElementRef) {}\n\n ngOnInit() {\n this.isLoggedIn = this.initiallyLoggedIn;\n }\n\n handleLoginClick() {\n this.isLoggedIn = true;\n this.login.emit();\n }\n\n handleProfileClick() {\n this.isDropdownOpen = !this.isDropdownOpen;\n }\n\n handleLogoutClick() {\n this.isLoggedIn = false;\n this.isDropdownOpen = false;\n this.logout.emit();\n }\n\n // Close the dropdown when clicking outside of it\n @HostListener('document:mousedown', ['$event'])\n onDocumentClick(event: MouseEvent) {\n if (this.isDropdownOpen && !this.elementRef.nativeElement.contains(event.target)) {\n this.isDropdownOpen = false;\n }\n }\n}\n","<header class=\"anv-navbar\">\n <div class=\"anv-topbar\"></div>\n <div class=\"anv-stripes\">\n <div class=\"anv-content\">\n <div class=\"anv-brand\">\n <img [src]=\"image\"\n [alt]=\"Aerologo\"\n class=\"anv-brand-icon\" >\n </div>\n\n <nav class=\"anv-links\">\n <a\n *ngFor=\"let link of links\"\n [href]=\"link.url\"\n class=\"anv-link\">\n {{ link.label }}\n </a>\n </nav>\n\n <div class=\"anv-actions\">\n <button class=\"anv-icon-btn\" aria-label=\"Notifications\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\"/>\n <path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\"/>\n </svg>\n </button>\n\n <span class=\"anv-divider\"></span>\n\n <button *ngIf=\"!isLoggedIn\" class=\"anv-login-btn\" (click)=\"handleLoginClick()\">\n Login\n </button>\n\n <div *ngIf=\"isLoggedIn\" class=\"anv-profile-wrap\">\n <button\n class=\"anv-profile-btn\"\n (click)=\"handleProfileClick()\"\n [attr.aria-expanded]=\"isDropdownOpen\"\n aria-haspopup=\"true\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/>\n <circle cx=\"12\" cy=\"7\" r=\"4\"/>\n </svg>\n </button>\n\n <div *ngIf=\"isDropdownOpen\" class=\"anv-dropdown\">\n <div class=\"anv-dropdown-header\">\n <div class=\"anv-dropdown-avatar\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/>\n <circle cx=\"12\" cy=\"7\" r=\"4\"/>\n </svg>\n </div>\n <div class=\"anv-dropdown-info\">\n <span class=\"anv-dropdown-name\">{{ userName }}</span>\n <span class=\"anv-dropdown-email\">{{ userEmail }}</span>\n </div>\n </div>\n <hr class=\"anv-dropdown-sep\" />\n <button class=\"anv-dropdown-item anv-logout\" (click)=\"handleLogoutClick()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/>\n <polyline points=\"16 17 21 12 16 7\"/>\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/>\n </svg>\n Log out\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</header>","/*\n * Public API Surface of balinaui-components\n */\n\nexport * from './lib/balinaui-components';\nexport * from './lib/navbar/navbar';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"balinasoftware-balinaui-components.mjs","sources":["../../../projects/balinaui-components/src/lib/balinaui-components.ts","../../../projects/balinaui-components/src/lib/navbar/navbar.ts","../../../projects/balinaui-components/src/lib/navbar/navbar.html","../../../projects/balinaui-components/src/lib/button/button.ts","../../../projects/balinaui-components/src/lib/button/button.html","../../../projects/balinaui-components/src/lib/card/card.ts","../../../projects/balinaui-components/src/lib/card/card.html","../../../projects/balinaui-components/src/public-api.ts","../../../projects/balinaui-components/src/balinasoftware-balinaui-components.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-balinaui-components',\n imports: [],\n template: ` <p>balinaui-components works!</p> `,\n styles: ``,\n})\nexport class BalinauiComponents {}\n","import { Component, ElementRef, HostListener, Input, Output, ViewEncapsulation, } from '@angular/core';\nimport { EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { MatIconModule } from '@angular/material/icon';\nexport interface NavLink {\n label: string;\n url: string;\n}\n\nexport interface UserProfile {\n name: any;\n username: string;\n email: string;\n image?: string;\n role?: string;\n initials?: string;\n}\n@Component({\n selector: 'lib-navbar',\n standalone: true,\n imports: [CommonModule, RouterModule, MatIconModule],\n templateUrl: './navbar.html',\n styleUrl: './navbar.css',\n})\nexport class Navbar {\n\n // Brand\n @Input() brand = 'Aero';\n\n @Input() logoAlt = 'Aero logo';\n\n @Input() image = '';\n\n // Navigation\n @Input() links: NavLink[] = [];\n\n // Authentication\n @Input() initiallyLoggedIn = false;\n\n // User profile\n @Input() user: UserProfile = {\n username: 'Guest User',\n email: 'guest@example.com',\n image: '',\n role: 'Guest',\n name: undefined\n };\n\n // Icons\n @Input() notificationIcon = 'notifications';\n\n @Input() profileIcon = 'account_circle';\n\n @Input() userIcon = 'person';\n\n @Input() logoutIcon = 'logout';\n\n // Events\n @Output() login = new EventEmitter<void>();\n\n @Output() logout = new EventEmitter<void>();\n\n isLoggedIn = false;\n isDropdownOpen = false;\n\n constructor(private elementRef: ElementRef) { }\n\n ngOnInit(): void {\n this.isLoggedIn = this.initiallyLoggedIn;\n }\n\n handleLoginClick(): void {\n this.isLoggedIn = true;\n this.login.emit();\n }\n\n handleProfileClick(): void {\n this.isDropdownOpen = !this.isDropdownOpen;\n }\n\n handleLogoutClick(): void {\n this.isLoggedIn = false;\n this.isDropdownOpen = false;\n this.logout.emit();\n }\n\n @HostListener('document:mousedown', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n\n if (\n this.isDropdownOpen &&\n !this.elementRef.nativeElement.contains(event.target)\n ) {\n this.isDropdownOpen = false;\n }\n }\n}\n","<header class=\"anv-navbar\">\n\n <!--TOP STRIPE-->\n <div class=\"anv-topbar\"></div>\n <!--NAVBAR-->\n <div class=\"anv-stripes\">\n <div class=\"anv-content\">\n\n <!--BRAND / LOGO-->\n <img *ngIf=\"image\" [src]=\"image\" [alt]=\"logoAlt\" class=\"anv-brand-icon\" />\n <span *ngIf=\"brand\" class=\"anv-brand-name\">\n {{ brand }}\n </span>\n\n <!--NAVIGATION LINKS-->\n <nav class=\"anv-links\" aria-label=\"Main navigation\">\n <a *ngFor=\"let link of links\" [routerLink]=\"link.url\" routerLinkActive=\"anv-link-active\"\n [routerLinkActiveOptions]=\"{ exact: true }\" class=\"anv-link\">\n {{ link.label }}\n </a>\n </nav>\n\n\n <!--ACTIONS-->\n <div class=\"anv-actions\">\n <!--NOTIFICATION-->\n <button type=\"button\" class=\"anv-icon-btn\" aria-label=\"Notifications\">\n <span class=\"material-icons\">\n {{ notificationIcon }}\n </span>\n </button>\n\n \n <!--DIVIDER-->\n <span class=\"anv-divider\"></span>\n\n <!--LOGIN-->\n <button *ngIf=\"!isLoggedIn\" type=\"button\" class=\"anv-login-btn\" (click)=\"handleLoginClick()\">\n Login\n </button>\n\n <!--PROFILE-->\n <div *ngIf=\"isLoggedIn\" class=\"anv-profile-wrap\">\n\n <!-- PROFILE BUTTON -->\n <button type=\"button\" class=\"anv-profile-btn\" (click)=\"handleProfileClick()\"\n [attr.aria-expanded]=\"isDropdownOpen\" aria-haspopup=\"true\" aria-label=\"User profile\">\n <img *ngIf=\"user.image\" [src]=\"user.image\" [alt]=\"user.name\" class=\"anv-profile-image\" />\n <span *ngIf=\"!user.image\" class=\"material-icons\">\n {{ profileIcon }}\n </span>\n \n </button>\n\n <!-- PROFILE DROPDOWN-->\n\n <div *ngIf=\"isDropdownOpen\" class=\"anv-dropdown\">\n <!-- USER INFORMATION -->\n <div class=\"anv-dropdown-header\">\n <!-- USER IMAGE -->\n <div class=\"anv-dropdown-avatar\">\n <img *ngIf=\"user.image\" [src]=\"user.image\" [alt]=\"user.name\" />\n <span *ngIf=\"!user.image\" class=\"material-icons\">\n {{ userIcon }}\n </span>\n </div>\n\n <!-- USER DETAILS -->\n\n <div class=\"anv-dropdown-info\">\n <span class=\"anv-dropdown-name\">\n {{ user.name }}\n </span>\n <span class=\"anv-dropdown-email\">\n {{ user.email }}\n </span>\n <span *ngIf=\"user.role\" class=\"anv-dropdown-role\">\n {{ user.role }}\n </span>\n </div>\n </div>\n\n <!-- DIVIDER -->\n <hr class=\"anv-dropdown-sep\">\n <!-- LOGOUT -->\n <button type=\"button\" class=\"anv-dropdown-item anv-logout\" (click)=\"handleLogoutClick()\">\n <span class=\"material-icons\">\n {{ logoutIcon }}\n </span>\n <span>\n Log out\n </span>\n </button>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n</header>","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nexport type ButtonVariant =\n | 'solid'\n | 'outline'\n | 'ghost';\n\nexport type ButtonColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'danger'\n | 'warning'\n | 'info'\n | 'neutral'\n | 'light'\n | 'dark'\n | 'link';\n\nexport type ButtonSize =\n | 'xs'\n | 'sm'\n | 'md'\n | 'lg'\n | 'xl';\n\n@Component({\n selector: 'lib-button',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './button.html',\n styleUrl: './button.css',\n})\nexport class Button {\n // CONTENT\n @Input() text = 'Button';\n // BUTTON TYPE\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\n // VARIANT\n @Input() variant: ButtonVariant = 'solid';\n // STANDARD COLOR\n @Input() color: ButtonColor = 'primary';\n // CUSTOM COLORS\n @Input() customColor?: string;\n @Input() hoverColor?: string;\n @Input() activeColor?: string;\n @Input() textColor?: string;\n @Input() borderColor?: string;\n @Input() hoverTextColor?: string;\n @Input() activeTextColor?: string;\n @Input() disabledColor?: string;\n @Input() disabledTextColor?: string;\n @Input() disabledBorderColor?: string;\n // SIZE\n @Input() size: ButtonSize = 'md';\n // DISABLED\n @Input() disabled = false;\n // CLICK EVENT\n \n @Output() buttonClick = new EventEmitter<MouseEvent>();\n // CLICK HANDLER\n handleClick(event: MouseEvent): void {\n\n if (this.disabled) {\n event.preventDefault();\n return;\n }\n\n this.buttonClick.emit(event);\n }\n\n // CSS VARIABLES\n\n get buttonStyles(): Record<string, string> {\n\n const styles: Record<string, string> = {};\n\n if (this.customColor) {\n styles['--button-custom-color'] = this.customColor;\n }\n\n if (this.hoverColor) {\n styles['--button-hover-color'] = this.hoverColor;\n }\n\n if (this.activeColor) {\n styles['--button-active-color'] = this.activeColor;\n }\n\n if (this.textColor) {\n styles['--button-text-color'] = this.textColor;\n }\n\n if (this.borderColor) {\n styles['--button-border-color'] = this.borderColor;\n }\n\n if (this.hoverTextColor) {\n styles['--button-hover-text-color'] = this.hoverTextColor;\n }\n\n if (this.activeTextColor) {\n styles['--button-active-text-color'] = this.activeTextColor;\n }\n\n if (this.disabledColor) {\n styles['--button-disabled-color'] = this.disabledColor;\n }\n\n if (this.disabledTextColor) {\n styles['--button-disabled-text-color'] =\n this.disabledTextColor;\n }\n\n if (this.disabledBorderColor) {\n styles['--button-disabled-border-color'] =\n this.disabledBorderColor;\n }\n\n return styles;\n }\n}","<button\n [type]=\"type\"\n [disabled]=\"disabled\"\n\n [ngClass]=\"[\n 'lib-button',\n 'lib-button-' + variant,\n 'lib-button-' + color,\n 'lib-button-' + size\n ]\"\n\n [ngStyle]=\"buttonStyles\"\n\n (click)=\"handleClick($event)\"\n>\n {{ text }}\n</button>","import { Component , Input ,Output ,EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'lib-card',\n imports: [],\n templateUrl: './card.html',\n styleUrl: './card.css',\n})\nexport class Card {\n @Input() title: string = 'Last 24 hours';\n\n @Input() month: string = 'Jul';\n\n @Input() day: string | number = 9;\n\n @Input() description: string =\n '156 flights were monitored with 96.8% on-time performance. Minor delays occurred due to weather and air traffic.';\n\n @Output() cardClick = new EventEmitter<void>();\n\n onCardClick(): void {\n this.cardClick.emit();\n }\n}\n","<div\n class=\"last-24-hours-card mat-elevation-z1\"\n (click)=\"onCardClick()\"\n role=\"button\"\n tabindex=\"0\"\n>\n\n <!-- Title -->\n <h2 class=\"mat-headline-4 card-title\">\n {{ title }}\n </h2>\n\n <!-- Content -->\n <div class=\"card-content\">\n\n <!-- Date -->\n <div class=\"date-box\">\n\n <div class=\"month mat-title-medium\">\n {{ month }}\n </div>\n\n <div class=\"date-line\"></div>\n\n <div class=\"day mat-headline-5\">\n {{ day }}\n </div>\n\n </div>\n\n <!-- Description -->\n <div class=\"description mat-body-large\">\n {{ description }}\n </div>\n\n </div>\n\n</div>","/*\n * Public API Surface of balinaui-components\n */\n\nexport * from './lib/balinaui-components';\nexport * from './lib/navbar/navbar';\nexport * from './lib/button/button';\nexport * from './lib/card/card';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@balinasoftware/balinaui-components",
3
- "version": "2.2.0",
3
+ "version": "4.0.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^22.1.0",
6
6
  "@angular/core": "^22.1.0"
@@ -10,19 +10,30 @@ interface NavLink {
10
10
  label: string;
11
11
  url: string;
12
12
  }
13
+ interface UserProfile {
14
+ name: any;
15
+ username: string;
16
+ email: string;
17
+ image?: string;
18
+ role?: string;
19
+ initials?: string;
20
+ }
13
21
  declare class Navbar {
14
22
  private elementRef;
15
23
  brand: string;
24
+ logoAlt: string;
25
+ image: string;
16
26
  links: NavLink[];
17
27
  initiallyLoggedIn: boolean;
18
- userName: string;
19
- userEmail: string;
20
- image: string;
21
- login: EventEmitter<any>;
22
- logout: EventEmitter<any>;
28
+ user: UserProfile;
29
+ notificationIcon: string;
30
+ profileIcon: string;
31
+ userIcon: string;
32
+ logoutIcon: string;
33
+ login: EventEmitter<void>;
34
+ logout: EventEmitter<void>;
23
35
  isLoggedIn: boolean;
24
36
  isDropdownOpen: boolean;
25
- Aerologo: any;
26
37
  constructor(elementRef: ElementRef);
27
38
  ngOnInit(): void;
28
39
  handleLoginClick(): void;
@@ -30,8 +41,46 @@ declare class Navbar {
30
41
  handleLogoutClick(): void;
31
42
  onDocumentClick(event: MouseEvent): void;
32
43
  static ɵfac: i0.ɵɵFactoryDeclaration<Navbar, never>;
33
- static ɵcmp: i0.ɵɵComponentDeclaration<Navbar, "lib-navbar", never, { "brand": { "alias": "brand"; "required": false; }; "links": { "alias": "links"; "required": false; }; "initiallyLoggedIn": { "alias": "initiallyLoggedIn"; "required": false; }; "userName": { "alias": "userName"; "required": false; }; "userEmail": { "alias": "userEmail"; "required": false; }; "image": { "alias": "image"; "required": false; }; }, { "login": "login"; "logout": "logout"; }, never, never, true, never>;
44
+ static ɵcmp: i0.ɵɵComponentDeclaration<Navbar, "lib-navbar", never, { "brand": { "alias": "brand"; "required": false; }; "logoAlt": { "alias": "logoAlt"; "required": false; }; "image": { "alias": "image"; "required": false; }; "links": { "alias": "links"; "required": false; }; "initiallyLoggedIn": { "alias": "initiallyLoggedIn"; "required": false; }; "user": { "alias": "user"; "required": false; }; "notificationIcon": { "alias": "notificationIcon"; "required": false; }; "profileIcon": { "alias": "profileIcon"; "required": false; }; "userIcon": { "alias": "userIcon"; "required": false; }; "logoutIcon": { "alias": "logoutIcon"; "required": false; }; }, { "login": "login"; "logout": "logout"; }, never, never, true, never>;
45
+ }
46
+
47
+ type ButtonVariant = 'solid' | 'outline' | 'ghost';
48
+ type ButtonColor = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'neutral' | 'light' | 'dark' | 'link';
49
+ type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
50
+ declare class Button {
51
+ text: string;
52
+ type: 'button' | 'submit' | 'reset';
53
+ variant: ButtonVariant;
54
+ color: ButtonColor;
55
+ customColor?: string;
56
+ hoverColor?: string;
57
+ activeColor?: string;
58
+ textColor?: string;
59
+ borderColor?: string;
60
+ hoverTextColor?: string;
61
+ activeTextColor?: string;
62
+ disabledColor?: string;
63
+ disabledTextColor?: string;
64
+ disabledBorderColor?: string;
65
+ size: ButtonSize;
66
+ disabled: boolean;
67
+ buttonClick: EventEmitter<MouseEvent>;
68
+ handleClick(event: MouseEvent): void;
69
+ get buttonStyles(): Record<string, string>;
70
+ static ɵfac: i0.ɵɵFactoryDeclaration<Button, never>;
71
+ static ɵcmp: i0.ɵɵComponentDeclaration<Button, "lib-button", never, { "text": { "alias": "text"; "required": false; }; "type": { "alias": "type"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "color": { "alias": "color"; "required": false; }; "customColor": { "alias": "customColor"; "required": false; }; "hoverColor": { "alias": "hoverColor"; "required": false; }; "activeColor": { "alias": "activeColor"; "required": false; }; "textColor": { "alias": "textColor"; "required": false; }; "borderColor": { "alias": "borderColor"; "required": false; }; "hoverTextColor": { "alias": "hoverTextColor"; "required": false; }; "activeTextColor": { "alias": "activeTextColor"; "required": false; }; "disabledColor": { "alias": "disabledColor"; "required": false; }; "disabledTextColor": { "alias": "disabledTextColor"; "required": false; }; "disabledBorderColor": { "alias": "disabledBorderColor"; "required": false; }; "size": { "alias": "size"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "buttonClick": "buttonClick"; }, never, never, true, never>;
72
+ }
73
+
74
+ declare class Card {
75
+ title: string;
76
+ month: string;
77
+ day: string | number;
78
+ description: string;
79
+ cardClick: EventEmitter<void>;
80
+ onCardClick(): void;
81
+ static ɵfac: i0.ɵɵFactoryDeclaration<Card, never>;
82
+ static ɵcmp: i0.ɵɵComponentDeclaration<Card, "lib-card", never, { "title": { "alias": "title"; "required": false; }; "month": { "alias": "month"; "required": false; }; "day": { "alias": "day"; "required": false; }; "description": { "alias": "description"; "required": false; }; }, { "cardClick": "cardClick"; }, never, never, true, never>;
34
83
  }
35
84
 
36
- export { BalinauiComponents, Navbar };
37
- export type { NavLink };
85
+ export { BalinauiComponents, Button, Card, Navbar };
86
+ export type { ButtonColor, ButtonSize, ButtonVariant, NavLink, UserProfile };