npx-calendar
Version:
A customizable and feature-rich calendar component for Angular applications.
1 lines • 40.1 kB
Source Map (JSON)
{"version":3,"file":"npx-calendar.mjs","sources":["../../../projects/npx-calendar/src/lib/npx-calendar.service.ts","../../../projects/npx-calendar/src/lib/pips/style-object.pipe.ts","../../../projects/npx-calendar/src/lib/pips/filter-events.pipe.ts","../../../projects/npx-calendar/src/lib/components/calendar/calendar.component.ts","../../../projects/npx-calendar/src/lib/components/calendar/calendar.component.html","../../../projects/npx-calendar/src/lib/npx-calendar.component.ts","../../../projects/npx-calendar/src/public-api.ts","../../../projects/npx-calendar/src/npx-calendar.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NpxCalendarService {\n\n constructor() { }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'styleObject'\n})\nexport class StyleObjectPipe implements PipeTransform {\n\n transform(value: string): { [klass: string]: any } {\n const styles: { [klass: string]: any } = {};\n\n if (!value) {\n return styles;\n }\n\n const styleRules = value.split(';');\n styleRules.forEach(rule => {\n const [property, value2] = rule.split(':');\n if (property && value2) {\n styles[property.trim()] = value2.trim();\n }\n });\n return styles;\n }\n}\n\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'filterEvents' })\nexport class FilterEventsPipe implements PipeTransform {\n transform(events: any[], targetTime: string): any[] {\n return events.filter(event => event.time === targetTime);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, HostListener, Input, ViewChild } from '@angular/core';\nimport { CalendarEvent, CalendarEventDetails, CalendarThemes } from '../../interface/calendar.interface';\nimport { StyleObjectPipe } from '../../pips/style-object.pipe';\nimport { FilterEventsPipe } from '../../pips/filter-events.pipe';\n\n\n\n\n@Component({\n selector: 'lib-calendar',\n imports: [CommonModule, StyleObjectPipe, FilterEventsPipe],\n templateUrl: './calendar.component.html',\n styleUrl: './calendar.component.css'\n})\nexport class CalendarComponent {\n\n @ViewChild('popover') popover!: ElementRef;\n isPopoverOpen = false;\n popoverDay: number | null = null;\n\n public daysOfTheWeek: string[] = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n public monthsOfTheYear: string[] = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ];\n public hours: string[] = []\n public currentWeekDays: number[] = []\n public years: number[] = []\n public viewOptions: string[] = [\"Month\", \"Work week\", \"Week\"];\n public daysInMonth: number[] = [];\n public currentMonth: number = 0;\n public currentYear: number = 0;\n public currentDay: number = 0;\n public currentMonthName: string = '';\n public currentYearName: string = '';\n public currentDate: string = '';\n public firstDayOfWeek: number = 0;\n public isOpen: boolean = false;\n public isMonthPickerOpen: boolean = false;\n public isFilterOpen: boolean = false;\n public selectedView: number = 0;\n public isOffCanvasOpen = false;\n public weekDay: string | null = null;\n public selectedDay: number = 0;\n public selectedDayEvents: CalendarEventDetails[] = [];\n public showYearPicker: boolean = false;\n public selectedEventDetail: CalendarEventDetails = {\n title: '',\n time: '',\n description: '',\n start_time: '',\n end_time: '',\n style: '',\n attendees: [],\n location: '',\n locationLink: '',\n category: '',\n categoryColor: ''\n };\n\n @Input() public calendar_events: CalendarEvent[] = [];\n @Input() public calendar_themes: CalendarThemes = {\n show_header: true,\n show_arrow: true,\n show_month_picker: true,\n show_calendar_view_filter: true\n }\n\n constructor(private elementRef: ElementRef) {\n this.selectedEventDetail.categoryColor = '#ff0000';\n this.years = [];\n\n for (let i = 2020; i <= new Date().getFullYear() + 10; i++) {\n this.years.push(i);\n }\n }\n\n /**\n * Initialize the component.\n *\n * Gets the current month and year, then calls\n * {@link generateCalender} to generate the calender.\n */\n ngOnInit(): void {\n this.currentMonth = new Date().getMonth();\n this.currentYear = new Date().getFullYear();\n\n this.generateCalender();\n }\n\n /**\n * Generate the calender.\n *\n * This method generates the days of the month and the first day of the week.\n * It also sets the current date.\n *\n * It is called on component initialization.\n */\n private generateCalender() {\n this.currentDay = new Date().getDate();\n\n this.currentMonthName = this.monthsOfTheYear[this.currentMonth];\n\n this.currentYearName = this.currentYear.toString();\n\n this.currentDate = this.currentDay + ' ' + this.currentMonthName + ' ' + this.currentYearName;\n\n this.firstDayOfWeek = new Date(this.currentYear, this.currentMonth, 1).getDay();\n\n const daysInMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getDate();\n\n this.daysInMonth = [];\n\n for (let i = 1; i <= daysInMonth; i++) {\n this.daysInMonth.push(i);\n }\n }\n\n public handleCalenderEvent(day: number) {\n console.log(day)\n }\n\n /**\n * Handle the next month button click event.\n *\n * This will add one to the current month, taking into account the wrap-around\n * from December to January.\n *\n * If the current month is December (11), we should increment the current year.\n */\n public handleNextMonth(): void {\n if (this.currentMonth === 11) {\n this.currentYear++;\n this.currentMonth = 0;\n } else {\n this.currentMonth++;\n }\n\n this.generateCalender();\n }\n\n /**\n * Handle the previous month button click event.\n *\n * This will subtract one from the current month, taking into account the wrap-around\n * from December to January.\n *\n * If the current month is January (0), we should decrement the current year.\n */\n public handlePrevMonth() {\n this.currentMonth = (this.currentMonth - 1 + 12) % 12;\n if (this.currentMonth === 11) this.currentYear--;\n\n this.generateCalender();\n }\n\n /**\n * Toggle the date picker dropdown.\n *\n * This method is called when the current month button is clicked. It toggles the\n * {@link isOpen} property, which determines whether the date picker dropdown\n * is visible or not.\n */\n toggleDatePicker() {\n this.isOpen = !this.isOpen;\n }\n\n /**\n * Toggle the month picker dropdown.\n *\n * This method is called when the month button is clicked. It toggles the\n * {@link isMonthPickerOpen} property, which determines whether the month\n * picker dropdown is visible or not.\n */\n toggleMonthPicker(): void {\n this.isMonthPickerOpen = !this.isMonthPickerOpen;\n }\n\n /**\n * Toggle the filter dropdown.\n *\n * This method is called when the filter button is clicked. It toggles the\n * {@link isFilterOpen} property, which determines whether the filter dropdown\n * is visible or not.\n */\n toggleFilter() {\n this.isFilterOpen = !this.isFilterOpen\n }\n\n /**\n * Handles the month change event.\n *\n * This method is called when a new month is selected from the month dropdown.\n * It is called automatically whenever the user selects a new month from the\n * month dropdown.\n *\n * The purpose of this method is to update the current month and regenerate\n * the calender. This is necessary because the calender is rendered based on the\n * current month and year, so if the user changes the month, we need to update\n * the calender to reflect the new month.\n *\n * The method takes a single argument, `month`, which is the new month to be\n * selected (0-11, January-December).\n *\n * The method does the following:\n * 1. It updates the current month by setting the `currentMonth` property to\n * the new month.\n * 2. It closes the month dropdown by setting the `isOpen` property to false.\n * 3. It regenerates the calender by calling the `generateCalender()` method.\n *\n * @param month The new month (0-11, January-December).\n */\n public onMonthChange(month: number): void {\n this.currentMonth = month;\n this.isOpen = false;\n\n this.generateCalender();\n }\n\n /************* ✨ Codeium Command 🌟 *************/\n /**\n * Handles the year change event.\n *\n * This method is called when a new year is selected from the year dropdown.\n * It updates the current year and regenerates the calender by calling\n * {@link generateCalender}.\n *\n * @param year The new year.\n */\n public onYearChange(year: number): void {\n this.currentYear = year;\n this.isOpen = false;\n this.generateCalender();\n }\n /****** a23a8126-489d-4240-8c98-4a4c397bedb5 *******/\n\n /**\n * Open the off-canvas menu.\n *\n * This method is called when a day is clicked in the calendar. It will open the\n * off-canvas menu and set the week day label to the name of the day of the week\n * of the selected date.\n *\n * @param day The day of the month that was clicked (1-31).\n * @param event The list of events associated with the day that was clicked.\n */\n openOffCanvas(day: number, event: CalendarEventDetails[]): void {\n this.selectedDay = day;\n const date = new Date(this.currentYear, this.currentMonth, day);\n const dayOfWeek = date.getDay();\n this.weekDay = this.daysOfTheWeek[dayOfWeek];\n this.selectedDayEvents = event;\n\n this.isOffCanvasOpen = !this.isOffCanvasOpen;\n this.isPopoverOpen = false;\n }\n\n /**\n * Close the off-canvas menu.\n *\n * This method is called when the close button is clicked in the off-canvas\n * menu. It sets the {@link isOffCanvasOpen} property to false, which will\n * hide the off-canvas menu.\n */\n closeOffCanvas(): void {\n this.isOffCanvasOpen = false;\n }\n\n\n\n /**\n * Opens the popover that displays the events for the selected day.\n *\n * This method is called when a day is clicked in the calendar. It will open the\n * popover and position it at the location of the click event.\n *\n * @param event The mouse event that triggered this method.\n * @param day The day of the month that was clicked (1-31).\n */\n openPopover(event: MouseEvent, day: number, eventDetail: CalendarEventDetails): any {\n this.selectedEventDetail = eventDetail;\n this.selectedDay = day;\n const date = new Date(this.currentYear, this.currentMonth, day);\n const dayOfWeek = date.getDay();\n this.weekDay = this.daysOfTheWeek[dayOfWeek];\n this.isPopoverOpen = true;\n this.popoverDay = day;\n this.closeOffCanvas();\n this.positionPopover(event);\n }\n\n /**\n * Position the popover at the location of the click event.\n *\n * This function is called by the openPopover method, which is called when a day\n * is clicked in the calendar. It will position the popover at the location of the\n * click event.\n *\n * This function will wait for the popover to render before positioning it. This\n * is done with setTimeout and a 0ms delay. This ensures that the popover has\n * rendered and its width and height are available.\n *\n * It will check if the popover is too close to the edge of the screen and if so,\n * will reposition it so it doesn't go off the screen.\n *\n * @param event The mouse event that triggered this method.\n */\n positionPopover(event: MouseEvent) {\n setTimeout(() => {\n const popoverEl = this.popover.nativeElement;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const popoverRect = popoverEl.getBoundingClientRect();\n\n let left = event.clientX;\n let top = event.clientY + 10; // Default below cursor\n\n if (left + popoverRect.width > viewportWidth) {\n left = viewportWidth - popoverRect.width - 10;\n }\n if (top + popoverRect.height > viewportHeight) {\n top = event.clientY - popoverRect.height - 10;\n }\n\n popoverEl.style.left = `${left}px`;\n popoverEl.style.top = `${top + 5}px`;\n }, 0);\n }\n\n /**\n * Called when the user changes the calendar view.\n *\n * This function is called when the user changes the calendar view by clicking on\n * one of the view options in the top right corner of the calendar. The view\n * options are \"Month\", \"Week\", and \"Day\".\n *\n * When this function is called, it will update the selectedView property to the\n * index of the view that was selected.\n *\n * @param view The index of the view that was selected (0, 1, or 2).\n */\n public onViewChange(view: number): void {\n this.selectedView = view;\n this.getCurrentWeek(false)\n }\n\n /**\n * Toggle the year picker dropdown.\n *\n * This function is called when the year button is clicked. It will toggle the\n * {@link showYearPicker} property, which determines whether the year picker\n * dropdown is visible or not.\n *\n * Also, it will stop the event from propagating up the DOM tree, so that the\n * event doesn't bubble up and cause the calendar to be closed.\n *\n * @param event The mouse event that triggered this method.\n */\n public toggleYearPicker(event: Event): void {\n this.showYearPicker = !this.showYearPicker\n event.stopPropagation();\n }\n\n /**\n * Handles the previous year button click event.\n *\n * This method is called when the previous year button is clicked. It will\n * decrement the current year by one and regenerate the calender by calling\n * {@link generateCalender}.\n *\n * It will also stop the event from propagating up the DOM tree, so that the\n * event doesn't bubble up and cause the calendar to be closed.\n *\n * @param event The mouse event that triggered this method.\n */\n public handlePrevYear(event: Event): void {\n event.stopPropagation();\n this.currentYear--;\n this.generateCalender();\n }\n\n /**\n * Handles the next year button click event.\n *\n * This method is called when the next year button is clicked. It will\n * increment the current year by one and regenerate the calender by calling\n * {@link generateCalender}.\n *\n * @param event The mouse event that triggered this method.\n */\n public handleNextYear(event: Event): void {\n event.stopPropagation();\n this.currentYear++;\n\n this.generateCalender();\n }\n\n public getCurrentWeek(startFromMonday = false) {\n this.hours = []\n this.currentWeekDays = []\n this.daysOfTheWeek = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"]\n\n const today = new Date();\n const dayOfWeek = today.getDay(); // 0 (Sunday) to 6 (Saturday)\n\n // Adjust for Monday as the start of the week if needed\n const weekStart = new Date(today);\n weekStart.setDate(today.getDate() - dayOfWeek + (startFromMonday ? (dayOfWeek === 0 ? -6 : 1) : 0));\n\n const weekDates = [];\n for (let i = 0; i < 7; i++) {\n const date = new Date(weekStart);\n date.setDate(weekStart.getDate() + i);\n weekDates.push(date.getDate()); // Day of the month as 1, 2, 3, etc.\n }\n\n this.hours = Array.from({ length: 24 }, (_, i) => {\n const suffix = i < 12 ? 'AM' : 'PM';\n const hour = i % 12 === 0 ? 12 : i % 12;\n return `${hour} ${suffix}`;\n });\n\n console.log(\"weekDates\", weekDates)\n\n if (this.viewOptions[this.selectedView] === 'Work week') {\n this.currentWeekDays = weekDates.slice(1, weekDates.length - 1)\n this.daysOfTheWeek = this.daysOfTheWeek.slice(1, this.daysOfTheWeek.length - 1);\n } else {\n\n this.currentWeekDays = weekDates;\n }\n\n console.log(this.currentWeekDays, this.hours)\n }\n\n getEventHour(eventTime: string, extraMinutes: string): string {\n return eventTime.split(\" \")[0] + \":\" + extraMinutes + ' ' + eventTime.split(\" \")[1]; // Extract hour + AM/PM\n }\n\n\n}\n","<!-- Days of the week header (Sun, Mon, Tue, etc.) -->\n<div class=\"calendar-container\">\n <div class=\"header\" *ngIf=\"calendar_themes.show_header\" [ngStyle]=\"calendar_themes.header_style ?? ''| styleObject\">\n <div class=\"left-content\" style=\"display: flex; align-items: center;\">\n <div *ngIf=\"calendar_themes.show_arrow\">\n <span class=\"arrow-prev\" (click)=\"handlePrevMonth()\" [ngStyle]=\"calendar_themes.arrow_style ?? ''| styleObject\"><</span>\n <span class=\"arrow-next\" (click)=\"handleNextMonth()\" [ngStyle]=\"calendar_themes.arrow_style ?? ''| styleObject\">></span>\n </div>\n\n <div class=\"datepicker current-month\" (click)=\"toggleDatePicker()\" [ngClass]=\"{ 'active': isOpen }\">\n <div class=\"datepicker-header\">\n <span>{{ currentMonthName }} {{ currentYear }} ▼</span>\n </div>\n\n <div class=\"month-grid\" *ngIf=\"calendar_themes.show_month_picker\">\n <div class=\"arrow\"></div>\n <div class=\"year-container\">\n <div class=\"year\" (click)=\"toggleYearPicker($event)\">{{ currentYear }}{{ showYearPicker ? '-' + years[years.length - 1] : '' }}</div>\n <div class=\"year-filter-arrow\" style=\"margin: 8px;\">\n <span class=\"year-arrow\" (click)=\"handlePrevYear($event)\">↑</span>\n <span class=\"year-arrow\" style=\"margin-left:2px ;\" (click)=\"handleNextYear($event)\">↓</span>\n </div>\n </div>\n <div *ngFor=\"let month of monthsOfTheYear and let index = index\">\n <div *ngIf=\"!showYearPicker\" class=\"month\" [ngClass]=\"{ 'selected': index === currentMonth }\" (click)=\"onMonthChange(index)\">\n {{ month }}\n </div>\n </div>\n\n <div *ngFor=\"let year of years and let index = index\" style=\"min-width: 120px;\">\n <div *ngIf=\"showYearPicker\" class=\"month\" [ngClass]=\"{ 'selected': index === currentMonth }\" (click)=\"onYearChange(year)\">\n {{ year }}\n </div>\n </div>\n\n </div>\n </div>\n </div>\n\n <div class=\"right-content\" style=\"display: flex; align-items: center;\" *ngIf=\"calendar_themes.show_calendar_view_filter\">\n <div class=\"datepicker month-dropdown\" (click)=\"toggleMonthPicker()\" [ngClass]=\"{ 'active': isMonthPickerOpen }\">\n <div class=\"datepicker-header\">\n <span>{{viewOptions[selectedView]}} ▼</span>\n </div>\n\n <div class=\"view-options-grid\">\n <div class=\"view-arrow\"></div>\n <div *ngFor=\"let view of viewOptions and let index = index\" class=\"month\" [ngClass]=\"{ 'selected': index === selectedView }\" (click)=\"onViewChange(index)\">\n {{ view }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Calendar Weekdays -->\n <div class=\"calendar-weekdays\" *ngIf=\"viewOptions[selectedView] === 'Month'\">\n <span *ngFor=\"let day of daysOfTheWeek\" class=\"calendar-weekday\">{{ day }}</span>\n </div>\n <div [ngClass]=\"viewOptions[selectedView] === 'Work week' ? 'calendar-working-weekdays' : 'calendar-weekdays'\" *ngIf=\"viewOptions[selectedView] === 'Work week' || viewOptions[selectedView] === 'Week'\">\n <span *ngFor=\"let day of daysOfTheWeek and let index = index\" class=\"calendar-weekday\" [class.current-day-in-weekdays]=\"currentWeekDays[index] === currentDay\">\n <div>\n {{ day }}\n </div>\n {{currentWeekDays[index]}}\n </span>\n </div>\n\n <!-- Calendar Days -->\n <div class=\"calendar-days\" *ngIf=\"viewOptions[selectedView] === 'Month'\">\n <!-- Blank spaces before 1st day -->\n <div *ngFor=\"let blank of [].constructor(firstDayOfWeek)\">\n <div></div>\n </div>\n\n <!-- Calendar Days -->\n <div *ngFor=\"let day of daysInMonth\" class=\"calendar-day\" [class.current-day]=\"day === currentDay\" (click)=\"handleCalenderEvent(day)\">\n <div style=\"font-weight: bolder;\">\n {{ day }}\n </div>\n <div *ngFor=\"let eventDetails of calendar_events\">\n <div *ngIf=\"eventDetails.month - 1 === currentMonth\">\n <div *ngFor=\"let list of eventDetails.list\">\n <div *ngIf=\"list.day === day\">\n <div *ngFor=\"let event of list.events and let index = index\">\n <span class=\"events\" [ngStyle]=\"event.style | styleObject\" *ngIf=\"index < 2\" #trigger (click)=\"openPopover($event, day, event)()\">\n {{ event.title }} - {{ event.time }}\n </span>\n <div class=\"extra-events\" *ngIf=\"index===2\" (click)=\"openOffCanvas(day, list.events)\">+{{ list.events.length - 2 }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"calendar-days\" style=\"display: flex; margin: 0;\" *ngIf=\"viewOptions[selectedView] === 'Work week' || viewOptions[selectedView] === 'Week'\">\n <div [ngClass]=\"viewOptions[selectedView] === 'Work week' ? 'calendar-week-days' : 'calendar-weekend-days'\" style=\"border: 1px solid #000;\">\n <div class=\"calendar-week-day\" *ngFor=\"let day of currentWeekDays; let index = index\" [class.current-day-in-weekdays]=\"currentWeekDays[index] === currentDay\">\n <div class=\"time-slot\" *ngFor=\"let hour of hours\">\n <div style=\"height: 100%;\" *ngFor=\"let eventDetails of calendar_events\">\n\n\n <ng-container *ngIf=\"eventDetails.month - 1 === currentMonth\">\n <div style=\"height: 50%; padding: 5px 0 2px 4px; width: 100%; overflow-y: auto;\">\n <div *ngIf=\"index === 0\">\n {{ hour }}\n </div>\n\n <div *ngFor=\"let list of eventDetails.list\">\n <ng-container *ngIf=\"list.day === day\">\n <ng-container *ngIf=\"(list.events | filterEvents:getEventHour(hour, '00')) as filteredEvents\">\n <ng-container *ngFor=\"let event of filteredEvents.slice(0, 2)\">\n <span class=\"week-events\" [ngStyle]=\"event.style | styleObject\" #trigger (click)=\"openPopover($event, day, event)\">\n {{ event.title }} - {{ event.time }}\n </span>\n </ng-container>\n <div *ngIf=\"filteredEvents.length > 2\" (click)=\"openOffCanvas(day, list.events)\" class=\"extra-week-events\">+{{ filteredEvents.length - 2 }}</div>\n </ng-container>\n </ng-container>\n </div>\n\n </div>\n <div style=\"border-top: 1px solid rgba(128, 128, 128, 0.486); min-height: 50%; padding: 5px 0 2px 4px; width: 100%; overflow-y: auto;\">\n\n <div *ngFor=\"let list of eventDetails.list\">\n <ng-container *ngIf=\"list.day === day\">\n <ng-container *ngIf=\"(list.events | filterEvents:getEventHour(hour, '30')) as filteredEvents\">\n <ng-container *ngFor=\"let event of filteredEvents.slice(0, 2)\">\n <span class=\"week-events\" [ngStyle]=\"event.style | styleObject\" #trigger (click)=\"openPopover($event, day, event)\">\n {{ event.title }} - {{ event.time }}\n </span>\n </ng-container>\n <div *ngIf=\"filteredEvents.length > 2\" (click)=\"openOffCanvas(day, list.events)\" class=\"extra-week-events\">+{{ filteredEvents.length - 2 }}</div>\n </ng-container>\n </ng-container>\n </div>\n\n </div>\n </ng-container>\n\n </div>\n </div>\n\n </div>\n </div>\n </div>\n\n\n</div>\n\n<div class=\"off-canvas\" [class.open]=\"isOffCanvasOpen\">\n <div class=\"off-canvas-header\">\n <h3>{{ weekDay?.slice(0, 3) }}, {{ currentMonthName.slice(0, 3) }} {{ selectedDay }}</h3>\n <button class=\"close-btn\" (click)=\"closeOffCanvas()\">×</button>\n </div>\n\n <div class=\"off-canvas-content\">\n <div *ngIf=\"selectedDayEvents.length; else noEvents\">\n <div *ngFor=\"let event of selectedDayEvents\" class=\"event-card\" [ngStyle]=\"event.style | styleObject\">\n <div class=\"event-header\">\n <h3 class=\"event-title\">{{ event.title }}</h3>\n </div>\n\n <div class=\"event-category\" [ngStyle]=\"{'background': event.categoryColor}\">\n {{ event.category || 'General' }}\n </div>\n\n <div class=\"popover-section\">\n <i class=\"icon-calendar\"></i>\n <p>{{ selectedDay }} {{ currentMonthName }} {{ weekDay?.slice(0, 3) }},\n {{ selectedEventDetail.start_time }} - {{ selectedEventDetail.end_time }}</p>\n </div>\n\n <div class=\"event-section\">\n <i class=\"icon-location\"></i>\n <p>\n {{ selectedEventDetail.location}}\n </p>\n </div>\n\n <div class=\"event-section attendees\" *ngIf=\"event.attendees?.length\">\n <i class=\"icon-users\"></i>\n <div class=\"attendees-list\">\n <div class=\"attendee\" *ngFor=\"let attendee of event.attendees.slice(0, 3)\">\n <img [src]=\"attendee.image\" [alt]=\"attendee.name\">\n <span class=\"attendee-name\">{{ attendee.name }}</span>\n </div>\n <span *ngIf=\"event.attendees.length > 3\" class=\"more-attendees\">\n +{{ event.attendees.length - 3 }} more\n </span>\n </div>\n </div>\n\n <div class=\"event-section\">\n <i class=\"icon-info\"></i>\n <p>{{ event.description }}</p>\n </div>\n </div>\n </div>\n\n <ng-template #noEvents>\n <p class=\"no-events\">No events scheduled for this day.</p>\n </ng-template>\n </div>\n</div>\n\n\n\n\n\n<div #popover class=\"popover-container\" [ngClass]=\"{ 'show': isPopoverOpen }\" [ngStyle]=\"selectedEventDetail.style | styleObject\">\n <div class=\"popover-content\">\n <h3 class=\"popover-title\">\n {{ selectedEventDetail.title }}\n </h3>\n\n <div class=\"event-category\" [ngStyle]=\"{'background': selectedEventDetail.categoryColor}\">\n {{ selectedEventDetail.category || 'General' }}\n </div>\n\n <div class=\"popover-section\">\n <i class=\"icon-calendar\"></i>\n <p>{{ selectedDay }} {{ currentMonthName }} {{ weekDay?.slice(0, 3) }},\n {{ selectedEventDetail.start_time }} - {{ selectedEventDetail.end_time }}</p>\n </div>\n\n <div class=\"event-section\" *ngIf=\"selectedEventDetail.location\">\n <i class=\"icon-location\"></i>\n <p>\n {{ selectedEventDetail.location }}\n </p>\n </div>\n\n <div class=\"event-section attendees\" *ngIf=\"selectedEventDetail.attendees?.length\">\n <i class=\"icon-users\"></i>\n <div class=\"attendees-list\">\n <div class=\"attendee\" *ngFor=\"let attendee of selectedEventDetail.attendees.slice(0, 3)\">\n <img [src]=\"attendee.image\" [alt]=\"attendee.name\">\n <span class=\"attendee-name\">{{ attendee.name }}</span>\n </div>\n <span *ngIf=\"selectedEventDetail.attendees.length > 3\" class=\"more-attendees\">\n +{{ selectedEventDetail.attendees.length - 3 }} more\n </span>\n </div>\n </div>\n\n <div class=\"popover-section\">\n <i class=\"icon-info\"></i>\n <p>{{ selectedEventDetail.description }}</p>\n </div>\n\n <button class=\"close-btn\" (click)=\"isPopoverOpen = false\">✖</button>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { CalendarComponent } from './components/calendar/calendar.component';\nimport { CalendarEvent, CalendarThemes } from './interface/calendar.interface';\n\n@Component({\n selector: 'npx-calendar',\n imports: [CalendarComponent],\n template: `\n <lib-calendar [calendar_events]=\"events\" [calendar_themes]=\"options\"></lib-calendar>\n `,\n styles: ``\n})\nexport class NpxCalendarComponent {\n @Input() public events: CalendarEvent[] = [];\n @Input() public options: CalendarThemes = {\n show_header: true,\n show_arrow: true,\n show_month_picker: true,\n show_calendar_view_filter: true\n };\n}\n","/*\n * Public API Surface of npx-calendar\n */\n\nexport * from './lib/npx-calendar.service';\nexport * from './lib/npx-calendar.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}