sidebar-calendar
Version:
A powerful calendar component for sidebars with day, week, and range selection modes
248 lines (200 loc) • 6.74 kB
TypeScript
/**
* SidebarCalendar TypeScript Definitions v1.0.0
*/
export type CalendarMode = 'day' | 'week' | 'range';
export type CalendarLocale = 'ru-RU' | 'en-US' | string;
export interface CalendarOptions {
/** Calendar selection mode */
mode?: CalendarMode;
/** Locale for date formatting */
locale?: CalendarLocale;
/** Minimum selectable date */
minDate?: Date;
/** Maximum selectable date */
maxDate?: Date;
/** Array of disabled dates */
disabledDates?: Date[];
/** Legacy callback for date selection (deprecated, use .on() instead) */
onDateSelect?: (data: DateSelectEvent) => void;
/** Legacy callback for week selection (deprecated, use .on() instead) */
onWeekSelect?: (data: WeekSelectEvent) => void;
/** Legacy callback for range selection (deprecated, use .on() instead) */
onRangeSelect?: (data: RangeSelectEvent) => void;
}
export interface BaseEvent {
type: string;
}
export interface DateSelectEvent extends BaseEvent {
type: 'day';
date: Date;
formatted: string;
}
export interface WeekSelectEvent extends BaseEvent {
type: 'week';
start: Date;
end: Date;
formatted: string;
}
export interface RangeStartEvent extends BaseEvent {
type: 'rangeStart';
date: Date;
formatted: string;
}
export interface RangeSelectEvent extends BaseEvent {
type: 'range';
start: Date;
end: Date;
formatted: string;
}
export interface ClearEvent extends BaseEvent {
type: 'clear';
}
export interface NavigateEvent extends BaseEvent {
type: 'navigate';
direction: number;
date: Date;
}
export interface DestroyEvent extends BaseEvent {
type: 'destroy';
}
export type CalendarEvent =
| DateSelectEvent
| WeekSelectEvent
| RangeStartEvent
| RangeSelectEvent
| ClearEvent
| NavigateEvent
| DestroyEvent;
export type EventCallback<T extends CalendarEvent = CalendarEvent> = (data: T) => void;
export interface WeekRange {
start: Date;
end: Date;
}
export interface DateRange {
start: Date | null;
end: Date | null;
}
export type SelectedValue = Date | WeekRange | DateRange | null;
export interface SidebarCalendarStatic {
/** Library version */
readonly version: string;
/** Constructor */
new(container: string | HTMLElement, options?: CalendarOptions): SidebarCalendar;
}
export interface SidebarCalendar {
/** Current calendar mode */
readonly mode: CalendarMode;
/** Current locale */
readonly locale: CalendarLocale;
/** Current displayed date */
readonly currentDate: Date;
/** Minimum selectable date */
readonly minDate: Date | null;
/** Maximum selectable date */
readonly maxDate: Date | null;
/** Array of disabled dates */
disabledDates: Date[];
/**
* Subscribe to calendar events
* @param event Event name
* @param callback Callback function
* @returns Calendar instance for chaining
*/
on<T extends CalendarEvent>(event: T['type'], callback: EventCallback<T>): this;
on(event: 'dateSelect', callback: EventCallback<DateSelectEvent>): this;
on(event: 'weekSelect', callback: EventCallback<WeekSelectEvent>): this;
on(event: 'rangeStart', callback: EventCallback<RangeStartEvent>): this;
on(event: 'rangeSelect', callback: EventCallback<RangeSelectEvent>): this;
on(event: 'clear', callback: EventCallback<ClearEvent>): this;
on(event: 'navigate', callback: EventCallback<NavigateEvent>): this;
on(event: 'destroy', callback: EventCallback<DestroyEvent>): this;
/**
* Unsubscribe from calendar events
* @param event Event name
* @param callback Callback function to remove
* @returns Calendar instance for chaining
*/
off<T extends CalendarEvent>(event: T['type'], callback: EventCallback<T>): this;
off(event: 'dateSelect', callback: EventCallback<DateSelectEvent>): this;
off(event: 'weekSelect', callback: EventCallback<WeekSelectEvent>): this;
off(event: 'rangeStart', callback: EventCallback<RangeStartEvent>): this;
off(event: 'rangeSelect', callback: EventCallback<RangeSelectEvent>): this;
off(event: 'clear', callback: EventCallback<ClearEvent>): this;
off(event: 'navigate', callback: EventCallback<NavigateEvent>): this;
off(event: 'destroy', callback: EventCallback<DestroyEvent>): this;
/**
* Navigate to previous/next month
* @param direction Direction (-1 for previous, 1 for next)
*/
navigate(direction: number): void;
/**
* Get currently selected value
* @returns Selected date, week range, or date range depending on mode
*/
getSelected(): SelectedValue;
/**
* Set selected date (day mode only)
* @param date Date to select
*/
setDate(date: Date | string): void;
/**
* Set selected week (week mode only)
* @param date Date within the week to select
*/
setWeek(date: Date | string): void;
/**
* Set selected range (range mode only)
* @param start Start date
* @param end End date
*/
setRange(start: Date | string, end: Date | string): void;
/**
* Clear all selections
*/
clear(): void;
/**
* Navigate to specific month/year
* @param date Date to navigate to
*/
goToDate(date: Date | string): void;
/**
* Execute quick actions
* @param action Action name
*/
quickAction(action: 'today' | 'tomorrow' | 'thisWeek' | 'nextWeek' | 'thisMonth' | 'lastWeek' | 'clear'): void;
/**
* Re-render the calendar
*/
render(): void;
/**
* Destroy the calendar instance
*/
destroy(): void;
}
declare const SidebarCalendar: SidebarCalendarStatic;
export default SidebarCalendar;
// Global declaration for UMD builds
declare global {
interface Window {
SidebarCalendar: SidebarCalendarStatic;
}
}
// Utility types for advanced usage
export namespace SidebarCalendarTypes {
export type Mode = CalendarMode;
export type Locale = CalendarLocale;
export type Options = CalendarOptions;
export type Event = CalendarEvent;
export type Callback<T extends CalendarEvent = CalendarEvent> = EventCallback<T>;
export type Selected = SelectedValue;
export type Week = WeekRange;
export type Range = DateRange;
// Event type guards
export function isDateSelectEvent(event: CalendarEvent): event is DateSelectEvent;
export function isWeekSelectEvent(event: CalendarEvent): event is WeekSelectEvent;
export function isRangeSelectEvent(event: CalendarEvent): event is RangeSelectEvent;
export function isRangeStartEvent(event: CalendarEvent): event is RangeStartEvent;
export function isClearEvent(event: CalendarEvent): event is ClearEvent;
export function isNavigateEvent(event: CalendarEvent): event is NavigateEvent;
export function isDestroyEvent(event: CalendarEvent): event is DestroyEvent;
}