asterui 0.12.62 → 0.12.63

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.
Files changed (106) hide show
  1. package/dist/components/Anchor.d.ts +2 -0
  2. package/dist/components/Anchor.js +79 -75
  3. package/dist/components/Anchor.js.map +1 -1
  4. package/dist/components/Autocomplete.d.ts +1 -0
  5. package/dist/components/Autocomplete.js +115 -110
  6. package/dist/components/Autocomplete.js.map +1 -1
  7. package/dist/components/Breadcrumb.d.ts +4 -2
  8. package/dist/components/Breadcrumb.js +54 -29
  9. package/dist/components/Breadcrumb.js.map +1 -1
  10. package/dist/components/Button.d.ts +5 -1
  11. package/dist/components/Button.js +117 -107
  12. package/dist/components/Button.js.map +1 -1
  13. package/dist/components/Chart.d.ts +1 -0
  14. package/dist/components/Chart.js +31 -30
  15. package/dist/components/Chart.js.map +1 -1
  16. package/dist/components/Chat.d.ts +1 -0
  17. package/dist/components/Chat.js +32 -30
  18. package/dist/components/Chat.js.map +1 -1
  19. package/dist/components/Command.d.ts +5 -2
  20. package/dist/components/Command.js +262 -233
  21. package/dist/components/Command.js.map +1 -1
  22. package/dist/components/ContextMenu.d.ts +4 -0
  23. package/dist/components/ContextMenu.js +149 -130
  24. package/dist/components/ContextMenu.js.map +1 -1
  25. package/dist/components/Dock.d.ts +2 -0
  26. package/dist/components/Dock.js +70 -46
  27. package/dist/components/Dock.js.map +1 -1
  28. package/dist/components/FileInput.d.ts +1 -0
  29. package/dist/components/FileInput.js +26 -26
  30. package/dist/components/FileInput.js.map +1 -1
  31. package/dist/components/Filter.d.ts +1 -0
  32. package/dist/components/Filter.js +43 -40
  33. package/dist/components/Filter.js.map +1 -1
  34. package/dist/components/Flex.d.ts +1 -0
  35. package/dist/components/Flex.js +43 -42
  36. package/dist/components/Flex.js.map +1 -1
  37. package/dist/components/FloatButton.d.ts +3 -0
  38. package/dist/components/FloatButton.js +178 -127
  39. package/dist/components/FloatButton.js.map +1 -1
  40. package/dist/components/Input.d.ts +1 -0
  41. package/dist/components/Input.js +201 -184
  42. package/dist/components/Input.js.map +1 -1
  43. package/dist/components/Loading.d.ts +1 -0
  44. package/dist/components/Loading.js +40 -37
  45. package/dist/components/Loading.js.map +1 -1
  46. package/dist/components/Masonry.d.ts +1 -0
  47. package/dist/components/Masonry.js +45 -42
  48. package/dist/components/Masonry.js.map +1 -1
  49. package/dist/components/Mention.d.ts +1 -0
  50. package/dist/components/Mention.js +95 -91
  51. package/dist/components/Mention.js.map +1 -1
  52. package/dist/components/MonthCalendar.d.ts +1 -0
  53. package/dist/components/MonthCalendar.js +104 -97
  54. package/dist/components/MonthCalendar.js.map +1 -1
  55. package/dist/components/QRCode.d.ts +1 -0
  56. package/dist/components/QRCode.js +84 -55
  57. package/dist/components/QRCode.js.map +1 -1
  58. package/dist/components/RadialProgress.d.ts +1 -0
  59. package/dist/components/RadialProgress.js +19 -17
  60. package/dist/components/RadialProgress.js.map +1 -1
  61. package/dist/components/Range.d.ts +1 -0
  62. package/dist/components/Range.js +45 -43
  63. package/dist/components/Range.js.map +1 -1
  64. package/dist/components/Rating.d.ts +4 -2
  65. package/dist/components/Rating.js +83 -79
  66. package/dist/components/Rating.js.map +1 -1
  67. package/dist/components/Responsive.d.ts +4 -2
  68. package/dist/components/Responsive.js +10 -9
  69. package/dist/components/Responsive.js.map +1 -1
  70. package/dist/components/Result.d.ts +1 -0
  71. package/dist/components/Result.js +24 -22
  72. package/dist/components/Result.js.map +1 -1
  73. package/dist/components/Select.d.ts +1 -0
  74. package/dist/components/Select.js +72 -62
  75. package/dist/components/Select.js.map +1 -1
  76. package/dist/components/Splitter.d.ts +2 -0
  77. package/dist/components/Splitter.js +137 -131
  78. package/dist/components/Splitter.js.map +1 -1
  79. package/dist/components/Stat.d.ts +4 -2
  80. package/dist/components/Stat.js +19 -18
  81. package/dist/components/Stat.js.map +1 -1
  82. package/dist/components/Steps.d.ts +4 -2
  83. package/dist/components/Steps.js +56 -52
  84. package/dist/components/Steps.js.map +1 -1
  85. package/dist/components/TextRotate.d.ts +1 -0
  86. package/dist/components/TextRotate.js +14 -12
  87. package/dist/components/TextRotate.js.map +1 -1
  88. package/dist/components/Textarea.d.ts +1 -0
  89. package/dist/components/Textarea.js +31 -30
  90. package/dist/components/Textarea.js.map +1 -1
  91. package/dist/components/ThemeController.d.ts +6 -3
  92. package/dist/components/ThemeController.js +101 -92
  93. package/dist/components/ThemeController.js.map +1 -1
  94. package/dist/components/Typography.d.ts +10 -5
  95. package/dist/components/Typography.js +84 -81
  96. package/dist/components/Typography.js.map +1 -1
  97. package/dist/components/VirtualList.d.ts +2 -1
  98. package/dist/components/VirtualList.js +40 -36
  99. package/dist/components/VirtualList.js.map +1 -1
  100. package/dist/components/Watermark.d.ts +1 -0
  101. package/dist/components/Watermark.js +74 -71
  102. package/dist/components/Watermark.js.map +1 -1
  103. package/dist/components/WeekCalendar.d.ts +1 -0
  104. package/dist/components/WeekCalendar.js +91 -76
  105. package/dist/components/WeekCalendar.js.map +1 -1
  106. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import { jsxs as h, jsx as l } from "react/jsx-runtime";
