@balinasoftware/balinaui-components 3.3.9 → 3.3.10

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.
@@ -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/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/lib/time-filter/time-filter.ts","../../../projects/balinaui-components/src/lib/time-filter/time-filter.html","../../../projects/balinaui-components/src/lib/text-box/text-box.ts","../../../projects/balinaui-components/src/lib/text-box/text-box.html","../../../projects/balinaui-components/src/lib/date-input/date-input.ts","../../../projects/balinaui-components/src/lib/date-input/date-input.html","../../../projects/balinaui-components/src/lib/dropdown/dropdown.ts","../../../projects/balinaui-components/src/lib/dropdown/dropdown.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';\n\n@Component({\n selector: 'lib-button',\n standalone: true,\n imports: [],\n templateUrl: './button.html',\n styleUrl: './button.css'\n})\nexport class Button {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input() label: string = 'Button';\n\n @Input() type:\n 'button' | 'submit' | 'reset' = 'button';\n\n @Input() disabled: boolean = false;\n\n @Input() loading: boolean = false;\n\n @Input() customClass: string = '';\n\n\n // =========================================\n // OUTPUTS\n // =========================================\n\n @Output() clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // CLICK\n // =========================================\n\n onClick(event: MouseEvent): void {\n\n if (\n this.disabled ||\n this.loading\n ) {\n event.preventDefault();\n return;\n }\n\n // Developer event\n this.clicked.emit(event);\n }\n}","<button\n class=\"balina-button\"\n [class]=\"customClass\"\n [type]=\"type\"\n [disabled]=\"disabled || loading\"\n [attr.aria-busy]=\"loading\"\n (click)=\"onClick($event)\"\n>\n\n @if (loading) {\n\n <span\n class=\"button-spinner\"\n aria-hidden=\"true\"\n ></span>\n\n <span>\n Loading...\n </span>\n\n } @else {\n\n <span class=\"button-label\">\n {{ label }}\n </span>\n\n }\n\n</button>","import {\n Component,\n Input,\n Output,\n EventEmitter\n} from '@angular/core';\n\n@Component({\n selector: 'lib-card',\n standalone: true,\n imports: [],\n templateUrl: './card.html',\n styleUrl: './card.css',\n})\nexport class Card {\n\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 =\n new EventEmitter<void>();\n\n\n@Input() customClass: string = '';\n\n@Input() clickable: boolean = false;\n\n@Input() disabled: boolean = false;\n\n@Output() clicked =\n new EventEmitter<MouseEvent>();\n\nonClick(event: MouseEvent): void {\n\n if (\n !this.clickable ||\n this.disabled\n ) {\n return;\n }\n\n this.clicked.emit(event);\n}\n}","<div\n class=\"balina-card\"\n [class]=\"customClass\"\n [class.card-clickable]=\"clickable\"\n [class.card-disabled]=\"disabled\"\n (click)=\"onClick($event)\"\n>\n\n <!-- Title -->\n <h2 class=\"card-title\">\n {{ title }}\n </h2>\n\n <!-- Card Content -->\n <div class=\"card-content\">\n\n <!-- Date -->\n <div class=\"card-date\">\n\n <div class=\"card-month\">\n {{ month }}\n </div>\n\n <div class=\"card-line\"></div>\n\n <div class=\"card-day\">\n {{ day }}\n </div>\n\n </div>\n\n <!-- Description -->\n <div class=\"card-description\">\n {{ description }}\n </div>\n\n </div>\n\n</div>","import { Component, Input, Output, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'lib-time-filter',\n standalone: true,\n imports: [],\n templateUrl: './time-filter.html',\n styleUrl: './time-filter.css',\n})\nexport class TimeFilter {\n\n @Input() label: string = '';\n\n @Input() value!: string;\n\n @Input() selectedValue: string = '';\n\n @Output() selectedValueChange = new EventEmitter<string>();\n\n @Output() clicked = new EventEmitter<MouseEvent>();\n\n get selected(): boolean {\n return this.value === this.selectedValue;\n }\n\n onClick(event: MouseEvent): void {\n\n // If already selected → unselect\n if (this.selected) {\n this.selectedValueChange.emit('');\n }\n\n // If not selected → select\n else {\n this.selectedValueChange.emit(this.value);\n }\n\n // Developer custom event\n this.clicked.emit(event);\n }\n}\n","<div class=\"time-filter\" (click)=\"onClick($event)\" role=\"button\" tabindex=\"0\">\n <div class=\"radio-circle\" [class.selected]=\"selected\">\n <div class=\"radio-dot\"></div>\n </div>\n\n <span class=\"label\">\n {{ label }}\n </span>\n</div>","import {Component,EventEmitter,HostBinding,Input,Output} from '@angular/core';\n\n@Component({\n selector: 'lib-text-box',\n standalone: true,\n imports: [],\n templateUrl: './text-box.html',\n styleUrl: './text-box.css'\n})\nexport class TextBox {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input() placeholder: string = '';\n\n @Input() value: string = '';\n\n @Input() type: string = 'text';\n\n @Input() disabled: boolean = false;\n\n @Input() readonly: boolean = false;\n\n /**\n * Developer custom CSS class.\n *\n * Example:\n *\n * customClass=\"flight-input\"\n */\n @Input()\n @HostBinding('class')\n customClass: string = '';\n\n\n // =========================================\n // OUTPUT EVENTS\n // =========================================\n\n /**\n * Emits the current value.\n */\n @Output()\n valueChange =\n new EventEmitter<string>();\n\n /**\n * Emits whenever the user types.\n */\n @Output()\n inputChange =\n new EventEmitter<string>();\n\n /**\n * Emits whenever the textbox is clicked.\n */\n @Output()\n clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // PASSWORD VISIBILITY\n // =========================================\n\n /**\n * Controls password visibility.\n */\n showPassword: boolean = false;\n\n\n /**\n * Returns the actual input type.\n *\n * password + showPassword\n * becomes text.\n */\n get inputType(): string {\n\n if (this.type === 'password') {\n\n return this.showPassword\n ? 'text'\n : 'password';\n }\n\n return this.type;\n }\n\n\n /**\n * Show/hide password.\n */\n togglePassword(event: MouseEvent): void {\n\n event.stopPropagation();\n\n this.showPassword =\n !this.showPassword;\n }\n\n\n // =========================================\n // INPUT HANDLER\n // =========================================\n\n onInput(event: Event): void {\n\n const input =\n event.target as HTMLInputElement;\n\n this.value = input.value;\n\n // Emit current value\n this.valueChange.emit(\n this.value\n );\n\n // Emit input event\n this.inputChange.emit(\n this.value\n );\n }\n\n\n // =========================================\n // CLICK HANDLER\n // =========================================\n\n onClick(event: MouseEvent): void {\n\n this.clicked.emit(event);\n }\n}","<div class=\"text-box-container\">\n\n <div class=\"text-box-input-wrapper\">\n\n <input\n class=\"text-box-input\"\n\n [type]=\"inputType\"\n\n [placeholder]=\"placeholder\"\n\n [value]=\"value\"\n\n [disabled]=\"disabled\"\n\n [readonly]=\"readonly\"\n\n (input)=\"onInput($event)\"\n\n (click)=\"onClick($event)\"\n />\n\n <!-- Password Eye Button -->\n @if (type === 'password') {\n\n <button\n type=\"button\"\n class=\"text-box-password-button\"\n\n [disabled]=\"disabled\"\n\n (click)=\"togglePassword($event)\"\n aria-label=\"Toggle password visibility\"\n >\n\n @if (showPassword) {\n\n <!-- Eye Off -->\n <svg\n class=\"text-box-password-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n d=\"M3 3l18 18\"\n />\n\n <path\n d=\"M10.6 10.6a2 2 0 1 0 2.8 2.8\"\n />\n\n <path\n d=\"M9.9 4.2A10.8 10.8 0 0 1 12 4c5 0 8.7 4.2 9.8 8a10.8 10.8 0 0 1-3.1 5.1\"\n />\n\n <path\n d=\"M6.2 6.2C4.5 7.4 3.2 9.2 2.2 12c1.1 3.8 4.8 8 9.8 8 1.7 0 3.3-.5 4.7-1.2\"\n />\n </svg>\n\n } @else {\n\n <!-- Eye -->\n <svg\n class=\"text-box-password-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n d=\"M2 12s3.5-7 10-7\n 10 7 10 7\n -3.5 7-10 7\n -10-7-10-7z\"\n />\n\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"3\"\n />\n </svg>\n\n }\n\n </button>\n\n }\n\n </div>\n\n</div>","import {Component,EventEmitter,HostListener,Input,Output} from '@angular/core';\n\n@Component({\n selector: 'lib-date-input',\n standalone: true,\n imports: [],\n templateUrl: './date-input.html',\n styleUrl: './date-input.css'\n})\nexport class DateInput {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input() label: string = '';\n\n @Input() placeholder: string = 'Select date';\n\n @Input() value: string = '';\n\n @Input() disabled: boolean = false;\n\n @Input() readonly: boolean = false;\n\n @Input() customClass: string = '';\n\n\n // =========================================\n // OUTPUTS\n // =========================================\n\n @Output() valueChange =\n new EventEmitter<string>();\n\n @Output() dateChange =\n new EventEmitter<Date>();\n\n @Output() openedChange =\n new EventEmitter<boolean>();\n\n @Output() clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // INTERNAL STATE\n // =========================================\n\n isOpen: boolean = false;\n\n currentDate: Date = new Date();\n\n\n // =========================================\n // CALENDAR DAYS\n // =========================================\n\n get calendarDays(): Date[] {\n\n const year =\n this.currentDate.getFullYear();\n\n const month =\n this.currentDate.getMonth();\n\n const firstDay =\n new Date(year, month, 1);\n\n const lastDay =\n new Date(year, month + 1, 0);\n\n const days: Date[] = [];\n\n const startDay =\n firstDay.getDay();\n\n for (let i = 0; i < startDay; i++) {\n\n const previousDate =\n new Date(\n year,\n month,\n i - startDay + 1\n );\n\n days.push(previousDate);\n }\n\n for (\n let day = 1;\n day <= lastDay.getDate();\n day++\n ) {\n\n days.push(\n new Date(\n year,\n month,\n day\n )\n );\n }\n\n const remaining =\n 42 - days.length;\n\n for (\n let i = 1;\n i <= remaining;\n i++\n ) {\n\n days.push(\n new Date(\n year,\n month + 1,\n i\n )\n );\n }\n\n return days;\n }\n\n\n // =========================================\n // MONTH NAME\n // =========================================\n\n get monthName(): string {\n\n return this.currentDate.toLocaleString(\n 'default',\n {\n month: 'long'\n }\n );\n }\n\n\n get year(): number {\n\n return this.currentDate.getFullYear();\n }\n\n\n // =========================================\n // OPEN / CLOSE\n // =========================================\n\n toggleCalendar(event?: MouseEvent): void {\n\n if (\n this.disabled ||\n this.readonly\n ) {\n return;\n }\n\n if (event) {\n this.clicked.emit(event);\n }\n\n this.isOpen = !this.isOpen;\n\n this.openedChange.emit(\n this.isOpen\n );\n }\n\n\n // =========================================\n // PREVIOUS MONTH\n // =========================================\n\n previousMonth(): void {\n\n this.currentDate =\n new Date(\n this.year,\n this.currentDate.getMonth() - 1,\n 1\n );\n }\n\n\n // =========================================\n // NEXT MONTH\n // =========================================\n\n nextMonth(): void {\n\n this.currentDate =\n new Date(\n this.year,\n this.currentDate.getMonth() + 1,\n 1\n );\n }\n\n\n // =========================================\n // SELECT DATE\n // =========================================\n\n selectDate(\n date: Date,\n event: MouseEvent\n ): void {\n\n if (this.disabled) {\n return;\n }\n\n this.value =\n this.formatDate(date);\n\n this.valueChange.emit(\n this.value\n );\n\n this.dateChange.emit(\n date\n );\n\n this.clicked.emit(event);\n\n this.isOpen = false;\n\n this.openedChange.emit(false);\n }\n\n\n // =========================================\n // FORMAT DATE\n // =========================================\n\n formatDate(date: Date): string {\n\n const day =\n String(date.getDate())\n .padStart(2, '0');\n\n const month =\n String(date.getMonth() + 1)\n .padStart(2, '0');\n\n const year =\n date.getFullYear();\n\n return `${year}-${month}-${day}`;\n }\n\n\n // =========================================\n // CHECK CURRENT MONTH\n // =========================================\n\n isCurrentMonth(date: Date): boolean {\n\n return (\n date.getMonth() ===\n this.currentDate.getMonth() &&\n date.getFullYear() ===\n this.currentDate.getFullYear()\n );\n }\n\n\n // =========================================\n // CHECK TODAY\n // =========================================\n\n isToday(date: Date): boolean {\n\n const today = new Date();\n\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n }\n\n\n // =========================================\n // CHECK SELECTED DATE\n // =========================================\n\n isSelected(date: Date): boolean {\n\n return (\n this.value ===\n this.formatDate(date)\n );\n }\n\n\n // =========================================\n // OUTSIDE CLICK\n // =========================================\n\n @HostListener(\n 'document:click',\n ['$event']\n )\n onDocumentClick(\n event: MouseEvent\n ): void {\n\n const target =\n event.target as HTMLElement;\n\n const dateInput =\n target.closest('lib-date-input');\n\n if (\n !dateInput &&\n this.isOpen\n ) {\n\n this.isOpen = false;\n\n this.openedChange.emit(false);\n }\n }\n}","<div\n class=\"date-input-container\"\n [class]=\"customClass\"\n [class.date-input-disabled]=\"disabled\"\n [class.date-input-open]=\"isOpen\"\n>\n\n <!-- INPUT -->\n\n <div\n class=\"date-input-field\"\n (click)=\"toggleCalendar($event)\"\n >\n\n @if (label) {\n <label class=\"date-input-label\">\n {{ label }}\n </label>\n }\n\n <span\n class=\"date-input-value\"\n [class.date-input-placeholder]=\"!value\"\n >\n {{ value || placeholder }}\n </span>\n\n <!-- Calendar Icon -->\n\n <span class=\"calendar-icon\">\n\n <span class=\"calendar-top\"></span>\n\n <span class=\"calendar-body\"></span>\n\n </span>\n\n </div>\n\n\n <!-- DATE PICKER -->\n\n @if (isOpen) {\n\n <div\n class=\"date-picker\"\n (click)=\"$event.stopPropagation()\"\n >\n\n <!-- HEADER -->\n\n <div class=\"date-picker-header\">\n\n <button\n type=\"button\"\n class=\"month-button\"\n (click)=\"previousMonth()\"\n >\n ‹\n </button>\n\n <span class=\"month-title\">\n {{ monthName }} {{ year }}\n </span>\n\n <button\n type=\"button\"\n class=\"month-button\"\n (click)=\"nextMonth()\"\n >\n ›\n </button>\n\n </div>\n\n\n <!-- WEEK DAYS -->\n\n <div class=\"week-days\">\n\n <span>Sun</span>\n <span>Mon</span>\n <span>Tue</span>\n <span>Wed</span>\n <span>Thu</span>\n <span>Fri</span>\n <span>Sat</span>\n\n </div>\n\n\n <!-- DAYS -->\n\n <div class=\"calendar-days\">\n\n @for (\n date of calendarDays;\n track date.getTime()\n ) {\n\n <button\n type=\"button\"\n\n class=\"calendar-day\"\n\n [class.other-month]=\"\n !isCurrentMonth(date)\n \"\n\n [class.today]=\"\n isToday(date)\n \"\n\n [class.selected]=\"\n isSelected(date)\n \"\n\n (click)=\"\n selectDate(date, $event)\n \"\n >\n\n {{ date.getDate() }}\n\n </button>\n\n }\n\n </div>\n\n </div>\n\n }\n\n</div>","import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';\n\nexport interface DropdownOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'lib-dropdown',\n standalone: true,\n imports: [],\n templateUrl: './dropdown.html',\n styleUrl: './dropdown.css'\n})\nexport class Dropdown {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input() label: string = '';\n\n @Input() placeholder: string = 'Select';\n\n @Input() options: DropdownOption[] = [];\n\n @Input() value: string = '';\n\n @Input() disabled: boolean = false;\n\n @Input() searchable: boolean = true;\n\n @Input() customClass: string = '';\n\n\n // =========================================\n // OUTPUTS\n // =========================================\n\n /**\n * Emits the selected value.\n */\n @Output() valueChange =\n new EventEmitter<string>();\n\n /**\n * Emits the complete selected option.\n */\n @Output() selectionChange =\n new EventEmitter<DropdownOption>();\n\n /**\n * Emits when the dropdown opens/closes.\n */\n @Output() openedChange =\n new EventEmitter<boolean>();\n\n /**\n * Developer click event.\n */\n @Output() clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // INTERNAL STATE\n // =========================================\n\n isOpen: boolean = false;\n\n searchText: string = '';\n\n\n // =========================================\n // FILTERED OPTIONS\n // =========================================\n\n get filteredOptions(): DropdownOption[] {\n\n const search =\n this.searchText\n .trim()\n .toLowerCase();\n\n if (!search) {\n return this.options;\n }\n\n return this.options.filter(option =>\n option.label\n .toLowerCase()\n .includes(search)\n );\n }\n\n\n // =========================================\n // SELECTED OPTION\n // =========================================\n\n get selectedOption(): DropdownOption | undefined {\n\n return this.options.find(\n option =>\n option.value === this.value\n );\n }\n\n\n // =========================================\n // OPEN / CLOSE\n // =========================================\n\n toggleDropdown(event?: MouseEvent): void {\n\n if (this.disabled) {\n return;\n }\n\n if (event) {\n this.clicked.emit(event);\n }\n\n this.isOpen = !this.isOpen;\n\n this.openedChange.emit(\n this.isOpen\n );\n\n if (!this.isOpen) {\n this.searchText = '';\n }\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n\n const target =\n event.target as HTMLElement;\n\n const dropdown =\n target.closest('lib-dropdown');\n\n if (!dropdown && this.isOpen) {\n\n this.isOpen = false;\n\n this.searchText = '';\n\n this.openedChange.emit(false);\n }\n }\n\n // =========================================\n // SELECT OPTION\n // =========================================\n\n selectOption(\n option: DropdownOption,\n event: MouseEvent\n ): void {\n\n if (option.disabled) {\n return;\n }\n\n this.value = option.value;\n\n this.valueChange.emit(\n option.value\n );\n\n this.selectionChange.emit(\n option\n );\n\n this.clicked.emit(event);\n\n this.isOpen = false;\n\n this.openedChange.emit(false);\n\n this.searchText = '';\n }\n\n\n // =========================================\n // SEARCH\n // =========================================\n\n onSearch(event: Event): void {\n\n const input =\n event.target as HTMLInputElement;\n\n this.searchText =\n input.value;\n }\n}","<div\n class=\"dropdown-container\"\n [class]=\"customClass\"\n [class.dropdown-disabled]=\"disabled\"\n [class.dropdown-open]=\"isOpen\"\n>\n\n <!-- =====================================\n DROPDOWN FIELD\n ===================================== -->\n\n <div\n class=\"dropdown-field\"\n (click)=\"toggleDropdown($event)\"\n >\n\n <!-- Label -->\n\n @if (label) {\n <label class=\"dropdown-label\">\n {{ label }}\n </label>\n }\n\n\n <!-- Selected value -->\n\n <span\n class=\"dropdown-value\"\n [class.dropdown-placeholder]=\"!selectedOption\"\n >\n {{\n selectedOption?.label ||\n placeholder\n }}\n </span>\n\n\n <!-- Arrow -->\n\n <span\n class=\"dropdown-arrow\"\n [class.arrow-up]=\"isOpen\"\n >\n </span>\n\n </div>\n\n\n <!-- =====================================\n DROPDOWN MENU\n ===================================== -->\n\n @if (isOpen) {\n\n <div\n class=\"dropdown-menu\"\n (click)=\"$event.stopPropagation()\"\n >\n\n <!-- Search -->\n\n @if (searchable) {\n\n <div class=\"dropdown-search\">\n\n <input\n type=\"text\"\n class=\"dropdown-search-input\"\n\n placeholder=\"Search...\"\n\n [value]=\"searchText\"\n\n (input)=\"onSearch($event)\"\n />\n\n </div>\n\n }\n\n\n <!-- Options -->\n\n <div class=\"dropdown-options\">\n\n @for (\n option of filteredOptions;\n track option.value\n ) {\n\n <div\n class=\"dropdown-option\"\n\n [class.option-disabled]=\"\n option.disabled\n \"\n\n [class.option-selected]=\"\n option.value === value\n \"\n\n (click)=\"\n selectOption(option, $event)\n \"\n >\n\n {{ option.label }}\n\n </div>\n\n }\n\n\n <!-- No result -->\n\n @if (filteredOptions.length === 0) {\n\n <div class=\"dropdown-no-result\">\n No results found\n </div>\n\n }\n\n </div>\n\n </div>\n\n }\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';\nexport * from './lib/time-filter/time-filter';\nexport * from './lib/text-box/text-box';\nexport * from './lib/date-input/date-input';\nexport * from './lib/dropdown/dropdown';","/**\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/lib/time-filter/time-filter.ts","../../../projects/balinaui-components/src/lib/time-filter/time-filter.html","../../../projects/balinaui-components/src/lib/text-box/text-box.ts","../../../projects/balinaui-components/src/lib/text-box/text-box.html","../../../projects/balinaui-components/src/lib/date-input/date-input.ts","../../../projects/balinaui-components/src/lib/date-input/date-input.html","../../../projects/balinaui-components/src/lib/dropdown/dropdown.ts","../../../projects/balinaui-components/src/lib/dropdown/dropdown.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,HostBinding,Input,Output} from '@angular/core';\n\n@Component({\n selector: 'lib-button',\n standalone: true,\n imports: [],\n templateUrl: './button.html',\n styleUrl: './button.css'\n})\nexport class Button {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input()\n label: string = 'Button';\n\n @Input()\n type:\n 'button' | 'submit' | 'reset' = 'button';\n\n @Input()\n disabled: boolean = false;\n\n @Input()\n loading: boolean = false;\n\n /**\n * Controls whether the button is clickable.\n */\n @Input()\n clickable: boolean = true;\n\n /**\n * Developer custom CSS class.\n */\n @Input()\n @HostBinding('class')\n customClass: string = '';\n\n\n // =========================================\n // HOST CLASSES\n // =========================================\n\n @HostBinding('class.button-clickable')\n get buttonClickable(): boolean {\n return (\n this.clickable &&\n !this.disabled &&\n !this.loading\n );\n }\n\n\n @HostBinding('class.button-disabled')\n get buttonDisabled(): boolean {\n return (\n this.disabled ||\n this.loading\n );\n }\n\n\n // =========================================\n // OUTPUTS\n // =========================================\n\n /**\n * Developer click event.\n */\n @Output()\n clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // CLICK HANDLER\n // =========================================\n\n onClick(\n event: MouseEvent\n ): void {\n\n if (\n this.disabled ||\n this.loading ||\n !this.clickable\n ) {\n\n event.preventDefault();\n\n event.stopPropagation();\n\n return;\n }\n\n this.clicked.emit(event);\n }\n}","<button\n class=\"balina-button\"\n\n [type]=\"type\"\n\n [disabled]=\"\n disabled ||\n loading ||\n !clickable\n \"\n\n [attr.aria-disabled]=\"\n disabled ||\n loading ||\n !clickable\n \"\n\n [attr.aria-busy]=\"loading\"\n\n (click)=\"onClick($event)\"\n>\n\n <!-- =====================================\n LOADING\n ===================================== -->\n\n @if (loading) {\n\n <span\n class=\"button-spinner\"\n aria-hidden=\"true\"\n ></span>\n\n <span class=\"button-loading-text\">\n Loading...\n </span>\n\n }\n\n <!-- =====================================\n NORMAL\n ===================================== -->\n\n @else {\n\n <span class=\"button-label\">\n {{ label }}\n </span>\n\n }\n\n</button>","import {\n Component,\n EventEmitter,\n Input,\n Output\n} from '@angular/core';\n\n@Component({\n selector: 'lib-card',\n standalone: true,\n imports: [],\n templateUrl: './card.html',\n styleUrl: './card.css'\n})\nexport class Card {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input()\n title: string = 'Last 24 hours';\n\n @Input()\n month: string = 'Jul';\n\n @Input()\n day: string | number = 9;\n\n @Input()\n description: string =\n '156 flights were monitored with 96.8% on-time performance. Minor delays occurred due to weather and air traffic.';\n\n /**\n * Developer custom CSS class.\n */\n @Input()\n customClass: string = '';\n\n /**\n * Controls whether the card is clickable.\n */\n @Input()\n clickable: boolean = true;\n\n /**\n * Disables card interaction.\n */\n @Input()\n disabled: boolean = false;\n\n\n // =========================================\n // OUTPUTS\n // =========================================\n\n /**\n * Legacy / specific card click event.\n */\n @Output()\n cardClick =\n new EventEmitter<void>();\n\n /**\n * Standard Balina UI developer click event.\n */\n @Output()\n clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // CLICK HANDLER\n // =========================================\n\n onClick(\n event: MouseEvent\n ): void {\n\n if (\n !this.clickable ||\n this.disabled\n ) {\n\n event.preventDefault();\n\n event.stopPropagation();\n\n return;\n }\n\n // Standard developer event\n this.clicked.emit(event);\n\n // Card-specific event\n this.cardClick.emit();\n }\n}","<div\n class=\"balina-card\"\n\n [class]=\"customClass\"\n\n [class.card-clickable]=\"clickable\"\n\n [class.card-disabled]=\"disabled\"\n\n (click)=\"onClick($event)\"\n>\n\n <!-- =====================================\n TITLE\n ===================================== -->\n\n <h2 class=\"card-title\">\n {{ title }}\n </h2>\n\n\n <!-- =====================================\n CONTENT\n ===================================== -->\n\n <div class=\"card-content\">\n\n <!-- ===================================\n DATE\n =================================== -->\n\n <div class=\"card-date\">\n\n <div class=\"card-month\">\n {{ month }}\n </div>\n\n <div class=\"card-line\"></div>\n\n <div class=\"card-day\">\n {{ day }}\n </div>\n\n </div>\n\n\n <!-- ===================================\n DESCRIPTION\n =================================== -->\n\n <div class=\"card-description\">\n\n {{ description }}\n\n </div>\n\n </div>\n\n</div>","import {\n Component,\n EventEmitter,\n Input,\n Output\n} from '@angular/core';\n\n@Component({\n selector: 'lib-time-filter',\n standalone: true,\n imports: [],\n templateUrl: './time-filter.html',\n styleUrl: './time-filter.css'\n})\nexport class TimeFilter {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input() label: string = '';\n\n /**\n * Unique value of this time filter.\n */\n @Input() value: string = '';\n\n /**\n * Optional external selected value.\n *\n * If the developer connects this input,\n * multiple TimeFilters can work as a group.\n *\n * If it is not provided, the component\n * works independently.\n */\n @Input() selectedValue: string | null = null;\n\n /**\n * Developer custom CSS class.\n */\n @Input() customClass: string = '';\n\n /**\n * Allows the developer to enable/disable\n * click interaction.\n */\n @Input() clickable: boolean = true;\n\n /**\n * Disables the component.\n */\n @Input() disabled: boolean = false;\n\n\n // =========================================\n // OUTPUTS\n // =========================================\n\n /**\n * Emits selected value when the component\n * is used as a connected/group component.\n */\n @Output() selectedValueChange =\n new EventEmitter<string>();\n\n /**\n * Developer click event.\n */\n @Output() clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // INTERNAL STATE\n // =========================================\n\n /**\n * Used when the component is working\n * independently.\n */\n private internalSelected: boolean = false;\n\n\n // =========================================\n // SELECTED STATE\n // =========================================\n\n get selected(): boolean {\n\n /*\n * If selectedValue is provided,\n * use the external value.\n */\n if (\n this.selectedValue !== null &&\n this.selectedValue !== undefined\n ) {\n return this.value === this.selectedValue;\n }\n\n /*\n * Otherwise use internal state.\n */\n return this.internalSelected;\n }\n\n\n // =========================================\n // CLICK\n // =========================================\n\n onClick(event: MouseEvent): void {\n\n if (\n this.disabled ||\n !this.clickable\n ) {\n return;\n }\n\n\n // =====================================\n // INDEPENDENT MODE\n // =====================================\n\n if (\n this.selectedValue === null ||\n this.selectedValue === undefined\n ) {\n\n this.internalSelected =\n !this.internalSelected;\n\n this.clicked.emit(event);\n\n return;\n }\n\n\n // =====================================\n // CONNECTED / GROUP MODE\n // =====================================\n\n if (this.selected) {\n\n this.selectedValueChange.emit('');\n\n } else {\n\n this.selectedValueChange.emit(\n this.value\n );\n }\n\n\n // =====================================\n // DEVELOPER CLICK EVENT\n // =====================================\n\n this.clicked.emit(event);\n }\n}","<div\n class=\"time-filter\"\n [class]=\"customClass\"\n\n [class.time-filter-clickable]=\"clickable\"\n\n [class.time-filter-disabled]=\"disabled\"\n\n [class.time-filter-selected]=\"selected\"\n\n (click)=\"onClick($event)\"\n\n role=\"button\"\n\n tabindex=\"0\"\n>\n\n <!-- =====================================\n RADIO\n ===================================== -->\n\n <div\n class=\"radio-circle\"\n [class.selected]=\"selected\"\n >\n\n <div class=\"radio-dot\"></div>\n\n </div>\n\n\n <!-- =====================================\n LABEL\n ===================================== -->\n\n <span class=\"label\">\n {{ label }}\n </span>\n\n</div>","import {Component,EventEmitter,HostBinding,Input,Output} from '@angular/core';\n\n@Component({\n selector: 'lib-text-box',\n standalone: true,\n imports: [],\n templateUrl: './text-box.html',\n styleUrl: './text-box.css'\n})\nexport class TextBox {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input() placeholder: string = '';\n\n @Input() value: string = '';\n\n @Input() type: string = 'text';\n\n @Input() disabled: boolean = false;\n\n @Input() readonly: boolean = false;\n\n /**\n * Developer custom CSS class.\n *\n * Example:\n *\n * customClass=\"flight-input\"\n */\n @Input()\n @HostBinding('class')\n customClass: string = '';\n\n\n // =========================================\n // OUTPUT EVENTS\n // =========================================\n\n /**\n * Emits the current value.\n */\n @Output()\n valueChange =\n new EventEmitter<string>();\n\n /**\n * Emits whenever the user types.\n */\n @Output()\n inputChange =\n new EventEmitter<string>();\n\n /**\n * Emits whenever the textbox is clicked.\n */\n @Output()\n clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // PASSWORD VISIBILITY\n // =========================================\n\n /**\n * Controls password visibility.\n */\n showPassword: boolean = false;\n\n\n /**\n * Returns the actual input type.\n *\n * password + showPassword\n * becomes text.\n */\n get inputType(): string {\n\n if (this.type === 'password') {\n\n return this.showPassword\n ? 'text'\n : 'password';\n }\n\n return this.type;\n }\n\n\n /**\n * Show/hide password.\n */\n togglePassword(event: MouseEvent): void {\n\n event.stopPropagation();\n\n this.showPassword =\n !this.showPassword;\n }\n\n\n // =========================================\n // INPUT HANDLER\n // =========================================\n\n onInput(event: Event): void {\n\n const input =\n event.target as HTMLInputElement;\n\n this.value = input.value;\n\n // Emit current value\n this.valueChange.emit(\n this.value\n );\n\n // Emit input event\n this.inputChange.emit(\n this.value\n );\n }\n\n\n // =========================================\n // CLICK HANDLER\n // =========================================\n\n onClick(event: MouseEvent): void {\n\n this.clicked.emit(event);\n }\n}","<div class=\"text-box-container\">\n\n <div class=\"text-box-input-wrapper\">\n\n <input\n class=\"text-box-input\"\n\n [type]=\"inputType\"\n\n [placeholder]=\"placeholder\"\n\n [value]=\"value\"\n\n [disabled]=\"disabled\"\n\n [readonly]=\"readonly\"\n\n (input)=\"onInput($event)\"\n\n (click)=\"onClick($event)\"\n />\n\n <!-- Password Eye Button -->\n @if (type === 'password') {\n\n <button\n type=\"button\"\n class=\"text-box-password-button\"\n\n [disabled]=\"disabled\"\n\n (click)=\"togglePassword($event)\"\n aria-label=\"Toggle password visibility\"\n >\n\n @if (showPassword) {\n\n <!-- Eye Off -->\n <svg\n class=\"text-box-password-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n d=\"M3 3l18 18\"\n />\n\n <path\n d=\"M10.6 10.6a2 2 0 1 0 2.8 2.8\"\n />\n\n <path\n d=\"M9.9 4.2A10.8 10.8 0 0 1 12 4c5 0 8.7 4.2 9.8 8a10.8 10.8 0 0 1-3.1 5.1\"\n />\n\n <path\n d=\"M6.2 6.2C4.5 7.4 3.2 9.2 2.2 12c1.1 3.8 4.8 8 9.8 8 1.7 0 3.3-.5 4.7-1.2\"\n />\n </svg>\n\n } @else {\n\n <!-- Eye -->\n <svg\n class=\"text-box-password-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n d=\"M2 12s3.5-7 10-7\n 10 7 10 7\n -3.5 7-10 7\n -10-7-10-7z\"\n />\n\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"3\"\n />\n </svg>\n\n }\n\n </button>\n\n }\n\n </div>\n\n</div>","import {Component,ElementRef,EventEmitter,HostBinding,HostListener,Input,Output} from '@angular/core';\n\n@Component({\n selector: 'lib-date-input',\n standalone: true,\n imports: [],\n templateUrl: './date-input.html',\n styleUrl: './date-input.css'\n})\nexport class DateInput {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input() label: string = '';\n\n @Input() placeholder: string = 'Select date';\n\n @Input() value: string = '';\n\n @Input() disabled: boolean = false;\n\n @Input() readonly: boolean = false;\n\n /**\n * Developer custom CSS class.\n *\n * Example:\n *\n * customClass=\"flight-date\"\n */\n @Input()\n @HostBinding('class')\n customClass: string = '';\n\n\n // =========================================\n // OUTPUTS\n // =========================================\n\n /**\n * Emits the selected date as:\n *\n * YYYY-MM-DD\n */\n @Output()\n valueChange =\n new EventEmitter<string>();\n\n /**\n * Emits the selected Date object.\n */\n @Output()\n dateChange =\n new EventEmitter<Date>();\n\n /**\n * Emits when the calendar opens/closes.\n */\n @Output()\n openedChange =\n new EventEmitter<boolean>();\n\n /**\n * Developer click event.\n */\n @Output()\n clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // INTERNAL STATE\n // =========================================\n\n isOpen: boolean = false;\n\n currentDate: Date = new Date();\n\n\n constructor(\n private elementRef:\n ElementRef<HTMLElement>\n ) {}\n\n\n // =========================================\n // INITIALIZE VALUE\n // =========================================\n\n ngOnInit(): void {\n\n if (this.value) {\n\n const parsedDate =\n this.parseDate(this.value);\n\n if (parsedDate) {\n\n this.currentDate =\n new Date(\n parsedDate.getFullYear(),\n parsedDate.getMonth(),\n 1\n );\n }\n }\n }\n\n\n // =========================================\n // CALENDAR DAYS\n // =========================================\n\n get calendarDays(): Date[] {\n\n const year =\n this.currentDate.getFullYear();\n\n const month =\n this.currentDate.getMonth();\n\n const firstDay =\n new Date(\n year,\n month,\n 1\n );\n\n const lastDay =\n new Date(\n year,\n month + 1,\n 0\n );\n\n const days: Date[] = [];\n\n /*\n * Sunday = 0\n * Monday = 1\n * ...\n * Saturday = 6\n */\n const startDay =\n firstDay.getDay();\n\n\n // =====================================\n // PREVIOUS MONTH DAYS\n // =====================================\n\n for (\n let i = 0;\n i < startDay;\n i++\n ) {\n\n days.push(\n new Date(\n year,\n month,\n i - startDay + 1\n )\n );\n }\n\n\n // =====================================\n // CURRENT MONTH DAYS\n // =====================================\n\n for (\n let day = 1;\n day <= lastDay.getDate();\n day++\n ) {\n\n days.push(\n new Date(\n year,\n month,\n day\n )\n );\n }\n\n\n // =====================================\n // NEXT MONTH DAYS\n // =====================================\n\n const remaining =\n 42 - days.length;\n\n for (\n let i = 1;\n i <= remaining;\n i++\n ) {\n\n days.push(\n new Date(\n year,\n month + 1,\n i\n )\n );\n }\n\n return days;\n }\n\n\n // =========================================\n // MONTH NAME\n // =========================================\n\n get monthName(): string {\n\n return this.currentDate.toLocaleString(\n 'default',\n {\n month: 'long'\n }\n );\n }\n\n\n // =========================================\n // YEAR\n // =========================================\n\n get year(): number {\n\n return this.currentDate.getFullYear();\n }\n\n\n // =========================================\n // TOGGLE CALENDAR\n // =========================================\n\n toggleCalendar(\n event?: MouseEvent\n ): void {\n\n if (\n this.disabled ||\n this.readonly\n ) {\n return;\n }\n\n if (event) {\n this.clicked.emit(event);\n }\n\n this.isOpen =\n !this.isOpen;\n\n this.openedChange.emit(\n this.isOpen\n );\n }\n\n\n // =========================================\n // PREVIOUS MONTH\n // =========================================\n\n previousMonth(\n event?: MouseEvent\n ): void {\n\n event?.stopPropagation();\n\n this.currentDate =\n new Date(\n this.year,\n this.currentDate.getMonth() - 1,\n 1\n );\n }\n\n\n // =========================================\n // NEXT MONTH\n // =========================================\n\n nextMonth(\n event?: MouseEvent\n ): void {\n\n event?.stopPropagation();\n\n this.currentDate =\n new Date(\n this.year,\n this.currentDate.getMonth() + 1,\n 1\n );\n }\n\n\n // =========================================\n // SELECT DATE\n // =========================================\n\n selectDate(\n date: Date,\n event: MouseEvent\n ): void {\n\n event.stopPropagation();\n\n if (\n this.disabled ||\n this.readonly\n ) {\n return;\n }\n\n /*\n * Create a clean Date object.\n */\n const selectedDate =\n new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n );\n\n\n // =====================================\n // UPDATE VALUE\n // =====================================\n\n this.value =\n this.formatDate(\n selectedDate\n );\n\n\n // =====================================\n // EMIT EVENTS\n // =====================================\n\n this.valueChange.emit(\n this.value\n );\n\n this.dateChange.emit(\n selectedDate\n );\n\n this.clicked.emit(\n event\n );\n\n\n // =====================================\n // CLOSE\n // =====================================\n\n this.isOpen = false;\n\n this.openedChange.emit(\n false\n );\n }\n\n\n // =========================================\n // FORMAT DATE\n // =========================================\n\n formatDate(\n date: Date\n ): string {\n\n const day =\n String(\n date.getDate()\n ).padStart(2, '0');\n\n const month =\n String(\n date.getMonth() + 1\n ).padStart(2, '0');\n\n const year =\n date.getFullYear();\n\n return `${year}-${month}-${day}`;\n }\n\n\n // =========================================\n // PARSE DATE\n // =========================================\n\n private parseDate(\n value: string\n ): Date | null {\n\n const parts =\n value.split('-');\n\n if (parts.length !== 3) {\n return null;\n }\n\n const year =\n Number(parts[0]);\n\n const month =\n Number(parts[1]);\n\n const day =\n Number(parts[2]);\n\n if (\n !year ||\n !month ||\n !day\n ) {\n return null;\n }\n\n const date =\n new Date(\n year,\n month - 1,\n day\n );\n\n /*\n * Validate the date.\n */\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day\n ) {\n return null;\n }\n\n return date;\n }\n\n\n // =========================================\n // CURRENT MONTH\n // =========================================\n\n isCurrentMonth(\n date: Date\n ): boolean {\n\n return (\n date.getMonth() ===\n this.currentDate.getMonth() &&\n date.getFullYear() ===\n this.currentDate.getFullYear()\n );\n }\n\n\n // =========================================\n // TODAY\n // =========================================\n\n isToday(\n date: Date\n ): boolean {\n\n const today =\n new Date();\n\n return (\n date.getDate() ===\n today.getDate() &&\n date.getMonth() ===\n today.getMonth() &&\n date.getFullYear() ===\n today.getFullYear()\n );\n }\n\n\n // =========================================\n // SELECTED DATE\n // =========================================\n\n isSelected(\n date: Date\n ): boolean {\n\n return (\n this.value ===\n this.formatDate(date)\n );\n }\n\n\n // =========================================\n // OUTSIDE CLICK\n // =========================================\n\n @HostListener(\n 'document:click',\n ['$event']\n )\n onDocumentClick(\n event: MouseEvent\n ): void {\n\n if (!this.isOpen) {\n return;\n }\n\n const target =\n event.target as Node;\n\n const host =\n this.elementRef.nativeElement;\n\n if (\n !host.contains(target)\n ) {\n\n this.closeCalendar();\n }\n }\n\n\n // =========================================\n // CLOSE CALENDAR\n // =========================================\n\n closeCalendar(): void {\n\n if (!this.isOpen) {\n return;\n }\n\n this.isOpen = false;\n\n this.openedChange.emit(\n false\n );\n }\n}","<div\n class=\"date-input-container\"\n [class.date-input-disabled]=\"disabled\"\n [class.date-input-open]=\"isOpen\"\n>\n\n <!-- =====================================\n INPUT FIELD\n ===================================== -->\n\n <div\n class=\"date-input-field\"\n (click)=\"toggleCalendar($event)\"\n >\n\n <!-- LABEL -->\n\n @if (label) {\n\n <label class=\"date-input-label\">\n\n {{ label }}\n\n </label>\n\n }\n\n\n <!-- VALUE -->\n\n <span\n class=\"date-input-value\"\n [class.date-input-placeholder]=\"!value\"\n >\n\n {{ value || placeholder }}\n\n </span>\n\n\n <!-- CALENDAR ICON -->\n\n <span class=\"calendar-icon\">\n\n <span class=\"calendar-top\"></span>\n\n <span class=\"calendar-body\"></span>\n\n </span>\n\n </div>\n\n\n <!-- =====================================\n DATE PICKER\n ===================================== -->\n\n @if (isOpen) {\n\n <div\n class=\"date-picker\"\n (click)=\"$event.stopPropagation()\"\n >\n\n <!-- =================================\n HEADER\n ================================= -->\n\n <div class=\"date-picker-header\">\n\n <button\n type=\"button\"\n class=\"month-button\"\n\n aria-label=\"Previous month\"\n\n (click)=\"previousMonth($event)\"\n >\n\n ‹\n\n </button>\n\n\n <span class=\"month-title\">\n\n {{ monthName }} {{ year }}\n\n </span>\n\n\n <button\n type=\"button\"\n class=\"month-button\"\n\n aria-label=\"Next month\"\n\n (click)=\"nextMonth($event)\"\n >\n\n ›\n\n </button>\n\n </div>\n\n\n <!-- =================================\n WEEK DAYS\n ================================= -->\n\n <div class=\"week-days\">\n\n <span>Sun</span>\n\n <span>Mon</span>\n\n <span>Tue</span>\n\n <span>Wed</span>\n\n <span>Thu</span>\n\n <span>Fri</span>\n\n <span>Sat</span>\n\n </div>\n\n\n <!-- =================================\n CALENDAR DAYS\n ================================= -->\n\n <div class=\"calendar-days\">\n\n @for (\n date of calendarDays;\n track date.getTime()\n ) {\n\n <button\n type=\"button\"\n\n class=\"calendar-day\"\n\n [class.other-month]=\"\n !isCurrentMonth(date)\n \"\n\n [class.today]=\"\n isToday(date)\n \"\n\n [class.selected]=\"\n isSelected(date)\n \"\n\n (click)=\"\n selectDate(date, $event)\n \"\n >\n\n {{ date.getDate() }}\n\n </button>\n\n }\n\n </div>\n\n </div>\n\n }\n\n</div>","import {\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n Input,\n Output\n} from '@angular/core';\n\nexport interface DropdownOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'lib-dropdown',\n standalone: true,\n imports: [],\n templateUrl: './dropdown.html',\n styleUrl: './dropdown.css'\n})\nexport class Dropdown {\n\n // =========================================\n // INPUTS\n // =========================================\n\n @Input() label: string = '';\n\n @Input() placeholder: string = 'Select';\n\n @Input() options: DropdownOption[] = [];\n\n @Input() value: string = '';\n\n @Input() disabled: boolean = false;\n\n @Input() searchable: boolean = true;\n\n @Input()\n @HostBinding('class')\n customClass: string = '';\n\n\n // =========================================\n // OUTPUTS\n // =========================================\n\n @Output()\n valueChange =\n new EventEmitter<string>();\n\n @Output()\n selectionChange =\n new EventEmitter<DropdownOption>();\n\n @Output()\n openedChange =\n new EventEmitter<boolean>();\n\n @Output()\n clicked =\n new EventEmitter<MouseEvent>();\n\n\n // =========================================\n // STATE\n // =========================================\n\n isOpen: boolean = false;\n\n searchText: string = '';\n\n\n constructor(\n private elementRef: ElementRef<HTMLElement>\n ) {}\n\n\n // =========================================\n // FILTERED OPTIONS\n // =========================================\n\n get filteredOptions(): DropdownOption[] {\n\n const search =\n this.searchText\n .trim()\n .toLowerCase();\n\n if (!search) {\n return this.options;\n }\n\n return this.options.filter(\n option =>\n option.label\n .toLowerCase()\n .includes(search)\n );\n }\n\n\n // =========================================\n // SELECTED OPTION\n // =========================================\n\n get selectedOption():\n DropdownOption | undefined {\n\n return this.options.find(\n option =>\n option.value === this.value\n );\n }\n\n\n // =========================================\n // TOGGLE\n // =========================================\n\n toggleDropdown(\n event?: MouseEvent\n ): void {\n\n if (this.disabled) {\n return;\n }\n\n if (event) {\n this.clicked.emit(event);\n }\n\n this.isOpen =\n !this.isOpen;\n\n this.openedChange.emit(\n this.isOpen\n );\n\n if (!this.isOpen) {\n this.searchText = '';\n }\n }\n\n\n // =========================================\n // DOCUMENT CLICK\n // =========================================\n\n @HostListener(\n 'document:click',\n ['$event']\n )\n onDocumentClick(\n event: MouseEvent\n ): void {\n\n if (!this.isOpen) {\n return;\n }\n\n const target =\n event.target as Node;\n\n const host =\n this.elementRef.nativeElement;\n\n if (!host.contains(target)) {\n this.closeDropdown();\n }\n }\n\n\n // =========================================\n // CLOSE\n // =========================================\n\n closeDropdown(): void {\n\n if (!this.isOpen) {\n return;\n }\n\n this.isOpen = false;\n\n this.searchText = '';\n\n this.openedChange.emit(false);\n }\n\n\n // =========================================\n // SELECT\n // =========================================\n\n selectOption(\n option: DropdownOption,\n event: MouseEvent\n ): void {\n\n if (option.disabled) {\n return;\n }\n\n this.value =\n option.value;\n\n this.valueChange.emit(\n option.value\n );\n\n this.selectionChange.emit(\n option\n );\n\n this.clicked.emit(event);\n\n this.isOpen = false;\n\n this.searchText = '';\n\n this.openedChange.emit(false);\n }\n\n\n // =========================================\n // SEARCH\n // =========================================\n\n onSearch(event: Event): void {\n\n const input =\n event.target as HTMLInputElement;\n\n this.searchText =\n input.value;\n }\n}","<div\n class=\"dropdown-container\"\n [class.dropdown-disabled]=\"disabled\"\n [class.dropdown-open]=\"isOpen\"\n>\n\n <!-- =====================================\n FIELD\n ===================================== -->\n\n <div\n class=\"dropdown-field\"\n (click)=\"toggleDropdown($event)\"\n >\n\n <!-- Label -->\n\n @if (label) {\n\n <label class=\"dropdown-label\">\n {{ label }}\n </label>\n\n }\n\n\n <!-- Selected Value -->\n\n <span\n class=\"dropdown-value\"\n [class.dropdown-placeholder]=\"\n !selectedOption\n \"\n >\n\n {{\n selectedOption?.label ||\n placeholder\n }}\n\n </span>\n\n\n <!-- Arrow -->\n\n <span\n class=\"dropdown-arrow\"\n [class.arrow-up]=\"isOpen\"\n ></span>\n\n </div>\n\n\n <!-- =====================================\n MENU\n ===================================== -->\n\n @if (isOpen) {\n\n <div\n class=\"dropdown-menu\"\n (click)=\"$event.stopPropagation()\"\n >\n\n <!-- SEARCH -->\n\n @if (searchable) {\n\n <div class=\"dropdown-search\">\n\n <input\n type=\"text\"\n class=\"dropdown-search-input\"\n\n placeholder=\"Search...\"\n\n [value]=\"searchText\"\n\n (input)=\"onSearch($event)\"\n />\n\n </div>\n\n }\n\n\n <!-- OPTIONS -->\n\n <div class=\"dropdown-options\">\n\n @for (\n option of filteredOptions;\n track option.value\n ) {\n\n <div\n class=\"dropdown-option\"\n\n [class.option-disabled]=\"\n option.disabled\n \"\n\n [class.option-selected]=\"\n option.value === value\n \"\n\n (click)=\"\n selectOption(option, $event)\n \"\n >\n\n {{ option.label }}\n\n </div>\n\n }\n\n\n <!-- NO RESULTS -->\n\n @if (\n filteredOptions.length === 0\n ) {\n\n <div class=\"dropdown-no-result\">\n\n No results found\n\n </div>\n\n }\n\n </div>\n\n </div>\n\n }\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';\nexport * from './lib/time-filter/time-filter';\nexport * from './lib/text-box/text-box';\nexport * from './lib/date-input/date-input';\nexport * from './lib/dropdown/dropdown';","/**\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": "3.3.9",
3
+ "version": "3.3.10",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^22.1.0",
6
6
  "@angular/core": "^22.1.0"
@@ -49,11 +49,23 @@ declare class Button {
49
49
  type: 'button' | 'submit' | 'reset';
50
50
  disabled: boolean;
51
51
  loading: boolean;
52
+ /**
53
+ * Controls whether the button is clickable.
54
+ */
55
+ clickable: boolean;
56
+ /**
57
+ * Developer custom CSS class.
58
+ */
52
59
  customClass: string;
60
+ get buttonClickable(): boolean;
61
+ get buttonDisabled(): boolean;
62
+ /**
63
+ * Developer click event.
64
+ */
53
65
  clicked: EventEmitter<MouseEvent>;
54
66
  onClick(event: MouseEvent): void;
55
67
  static ɵfac: i0.ɵɵFactoryDeclaration<Button, never>;
56
- static ɵcmp: i0.ɵɵComponentDeclaration<Button, "lib-button", never, { "label": { "alias": "label"; "required": false; }; "type": { "alias": "type"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; }, { "clicked": "clicked"; }, never, never, true, never>;
68
+ static ɵcmp: i0.ɵɵComponentDeclaration<Button, "lib-button", never, { "label": { "alias": "label"; "required": false; }; "type": { "alias": "type"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "clickable": { "alias": "clickable"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; }, { "clicked": "clicked"; }, never, never, true, never>;
57
69
  }
58
70
 
59
71
  declare class Card {
@@ -61,10 +73,25 @@ declare class Card {
61
73
  month: string;
62
74
  day: string | number;
63
75
  description: string;
64
- cardClick: EventEmitter<void>;
76
+ /**
77
+ * Developer custom CSS class.
78
+ */
65
79
  customClass: string;
80
+ /**
81
+ * Controls whether the card is clickable.
82
+ */
66
83
  clickable: boolean;
84
+ /**
85
+ * Disables card interaction.
86
+ */
67
87
  disabled: boolean;
88
+ /**
89
+ * Legacy / specific card click event.
90
+ */
91
+ cardClick: EventEmitter<void>;
92
+ /**
93
+ * Standard Balina UI developer click event.
94
+ */
68
95
  clicked: EventEmitter<MouseEvent>;
69
96
  onClick(event: MouseEvent): void;
70
97
  static ɵfac: i0.ɵɵFactoryDeclaration<Card, never>;
@@ -73,14 +100,51 @@ declare class Card {
73
100
 
74
101
  declare class TimeFilter {
75
102
  label: string;
103
+ /**
104
+ * Unique value of this time filter.
105
+ */
76
106
  value: string;
77
- selectedValue: string;
107
+ /**
108
+ * Optional external selected value.
109
+ *
110
+ * If the developer connects this input,
111
+ * multiple TimeFilters can work as a group.
112
+ *
113
+ * If it is not provided, the component
114
+ * works independently.
115
+ */
116
+ selectedValue: string | null;
117
+ /**
118
+ * Developer custom CSS class.
119
+ */
120
+ customClass: string;
121
+ /**
122
+ * Allows the developer to enable/disable
123
+ * click interaction.
124
+ */
125
+ clickable: boolean;
126
+ /**
127
+ * Disables the component.
128
+ */
129
+ disabled: boolean;
130
+ /**
131
+ * Emits selected value when the component
132
+ * is used as a connected/group component.
133
+ */
78
134
  selectedValueChange: EventEmitter<string>;
135
+ /**
136
+ * Developer click event.
137
+ */
79
138
  clicked: EventEmitter<MouseEvent>;
139
+ /**
140
+ * Used when the component is working
141
+ * independently.
142
+ */
143
+ private internalSelected;
80
144
  get selected(): boolean;
81
145
  onClick(event: MouseEvent): void;
82
146
  static ɵfac: i0.ɵɵFactoryDeclaration<TimeFilter, never>;
83
- static ɵcmp: i0.ɵɵComponentDeclaration<TimeFilter, "lib-time-filter", never, { "label": { "alias": "label"; "required": false; }; "value": { "alias": "value"; "required": false; }; "selectedValue": { "alias": "selectedValue"; "required": false; }; }, { "selectedValueChange": "selectedValueChange"; "clicked": "clicked"; }, never, never, true, never>;
147
+ static ɵcmp: i0.ɵɵComponentDeclaration<TimeFilter, "lib-time-filter", never, { "label": { "alias": "label"; "required": false; }; "value": { "alias": "value"; "required": false; }; "selectedValue": { "alias": "selectedValue"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; "clickable": { "alias": "clickable"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "selectedValueChange": "selectedValueChange"; "clicked": "clicked"; }, never, never, true, never>;
84
148
  }
85
149
 
86
150
  declare class TextBox {
@@ -131,30 +195,56 @@ declare class TextBox {
131
195
  }
132
196
 
133
197
  declare class DateInput {
198
+ private elementRef;
134
199
  label: string;
135
200
  placeholder: string;
136
201
  value: string;
137
202
  disabled: boolean;
138
203
  readonly: boolean;
204
+ /**
205
+ * Developer custom CSS class.
206
+ *
207
+ * Example:
208
+ *
209
+ * customClass="flight-date"
210
+ */
139
211
  customClass: string;
212
+ /**
213
+ * Emits the selected date as:
214
+ *
215
+ * YYYY-MM-DD
216
+ */
140
217
  valueChange: EventEmitter<string>;
218
+ /**
219
+ * Emits the selected Date object.
220
+ */
141
221
  dateChange: EventEmitter<Date>;
222
+ /**
223
+ * Emits when the calendar opens/closes.
224
+ */
142
225
  openedChange: EventEmitter<boolean>;
226
+ /**
227
+ * Developer click event.
228
+ */
143
229
  clicked: EventEmitter<MouseEvent>;
144
230
  isOpen: boolean;
145
231
  currentDate: Date;
232
+ constructor(elementRef: ElementRef<HTMLElement>);
233
+ ngOnInit(): void;
146
234
  get calendarDays(): Date[];
147
235
  get monthName(): string;
148
236
  get year(): number;
149
237
  toggleCalendar(event?: MouseEvent): void;
150
- previousMonth(): void;
151
- nextMonth(): void;
238
+ previousMonth(event?: MouseEvent): void;
239
+ nextMonth(event?: MouseEvent): void;
152
240
  selectDate(date: Date, event: MouseEvent): void;
153
241
  formatDate(date: Date): string;
242
+ private parseDate;
154
243
  isCurrentMonth(date: Date): boolean;
155
244
  isToday(date: Date): boolean;
156
245
  isSelected(date: Date): boolean;
157
246
  onDocumentClick(event: MouseEvent): void;
247
+ closeCalendar(): void;
158
248
  static ɵfac: i0.ɵɵFactoryDeclaration<DateInput, never>;
159
249
  static ɵcmp: i0.ɵɵComponentDeclaration<DateInput, "lib-date-input", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "customClass": { "alias": "customClass"; "required": false; }; }, { "valueChange": "valueChange"; "dateChange": "dateChange"; "openedChange": "openedChange"; "clicked": "clicked"; }, never, never, true, never>;
160
250
  }
@@ -165,6 +255,7 @@ interface DropdownOption {
165
255
  disabled?: boolean;
166
256
  }
167
257
  declare class Dropdown {
258
+ private elementRef;
168
259
  label: string;
169
260
  placeholder: string;
170
261
  options: DropdownOption[];
@@ -172,28 +263,18 @@ declare class Dropdown {
172
263
  disabled: boolean;
173
264
  searchable: boolean;
174
265
  customClass: string;
175
- /**
176
- * Emits the selected value.
177
- */
178
266
  valueChange: EventEmitter<string>;
179
- /**
180
- * Emits the complete selected option.
181
- */
182
267
  selectionChange: EventEmitter<DropdownOption>;
183
- /**
184
- * Emits when the dropdown opens/closes.
185
- */
186
268
  openedChange: EventEmitter<boolean>;
187
- /**
188
- * Developer click event.
189
- */
190
269
  clicked: EventEmitter<MouseEvent>;
191
270
  isOpen: boolean;
192
271
  searchText: string;
272
+ constructor(elementRef: ElementRef<HTMLElement>);
193
273
  get filteredOptions(): DropdownOption[];
194
274
  get selectedOption(): DropdownOption | undefined;
195
275
  toggleDropdown(event?: MouseEvent): void;
196
276
  onDocumentClick(event: MouseEvent): void;
277
+ closeDropdown(): void;
197
278
  selectOption(option: DropdownOption, event: MouseEvent): void;
198
279
  onSearch(event: Event): void;
199
280
  static ɵfac: i0.ɵɵFactoryDeclaration<Dropdown, never>;