@moontra/moonui 2.0.7 → 2.0.9

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 (94) hide show
  1. package/package.json +26 -19
  2. package/src/__tests__/use-intersection-observer.test.tsx +216 -0
  3. package/src/__tests__/use-local-storage.test.tsx +174 -0
  4. package/src/__tests__/use-pro-access.test.tsx +183 -0
  5. package/src/components/ui/__tests__/accordion.test.tsx +571 -0
  6. package/src/components/ui/__tests__/alert.test.tsx +484 -0
  7. package/src/components/ui/__tests__/aspect-ratio.test.tsx +492 -0
  8. package/src/components/ui/__tests__/avatar.test.tsx +382 -0
  9. package/src/components/ui/__tests__/badge.test.tsx +364 -0
  10. package/src/components/ui/__tests__/breadcrumb.test.tsx +687 -0
  11. package/src/components/ui/__tests__/button.test.tsx +91 -0
  12. package/src/components/ui/__tests__/card.test.tsx +104 -0
  13. package/src/components/ui/__tests__/checkbox.test.tsx +591 -0
  14. package/src/components/ui/__tests__/collapsible.test.tsx +592 -0
  15. package/src/components/ui/__tests__/color-picker.test.tsx +365 -0
  16. package/src/components/ui/__tests__/command.test.tsx +677 -0
  17. package/src/components/ui/__tests__/data-table.test.tsx +256 -0
  18. package/src/components/ui/__tests__/date-picker.test.tsx +320 -0
  19. package/src/components/ui/__tests__/dialog.test.tsx +764 -0
  20. package/src/components/ui/__tests__/input.test.tsx +318 -0
  21. package/src/components/ui/__tests__/label.test.tsx +103 -0
  22. package/src/components/ui/__tests__/popover.test.tsx +637 -0
  23. package/src/components/ui/__tests__/progress.test.tsx +382 -0
  24. package/src/components/ui/__tests__/radio-group.test.tsx +555 -0
  25. package/src/components/ui/__tests__/select.test.tsx +705 -0
  26. package/src/components/ui/__tests__/skeleton.test.tsx +253 -0
  27. package/src/components/ui/__tests__/slider.test.tsx +493 -0
  28. package/src/components/ui/__tests__/switch.test.tsx +372 -0
  29. package/src/components/ui/__tests__/table.test.tsx +824 -0
  30. package/src/components/ui/__tests__/tabs.test.tsx +887 -0
  31. package/src/components/ui/__tests__/toast.test.tsx +458 -0
  32. package/src/components/ui/__tests__/tooltip.test.tsx +583 -0
  33. package/src/components/ui/accordion.tsx +63 -0
  34. package/src/components/ui/alert.tsx +130 -0
  35. package/src/components/ui/aspect-ratio.tsx +72 -0
  36. package/src/components/ui/avatar.tsx +135 -0
  37. package/src/components/ui/badge.tsx +225 -0
  38. package/src/components/ui/breadcrumb.tsx +207 -0
  39. package/src/components/ui/button.stories.tsx +162 -0
  40. package/src/components/ui/button.tsx +221 -0
  41. package/src/components/ui/calendar.tsx +262 -0
  42. package/src/components/ui/card.stories.tsx +208 -0
  43. package/src/components/ui/card.tsx +141 -0
  44. package/src/components/ui/checkbox.tsx +256 -0
  45. package/src/components/ui/collapsible.tsx +129 -0
  46. package/src/components/ui/color-picker.tsx +664 -0
  47. package/src/components/ui/command.tsx +218 -0
  48. package/src/components/ui/data-table.stories.tsx +509 -0
  49. package/src/components/ui/data-table.tsx +623 -0
  50. package/src/components/ui/date-picker.stories.tsx +321 -0
  51. package/src/components/ui/date-picker.tsx +603 -0
  52. package/src/components/ui/dialog.tsx +332 -0
  53. package/src/components/ui/dropdown-menu.tsx +200 -0
  54. package/src/components/ui/file-upload.tsx +400 -0
  55. package/src/components/ui/github-stars.tsx +201 -0
  56. package/src/components/ui/index.ts +12 -0
  57. package/src/components/ui/input.stories.tsx +255 -0
  58. package/src/components/ui/input.tsx +219 -0
  59. package/src/components/ui/label.tsx +26 -0
  60. package/src/components/ui/locked-component.tsx +215 -0
  61. package/src/components/ui/moon-logo.tsx +97 -0
  62. package/src/components/ui/pagination.tsx +116 -0
  63. package/src/components/ui/popover.tsx +183 -0
  64. package/src/components/ui/progress.tsx +182 -0
  65. package/src/components/ui/radio-group.tsx +243 -0
  66. package/src/components/ui/select.tsx +273 -0
  67. package/src/components/ui/separator.tsx +140 -0
  68. package/src/components/ui/simple-editor.tsx +652 -0
  69. package/src/components/ui/skeleton.tsx +351 -0
  70. package/src/components/ui/slider.tsx +351 -0
  71. package/src/components/ui/switch.tsx +83 -0
  72. package/src/components/ui/table.tsx +322 -0
  73. package/src/components/ui/tabs.tsx +195 -0
  74. package/src/components/ui/textarea.tsx +46 -0
  75. package/src/components/ui/toast.tsx +313 -0
  76. package/src/components/ui/toggle.tsx +47 -0
  77. package/src/components/ui/tooltip.tsx +152 -0
  78. package/src/docs/theme-system.md +1194 -0
  79. package/src/index.tsx +39 -0
  80. package/src/lib/micro-interactions.ts +255 -0
  81. package/src/lib/theme.tsx +398 -0
  82. package/src/lib/utils.ts +69 -0
  83. package/src/styles/design-system.css +365 -0
  84. package/src/styles/index.css +4 -0
  85. package/src/styles/tailwind.css +6 -0
  86. package/src/styles/tokens.css +453 -0
  87. package/src/use-intersection-observer.tsx +154 -0
  88. package/src/use-local-storage.tsx +71 -0
  89. package/src/use-paddle.ts +138 -0
  90. package/src/use-performance-optimizer.ts +379 -0
  91. package/src/use-pro-access.ts +141 -0
  92. package/src/use-scroll-animation.ts +221 -0
  93. package/src/use-subscription.ts +37 -0
  94. package/src/use-toast.ts +32 -0