2
- import { forwardRef as H, useState as Y } from "react";
3
- const A = {
1
+ import { jsxs as p, jsx as c } from "react/jsx-runtime";
2
+ import { forwardRef as J, useState as L } from "react";
3
+ const q = {
4
4
  locale: "en",
5
5
  daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
6
6
  monthsLong: [
@@ -18,179 +18,186 @@ const A = {
18
18
  "December"
19
19
  ],
20
20
  moreText: "more"
21
- }, M = (t) => C(t, /* @__PURE__ */ new Date()), C = (t, e) => {
22
- const n = new Date(t), r = new Date(e);
23
- return n.setHours(0, 0, 0, 0), r.setHours(0, 0, 0, 0), r.getTime() === n.getTime();
24
- }, J = (t) => {
25
- const e = /* @__PURE__ */ new Date(), n = new Date(t);
26
- return e.setHours(0, 0, 0, 0), n.setHours(0, 0, 0, 0), n > e;
27
- }, L = (t) => {
28
- const e = /* @__PURE__ */ new Date(), n = new Date(t);
29
- return e.setHours(0, 0, 0, 0), n.setHours(0, 0, 0, 0), n < e;
30
- }, I = (t, e) => t.filter(
31
- (n) => n.date.getDate() === e.getDate() && n.date.getMonth() === e.getMonth() && n.date.getFullYear() === e.getFullYear()
32
- ), $ = (t, e) => new Date(t, e + 1, 0).getDate(), q = (t, e) => new Date(t, e, 1).getDay(), z = (t, e) => {
33
- const n = $(t, e), r = q(t, e), p = [];
34
- if (r > 0) {
35
- const o = e === 0 ? 11 : e - 1, a = e === 0 ? t - 1 : t, i = $(a, o);
36
- for (let g = 0; g < r; g++) {
37
- const x = i - r + g + 1;
38
- p.push({
21
+ }, $ = (t) => k(t, /* @__PURE__ */ new Date()), k = (t, e) => {
22
+ const s = new Date(t), o = new Date(e);
23
+ return s.setHours(0, 0, 0, 0), o.setHours(0, 0, 0, 0), o.getTime() === s.getTime();
24
+ }, z = (t) => {
25
+ const e = /* @__PURE__ */ new Date(), s = new Date(t);
26
+ return e.setHours(0, 0, 0, 0), s.setHours(0, 0, 0, 0), s > e;
27
+ }, G = (t) => {
28
+ const e = /* @__PURE__ */ new Date(), s = new Date(t);
29
+ return e.setHours(0, 0, 0, 0), s.setHours(0, 0, 0, 0), s < e;
30
+ }, K = (t, e) => t.filter(
31
+ (s) => s.date.getDate() === e.getDate() && s.date.getMonth() === e.getMonth() && s.date.getFullYear() === e.getFullYear()
32
+ ), T = (t, e) => new Date(t, e + 1, 0).getDate(), R = (t, e) => new Date(t, e, 1).getDay(), W = (t, e) => {
33
+ const s = T(t, e), o = R(t, e), f = [];
34
+ if (o > 0) {
35
+ const r = e === 0 ? 11 : e - 1, a = e === 0 ? t - 1 : t, d = T(a, r);
36
+ for (let u = 0; u < o; u++) {
37
+ const x = d - o + u + 1;
38
+ f.push({
39
39
  day: x,
40
- month: o,
40
+ month: r,
41
41
  year: a,
42
42
  isCurrentMonth: !1,
43
- date: new Date(a, o, x)
43
+ date: new Date(a, r, x)
44
44
  });
45
45
  }
46
46
  }
47
- const d = [];
48
- for (let o = 1; o <= n; o++)
49
- d.push({
50
- day: o,
47
+ const h = [];
48
+ for (let r = 1; r <= s; r++)
49
+ h.push({
50
+ day: r,
51
51
  month: e,
52
52
  year: t,
53
53
  isCurrentMonth: !0,
54
- date: new Date(t, e, o)
54
+ date: new Date(t, e, r)
55
55
  });
56
- const m = [], u = 42 - (p.length + d.length);
57
- if (u > 0) {
58
- const o = e === 11 ? 0 : e + 1, a = e === 11 ? t + 1 : t;
59
- for (let i = 1; i <= u; i++)
56
+ const m = [], g = 42 - (f.length + h.length);
57
+ if (g > 0) {
58
+ const r = e === 11 ? 0 : e + 1, a = e === 11 ? t + 1 : t;
59
+ for (let d = 1; d <= g; d++)
60
60
  m.push({
61
- day: i,
62
- month: o,
61
+ day: d,
62
+ month: r,
63
63
  year: a,
64
64
  isCurrentMonth: !1,
65
- date: new Date(a, o, i)
65
+ date: new Date(a, r, d)
66
66
  });
67
67
  }
68
- return [...p, ...d, ...m];
69
- }, G = H(
68
+ return [...f, ...h, ...m];
69
+ }, B = J(
70
70
  ({
71
71
  date: t = /* @__PURE__ */ new Date(),
72
72
  events: e = [],
73
- maxEventsPerDay: n = 5,
74
- onEventClick: r,
75
- onDayClick: p,
76
- onMoreEventsClick: d,
73
+ maxEventsPerDay: s = 5,
74
+ onEventClick: o,
75
+ onDayClick: f,
76
+ onMoreEventsClick: h,
77
77
  header: m,
78
- daySelector: D,
79
- locale: u = A,
80
- ellipsis: o,
78
+ daySelector: M,
79
+ locale: g = q,
80
+ ellipsis: r,
81
81
  allowPastInteraction: a = !1,
82
- className: i = "",
83
- ...g
84
- }, x) => {
85
- const [v, T] = Y(/* @__PURE__ */ new Date()), w = t.getFullYear(), N = t.getMonth();
86
- return /* @__PURE__ */ h(
82
+ className: d = "",
83
+ "data-testid": u,
84
+ ...x
85
+ }, F) => {
86
+ const [S, H] = L(/* @__PURE__ */ new Date()), N = t.getFullYear(), v = t.getMonth(), l = (n) => u ? `${u}-${n}` : void 0;
87
+ return /* @__PURE__ */ p(
87
88
  "div",
88
89
  {
89
- ref: x,
90
- className: `flex h-full w-full flex-col bg-base-100 ${i}`,
91
- ...g,
90
+ ref: F,
91
+ className: `flex h-full w-full flex-col bg-base-100 ${d}`,
92
+ "data-testid": u,
93
+ ...x,
92
94
  children: [
93
- m && /* @__PURE__ */ l("div", { className: "mb-4 flex items-center justify-between", children: /* @__PURE__ */ l("div", { children: /* @__PURE__ */ h("h2", { className: "m-0 text-lg font-medium text-base-content", children: [
94
- u.monthsLong[N],
95
+ m && /* @__PURE__ */ c("div", { className: "mb-4 flex items-center justify-between", "data-testid": l("header"), children: /* @__PURE__ */ c("div", { children: /* @__PURE__ */ p("h2", { className: "m-0 text-lg font-medium text-base-content", children: [
96
+ g.monthsLong[v],
95
97
  " ",
96
- w
98
+ N
97
99
  ] }) }) }),
98
- /* @__PURE__ */ l("div", { className: "grid grid-cols-7 border-b border-base-300", children: u.daysShort.map((s, b) => /* @__PURE__ */ l(
100
+ /* @__PURE__ */ c("div", { className: "grid grid-cols-7 border-b border-base-300", "data-testid": l("weekday-header"), children: g.daysShort.map((n, D) => /* @__PURE__ */ c(
99
101
  "div",
100
102
  {
101
103
  className: "py-1 text-center text-xs font-medium uppercase text-base-content/60",
102
- children: s
104
+ "data-testid": l(`weekday-${D}`),
105
+ children: n
103
106
  },
104
- b
107
+ D
105
108
  )) }),
106
- /* @__PURE__ */ l("div", { className: "grid flex-1 grid-cols-7 grid-rows-6 border-l border-base-300", children: z(w, N).map((s, b) => {
107
- const f = I(e, s.date), y = L(s.date) && !M(s.date), F = D && C(s.date, v);
108
- return /* @__PURE__ */ h(
109
+ /* @__PURE__ */ c("div", { className: "grid flex-1 grid-cols-7 grid-rows-6 border-l border-base-300", "data-testid": l("grid"), children: W(N, v).map((n, D) => {
110
+ const y = K(e, n.date), b = G(n.date) && !$(n.date), Y = M && k(n.date, S), w = `${n.year}-${n.month + 1}-${n.day}`;
111
+ return /* @__PURE__ */ p(
109
112
  "div",
110
113
  {
111
114
  className: `
112
115
  relative cursor-pointer overflow-hidden border-b border-r border-base-300 p-1
113
116
  hover:bg-base-200
114
- ${s.isCurrentMonth ? "" : "bg-base-200"}
115
- ${M(s.date) ? "bg-primary/10" : ""}
116
- ${y ? "opacity-60" : ""}
117
- ${y && !a ? "cursor-not-allowed" : ""}
118
- ${F ? "z-10 outline outline-2 outline-primary" : ""}
117
+ ${n.isCurrentMonth ? "" : "bg-base-200"}
118
+ ${$(n.date) ? "bg-primary/10" : ""}
119
+ ${b ? "opacity-60" : ""}
120
+ ${b && !a ? "cursor-not-allowed" : ""}
121
+ ${Y ? "z-10 outline outline-2 outline-primary" : ""}
119
122
  `,
123
+ "data-testid": l(`day-${w}`),
120
124
  onClick: () => {
121
- y && !a || (D && T(s.date), setTimeout(() => {
122
- p?.(s.date);
125
+ b && !a || (M && H(n.date), setTimeout(() => {
126
+ f?.(n.date);
123
127
  }, 0));
124
128
  },
125
129
  children: [
126
- /* @__PURE__ */ l("div", { className: "mb-0.5 flex justify-center", children: /* @__PURE__ */ l(
130
+ /* @__PURE__ */ c("div", { className: "mb-0.5 flex justify-center", children: /* @__PURE__ */ c(
127
131
  "span",
128
132
  {
129
133
  className: `
130
134
  flex items-center justify-center text-xs leading-none
131
- ${M(s.date) ? "font-bold text-primary" : "text-base-content"}
132
- ${s.isCurrentMonth ? "" : "text-base-content/40"}
133
- ${y && s.isCurrentMonth ? "text-base-content/40" : ""}
135
+ ${$(n.date) ? "font-bold text-primary" : "text-base-content"}
136
+ ${n.isCurrentMonth ? "" : "text-base-content/40"}
137
+ ${b && n.isCurrentMonth ? "text-base-content/40" : ""}
134
138
  `,
135
- children: s.day
139
+ "data-testid": l(`day-number-${w}`),
140
+ children: n.day
136
141
  }
137
142
  ) }),
138
- /* @__PURE__ */ h("div", { className: "flex flex-col", children: [
139
- f.slice(
143
+ /* @__PURE__ */ p("div", { className: "flex flex-col", children: [
144
+ y.slice(
140
145
  0,
141
- f.length > n ? n - 1 : n
142
- ).map((c, k) => /* @__PURE__ */ h(
146
+ y.length > s ? s - 1 : s
147
+ ).map((i, C) => /* @__PURE__ */ p(
143
148
  "div",
144
149
  {
145
150
  className: `
146
151
  flex cursor-pointer items-center rounded px-1 py-0.5 text-xs leading-none
147
152
  transition-colors hover:bg-base-content/5
148
- ${J(c.date), "text-base-content"}
149
- ${c.strikethrough ? "line-through" : ""}
153
+ ${z(i.date), "text-base-content"}
154
+ ${i.strikethrough ? "line-through" : ""}
150
155
  `,
151
- style: c.style,
152
- onClick: (S) => {
153
- S.stopPropagation(), r && r(c);
156
+ style: i.style,
157
+ "data-testid": l(`event-${w}-${C}`),
158
+ onClick: (A) => {
159
+ A.stopPropagation(), o && o(i);
154
160
  },
155
- title: c.title,
161
+ title: i.title,
156
162
  children: [
157
- /* @__PURE__ */ l(
163
+ /* @__PURE__ */ c(
158
164
  "span",
159
165
  {
160
166
  className: "mr-1.5 inline-block h-2 w-2 shrink-0 rounded-full",
161
- style: { backgroundColor: c.color }
167
+ style: { backgroundColor: i.color }
162
168
  }
163
169
  ),
164
- /* @__PURE__ */ l(
170
+ /* @__PURE__ */ c(
165
171
  "span",
166
172
  {
167
- className: `overflow-hidden whitespace-nowrap ${o ? "text-ellipsis" : ""}`,
168
- children: c.title
173
+ className: `overflow-hidden whitespace-nowrap ${r ? "text-ellipsis" : ""}`,
174
+ children: i.title
169
175
  }
170
176
  )
171
177
  ]
172
178
  },
173
- k
179
+ C
174
180
  )),
175
- f.length > n && /* @__PURE__ */ h(
181
+ y.length > s && /* @__PURE__ */ p(
176
182
  "div",
177
183
  {
178
184
  className: "cursor-pointer rounded px-1 py-0.5 text-[11px] text-base-content/60 hover:bg-base-content/5",
179
- onClick: (c) => {
180
- c.stopPropagation(), d && d(s.date, f);
185
+ "data-testid": l(`more-${w}`),
186
+ onClick: (i) => {
187
+ i.stopPropagation(), h && h(n.date, y);
181
188
  },
182
189
  children: [
183
190
  "+",
184
- f.length - n + 1,
191
+ y.length - s + 1,
185
192
  " ",
186
- u.moreText
193
+ g.moreText
187
194
  ]
188
195
  }
189
196
  )
190
197
  ] })
191
198
  ]
192
199
  },
193
- b
200
+ D
194
201
  );
195
202
  }) })
196
203
  ]
@@ -198,8 +205,8 @@ const A = {
198
205
  );
199
206
  }
200
207
  );
201
- G.displayName = "MonthCalendar";
208
+ B.displayName = "MonthCalendar";
202
209
  export {
203
- G as MonthCalendar
210
+ B as MonthCalendar
204
211
  };
205
212
  //# sourceMappingURL=MonthCalendar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MonthCalendar.js","sources":["../../src/components/MonthCalendar.tsx"],"sourcesContent":["import React, { useState, forwardRef } from 'react'\n\n// DaisyUI classes\n// (No DaisyUI classes used in this component)\n\n// Types\nexport type CalendarEvent = {\n date: Date\n title: string\n color: string\n strikethrough?: boolean\n style?: React.CSSProperties\n}\n\nexport type CalendarLocale = {\n locale: string\n daysShort: string[]\n monthsLong: string[]\n moreText: string\n formatTime?: (date: Date) => string\n}\n\n// Default English locale\nconst defaultLocale: CalendarLocale = {\n locale: 'en',\n daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n monthsLong: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n moreText: 'more',\n}\n\n// Utility functions\nconst isToday = (date: Date) => isEqual(date, new Date())\n\nconst isEqual = (a: Date, b: Date) => {\n const acopy = new Date(a)\n const bcopy = new Date(b)\n acopy.setHours(0, 0, 0, 0)\n bcopy.setHours(0, 0, 0, 0)\n return bcopy.getTime() === acopy.getTime()\n}\n\nconst isFutureDate = (date: Date) => {\n const today = new Date()\n const checkDate = new Date(date)\n today.setHours(0, 0, 0, 0)\n checkDate.setHours(0, 0, 0, 0)\n return checkDate > today\n}\n\nconst isPastDate = (date: Date) => {\n const today = new Date()\n const checkDate = new Date(date)\n today.setHours(0, 0, 0, 0)\n checkDate.setHours(0, 0, 0, 0)\n return checkDate < today\n}\n\nconst getEventsForDate = <T extends CalendarEvent>(events: T[], date: Date) => {\n return events.filter(\n (event) =>\n event.date.getDate() === date.getDate() &&\n event.date.getMonth() === date.getMonth() &&\n event.date.getFullYear() === date.getFullYear()\n )\n}\n\nconst getDaysInMonth = (year: number, month: number) => {\n return new Date(year, month + 1, 0).getDate()\n}\n\nconst getFirstDayOfMonth = (year: number, month: number) => {\n return new Date(year, month, 1).getDay()\n}\n\nconst generateCalendarGrid = (year: number, month: number) => {\n const daysInMonth = getDaysInMonth(year, month)\n const firstDayOfMonth = getFirstDayOfMonth(year, month)\n\n const prevMonthDays = []\n\n if (firstDayOfMonth > 0) {\n const prevMonth = month === 0 ? 11 : month - 1\n const prevMonthYear = month === 0 ? year - 1 : year\n const daysInPrevMonth = getDaysInMonth(prevMonthYear, prevMonth)\n\n for (let i = 0; i < firstDayOfMonth; i++) {\n const day = daysInPrevMonth - firstDayOfMonth + i + 1\n prevMonthDays.push({\n day,\n month: prevMonth,\n year: prevMonthYear,\n isCurrentMonth: false,\n date: new Date(prevMonthYear, prevMonth, day),\n })\n }\n }\n\n const currentMonthDays = []\n\n for (let day = 1; day <= daysInMonth; day++) {\n currentMonthDays.push({\n day,\n month,\n year,\n isCurrentMonth: true,\n date: new Date(year, month, day),\n })\n }\n\n const nextMonthDays = []\n const totalDaysDisplayed = prevMonthDays.length + currentMonthDays.length\n const daysToAdd = 6 * 7 - totalDaysDisplayed\n\n if (daysToAdd > 0) {\n const nextMonth = month === 11 ? 0 : month + 1\n const nextMonthYear = month === 11 ? year + 1 : year\n\n for (let day = 1; day <= daysToAdd; day++) {\n nextMonthDays.push({\n day,\n month: nextMonth,\n year: nextMonthYear,\n isCurrentMonth: false,\n date: new Date(nextMonthYear, nextMonth, day),\n })\n }\n }\n\n return [...prevMonthDays, ...currentMonthDays, ...nextMonthDays]\n}\n\nexport interface MonthCalendarProps<T extends CalendarEvent = CalendarEvent>\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n date?: Date\n events?: T[]\n onEventClick?: (event: T) => void\n onDayClick?: (date: Date) => void\n locale?: CalendarLocale\n allowPastInteraction?: boolean\n maxEventsPerDay?: number\n onMoreEventsClick?: (date: Date, events: T[]) => void\n header?: boolean\n daySelector?: boolean\n ellipsis?: boolean\n}\n\nexport const MonthCalendar = forwardRef<HTMLDivElement, MonthCalendarProps>(\n <T extends CalendarEvent>(\n {\n date = new Date(),\n events = [],\n maxEventsPerDay = 5,\n onEventClick,\n onDayClick,\n onMoreEventsClick,\n header,\n daySelector,\n locale = defaultLocale,\n ellipsis,\n allowPastInteraction = false,\n className = '',\n ...rest\n }: MonthCalendarProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n ) => {\n const [selectedDate, setSelectedDate] = useState(new Date())\n\n const year = date.getFullYear()\n const month = date.getMonth()\n\n return (\n <div\n ref={ref}\n className={`flex h-full w-full flex-col bg-base-100 ${className}`}\n {...rest}\n >\n {header && (\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h2 className=\"m-0 text-lg font-medium text-base-content\">\n {locale.monthsLong[month]} {year}\n </h2>\n </div>\n </div>\n )}\n\n {/* Weekday header */}\n <div className=\"grid grid-cols-7 border-b border-base-300\">\n {locale.daysShort.map((day, index) => (\n <div\n key={index}\n className=\"py-1 text-center text-xs font-medium uppercase text-base-content/60\"\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid flex-1 grid-cols-7 grid-rows-6 border-l border-base-300\">\n {generateCalendarGrid(year, month).map((dateObj, index) => {\n const dateEvents = getEventsForDate(events as T[], dateObj.date)\n const isPast = isPastDate(dateObj.date) && !isToday(dateObj.date)\n const isSelected = daySelector && isEqual(dateObj.date, selectedDate)\n\n return (\n <div\n key={index}\n className={`\n relative cursor-pointer overflow-hidden border-b border-r border-base-300 p-1\n hover:bg-base-200\n ${!dateObj.isCurrentMonth ? 'bg-base-200' : ''}\n ${isToday(dateObj.date) ? 'bg-primary/10' : ''}\n ${isPast ? 'opacity-60' : ''}\n ${isPast && !allowPastInteraction ? 'cursor-not-allowed' : ''}\n ${isSelected ? 'z-10 outline outline-2 outline-primary' : ''}\n `}\n onClick={() => {\n if (isPast && !allowPastInteraction) {\n return\n }\n\n if (daySelector) {\n setSelectedDate(dateObj.date)\n }\n\n setTimeout(() => {\n onDayClick?.(dateObj.date)\n }, 0)\n }}\n >\n {/* Date number */}\n <div className=\"mb-0.5 flex justify-center\">\n <span\n className={`\n flex items-center justify-center text-xs leading-none\n ${isToday(dateObj.date) ? 'font-bold text-primary' : 'text-base-content'}\n ${!dateObj.isCurrentMonth ? 'text-base-content/40' : ''}\n ${isPast && dateObj.isCurrentMonth ? 'text-base-content/40' : ''}\n `}\n >\n {dateObj.day}\n </span>\n </div>\n\n {/* Events container */}\n <div className=\"flex flex-col\">\n {dateEvents\n .slice(\n 0,\n dateEvents.length > maxEventsPerDay\n ? maxEventsPerDay - 1\n : maxEventsPerDay\n )\n .map((event, eventIndex) => (\n <div\n key={eventIndex}\n className={`\n flex cursor-pointer items-center rounded px-1 py-0.5 text-xs leading-none\n transition-colors hover:bg-base-content/5\n ${isFutureDate(event.date) ? 'text-base-content' : 'text-base-content'}\n ${event.strikethrough ? 'line-through' : ''}\n `}\n style={event.style}\n onClick={(e) => {\n e.stopPropagation()\n if (onEventClick) {\n onEventClick(event)\n }\n }}\n title={event.title}\n >\n <span\n className=\"mr-1.5 inline-block h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: event.color }}\n />\n <span\n className={`overflow-hidden whitespace-nowrap ${ellipsis ? 'text-ellipsis' : ''}`}\n >\n {event.title}\n </span>\n </div>\n ))}\n {dateEvents.length > maxEventsPerDay && (\n <div\n className=\"cursor-pointer rounded px-1 py-0.5 text-[11px] text-base-content/60 hover:bg-base-content/5\"\n onClick={(e) => {\n e.stopPropagation()\n if (onMoreEventsClick) {\n onMoreEventsClick(dateObj.date, dateEvents)\n }\n }}\n >\n +{dateEvents.length - maxEventsPerDay + 1} {locale.moreText}\n </div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )\n }\n) as <T extends CalendarEvent = CalendarEvent>(\n props: MonthCalendarProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n\n;(MonthCalendar as React.FC).displayName = 'MonthCalendar'\n"],"names":["defaultLocale","isToday","date","isEqual","a","b","acopy","bcopy","isFutureDate","today","checkDate","isPastDate","getEventsForDate","events","event","getDaysInMonth","year","month","getFirstDayOfMonth","generateCalendarGrid","daysInMonth","firstDayOfMonth","prevMonthDays","prevMonth","prevMonthYear","daysInPrevMonth","i","day","currentMonthDays","nextMonthDays","daysToAdd","nextMonth","nextMonthYear","MonthCalendar","forwardRef","maxEventsPerDay","onEventClick","onDayClick","onMoreEventsClick","header","daySelector","locale","ellipsis","allowPastInteraction","className","rest","ref","selectedDate","setSelectedDate","useState","jsxs","jsx","index","dateObj","dateEvents","isPast","isSelected","eventIndex","e"],"mappings":"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"}
1
+ {"version":3,"file":"MonthCalendar.js","sources":["../../src/components/MonthCalendar.tsx"],"sourcesContent":["import React, { useState, forwardRef } from 'react'\n\n// DaisyUI classes\n// (No DaisyUI classes used in this component)\n\n// Types\nexport type CalendarEvent = {\n date: Date\n title: string\n color: string\n strikethrough?: boolean\n style?: React.CSSProperties\n}\n\nexport type CalendarLocale = {\n locale: string\n daysShort: string[]\n monthsLong: string[]\n moreText: string\n formatTime?: (date: Date) => string\n}\n\n// Default English locale\nconst defaultLocale: CalendarLocale = {\n locale: 'en',\n daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n monthsLong: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n moreText: 'more',\n}\n\n// Utility functions\nconst isToday = (date: Date) => isEqual(date, new Date())\n\nconst isEqual = (a: Date, b: Date) => {\n const acopy = new Date(a)\n const bcopy = new Date(b)\n acopy.setHours(0, 0, 0, 0)\n bcopy.setHours(0, 0, 0, 0)\n return bcopy.getTime() === acopy.getTime()\n}\n\nconst isFutureDate = (date: Date) => {\n const today = new Date()\n const checkDate = new Date(date)\n today.setHours(0, 0, 0, 0)\n checkDate.setHours(0, 0, 0, 0)\n return checkDate > today\n}\n\nconst isPastDate = (date: Date) => {\n const today = new Date()\n const checkDate = new Date(date)\n today.setHours(0, 0, 0, 0)\n checkDate.setHours(0, 0, 0, 0)\n return checkDate < today\n}\n\nconst getEventsForDate = <T extends CalendarEvent>(events: T[], date: Date) => {\n return events.filter(\n (event) =>\n event.date.getDate() === date.getDate() &&\n event.date.getMonth() === date.getMonth() &&\n event.date.getFullYear() === date.getFullYear()\n )\n}\n\nconst getDaysInMonth = (year: number, month: number) => {\n return new Date(year, month + 1, 0).getDate()\n}\n\nconst getFirstDayOfMonth = (year: number, month: number) => {\n return new Date(year, month, 1).getDay()\n}\n\nconst generateCalendarGrid = (year: number, month: number) => {\n const daysInMonth = getDaysInMonth(year, month)\n const firstDayOfMonth = getFirstDayOfMonth(year, month)\n\n const prevMonthDays = []\n\n if (firstDayOfMonth > 0) {\n const prevMonth = month === 0 ? 11 : month - 1\n const prevMonthYear = month === 0 ? year - 1 : year\n const daysInPrevMonth = getDaysInMonth(prevMonthYear, prevMonth)\n\n for (let i = 0; i < firstDayOfMonth; i++) {\n const day = daysInPrevMonth - firstDayOfMonth + i + 1\n prevMonthDays.push({\n day,\n month: prevMonth,\n year: prevMonthYear,\n isCurrentMonth: false,\n date: new Date(prevMonthYear, prevMonth, day),\n })\n }\n }\n\n const currentMonthDays = []\n\n for (let day = 1; day <= daysInMonth; day++) {\n currentMonthDays.push({\n day,\n month,\n year,\n isCurrentMonth: true,\n date: new Date(year, month, day),\n })\n }\n\n const nextMonthDays = []\n const totalDaysDisplayed = prevMonthDays.length + currentMonthDays.length\n const daysToAdd = 6 * 7 - totalDaysDisplayed\n\n if (daysToAdd > 0) {\n const nextMonth = month === 11 ? 0 : month + 1\n const nextMonthYear = month === 11 ? year + 1 : year\n\n for (let day = 1; day <= daysToAdd; day++) {\n nextMonthDays.push({\n day,\n month: nextMonth,\n year: nextMonthYear,\n isCurrentMonth: false,\n date: new Date(nextMonthYear, nextMonth, day),\n })\n }\n }\n\n return [...prevMonthDays, ...currentMonthDays, ...nextMonthDays]\n}\n\nexport interface MonthCalendarProps<T extends CalendarEvent = CalendarEvent>\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n date?: Date\n events?: T[]\n onEventClick?: (event: T) => void\n onDayClick?: (date: Date) => void\n locale?: CalendarLocale\n allowPastInteraction?: boolean\n maxEventsPerDay?: number\n onMoreEventsClick?: (date: Date, events: T[]) => void\n header?: boolean\n daySelector?: boolean\n ellipsis?: boolean\n 'data-testid'?: string\n}\n\nexport const MonthCalendar = forwardRef<HTMLDivElement, MonthCalendarProps>(\n <T extends CalendarEvent>(\n {\n date = new Date(),\n events = [],\n maxEventsPerDay = 5,\n onEventClick,\n onDayClick,\n onMoreEventsClick,\n header,\n daySelector,\n locale = defaultLocale,\n ellipsis,\n allowPastInteraction = false,\n className = '',\n 'data-testid': testId,\n ...rest\n }: MonthCalendarProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n ) => {\n const [selectedDate, setSelectedDate] = useState(new Date())\n\n const year = date.getFullYear()\n const month = date.getMonth()\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n return (\n <div\n ref={ref}\n className={`flex h-full w-full flex-col bg-base-100 ${className}`}\n data-testid={testId}\n {...rest}\n >\n {header && (\n <div className=\"mb-4 flex items-center justify-between\" data-testid={getTestId('header')}>\n <div>\n <h2 className=\"m-0 text-lg font-medium text-base-content\">\n {locale.monthsLong[month]} {year}\n </h2>\n </div>\n </div>\n )}\n\n {/* Weekday header */}\n <div className=\"grid grid-cols-7 border-b border-base-300\" data-testid={getTestId('weekday-header')}>\n {locale.daysShort.map((day, index) => (\n <div\n key={index}\n className=\"py-1 text-center text-xs font-medium uppercase text-base-content/60\"\n data-testid={getTestId(`weekday-${index}`)}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid flex-1 grid-cols-7 grid-rows-6 border-l border-base-300\" data-testid={getTestId('grid')}>\n {generateCalendarGrid(year, month).map((dateObj, index) => {\n const dateEvents = getEventsForDate(events as T[], dateObj.date)\n const isPast = isPastDate(dateObj.date) && !isToday(dateObj.date)\n const isSelected = daySelector && isEqual(dateObj.date, selectedDate)\n const dateKey = `${dateObj.year}-${dateObj.month + 1}-${dateObj.day}`\n\n return (\n <div\n key={index}\n className={`\n relative cursor-pointer overflow-hidden border-b border-r border-base-300 p-1\n hover:bg-base-200\n ${!dateObj.isCurrentMonth ? 'bg-base-200' : ''}\n ${isToday(dateObj.date) ? 'bg-primary/10' : ''}\n ${isPast ? 'opacity-60' : ''}\n ${isPast && !allowPastInteraction ? 'cursor-not-allowed' : ''}\n ${isSelected ? 'z-10 outline outline-2 outline-primary' : ''}\n `}\n data-testid={getTestId(`day-${dateKey}`)}\n onClick={() => {\n if (isPast && !allowPastInteraction) {\n return\n }\n\n if (daySelector) {\n setSelectedDate(dateObj.date)\n }\n\n setTimeout(() => {\n onDayClick?.(dateObj.date)\n }, 0)\n }}\n >\n {/* Date number */}\n <div className=\"mb-0.5 flex justify-center\">\n <span\n className={`\n flex items-center justify-center text-xs leading-none\n ${isToday(dateObj.date) ? 'font-bold text-primary' : 'text-base-content'}\n ${!dateObj.isCurrentMonth ? 'text-base-content/40' : ''}\n ${isPast && dateObj.isCurrentMonth ? 'text-base-content/40' : ''}\n `}\n data-testid={getTestId(`day-number-${dateKey}`)}\n >\n {dateObj.day}\n </span>\n </div>\n\n {/* Events container */}\n <div className=\"flex flex-col\">\n {dateEvents\n .slice(\n 0,\n dateEvents.length > maxEventsPerDay\n ? maxEventsPerDay - 1\n : maxEventsPerDay\n )\n .map((event, eventIndex) => (\n <div\n key={eventIndex}\n className={`\n flex cursor-pointer items-center rounded px-1 py-0.5 text-xs leading-none\n transition-colors hover:bg-base-content/5\n ${isFutureDate(event.date) ? 'text-base-content' : 'text-base-content'}\n ${event.strikethrough ? 'line-through' : ''}\n `}\n style={event.style}\n data-testid={getTestId(`event-${dateKey}-${eventIndex}`)}\n onClick={(e) => {\n e.stopPropagation()\n if (onEventClick) {\n onEventClick(event)\n }\n }}\n title={event.title}\n >\n <span\n className=\"mr-1.5 inline-block h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: event.color }}\n />\n <span\n className={`overflow-hidden whitespace-nowrap ${ellipsis ? 'text-ellipsis' : ''}`}\n >\n {event.title}\n </span>\n </div>\n ))}\n {dateEvents.length > maxEventsPerDay && (\n <div\n className=\"cursor-pointer rounded px-1 py-0.5 text-[11px] text-base-content/60 hover:bg-base-content/5\"\n data-testid={getTestId(`more-${dateKey}`)}\n onClick={(e) => {\n e.stopPropagation()\n if (onMoreEventsClick) {\n onMoreEventsClick(dateObj.date, dateEvents)\n }\n }}\n >\n +{dateEvents.length - maxEventsPerDay + 1} {locale.moreText}\n </div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )\n }\n) as <T extends CalendarEvent = CalendarEvent>(\n props: MonthCalendarProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n\n;(MonthCalendar as React.FC).displayName = 'MonthCalendar'\n"],"names":["defaultLocale","isToday","date","isEqual","a","b","acopy","bcopy","isFutureDate","today","checkDate","isPastDate","getEventsForDate","events","event","getDaysInMonth","year","month","getFirstDayOfMonth","generateCalendarGrid","daysInMonth","firstDayOfMonth","prevMonthDays","prevMonth","prevMonthYear","daysInPrevMonth","i","day","currentMonthDays","nextMonthDays","daysToAdd","nextMonth","nextMonthYear","MonthCalendar","forwardRef","maxEventsPerDay","onEventClick","onDayClick","onMoreEventsClick","header","daySelector","locale","ellipsis","allowPastInteraction","className","testId","rest","ref","selectedDate","setSelectedDate","useState","getTestId","suffix","jsxs","jsx","index","dateObj","dateEvents","isPast","isSelected","dateKey","eventIndex","e"],"mappings":"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"}
@@ -14,6 +14,7 @@ export interface QRCodeProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
14
14
  bordered?: boolean;
15
15
  status?: QRCodeStatus;
16
16
  onRefresh?: () => void;
17
+ 'data-testid'?: string;
17
18
  }
18
19
  export declare const QRCode: React.FC<QRCodeProps>;
19
20
  export default QRCode;
@@ -1,76 +1,105 @@
1
- import { jsx as e, jsxs as C } from "react/jsx-runtime";
2
- import { useRef as Q, useEffect as j } from "react";
3
- import k from "qrcode";
4
- import { useTheme as B } from "../hooks/useTheme.js";
5
- const L = "loading", $ = "loading-spinner", E = "loading-lg", I = "btn", M = "btn-sm", V = "btn-primary", G = ({
6
- value: d,
1
+ import { jsx as e, jsxs as w } from "react/jsx-runtime";
2
+ import { useRef as k, useEffect as B } from "react";
3
+ import L from "qrcode";
4
+ import { useTheme as E } from "../hooks/useTheme.js";
5
+ const M = "loading", T = "loading-spinner", V = "loading-lg", G = "btn", O = "btn-sm", P = "btn-primary", X = ({
6
+ value: f,
7
7
  size: t = 160,
8
- errorLevel: h = "M",
9
- icon: m,
10
- iconSize: n = 40,
11
- type: f = "canvas",
12
- color: y,
13
- bgColor: R,
14
- bordered: a = !0,
15
- status: s = "active",
16
- onRefresh: v,
17
- className: w = "",
18
- ...r
8
+ errorLevel: x = "M",
9
+ icon: g,
10
+ iconSize: a = 40,
11
+ type: h = "canvas",
12
+ color: $,
13
+ bgColor: Q,
14
+ bordered: s = !0,
15
+ status: i = "active",
16
+ onRefresh: p,
17
+ className: j = "",
18
+ "data-testid": n,
19
+ ...o
19
20
  }) => {
20
- const c = Q(null), { colors: x } = B(), p = y ?? x.foreground, g = R ?? x.background;
21
- j(() => {
22
- if (s !== "active" || !d || f !== "canvas") return;
21
+ const c = k(null), { colors: u } = E(), b = $ ?? u.foreground, v = Q ?? u.background;
22
+ B(() => {
23
+ if (i !== "active" || !f || h !== "canvas") return;
23
24
  (async () => {
24
25
  if (c.current)
25
26
  try {
26
- if (await k.toCanvas(c.current, d, {
27
+ if (await L.toCanvas(c.current, f, {
27
28
  width: t,
28
29
  margin: 1,
29
30
  color: {
30
- dark: p,
31
- light: g
31
+ dark: b,
32
+ light: v
32
33
  },
33
- errorCorrectionLevel: h
34
- }), m && c.current) {
34
+ errorCorrectionLevel: x
35
+ }), g && c.current) {
35
36
  const l = c.current.getContext("2d");
36
37
  if (l) {
37
- const i = new Image();
38
- i.crossOrigin = "anonymous", i.onload = () => {
39
- const b = (t - n) / 2, N = (t - n) / 2;
40
- l.fillStyle = g, l.fillRect(b - 4, N - 4, n + 8, n + 8), l.drawImage(i, b, N, n, n);
41
- }, i.src = m;
38
+ const m = new Image();
39
+ m.crossOrigin = "anonymous", m.onload = () => {
40
+ const y = (t - a) / 2, R = (t - a) / 2;
41
+ l.fillStyle = v, l.fillRect(y - 4, R - 4, a + 8, a + 8), l.drawImage(m, y, R, a, a);
42
+ }, m.src = g;
42
43
  }
43
44
  }
44
- } catch (u) {
45
- console.error("QR Code generation error:", u);
45
+ } catch (C) {
46
+ console.error("QR Code generation error:", C);
46
47
  }
47
48
  })();
48
- }, [d, t, h, m, n, f, p, g, s]);
49
- const o = [
49
+ }, [f, t, x, g, a, h, b, v, i]);
50
+ const d = [
50
51
  "inline-flex items-center justify-center",
51
- a && "border border-base-content/20 p-3",
52
+ s && "border border-base-content/20 p-3",
52
53
  "bg-base-100",
53
- w
54
- ].filter(Boolean).join(" ");
55
- return s === "loading" ? /* @__PURE__ */ e("div", { className: o, style: { width: t + (a ? 24 : 0), height: t + (a ? 24 : 0) }, "data-state": "loading", ...r, children: /* @__PURE__ */ C("div", { className: "flex flex-col items-center justify-center gap-2", children: [
56
- /* @__PURE__ */ e("span", { className: `${L} ${$} ${E}` }),
57
- /* @__PURE__ */ e("span", { className: "text-sm text-base-content/70", children: "Loading..." })
58
- ] }) }) : s === "expired" ? /* @__PURE__ */ e("div", { className: o, style: { width: t + (a ? 24 : 0), height: t + (a ? 24 : 0) }, "data-state": "expired", ...r, children: /* @__PURE__ */ C("div", { className: "flex flex-col items-center justify-center gap-2", children: [
59
- /* @__PURE__ */ e("svg", { className: "w-12 h-12 text-base-content/30", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ e(
60
- "path",
61
- {
62
- fillRule: "evenodd",
63
- d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z",
64
- clipRule: "evenodd"
65
- }
66
- ) }),
67
- /* @__PURE__ */ e("span", { className: "text-sm text-base-content/70", children: "QR Code Expired" }),
68
- v && /* @__PURE__ */ e("button", { className: `${I} ${M} ${V}`, onClick: v, children: "Refresh" })
69
- ] }) }) : f === "canvas" ? /* @__PURE__ */ e("div", { className: "inline-block", "data-state": "active", ...r, children: /* @__PURE__ */ e("div", { className: o, children: /* @__PURE__ */ e("canvas", { ref: c, style: { display: "block" } }) }) }) : /* @__PURE__ */ e("div", { className: "inline-block", "data-state": "active", ...r, children: /* @__PURE__ */ e("div", { className: o, children: /* @__PURE__ */ e("div", { style: { width: t, height: t }, className: "bg-base-content/5", children: /* @__PURE__ */ e("span", { className: "text-xs text-base-content/50", children: "SVG mode placeholder" }) }) }) });
54
+ j
55
+ ].filter(Boolean).join(" "), r = (N) => n ? `${n}-${N}` : void 0;
56
+ return i === "loading" ? /* @__PURE__ */ e(
57
+ "div",
58
+ {
59
+ className: d,
60
+ style: { width: t + (s ? 24 : 0), height: t + (s ? 24 : 0) },
61
+ "data-state": "loading",
62
+ "data-testid": n,
63
+ ...o,
64
+ children: /* @__PURE__ */ w("div", { className: "flex flex-col items-center justify-center gap-2", children: [
65
+ /* @__PURE__ */ e("span", { className: `${M} ${T} ${V}` }),
66
+ /* @__PURE__ */ e("span", { className: "text-sm text-base-content/70", "data-testid": r("loading-text"), children: "Loading..." })
67
+ ] })
68
+ }
69
+ ) : i === "expired" ? /* @__PURE__ */ e(
70
+ "div",
71
+ {
72
+ className: d,
73
+ style: { width: t + (s ? 24 : 0), height: t + (s ? 24 : 0) },
74
+ "data-state": "expired",
75
+ "data-testid": n,
76
+ ...o,
77
+ children: /* @__PURE__ */ w("div", { className: "flex flex-col items-center justify-center gap-2", children: [
78
+ /* @__PURE__ */ e("svg", { className: "w-12 h-12 text-base-content/30", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ e(
79
+ "path",
80
+ {
81
+ fillRule: "evenodd",
82
+ d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z",
83
+ clipRule: "evenodd"
84
+ }
85
+ ) }),
86
+ /* @__PURE__ */ e("span", { className: "text-sm text-base-content/70", "data-testid": r("expired-text"), children: "QR Code Expired" }),
87
+ p && /* @__PURE__ */ e(
88
+ "button",
89
+ {
90
+ className: `${G} ${O} ${P}`,
91
+ onClick: p,
92
+ "data-testid": r("refresh"),
93
+ children: "Refresh"
94
+ }
95
+ )
96
+ ] })
97
+ }
98
+ ) : h === "canvas" ? /* @__PURE__ */ e("div", { className: "inline-block", "data-state": "active", "data-testid": n, ...o, children: /* @__PURE__ */ e("div", { className: d, children: /* @__PURE__ */ e("canvas", { ref: c, style: { display: "block" }, "data-testid": r("canvas") }) }) }) : /* @__PURE__ */ e("div", { className: "inline-block", "data-state": "active", "data-testid": n, ...o, children: /* @__PURE__ */ e("div", { className: d, children: /* @__PURE__ */ e("div", { style: { width: t, height: t }, className: "bg-base-content/5", "data-testid": r("svg"), children: /* @__PURE__ */ e("span", { className: "text-xs text-base-content/50", children: "SVG mode placeholder" }) }) }) });
70
99
  };
71
- G.displayName = "QRCode";
100
+ X.displayName = "QRCode";
72
101
  export {
73
- G as QRCode,
74
- G as default
102
+ X as QRCode,
103
+ X as default
75
104
  };
76
105
  //# sourceMappingURL=QRCode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QRCode.js","sources":["../../src/components/QRCode.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport QRCodeLib from 'qrcode'\nimport { useTheme } from '../hooks/useTheme'\n\n// DaisyUI classes\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingLg = 'loading-lg'\nconst dBtn = 'btn'\nconst dBtnSm = 'btn-sm'\nconst dBtnPrimary = 'btn-primary'\n\nexport type QRCodeErrorLevel = 'L' | 'M' | 'Q' | 'H'\nexport type QRCodeType = 'canvas' | 'svg'\nexport type QRCodeStatus = 'active' | 'loading' | 'expired'\n\nexport interface QRCodeProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'color'> {\n value: string\n size?: number\n errorLevel?: QRCodeErrorLevel\n icon?: string\n iconSize?: number\n type?: QRCodeType\n color?: string\n bgColor?: string\n bordered?: boolean\n status?: QRCodeStatus\n onRefresh?: () => void\n}\n\nexport const QRCode: React.FC<QRCodeProps> = ({\n value,\n size = 160,\n errorLevel = 'M',\n icon,\n iconSize = 40,\n type = 'canvas',\n color,\n bgColor,\n bordered = true,\n status = 'active',\n onRefresh,\n className = '',\n ...rest\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const { colors } = useTheme()\n\n // Theme-aware default colors from DaisyUI CSS variables\n const effectiveColor = color ?? colors.foreground\n const effectiveBgColor = bgColor ?? colors.background\n\n useEffect(() => {\n if (status !== 'active' || !value || type !== 'canvas') return\n\n const generateQRCode = async () => {\n if (!canvasRef.current) return\n\n try {\n await QRCodeLib.toCanvas(canvasRef.current, value, {\n width: size,\n margin: 1,\n color: {\n dark: effectiveColor,\n light: effectiveBgColor,\n },\n errorCorrectionLevel: errorLevel,\n })\n\n if (icon && canvasRef.current) {\n const canvas = canvasRef.current\n const ctx = canvas.getContext('2d')\n if (ctx) {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.onload = () => {\n const iconX = (size - iconSize) / 2\n const iconY = (size - iconSize) / 2\n ctx.fillStyle = effectiveBgColor\n ctx.fillRect(iconX - 4, iconY - 4, iconSize + 8, iconSize + 8)\n ctx.drawImage(img, iconX, iconY, iconSize, iconSize)\n }\n img.src = icon\n }\n }\n } catch (error) {\n console.error('QR Code generation error:', error)\n }\n }\n\n generateQRCode()\n }, [value, size, errorLevel, icon, iconSize, type, effectiveColor, effectiveBgColor, status])\n\n // Download functionality can be implemented by consumers\n // by accessing the canvas ref and converting to data URL\n\n const containerClasses = [\n 'inline-flex items-center justify-center',\n bordered && 'border border-base-content/20 p-3',\n 'bg-base-100',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n if (status === 'loading') {\n return (\n <div className={containerClasses} style={{ width: size + (bordered ? 24 : 0), height: size + (bordered ? 24 : 0) }} data-state=\"loading\" {...rest}>\n <div className=\"flex flex-col items-center justify-center gap-2\">\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingLg}`}></span>\n <span className=\"text-sm text-base-content/70\">Loading...</span>\n </div>\n </div>\n )\n }\n\n if (status === 'expired') {\n return (\n <div className={containerClasses} style={{ width: size + (bordered ? 24 : 0), height: size + (bordered ? 24 : 0) }} data-state=\"expired\" {...rest}>\n <div className=\"flex flex-col items-center justify-center gap-2\">\n <svg className=\"w-12 h-12 text-base-content/30\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"text-sm text-base-content/70\">QR Code Expired</span>\n {onRefresh && (\n <button className={`${dBtn} ${dBtnSm} ${dBtnPrimary}`} onClick={onRefresh}>\n Refresh\n </button>\n )}\n </div>\n </div>\n )\n }\n\n if (type === 'canvas') {\n return (\n <div className=\"inline-block\" data-state=\"active\" {...rest}>\n <div className={containerClasses}>\n <canvas ref={canvasRef} style={{ display: 'block' }} />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"inline-block\" data-state=\"active\" {...rest}>\n <div className={containerClasses}>\n <div style={{ width: size, height: size }} className=\"bg-base-content/5\">\n <span className=\"text-xs text-base-content/50\">SVG mode placeholder</span>\n </div>\n </div>\n </div>\n )\n}\n\nQRCode.displayName = 'QRCode'\n\nexport default QRCode\n"],"names":["dLoading","dLoadingSpinner","dLoadingLg","dBtn","dBtnSm","dBtnPrimary","QRCode","value","size","errorLevel","icon","iconSize","type","color","bgColor","bordered","status","onRefresh","className","rest","canvasRef","useRef","colors","useTheme","effectiveColor","effectiveBgColor","useEffect","QRCodeLib","ctx","img","iconX","iconY","error","containerClasses","jsx","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"QRCode.js","sources":["../../src/components/QRCode.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport QRCodeLib from 'qrcode'\nimport { useTheme } from '../hooks/useTheme'\n\n// DaisyUI classes\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingLg = 'loading-lg'\nconst dBtn = 'btn'\nconst dBtnSm = 'btn-sm'\nconst dBtnPrimary = 'btn-primary'\n\nexport type QRCodeErrorLevel = 'L' | 'M' | 'Q' | 'H'\nexport type QRCodeType = 'canvas' | 'svg'\nexport type QRCodeStatus = 'active' | 'loading' | 'expired'\n\nexport interface QRCodeProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'color'> {\n value: string\n size?: number\n errorLevel?: QRCodeErrorLevel\n icon?: string\n iconSize?: number\n type?: QRCodeType\n color?: string\n bgColor?: string\n bordered?: boolean\n status?: QRCodeStatus\n onRefresh?: () => void\n 'data-testid'?: string\n}\n\nexport const QRCode: React.FC<QRCodeProps> = ({\n value,\n size = 160,\n errorLevel = 'M',\n icon,\n iconSize = 40,\n type = 'canvas',\n color,\n bgColor,\n bordered = true,\n status = 'active',\n onRefresh,\n className = '',\n 'data-testid': testId,\n ...rest\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const { colors } = useTheme()\n\n // Theme-aware default colors from DaisyUI CSS variables\n const effectiveColor = color ?? colors.foreground\n const effectiveBgColor = bgColor ?? colors.background\n\n useEffect(() => {\n if (status !== 'active' || !value || type !== 'canvas') return\n\n const generateQRCode = async () => {\n if (!canvasRef.current) return\n\n try {\n await QRCodeLib.toCanvas(canvasRef.current, value, {\n width: size,\n margin: 1,\n color: {\n dark: effectiveColor,\n light: effectiveBgColor,\n },\n errorCorrectionLevel: errorLevel,\n })\n\n if (icon && canvasRef.current) {\n const canvas = canvasRef.current\n const ctx = canvas.getContext('2d')\n if (ctx) {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.onload = () => {\n const iconX = (size - iconSize) / 2\n const iconY = (size - iconSize) / 2\n ctx.fillStyle = effectiveBgColor\n ctx.fillRect(iconX - 4, iconY - 4, iconSize + 8, iconSize + 8)\n ctx.drawImage(img, iconX, iconY, iconSize, iconSize)\n }\n img.src = icon\n }\n }\n } catch (error) {\n console.error('QR Code generation error:', error)\n }\n }\n\n generateQRCode()\n }, [value, size, errorLevel, icon, iconSize, type, effectiveColor, effectiveBgColor, status])\n\n // Download functionality can be implemented by consumers\n // by accessing the canvas ref and converting to data URL\n\n const containerClasses = [\n 'inline-flex items-center justify-center',\n bordered && 'border border-base-content/20 p-3',\n 'bg-base-100',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n if (status === 'loading') {\n return (\n <div\n className={containerClasses}\n style={{ width: size + (bordered ? 24 : 0), height: size + (bordered ? 24 : 0) }}\n data-state=\"loading\"\n data-testid={testId}\n {...rest}\n >\n <div className=\"flex flex-col items-center justify-center gap-2\">\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingLg}`}></span>\n <span className=\"text-sm text-base-content/70\" data-testid={getTestId('loading-text')}>Loading...</span>\n </div>\n </div>\n )\n }\n\n if (status === 'expired') {\n return (\n <div\n className={containerClasses}\n style={{ width: size + (bordered ? 24 : 0), height: size + (bordered ? 24 : 0) }}\n data-state=\"expired\"\n data-testid={testId}\n {...rest}\n >\n <div className=\"flex flex-col items-center justify-center gap-2\">\n <svg className=\"w-12 h-12 text-base-content/30\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"text-sm text-base-content/70\" data-testid={getTestId('expired-text')}>QR Code Expired</span>\n {onRefresh && (\n <button\n className={`${dBtn} ${dBtnSm} ${dBtnPrimary}`}\n onClick={onRefresh}\n data-testid={getTestId('refresh')}\n >\n Refresh\n </button>\n )}\n </div>\n </div>\n )\n }\n\n if (type === 'canvas') {\n return (\n <div className=\"inline-block\" data-state=\"active\" data-testid={testId} {...rest}>\n <div className={containerClasses}>\n <canvas ref={canvasRef} style={{ display: 'block' }} data-testid={getTestId('canvas')} />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"inline-block\" data-state=\"active\" data-testid={testId} {...rest}>\n <div className={containerClasses}>\n <div style={{ width: size, height: size }} className=\"bg-base-content/5\" data-testid={getTestId('svg')}>\n <span className=\"text-xs text-base-content/50\">SVG mode placeholder</span>\n </div>\n </div>\n </div>\n )\n}\n\nQRCode.displayName = 'QRCode'\n\nexport default QRCode\n"],"names":["dLoading","dLoadingSpinner","dLoadingLg","dBtn","dBtnSm","dBtnPrimary","QRCode","value","size","errorLevel","icon","iconSize","type","color","bgColor","bordered","status","onRefresh","className","testId","rest","canvasRef","useRef","colors","useTheme","effectiveColor","effectiveBgColor","useEffect","QRCodeLib","ctx","img","iconX","iconY","error","containerClasses","getTestId","suffix","jsx","jsxs"],"mappings":"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"}