datex-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/assets/images/demo.gif +0 -0
- package/assets/images/screenshots/basic-date-range.png +0 -0
- package/assets/images/screenshots/time-picker.png +0 -0
- package/dist/constants/locales.d.ts +9 -0
- package/dist/constants/themes.d.ts +8 -0
- package/dist/datex.d.ts +136 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.esm.js +1316 -0
- package/dist/style.css +1 -0
- package/dist/tests/setup.d.ts +1 -0
- package/dist/types/index.d.ts +76 -0
- package/dist/utils/dateHelpers.d.ts +24 -0
- package/dist/utils/domHelpers.d.ts +30 -0
- package/package.json +73 -0
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.datex-picker{position:absolute;color:inherit;background-color:#fff;border-radius:4px;border:1px solid #ddd;width:278px;max-width:none;padding:0;margin-top:7px;top:100px;left:20px;z-index:3001!important;display:none;font-family:arial;font-size:15px;line-height:1em;-webkit-user-select:none;user-select:none}.datex-picker:focus-within{z-index:3001!important}.datex-picker:before,.datex-picker:after{position:absolute;display:inline-block;border-bottom-color:#0003;content:""}.datex-picker:before{top:-7px;border-right:7px solid transparent;border-left:7px solid transparent;border-bottom:7px solid #ccc}.datex-picker:after{top:-6px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.datex-picker.opensleft:before{right:9px}.datex-picker.opensleft:after{right:10px}.datex-picker.openscenter:before,.datex-picker.openscenter:after{left:0;right:0;width:0;margin-left:auto;margin-right:auto}.datex-picker.opensright:before{left:9px}.datex-picker.opensright:after{left:10px}.datex-picker.drop-up{margin-top:-7px}.datex-picker.drop-up:before{top:initial;bottom:-7px;border-bottom:initial;border-top:7px solid #ccc}.datex-picker.drop-up:after{top:initial;bottom:-6px;border-bottom:initial;border-top:6px solid #fff}.datex-picker.single .ranges,.datex-picker.single .drp-calendar{float:none}.datex-picker.single .drp-selected{display:none}.datex-picker.show-calendar .drp-calendar,.datex-picker.show-calendar .drp-buttons{display:block}.datex-picker.auto-apply .drp-buttons{display:none}.datex-picker .drp-calendar{display:none;max-width:270px}.datex-picker .drp-calendar.left{padding:6px 0 6px 6px}.datex-picker .drp-calendar.right{padding:6px}.datex-picker .drp-calendar.single .calendar-table{border:none}.datex-picker .calendar-table{border:1px solid #fff;border-radius:4px;background-color:#fff}.datex-picker .calendar-table table{width:100%;margin:0;border-spacing:0;border-collapse:collapse}.datex-picker .calendar-table .next span,.datex-picker .calendar-table .prev span{color:#fff;border:solid black;border-width:0 2px 2px 0;border-radius:0;display:inline-block}.datex-picker .calendar-table .next span{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}.datex-picker .calendar-table .prev span{transform:rotate(135deg);-webkit-transform:rotate(135deg)}.datex-picker .calendar-table .next,.datex-picker .calendar-table .prev{cursor:pointer;-webkit-user-select:none;user-select:none;width:32px;height:28px}.datex-picker .calendar-table .next:hover,.datex-picker .calendar-table .prev:hover{background-color:#f0f0f0}.datex-picker .calendar-table th,.datex-picker .calendar-table td{white-space:nowrap;text-align:center;vertical-align:middle;min-width:28px;width:28px;height:22px;line-height:20px;font-size:11px;border-radius:3px;border:1px solid transparent;cursor:pointer}.datex-picker .calendar-table th{font-weight:600;color:#6b7280;cursor:default}.datex-picker .calendar-table th.month{width:auto;font-weight:700;color:#111827}.datex-picker .calendar-table td.available:hover,.datex-picker .calendar-table th.available:hover{background-color:#eee;border-color:transparent;color:inherit}.datex-picker .calendar-table td.week,.datex-picker .calendar-table th.week{font-size:80%;color:#ccc}.datex-picker .calendar-table td.off,.datex-picker .calendar-table td.off.in-range,.datex-picker .calendar-table td.off.start-date,.datex-picker .calendar-table td.off.end-date{background-color:#fff;border-color:transparent;color:#999;cursor:not-allowed}.datex-picker .calendar-table td.in-range{background-color:#ebf4f8;border-color:transparent;color:#000;border-radius:0}.datex-picker .calendar-table td.start-date{border-radius:3px 0 0 3px;background-color:#357ebd;color:#fff}.datex-picker .calendar-table td.start-date.end-date{border-radius:3px}.datex-picker .calendar-table td.end-date{border-radius:0 3px 3px 0;background-color:#357ebd;color:#fff}.datex-picker .calendar-table td.active,.datex-picker .calendar-table td.active:hover{background-color:#357ebd;border-color:transparent;color:#fff}.datex-picker .calendar-table td.today{font-weight:600;color:#357ebd}.datex-picker .calendar-table td.weekend{color:#ef4444}.datex-picker .calendar-table td.disabled,.datex-picker .calendar-table option.disabled{color:#999;cursor:not-allowed;text-decoration:line-through}.datex-picker .calendar-table select.monthselect,.datex-picker .calendar-table select.yearselect{font-size:12px;padding:1px;height:auto;margin:0;cursor:default;border:1px solid #ddd;border-radius:4px;background-color:#fff}.datex-picker .calendar-table select.monthselect:focus,.datex-picker .calendar-table select.yearselect:focus{outline:none;border-color:#357ebd;box-shadow:0 0 0 3px #357ebd1a}.datex-picker .calendar-table select.monthselect{margin-right:2%;width:56%}.datex-picker .calendar-table select.yearselect{width:40%}.datex-picker .calendar-time{text-align:center;margin:4px auto 0;line-height:30px;position:relative}.datex-picker .calendar-time select.hourselect,.datex-picker .calendar-time select.minuteselect,.datex-picker .calendar-time select.secondselect,.datex-picker .calendar-time select.ampmselect{width:50px;margin:0 auto;background:#eee;border:1px solid #eee;padding:2px;outline:0;font-size:12px;border-radius:4px}.datex-picker .calendar-time select.hourselect:focus,.datex-picker .calendar-time select.minuteselect:focus,.datex-picker .calendar-time select.secondselect:focus,.datex-picker .calendar-time select.ampmselect:focus{border-color:#357ebd;box-shadow:0 0 0 3px #357ebd1a}.datex-picker .calendar-time select.hourselect.disabled,.datex-picker .calendar-time select.minuteselect.disabled,.datex-picker .calendar-time select.secondselect.disabled,.datex-picker .calendar-time select.ampmselect.disabled{color:#ccc;cursor:not-allowed;background-color:#f3f4f6}.datex-picker .ranges{float:none;text-align:left;margin:0}.datex-picker .ranges ul{list-style:none;margin:0 auto;padding:0;width:100%}.datex-picker .ranges li{font-size:12px;padding:8px 12px;cursor:pointer;transition:all .15s ease-in-out}.datex-picker .ranges li:hover{background-color:#eee}.datex-picker .ranges li.active{background-color:#08c;color:#fff}.datex-picker.show-calendar .ranges{margin-top:8px}.datex-picker .drp-buttons{border-top:1px solid #ddd;vertical-align:middle;clear:both;text-align:right;padding:2px;display:none;line-height:10px}.datex-picker .drp-buttons .drp-selected{display:inline-block;font-size:12px;padding-right:8px}.datex-picker .drp-buttons .btn{border:1px solid transparent;border-radius:3px;cursor:pointer;transition:all .15s ease-in-out;margin-left:8px;font-size:12px;font-weight:700;padding:8px!important;background-color:red}.datex-picker .drp-buttons .btn:focus{outline:none;box-shadow:0 0 0 2px #357ebd1a}.datex-picker .drp-buttons .btn:disabled{opacity:.5;cursor:not-allowed}.datex-picker .drp-buttons .btn.btn-success{background-color:#007bff;color:#fff;border-color:#007bff}.datex-picker .drp-buttons .btn.btn-success:hover:not(:disabled){background-color:#0056b3;border-color:#0056b3}.datex-picker .drp-buttons .btn.btn-danger{background-color:#6c757d;color:#fff;border-color:#6c757d}.datex-picker .drp-buttons .btn.btn-danger:hover:not(:disabled){background-color:#545b62;border-color:#545b62}@media (min-width: 564px){.datex-picker{width:auto}.datex-picker .ranges ul{width:140px}.datex-picker.single .ranges ul{width:100%}.datex-picker.single .drp-calendar.left{clear:none}.datex-picker.single .ranges,.datex-picker.single .drp-calendar{float:left}.datex-picker{direction:ltr;text-align:left}.datex-picker .drp-calendar.left{clear:left;margin-right:0}.datex-picker .drp-calendar.left .calendar-table{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;padding-right:8px}.datex-picker .drp-calendar.right{margin-left:0}.datex-picker .drp-calendar.right .calendar-table{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.datex-picker .ranges,.datex-picker .drp-calendar{float:left}}@media (min-width: 730px){.datex-picker .ranges{width:auto;float:left}.datex-picker .drp-calendar.left{clear:none!important}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for DateX library
|
|
3
|
+
*/
|
|
4
|
+
export interface DateRangePickerTheme {
|
|
5
|
+
primaryColor?: string;
|
|
6
|
+
secondaryColor?: string;
|
|
7
|
+
backgroundColor?: string;
|
|
8
|
+
borderColor?: string;
|
|
9
|
+
textColor?: string;
|
|
10
|
+
hoverColor?: string;
|
|
11
|
+
selectedColor?: string;
|
|
12
|
+
rangeColor?: string;
|
|
13
|
+
todayColor?: string;
|
|
14
|
+
disabledColor?: string;
|
|
15
|
+
applyButtonColor?: string;
|
|
16
|
+
cancelButtonColor?: string;
|
|
17
|
+
borderRadius?: string;
|
|
18
|
+
fontSize?: string;
|
|
19
|
+
fontFamily?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface DateRangePickerLocale {
|
|
22
|
+
format: string;
|
|
23
|
+
separator: string;
|
|
24
|
+
applyLabel: string;
|
|
25
|
+
cancelLabel: string;
|
|
26
|
+
customRangeLabel: string;
|
|
27
|
+
daysOfWeek: string[];
|
|
28
|
+
monthNames: string[];
|
|
29
|
+
firstDay: number;
|
|
30
|
+
}
|
|
31
|
+
export interface DateRangePickerOptions {
|
|
32
|
+
startDate?: Date;
|
|
33
|
+
endDate?: Date;
|
|
34
|
+
minDate?: Date | null;
|
|
35
|
+
maxDate?: Date | null;
|
|
36
|
+
minYear?: number;
|
|
37
|
+
maxYear?: number;
|
|
38
|
+
maxSpan?: {
|
|
39
|
+
days?: number;
|
|
40
|
+
} | null;
|
|
41
|
+
autoApply?: boolean;
|
|
42
|
+
singleDatePicker?: boolean;
|
|
43
|
+
showDropdowns?: boolean;
|
|
44
|
+
linkedCalendars?: boolean;
|
|
45
|
+
autoUpdateInput?: boolean;
|
|
46
|
+
alwaysShowCalendars?: boolean;
|
|
47
|
+
showCustomRangeLabel?: boolean;
|
|
48
|
+
timePicker?: boolean;
|
|
49
|
+
timePicker24Hour?: boolean;
|
|
50
|
+
timePickerIncrement?: number;
|
|
51
|
+
timePickerSeconds?: boolean;
|
|
52
|
+
ranges?: Record<string, [Date, Date]>;
|
|
53
|
+
opens?: "left" | "right" | "center";
|
|
54
|
+
drops?: "up" | "down" | "auto";
|
|
55
|
+
locale?: DateRangePickerLocale;
|
|
56
|
+
buttonClasses?: string;
|
|
57
|
+
applyButtonClasses?: string;
|
|
58
|
+
cancelButtonClasses?: string;
|
|
59
|
+
theme?: DateRangePickerTheme;
|
|
60
|
+
}
|
|
61
|
+
export type DateRangePickerCallback = (startDate: Date, endDate: Date, label?: string) => void;
|
|
62
|
+
export interface CalendarState {
|
|
63
|
+
month: Date;
|
|
64
|
+
calendar: Date[][];
|
|
65
|
+
}
|
|
66
|
+
export interface PickerState {
|
|
67
|
+
startDate: Date;
|
|
68
|
+
endDate: Date | null;
|
|
69
|
+
oldStartDate: Date;
|
|
70
|
+
oldEndDate: Date | null;
|
|
71
|
+
isShowing: boolean;
|
|
72
|
+
leftCalendar: CalendarState;
|
|
73
|
+
rightCalendar: CalendarState;
|
|
74
|
+
chosenLabel: string | null;
|
|
75
|
+
hoverDate: Date | null;
|
|
76
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date utility functions for DateX
|
|
3
|
+
*/
|
|
4
|
+
export declare function format(date: Date, formatStr: string): string;
|
|
5
|
+
export declare function parse(dateStr: string, formatStr: string): Date;
|
|
6
|
+
export declare function addDay(date: Date, days: number): Date;
|
|
7
|
+
export declare function addMonth(date: Date, months: number): Date;
|
|
8
|
+
export declare function dayStart(date: Date): Date;
|
|
9
|
+
export declare function dayEnd(date: Date): Date;
|
|
10
|
+
export declare function isAfter(date1: Date, date2: Date): boolean;
|
|
11
|
+
export declare function isBefore(date1: Date, date2: Date): boolean;
|
|
12
|
+
export declare function isSame(date1: Date, date2: Date, unit?: "day" | "month" | "year"): boolean;
|
|
13
|
+
export declare function isValid(date: Date | null | undefined): date is Date;
|
|
14
|
+
export declare function getStartOfMonth(date: Date): Date;
|
|
15
|
+
export declare function getEndOfMonth(date: Date): Date;
|
|
16
|
+
export declare function getStartOfWeek(date: Date, firstDay?: number): Date;
|
|
17
|
+
/**
|
|
18
|
+
* Generate common date ranges
|
|
19
|
+
*/
|
|
20
|
+
export declare function getCommonRanges(): Record<string, [Date, Date]>;
|
|
21
|
+
/**
|
|
22
|
+
* Generate Spanish date ranges
|
|
23
|
+
*/
|
|
24
|
+
export declare function getSpanishRanges(): Record<string, [Date, Date]>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM utility functions for DateX
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Generate unique ID for theme styles
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateStyleId(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Create DOM element from HTML string
|
|
10
|
+
*/
|
|
11
|
+
export declare function createElementFromHTML(html: string): HTMLElement;
|
|
12
|
+
/**
|
|
13
|
+
* Check if element matches selector
|
|
14
|
+
*/
|
|
15
|
+
export declare function matches(element: Element, selector: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Find closest parent element matching selector
|
|
18
|
+
*/
|
|
19
|
+
export declare function closest(element: Element, selector: string): Element | null;
|
|
20
|
+
/**
|
|
21
|
+
* Add event listener with cleanup tracking
|
|
22
|
+
*/
|
|
23
|
+
export declare function addEventListener(element: HTMLElement | Document | Window, event: string, handler: EventListener, options?: boolean | AddEventListenerOptions): () => void;
|
|
24
|
+
/**
|
|
25
|
+
* Position element relative to target
|
|
26
|
+
*/
|
|
27
|
+
export declare function positionElement(element: HTMLElement, target: HTMLElement, options?: {
|
|
28
|
+
opens?: "left" | "right" | "center";
|
|
29
|
+
drops?: "up" | "down" | "auto";
|
|
30
|
+
}): void;
|
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "datex-ui",
|
|
3
|
+
"access": "public",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "A modern, lightweight, and customizable date range picker for TypeScript/JavaScript applications",
|
|
7
|
+
"main": "dist/index.esm.js",
|
|
8
|
+
"module": "dist/index.esm.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"assets/images/*.png",
|
|
13
|
+
"assets/images/*.jpg",
|
|
14
|
+
"assets/images/*.gif",
|
|
15
|
+
"assets/images/screenshots/*.png",
|
|
16
|
+
"assets/images/screenshots/*.jpg",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "vite build && tsc --emitDeclarationOnly",
|
|
22
|
+
"build:watch": "vite build --watch",
|
|
23
|
+
"dev": "vite dev --config vite.dev.config.ts",
|
|
24
|
+
"dev:simple": "vite serve dev --port 3000 --open",
|
|
25
|
+
"test": "vitest --run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
28
|
+
"lint:fix": "eslint src --ext .ts,.tsx --fix",
|
|
29
|
+
"type-check": "tsc --noEmit",
|
|
30
|
+
"docs:dev": "vitepress dev docs",
|
|
31
|
+
"docs:build": "vitepress build docs",
|
|
32
|
+
"docs:preview": "vitepress preview docs",
|
|
33
|
+
"docs:install": "cd docs && pnpm install"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"date-picker",
|
|
37
|
+
"date-range-picker",
|
|
38
|
+
"typescript",
|
|
39
|
+
"calendar",
|
|
40
|
+
"datepicker",
|
|
41
|
+
"ui-component",
|
|
42
|
+
"vanilla-js",
|
|
43
|
+
"lightweight"
|
|
44
|
+
],
|
|
45
|
+
"author": "Emilio Senguana sengua2017@gmail.com",
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/senguanasoft/datex-ui.git"
|
|
50
|
+
},
|
|
51
|
+
"bugs": {
|
|
52
|
+
"url": "https://github.com/senguanasoft/datex-ui/issues"
|
|
53
|
+
},
|
|
54
|
+
"homepage": "https://datex-docs.vercel.app",
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/node": "^20.10.5",
|
|
57
|
+
"@typescript-eslint/eslint-plugin": "^6.15.0",
|
|
58
|
+
"@typescript-eslint/parser": "^6.15.0",
|
|
59
|
+
"eslint": "^8.56.0",
|
|
60
|
+
"jsdom": "^23.2.0",
|
|
61
|
+
"sass": "^1.69.5",
|
|
62
|
+
"sass-embedded": "^1.97.2",
|
|
63
|
+
"typescript": "^5.3.3",
|
|
64
|
+
"vite": "^5.0.10",
|
|
65
|
+
"vitepress": "^1.0.0-rc.31",
|
|
66
|
+
"vitest": "^1.1.0"
|
|
67
|
+
},
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">=16.0.0",
|
|
70
|
+
"pnpm": ">=8.0.0"
|
|
71
|
+
},
|
|
72
|
+
"packageManager": "pnpm@8.15.0"
|
|
73
|
+
}
|