calendar-simple 1.0.0-beta.1

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.
@@ -0,0 +1,37 @@
1
+ name: Publish Version
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - release
7
+ - main
8
+
9
+ jobs:
10
+ release:
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: write
14
+ issues: write
15
+ packages: write
16
+ pull-requests: write
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - uses: actions/setup-node@v4
21
+ with:
22
+ node-version: 22
23
+
24
+ - run: npm install
25
+
26
+ - name: Build
27
+ run: npm run build
28
+
29
+ - name: Semantic Release
30
+ run: npx semantic-release
31
+ env:
32
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
33
+ NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
34
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
35
+
36
+ - name: Published Version Name
37
+ run: echo "Version Name ${{ steps.extract_version.outputs.version_name }}"
package/.releaserc ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "branches": [
3
+ {
4
+ "name": "main"
5
+ },
6
+ {
7
+ "name": "release",
8
+ "prerelease": "beta"
9
+ }
10
+ ],
11
+ "plugins": [
12
+ "@semantic-release/commit-analyzer",
13
+ "@semantic-release/release-notes-generator",
14
+ "@semantic-release/github",
15
+ [
16
+ "@semantic-release/changelog",
17
+ {
18
+ "changelogFile": "README.md"
19
+ }
20
+ ],
21
+ "@semantic-release/npm"
22
+ ]
23
+ }
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # 1.0.0-beta.1 (2025-11-09)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add semantic-release configuration and workflow ([b3cfda0](https://github.com/Jaganath-MSJ/CalendarSimple/commit/b3cfda0593642a5e488fc90226d0f974163986d3))
7
+ * **publish:** update node version to 22 in workflow ([3fb4a19](https://github.com/Jaganath-MSJ/CalendarSimple/commit/3fb4a19b6005983ac4640d1d4049cf586ce42c4c))
8
+ * replace NPM_TOKEN with GITHUB_TOKEN for publishing ([9497cd5](https://github.com/Jaganath-MSJ/CalendarSimple/commit/9497cd52b408e05b282cfd562a0cebd6239f1c5e))
9
+ * uncomment NPM_TOKEN in publish workflow ([0a5d293](https://github.com/Jaganath-MSJ/CalendarSimple/commit/0a5d29305377a02574a8473ce53e33f04dbd8187))
10
+
11
+ # Calendar App
12
+
13
+ A user-friendly calendar app for viewing, selecting, and managing dates with data management capabilities.
14
+
15
+ ## Features
16
+
17
+ - View and navigate through a monthly calendar
18
+ - Select dates and manage selected dates
19
+ - Customizable styling with Styled Components
20
+ - Support for data management and event handling
21
+ - Easy integration into React projects
22
+ - Lightweight and minimal dependencies
23
+
24
+ ## Tech Stack
25
+ - React JS
26
+ - TypeScrpit
27
+ - Styled Component
28
+ - Moment.js
29
+
30
+ ## Key Features
31
+
32
+ - **Monthly Calendar View:** Navigate through a monthly calendar with ease.
33
+ - **Date Selection:** Select single or multiple dates from the calendar.
34
+ - **Data Management:** Add, update, or remove data associated with selected dates.
35
+ - **Custom Styling:** Easily customize the calendar appearance using Styled Components.
36
+ - **Event Handling:** Handle user interactions and events seamlessly within the calendar component.
37
+
38
+ ## Installation
39
+ npm install --save calendar-simple
40
+
41
+ ## Usage
42
+ import React from 'react';
43
+ import { Calendar } from 'calendar-simple';
44
+
45
+ const App: React.FC = () => {
46
+ return (
47
+ <div>
48
+ <h1>Calendar App</h1>
49
+ <Calendar />
50
+ </div>
51
+ );
52
+ };
53
+
54
+ export default App;
55
+
56
+ ## Library
57
+ For a more information, you can visit [Lib Link](https://www.npmjs.com/package/calendar-simple).
58
+
59
+ ## License
60
+ This project is licensed under the MIT License - see the LICENSE file for details.
@@ -0,0 +1,34 @@
1
+ import React$1 from 'react';
2
+
3
+ interface CalendarType {
4
+ dayType?: EDayType;
5
+ data?: React.ReactNode[];
6
+ width?: number;
7
+ height?: number;
8
+ selectedDate?: Date;
9
+ onDateClick?: (date: Date) => void;
10
+ onMonthChange?: (date: Date) => void;
11
+ isSelectDate?: boolean;
12
+ className?: string;
13
+ headerClassName?: string;
14
+ tableClassName?: string;
15
+ tableDateClassName?: string;
16
+ dataClassName?: string;
17
+ selectedClassName?: string;
18
+ todayClassName?: string;
19
+ pastYearLength?: number;
20
+ futureYearLength?: number;
21
+ }
22
+ declare enum EDayType {
23
+ fullName = "FULL",
24
+ halfName = "HALF"
25
+ }
26
+
27
+ declare const _default: React$1.NamedExoticComponent<CalendarType>;
28
+
29
+ declare const DAY_TYPE: {
30
+ FULL_NAME: string;
31
+ HALF_NAME: string;
32
+ };
33
+
34
+ export { type CalendarType, DAY_TYPE, EDayType, _default as default };
@@ -0,0 +1,34 @@
1
+ import React$1 from 'react';
2
+
3
+ interface CalendarType {
4
+ dayType?: EDayType;
5
+ data?: React.ReactNode[];
6
+ width?: number;
7
+ height?: number;
8
+ selectedDate?: Date;
9
+ onDateClick?: (date: Date) => void;
10
+ onMonthChange?: (date: Date) => void;
11
+ isSelectDate?: boolean;
12
+ className?: string;
13
+ headerClassName?: string;
14
+ tableClassName?: string;
15
+ tableDateClassName?: string;
16
+ dataClassName?: string;
17
+ selectedClassName?: string;
18
+ todayClassName?: string;
19
+ pastYearLength?: number;
20
+ futureYearLength?: number;
21
+ }
22
+ declare enum EDayType {
23
+ fullName = "FULL",
24
+ halfName = "HALF"
25
+ }
26
+
27
+ declare const _default: React$1.NamedExoticComponent<CalendarType>;
28
+
29
+ declare const DAY_TYPE: {
30
+ FULL_NAME: string;
31
+ HALF_NAME: string;
32
+ };
33
+
34
+ export { type CalendarType, DAY_TYPE, EDayType, _default as default };
package/dist/index.js ADDED
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ DAY_TYPE: () => DAY_TYPE,
34
+ EDayType: () => EDayType,
35
+ default: () => index_default
36
+ });
37
+ module.exports = __toCommonJS(index_exports);
38
+
39
+ // src/components/Calendar.tsx
40
+ var import_react4 = __toESM(require("react"));
41
+
42
+ // src/components/Calendar.type.ts
43
+ var EDayType = /* @__PURE__ */ ((EDayType2) => {
44
+ EDayType2["fullName"] = "FULL";
45
+ EDayType2["halfName"] = "HALF";
46
+ return EDayType2;
47
+ })(EDayType || {});
48
+ var defaultCalenderProps = {
49
+ dayType: "HALF" /* halfName */,
50
+ data: [],
51
+ width: 400,
52
+ height: 400,
53
+ isSelectDate: false,
54
+ pastYearLength: 5,
55
+ futureYearLength: 5
56
+ };
57
+
58
+ // src/components/Calendar.constant.ts
59
+ var DAY_LIST = {
60
+ SUNDAY: {
61
+ FULL: "Sunday",
62
+ HALF: "Sun"
63
+ },
64
+ MONDAY: {
65
+ FULL: "Monday",
66
+ HALF: "Mon"
67
+ },
68
+ TUESDAY: {
69
+ FULL: "Tuesday",
70
+ HALF: "Tue"
71
+ },
72
+ WEDNESDAY: {
73
+ FULL: "Wednesday",
74
+ HALF: "Wed"
75
+ },
76
+ THURSDAY: {
77
+ FULL: "Thursday",
78
+ HALF: "Thu"
79
+ },
80
+ FRIDAY: {
81
+ FULL: "Friday",
82
+ HALF: "Fri"
83
+ },
84
+ SATURDAY: {
85
+ FULL: "Saturday",
86
+ HALF: "Sat"
87
+ }
88
+ };
89
+ var DAY_LIST_NAME = {
90
+ FULL: [
91
+ DAY_LIST.SUNDAY.FULL,
92
+ DAY_LIST.MONDAY.FULL,
93
+ DAY_LIST.TUESDAY.FULL,
94
+ DAY_LIST.WEDNESDAY.FULL,
95
+ DAY_LIST.THURSDAY.FULL,
96
+ DAY_LIST.FRIDAY.FULL,
97
+ DAY_LIST.SATURDAY.FULL
98
+ ],
99
+ HALF: [
100
+ DAY_LIST.SUNDAY.HALF,
101
+ DAY_LIST.MONDAY.HALF,
102
+ DAY_LIST.TUESDAY.HALF,
103
+ DAY_LIST.WEDNESDAY.HALF,
104
+ DAY_LIST.THURSDAY.HALF,
105
+ DAY_LIST.FRIDAY.HALF,
106
+ DAY_LIST.SATURDAY.HALF
107
+ ]
108
+ };
109
+ var MONTHS = {
110
+ JAN: { label: "January", value: 0 },
111
+ FEB: { label: "February", value: 1 },
112
+ MAR: { label: "March", value: 2 },
113
+ APR: { label: "April", value: 3 },
114
+ MAY: { label: "May", value: 4 },
115
+ JUN: { label: "June", value: 5 },
116
+ JUL: { label: "July", value: 6 },
117
+ AUG: { label: "August", value: 7 },
118
+ SEP: { label: "September", value: 8 },
119
+ OCT: { label: "October", value: 9 },
120
+ NOV: { label: "November", value: 10 },
121
+ DEC: { label: "December", value: 11 }
122
+ };
123
+ var MONTH_LIST = Object.values(MONTHS);
124
+ var CALENDER_STRINGS = {
125
+ MONTH: "monthDropdown",
126
+ YEAR: "yearDropdown"
127
+ };
128
+ var DAY_TYPE = {
129
+ FULL_NAME: "FULL",
130
+ HALF_NAME: "HALF"
131
+ };
132
+
133
+ // src/components/Calendar.utils.ts
134
+ var import_moment = __toESM(require("moment"));
135
+ var getNoOfDays = (date) => {
136
+ const noOfDates = date.daysInMonth();
137
+ return noOfDates;
138
+ };
139
+ var getMonthStartingDay = (date) => {
140
+ const monthStartingDay = Number(date.startOf("month").format("d"));
141
+ return monthStartingDay;
142
+ };
143
+ var convertToDate = (momentDate) => {
144
+ const date = momentDate.toDate();
145
+ return date;
146
+ };
147
+ var convertToMoment = (date) => {
148
+ const momentDate = (0, import_moment.default)(date);
149
+ return momentDate;
150
+ };
151
+ var getYearList = (pastLength, futureLength, selectedYear) => {
152
+ const yearLength = pastLength + futureLength;
153
+ const yearStarting = (0, import_moment.default)().year() - pastLength + 1;
154
+ const yearList = Array.from(
155
+ { length: yearLength },
156
+ (_, index) => index + yearStarting
157
+ );
158
+ if (!yearList.includes(selectedYear)) {
159
+ if ((0, import_moment.default)().year() <= selectedYear) {
160
+ yearList.push(selectedYear);
161
+ } else {
162
+ return [selectedYear, ...yearList];
163
+ }
164
+ }
165
+ return yearList;
166
+ };
167
+ var checkIsToday = (selectedDate, dates) => {
168
+ const cloneSelectedDate = selectedDate.clone();
169
+ cloneSelectedDate.date(dates);
170
+ const isToday = (0, import_moment.default)().isSame(cloneSelectedDate, "D");
171
+ return isToday;
172
+ };
173
+
174
+ // src/components/Calendar.styles.ts
175
+ var import_styled_components = __toESM(require("styled-components"));
176
+ var CalenderStyles = import_styled_components.default.section`
177
+ * {
178
+ padding: 0;
179
+ margin: 0;
180
+ outline: none;
181
+ }
182
+ width: max-content;
183
+ height: max-content;
184
+ & > div {
185
+ display: flex;
186
+ justify-content: space-between;
187
+ align-items: center;
188
+ padding: 0 10px;
189
+ margin-bottom: 10px;
190
+ & > div {
191
+ display: flex;
192
+ gap: 20px;
193
+ }
194
+ }
195
+ & > table {
196
+ border-collapse: collapse;
197
+ & th,
198
+ & td {
199
+ border: 1px solid black;
200
+ text-align: center;
201
+ min-width: calc(${(props) => props.$width} / 7);
202
+ max-width: calc(${(props) => props.$width} / 7);
203
+ }
204
+ & th {
205
+ height: calc(${(props) => props.$height} / 10);
206
+ }
207
+ & td {
208
+ height: calc(${(props) => props.$height} / 7);
209
+ }
210
+ }
211
+ `;
212
+ var ButtonStyles = import_styled_components.default.button`
213
+ outline: none;
214
+ border: none;
215
+ background: none;
216
+ color: rgb(211, 211, 211);
217
+ border-radius: 5px;
218
+ &:hover {
219
+ background-color: rgba(211, 211, 211, 0.5);
220
+ transition: 0.2s ease-in-out;
221
+ }
222
+ `;
223
+ var SelectStyles = import_styled_components.default.select`
224
+ border-radius: 3px;
225
+ padding: 2px;
226
+ cursor: pointer;
227
+ `;
228
+ var Calendar_styles_default = CalenderStyles;
229
+
230
+ // src/components/DateData.tsx
231
+ var import_react = __toESM(require("react"));
232
+ var import_styled_components2 = __toESM(require("styled-components"));
233
+ var import_classnames = __toESM(require("classnames"));
234
+ function DateData(props) {
235
+ const {
236
+ date,
237
+ data,
238
+ className,
239
+ dataClassName,
240
+ isSelected,
241
+ isToday,
242
+ onClick,
243
+ selectedClassName,
244
+ todayClassName
245
+ } = props;
246
+ return /* @__PURE__ */ import_react.default.createElement(
247
+ DateDataStyles,
248
+ {
249
+ $isSelected: isSelected,
250
+ $isToday: isToday,
251
+ onClick: () => onClick?.(date),
252
+ className: (0, import_classnames.default)(
253
+ className,
254
+ isSelected && selectedClassName,
255
+ isToday && todayClassName
256
+ )
257
+ },
258
+ /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("p", null, date), data && /* @__PURE__ */ import_react.default.createElement("div", { className: dataClassName }, data))
259
+ );
260
+ }
261
+ var DateDataStyles = import_styled_components2.default.td`
262
+ cursor: pointer;
263
+ & > div {
264
+ height: 100%;
265
+ width: 100%;
266
+ display: flex;
267
+ flex-direction: column;
268
+ justify-content: space-around;
269
+ & > div > * {
270
+ overflow: hidden;
271
+ text-overflow: ellipsis;
272
+ white-space: nowrap;
273
+ }
274
+ }
275
+ ${(props) => props.$isSelected ? `
276
+ background-color: #EEEEEE;
277
+ color: #737373;
278
+ font-weight: bold;
279
+ ` : ``}
280
+ ${(props) => props.$isToday ? `
281
+ color: #2E75B6;
282
+ font-size: 18px;
283
+ font-weight: bold;
284
+ ` : ``}
285
+ `;
286
+ var DateData_default = DateData;
287
+
288
+ // src/assets/LeftArrow.tsx
289
+ var import_react2 = __toESM(require("react"));
290
+ function LeftArrow() {
291
+ return /* @__PURE__ */ import_react2.default.createElement("svg", { width: "40px", height: "40px", viewBox: "0 0 24.00 24.00", fill: "none", xmlns: "http://www.w3.org/2000/svg", stroke: "#707070", transform: "rotate(180)" }, /* @__PURE__ */ import_react2.default.createElement("g", { id: "SVGRepo_bgCarrier", strokeWidth: "0" }), /* @__PURE__ */ import_react2.default.createElement("g", { id: "SVGRepo_tracerCarrier", strokeLinecap: "round", strokeLinejoin: "round" }), /* @__PURE__ */ import_react2.default.createElement("g", { id: "SVGRepo_iconCarrier" }, /* @__PURE__ */ import_react2.default.createElement("path", { d: "M10 7L15 12L10 17", stroke: "#707070", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" })));
292
+ }
293
+ var LeftArrow_default = LeftArrow;
294
+
295
+ // src/assets/RightArrow.tsx
296
+ var import_react3 = __toESM(require("react"));
297
+ function RightArrow() {
298
+ return /* @__PURE__ */ import_react3.default.createElement("svg", { width: "40px", height: "40px", viewBox: "0 0 24.00 24.00", fill: "none", xmlns: "http://www.w3.org/2000/svg", stroke: "#707070" }, /* @__PURE__ */ import_react3.default.createElement("g", { id: "SVGRepo_bgCarrier", strokeWidth: "0" }), /* @__PURE__ */ import_react3.default.createElement("g", { id: "SVGRepo_tracerCarrier", strokeLinecap: "round", strokeLinejoin: "round" }), /* @__PURE__ */ import_react3.default.createElement("g", { id: "SVGRepo_iconCarrier" }, /* @__PURE__ */ import_react3.default.createElement("path", { d: "M10 7L15 12L10 17", stroke: "#707070", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" })));
299
+ }
300
+ var RightArrow_default = RightArrow;
301
+
302
+ // src/components/Calendar.tsx
303
+ var Calender = (props = defaultCalenderProps) => {
304
+ const {
305
+ dayType = defaultCalenderProps.dayType,
306
+ data = defaultCalenderProps.data,
307
+ width = defaultCalenderProps.width,
308
+ height = defaultCalenderProps.height,
309
+ selectedDate: selected_date,
310
+ onDateClick,
311
+ onMonthChange,
312
+ isSelectDate = defaultCalenderProps.isSelectDate,
313
+ className,
314
+ headerClassName,
315
+ tableClassName,
316
+ tableDateClassName,
317
+ dataClassName,
318
+ selectedClassName,
319
+ todayClassName,
320
+ pastYearLength = defaultCalenderProps.pastYearLength,
321
+ futureYearLength = defaultCalenderProps.futureYearLength
322
+ } = props;
323
+ const selectedDateMoment = (0, import_react4.useMemo)(
324
+ () => selected_date ? convertToMoment(selected_date) : (0, import_moment.default)(),
325
+ [selected_date]
326
+ );
327
+ const [selectedDate, setSelectedDate] = (0, import_react4.useState)(selectedDateMoment);
328
+ (0, import_react4.useLayoutEffect)(() => {
329
+ setSelectedDate(selectedDateMoment);
330
+ }, [selectedDateMoment]);
331
+ const getDates = (0, import_react4.useCallback)(() => {
332
+ const dateComponent = [];
333
+ const noOfDays = getNoOfDays(selectedDate.clone());
334
+ const monthStartDay = getMonthStartingDay(selectedDate.clone());
335
+ const noOfRows = Math.round((noOfDays + monthStartDay) / 7 + 0.4);
336
+ let dates = 1;
337
+ const onClickDateHandler = (date) => {
338
+ const cloneSelectedDate = selectedDate.clone();
339
+ if (date !== cloneSelectedDate.date()) {
340
+ cloneSelectedDate.date(date);
341
+ setSelectedDate(cloneSelectedDate.clone());
342
+ onDateClick?.(convertToDate(cloneSelectedDate.clone()));
343
+ }
344
+ };
345
+ for (let row = 1; row <= noOfRows; row++) {
346
+ const tableRow = [];
347
+ for (let day = 1; day <= 7; day++) {
348
+ if (row === 1 && day <= monthStartDay || dates > noOfDays) {
349
+ const emptyData = /* @__PURE__ */ import_react4.default.createElement("td", { key: `empty_${day}` });
350
+ tableRow.push(emptyData);
351
+ } else {
352
+ const dateData = /* @__PURE__ */ import_react4.default.createElement(
353
+ DateData_default,
354
+ {
355
+ key: `date_${dates}`,
356
+ isSelected: isSelectDate && dates === selectedDate.date(),
357
+ isToday: checkIsToday(selectedDate, dates),
358
+ onClick: isSelectDate ? onClickDateHandler : void 0,
359
+ date: dates,
360
+ data: data[dates - 1],
361
+ className: tableDateClassName,
362
+ dataClassName,
363
+ selectedClassName,
364
+ todayClassName
365
+ }
366
+ );
367
+ dates++;
368
+ tableRow.push(dateData);
369
+ }
370
+ }
371
+ const rowData = /* @__PURE__ */ import_react4.default.createElement("tr", { key: row }, tableRow);
372
+ dateComponent.push(rowData);
373
+ }
374
+ return dateComponent;
375
+ }, [
376
+ data,
377
+ selectedDate,
378
+ dataClassName,
379
+ selectedClassName,
380
+ todayClassName,
381
+ tableDateClassName,
382
+ onDateClick,
383
+ isSelectDate
384
+ ]);
385
+ const onMonthArrowClick = (option) => {
386
+ const clonedSelectedDate = selectedDate.clone();
387
+ if (option === "add" /* add */) {
388
+ clonedSelectedDate.month(clonedSelectedDate.month() + 1);
389
+ } else if (option === "sub" /* sub */) {
390
+ clonedSelectedDate.month(clonedSelectedDate.month() - 1);
391
+ }
392
+ setSelectedDate(clonedSelectedDate);
393
+ onMonthChange?.(convertToDate(clonedSelectedDate));
394
+ };
395
+ const onDropdownClick = (event, option) => {
396
+ const value = Number(event.target.value);
397
+ const clonedSelectedDate = selectedDate.clone();
398
+ if (option === "month" /* month */) {
399
+ clonedSelectedDate.month(value);
400
+ } else if (option === "year" /* year */) {
401
+ clonedSelectedDate.year(value);
402
+ }
403
+ setSelectedDate(clonedSelectedDate);
404
+ onMonthChange?.(convertToDate(clonedSelectedDate));
405
+ };
406
+ return /* @__PURE__ */ import_react4.default.createElement(
407
+ Calendar_styles_default,
408
+ {
409
+ $width: `${width}px`,
410
+ $height: `${height}px`,
411
+ className
412
+ },
413
+ /* @__PURE__ */ import_react4.default.createElement("div", { className: headerClassName }, /* @__PURE__ */ import_react4.default.createElement(ButtonStyles, { onClick: () => onMonthArrowClick("sub" /* sub */) }, /* @__PURE__ */ import_react4.default.createElement(LeftArrow_default, null)), /* @__PURE__ */ import_react4.default.createElement("div", null, /* @__PURE__ */ import_react4.default.createElement(
414
+ SelectStyles,
415
+ {
416
+ id: CALENDER_STRINGS.MONTH,
417
+ name: CALENDER_STRINGS.MONTH,
418
+ value: selectedDate.month(),
419
+ onChange: (e) => onDropdownClick(e, "month" /* month */)
420
+ },
421
+ MONTH_LIST.map((month) => /* @__PURE__ */ import_react4.default.createElement("option", { key: month.label, value: month.value }, month.label))
422
+ ), /* @__PURE__ */ import_react4.default.createElement(
423
+ SelectStyles,
424
+ {
425
+ id: CALENDER_STRINGS.YEAR,
426
+ name: CALENDER_STRINGS.YEAR,
427
+ value: selectedDate.year(),
428
+ onChange: (e) => onDropdownClick(e, "year" /* year */)
429
+ },
430
+ getYearList(
431
+ pastYearLength,
432
+ futureYearLength,
433
+ selectedDate.year()
434
+ ).map((year) => /* @__PURE__ */ import_react4.default.createElement("option", { key: year, value: year }, year))
435
+ )), /* @__PURE__ */ import_react4.default.createElement(ButtonStyles, { onClick: () => onMonthArrowClick("add" /* add */) }, /* @__PURE__ */ import_react4.default.createElement(RightArrow_default, null))),
436
+ /* @__PURE__ */ import_react4.default.createElement("table", { className: tableClassName }, /* @__PURE__ */ import_react4.default.createElement("thead", null, /* @__PURE__ */ import_react4.default.createElement("tr", null, DAY_LIST_NAME[dayType].map((day) => /* @__PURE__ */ import_react4.default.createElement("th", { key: day }, day)))), /* @__PURE__ */ import_react4.default.createElement("tbody", null, getDates()))
437
+ );
438
+ };
439
+ var Calendar_default = (0, import_react4.memo)(Calender);
440
+
441
+ // src/index.ts
442
+ var index_default = Calendar_default;
443
+ // Annotate the CommonJS export names for ESM import in node:
444
+ 0 && (module.exports = {
445
+ DAY_TYPE,
446
+ EDayType
447
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,415 @@
1
+ // src/components/Calendar.tsx
2
+ import React4, {
3
+ useCallback,
4
+ useLayoutEffect,
5
+ useMemo,
6
+ useState,
7
+ memo
8
+ } from "react";
9
+
10
+ // src/components/Calendar.type.ts
11
+ var EDayType = /* @__PURE__ */ ((EDayType2) => {
12
+ EDayType2["fullName"] = "FULL";
13
+ EDayType2["halfName"] = "HALF";
14
+ return EDayType2;
15
+ })(EDayType || {});
16
+ var defaultCalenderProps = {
17
+ dayType: "HALF" /* halfName */,
18
+ data: [],
19
+ width: 400,
20
+ height: 400,
21
+ isSelectDate: false,
22
+ pastYearLength: 5,
23
+ futureYearLength: 5
24
+ };
25
+
26
+ // src/components/Calendar.constant.ts
27
+ var DAY_LIST = {
28
+ SUNDAY: {
29
+ FULL: "Sunday",
30
+ HALF: "Sun"
31
+ },
32
+ MONDAY: {
33
+ FULL: "Monday",
34
+ HALF: "Mon"
35
+ },
36
+ TUESDAY: {
37
+ FULL: "Tuesday",
38
+ HALF: "Tue"
39
+ },
40
+ WEDNESDAY: {
41
+ FULL: "Wednesday",
42
+ HALF: "Wed"
43
+ },
44
+ THURSDAY: {
45
+ FULL: "Thursday",
46
+ HALF: "Thu"
47
+ },
48
+ FRIDAY: {
49
+ FULL: "Friday",
50
+ HALF: "Fri"
51
+ },
52
+ SATURDAY: {
53
+ FULL: "Saturday",
54
+ HALF: "Sat"
55
+ }
56
+ };
57
+ var DAY_LIST_NAME = {
58
+ FULL: [
59
+ DAY_LIST.SUNDAY.FULL,
60
+ DAY_LIST.MONDAY.FULL,
61
+ DAY_LIST.TUESDAY.FULL,
62
+ DAY_LIST.WEDNESDAY.FULL,
63
+ DAY_LIST.THURSDAY.FULL,
64
+ DAY_LIST.FRIDAY.FULL,
65
+ DAY_LIST.SATURDAY.FULL
66
+ ],
67
+ HALF: [
68
+ DAY_LIST.SUNDAY.HALF,
69
+ DAY_LIST.MONDAY.HALF,
70
+ DAY_LIST.TUESDAY.HALF,
71
+ DAY_LIST.WEDNESDAY.HALF,
72
+ DAY_LIST.THURSDAY.HALF,
73
+ DAY_LIST.FRIDAY.HALF,
74
+ DAY_LIST.SATURDAY.HALF
75
+ ]
76
+ };
77
+ var MONTHS = {
78
+ JAN: { label: "January", value: 0 },
79
+ FEB: { label: "February", value: 1 },
80
+ MAR: { label: "March", value: 2 },
81
+ APR: { label: "April", value: 3 },
82
+ MAY: { label: "May", value: 4 },
83
+ JUN: { label: "June", value: 5 },
84
+ JUL: { label: "July", value: 6 },
85
+ AUG: { label: "August", value: 7 },
86
+ SEP: { label: "September", value: 8 },
87
+ OCT: { label: "October", value: 9 },
88
+ NOV: { label: "November", value: 10 },
89
+ DEC: { label: "December", value: 11 }
90
+ };
91
+ var MONTH_LIST = Object.values(MONTHS);
92
+ var CALENDER_STRINGS = {
93
+ MONTH: "monthDropdown",
94
+ YEAR: "yearDropdown"
95
+ };
96
+ var DAY_TYPE = {
97
+ FULL_NAME: "FULL",
98
+ HALF_NAME: "HALF"
99
+ };
100
+
101
+ // src/components/Calendar.utils.ts
102
+ import moment from "moment";
103
+ var getNoOfDays = (date) => {
104
+ const noOfDates = date.daysInMonth();
105
+ return noOfDates;
106
+ };
107
+ var getMonthStartingDay = (date) => {
108
+ const monthStartingDay = Number(date.startOf("month").format("d"));
109
+ return monthStartingDay;
110
+ };
111
+ var convertToDate = (momentDate) => {
112
+ const date = momentDate.toDate();
113
+ return date;
114
+ };
115
+ var convertToMoment = (date) => {
116
+ const momentDate = moment(date);
117
+ return momentDate;
118
+ };
119
+ var getYearList = (pastLength, futureLength, selectedYear) => {
120
+ const yearLength = pastLength + futureLength;
121
+ const yearStarting = moment().year() - pastLength + 1;
122
+ const yearList = Array.from(
123
+ { length: yearLength },
124
+ (_, index) => index + yearStarting
125
+ );
126
+ if (!yearList.includes(selectedYear)) {
127
+ if (moment().year() <= selectedYear) {
128
+ yearList.push(selectedYear);
129
+ } else {
130
+ return [selectedYear, ...yearList];
131
+ }
132
+ }
133
+ return yearList;
134
+ };
135
+ var checkIsToday = (selectedDate, dates) => {
136
+ const cloneSelectedDate = selectedDate.clone();
137
+ cloneSelectedDate.date(dates);
138
+ const isToday = moment().isSame(cloneSelectedDate, "D");
139
+ return isToday;
140
+ };
141
+
142
+ // src/components/Calendar.styles.ts
143
+ import styled from "styled-components";
144
+ var CalenderStyles = styled.section`
145
+ * {
146
+ padding: 0;
147
+ margin: 0;
148
+ outline: none;
149
+ }
150
+ width: max-content;
151
+ height: max-content;
152
+ & > div {
153
+ display: flex;
154
+ justify-content: space-between;
155
+ align-items: center;
156
+ padding: 0 10px;
157
+ margin-bottom: 10px;
158
+ & > div {
159
+ display: flex;
160
+ gap: 20px;
161
+ }
162
+ }
163
+ & > table {
164
+ border-collapse: collapse;
165
+ & th,
166
+ & td {
167
+ border: 1px solid black;
168
+ text-align: center;
169
+ min-width: calc(${(props) => props.$width} / 7);
170
+ max-width: calc(${(props) => props.$width} / 7);
171
+ }
172
+ & th {
173
+ height: calc(${(props) => props.$height} / 10);
174
+ }
175
+ & td {
176
+ height: calc(${(props) => props.$height} / 7);
177
+ }
178
+ }
179
+ `;
180
+ var ButtonStyles = styled.button`
181
+ outline: none;
182
+ border: none;
183
+ background: none;
184
+ color: rgb(211, 211, 211);
185
+ border-radius: 5px;
186
+ &:hover {
187
+ background-color: rgba(211, 211, 211, 0.5);
188
+ transition: 0.2s ease-in-out;
189
+ }
190
+ `;
191
+ var SelectStyles = styled.select`
192
+ border-radius: 3px;
193
+ padding: 2px;
194
+ cursor: pointer;
195
+ `;
196
+ var Calendar_styles_default = CalenderStyles;
197
+
198
+ // src/components/DateData.tsx
199
+ import React from "react";
200
+ import styled2 from "styled-components";
201
+ import cx from "classnames";
202
+ function DateData(props) {
203
+ const {
204
+ date,
205
+ data,
206
+ className,
207
+ dataClassName,
208
+ isSelected,
209
+ isToday,
210
+ onClick,
211
+ selectedClassName,
212
+ todayClassName
213
+ } = props;
214
+ return /* @__PURE__ */ React.createElement(
215
+ DateDataStyles,
216
+ {
217
+ $isSelected: isSelected,
218
+ $isToday: isToday,
219
+ onClick: () => onClick?.(date),
220
+ className: cx(
221
+ className,
222
+ isSelected && selectedClassName,
223
+ isToday && todayClassName
224
+ )
225
+ },
226
+ /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("p", null, date), data && /* @__PURE__ */ React.createElement("div", { className: dataClassName }, data))
227
+ );
228
+ }
229
+ var DateDataStyles = styled2.td`
230
+ cursor: pointer;
231
+ & > div {
232
+ height: 100%;
233
+ width: 100%;
234
+ display: flex;
235
+ flex-direction: column;
236
+ justify-content: space-around;
237
+ & > div > * {
238
+ overflow: hidden;
239
+ text-overflow: ellipsis;
240
+ white-space: nowrap;
241
+ }
242
+ }
243
+ ${(props) => props.$isSelected ? `
244
+ background-color: #EEEEEE;
245
+ color: #737373;
246
+ font-weight: bold;
247
+ ` : ``}
248
+ ${(props) => props.$isToday ? `
249
+ color: #2E75B6;
250
+ font-size: 18px;
251
+ font-weight: bold;
252
+ ` : ``}
253
+ `;
254
+ var DateData_default = DateData;
255
+
256
+ // src/assets/LeftArrow.tsx
257
+ import React2 from "react";
258
+ function LeftArrow() {
259
+ return /* @__PURE__ */ React2.createElement("svg", { width: "40px", height: "40px", viewBox: "0 0 24.00 24.00", fill: "none", xmlns: "http://www.w3.org/2000/svg", stroke: "#707070", transform: "rotate(180)" }, /* @__PURE__ */ React2.createElement("g", { id: "SVGRepo_bgCarrier", strokeWidth: "0" }), /* @__PURE__ */ React2.createElement("g", { id: "SVGRepo_tracerCarrier", strokeLinecap: "round", strokeLinejoin: "round" }), /* @__PURE__ */ React2.createElement("g", { id: "SVGRepo_iconCarrier" }, /* @__PURE__ */ React2.createElement("path", { d: "M10 7L15 12L10 17", stroke: "#707070", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" })));
260
+ }
261
+ var LeftArrow_default = LeftArrow;
262
+
263
+ // src/assets/RightArrow.tsx
264
+ import React3 from "react";
265
+ function RightArrow() {
266
+ return /* @__PURE__ */ React3.createElement("svg", { width: "40px", height: "40px", viewBox: "0 0 24.00 24.00", fill: "none", xmlns: "http://www.w3.org/2000/svg", stroke: "#707070" }, /* @__PURE__ */ React3.createElement("g", { id: "SVGRepo_bgCarrier", strokeWidth: "0" }), /* @__PURE__ */ React3.createElement("g", { id: "SVGRepo_tracerCarrier", strokeLinecap: "round", strokeLinejoin: "round" }), /* @__PURE__ */ React3.createElement("g", { id: "SVGRepo_iconCarrier" }, /* @__PURE__ */ React3.createElement("path", { d: "M10 7L15 12L10 17", stroke: "#707070", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" })));
267
+ }
268
+ var RightArrow_default = RightArrow;
269
+
270
+ // src/components/Calendar.tsx
271
+ var Calender = (props = defaultCalenderProps) => {
272
+ const {
273
+ dayType = defaultCalenderProps.dayType,
274
+ data = defaultCalenderProps.data,
275
+ width = defaultCalenderProps.width,
276
+ height = defaultCalenderProps.height,
277
+ selectedDate: selected_date,
278
+ onDateClick,
279
+ onMonthChange,
280
+ isSelectDate = defaultCalenderProps.isSelectDate,
281
+ className,
282
+ headerClassName,
283
+ tableClassName,
284
+ tableDateClassName,
285
+ dataClassName,
286
+ selectedClassName,
287
+ todayClassName,
288
+ pastYearLength = defaultCalenderProps.pastYearLength,
289
+ futureYearLength = defaultCalenderProps.futureYearLength
290
+ } = props;
291
+ const selectedDateMoment = useMemo(
292
+ () => selected_date ? convertToMoment(selected_date) : moment(),
293
+ [selected_date]
294
+ );
295
+ const [selectedDate, setSelectedDate] = useState(selectedDateMoment);
296
+ useLayoutEffect(() => {
297
+ setSelectedDate(selectedDateMoment);
298
+ }, [selectedDateMoment]);
299
+ const getDates = useCallback(() => {
300
+ const dateComponent = [];
301
+ const noOfDays = getNoOfDays(selectedDate.clone());
302
+ const monthStartDay = getMonthStartingDay(selectedDate.clone());
303
+ const noOfRows = Math.round((noOfDays + monthStartDay) / 7 + 0.4);
304
+ let dates = 1;
305
+ const onClickDateHandler = (date) => {
306
+ const cloneSelectedDate = selectedDate.clone();
307
+ if (date !== cloneSelectedDate.date()) {
308
+ cloneSelectedDate.date(date);
309
+ setSelectedDate(cloneSelectedDate.clone());
310
+ onDateClick?.(convertToDate(cloneSelectedDate.clone()));
311
+ }
312
+ };
313
+ for (let row = 1; row <= noOfRows; row++) {
314
+ const tableRow = [];
315
+ for (let day = 1; day <= 7; day++) {
316
+ if (row === 1 && day <= monthStartDay || dates > noOfDays) {
317
+ const emptyData = /* @__PURE__ */ React4.createElement("td", { key: `empty_${day}` });
318
+ tableRow.push(emptyData);
319
+ } else {
320
+ const dateData = /* @__PURE__ */ React4.createElement(
321
+ DateData_default,
322
+ {
323
+ key: `date_${dates}`,
324
+ isSelected: isSelectDate && dates === selectedDate.date(),
325
+ isToday: checkIsToday(selectedDate, dates),
326
+ onClick: isSelectDate ? onClickDateHandler : void 0,
327
+ date: dates,
328
+ data: data[dates - 1],
329
+ className: tableDateClassName,
330
+ dataClassName,
331
+ selectedClassName,
332
+ todayClassName
333
+ }
334
+ );
335
+ dates++;
336
+ tableRow.push(dateData);
337
+ }
338
+ }
339
+ const rowData = /* @__PURE__ */ React4.createElement("tr", { key: row }, tableRow);
340
+ dateComponent.push(rowData);
341
+ }
342
+ return dateComponent;
343
+ }, [
344
+ data,
345
+ selectedDate,
346
+ dataClassName,
347
+ selectedClassName,
348
+ todayClassName,
349
+ tableDateClassName,
350
+ onDateClick,
351
+ isSelectDate
352
+ ]);
353
+ const onMonthArrowClick = (option) => {
354
+ const clonedSelectedDate = selectedDate.clone();
355
+ if (option === "add" /* add */) {
356
+ clonedSelectedDate.month(clonedSelectedDate.month() + 1);
357
+ } else if (option === "sub" /* sub */) {
358
+ clonedSelectedDate.month(clonedSelectedDate.month() - 1);
359
+ }
360
+ setSelectedDate(clonedSelectedDate);
361
+ onMonthChange?.(convertToDate(clonedSelectedDate));
362
+ };
363
+ const onDropdownClick = (event, option) => {
364
+ const value = Number(event.target.value);
365
+ const clonedSelectedDate = selectedDate.clone();
366
+ if (option === "month" /* month */) {
367
+ clonedSelectedDate.month(value);
368
+ } else if (option === "year" /* year */) {
369
+ clonedSelectedDate.year(value);
370
+ }
371
+ setSelectedDate(clonedSelectedDate);
372
+ onMonthChange?.(convertToDate(clonedSelectedDate));
373
+ };
374
+ return /* @__PURE__ */ React4.createElement(
375
+ Calendar_styles_default,
376
+ {
377
+ $width: `${width}px`,
378
+ $height: `${height}px`,
379
+ className
380
+ },
381
+ /* @__PURE__ */ React4.createElement("div", { className: headerClassName }, /* @__PURE__ */ React4.createElement(ButtonStyles, { onClick: () => onMonthArrowClick("sub" /* sub */) }, /* @__PURE__ */ React4.createElement(LeftArrow_default, null)), /* @__PURE__ */ React4.createElement("div", null, /* @__PURE__ */ React4.createElement(
382
+ SelectStyles,
383
+ {
384
+ id: CALENDER_STRINGS.MONTH,
385
+ name: CALENDER_STRINGS.MONTH,
386
+ value: selectedDate.month(),
387
+ onChange: (e) => onDropdownClick(e, "month" /* month */)
388
+ },
389
+ MONTH_LIST.map((month) => /* @__PURE__ */ React4.createElement("option", { key: month.label, value: month.value }, month.label))
390
+ ), /* @__PURE__ */ React4.createElement(
391
+ SelectStyles,
392
+ {
393
+ id: CALENDER_STRINGS.YEAR,
394
+ name: CALENDER_STRINGS.YEAR,
395
+ value: selectedDate.year(),
396
+ onChange: (e) => onDropdownClick(e, "year" /* year */)
397
+ },
398
+ getYearList(
399
+ pastYearLength,
400
+ futureYearLength,
401
+ selectedDate.year()
402
+ ).map((year) => /* @__PURE__ */ React4.createElement("option", { key: year, value: year }, year))
403
+ )), /* @__PURE__ */ React4.createElement(ButtonStyles, { onClick: () => onMonthArrowClick("add" /* add */) }, /* @__PURE__ */ React4.createElement(RightArrow_default, null))),
404
+ /* @__PURE__ */ React4.createElement("table", { className: tableClassName }, /* @__PURE__ */ React4.createElement("thead", null, /* @__PURE__ */ React4.createElement("tr", null, DAY_LIST_NAME[dayType].map((day) => /* @__PURE__ */ React4.createElement("th", { key: day }, day)))), /* @__PURE__ */ React4.createElement("tbody", null, getDates()))
405
+ );
406
+ };
407
+ var Calendar_default = memo(Calender);
408
+
409
+ // src/index.ts
410
+ var index_default = Calendar_default;
411
+ export {
412
+ DAY_TYPE,
413
+ EDayType,
414
+ index_default as default
415
+ };
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "calendar-simple",
3
+ "version": "1.0.0-beta.1",
4
+ "description": "A user-friendly calendar app for viewing, selecting, and managing dates with data management capabilities.",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.esm.js",
7
+ "types": "./dist/index.d.ts",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/Jaganath-MSJ/CalendarSimple.git"
11
+ },
12
+ "scripts": {
13
+ "build": "tsup"
14
+ },
15
+ "keywords": [
16
+ "calendar",
17
+ "simple",
18
+ "calendar-simple"
19
+ ],
20
+ "author": "jaganath-m-s",
21
+ "license": "MIT",
22
+ "dependencies": {
23
+ "classnames": "^2.5.1",
24
+ "moment": "^2.30.1",
25
+ "react-scripts": "5.0.1",
26
+ "styled-components": "^6.1.8"
27
+ },
28
+ "devDependencies": {
29
+ "@semantic-release/changelog": "^6.0.3",
30
+ "@types/node": "^16.18.76",
31
+ "@types/react": "^18.2.48",
32
+ "@types/react-dom": "^18.2.18",
33
+ "babel-loader": "^9.1.3",
34
+ "prettier": "^3.2.5",
35
+ "semantic-release": "^25.0.2",
36
+ "tsup": "^8.0.2",
37
+ "typescript": "^4.9.5",
38
+ "web-vitals": "^2.1.4"
39
+ },
40
+ "peerDependencies": {
41
+ "react": "^18.2.0",
42
+ "react-dom": "^18.2.0"
43
+ }
44
+ }