@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.
- package/package.json +26 -19
- package/src/__tests__/use-intersection-observer.test.tsx +216 -0
- package/src/__tests__/use-local-storage.test.tsx +174 -0
- package/src/__tests__/use-pro-access.test.tsx +183 -0
- package/src/components/ui/__tests__/accordion.test.tsx +571 -0
- package/src/components/ui/__tests__/alert.test.tsx +484 -0
- package/src/components/ui/__tests__/aspect-ratio.test.tsx +492 -0
- package/src/components/ui/__tests__/avatar.test.tsx +382 -0
- package/src/components/ui/__tests__/badge.test.tsx +364 -0
- package/src/components/ui/__tests__/breadcrumb.test.tsx +687 -0
- package/src/components/ui/__tests__/button.test.tsx +91 -0
- package/src/components/ui/__tests__/card.test.tsx +104 -0
- package/src/components/ui/__tests__/checkbox.test.tsx +591 -0
- package/src/components/ui/__tests__/collapsible.test.tsx +592 -0
- package/src/components/ui/__tests__/color-picker.test.tsx +365 -0
- package/src/components/ui/__tests__/command.test.tsx +677 -0
- package/src/components/ui/__tests__/data-table.test.tsx +256 -0
- package/src/components/ui/__tests__/date-picker.test.tsx +320 -0
- package/src/components/ui/__tests__/dialog.test.tsx +764 -0
- package/src/components/ui/__tests__/input.test.tsx +318 -0
- package/src/components/ui/__tests__/label.test.tsx +103 -0
- package/src/components/ui/__tests__/popover.test.tsx +637 -0
- package/src/components/ui/__tests__/progress.test.tsx +382 -0
- package/src/components/ui/__tests__/radio-group.test.tsx +555 -0
- package/src/components/ui/__tests__/select.test.tsx +705 -0
- package/src/components/ui/__tests__/skeleton.test.tsx +253 -0
- package/src/components/ui/__tests__/slider.test.tsx +493 -0
- package/src/components/ui/__tests__/switch.test.tsx +372 -0
- package/src/components/ui/__tests__/table.test.tsx +824 -0
- package/src/components/ui/__tests__/tabs.test.tsx +887 -0
- package/src/components/ui/__tests__/toast.test.tsx +458 -0
- package/src/components/ui/__tests__/tooltip.test.tsx +583 -0
- package/src/components/ui/accordion.tsx +63 -0
- package/src/components/ui/alert.tsx +130 -0
- package/src/components/ui/aspect-ratio.tsx +72 -0
- package/src/components/ui/avatar.tsx +135 -0
- package/src/components/ui/badge.tsx +225 -0
- package/src/components/ui/breadcrumb.tsx +207 -0
- package/src/components/ui/button.stories.tsx +162 -0
- package/src/components/ui/button.tsx +221 -0
- package/src/components/ui/calendar.tsx +262 -0
- package/src/components/ui/card.stories.tsx +208 -0
- package/src/components/ui/card.tsx +141 -0
- package/src/components/ui/checkbox.tsx +256 -0
- package/src/components/ui/collapsible.tsx +129 -0
- package/src/components/ui/color-picker.tsx +664 -0
- package/src/components/ui/command.tsx +218 -0
- package/src/components/ui/data-table.stories.tsx +509 -0
- package/src/components/ui/data-table.tsx +623 -0
- package/src/components/ui/date-picker.stories.tsx +321 -0
- package/src/components/ui/date-picker.tsx +603 -0
- package/src/components/ui/dialog.tsx +332 -0
- package/src/components/ui/dropdown-menu.tsx +200 -0
- package/src/components/ui/file-upload.tsx +400 -0
- package/src/components/ui/github-stars.tsx +201 -0
- package/src/components/ui/index.ts +12 -0
- package/src/components/ui/input.stories.tsx +255 -0
- package/src/components/ui/input.tsx +219 -0
- package/src/components/ui/label.tsx +26 -0
- package/src/components/ui/locked-component.tsx +215 -0
- package/src/components/ui/moon-logo.tsx +97 -0
- package/src/components/ui/pagination.tsx +116 -0
- package/src/components/ui/popover.tsx +183 -0
- package/src/components/ui/progress.tsx +182 -0
- package/src/components/ui/radio-group.tsx +243 -0
- package/src/components/ui/select.tsx +273 -0
- package/src/components/ui/separator.tsx +140 -0
- package/src/components/ui/simple-editor.tsx +652 -0
- package/src/components/ui/skeleton.tsx +351 -0
- package/src/components/ui/slider.tsx +351 -0
- package/src/components/ui/switch.tsx +83 -0
- package/src/components/ui/table.tsx +322 -0
- package/src/components/ui/tabs.tsx +195 -0
- package/src/components/ui/textarea.tsx +46 -0
- package/src/components/ui/toast.tsx +313 -0
- package/src/components/ui/toggle.tsx +47 -0
- package/src/components/ui/tooltip.tsx +152 -0
- package/src/docs/theme-system.md +1194 -0
- package/src/index.tsx +39 -0
- package/src/lib/micro-interactions.ts +255 -0
- package/src/lib/theme.tsx +398 -0
- package/src/lib/utils.ts +69 -0
- package/src/styles/design-system.css +365 -0
- package/src/styles/index.css +4 -0
- package/src/styles/tailwind.css +6 -0
- package/src/styles/tokens.css +453 -0
- package/src/use-intersection-observer.tsx +154 -0
- package/src/use-local-storage.tsx +71 -0
- package/src/use-paddle.ts +138 -0
- package/src/use-performance-optimizer.ts +379 -0
- package/src/use-pro-access.ts +141 -0
- package/src/use-scroll-animation.ts +221 -0
- package/src/use-subscription.ts +37 -0
- 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
|
+
};
|