@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,91 @@
|
|
|
1
|
+
import { render, screen, fireEvent } from '@testing-library/react'
|
|
2
|
+
import { Button } from '../button'
|
|
3
|
+
|
|
4
|
+
describe('Button Component', () => {
|
|
5
|
+
it('renders correctly with default props', () => {
|
|
6
|
+
render(<Button>Click me</Button>)
|
|
7
|
+
const button = screen.getByRole('button', { name: /click me/i })
|
|
8
|
+
expect(button).toBeInTheDocument()
|
|
9
|
+
expect(button).toHaveClass('bg-primary')
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
it('renders different variants correctly', () => {
|
|
13
|
+
const { rerender } = render(<Button variant="secondary">Secondary</Button>)
|
|
14
|
+
expect(screen.getByRole('button')).toHaveClass('bg-secondary')
|
|
15
|
+
expect(screen.getByRole('button')).toHaveClass('text-secondary-foreground')
|
|
16
|
+
|
|
17
|
+
rerender(<Button variant="outline">Outline</Button>)
|
|
18
|
+
expect(screen.getByRole('button')).toHaveClass('bg-background')
|
|
19
|
+
expect(screen.getByRole('button')).toHaveClass('text-foreground')
|
|
20
|
+
|
|
21
|
+
rerender(<Button variant="ghost">Ghost</Button>)
|
|
22
|
+
expect(screen.getByRole('button')).toHaveClass('text-foreground')
|
|
23
|
+
|
|
24
|
+
rerender(<Button variant="link">Link</Button>)
|
|
25
|
+
expect(screen.getByRole('button')).toHaveClass('text-primary')
|
|
26
|
+
expect(screen.getByRole('button')).toHaveClass('underline-offset-4')
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
it('renders different sizes correctly', () => {
|
|
30
|
+
const { rerender } = render(<Button size="sm">Small</Button>)
|
|
31
|
+
expect(screen.getByRole('button')).toHaveClass('h-8')
|
|
32
|
+
expect(screen.getByRole('button')).toHaveClass('px-3')
|
|
33
|
+
expect(screen.getByRole('button')).toHaveClass('text-sm')
|
|
34
|
+
|
|
35
|
+
rerender(<Button size="lg">Large</Button>)
|
|
36
|
+
expect(screen.getByRole('button')).toHaveClass('h-12')
|
|
37
|
+
expect(screen.getByRole('button')).toHaveClass('px-6')
|
|
38
|
+
expect(screen.getByRole('button')).toHaveClass('text-lg')
|
|
39
|
+
|
|
40
|
+
rerender(<Button size="icon">Icon</Button>)
|
|
41
|
+
const button = screen.getByRole('button')
|
|
42
|
+
expect(button).toHaveClass('h-10')
|
|
43
|
+
expect(button).toHaveClass('w-10')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('handles disabled state correctly', () => {
|
|
47
|
+
render(<Button disabled>Disabled</Button>)
|
|
48
|
+
const button = screen.getByRole('button')
|
|
49
|
+
expect(button).toBeDisabled()
|
|
50
|
+
expect(button).toHaveClass('disabled:pointer-events-none')
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('handles click events', () => {
|
|
54
|
+
const handleClick = jest.fn()
|
|
55
|
+
render(<Button onClick={handleClick}>Click me</Button>)
|
|
56
|
+
|
|
57
|
+
fireEvent.click(screen.getByRole('button'))
|
|
58
|
+
expect(handleClick).toHaveBeenCalledTimes(1)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('does not trigger click when disabled', () => {
|
|
62
|
+
const handleClick = jest.fn()
|
|
63
|
+
render(<Button disabled onClick={handleClick}>Disabled</Button>)
|
|
64
|
+
|
|
65
|
+
fireEvent.click(screen.getByRole('button'))
|
|
66
|
+
expect(handleClick).not.toHaveBeenCalled()
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
it('renders as child component when asChild is true', () => {
|
|
70
|
+
render(
|
|
71
|
+
<Button asChild>
|
|
72
|
+
<a href="/test">Link Button</a>
|
|
73
|
+
</Button>
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
const link = screen.getByRole('link')
|
|
77
|
+
expect(link).toBeInTheDocument()
|
|
78
|
+
expect(link).toHaveAttribute('href', '/test')
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
it('applies custom className', () => {
|
|
82
|
+
render(<Button className="custom-class">Custom</Button>)
|
|
83
|
+
expect(screen.getByRole('button')).toHaveClass('custom-class')
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
it('forwards ref correctly', () => {
|
|
87
|
+
const ref = jest.fn()
|
|
88
|
+
render(<Button ref={ref}>Button</Button>)
|
|
89
|
+
expect(ref).toHaveBeenCalled()
|
|
90
|
+
})
|
|
91
|
+
})
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react'
|
|
2
|
+
import { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } from '../card'
|
|
3
|
+
|
|
4
|
+
describe('Card Components', () => {
|
|
5
|
+
describe('Card', () => {
|
|
6
|
+
it('renders correctly with default props', () => {
|
|
7
|
+
render(<Card data-testid="card">Card content</Card>)
|
|
8
|
+
const card = screen.getByTestId('card')
|
|
9
|
+
expect(card).toBeInTheDocument()
|
|
10
|
+
expect(card).toHaveClass('rounded-lg')
|
|
11
|
+
expect(card).toHaveClass('border')
|
|
12
|
+
expect(card).toHaveClass('bg-card')
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('applies custom className', () => {
|
|
16
|
+
render(<Card className="custom-card" data-testid="card">Content</Card>)
|
|
17
|
+
expect(screen.getByTestId('card')).toHaveClass('custom-card')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('forwards ref correctly', () => {
|
|
21
|
+
const ref = jest.fn()
|
|
22
|
+
render(<Card ref={ref}>Content</Card>)
|
|
23
|
+
expect(ref).toHaveBeenCalled()
|
|
24
|
+
})
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
describe('CardHeader', () => {
|
|
28
|
+
it('renders correctly', () => {
|
|
29
|
+
render(<CardHeader data-testid="header">Header content</CardHeader>)
|
|
30
|
+
const header = screen.getByTestId('header')
|
|
31
|
+
expect(header).toBeInTheDocument()
|
|
32
|
+
expect(header).toHaveClass('flex')
|
|
33
|
+
expect(header).toHaveClass('flex-col')
|
|
34
|
+
expect(header).toHaveClass('space-y-1.5')
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
describe('CardTitle', () => {
|
|
39
|
+
it('renders correctly', () => {
|
|
40
|
+
render(<CardTitle data-testid="title">Card Title</CardTitle>)
|
|
41
|
+
const title = screen.getByTestId('title')
|
|
42
|
+
expect(title).toBeInTheDocument()
|
|
43
|
+
expect(title).toHaveClass('text-lg')
|
|
44
|
+
expect(title).toHaveClass('font-semibold')
|
|
45
|
+
expect(title).toHaveClass('leading-none')
|
|
46
|
+
expect(title).toHaveClass('tracking-tight')
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
describe('CardDescription', () => {
|
|
51
|
+
it('renders correctly', () => {
|
|
52
|
+
render(<CardDescription data-testid="description">Card description</CardDescription>)
|
|
53
|
+
const description = screen.getByTestId('description')
|
|
54
|
+
expect(description).toBeInTheDocument()
|
|
55
|
+
expect(description).toHaveClass('text-sm')
|
|
56
|
+
expect(description).toHaveClass('text-muted-foreground')
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
describe('CardContent', () => {
|
|
61
|
+
it('renders correctly', () => {
|
|
62
|
+
render(<CardContent data-testid="content">Card Content</CardContent>)
|
|
63
|
+
const content = screen.getByTestId('content')
|
|
64
|
+
expect(content).toBeInTheDocument()
|
|
65
|
+
expect(content).toHaveClass('pt-0')
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
describe('CardFooter', () => {
|
|
70
|
+
it('renders correctly', () => {
|
|
71
|
+
render(<CardFooter data-testid="footer">Card Footer</CardFooter>)
|
|
72
|
+
const footer = screen.getByTestId('footer')
|
|
73
|
+
expect(footer).toBeInTheDocument()
|
|
74
|
+
expect(footer).toHaveClass('flex')
|
|
75
|
+
expect(footer).toHaveClass('items-center')
|
|
76
|
+
expect(footer).toHaveClass('pt-4')
|
|
77
|
+
})
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
describe('Complete Card Structure', () => {
|
|
81
|
+
it('renders full card structure correctly', () => {
|
|
82
|
+
render(
|
|
83
|
+
<Card data-testid="full-card">
|
|
84
|
+
<CardHeader>
|
|
85
|
+
<CardTitle>Test Title</CardTitle>
|
|
86
|
+
<CardDescription>Test Description</CardDescription>
|
|
87
|
+
</CardHeader>
|
|
88
|
+
<CardContent>
|
|
89
|
+
<p>Test content</p>
|
|
90
|
+
</CardContent>
|
|
91
|
+
<CardFooter>
|
|
92
|
+
<button>Action</button>
|
|
93
|
+
</CardFooter>
|
|
94
|
+
</Card>
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
expect(screen.getByTestId('full-card')).toBeInTheDocument()
|
|
98
|
+
expect(screen.getByText('Test Title')).toBeInTheDocument()
|
|
99
|
+
expect(screen.getByText('Test Description')).toBeInTheDocument()
|
|
100
|
+
expect(screen.getByText('Test content')).toBeInTheDocument()
|
|
101
|
+
expect(screen.getByRole('button', { name: 'Action' })).toBeInTheDocument()
|
|
102
|
+
})
|
|
103
|
+
})
|
|
104
|
+
})
|