@theengineerguy/chronos-picker 1.0.3 → 1.0.5

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/README.md CHANGED
@@ -36,14 +36,14 @@ import { DateTimePicker, DateTimeValue } from '@chronos/picker';
36
36
 
37
37
  function App() {
38
38
  const [value, setValue] = useState<DateTimeValue | null>(null);
39
-
39
+
40
40
  const handleChange = (newValue: DateTimeValue) => {
41
41
  setValue(newValue);
42
42
  console.log('ISO:', newValue.iso);
43
43
  console.log('Formatted:', newValue.formatted);
44
44
  console.log('Timestamp:', newValue.timestamp);
45
45
  };
46
-
46
+
47
47
  return (
48
48
  <DateTimePicker
49
49
  value={value?.dateTime}
@@ -163,18 +163,18 @@ function BasicExample() {
163
163
  ```tsx
164
164
  function ControlledExample() {
165
165
  const [selectedDate, setSelectedDate] = useState<DateTime | null>(null);
166
-
166
+
167
167
  return (
168
168
  <div>
169
169
  <DateTimePicker
170
170
  value={selectedDate}
171
171
  onChange={(value) => setSelectedDate(value.dateTime)}
172
172
  />
173
-
173
+
174
174
  <button onClick={() => setSelectedDate(DateTime.now())}>
175
175
  Set to Now
176
176
  </button>
177
-
177
+
178
178
  <button onClick={() => setSelectedDate(null)}>
179
179
  Clear
180
180
  </button>
@@ -201,7 +201,7 @@ function ControlledExample() {
201
201
  function MultiTimezoneExample() {
202
202
  const [indiaTime, setIndiaTime] = useState<DateTimeValue | null>(null);
203
203
  const [nyTime, setNYTime] = useState<DateTimeValue | null>(null);
204
-
204
+
205
205
  const handleIndiaChange = (value: DateTimeValue) => {
206
206
  setIndiaTime(value);
207
207
  // Convert to New York time
@@ -213,7 +213,7 @@ function MultiTimezoneExample() {
213
213
  iso: converted.toISO() || '',
214
214
  });
215
215
  };
216
-
216
+
217
217
  return (
218
218
  <div>
219
219
  <div>
@@ -224,7 +224,7 @@ function MultiTimezoneExample() {
224
224
  onChange={handleIndiaChange}
225
225
  />
226
226
  </div>
227
-
227
+
228
228
  <div>
229
229
  <label>New York Time (EST/EDT)</label>
230
230
  <DateTimePicker
@@ -309,22 +309,22 @@ import { DateTime } from 'luxon';
309
309
  function AdvancedExample() {
310
310
  const handleChange = (value: DateTimeValue) => {
311
311
  const dt = value.dateTime;
312
-
312
+
313
313
  // Access Luxon DateTime methods
314
314
  console.log('Day of week:', dt.weekdayLong);
315
315
  console.log('Week number:', dt.weekNumber);
316
316
  console.log('Is DST:', dt.isInDST);
317
-
317
+
318
318
  // Format in different ways
319
319
  console.log('ISO:', dt.toISO());
320
320
  console.log('SQL:', dt.toSQL());
321
321
  console.log('Relative:', dt.toRelative());
322
-
322
+
323
323
  // Convert to other timezones
324
324
  const tokyo = dt.setZone('Asia/Tokyo');
325
325
  console.log('Tokyo time:', tokyo.toFormat('HH:mm'));
326
326
  };
327
-
327
+
328
328
  return <DateTimePicker onChange={handleChange} />;
329
329
  }
330
330
  ```
@@ -383,4 +383,4 @@ Contributions are welcome! Please feel free to submit a Pull Request.
383
383
 
384
384
  ---
385
385
 
386
- Made with ❤️ by developers, for developers
386
+ Made with ❤️ by Debmalya, for developers
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsxs as h, jsx as o } from "react/jsx-runtime";
2
- import { useMemo as j, useState as x, useEffect as Z, useRef as q, useCallback as _ } from "react";
3
- import { DateTime as D } from "luxon";
4
- const he = "Asia/Kolkata", H = [
2
+ import { useMemo as G, useState as w, useEffect as K, useRef as Q, useCallback as j } from "react";
3
+ import { DateTime as O } from "luxon";
4
+ const me = "Asia/Kolkata", X = [
5
5
  { value: "Asia/Kolkata", label: "India (IST)" },
6
6
  { value: "America/New_York", label: "Eastern Time (ET)" },
7
7
  { value: "America/Chicago", label: "Central Time (CT)" },
@@ -15,103 +15,113 @@ const he = "Asia/Kolkata", H = [
15
15
  { value: "Australia/Sydney", label: "Sydney (AEDT)" },
16
16
  { value: "UTC", label: "UTC" }
17
17
  ];
18
- function I(e, s) {
19
- return D.isDateTime(e) ? e.setZone(s) : typeof e == "string" ? D.fromISO(e, { zone: s }) : D.fromJSDate(e, { zone: s });
18
+ function R(e, r) {
19
+ return O.isDateTime(e) ? e.setZone(r) : typeof e == "string" ? O.fromISO(e, { zone: r }) : O.fromJSDate(e, { zone: r });
20
20
  }
21
- function U(e) {
22
- return D.now().setZone(e);
21
+ function J(e) {
22
+ return O.now().setZone(e);
23
23
  }
24
- function Q(e) {
25
- const r = D.now().setZone(e).offset, a = Math.floor(Math.abs(r) / 60), c = Math.abs(r) % 60;
26
- return `UTC${r >= 0 ? "+" : "-"}${a}${c > 0 ? `:${c.toString().padStart(2, "0")}` : ""}`;
24
+ function F(e) {
25
+ const a = O.now().setZone(e).offset, i = Math.floor(Math.abs(a) / 60), c = Math.abs(a) % 60;
26
+ return `UTC${a >= 0 ? "+" : "-"}${i}${c > 0 ? `:${c.toString().padStart(2, "0")}` : ""}`;
27
27
  }
28
- function me(e, s, r, a, c, b, d, f) {
29
- const v = D.fromObject(
30
- { year: e, month: s, day: 1 },
31
- { zone: r }
32
- ), M = v.startOf("week"), P = v.endOf("month").endOf("week"), z = D.now().setZone(r).startOf("day"), A = d != null && f != null, S = d == null ? void 0 : d.startOf("day"), C = f == null ? void 0 : f.endOf("day"), E = [];
33
- let n = [], l = M;
34
- for (; l <= P; ) {
35
- const y = l.month === s, T = l.hasSame(z, "day"), g = l.startOf("day");
36
- let t = !1, m = !1, i = !1, O = !1;
37
- A && S && C ? (i = g.hasSame(S, "day"), O = g.hasSame(C, "day"), m = g >= S && g <= C || i || O, t = i || O) : a && (t = l.hasSame(a, "day"));
38
- let N = !1;
39
- c && l < c.startOf("day") && (N = !0), b && l > b.endOf("day") && (N = !0), n.push({
28
+ function ue(e, r, a, i, c, N, d, p, k) {
29
+ const b = O.fromObject(
30
+ { year: e, month: r, day: 1 },
31
+ { zone: a }
32
+ ), E = b.startOf("week"), z = b.endOf("month").endOf("week"), I = O.now().setZone(a).startOf("day"), P = d != null && p != null, x = d == null ? void 0 : d.startOf("day"), D = p == null ? void 0 : p.endOf("day"), t = /* @__PURE__ */ new Map();
33
+ k && k.forEach((M) => {
34
+ let g;
35
+ O.isDateTime(M.date) ? g = M.date.setZone(a) : typeof M.date == "string" ? g = O.fromISO(M.date, { zone: a }) : g = O.fromJSDate(M.date, { zone: a }), t.set(g.toISODate() || "", { name: M.name, type: M.type || "national" });
36
+ });
37
+ const u = [];
38
+ let $ = [], l = E;
39
+ for (; l <= z; ) {
40
+ const M = l.month === r, g = l.hasSame(I, "day"), n = l.startOf("day"), f = l.toISODate() || "";
41
+ let s = !1, C = !1, T = !1, L = !1;
42
+ P && x && D ? (T = n.hasSame(x, "day"), L = n.hasSame(D, "day"), C = n >= x && n <= D || T || L, s = T || L) : i && (s = l.hasSame(i, "day"));
43
+ let v = !1;
44
+ c && l < c.startOf("day") && (v = !0), N && l > N.endOf("day") && (v = !0);
45
+ const B = t.get(f);
46
+ $.push({
40
47
  date: l,
41
- isCurrentMonth: y,
42
- isToday: T,
43
- isSelected: t,
44
- isDisabled: N,
45
- isInRange: m,
46
- isRangeStart: i,
47
- isRangeEnd: O
48
- }), n.length === 7 && (E.push(n), n = []), l = l.plus({ days: 1 });
48
+ isCurrentMonth: M,
49
+ isToday: g,
50
+ isSelected: s,
51
+ isDisabled: v,
52
+ isInRange: C,
53
+ isRangeStart: T,
54
+ isRangeEnd: L,
55
+ holiday: B ? { date: l, ...B } : void 0
56
+ }), $.length === 7 && (u.push($), $ = []), l = l.plus({ days: 1 });
49
57
  }
50
- return E;
58
+ return u;
51
59
  }
52
- function ue() {
53
- const e = D.now().startOf("week"), s = [];
54
- for (let r = 0; r < 7; r++) {
55
- const a = e.plus({ days: r });
56
- s.push(a.toFormat("ccc"));
60
+ function fe() {
61
+ const e = O.now().startOf("week"), r = [];
62
+ for (let a = 0; a < 7; a++) {
63
+ const i = e.plus({ days: a });
64
+ r.push(i.toFormat("ccc"));
57
65
  }
58
- return s;
66
+ return r;
59
67
  }
60
- function fe() {
68
+ function pe() {
61
69
  const e = [];
62
- for (let s = 1; s <= 12; s++) {
63
- const r = D.fromObject({ month: s });
64
- e.push(r.toFormat("MMMM"));
70
+ for (let r = 1; r <= 12; r++) {
71
+ const a = O.fromObject({ month: r });
72
+ e.push(a.toFormat("MMMM"));
65
73
  }
66
74
  return e;
67
75
  }
68
- const pe = ({
76
+ const ye = ({
69
77
  viewDate: e,
70
- selectedDate: s,
71
- onDateSelect: r,
72
- onViewDateChange: a,
78
+ selectedDate: r,
79
+ onDateSelect: a,
80
+ onViewDateChange: i,
73
81
  timezone: c,
74
- minDate: b,
82
+ minDate: N,
75
83
  maxDate: d,
76
- selectedStart: f,
77
- selectedEnd: v,
78
- onRangeSelect: M
84
+ selectedStart: p,
85
+ selectedEnd: k,
86
+ onRangeSelect: b,
87
+ holidays: E
79
88
  }) => {
80
- const R = M != null, P = j(() => me(
89
+ const W = b != null, z = G(() => ue(
81
90
  e.year,
82
91
  e.month,
83
92
  c,
84
- s ?? void 0,
85
- b,
93
+ r ?? void 0,
94
+ N,
86
95
  d,
87
- f ?? void 0,
88
- v ?? void 0
89
- ), [e, s, c, b, d, f, v]), z = j(() => ue(), []), A = j(() => fe(), []), S = () => {
90
- a(e.minus({ months: 1 }));
91
- }, C = () => {
92
- a(e.plus({ months: 1 }));
93
- }, E = (t) => {
94
- const m = parseInt(t.target.value, 10);
95
- a(e.set({ month: m }));
96
- }, n = (t) => {
97
- const m = parseInt(t.target.value, 10);
98
- a(e.set({ year: m }));
99
- }, l = (t, m) => {
100
- if (!m)
101
- if (R && M) {
102
- const i = t.startOf("day");
103
- if (f == null)
104
- M(t, t);
105
- else if (v != null && f.hasSame(v, "day")) {
106
- const O = f.startOf("day");
107
- i < O ? M(t, f) : M(f, t);
96
+ p ?? void 0,
97
+ k ?? void 0,
98
+ E
99
+ ), [e, r, c, N, d, p, k, E]), I = G(() => fe(), []), P = G(() => pe(), []), x = () => {
100
+ i(e.minus({ months: 1 }));
101
+ }, D = () => {
102
+ i(e.plus({ months: 1 }));
103
+ }, t = (n) => {
104
+ const f = parseInt(n.target.value, 10);
105
+ i(e.set({ month: f }));
106
+ }, u = (n) => {
107
+ const f = parseInt(n.target.value, 10);
108
+ i(e.set({ year: f }));
109
+ }, $ = (n, f) => {
110
+ if (!f)
111
+ if (W && b) {
112
+ const s = n.startOf("day");
113
+ if (p == null)
114
+ b(n, n);
115
+ else if (k != null && p.hasSame(k, "day")) {
116
+ const C = p.startOf("day");
117
+ s < C ? b(n, p) : b(p, n);
108
118
  } else
109
- M(t, t);
119
+ b(n, n);
110
120
  } else
111
- r(t);
112
- }, y = (t, m, i) => {
113
- (t.key === "Enter" || t.key === " ") && (t.preventDefault(), l(m, i));
114
- }, T = e.year, g = Array.from({ length: 21 }, (t, m) => T - 10 + m);
121
+ a(n);
122
+ }, l = (n, f, s) => {
123
+ (n.key === "Enter" || n.key === " ") && (n.preventDefault(), $(f, s));
124
+ }, M = e.year, g = Array.from({ length: 21 }, (n, f) => M - 10 + f);
115
125
  return /* @__PURE__ */ h("div", { className: "chronos-calendar", role: "region", "aria-label": "Calendar", children: [
116
126
  /* @__PURE__ */ h("div", { className: "chronos-calendar-header", children: [
117
127
  /* @__PURE__ */ o(
@@ -119,7 +129,7 @@ const pe = ({
119
129
  {
120
130
  type: "button",
121
131
  className: "chronos-nav-button",
122
- onClick: S,
132
+ onClick: x,
123
133
  "aria-label": "Previous month",
124
134
  children: "‹"
125
135
  }
@@ -130,9 +140,9 @@ const pe = ({
130
140
  {
131
141
  className: "chronos-month-select",
132
142
  value: e.month,
133
- onChange: E,
143
+ onChange: t,
134
144
  "aria-label": "Select month",
135
- children: A.map((t, m) => /* @__PURE__ */ o("option", { value: m + 1, children: t }, m))
145
+ children: P.map((n, f) => /* @__PURE__ */ o("option", { value: f + 1, children: n }, f))
136
146
  }
137
147
  ),
138
148
  /* @__PURE__ */ o(
@@ -140,9 +150,9 @@ const pe = ({
140
150
  {
141
151
  className: "chronos-year-select",
142
152
  value: e.year,
143
- onChange: n,
153
+ onChange: u,
144
154
  "aria-label": "Select year",
145
- children: g.map((t) => /* @__PURE__ */ o("option", { value: t, children: t }, t))
155
+ children: g.map((n) => /* @__PURE__ */ o("option", { value: n, children: n }, n))
146
156
  }
147
157
  )
148
158
  ] }),
@@ -151,54 +161,58 @@ const pe = ({
151
161
  {
152
162
  type: "button",
153
163
  className: "chronos-nav-button",
154
- onClick: C,
164
+ onClick: D,
155
165
  "aria-label": "Next month",
156
166
  children: "›"
157
167
  }
158
168
  )
159
169
  ] }),
160
170
  /* @__PURE__ */ h("div", { className: "chronos-calendar-grid", children: [
161
- /* @__PURE__ */ o("div", { className: "chronos-weekday-row", children: z.map((t) => /* @__PURE__ */ o("div", { className: "chronos-weekday", children: t }, t)) }),
162
- P.map((t, m) => /* @__PURE__ */ o("div", { className: "chronos-week-row", children: t.map((i, O) => /* @__PURE__ */ o(
171
+ /* @__PURE__ */ o("div", { className: "chronos-weekday-row", children: I.map((n) => /* @__PURE__ */ o("div", { className: "chronos-weekday", children: n }, n)) }),
172
+ z.map((n, f) => /* @__PURE__ */ o("div", { className: "chronos-week-row", children: n.map((s, C) => /* @__PURE__ */ h(
163
173
  "button",
164
174
  {
165
175
  type: "button",
166
- className: `chronos-day ${i.isSelected ? "selected" : ""} ${i.isToday ? "today" : ""} ${i.isCurrentMonth ? "" : "other-month"} ${i.isDisabled ? "disabled" : ""} ${i.isInRange ? "in-range" : ""} ${i.isRangeStart ? "range-start" : ""} ${i.isRangeEnd ? "range-end" : ""}`,
167
- onClick: () => l(i.date, i.isDisabled),
168
- onKeyDown: (N) => y(N, i.date, i.isDisabled),
169
- disabled: i.isDisabled,
170
- "aria-label": i.date.toFormat("MMMM d, yyyy"),
171
- "aria-selected": i.isSelected,
172
- "aria-current": i.isToday ? "date" : void 0,
173
- children: i.date.day
176
+ className: `chronos-day ${s.isSelected ? "selected" : ""} ${s.isToday ? "today" : ""} ${s.isCurrentMonth ? "" : "other-month"} ${s.isDisabled ? "disabled" : ""} ${s.isInRange ? "in-range" : ""} ${s.isRangeStart ? "range-start" : ""} ${s.isRangeEnd ? "range-end" : ""} ${s.holiday ? `holiday ${s.holiday.type}` : ""}`,
177
+ onClick: () => $(s.date, s.isDisabled),
178
+ onKeyDown: (T) => l(T, s.date, s.isDisabled),
179
+ disabled: s.isDisabled,
180
+ "aria-label": `${s.date.toFormat("MMMM d, yyyy")}${s.holiday ? `, ${s.holiday.name}` : ""}`,
181
+ "aria-selected": s.isSelected,
182
+ "aria-current": s.isToday ? "date" : void 0,
183
+ title: s.holiday ? s.holiday.name : void 0,
184
+ children: [
185
+ s.date.day,
186
+ s.holiday && /* @__PURE__ */ o("span", { className: "chronos-holiday-dot" })
187
+ ]
174
188
  },
175
- O
176
- )) }, m))
189
+ C
190
+ )) }, f))
177
191
  ] })
178
192
  ] });
179
- }, ye = ({
193
+ }, Me = ({
180
194
  value: e,
181
- onChange: s,
182
- use24Hour: r
195
+ onChange: r,
196
+ use24Hour: a
183
197
  }) => {
184
- const [a, c] = x((e == null ? void 0 : e.hour) ?? 12), [b, d] = x((e == null ? void 0 : e.minute) ?? 0), [f, v] = x(
198
+ const [i, c] = w((e == null ? void 0 : e.hour) ?? 12), [N, d] = w((e == null ? void 0 : e.minute) ?? 0), [p, k] = w(
185
199
  e && e.hour >= 12 ? "PM" : "AM"
186
200
  );
187
- Z(() => {
188
- e && (c(e.hour), d(e.minute), v(e.hour >= 12 ? "PM" : "AM"));
201
+ K(() => {
202
+ e && (c(e.hour), d(e.minute), k(e.hour >= 12 ? "PM" : "AM"));
189
203
  }, [e]);
190
- const M = (n) => {
191
- c(n);
192
- let l = n;
193
- r || (f === "PM" && n !== 12 ? l = n + 12 : f === "AM" && n === 12 && (l = 0)), s(l, b);
194
- }, R = (n) => {
195
- d(n), s(a, n);
196
- }, P = () => {
197
- const n = f === "AM" ? "PM" : "AM";
198
- v(n);
199
- let l = a;
200
- n === "PM" && a !== 12 ? l = a + 12 : n === "AM" && a === 12 ? l = 0 : n === "AM" && a > 12 && (l = a - 12), s(l, b);
201
- }, z = r ? a : a % 12 || 12, A = r ? 23 : 12, S = r ? 0 : 1, C = Array.from({ length: A - S + 1 }, (n, l) => S + l), E = Array.from({ length: 60 }, (n, l) => l);
204
+ const b = (t) => {
205
+ c(t);
206
+ let u = t;
207
+ a || (p === "PM" && t !== 12 ? u = t + 12 : p === "AM" && t === 12 && (u = 0)), r(u, N);
208
+ }, E = (t) => {
209
+ d(t), r(i, t);
210
+ }, W = () => {
211
+ const t = p === "AM" ? "PM" : "AM";
212
+ k(t);
213
+ let u = i;
214
+ t === "PM" && i !== 12 ? u = i + 12 : t === "AM" && i === 12 ? u = 0 : t === "AM" && i > 12 && (u = i - 12), r(u, N);
215
+ }, z = a ? i : i % 12 || 12, I = a ? 23 : 12, P = a ? 0 : 1, x = Array.from({ length: I - P + 1 }, (t, u) => P + u), D = Array.from({ length: 60 }, (t, u) => u);
202
216
  return /* @__PURE__ */ h("div", { className: "chronos-time-picker", role: "group", "aria-label": "Time picker", children: [
203
217
  /* @__PURE__ */ h("div", { className: "chronos-time-header", children: [
204
218
  /* @__PURE__ */ h(
@@ -227,9 +241,9 @@ const pe = ({
227
241
  id: "chronos-hour-select",
228
242
  className: "chronos-time-select",
229
243
  value: z,
230
- onChange: (n) => M(parseInt(n.target.value, 10)),
244
+ onChange: (t) => b(parseInt(t.target.value, 10)),
231
245
  "aria-label": "Select hour",
232
- children: C.map((n) => /* @__PURE__ */ o("option", { value: n, children: n.toString().padStart(2, "0") }, n))
246
+ children: x.map((t) => /* @__PURE__ */ o("option", { value: t, children: t.toString().padStart(2, "0") }, t))
233
247
  }
234
248
  )
235
249
  ] }),
@@ -241,33 +255,33 @@ const pe = ({
241
255
  {
242
256
  id: "chronos-minute-select",
243
257
  className: "chronos-time-select",
244
- value: b,
245
- onChange: (n) => R(parseInt(n.target.value, 10)),
258
+ value: N,
259
+ onChange: (t) => E(parseInt(t.target.value, 10)),
246
260
  "aria-label": "Select minute",
247
- children: E.map((n) => /* @__PURE__ */ o("option", { value: n, children: n.toString().padStart(2, "0") }, n))
261
+ children: D.map((t) => /* @__PURE__ */ o("option", { value: t, children: t.toString().padStart(2, "0") }, t))
248
262
  }
249
263
  )
250
264
  ] }),
251
- !r && /* @__PURE__ */ o(
265
+ !a && /* @__PURE__ */ o(
252
266
  "button",
253
267
  {
254
268
  type: "button",
255
269
  className: "chronos-period-toggle",
256
- onClick: P,
257
- "aria-label": `Switch to ${f === "AM" ? "PM" : "AM"}`,
258
- children: f
270
+ onClick: W,
271
+ "aria-label": `Switch to ${p === "AM" ? "PM" : "AM"}`,
272
+ children: p
259
273
  }
260
274
  )
261
275
  ] })
262
276
  ] });
263
- }, Me = ({
277
+ }, be = ({
264
278
  value: e,
265
- onChange: s
279
+ onChange: r
266
280
  }) => {
267
- const [r, a] = x(!1), c = H.find((d) => d.value === e) || {
281
+ const [a, i] = w(!1), c = X.find((d) => d.value === e) || {
268
282
  label: e
269
- }, b = (d) => {
270
- s(d), a(!1);
283
+ }, N = (d) => {
284
+ r(d), i(!1);
271
285
  };
272
286
  return /* @__PURE__ */ h("div", { className: "chronos-timezone-selector", children: [
273
287
  /* @__PURE__ */ h("div", { className: "chronos-timezone-header", children: [
@@ -294,16 +308,16 @@ const pe = ({
294
308
  {
295
309
  type: "button",
296
310
  className: "chronos-timezone-button",
297
- onClick: () => a(!r),
298
- "aria-expanded": r,
311
+ onClick: () => i(!a),
312
+ "aria-expanded": a,
299
313
  "aria-label": "Select timezone",
300
314
  children: [
301
315
  /* @__PURE__ */ o("span", { className: "chronos-timezone-label", children: c.label }),
302
- /* @__PURE__ */ o("span", { className: "chronos-timezone-offset", children: Q(e) }),
316
+ /* @__PURE__ */ o("span", { className: "chronos-timezone-offset", children: F(e) }),
303
317
  /* @__PURE__ */ o(
304
318
  "svg",
305
319
  {
306
- className: `chronos-chevron ${r ? "expanded" : ""}`,
320
+ className: `chronos-chevron ${a ? "expanded" : ""}`,
307
321
  xmlns: "http://www.w3.org/2000/svg",
308
322
  viewBox: "0 0 24 24",
309
323
  fill: "none",
@@ -315,148 +329,149 @@ const pe = ({
315
329
  ]
316
330
  }
317
331
  ),
318
- r && /* @__PURE__ */ o("div", { className: "chronos-timezone-list", role: "listbox", children: H.map((d) => /* @__PURE__ */ h(
332
+ a && /* @__PURE__ */ o("div", { className: "chronos-timezone-list", role: "listbox", children: X.map((d) => /* @__PURE__ */ h(
319
333
  "button",
320
334
  {
321
335
  type: "button",
322
336
  className: `chronos-timezone-option ${d.value === e ? "selected" : ""}`,
323
- onClick: () => b(d.value),
337
+ onClick: () => N(d.value),
324
338
  role: "option",
325
339
  "aria-selected": d.value === e,
326
340
  children: [
327
341
  /* @__PURE__ */ o("span", { className: "chronos-timezone-option-label", children: d.label }),
328
- /* @__PURE__ */ o("span", { className: "chronos-timezone-option-offset", children: Q(d.value) })
342
+ /* @__PURE__ */ o("span", { className: "chronos-timezone-option-offset", children: F(d.value) })
329
343
  ]
330
344
  },
331
345
  d.value
332
346
  )) })
333
347
  ] });
334
348
  };
335
- function X(e, s, r) {
349
+ function V(e, r, a) {
336
350
  return {
337
351
  iso: e.toISO() || "",
338
- formatted: e.toFormat(`${s} ${r}`),
352
+ formatted: e.toFormat(`${r} ${a}`),
339
353
  timestamp: e.toMillis(),
340
354
  dateTime: e
341
355
  };
342
356
  }
343
- const ke = ({
357
+ const Te = ({
344
358
  value: e,
345
- onChange: s,
346
- timezone: r = he,
347
- dateFormat: a = "DD",
359
+ onChange: r,
360
+ timezone: a = me,
361
+ dateFormat: i = "DD",
348
362
  timeFormat: c = "HH:mm",
349
- minDate: b,
363
+ minDate: N,
350
364
  maxDate: d,
351
- placeholder: f = "Select date and time",
352
- disabled: v = !1,
353
- showTime: M = !0,
354
- use24Hour: R = !0,
355
- className: P = "",
365
+ placeholder: p = "Select date and time",
366
+ disabled: k = !1,
367
+ showTime: b = !0,
368
+ use24Hour: E = !0,
369
+ className: W = "",
356
370
  ariaLabel: z = "Date and time picker",
357
- showTimezoneSelector: A = !1,
358
- theme: S = "light",
359
- orientation: C = "portrait",
360
- selectionMode: E = "single",
361
- rangeValue: n,
362
- onRangeChange: l
371
+ showTimezoneSelector: I = !1,
372
+ theme: P = "light",
373
+ orientation: x = "portrait",
374
+ selectionMode: D = "single",
375
+ rangeValue: t,
376
+ onRangeChange: u,
377
+ holidays: $
363
378
  }) => {
364
- const y = E === "range", [T, g] = x(!1), [t, m] = x(() => !y && e ? I(e, r) : null), [i, O] = x(() => y && (n != null && n.start) ? I(n.start, r) : null), [N, Y] = x(() => y && (n != null && n.end) ? I(n.end, r) : null), [k, F] = x(r), [V, W] = x(() => t || i || N || U(r)), K = q(null), G = q(null);
365
- Z(() => {
366
- !y && e && m(I(e, k));
367
- }, [e, k, y]), Z(() => {
368
- y && (n == null ? void 0 : n.start) != null && (n == null ? void 0 : n.end) != null && (O(I(n.start, k)), Y(I(n.end, k)));
369
- }, [y, n, k]), Z(() => {
370
- const p = (u) => {
371
- K.current && !K.current.contains(u.target) && g(!1);
379
+ const l = D === "range", [M, g] = w(!1), [n, f] = w(() => !l && e ? R(e, a) : null), [s, C] = w(() => l && (t != null && t.start) ? R(t.start, a) : null), [T, L] = w(() => l && (t != null && t.end) ? R(t.end, a) : null), [v, B] = w(a), [ee, _] = w(() => n || s || T || J(a)), U = Q(null), q = Q(null);
380
+ K(() => {
381
+ !l && e && f(R(e, v));
382
+ }, [e, v, l]), K(() => {
383
+ l && (t == null ? void 0 : t.start) != null && (t == null ? void 0 : t.end) != null && (C(R(t.start, v)), L(R(t.end, v)));
384
+ }, [l, t, v]), K(() => {
385
+ const y = (m) => {
386
+ U.current && !U.current.contains(m.target) && g(!1);
372
387
  };
373
- if (T)
374
- return document.addEventListener("mousedown", p), () => document.removeEventListener("mousedown", p);
375
- }, [T]), Z(() => {
376
- const p = (u) => {
377
- var w;
378
- u.key === "Escape" && T && (g(!1), (w = G.current) == null || w.focus());
388
+ if (M)
389
+ return document.addEventListener("mousedown", y), () => document.removeEventListener("mousedown", y);
390
+ }, [M]), K(() => {
391
+ const y = (m) => {
392
+ var S;
393
+ m.key === "Escape" && M && (g(!1), (S = q.current) == null || S.focus());
379
394
  };
380
- return document.addEventListener("keydown", p), () => document.removeEventListener("keydown", p);
381
- }, [T]);
382
- const ee = _((p) => {
383
- let u = p;
384
- if (t && (u = p.set({
385
- hour: t.hour,
386
- minute: t.minute,
387
- second: t.second
388
- })), m(u), W(u), M || g(!1), s) {
389
- const w = {
390
- iso: u.toISO() || "",
391
- formatted: u.toFormat(`${a} ${c}`),
392
- timestamp: u.toMillis(),
393
- dateTime: u
395
+ return document.addEventListener("keydown", y), () => document.removeEventListener("keydown", y);
396
+ }, [M]);
397
+ const te = j((y) => {
398
+ let m = y;
399
+ if (n && (m = y.set({
400
+ hour: n.hour,
401
+ minute: n.minute,
402
+ second: n.second
403
+ })), f(m), _(m), b || g(!1), r) {
404
+ const S = {
405
+ iso: m.toISO() || "",
406
+ formatted: m.toFormat(`${i} ${c}`),
407
+ timestamp: m.toMillis(),
408
+ dateTime: m
394
409
  };
395
- s(w);
410
+ r(S);
396
411
  }
397
- }, [t, M, s, a, c]), ne = _((p, u) => {
398
- const $ = (t || U(k)).set({ hour: p, minute: u, second: 0 });
399
- if (m($), s) {
400
- const L = {
401
- iso: $.toISO() || "",
402
- formatted: $.toFormat(`${a} ${c}`),
403
- timestamp: $.toMillis(),
404
- dateTime: $
412
+ }, [n, b, r, i, c]), ne = j((y, m) => {
413
+ const A = (n || J(v)).set({ hour: y, minute: m, second: 0 });
414
+ if (f(A), r) {
415
+ const Z = {
416
+ iso: A.toISO() || "",
417
+ formatted: A.toFormat(`${i} ${c}`),
418
+ timestamp: A.toMillis(),
419
+ dateTime: A
405
420
  };
406
- s(L);
421
+ r(Z);
407
422
  }
408
- }, [t, k, s, a, c]), te = _((p, u) => {
409
- const w = p.startOf("day"), $ = u.startOf("day"), [L, B] = w <= $ ? [w, $] : [$, w];
410
- if (O(L), Y(B), W(L), l) {
411
- const le = X(L, a, c), ce = X(B, a, c), de = Math.max(0, Math.ceil(B.diff(L, "days").days));
412
- l({ start: le, end: ce, nights: de });
423
+ }, [n, v, r, i, c]), oe = j((y, m) => {
424
+ const S = y.startOf("day"), A = m.startOf("day"), [Z, Y] = S <= A ? [S, A] : [A, S];
425
+ if (C(Z), L(Y), _(Z), u) {
426
+ const ce = V(Z, i, c), de = V(Y, i, c), he = Math.max(0, Math.ceil(Y.diff(Z, "days").days));
427
+ u({ start: ce, end: de, nights: he });
413
428
  }
414
- }, [l, a, c]), oe = _((p) => {
415
- if (F(p), t) {
416
- const u = t.setZone(p);
417
- if (m(u), W(u), s) {
418
- const w = {
419
- iso: u.toISO() || "",
420
- formatted: u.toFormat(`${a} ${c}`),
421
- timestamp: u.toMillis(),
422
- dateTime: u
429
+ }, [u, i, c]), se = j((y) => {
430
+ if (B(y), n) {
431
+ const m = n.setZone(y);
432
+ if (f(m), _(m), r) {
433
+ const S = {
434
+ iso: m.toISO() || "",
435
+ formatted: m.toFormat(`${i} ${c}`),
436
+ timestamp: m.toMillis(),
437
+ dateTime: m
423
438
  };
424
- s(w);
439
+ r(S);
425
440
  }
426
441
  } else
427
- W(U(p));
428
- }, [t, s, a, c]), J = () => {
429
- v || g(!T);
430
- }, se = (p) => {
431
- (p.key === "Enter" || p.key === " ") && (p.preventDefault(), J());
432
- }, ae = y ? i && N ? `${i.toFormat("d MMM yyyy")} – ${N.toFormat("d MMM yyyy")}` : "" : t ? t.toFormat(`${a} ${M ? c : ""}`) : "", re = b ? I(b, k) : void 0, ie = d ? I(d, k) : void 0;
442
+ _(J(y));
443
+ }, [n, r, i, c]), H = () => {
444
+ k || g(!M);
445
+ }, ae = (y) => {
446
+ (y.key === "Enter" || y.key === " ") && (y.preventDefault(), H());
447
+ }, re = l ? s && T ? `${s.toFormat("d MMM yyyy")} – ${T.toFormat("d MMM yyyy")}` : "" : n ? n.toFormat(`${i} ${b ? c : ""}`) : "", ie = N ? R(N, v) : void 0, le = d ? R(d, v) : void 0;
433
448
  return /* @__PURE__ */ h(
434
449
  "div",
435
450
  {
436
- ref: K,
437
- className: `chronos-picker ${P}`,
438
- "data-disabled": v,
439
- "data-theme": S,
451
+ ref: U,
452
+ className: `chronos-picker ${W}`,
453
+ "data-disabled": k,
454
+ "data-theme": P,
440
455
  children: [
441
456
  /* @__PURE__ */ h(
442
457
  "div",
443
458
  {
444
459
  className: "chronos-input-wrapper",
445
- onClick: J,
460
+ onClick: H,
446
461
  children: [
447
462
  /* @__PURE__ */ o(
448
463
  "input",
449
464
  {
450
- ref: G,
465
+ ref: q,
451
466
  type: "text",
452
467
  className: "chronos-input",
453
- value: ae,
454
- placeholder: f,
468
+ value: re,
469
+ placeholder: p,
455
470
  readOnly: !0,
456
- disabled: v,
457
- onKeyDown: se,
471
+ disabled: k,
472
+ onKeyDown: ae,
458
473
  "aria-label": z,
459
- "aria-expanded": T,
474
+ "aria-expanded": M,
460
475
  "aria-haspopup": "dialog",
461
476
  role: "combobox"
462
477
  }
@@ -481,56 +496,57 @@ const ke = ({
481
496
  ]
482
497
  }
483
498
  ),
484
- T && /* @__PURE__ */ o(
499
+ M && /* @__PURE__ */ o(
485
500
  "div",
486
501
  {
487
502
  className: "chronos-dropdown",
488
- "data-orientation": C,
489
- "data-range-mode": y,
503
+ "data-orientation": x,
504
+ "data-range-mode": l,
490
505
  role: "dialog",
491
506
  "aria-label": "Date and time picker dialog",
492
507
  children: /* @__PURE__ */ h("div", { className: "chronos-dropdown-content", children: [
493
- y && i && N && /* @__PURE__ */ h("div", { className: "chronos-range-summary", children: [
508
+ l && s && T && /* @__PURE__ */ h("div", { className: "chronos-range-summary", children: [
494
509
  /* @__PURE__ */ h("div", { className: "chronos-range-nights", children: [
495
- Math.max(0, Math.ceil(N.diff(i, "days").days)),
510
+ Math.max(0, Math.ceil(T.diff(s, "days").days)),
496
511
  " nights"
497
512
  ] }),
498
513
  /* @__PURE__ */ h("div", { className: "chronos-range-dates", children: [
499
- i.toFormat("d MMM yyyy"),
514
+ s.toFormat("d MMM yyyy"),
500
515
  " – ",
501
- N.toFormat("d MMM yyyy")
516
+ T.toFormat("d MMM yyyy")
502
517
  ] })
503
518
  ] }),
504
519
  /* @__PURE__ */ o(
505
- pe,
520
+ ye,
506
521
  {
507
- viewDate: V,
508
- selectedDate: y ? null : t,
509
- onDateSelect: ee,
510
- onViewDateChange: W,
511
- timezone: k,
512
- minDate: re,
513
- maxDate: ie,
514
- selectedStart: y ? i : void 0,
515
- selectedEnd: y ? N : void 0,
516
- onRangeSelect: y ? te : void 0
522
+ viewDate: ee,
523
+ selectedDate: l ? null : n,
524
+ onDateSelect: te,
525
+ onViewDateChange: _,
526
+ timezone: v,
527
+ minDate: ie,
528
+ maxDate: le,
529
+ selectedStart: l ? s : void 0,
530
+ selectedEnd: l ? T : void 0,
531
+ onRangeSelect: l ? oe : void 0,
532
+ holidays: $
517
533
  }
518
534
  ),
519
- !y && (M || A) && /* @__PURE__ */ h("div", { className: "chronos-sidebar", children: [
520
- M && /* @__PURE__ */ o(
521
- ye,
535
+ !l && (b || I) && /* @__PURE__ */ h("div", { className: "chronos-sidebar", children: [
536
+ b && /* @__PURE__ */ o(
537
+ Me,
522
538
  {
523
- value: t,
539
+ value: n,
524
540
  onChange: ne,
525
- use24Hour: R,
526
- timezone: k
541
+ use24Hour: E,
542
+ timezone: v
527
543
  }
528
544
  ),
529
- A && /* @__PURE__ */ o(
530
- Me,
545
+ I && /* @__PURE__ */ o(
546
+ be,
531
547
  {
532
- value: k,
533
- onChange: oe
548
+ value: v,
549
+ onChange: se
534
550
  }
535
551
  )
536
552
  ] })
@@ -542,9 +558,9 @@ const ke = ({
542
558
  );
543
559
  };
544
560
  export {
545
- H as COMMON_TIMEZONES,
546
- he as DEFAULT_TIMEZONE,
547
- ke as DateTimePicker,
548
- I as convertToTimezone,
549
- U as nowInTimezone
561
+ X as COMMON_TIMEZONES,
562
+ me as DEFAULT_TIMEZONE,
563
+ Te as DateTimePicker,
564
+ R as convertToTimezone,
565
+ J as nowInTimezone
550
566
  };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- (function(v,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react"),require("luxon")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","luxon"],e):(v=typeof globalThis<"u"?globalThis:v||self,e(v.ChronosPicker={},v.jsxRuntime,v.React,v.luxon))})(this,function(v,e,i,C){"use strict";const U="Asia/Kolkata",W=[{value:"Asia/Kolkata",label:"India (IST)"},{value:"America/New_York",label:"Eastern Time (ET)"},{value:"America/Chicago",label:"Central Time (CT)"},{value:"America/Denver",label:"Mountain Time (MT)"},{value:"America/Los_Angeles",label:"Pacific Time (PT)"},{value:"Europe/London",label:"London (GMT/BST)"},{value:"Europe/Paris",label:"Central Europe (CET)"},{value:"Asia/Dubai",label:"Dubai (GST)"},{value:"Asia/Singapore",label:"Singapore (SGT)"},{value:"Asia/Tokyo",label:"Tokyo (JST)"},{value:"Australia/Sydney",label:"Sydney (AEDT)"},{value:"UTC",label:"UTC"}];function E(s,t){return C.DateTime.isDateTime(s)?s.setZone(t):typeof s=="string"?C.DateTime.fromISO(s,{zone:t}):C.DateTime.fromJSDate(s,{zone:t})}function j(s){return C.DateTime.now().setZone(s)}function Y(s){const r=C.DateTime.now().setZone(s).offset,a=Math.floor(Math.abs(r)/60),d=Math.abs(r)%60;return`UTC${r>=0?"+":"-"}${a}${d>0?`:${d.toString().padStart(2,"0")}`:""}`}function Q(s,t,r,a,d,b,h,p){const T=C.DateTime.fromObject({year:s,month:t,day:1},{zone:r}),M=T.startOf("week"),P=T.endOf("month").endOf("week"),z=C.DateTime.now().setZone(r).startOf("day"),A=h!=null&&p!=null,D=h==null?void 0:h.startOf("day"),x=p==null?void 0:p.endOf("day"),I=[];let o=[],c=M;for(;c<=P;){const y=c.month===t,S=c.hasSame(z,"day"),g=c.startOf("day");let n=!1,f=!1,l=!1,O=!1;A&&D&&x?(l=g.hasSame(D,"day"),O=g.hasSame(x,"day"),f=g>=D&&g<=x||l||O,n=l||O):a&&(n=c.hasSame(a,"day"));let N=!1;d&&c<d.startOf("day")&&(N=!0),b&&c>b.endOf("day")&&(N=!0),o.push({date:c,isCurrentMonth:y,isToday:S,isSelected:n,isDisabled:N,isInRange:f,isRangeStart:l,isRangeEnd:O}),o.length===7&&(I.push(o),o=[]),c=c.plus({days:1})}return I}function X(){const s=C.DateTime.now().startOf("week"),t=[];for(let r=0;r<7;r++){const a=s.plus({days:r});t.push(a.toFormat("ccc"))}return t}function F(){const s=[];for(let t=1;t<=12;t++){const r=C.DateTime.fromObject({month:t});s.push(r.toFormat("MMMM"))}return s}const V=({viewDate:s,selectedDate:t,onDateSelect:r,onViewDateChange:a,timezone:d,minDate:b,maxDate:h,selectedStart:p,selectedEnd:T,onRangeSelect:M})=>{const L=M!=null,P=i.useMemo(()=>Q(s.year,s.month,d,t??void 0,b,h,p??void 0,T??void 0),[s,t,d,b,h,p,T]),z=i.useMemo(()=>X(),[]),A=i.useMemo(()=>F(),[]),D=()=>{a(s.minus({months:1}))},x=()=>{a(s.plus({months:1}))},I=n=>{const f=parseInt(n.target.value,10);a(s.set({month:f}))},o=n=>{const f=parseInt(n.target.value,10);a(s.set({year:f}))},c=(n,f)=>{if(!f)if(L&&M){const l=n.startOf("day");if(p==null)M(n,n);else if(T!=null&&p.hasSame(T,"day")){const O=p.startOf("day");l<O?M(n,p):M(p,n)}else M(n,n)}else r(n)},y=(n,f,l)=>{(n.key==="Enter"||n.key===" ")&&(n.preventDefault(),c(f,l))},S=s.year,g=Array.from({length:21},(n,f)=>S-10+f);return e.jsxs("div",{className:"chronos-calendar",role:"region","aria-label":"Calendar",children:[e.jsxs("div",{className:"chronos-calendar-header",children:[e.jsx("button",{type:"button",className:"chronos-nav-button",onClick:D,"aria-label":"Previous month",children:"‹"}),e.jsxs("div",{className:"chronos-month-year-selectors",children:[e.jsx("select",{className:"chronos-month-select",value:s.month,onChange:I,"aria-label":"Select month",children:A.map((n,f)=>e.jsx("option",{value:f+1,children:n},f))}),e.jsx("select",{className:"chronos-year-select",value:s.year,onChange:o,"aria-label":"Select year",children:g.map(n=>e.jsx("option",{value:n,children:n},n))})]}),e.jsx("button",{type:"button",className:"chronos-nav-button",onClick:x,"aria-label":"Next month",children:"›"})]}),e.jsxs("div",{className:"chronos-calendar-grid",children:[e.jsx("div",{className:"chronos-weekday-row",children:z.map(n=>e.jsx("div",{className:"chronos-weekday",children:n},n))}),P.map((n,f)=>e.jsx("div",{className:"chronos-week-row",children:n.map((l,O)=>e.jsx("button",{type:"button",className:`chronos-day ${l.isSelected?"selected":""} ${l.isToday?"today":""} ${l.isCurrentMonth?"":"other-month"} ${l.isDisabled?"disabled":""} ${l.isInRange?"in-range":""} ${l.isRangeStart?"range-start":""} ${l.isRangeEnd?"range-end":""}`,onClick:()=>c(l.date,l.isDisabled),onKeyDown:N=>y(N,l.date,l.isDisabled),disabled:l.isDisabled,"aria-label":l.date.toFormat("MMMM d, yyyy"),"aria-selected":l.isSelected,"aria-current":l.isToday?"date":void 0,children:l.date.day},O))},f))]})]})},R=({value:s,onChange:t,use24Hour:r})=>{const[a,d]=i.useState((s==null?void 0:s.hour)??12),[b,h]=i.useState((s==null?void 0:s.minute)??0),[p,T]=i.useState(s&&s.hour>=12?"PM":"AM");i.useEffect(()=>{s&&(d(s.hour),h(s.minute),T(s.hour>=12?"PM":"AM"))},[s]);const M=o=>{d(o);let c=o;r||(p==="PM"&&o!==12?c=o+12:p==="AM"&&o===12&&(c=0)),t(c,b)},L=o=>{h(o),t(a,o)},P=()=>{const o=p==="AM"?"PM":"AM";T(o);let c=a;o==="PM"&&a!==12?c=a+12:o==="AM"&&a===12?c=0:o==="AM"&&a>12&&(c=a-12),t(c,b)},z=r?a:a%12||12,A=r?23:12,D=r?0:1,x=Array.from({length:A-D+1},(o,c)=>D+c),I=Array.from({length:60},(o,c)=>c);return e.jsxs("div",{className:"chronos-time-picker",role:"group","aria-label":"Time picker",children:[e.jsxs("div",{className:"chronos-time-header",children:[e.jsxs("svg",{className:"chronos-clock-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("polyline",{points:"12 6 12 12 16 14"})]}),e.jsx("span",{children:"Time"})]}),e.jsxs("div",{className:"chronos-time-controls",children:[e.jsxs("div",{className:"chronos-time-input-group",children:[e.jsx("label",{htmlFor:"chronos-hour-select",className:"chronos-time-label",children:"Hour"}),e.jsx("select",{id:"chronos-hour-select",className:"chronos-time-select",value:z,onChange:o=>M(parseInt(o.target.value,10)),"aria-label":"Select hour",children:x.map(o=>e.jsx("option",{value:o,children:o.toString().padStart(2,"0")},o))})]}),e.jsx("span",{className:"chronos-time-separator",children:":"}),e.jsxs("div",{className:"chronos-time-input-group",children:[e.jsx("label",{htmlFor:"chronos-minute-select",className:"chronos-time-label",children:"Minute"}),e.jsx("select",{id:"chronos-minute-select",className:"chronos-time-select",value:b,onChange:o=>L(parseInt(o.target.value,10)),"aria-label":"Select minute",children:I.map(o=>e.jsx("option",{value:o,children:o.toString().padStart(2,"0")},o))})]}),!r&&e.jsx("button",{type:"button",className:"chronos-period-toggle",onClick:P,"aria-label":`Switch to ${p==="AM"?"PM":"AM"}`,children:p})]})]})},ee=({value:s,onChange:t})=>{const[r,a]=i.useState(!1),d=W.find(h=>h.value===s)||{label:s},b=h=>{t(h),a(!1)};return e.jsxs("div",{className:"chronos-timezone-selector",children:[e.jsxs("div",{className:"chronos-timezone-header",children:[e.jsxs("svg",{className:"chronos-globe-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]}),e.jsx("span",{children:"Timezone"})]}),e.jsxs("button",{type:"button",className:"chronos-timezone-button",onClick:()=>a(!r),"aria-expanded":r,"aria-label":"Select timezone",children:[e.jsx("span",{className:"chronos-timezone-label",children:d.label}),e.jsx("span",{className:"chronos-timezone-offset",children:Y(s)}),e.jsx("svg",{className:`chronos-chevron ${r?"expanded":""}`,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),r&&e.jsx("div",{className:"chronos-timezone-list",role:"listbox",children:W.map(h=>e.jsxs("button",{type:"button",className:`chronos-timezone-option ${h.value===s?"selected":""}`,onClick:()=>b(h.value),role:"option","aria-selected":h.value===s,children:[e.jsx("span",{className:"chronos-timezone-option-label",children:h.label}),e.jsx("span",{className:"chronos-timezone-option-offset",children:Y(h.value)})]},h.value))})]})};function q(s,t,r){return{iso:s.toISO()||"",formatted:s.toFormat(`${t} ${r}`),timestamp:s.toMillis(),dateTime:s}}const se=({value:s,onChange:t,timezone:r=U,dateFormat:a="DD",timeFormat:d="HH:mm",minDate:b,maxDate:h,placeholder:p="Select date and time",disabled:T=!1,showTime:M=!0,use24Hour:L=!0,className:P="",ariaLabel:z="Date and time picker",showTimezoneSelector:A=!1,theme:D="light",orientation:x="portrait",selectionMode:I="single",rangeValue:o,onRangeChange:c})=>{const y=I==="range",[S,g]=i.useState(!1),[n,f]=i.useState(()=>!y&&s?E(s,r):null),[l,O]=i.useState(()=>y&&(o!=null&&o.start)?E(o.start,r):null),[N,G]=i.useState(()=>y&&(o!=null&&o.end)?E(o.end,r):null),[k,oe]=i.useState(r),[ne,_]=i.useState(()=>n||l||N||j(r)),K=i.useRef(null),J=i.useRef(null);i.useEffect(()=>{!y&&s&&f(E(s,k))},[s,k,y]),i.useEffect(()=>{y&&(o==null?void 0:o.start)!=null&&(o==null?void 0:o.end)!=null&&(O(E(o.start,k)),G(E(o.end,k)))},[y,o,k]),i.useEffect(()=>{const u=m=>{K.current&&!K.current.contains(m.target)&&g(!1)};if(S)return document.addEventListener("mousedown",u),()=>document.removeEventListener("mousedown",u)},[S]),i.useEffect(()=>{const u=m=>{var w;m.key==="Escape"&&S&&(g(!1),(w=J.current)==null||w.focus())};return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[S]);const te=i.useCallback(u=>{let m=u;if(n&&(m=u.set({hour:n.hour,minute:n.minute,second:n.second})),f(m),_(m),M||g(!1),t){const w={iso:m.toISO()||"",formatted:m.toFormat(`${a} ${d}`),timestamp:m.toMillis(),dateTime:m};t(w)}},[n,M,t,a,d]),ae=i.useCallback((u,m)=>{const $=(n||j(k)).set({hour:u,minute:m,second:0});if(f($),t){const Z={iso:$.toISO()||"",formatted:$.toFormat(`${a} ${d}`),timestamp:$.toMillis(),dateTime:$};t(Z)}},[n,k,t,a,d]),re=i.useCallback((u,m)=>{const w=u.startOf("day"),$=m.startOf("day"),[Z,B]=w<=$?[w,$]:[$,w];if(O(Z),G(B),_(Z),c){const fe=q(Z,a,d),me=q(B,a,d),pe=Math.max(0,Math.ceil(B.diff(Z,"days").days));c({start:fe,end:me,nights:pe})}},[c,a,d]),le=i.useCallback(u=>{if(oe(u),n){const m=n.setZone(u);if(f(m),_(m),t){const w={iso:m.toISO()||"",formatted:m.toFormat(`${a} ${d}`),timestamp:m.toMillis(),dateTime:m};t(w)}}else _(j(u))},[n,t,a,d]),H=()=>{T||g(!S)},ce=u=>{(u.key==="Enter"||u.key===" ")&&(u.preventDefault(),H())},ie=y?l&&N?`${l.toFormat("d MMM yyyy")} – ${N.toFormat("d MMM yyyy")}`:"":n?n.toFormat(`${a} ${M?d:""}`):"",de=b?E(b,k):void 0,he=h?E(h,k):void 0;return e.jsxs("div",{ref:K,className:`chronos-picker ${P}`,"data-disabled":T,"data-theme":D,children:[e.jsxs("div",{className:"chronos-input-wrapper",onClick:H,children:[e.jsx("input",{ref:J,type:"text",className:"chronos-input",value:ie,placeholder:p,readOnly:!0,disabled:T,onKeyDown:ce,"aria-label":z,"aria-expanded":S,"aria-haspopup":"dialog",role:"combobox"}),e.jsxs("svg",{className:"chronos-calendar-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),e.jsx("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),e.jsx("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),e.jsx("line",{x1:"3",y1:"10",x2:"21",y2:"10"})]})]}),S&&e.jsx("div",{className:"chronos-dropdown","data-orientation":x,"data-range-mode":y,role:"dialog","aria-label":"Date and time picker dialog",children:e.jsxs("div",{className:"chronos-dropdown-content",children:[y&&l&&N&&e.jsxs("div",{className:"chronos-range-summary",children:[e.jsxs("div",{className:"chronos-range-nights",children:[Math.max(0,Math.ceil(N.diff(l,"days").days))," nights"]}),e.jsxs("div",{className:"chronos-range-dates",children:[l.toFormat("d MMM yyyy")," – ",N.toFormat("d MMM yyyy")]})]}),e.jsx(V,{viewDate:ne,selectedDate:y?null:n,onDateSelect:te,onViewDateChange:_,timezone:k,minDate:de,maxDate:he,selectedStart:y?l:void 0,selectedEnd:y?N:void 0,onRangeSelect:y?re:void 0}),!y&&(M||A)&&e.jsxs("div",{className:"chronos-sidebar",children:[M&&e.jsx(R,{value:n,onChange:ae,use24Hour:L,timezone:k}),A&&e.jsx(ee,{value:k,onChange:le})]})]})})]})};v.COMMON_TIMEZONES=W,v.DEFAULT_TIMEZONE=U,v.DateTimePicker=se,v.convertToTimezone=E,v.nowInTimezone=j,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
1
+ (function(S,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react"),require("luxon")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","luxon"],e):(S=typeof globalThis<"u"?globalThis:S||self,e(S.ChronosPicker={},S.jsxRuntime,S.React,S.luxon))})(this,function(S,e,c,D){"use strict";const G="Asia/Kolkata",U=[{value:"Asia/Kolkata",label:"India (IST)"},{value:"America/New_York",label:"Eastern Time (ET)"},{value:"America/Chicago",label:"Central Time (CT)"},{value:"America/Denver",label:"Mountain Time (MT)"},{value:"America/Los_Angeles",label:"Pacific Time (PT)"},{value:"Europe/London",label:"London (GMT/BST)"},{value:"Europe/Paris",label:"Central Europe (CET)"},{value:"Asia/Dubai",label:"Dubai (GST)"},{value:"Asia/Singapore",label:"Singapore (SGT)"},{value:"Asia/Tokyo",label:"Tokyo (JST)"},{value:"Australia/Sydney",label:"Sydney (AEDT)"},{value:"UTC",label:"UTC"}];function w(s,r){return D.DateTime.isDateTime(s)?s.setZone(r):typeof s=="string"?D.DateTime.fromISO(s,{zone:r}):D.DateTime.fromJSDate(s,{zone:r})}function K(s){return D.DateTime.now().setZone(s)}function J(s){const a=D.DateTime.now().setZone(s).offset,l=Math.floor(Math.abs(a)/60),d=Math.abs(a)%60;return`UTC${a>=0?"+":"-"}${l}${d>0?`:${d.toString().padStart(2,"0")}`:""}`}function F(s,r,a,l,d,v,h,y,N){const b=D.DateTime.fromObject({year:s,month:r,day:1},{zone:a}),I=b.startOf("week"),Z=b.endOf("month").endOf("week"),P=D.DateTime.now().setZone(a).startOf("day"),z=h!=null&&y!=null,C=h==null?void 0:h.startOf("day"),$=y==null?void 0:y.endOf("day"),o=new Map;N&&N.forEach(M=>{let g;D.DateTime.isDateTime(M.date)?g=M.date.setZone(a):typeof M.date=="string"?g=D.DateTime.fromISO(M.date,{zone:a}):g=D.DateTime.fromJSDate(M.date,{zone:a}),o.set(g.toISODate()||"",{name:M.name,type:M.type||"national"})});const m=[];let E=[],i=I;for(;i<=Z;){const M=i.month===r,g=i.hasSame(P,"day"),t=i.startOf("day"),p=i.toISODate()||"";let n=!1,A=!1,k=!1,L=!1;z&&C&&$?(k=t.hasSame(C,"day"),L=t.hasSame($,"day"),A=t>=C&&t<=$||k||L,n=k||L):l&&(n=i.hasSame(l,"day"));let T=!1;d&&i<d.startOf("day")&&(T=!0),v&&i>v.endOf("day")&&(T=!0);const B=o.get(p);E.push({date:i,isCurrentMonth:M,isToday:g,isSelected:n,isDisabled:T,isInRange:A,isRangeStart:k,isRangeEnd:L,holiday:B?{date:i,...B}:void 0}),E.length===7&&(m.push(E),E=[]),i=i.plus({days:1})}return m}function V(){const s=D.DateTime.now().startOf("week"),r=[];for(let a=0;a<7;a++){const l=s.plus({days:a});r.push(l.toFormat("ccc"))}return r}function R(){const s=[];for(let r=1;r<=12;r++){const a=D.DateTime.fromObject({month:r});s.push(a.toFormat("MMMM"))}return s}const ee=({viewDate:s,selectedDate:r,onDateSelect:a,onViewDateChange:l,timezone:d,minDate:v,maxDate:h,selectedStart:y,selectedEnd:N,onRangeSelect:b,holidays:I})=>{const _=b!=null,Z=c.useMemo(()=>F(s.year,s.month,d,r??void 0,v,h,y??void 0,N??void 0,I),[s,r,d,v,h,y,N,I]),P=c.useMemo(()=>V(),[]),z=c.useMemo(()=>R(),[]),C=()=>{l(s.minus({months:1}))},$=()=>{l(s.plus({months:1}))},o=t=>{const p=parseInt(t.target.value,10);l(s.set({month:p}))},m=t=>{const p=parseInt(t.target.value,10);l(s.set({year:p}))},E=(t,p)=>{if(!p)if(_&&b){const n=t.startOf("day");if(y==null)b(t,t);else if(N!=null&&y.hasSame(N,"day")){const A=y.startOf("day");n<A?b(t,y):b(y,t)}else b(t,t)}else a(t)},i=(t,p,n)=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),E(p,n))},M=s.year,g=Array.from({length:21},(t,p)=>M-10+p);return e.jsxs("div",{className:"chronos-calendar",role:"region","aria-label":"Calendar",children:[e.jsxs("div",{className:"chronos-calendar-header",children:[e.jsx("button",{type:"button",className:"chronos-nav-button",onClick:C,"aria-label":"Previous month",children:"‹"}),e.jsxs("div",{className:"chronos-month-year-selectors",children:[e.jsx("select",{className:"chronos-month-select",value:s.month,onChange:o,"aria-label":"Select month",children:z.map((t,p)=>e.jsx("option",{value:p+1,children:t},p))}),e.jsx("select",{className:"chronos-year-select",value:s.year,onChange:m,"aria-label":"Select year",children:g.map(t=>e.jsx("option",{value:t,children:t},t))})]}),e.jsx("button",{type:"button",className:"chronos-nav-button",onClick:$,"aria-label":"Next month",children:"›"})]}),e.jsxs("div",{className:"chronos-calendar-grid",children:[e.jsx("div",{className:"chronos-weekday-row",children:P.map(t=>e.jsx("div",{className:"chronos-weekday",children:t},t))}),Z.map((t,p)=>e.jsx("div",{className:"chronos-week-row",children:t.map((n,A)=>e.jsxs("button",{type:"button",className:`chronos-day ${n.isSelected?"selected":""} ${n.isToday?"today":""} ${n.isCurrentMonth?"":"other-month"} ${n.isDisabled?"disabled":""} ${n.isInRange?"in-range":""} ${n.isRangeStart?"range-start":""} ${n.isRangeEnd?"range-end":""} ${n.holiday?`holiday ${n.holiday.type}`:""}`,onClick:()=>E(n.date,n.isDisabled),onKeyDown:k=>i(k,n.date,n.isDisabled),disabled:n.isDisabled,"aria-label":`${n.date.toFormat("MMMM d, yyyy")}${n.holiday?`, ${n.holiday.name}`:""}`,"aria-selected":n.isSelected,"aria-current":n.isToday?"date":void 0,title:n.holiday?n.holiday.name:void 0,children:[n.date.day,n.holiday&&e.jsx("span",{className:"chronos-holiday-dot"})]},A))},p))]})]})},se=({value:s,onChange:r,use24Hour:a})=>{const[l,d]=c.useState((s==null?void 0:s.hour)??12),[v,h]=c.useState((s==null?void 0:s.minute)??0),[y,N]=c.useState(s&&s.hour>=12?"PM":"AM");c.useEffect(()=>{s&&(d(s.hour),h(s.minute),N(s.hour>=12?"PM":"AM"))},[s]);const b=o=>{d(o);let m=o;a||(y==="PM"&&o!==12?m=o+12:y==="AM"&&o===12&&(m=0)),r(m,v)},I=o=>{h(o),r(l,o)},_=()=>{const o=y==="AM"?"PM":"AM";N(o);let m=l;o==="PM"&&l!==12?m=l+12:o==="AM"&&l===12?m=0:o==="AM"&&l>12&&(m=l-12),r(m,v)},Z=a?l:l%12||12,P=a?23:12,z=a?0:1,C=Array.from({length:P-z+1},(o,m)=>z+m),$=Array.from({length:60},(o,m)=>m);return e.jsxs("div",{className:"chronos-time-picker",role:"group","aria-label":"Time picker",children:[e.jsxs("div",{className:"chronos-time-header",children:[e.jsxs("svg",{className:"chronos-clock-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("polyline",{points:"12 6 12 12 16 14"})]}),e.jsx("span",{children:"Time"})]}),e.jsxs("div",{className:"chronos-time-controls",children:[e.jsxs("div",{className:"chronos-time-input-group",children:[e.jsx("label",{htmlFor:"chronos-hour-select",className:"chronos-time-label",children:"Hour"}),e.jsx("select",{id:"chronos-hour-select",className:"chronos-time-select",value:Z,onChange:o=>b(parseInt(o.target.value,10)),"aria-label":"Select hour",children:C.map(o=>e.jsx("option",{value:o,children:o.toString().padStart(2,"0")},o))})]}),e.jsx("span",{className:"chronos-time-separator",children:":"}),e.jsxs("div",{className:"chronos-time-input-group",children:[e.jsx("label",{htmlFor:"chronos-minute-select",className:"chronos-time-label",children:"Minute"}),e.jsx("select",{id:"chronos-minute-select",className:"chronos-time-select",value:v,onChange:o=>I(parseInt(o.target.value,10)),"aria-label":"Select minute",children:$.map(o=>e.jsx("option",{value:o,children:o.toString().padStart(2,"0")},o))})]}),!a&&e.jsx("button",{type:"button",className:"chronos-period-toggle",onClick:_,"aria-label":`Switch to ${y==="AM"?"PM":"AM"}`,children:y})]})]})},oe=({value:s,onChange:r})=>{const[a,l]=c.useState(!1),d=U.find(h=>h.value===s)||{label:s},v=h=>{r(h),l(!1)};return e.jsxs("div",{className:"chronos-timezone-selector",children:[e.jsxs("div",{className:"chronos-timezone-header",children:[e.jsxs("svg",{className:"chronos-globe-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]}),e.jsx("span",{children:"Timezone"})]}),e.jsxs("button",{type:"button",className:"chronos-timezone-button",onClick:()=>l(!a),"aria-expanded":a,"aria-label":"Select timezone",children:[e.jsx("span",{className:"chronos-timezone-label",children:d.label}),e.jsx("span",{className:"chronos-timezone-offset",children:J(s)}),e.jsx("svg",{className:`chronos-chevron ${a?"expanded":""}`,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),a&&e.jsx("div",{className:"chronos-timezone-list",role:"listbox",children:U.map(h=>e.jsxs("button",{type:"button",className:`chronos-timezone-option ${h.value===s?"selected":""}`,onClick:()=>v(h.value),role:"option","aria-selected":h.value===s,children:[e.jsx("span",{className:"chronos-timezone-option-label",children:h.label}),e.jsx("span",{className:"chronos-timezone-option-offset",children:J(h.value)})]},h.value))})]})};function H(s,r,a){return{iso:s.toISO()||"",formatted:s.toFormat(`${r} ${a}`),timestamp:s.toMillis(),dateTime:s}}const te=({value:s,onChange:r,timezone:a=G,dateFormat:l="DD",timeFormat:d="HH:mm",minDate:v,maxDate:h,placeholder:y="Select date and time",disabled:N=!1,showTime:b=!0,use24Hour:I=!0,className:_="",ariaLabel:Z="Date and time picker",showTimezoneSelector:P=!1,theme:z="light",orientation:C="portrait",selectionMode:$="single",rangeValue:o,onRangeChange:m,holidays:E})=>{const i=$==="range",[M,g]=c.useState(!1),[t,p]=c.useState(()=>!i&&s?w(s,a):null),[n,A]=c.useState(()=>i&&(o!=null&&o.start)?w(o.start,a):null),[k,L]=c.useState(()=>i&&(o!=null&&o.end)?w(o.end,a):null),[T,B]=c.useState(a),[ne,W]=c.useState(()=>t||n||k||K(a)),Y=c.useRef(null),Q=c.useRef(null);c.useEffect(()=>{!i&&s&&p(w(s,T))},[s,T,i]),c.useEffect(()=>{i&&(o==null?void 0:o.start)!=null&&(o==null?void 0:o.end)!=null&&(A(w(o.start,T)),L(w(o.end,T)))},[i,o,T]),c.useEffect(()=>{const u=f=>{Y.current&&!Y.current.contains(f.target)&&g(!1)};if(M)return document.addEventListener("mousedown",u),()=>document.removeEventListener("mousedown",u)},[M]),c.useEffect(()=>{const u=f=>{var O;f.key==="Escape"&&M&&(g(!1),(O=Q.current)==null||O.focus())};return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[M]);const ae=c.useCallback(u=>{let f=u;if(t&&(f=u.set({hour:t.hour,minute:t.minute,second:t.second})),p(f),W(f),b||g(!1),r){const O={iso:f.toISO()||"",formatted:f.toFormat(`${l} ${d}`),timestamp:f.toMillis(),dateTime:f};r(O)}},[t,b,r,l,d]),re=c.useCallback((u,f)=>{const x=(t||K(T)).set({hour:u,minute:f,second:0});if(p(x),r){const j={iso:x.toISO()||"",formatted:x.toFormat(`${l} ${d}`),timestamp:x.toMillis(),dateTime:x};r(j)}},[t,T,r,l,d]),le=c.useCallback((u,f)=>{const O=u.startOf("day"),x=f.startOf("day"),[j,q]=O<=x?[O,x]:[x,O];if(A(j),L(q),W(j),m){const me=H(j,l,d),pe=H(q,l,d),ye=Math.max(0,Math.ceil(q.diff(j,"days").days));m({start:me,end:pe,nights:ye})}},[m,l,d]),ie=c.useCallback(u=>{if(B(u),t){const f=t.setZone(u);if(p(f),W(f),r){const O={iso:f.toISO()||"",formatted:f.toFormat(`${l} ${d}`),timestamp:f.toMillis(),dateTime:f};r(O)}}else W(K(u))},[t,r,l,d]),X=()=>{N||g(!M)},ce=u=>{(u.key==="Enter"||u.key===" ")&&(u.preventDefault(),X())},de=i?n&&k?`${n.toFormat("d MMM yyyy")} – ${k.toFormat("d MMM yyyy")}`:"":t?t.toFormat(`${l} ${b?d:""}`):"",he=v?w(v,T):void 0,fe=h?w(h,T):void 0;return e.jsxs("div",{ref:Y,className:`chronos-picker ${_}`,"data-disabled":N,"data-theme":z,children:[e.jsxs("div",{className:"chronos-input-wrapper",onClick:X,children:[e.jsx("input",{ref:Q,type:"text",className:"chronos-input",value:de,placeholder:y,readOnly:!0,disabled:N,onKeyDown:ce,"aria-label":Z,"aria-expanded":M,"aria-haspopup":"dialog",role:"combobox"}),e.jsxs("svg",{className:"chronos-calendar-icon",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),e.jsx("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),e.jsx("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),e.jsx("line",{x1:"3",y1:"10",x2:"21",y2:"10"})]})]}),M&&e.jsx("div",{className:"chronos-dropdown","data-orientation":C,"data-range-mode":i,role:"dialog","aria-label":"Date and time picker dialog",children:e.jsxs("div",{className:"chronos-dropdown-content",children:[i&&n&&k&&e.jsxs("div",{className:"chronos-range-summary",children:[e.jsxs("div",{className:"chronos-range-nights",children:[Math.max(0,Math.ceil(k.diff(n,"days").days))," nights"]}),e.jsxs("div",{className:"chronos-range-dates",children:[n.toFormat("d MMM yyyy")," – ",k.toFormat("d MMM yyyy")]})]}),e.jsx(ee,{viewDate:ne,selectedDate:i?null:t,onDateSelect:ae,onViewDateChange:W,timezone:T,minDate:he,maxDate:fe,selectedStart:i?n:void 0,selectedEnd:i?k:void 0,onRangeSelect:i?le:void 0,holidays:E}),!i&&(b||P)&&e.jsxs("div",{className:"chronos-sidebar",children:[b&&e.jsx(se,{value:t,onChange:re,use24Hour:I,timezone:T}),P&&e.jsx(oe,{value:T,onChange:ie})]})]})})]})};S.COMMON_TIMEZONES=U,S.DEFAULT_TIMEZONE=G,S.DateTimePicker=te,S.convertToTimezone=w,S.nowInTimezone=K,Object.defineProperty(S,Symbol.toStringTag,{value:"Module"})});
@@ -1,5 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  import { DateTime } from 'luxon';
3
+ import { Holiday } from '../types';
3
4
 
4
5
  interface CalendarProps {
5
6
  viewDate: DateTime;
@@ -13,6 +14,7 @@ interface CalendarProps {
13
14
  selectedStart?: DateTime | null;
14
15
  selectedEnd?: DateTime | null;
15
16
  onRangeSelect?: (start: DateTime, end: DateTime) => void;
17
+ holidays?: Holiday[];
16
18
  }
17
19
  export declare const Calendar: React.FC<CalendarProps>;
18
20
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,UAAU,aAAa;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvC,gBAAgB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,oDAAoD;IACpD,aAAa,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC1D;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAwK5C,CAAC"}
1
+ {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,UAAU,aAAa;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvC,gBAAgB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,oDAAoD;IACpD,aAAa,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAwK5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"DateTimePicker.d.ts","sourceRoot":"","sources":["../../../src/components/DateTimePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAiB,MAAM,UAAU,CAAC;AAK9D,OAAO,8BAA8B,CAAC;AAWtC,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAuSxD,CAAC"}
1
+ {"version":3,"file":"DateTimePicker.d.ts","sourceRoot":"","sources":["../../../src/components/DateTimePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAiB,MAAM,UAAU,CAAC;AAK9D,OAAO,8BAA8B,CAAC;AAWtC,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAySxD,CAAC"}
@@ -18,6 +18,11 @@ export interface DateTimeRangeValue {
18
18
  /** Number of nights/days in range (end - start in days) */
19
19
  nights: number;
20
20
  }
21
+ export interface Holiday {
22
+ date: DateTime | string | Date;
23
+ name: string;
24
+ type?: 'national' | 'long-weekend';
25
+ }
21
26
  export interface DateTimePickerProps {
22
27
  /** Selected date and time value */
23
28
  value?: Date | string | DateTime;
@@ -60,6 +65,8 @@ export interface DateTimePickerProps {
60
65
  } | null;
61
66
  /** Callback when range changes (selectionMode is 'range') */
62
67
  onRangeChange?: (value: DateTimeRangeValue) => void;
68
+ /** List of holidays to display */
69
+ holidays?: Holiday[];
63
70
  }
64
71
  export interface CalendarDate {
65
72
  date: DateTime;
@@ -73,5 +80,7 @@ export interface CalendarDate {
73
80
  isRangeStart?: boolean;
74
81
  /** Is the range end date */
75
82
  isRangeEnd?: boolean;
83
+ /** Holiday information if applicable */
84
+ holiday?: Holiday;
76
85
  }
77
86
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,qBAAqB;IACrB,KAAK,EAAE,aAAa,CAAC;IACrB,mBAAmB;IACnB,GAAG,EAAE,aAAa,CAAC;IACnB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;IAEjC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAE1C,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAExB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAExB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,gCAAgC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6BAA6B;IAC7B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAEzB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IAEvC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAEnC,gDAAgD;IAChD,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;QAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;IAEvF,6DAA6D;IAC7D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,qBAAqB;IACrB,KAAK,EAAE,aAAa,CAAC;IACrB,mBAAmB;IACnB,GAAG,EAAE,aAAa,CAAC;IACnB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;IAEjC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAE1C,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAExB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAExB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,gCAAgC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6BAA6B;IAC7B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAEzB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IAEvC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAEnC,gDAAgD;IAChD,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;QAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;IAEvF,6DAA6D;IAC7D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAEpD,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -4,7 +4,11 @@ import { CalendarDate } from '../types';
4
4
  /**
5
5
  * Generate calendar grid for a given month
6
6
  */
7
- export declare function generateCalendarMonth(year: number, month: number, timezone: string, selectedDate?: DateTime, minDate?: DateTime, maxDate?: DateTime, selectedStart?: DateTime, selectedEnd?: DateTime): CalendarDate[][];
7
+ export declare function generateCalendarMonth(year: number, month: number, timezone: string, selectedDate?: DateTime, minDate?: DateTime, maxDate?: DateTime, selectedStart?: DateTime, selectedEnd?: DateTime, holidays?: {
8
+ date: DateTime | string | Date;
9
+ name: string;
10
+ type?: 'national' | 'long-weekend';
11
+ }[]): CalendarDate[][];
8
12
  /**
9
13
  * Get weekday names
10
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../src/utils/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,QAAQ,EACvB,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,QAAQ,EAClB,aAAa,CAAC,EAAE,QAAQ,EACxB,WAAW,CAAC,EAAE,QAAQ,GACrB,YAAY,EAAE,EAAE,CAmElB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAU1C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CASxC"}
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../src/utils/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,QAAQ,EACvB,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,QAAQ,EAClB,aAAa,CAAC,EAAE,QAAQ,EACxB,WAAW,CAAC,EAAE,QAAQ,EACtB,QAAQ,CAAC,EAAE;IAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc,CAAA;CAAE,EAAE,GAChG,YAAY,EAAE,EAAE,CAuFlB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAU1C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CASxC"}
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .chronos-picker{position:relative;display:inline-block;width:100%;max-width:320px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;color:#1a1a1a}.chronos-picker[data-disabled=true]{opacity:.6;cursor:not-allowed}.chronos-input-wrapper{position:relative;display:flex;align-items:center;cursor:pointer}.chronos-input{width:100%;padding:10px 40px 10px 14px;border:1.5px solid #d1d5db;border-radius:8px;font-size:14px;color:#1a1a1a;background-color:#fff;transition:all .2s ease;cursor:pointer;outline:none}.chronos-input:hover:not(:disabled){border-color:#9ca3af}.chronos-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-input:disabled{background-color:#f3f4f6;cursor:not-allowed}.chronos-input::placeholder{color:#9ca3af}.chronos-calendar-icon{position:absolute;right:12px;width:20px;height:20px;color:#6b7280;pointer-events:none;transition:color .2s ease}.chronos-input:hover:not(:disabled)~.chronos-calendar-icon,.chronos-input:focus~.chronos-calendar-icon{color:#3b82f6}.chronos-dropdown{position:absolute;top:calc(100% + 8px);left:0;z-index:9999;min-width:320px;background:#fff;border:1px solid #e5e7eb;border-radius:14px;box-shadow:0 4px 6px -1px #00000014,0 10px 30px -4px #0000001f;overflow:hidden;animation:chronos-dropdown-appear .2s ease}.chronos-dropdown-content{display:flex;flex-direction:column}.chronos-dropdown[data-orientation=portrait] .chronos-dropdown-content{flex-direction:column}.chronos-dropdown[data-orientation=landscape]{min-width:auto}.chronos-dropdown[data-orientation=landscape] .chronos-dropdown-content{flex-direction:row}.chronos-dropdown[data-orientation=landscape] .chronos-calendar{border-right:1px solid #e5e7eb;border-bottom:none}.chronos-dropdown[data-orientation=landscape] .chronos-sidebar{display:flex;flex-direction:column;min-width:240px}.chronos-dropdown[data-orientation=landscape] .chronos-time-picker{border-top:none;border-bottom:1px solid #e5e7eb}.chronos-dropdown[data-orientation=landscape] .chronos-time-picker:last-child{border-bottom:none}.chronos-dropdown[data-orientation=landscape] .chronos-timezone-selector{border-top:none}@keyframes chronos-dropdown-appear{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.chronos-range-summary{padding:16px 16px 0;margin-bottom:8px}.chronos-range-nights{font-size:1.5rem;font-weight:700;color:#1a1a1a;letter-spacing:-.025em;line-height:1.2}.chronos-range-dates{font-size:.875rem;color:#6b7280;margin-top:4px}.chronos-calendar{padding:16px}.chronos-calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;gap:8px}.chronos-nav-button{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;border-radius:6px;background:transparent;color:#4b5563;font-size:20px;font-weight:600;cursor:pointer;transition:all .15s ease}.chronos-nav-button:hover{background:#f3f4f6;color:#1a1a1a}.chronos-nav-button:active{transform:scale(.95)}.chronos-month-year-selectors{display:flex;gap:8px;flex:1;justify-content:center}.chronos-month-select,.chronos-year-select{padding:6px 10px;border:1px solid #d1d5db;border-radius:6px;font-size:14px;font-weight:500;color:#1a1a1a;background-color:#fff;cursor:pointer;transition:all .15s ease;outline:none}.chronos-month-select:hover,.chronos-year-select:hover{border-color:#9ca3af}.chronos-month-select:focus,.chronos-year-select:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-calendar-grid{display:flex;flex-direction:column;gap:4px}.chronos-weekday-row,.chronos-week-row{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}.chronos-weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:11px;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:.05em}.chronos-day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;margin:0 auto;border:none;border-radius:50%;font-size:14px;font-weight:500;color:#1a1a1a;background:transparent;cursor:pointer;transition:all .2s ease;position:relative}.chronos-day:hover:not(.disabled){background:#f3f4f6;transform:scale(1.08)}.chronos-day.other-month{color:#9ca3af}.chronos-day.today{color:#3b82f6;font-weight:600}.chronos-day.today:after{content:"";position:absolute;bottom:5px;left:50%;transform:translate(-50%);width:4px;height:4px;border-radius:50%;background:#3b82f6}.chronos-day.selected{background:#3b82f6;color:#fff;font-weight:600;box-shadow:0 2px 8px #3b82f659}.chronos-day.selected:hover{background:#2563eb;box-shadow:0 2px 12px #2563eb66}.chronos-day.disabled{color:#d1d5db;cursor:not-allowed;opacity:.5}.chronos-day.disabled:hover{background:transparent;transform:none}.chronos-day.in-range{background:#e5e7eb;border-radius:0}.chronos-day.in-range:hover{background:#d1d5db}.chronos-day.range-start{border-radius:50% 0 0 50%}.chronos-day.range-start.in-range{background:#e5e7eb}.chronos-day.range-end{border-radius:0 50% 50% 0}.chronos-day.range-end.in-range{background:#e5e7eb}.chronos-day.range-start.selected,.chronos-day.range-end.selected{background:#1a1a1a;color:#fff;font-weight:600;box-shadow:0 0 0 2px #fff}.chronos-day.range-start.selected:hover,.chronos-day.range-end.selected:hover{background:#374151}.chronos-day.range-start.range-end{border-radius:50%}.chronos-day:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.chronos-time-picker{padding:16px}.chronos-dropdown[data-orientation=portrait] .chronos-time-picker{border-top:1px solid #e5e7eb}.chronos-time-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-weight:600;color:#4b5563}.chronos-clock-icon{width:18px;height:18px;color:#6b7280}.chronos-time-controls{display:flex;align-items:flex-end;justify-content:center;gap:8px}.chronos-time-input-group{display:flex;flex-direction:column;gap:4px}.chronos-time-label{font-size:11px;font-weight:500;color:#6b7280;text-transform:uppercase;letter-spacing:.5px}.chronos-time-select{width:70px;padding:8px 10px;border:1.5px solid #d1d5db;border-radius:6px;font-size:16px;font-weight:600;color:#1a1a1a;background-color:#fff;cursor:pointer;transition:all .15s ease;outline:none;text-align:center}.chronos-time-select:hover{border-color:#9ca3af}.chronos-time-select:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-time-separator{font-size:24px;font-weight:700;color:#1a1a1a;line-height:1;margin-bottom:8px}.chronos-period-toggle{padding:8px 16px;border:1.5px solid #d1d5db;border-radius:6px;font-size:14px;font-weight:600;color:#1a1a1a;background-color:#fff;cursor:pointer;transition:all .15s ease;outline:none}.chronos-period-toggle:hover{border-color:#3b82f6;background-color:#eff6ff;color:#3b82f6}.chronos-period-toggle:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-period-toggle:active{transform:scale(.95)}.chronos-timezone-selector{padding:16px}.chronos-dropdown[data-orientation=portrait] .chronos-timezone-selector{border-top:1px solid #e5e7eb}.chronos-timezone-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-weight:600;color:#4b5563}.chronos-globe-icon{width:18px;height:18px;color:#6b7280}.chronos-timezone-button{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 12px;border:1.5px solid #d1d5db;border-radius:8px;background-color:#fff;cursor:pointer;transition:all .15s ease;outline:none}.chronos-timezone-button:hover{border-color:#9ca3af}.chronos-timezone-button:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-timezone-label{font-weight:500;color:#1a1a1a;flex:1;text-align:left}.chronos-timezone-offset{font-size:12px;color:#6b7280;margin-right:8px}.chronos-chevron{width:16px;height:16px;color:#6b7280;transition:transform .2s ease}.chronos-chevron.expanded{transform:rotate(180deg)}.chronos-timezone-list{margin-top:8px;max-height:240px;overflow-y:auto;border:1px solid #e5e7eb;border-radius:8px;background:#fff;animation:chronos-timezone-list-appear .2s ease}@keyframes chronos-timezone-list-appear{0%{opacity:0;max-height:0}to{opacity:1;max-height:240px}}.chronos-timezone-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 12px;border:none;border-bottom:1px solid #f3f4f6;background:transparent;text-align:left;cursor:pointer;transition:background .15s ease;outline:none}.chronos-timezone-option:last-child{border-bottom:none}.chronos-timezone-option:hover{background:#f9fafb}.chronos-timezone-option.selected{background:#eff6ff}.chronos-timezone-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.chronos-timezone-option-label{font-weight:500;color:#1a1a1a}.chronos-timezone-option.selected .chronos-timezone-option-label{color:#3b82f6;font-weight:600}.chronos-timezone-option-offset{font-size:12px;color:#6b7280}@media (max-width: 480px){.chronos-dropdown{min-width:calc(100vw - 32px);max-width:calc(100vw - 32px)}.chronos-picker{max-width:100%}}.chronos-timezone-list::-webkit-scrollbar{width:6px}.chronos-timezone-list::-webkit-scrollbar-track{background:#f3f4f6}.chronos-timezone-list::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:3px}.chronos-timezone-list::-webkit-scrollbar-thumb:hover{background:#9ca3af}.chronos-picker[data-theme=dark]{color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-dropdown[data-orientation=landscape] .chronos-calendar{border-right-color:#374151}.chronos-picker[data-theme=dark] .chronos-dropdown[data-orientation=landscape] .chronos-time-picker{border-bottom-color:#374151}.chronos-picker[data-theme=dark] .chronos-dropdown[data-orientation=portrait] .chronos-time-picker,.chronos-picker[data-theme=dark] .chronos-dropdown[data-orientation=portrait] .chronos-timezone-selector{border-top-color:#374151}.chronos-picker[data-theme=dark] .chronos-input{background-color:#1f2937;border-color:#374151;color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-input:hover:not(:disabled){border-color:#4b5563}.chronos-picker[data-theme=dark] .chronos-input:disabled{background-color:#111827}.chronos-picker[data-theme=dark] .chronos-input::placeholder{color:#6b7280}.chronos-picker[data-theme=dark] .chronos-calendar-icon{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-dropdown{background:#1f2937;border-color:#374151;box-shadow:0 10px 40px #0006}.chronos-picker[data-theme=dark] .chronos-nav-button{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-nav-button:hover{background:#374151;color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-month-select,.chronos-picker[data-theme=dark] .chronos-year-select{background-color:#1f2937;border-color:#374151;color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-weekday{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-day{color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-day:hover:not(.disabled){background:#374151}.chronos-picker[data-theme=dark] .chronos-day.other-month{color:#6b7280}.chronos-picker[data-theme=dark] .chronos-day.today{color:#60a5fa}.chronos-picker[data-theme=dark] .chronos-day.today:after{background:#60a5fa}.chronos-picker[data-theme=dark] .chronos-day.selected{background:#3b82f6;color:#fff}.chronos-picker[data-theme=dark] .chronos-range-nights{color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-range-dates{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-day.in-range{background:#374151}.chronos-picker[data-theme=dark] .chronos-day.in-range:hover{background:#4b5563}.chronos-picker[data-theme=dark] .chronos-day.range-start.selected,.chronos-picker[data-theme=dark] .chronos-day.range-end.selected{background:#3b82f6;color:#fff;box-shadow:0 0 0 2px #1f2937}.chronos-picker[data-theme=dark] .chronos-time-header,.chronos-picker[data-theme=dark] .chronos-timezone-header{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-time-select,.chronos-picker[data-theme=dark] .chronos-period-toggle,.chronos-picker[data-theme=dark] .chronos-timezone-button{background-color:#1f2937;border-color:#374151;color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-timezone-list{background:#1f2937;border-color:#374151}.chronos-picker[data-theme=dark] .chronos-timezone-option:hover{background:#374151}.chronos-picker[data-theme=dark] .chronos-timezone-option.selected{background:#1e3a5f}.chronos-picker[data-theme=dark] .chronos-timezone-option.selected .chronos-timezone-option-label{color:#60a5fa}
1
+ .chronos-picker{position:relative;display:inline-block;width:100%;max-width:320px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;color:#1a1a1a}.chronos-picker[data-disabled=true]{opacity:.6;cursor:not-allowed}.chronos-input-wrapper{position:relative;display:flex;align-items:center;cursor:pointer}.chronos-input{width:100%;padding:10px 40px 10px 14px;border:1.5px solid #d1d5db;border-radius:8px;font-size:14px;color:#1a1a1a;background-color:#fff;transition:all .2s ease;cursor:pointer;outline:none}.chronos-input:hover:not(:disabled){border-color:#9ca3af}.chronos-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-input:disabled{background-color:#f3f4f6;cursor:not-allowed}.chronos-input::placeholder{color:#9ca3af}.chronos-calendar-icon{position:absolute;right:12px;width:20px;height:20px;color:#6b7280;pointer-events:none;transition:color .2s ease}.chronos-input:hover:not(:disabled)~.chronos-calendar-icon,.chronos-input:focus~.chronos-calendar-icon{color:#3b82f6}.chronos-dropdown{position:absolute;top:calc(100% + 8px);left:0;z-index:99999;min-width:320px;background:#fff;border:1px solid #e5e7eb;border-radius:14px;box-shadow:0 4px 6px -1px #00000014,0 10px 30px -4px #0000001f;overflow:hidden;animation:chronos-dropdown-appear .2s ease}.chronos-dropdown-content{display:flex;flex-direction:column}.chronos-dropdown[data-orientation=portrait] .chronos-dropdown-content{flex-direction:column}.chronos-dropdown[data-orientation=landscape]{min-width:auto}.chronos-dropdown[data-orientation=landscape] .chronos-dropdown-content{flex-direction:row}.chronos-dropdown[data-orientation=landscape] .chronos-calendar{border-right:1px solid #e5e7eb;border-bottom:none}.chronos-dropdown[data-orientation=landscape] .chronos-sidebar{display:flex;flex-direction:column;min-width:240px}.chronos-dropdown[data-orientation=landscape] .chronos-time-picker{border-top:none;border-bottom:1px solid #e5e7eb}.chronos-dropdown[data-orientation=landscape] .chronos-time-picker:last-child{border-bottom:none}.chronos-dropdown[data-orientation=landscape] .chronos-timezone-selector{border-top:none}@keyframes chronos-dropdown-appear{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.chronos-range-summary{padding:16px 16px 0;margin-bottom:8px}.chronos-range-nights{font-size:1.5rem;font-weight:700;color:#1a1a1a;letter-spacing:-.025em;line-height:1.2}.chronos-range-dates{font-size:.875rem;color:#6b7280;margin-top:4px}.chronos-calendar{padding:16px}.chronos-calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;gap:8px}.chronos-nav-button{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;border-radius:6px;background:transparent;color:#4b5563;font-size:20px;font-weight:600;cursor:pointer;transition:all .15s ease}.chronos-nav-button:hover{background:#f3f4f6;color:#1a1a1a}.chronos-nav-button:active{transform:scale(.95)}.chronos-month-year-selectors{display:flex;gap:8px;flex:1;justify-content:center}.chronos-month-select,.chronos-year-select{padding:6px 10px;border:1px solid #d1d5db;border-radius:6px;font-size:14px;font-weight:500;color:#1a1a1a;background-color:#fff;cursor:pointer;transition:all .15s ease;outline:none}.chronos-month-select:hover,.chronos-year-select:hover{border-color:#9ca3af}.chronos-month-select:focus,.chronos-year-select:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-calendar-grid{display:flex;flex-direction:column;gap:4px}.chronos-weekday-row,.chronos-week-row{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}.chronos-weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:11px;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:.05em}.chronos-day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;margin:0 auto;border:none;border-radius:50%;font-size:14px;font-weight:500;color:#1a1a1a;background:transparent;cursor:pointer;transition:all .2s ease;position:relative}.chronos-day:hover:not(.disabled){background:#f3f4f6;transform:scale(1.08)}.chronos-day.other-month{color:#9ca3af}.chronos-day.today{color:#3b82f6;font-weight:600}.chronos-day.today:after{content:"";position:absolute;bottom:5px;left:50%;transform:translate(-50%);width:4px;height:4px;border-radius:50%;background:#3b82f6}.chronos-day.selected{background:#3b82f6;color:#fff;font-weight:600;box-shadow:0 2px 8px #3b82f659}.chronos-day.selected:hover{background:#2563eb;box-shadow:0 2px 12px #2563eb66}.chronos-day.disabled{color:#d1d5db;cursor:not-allowed;opacity:.5}.chronos-day.disabled:hover{background:transparent;transform:none}.chronos-day.in-range{background:#e5e7eb;border-radius:0}.chronos-day.in-range:hover{background:#d1d5db}.chronos-day.range-start{border-radius:50% 0 0 50%}.chronos-day.range-start.in-range{background:#e5e7eb}.chronos-day.range-end{border-radius:0 50% 50% 0}.chronos-day.range-end.in-range{background:#e5e7eb}.chronos-day.range-start.selected,.chronos-day.range-end.selected{background:#1a1a1a;color:#fff;font-weight:600;box-shadow:0 0 0 2px #fff}.chronos-day.range-start.selected:hover,.chronos-day.range-end.selected:hover{background:#374151}.chronos-day.range-start.range-end{border-radius:50%}.chronos-day:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.chronos-day.holiday{position:relative}.chronos-holiday-dot{position:absolute;top:4px;right:4px;width:6px;height:6px;border-radius:50%;background-color:#ef4444}.chronos-day.holiday.long-weekend{background-color:#ecfdf5;color:#047857;font-weight:600}.chronos-day.holiday.long-weekend:hover:not(.disabled){background-color:#d1fae5}.chronos-day.holiday.long-weekend .chronos-holiday-dot{background-color:#10b981}.chronos-picker[data-theme=dark] .chronos-day.holiday.long-weekend{background-color:#064e3b;color:#d1fae5}.chronos-picker[data-theme=dark] .chronos-day.holiday.long-weekend:hover:not(.disabled){background-color:#065f46}.chronos-picker[data-theme=dark] .chronos-day.holiday.long-weekend .chronos-holiday-dot{background-color:#34d399}.chronos-time-picker{padding:16px}.chronos-dropdown[data-orientation=portrait] .chronos-time-picker{border-top:1px solid #e5e7eb}.chronos-time-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-weight:600;color:#4b5563}.chronos-clock-icon{width:18px;height:18px;color:#6b7280}.chronos-time-controls{display:flex;align-items:flex-end;justify-content:center;gap:8px}.chronos-time-input-group{display:flex;flex-direction:column;gap:4px}.chronos-time-label{font-size:11px;font-weight:500;color:#6b7280;text-transform:uppercase;letter-spacing:.5px}.chronos-time-select{width:70px;padding:8px 10px;border:1.5px solid #d1d5db;border-radius:6px;font-size:16px;font-weight:600;color:#1a1a1a;background-color:#fff;cursor:pointer;transition:all .15s ease;outline:none;text-align:center}.chronos-time-select:hover{border-color:#9ca3af}.chronos-time-select:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-time-separator{font-size:24px;font-weight:700;color:#1a1a1a;line-height:1;margin-bottom:8px}.chronos-period-toggle{padding:8px 16px;border:1.5px solid #d1d5db;border-radius:6px;font-size:14px;font-weight:600;color:#1a1a1a;background-color:#fff;cursor:pointer;transition:all .15s ease;outline:none}.chronos-period-toggle:hover{border-color:#3b82f6;background-color:#eff6ff;color:#3b82f6}.chronos-period-toggle:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-period-toggle:active{transform:scale(.95)}.chronos-timezone-selector{padding:16px}.chronos-dropdown[data-orientation=portrait] .chronos-timezone-selector{border-top:1px solid #e5e7eb}.chronos-timezone-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-weight:600;color:#4b5563}.chronos-globe-icon{width:18px;height:18px;color:#6b7280}.chronos-timezone-button{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 12px;border:1.5px solid #d1d5db;border-radius:8px;background-color:#fff;cursor:pointer;transition:all .15s ease;outline:none}.chronos-timezone-button:hover{border-color:#9ca3af}.chronos-timezone-button:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.chronos-timezone-label{font-weight:500;color:#1a1a1a;flex:1;text-align:left}.chronos-timezone-offset{font-size:12px;color:#6b7280;margin-right:8px}.chronos-chevron{width:16px;height:16px;color:#6b7280;transition:transform .2s ease}.chronos-chevron.expanded{transform:rotate(180deg)}.chronos-timezone-list{margin-top:8px;max-height:240px;overflow-y:auto;border:1px solid #e5e7eb;border-radius:8px;background:#fff;animation:chronos-timezone-list-appear .2s ease}@keyframes chronos-timezone-list-appear{0%{opacity:0;max-height:0}to{opacity:1;max-height:240px}}.chronos-timezone-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 12px;border:none;border-bottom:1px solid #f3f4f6;background:transparent;text-align:left;cursor:pointer;transition:background .15s ease;outline:none}.chronos-timezone-option:last-child{border-bottom:none}.chronos-timezone-option:hover{background:#f9fafb}.chronos-timezone-option.selected{background:#eff6ff}.chronos-timezone-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.chronos-timezone-option-label{font-weight:500;color:#1a1a1a}.chronos-timezone-option.selected .chronos-timezone-option-label{color:#3b82f6;font-weight:600}.chronos-timezone-option-offset{font-size:12px;color:#6b7280}@media (max-width: 480px){.chronos-dropdown{min-width:calc(100vw - 32px);max-width:calc(100vw - 32px)}.chronos-picker{max-width:100%}}.chronos-timezone-list::-webkit-scrollbar{width:6px}.chronos-timezone-list::-webkit-scrollbar-track{background:#f3f4f6}.chronos-timezone-list::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:3px}.chronos-timezone-list::-webkit-scrollbar-thumb:hover{background:#9ca3af}.chronos-picker[data-theme=dark]{color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-dropdown[data-orientation=landscape] .chronos-calendar{border-right-color:#374151}.chronos-picker[data-theme=dark] .chronos-dropdown[data-orientation=landscape] .chronos-time-picker{border-bottom-color:#374151}.chronos-picker[data-theme=dark] .chronos-dropdown[data-orientation=portrait] .chronos-time-picker,.chronos-picker[data-theme=dark] .chronos-dropdown[data-orientation=portrait] .chronos-timezone-selector{border-top-color:#374151}.chronos-picker[data-theme=dark] .chronos-input{background-color:#1f2937;border-color:#374151;color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-input:hover:not(:disabled){border-color:#4b5563}.chronos-picker[data-theme=dark] .chronos-input:disabled{background-color:#111827}.chronos-picker[data-theme=dark] .chronos-input::placeholder{color:#6b7280}.chronos-picker[data-theme=dark] .chronos-calendar-icon{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-dropdown{background:#1f2937;border-color:#374151;box-shadow:0 10px 40px #0006}.chronos-picker[data-theme=dark] .chronos-nav-button{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-nav-button:hover{background:#374151;color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-month-select,.chronos-picker[data-theme=dark] .chronos-year-select{background-color:#1f2937;border-color:#374151;color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-weekday{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-day{color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-day:hover:not(.disabled){background:#374151}.chronos-picker[data-theme=dark] .chronos-day.other-month{color:#6b7280}.chronos-picker[data-theme=dark] .chronos-day.today{color:#60a5fa}.chronos-picker[data-theme=dark] .chronos-day.today:after{background:#60a5fa}.chronos-picker[data-theme=dark] .chronos-day.selected{background:#3b82f6;color:#fff}.chronos-picker[data-theme=dark] .chronos-range-nights{color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-range-dates{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-day.in-range{background:#374151}.chronos-picker[data-theme=dark] .chronos-day.in-range:hover{background:#4b5563}.chronos-picker[data-theme=dark] .chronos-day.range-start.selected,.chronos-picker[data-theme=dark] .chronos-day.range-end.selected{background:#3b82f6;color:#fff;box-shadow:0 0 0 2px #1f2937}.chronos-picker[data-theme=dark] .chronos-time-header,.chronos-picker[data-theme=dark] .chronos-timezone-header{color:#9ca3af}.chronos-picker[data-theme=dark] .chronos-time-select,.chronos-picker[data-theme=dark] .chronos-period-toggle,.chronos-picker[data-theme=dark] .chronos-timezone-button{background-color:#1f2937;border-color:#374151;color:#f3f4f6}.chronos-picker[data-theme=dark] .chronos-timezone-list{background:#1f2937;border-color:#374151}.chronos-picker[data-theme=dark] .chronos-timezone-option:hover{background:#374151}.chronos-picker[data-theme=dark] .chronos-timezone-option.selected{background:#1e3a5f}.chronos-picker[data-theme=dark] .chronos-timezone-option.selected .chronos-timezone-option-label{color:#60a5fa}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theengineerguy/chronos-picker",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "A modern, accessible date & time picker with comprehensive timezone support",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -28,7 +28,7 @@
28
28
  ],
29
29
  "author": "Debmalya Biswas <viperbale.db.@gmail.com>",
30
30
  "license": "MIT",
31
- "homepage": "https://github.com/AnTIdoTe003/chronos-picker#readme",
31
+ "homepage": "https://chronos-picker.debmalya.in",
32
32
  "bugs": {
33
33
  "url": "https://github.com/AnTIdoTe003/chronos-picker/issues"
34
34
  },