@moontra/moonui-pro 2.20.2 → 2.20.3
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 +8 -3
- package/plugin/index.d.ts +86 -0
- package/plugin/index.js +308 -0
- package/scripts/postinstall.js +176 -23
- package/src/components/advanced-chart/index.tsx +0 -1246
- package/src/components/advanced-forms/index.tsx +0 -585
- package/src/components/animated-button/index.tsx +0 -385
- package/src/components/calendar/event-dialog.tsx +0 -377
- package/src/components/calendar/index.tsx +0 -1220
- package/src/components/calendar-pro/index.tsx +0 -1697
- package/src/components/color-picker/index.tsx +0 -432
- package/src/components/credit-card-input/index.tsx +0 -406
- package/src/components/dashboard/dashboard-grid.tsx +0 -480
- package/src/components/dashboard/demo.tsx +0 -425
- package/src/components/dashboard/index.tsx +0 -1046
- package/src/components/dashboard/time-range-picker.tsx +0 -336
- package/src/components/dashboard/types.ts +0 -225
- package/src/components/dashboard/widgets/activity-feed.tsx +0 -349
- package/src/components/dashboard/widgets/chart-widget.tsx +0 -418
- package/src/components/dashboard/widgets/comparison-widget.tsx +0 -177
- package/src/components/dashboard/widgets/index.ts +0 -5
- package/src/components/dashboard/widgets/metric-card.tsx +0 -363
- package/src/components/dashboard/widgets/progress-widget.tsx +0 -113
- package/src/components/data-table/data-table-bulk-actions.tsx +0 -204
- package/src/components/data-table/data-table-column-toggle.tsx +0 -169
- package/src/components/data-table/data-table-export.ts +0 -156
- package/src/components/data-table/data-table-filter-drawer.tsx +0 -448
- package/src/components/data-table/index.tsx +0 -845
- package/src/components/draggable-list/index.tsx +0 -100
- package/src/components/error-boundary/index.tsx +0 -232
- package/src/components/file-upload/index.tsx +0 -1660
- package/src/components/floating-action-button/index.tsx +0 -206
- package/src/components/form-wizard/form-wizard-context.tsx +0 -335
- package/src/components/form-wizard/form-wizard-navigation.tsx +0 -118
- package/src/components/form-wizard/form-wizard-progress.tsx +0 -329
- package/src/components/form-wizard/form-wizard-step.tsx +0 -111
- package/src/components/form-wizard/index.tsx +0 -102
- package/src/components/form-wizard/types.ts +0 -77
- package/src/components/gesture-drawer/index.tsx +0 -551
- package/src/components/github-stars/github-api.ts +0 -426
- package/src/components/github-stars/hooks.ts +0 -517
- package/src/components/github-stars/index.tsx +0 -375
- package/src/components/github-stars/types.ts +0 -148
- package/src/components/github-stars/variants.tsx +0 -515
- package/src/components/health-check/index.tsx +0 -439
- package/src/components/hover-card-3d/index.tsx +0 -529
- package/src/components/index.ts +0 -130
- package/src/components/internal/index.ts +0 -78
- package/src/components/kanban/add-card-modal.tsx +0 -502
- package/src/components/kanban/card-detail-modal.tsx +0 -761
- package/src/components/kanban/index.ts +0 -13
- package/src/components/kanban/kanban.tsx +0 -1689
- package/src/components/kanban/types.ts +0 -168
- package/src/components/lazy-component/index.tsx +0 -823
- package/src/components/license-error/index.tsx +0 -31
- package/src/components/magnetic-button/index.tsx +0 -216
- package/src/components/memory-efficient-data/index.tsx +0 -1018
- package/src/components/moonui-quiz-form/index.tsx +0 -817
- package/src/components/navbar/index.tsx +0 -781
- package/src/components/optimized-image/index.tsx +0 -425
- package/src/components/performance-debugger/index.tsx +0 -613
- package/src/components/performance-monitor/index.tsx +0 -808
- package/src/components/phone-number-input/index.tsx +0 -343
- package/src/components/phone-number-input/phone-number-input-simple.tsx +0 -167
- package/src/components/pinch-zoom/index.tsx +0 -566
- package/src/components/quiz-form/index.tsx +0 -479
- package/src/components/rich-text-editor/index.tsx +0 -2322
- package/src/components/rich-text-editor/slash-commands-extension.ts +0 -230
- package/src/components/rich-text-editor/slash-commands.css +0 -35
- package/src/components/rich-text-editor/table-styles.css +0 -65
- package/src/components/sidebar/index.tsx +0 -884
- package/src/components/spotlight-card/index.tsx +0 -191
- package/src/components/swipeable-card/index.tsx +0 -100
- package/src/components/timeline/index.tsx +0 -1183
- package/src/components/ui/accordion.tsx +0 -581
- package/src/components/ui/alert-dialog.tsx +0 -141
- package/src/components/ui/alert.tsx +0 -141
- package/src/components/ui/aspect-ratio.tsx +0 -245
- package/src/components/ui/avatar.tsx +0 -155
- package/src/components/ui/badge.tsx +0 -230
- package/src/components/ui/breadcrumb.tsx +0 -216
- package/src/components/ui/button.tsx +0 -228
- package/src/components/ui/calendar.tsx +0 -387
- package/src/components/ui/card.tsx +0 -216
- package/src/components/ui/checkbox.tsx +0 -259
- package/src/components/ui/collapsible.tsx +0 -631
- package/src/components/ui/color-picker.tsx +0 -97
- package/src/components/ui/command.tsx +0 -948
- package/src/components/ui/dialog.tsx +0 -752
- package/src/components/ui/dropdown-menu.tsx +0 -706
- package/src/components/ui/gesture-drawer.tsx +0 -11
- package/src/components/ui/hover-card.tsx +0 -29
- package/src/components/ui/index.ts +0 -222
- package/src/components/ui/input.tsx +0 -224
- package/src/components/ui/label.tsx +0 -29
- package/src/components/ui/lightbox.tsx +0 -606
- package/src/components/ui/magnetic-button.tsx +0 -129
- package/src/components/ui/media-gallery.tsx +0 -611
- package/src/components/ui/navigation-menu.tsx +0 -130
- package/src/components/ui/pagination.tsx +0 -125
- package/src/components/ui/popover.tsx +0 -185
- package/src/components/ui/progress.tsx +0 -30
- package/src/components/ui/radio-group.tsx +0 -257
- package/src/components/ui/scroll-area.tsx +0 -47
- package/src/components/ui/select.tsx +0 -378
- package/src/components/ui/separator.tsx +0 -145
- package/src/components/ui/sheet.tsx +0 -139
- package/src/components/ui/skeleton.tsx +0 -20
- package/src/components/ui/slider.tsx +0 -354
- package/src/components/ui/spotlight-card.tsx +0 -119
- package/src/components/ui/switch.tsx +0 -86
- package/src/components/ui/table.tsx +0 -331
- package/src/components/ui/tabs-pro.tsx +0 -542
- package/src/components/ui/tabs.tsx +0 -54
- package/src/components/ui/textarea.tsx +0 -28
- package/src/components/ui/toast.tsx +0 -317
- package/src/components/ui/toggle.tsx +0 -119
- package/src/components/ui/tooltip.tsx +0 -151
- package/src/components/virtual-list/index.tsx +0 -668
- package/src/hooks/use-chart.ts +0 -205
- package/src/hooks/use-data-table.ts +0 -182
- package/src/hooks/use-docs-pro-access.ts +0 -13
- package/src/hooks/use-license-check.ts +0 -65
- package/src/hooks/use-subscription.ts +0 -19
- package/src/hooks/use-toast.ts +0 -15
- package/src/index.ts +0 -22
- package/src/lib/ai-providers.ts +0 -377
- package/src/lib/component-metadata.ts +0 -18
- package/src/lib/micro-interactions.ts +0 -255
- package/src/lib/paddle.ts +0 -17
- package/src/lib/utils.ts +0 -6
- package/src/patterns/login-form/index.tsx +0 -276
- package/src/patterns/login-form/types.ts +0 -67
- package/src/setupTests.ts +0 -41
- package/src/styles/advanced-chart.css +0 -239
- package/src/styles/calendar.css +0 -35
- package/src/styles/design-system.css +0 -363
- package/src/styles/index.css +0 -681
- package/src/styles/tailwind.css +0 -7
- package/src/styles/tokens.css +0 -455
- package/src/types/next-auth.d.ts +0 -21
- package/src/use-intersection-observer.tsx +0 -154
- package/src/use-local-storage.tsx +0 -71
- package/src/use-paddle.ts +0 -138
- package/src/use-performance-optimizer.ts +0 -389
- package/src/use-pro-access.ts +0 -141
- package/src/use-scroll-animation.ts +0 -219
- package/src/use-subscription.ts +0 -37
- package/src/use-toast.ts +0 -32
- package/src/utils/chart-helpers.ts +0 -357
- package/src/utils/cn.ts +0 -6
- package/src/utils/data-processing.ts +0 -151
- package/src/utils/license-validator.tsx +0 -183
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import React, { ReactNode } from "react"
|
|
4
|
-
import { DragDropContext, Droppable, Draggable, DropResult } from "@hello-pangea/dnd"
|
|
5
|
-
import { cn } from '../../lib/utils'
|
|
6
|
-
|
|
7
|
-
export interface DraggableListProps<T> {
|
|
8
|
-
items: T[]
|
|
9
|
-
onReorder: (items: T[]) => void
|
|
10
|
-
renderItem: (item: T, index: number) => ReactNode
|
|
11
|
-
keyExtractor: (item: T) => string
|
|
12
|
-
direction?: "vertical" | "horizontal"
|
|
13
|
-
className?: string
|
|
14
|
-
droppableId?: string
|
|
15
|
-
disabled?: boolean
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function DraggableList<T>({
|
|
19
|
-
items,
|
|
20
|
-
onReorder,
|
|
21
|
-
renderItem,
|
|
22
|
-
keyExtractor,
|
|
23
|
-
direction = "vertical",
|
|
24
|
-
className,
|
|
25
|
-
droppableId = "draggable-list",
|
|
26
|
-
disabled = false,
|
|
27
|
-
}: DraggableListProps<T>) {
|
|
28
|
-
const handleDragEnd = (result: DropResult) => {
|
|
29
|
-
if (!result.destination || disabled) {
|
|
30
|
-
return
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const sourceIndex = result.source.index
|
|
34
|
-
const destinationIndex = result.destination.index
|
|
35
|
-
|
|
36
|
-
if (sourceIndex === destinationIndex) {
|
|
37
|
-
return
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const newItems = Array.from(items)
|
|
41
|
-
const [reorderedItem] = newItems.splice(sourceIndex, 1)
|
|
42
|
-
newItems.splice(destinationIndex, 0, reorderedItem)
|
|
43
|
-
|
|
44
|
-
onReorder(newItems)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<DragDropContext onDragEnd={handleDragEnd}>
|
|
49
|
-
<Droppable
|
|
50
|
-
droppableId={droppableId}
|
|
51
|
-
direction={direction}
|
|
52
|
-
isDropDisabled={disabled}
|
|
53
|
-
>
|
|
54
|
-
{(provided, snapshot) => (
|
|
55
|
-
<div
|
|
56
|
-
{...provided.droppableProps}
|
|
57
|
-
ref={provided.innerRef}
|
|
58
|
-
className={cn(
|
|
59
|
-
"space-y-2",
|
|
60
|
-
direction === "horizontal" && "flex space-y-0 space-x-2",
|
|
61
|
-
snapshot.isDraggingOver && "bg-muted/50 rounded-lg",
|
|
62
|
-
className
|
|
63
|
-
)}
|
|
64
|
-
>
|
|
65
|
-
{items.map((item, index) => (
|
|
66
|
-
<Draggable
|
|
67
|
-
key={keyExtractor(item)}
|
|
68
|
-
draggableId={keyExtractor(item)}
|
|
69
|
-
index={index}
|
|
70
|
-
isDragDisabled={disabled}
|
|
71
|
-
>
|
|
72
|
-
{(provided, snapshot) => (
|
|
73
|
-
<div
|
|
74
|
-
ref={provided.innerRef}
|
|
75
|
-
{...provided.draggableProps}
|
|
76
|
-
{...provided.dragHandleProps}
|
|
77
|
-
className={cn(
|
|
78
|
-
"transition-all duration-200",
|
|
79
|
-
snapshot.isDragging && "rotate-2 scale-105 shadow-lg z-50",
|
|
80
|
-
disabled && "cursor-not-allowed opacity-50"
|
|
81
|
-
)}
|
|
82
|
-
style={{
|
|
83
|
-
...provided.draggableProps.style,
|
|
84
|
-
transform: snapshot.isDragging
|
|
85
|
-
? provided.draggableProps.style?.transform
|
|
86
|
-
: "none",
|
|
87
|
-
}}
|
|
88
|
-
>
|
|
89
|
-
{renderItem(item, index)}
|
|
90
|
-
</div>
|
|
91
|
-
)}
|
|
92
|
-
</Draggable>
|
|
93
|
-
))}
|
|
94
|
-
{provided.placeholder}
|
|
95
|
-
</div>
|
|
96
|
-
)}
|
|
97
|
-
</Droppable>
|
|
98
|
-
</DragDropContext>
|
|
99
|
-
)
|
|
100
|
-
}
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import React, { Component, ErrorInfo, ReactNode, ComponentType, useEffect, useRef } from "react"
|
|
4
|
-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
|
|
5
|
-
import { Button } from "../ui/button"
|
|
6
|
-
import { AlertTriangle, RefreshCw, Lock, Sparkles } from "lucide-react"
|
|
7
|
-
import { cn } from "../../lib/utils"
|
|
8
|
-
import { useSubscription } from "../../hooks/use-subscription"
|
|
9
|
-
|
|
10
|
-
// Types for error fallback component props
|
|
11
|
-
export interface ErrorFallbackProps {
|
|
12
|
-
error: Error
|
|
13
|
-
resetErrorBoundary: () => void
|
|
14
|
-
errorInfo?: ErrorInfo
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface ErrorBoundaryProps {
|
|
18
|
-
children: ReactNode
|
|
19
|
-
fallback?: ComponentType<ErrorFallbackProps> | ReactNode
|
|
20
|
-
className?: string
|
|
21
|
-
onError?: (error: Error, errorInfo: ErrorInfo) => void
|
|
22
|
-
onReset?: () => void
|
|
23
|
-
isolate?: boolean
|
|
24
|
-
resetKeys?: unknown[]
|
|
25
|
-
resetOnPropsChange?: boolean
|
|
26
|
-
showErrorDetails?: boolean
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
interface ErrorBoundaryState {
|
|
30
|
-
hasError: boolean
|
|
31
|
-
error?: Error
|
|
32
|
-
errorInfo?: ErrorInfo
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
class ErrorBoundaryInternal extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
36
|
-
resetTimeoutId: NodeJS.Timeout | null = null
|
|
37
|
-
previousResetKeys: unknown[] = []
|
|
38
|
-
|
|
39
|
-
constructor(props: ErrorBoundaryProps) {
|
|
40
|
-
super(props)
|
|
41
|
-
this.state = { hasError: false }
|
|
42
|
-
this.previousResetKeys = props.resetKeys || []
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {
|
|
46
|
-
return { hasError: true, error }
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
componentDidCatch(error: Error, errorInfo: ErrorInfo) {
|
|
50
|
-
const { onError, isolate } = this.props
|
|
51
|
-
|
|
52
|
-
// Store error info in state for fallback component
|
|
53
|
-
this.setState({ errorInfo })
|
|
54
|
-
|
|
55
|
-
// Call error handler if provided
|
|
56
|
-
onError?.(error, errorInfo)
|
|
57
|
-
|
|
58
|
-
// Log error (with isolation context if applicable)
|
|
59
|
-
if (isolate) {
|
|
60
|
-
console.error('[Isolated ErrorBoundary] caught an error:', error, errorInfo)
|
|
61
|
-
} else {
|
|
62
|
-
console.error('ErrorBoundary caught an error:', error, errorInfo)
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
componentDidUpdate(prevProps: ErrorBoundaryProps) {
|
|
67
|
-
const { resetKeys, resetOnPropsChange } = this.props
|
|
68
|
-
const { hasError } = this.state
|
|
69
|
-
|
|
70
|
-
// Check if we should reset based on resetKeys change
|
|
71
|
-
if (hasError && resetKeys) {
|
|
72
|
-
const hasResetKeyChanged = resetKeys.some(
|
|
73
|
-
(key, index) => key !== this.previousResetKeys[index]
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
if (hasResetKeyChanged) {
|
|
77
|
-
this.previousResetKeys = resetKeys
|
|
78
|
-
this.resetErrorBoundary()
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Reset on any props change if enabled
|
|
83
|
-
if (hasError && resetOnPropsChange && prevProps !== this.props) {
|
|
84
|
-
// Avoid resetting due to children changes
|
|
85
|
-
const propsWithoutChildren = { ...this.props, children: null }
|
|
86
|
-
const prevPropsWithoutChildren = { ...prevProps, children: null }
|
|
87
|
-
|
|
88
|
-
if (JSON.stringify(propsWithoutChildren) !== JSON.stringify(prevPropsWithoutChildren)) {
|
|
89
|
-
this.resetErrorBoundary()
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
resetErrorBoundary = () => {
|
|
95
|
-
const { onReset } = this.props
|
|
96
|
-
onReset?.()
|
|
97
|
-
this.setState({ hasError: false, error: undefined, errorInfo: undefined })
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
renderFallback() {
|
|
101
|
-
const { fallback, className, showErrorDetails } = this.props
|
|
102
|
-
const { error, errorInfo } = this.state
|
|
103
|
-
|
|
104
|
-
if (!error) return null
|
|
105
|
-
|
|
106
|
-
// If custom fallback is provided
|
|
107
|
-
if (fallback) {
|
|
108
|
-
// If fallback is a component
|
|
109
|
-
if (typeof fallback === 'function') {
|
|
110
|
-
const FallbackComponent = fallback as ComponentType<ErrorFallbackProps>
|
|
111
|
-
return (
|
|
112
|
-
<FallbackComponent
|
|
113
|
-
error={error}
|
|
114
|
-
resetErrorBoundary={this.resetErrorBoundary}
|
|
115
|
-
errorInfo={errorInfo}
|
|
116
|
-
/>
|
|
117
|
-
)
|
|
118
|
-
}
|
|
119
|
-
// If fallback is a ReactNode
|
|
120
|
-
return fallback
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Default fallback UI
|
|
124
|
-
return (
|
|
125
|
-
<div className={cn("flex items-center justify-center min-h-[200px] p-4", className)}>
|
|
126
|
-
<Card className="w-full max-w-md">
|
|
127
|
-
<CardHeader className="text-center">
|
|
128
|
-
<div className="mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/20">
|
|
129
|
-
<AlertTriangle className="h-6 w-6 text-red-600 dark:text-red-400" />
|
|
130
|
-
</div>
|
|
131
|
-
<CardTitle>Something went wrong</CardTitle>
|
|
132
|
-
<CardDescription>
|
|
133
|
-
{showErrorDetails && process.env.NODE_ENV === 'development'
|
|
134
|
-
? error.message
|
|
135
|
-
: "An error occurred while rendering this component"}
|
|
136
|
-
</CardDescription>
|
|
137
|
-
</CardHeader>
|
|
138
|
-
<CardContent className="text-center">
|
|
139
|
-
{showErrorDetails && process.env.NODE_ENV === 'development' && (
|
|
140
|
-
<div className="mb-4 p-3 bg-muted rounded-md text-left">
|
|
141
|
-
<pre className="text-xs overflow-auto">
|
|
142
|
-
<code>{error.stack}</code>
|
|
143
|
-
</pre>
|
|
144
|
-
</div>
|
|
145
|
-
)}
|
|
146
|
-
<Button
|
|
147
|
-
onClick={this.resetErrorBoundary}
|
|
148
|
-
className="mt-4"
|
|
149
|
-
>
|
|
150
|
-
<RefreshCw className="mr-2 h-4 w-4" />
|
|
151
|
-
Try again
|
|
152
|
-
</Button>
|
|
153
|
-
</CardContent>
|
|
154
|
-
</Card>
|
|
155
|
-
</div>
|
|
156
|
-
)
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
render() {
|
|
160
|
-
const { hasError } = this.state
|
|
161
|
-
const { children, isolate } = this.props
|
|
162
|
-
|
|
163
|
-
if (hasError) {
|
|
164
|
-
// If isolate is true, prevent error propagation
|
|
165
|
-
if (isolate) {
|
|
166
|
-
try {
|
|
167
|
-
return this.renderFallback()
|
|
168
|
-
} catch (fallbackError) {
|
|
169
|
-
// If fallback also fails, show minimal error UI
|
|
170
|
-
console.error('Error boundary fallback failed:', fallbackError)
|
|
171
|
-
return (
|
|
172
|
-
<div className="p-4 text-center text-red-600">
|
|
173
|
-
Critical error: Unable to recover
|
|
174
|
-
</div>
|
|
175
|
-
)
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return this.renderFallback()
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return children
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
componentWillUnmount() {
|
|
185
|
-
if (this.resetTimeoutId) {
|
|
186
|
-
clearTimeout(this.resetTimeoutId)
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Functional wrapper to handle Pro subscription check
|
|
192
|
-
function ErrorBoundaryWrapper(props: ErrorBoundaryProps) {
|
|
193
|
-
const { hasProAccess, isLoading } = useSubscription()
|
|
194
|
-
const prevResetKeysRef = useRef(props.resetKeys)
|
|
195
|
-
|
|
196
|
-
// Track resetKeys changes for functional component
|
|
197
|
-
useEffect(() => {
|
|
198
|
-
prevResetKeysRef.current = props.resetKeys
|
|
199
|
-
}, [props.resetKeys])
|
|
200
|
-
|
|
201
|
-
// If not in docs mode and no pro access, show upgrade prompt
|
|
202
|
-
if (!isLoading && !hasProAccess) {
|
|
203
|
-
return (
|
|
204
|
-
<Card className={cn("w-fit", props.className)}>
|
|
205
|
-
<CardContent className="py-6 text-center">
|
|
206
|
-
<div className="space-y-4">
|
|
207
|
-
<div className="rounded-full bg-purple-100 dark:bg-purple-900/30 p-3 w-fit mx-auto">
|
|
208
|
-
<Lock className="h-6 w-6 text-purple-600 dark:text-purple-400" />
|
|
209
|
-
</div>
|
|
210
|
-
<div>
|
|
211
|
-
<h3 className="font-semibold text-sm mb-2">Pro Feature</h3>
|
|
212
|
-
<p className="text-muted-foreground text-xs mb-4">
|
|
213
|
-
Error Boundary is available exclusively to MoonUI Pro subscribers.
|
|
214
|
-
</p>
|
|
215
|
-
<a href="/pricing">
|
|
216
|
-
<Button size="sm">
|
|
217
|
-
<Sparkles className="mr-2 h-4 w-4" />
|
|
218
|
-
Upgrade to Pro
|
|
219
|
-
</Button>
|
|
220
|
-
</a>
|
|
221
|
-
</div>
|
|
222
|
-
</div>
|
|
223
|
-
</CardContent>
|
|
224
|
-
</Card>
|
|
225
|
-
)
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
return <ErrorBoundaryInternal {...props} />
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
export const ErrorBoundary = ErrorBoundaryWrapper
|
|
232
|
-
export type { ErrorBoundaryProps }
|