@@ -0,0 +1,321 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { DatePicker, DateRangePicker, DateTimePicker, MonthPicker } from './date-picker';
3
+ import { Label } from './label';
4
+ import { useState } from 'react';
5
+
6
+ const meta: Meta<typeof DatePicker> = {
7
+ title: 'Components/DatePicker',
8
+ component: DatePicker,
9
+ parameters: {
10
+ layout: 'centered',
11
+ docs: {
12
+ description: {
13
+ component: 'A collection of date picker components for various date selection needs.',
14
+ },
15
+ },
16
+ },
17
+ tags: ['autodocs'],
18
+ argTypes: {
19
+ date: {
20
+ description: 'The selected date',
21
+ },
22
+ onDateChange: {
23
+ description: 'Callback function when date changes',
24
+ },
25
+ disabled: {
26
+ control: 'boolean',
27
+ description: 'Whether the date picker is disabled',
28
+ },
29
+ },
30
+ };
31
+
32
+ export default meta;
33
+ type Story = StoryObj<typeof meta>;
34
+
35
+ export const Default: Story = {
36
+ render: () => {
37
+ const [date, setDate] = useState<Date | undefined>(new Date());
38
+
39
+ return (
40
+ <div className="space-y-4">
41
+ <div>
42
+ <Label>Select Date</Label>
43
+ <DatePicker
44
+ date={date}
45
+ onDateChange={setDate}
46
+ />
47
+ </div>
48
+ {date && (
49
+ <div className="text-sm text-muted-foreground">
50
+ Selected: {date.toLocaleDateString()}
51
+ </div>
52
+ )}
53
+ </div>
54
+ );
55
+ },
56
+ };
57
+
58
+ export const WithoutDefaultDate: Story = {
59
+ render: () => {
60
+ const [date, setDate] = useState<Date | undefined>(undefined);
61
+
62
+ return (
63
+ <div className="space-y-4">
64
+ <div>
65
+ <Label>Select Date</Label>
66
+ <DatePicker
67
+ date={date}
68
+ onDateChange={setDate}
69
+ />
70
+ </div>
71
+ {date && (
72
+ <div className="text-sm text-muted-foreground">
73
+ Selected: {date.toLocaleDateString()}
74
+ </div>
75
+ )}
76
+ </div>
77
+ );
78
+ },
79
+ };
80
+
81
+ export const Disabled: Story = {
82
+ render: () => {
83
+ const [date, setDate] = useState<Date | undefined>(new Date());
84
+
85
+ return (
86
+ <div className="space-y-4">
87
+ <div>
88
+ <Label>Disabled Date Picker</Label>
89
+ <DatePicker
90
+ date={date}
91
+ onDateChange={setDate}
92
+ disabled={true}
93
+ />
94
+ </div>
95
+ </div>
96
+ );
97
+ },
98
+ };
99
+
100
+ export const DateRange: Story = {
101
+ render: () => {
102
+ const [dateRange, setDateRange] = useState<{
103
+ from: Date | undefined;
104
+ to: Date | undefined;
105
+ }>({ from: undefined, to: undefined });
106
+
107
+ return (
108
+ <div className="space-y-4">
109
+ <div>
110
+ <Label>Select Date Range</Label>
111
+ <DateRangePicker
112
+ dateRange={dateRange}
113
+ onDateRangeChange={setDateRange}
114
+ />
115
+ </div>
116
+ {(dateRange.from || dateRange.to) && (
117
+ <div className="text-sm text-muted-foreground">
118
+ From: {dateRange.from?.toLocaleDateString() || 'Not selected'}<br />
119
+ To: {dateRange.to?.toLocaleDateString() || 'Not selected'}
120
+ </div>
121
+ )}
122
+ </div>
123
+ );
124
+ },
125
+ };
126
+
127
+ export const DateTime: Story = {
128
+ render: () => {
129
+ const [dateTime, setDateTime] = useState<Date | undefined>(new Date());
130
+
131
+ return (
132
+ <div className="space-y-4">
133
+ <div>
134
+ <Label>Select Date and Time</Label>
135
+ <DateTimePicker
136
+ date={dateTime}
137
+ onDateChange={setDateTime}
138
+ />
139
+ </div>
140
+ {dateTime && (
141
+ <div className="text-sm text-muted-foreground">
142
+ Selected: {dateTime.toLocaleString()}
143
+ </div>
144
+ )}
145
+ </div>
146
+ );
147
+ },
148
+ };
149
+
150
+ export const MonthOnly: Story = {
151
+ render: () => {
152
+ const [month, setMonth] = useState<Date | undefined>(new Date());
153
+
154
+ return (
155
+ <div className="space-y-4">
156
+ <div>
157
+ <Label>Select Month</Label>
158
+ <MonthPicker
159
+ month={month}
160
+ onMonthChange={setMonth}
161
+ />
162
+ </div>
163
+ {month && (
164
+ <div className="text-sm text-muted-foreground">
165
+ Selected: {month.toLocaleDateString('en-US', { month: 'long', year: 'numeric' })}
166
+ </div>
167
+ )}
168
+ </div>
169
+ );
170
+ },
171
+ };
172
+
173
+ export const FormExample: Story = {
174
+ render: () => {
175
+ const [formData, setFormData] = useState({
176
+ birthDate: undefined as Date | undefined,
177
+ eventDateRange: { from: undefined as Date | undefined, to: undefined as Date | undefined },
178
+ appointmentDateTime: undefined as Date | undefined,
179
+ reportingMonth: undefined as Date | undefined,
180
+ });
181
+
182
+ return (
183
+ <div className="w-full max-w-lg space-y-6">
184
+ <div className="space-y-2">
185
+ <Label>Birth Date</Label>
186
+ <DatePicker
187
+ date={formData.birthDate}
188
+ onDateChange={(date) => setFormData(prev => ({ ...prev, birthDate: date }))}
189
+ />
190
+ </div>
191
+
192
+ <div className="space-y-2">
193
+ <Label>Event Date Range</Label>
194
+ <DateRangePicker
195
+ dateRange={formData.eventDateRange}
196
+ onDateRangeChange={(range) => setFormData(prev => ({ ...prev, eventDateRange: range }))}
197
+ />
198
+ </div>
199
+
200
+ <div className="space-y-2">
201
+ <Label>Appointment Date & Time</Label>
202
+ <DateTimePicker
203
+ date={formData.appointmentDateTime}
204
+ onDateChange={(date) => setFormData(prev => ({ ...prev, appointmentDateTime: date }))}
205
+ />
206
+ </div>
207
+
208
+ <div className="space-y-2">
209
+ <Label>Reporting Month</Label>
210
+ <MonthPicker
211
+ month={formData.reportingMonth}
212
+ onMonthChange={(month) => setFormData(prev => ({ ...prev, reportingMonth: month }))}
213
+ />
214
+ </div>
215
+
216
+ <div className="pt-4 border-t">
217
+ <h3 className="font-semibold mb-2">Form Data:</h3>
218
+ <pre className="text-xs bg-muted p-2 rounded">
219
+ {JSON.stringify(
220
+ {
221
+ birthDate: formData.birthDate?.toISOString(),
222
+ eventDateRange: {
223
+ from: formData.eventDateRange.from?.toISOString(),
224
+ to: formData.eventDateRange.to?.toISOString(),
225
+ },
226
+ appointmentDateTime: formData.appointmentDateTime?.toISOString(),
227
+ reportingMonth: formData.reportingMonth?.toISOString(),
228
+ },
229
+ null,
230
+ 2
231
+ )}
232
+ </pre>
233
+ </div>
234
+ </div>
235
+ );
236
+ },
237
+ };
238
+
239
+ export const CustomFormats: Story = {
240
+ render: () => {
241
+ const [date, setDate] = useState<Date | undefined>(new Date());
242
+
243
+ return (
244
+ <div className="space-y-4">
245
+ <div>
246
+ <Label>Date with Custom Format</Label>
247
+ <DatePicker
248
+ date={date}
249
+ onDateChange={setDate}
250
+ />
251
+ </div>
252
+ {date && (
253
+ <div className="space-y-2">
254
+ <div className="text-sm">
255
+ <strong>Different Formats:</strong>
256
+ </div>
257
+ <div className="text-sm text-muted-foreground space-y-1">
258
+ <div>ISO: {date.toISOString().split('T')[0]}</div>
259
+ <div>US: {date.toLocaleDateString('en-US')}</div>
260
+ <div>UK: {date.toLocaleDateString('en-GB')}</div>
261
+ <div>Long: {date.toLocaleDateString('en-US', {
262
+ weekday: 'long',
263
+ year: 'numeric',
264
+ month: 'long',
265
+ day: 'numeric'
266
+ })}</div>
267
+ </div>
268
+ </div>
269
+ )}
270
+ </div>
271
+ );
272
+ },
273
+ };
274
+
275
+ export const AllVariants: Story = {
276
+ render: () => {
277
+ const [singleDate, setSingleDate] = useState<Date | undefined>(new Date());
278
+ const [dateRange, setDateRange] = useState<{
279
+ from: Date | undefined;
280
+ to: Date | undefined;
281
+ }>({ from: new Date(), to: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) });
282
+ const [dateTime, setDateTime] = useState<Date | undefined>(new Date());
283
+ const [month, setMonth] = useState<Date | undefined>(new Date());
284
+
285
+ return (
286
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
287
+ <div className="space-y-2">
288
+ <Label>Single Date</Label>
289
+ <DatePicker
290
+ date={singleDate}
291
+ onDateChange={setSingleDate}
292
+ />
293
+ </div>
294
+
295
+ <div className="space-y-2">
296
+ <Label>Date Range</Label>
297
+ <DateRangePicker
298
+ dateRange={dateRange}
299
+ onDateRangeChange={setDateRange}
300
+ />
301
+ </div>
302
+
303
+ <div className="space-y-2">
304
+ <Label>Date & Time</Label>
305
+ <DateTimePicker
306
+ date={dateTime}
307
+ onDateChange={setDateTime}
308
+ />
309
+ </div>
310
+
311
+ <div className="space-y-2">
312
+ <Label>Month Only</Label>
313
+ <MonthPicker
314
+ month={month}
315
+ onMonthChange={setMonth}
316
+ />
317
+ </div>
318
+ </div>
319
+ );
320
+ },
321
+ };