diff --git a/servers/nextjs/app/api/layouts/route.ts b/servers/nextjs/app/api/layouts/route.ts
new file mode 100644
index 00000000..8ab38ce6
--- /dev/null
+++ b/servers/nextjs/app/api/layouts/route.ts
@@ -0,0 +1,29 @@
+import { NextResponse } from 'next/server'
+import { promises as fs } from 'fs'
+import path from 'path'
+
+export async function GET() {
+ try {
+ // Get the path to the layouts directory
+ const layoutsDirectory = path.join(process.cwd(), 'components', 'layouts')
+
+ // Read all files in the layouts directory
+ const files = await fs.readdir(layoutsDirectory)
+
+ // Filter for .tsx files and exclude any non-layout files
+ const layoutFiles = files.filter(file =>
+ file.endsWith('.tsx') &&
+ !file.startsWith('.') &&
+ !file.includes('.test.') &&
+ !file.includes('.spec.')
+ )
+
+ return NextResponse.json(layoutFiles)
+ } catch (error) {
+ console.error('Error reading layouts directory:', error)
+ return NextResponse.json(
+ { error: 'Failed to read layouts directory' },
+ { status: 500 }
+ )
+ }
+}
\ No newline at end of file
diff --git a/servers/nextjs/app/globals.css b/servers/nextjs/app/globals.css
index c972e6db..6c02fcac 100644
--- a/servers/nextjs/app/globals.css
+++ b/servers/nextjs/app/globals.css
@@ -79,6 +79,9 @@ body {
strong{
@apply font-black ;
}
+
+
+
::selection {
background-color: hsl(var(--chart-1));
color: white;
diff --git a/servers/nextjs/app/layout-preview/README.md b/servers/nextjs/app/layout-preview/README.md
new file mode 100644
index 00000000..75ab0824
--- /dev/null
+++ b/servers/nextjs/app/layout-preview/README.md
@@ -0,0 +1,137 @@
+# Layout Preview Studio
+
+A modular, responsive layout preview system for viewing and testing presentation layout components with realistic sample data.
+
+## ✨ Features
+
+- **Dynamic Layout Discovery**: Automatically discovers and loads layout components
+- **Interactive Navigation**: Easy navigation with quick select grid
+- **Beautiful Presentation Display**: Mock browser frame with professional styling
+- **Detailed Information Panel**: Layout metadata and sample data inspection
+- **Responsive Design**: Mobile-friendly with collapsible sidebar
+- **Professional Loading States**: Skeleton loaders and error handling
+- **Type Safety**: Full TypeScript support with shared types
+
+## 🏗️ Architecture
+
+The system is built with a modular architecture for maintainability and reusability:
+
+```
+layout-preview/
+├── components/ # Modular UI components
+│ ├── LayoutNavigation.tsx # Navigation controls & layout selector
+│ ├── LayoutDisplay.tsx # Main layout preview area
+│ ├── LayoutInfoPanel.tsx # Information and data structure display
+│ └── LoadingStates.tsx # Loading, error, and empty states
+├── hooks/ # Custom React hooks
+│ └── useLayoutLoader.ts # Layout loading logic and state management
+├── utils/ # Utility functions
+│ └── sampleDataGenerator.ts # Realistic sample data generation
+├── types/ # Shared TypeScript types
+│ └── index.ts # Common interfaces and types
+├── page.tsx # Main page component
+└── README.md # This file
+```
+
+## 🧩 Components
+
+### LayoutNavigation
+- Previous/Next navigation buttons
+- Layout counter and current layout info
+- Quick select grid for fast switching
+- Responsive design with mobile optimization
+
+### LayoutDisplay
+- Mock browser frame presentation
+- Layout rendering with sample data
+- Professional shadow and styling effects
+- Empty state with helpful messaging
+
+### LayoutInfoPanel
+- Layout metadata display
+- Collapsible sample data viewer
+- Copy to clipboard functionality
+- Position tracking in collection
+
+### LoadingStates
+- Loading spinner with animated dots
+- Error state with retry functionality
+- Empty state with helpful instructions
+- Skeleton loading animations
+
+## 🎯 Custom Hooks
+
+### useLayoutLoader
+Handles all layout loading logic:
+- Fetches layout files from API
+- Imports and validates components
+- Generates realistic sample data
+- Provides retry functionality
+- Manages loading and error states
+
+## 🛠️ Utilities
+
+### sampleDataGenerator
+Intelligent sample data generation:
+- Context-aware field value generation
+- Support for images, emails, phones, URLs
+- Realistic business content
+- Zod schema parsing and validation
+- Array and object handling
+
+## 📱 Responsive Design
+
+The layout preview system is fully responsive:
+- **Desktop**: Sidebar navigation with main preview area
+- **Tablet**: Collapsible navigation panels
+- **Mobile**: Stacked layout with touch-friendly controls
+
+## 🎨 Styling
+
+Built with:
+- **Tailwind CSS**: Utility-first styling
+- **shadcn/ui**: Consistent component library
+- **Gradient Backgrounds**: Modern visual appeal
+- **Glass Morphism**: Backdrop blur effects
+- **Smooth Animations**: Hover and transition effects
+
+## 🔧 Usage
+
+The system automatically discovers layout components that export:
+```typescript
+// Layout component
+export default function MyLayout({ data }: { data: any }) {
+ return
{/* Your layout */}
+}
+
+// Zod schema for type safety and sample data generation
+export const Schema = z.object({
+ title: z.string(),
+ description: z.string(),
+ // ... other fields
+})
+```
+
+## 🚀 Getting Started
+
+1. **Add Layout Components**: Place your layout files in the appropriate directory
+2. **Export Requirements**: Ensure each layout exports both a default component and Schema
+3. **Navigate**: Use the navigation controls or quick select grid
+4. **Inspect**: View layout information and sample data structure
+5. **Test**: See how your layouts render with realistic data
+
+## 🎯 Benefits
+
+- **Modular Architecture**: Easy to maintain and extend
+- **Type Safety**: Full TypeScript support prevents runtime errors
+- **Beautiful UI**: Professional design that's pleasant to use
+- **Developer Experience**: Quick feedback loop for layout development
+- **Responsive**: Works on all device sizes
+- **Accessible**: Keyboard navigation and screen reader support
+
+## 📈 Performance
+
+- **Lazy Loading**: Components are imported only when needed
+- **Optimized Rendering**: Efficient re-renders with React best practices
+- **Minimal Bundle**: Modular structure enables tree shaking
+- **Caching**: Sample data generation is memoized
\ No newline at end of file
diff --git a/servers/nextjs/app/layout-preview/components/LoadingStates.tsx b/servers/nextjs/app/layout-preview/components/LoadingStates.tsx
new file mode 100644
index 00000000..e2d3e548
--- /dev/null
+++ b/servers/nextjs/app/layout-preview/components/LoadingStates.tsx
@@ -0,0 +1,185 @@
+'use client'
+import React from 'react'
+import { Card, CardContent } from '@/components/ui/card'
+import { Button } from '@/components/ui/button'
+import { Loader2, AlertCircle, RefreshCw, FileX, Layers } from 'lucide-react'
+
+interface LoadingStatesProps {
+ type: 'loading' | 'error' | 'empty'
+ message?: string
+ onRetry?: () => void
+}
+
+const LoadingStates: React.FC = ({
+ type,
+ message,
+ onRetry
+}) => {
+ if (type === 'loading') {
+ return (
+
+
+
+
+
+
+
+ Loading Layouts
+
+
+ {message || 'Discovering and loading layout components...'}
+
+
+
+ {/* Loading animation dots */}
+
+
+
+
+ )
+ }
+
+ if (type === 'error') {
+ return (
+
+
+
+
+
+
+
+ Something went wrong
+
+
+ {message || 'Failed to load layouts. Please check your layout files and try again.'}
+
+
+
+ {onRetry && (
+
+
+ Try Again
+
+ )}
+
+
+
+ )
+ }
+
+ if (type === 'empty') {
+ return (
+
+
+
+
+
+
+
+
+
+ No Layouts Found
+
+
+ No valid layout files were discovered. Make sure your layout components export both a default component and a Schema.
+
+
+
+
+
Expected structure:
+
+ export default MyLayout
+ export const Schema = z.object(...)
+
+
+
+ {onRetry && (
+
+
+ Refresh
+
+ )}
+
+
+
+ )
+ }
+
+ return null
+}
+
+// Component for layout grid skeleton while loading
+export const LayoutGridSkeleton: React.FC = () => {
+ return (
+
+ {/* Header Skeleton */}
+
+
+ {/* Main Content Skeleton */}
+
+
+ {/* Sidebar Skeleton */}
+
+
+
+
+
+
+ {[...Array(6)].map((_, i) => (
+
+ ))}
+
+
+
+
+
+ {/* Main Display Skeleton */}
+
+
+
+
+ )
+}
+
+export default LoadingStates
\ No newline at end of file
diff --git a/servers/nextjs/app/layout-preview/hooks/useLayoutLoader.ts b/servers/nextjs/app/layout-preview/hooks/useLayoutLoader.ts
new file mode 100644
index 00000000..57c45f9d
--- /dev/null
+++ b/servers/nextjs/app/layout-preview/hooks/useLayoutLoader.ts
@@ -0,0 +1,136 @@
+'use client'
+import { useState, useEffect } from 'react'
+
+import { LayoutInfo } from '../types'
+import { toast } from '@/hooks/use-toast'
+
+interface UseLayoutLoaderReturn {
+ layouts: LayoutInfo[]
+ loading: boolean
+ error: string | null
+ retry: () => void
+}
+
+export const useLayoutLoader = (): UseLayoutLoaderReturn => {
+ const [layouts, setLayouts] = useState([])
+ const [loading, setLoading] = useState(true)
+ const [error, setError] = useState(null)
+
+ const loadAllLayouts = async () => {
+ try {
+ setLoading(true)
+ setError(null)
+
+ const response = await fetch('/api/layouts')
+ if (!response.ok) {
+ toast({
+ title: 'Error loading layouts',
+ description: response.statusText,
+
+ })
+ return
+ }
+
+ const layoutFiles: string[] = await response.json()
+ const loadedLayouts: LayoutInfo[] = []
+
+ for (const fileName of layoutFiles) {
+ try {
+ const layoutName = fileName.replace('.tsx', '').replace('.ts', '')
+ const module = await import(`@/components/layouts/${layoutName}`)
+
+ if (!module.default) {
+ toast({
+ title: `${layoutName} has no default export`,
+ description: 'Please ensure the layout file exports a default component',
+
+ })
+ console.warn(`${layoutName} has no default export`)
+ continue
+ }
+
+ if (!module.Schema) {
+ toast({
+ title: `${layoutName} is missing required Schema export`,
+ description: 'Please ensure the layout file exports a Schema',
+
+
+ })
+ console.error(`${layoutName} is missing required Schema export`)
+ continue
+ }
+
+ // Use empty object to let schema apply its default values
+ // User will need to provide actual data when using the layouts
+ const sampleData = module.Schema.parse({})
+
+ loadedLayouts.push({
+ name: layoutName,
+ component: module.default,
+ schema: module.Schema,
+ sampleData,
+ fileName
+ })
+
+ } catch (importError) {
+ console.error(`Failed to import ${fileName}:`, importError)
+
+ // Try alternative import path
+ try {
+ const layoutName = fileName.replace('.tsx', '').replace('.ts', '')
+ const module = await import(`@/components/layouts/${layoutName}`)
+
+ if (module.default && module.Schema) {
+ // Use empty object to let schema apply its default values
+ const sampleData = module.Schema.parse({})
+ loadedLayouts.push({
+ name: layoutName,
+ component: module.default,
+ schema: module.Schema,
+ sampleData,
+ fileName
+ })
+ } else {
+ console.error(`${layoutName} is missing required exports (default component or Schema)`)
+ }
+ } catch (altError) {
+ console.error(`Alternative import also failed for ${fileName}:`, altError)
+ }
+ }
+ }
+
+ if (loadedLayouts.length === 0) {
+ toast({
+ title: 'No valid layouts found',
+ description: 'Make sure your layout files export both a default component and a Schema.',
+
+ })
+ setError('No valid layouts found. Make sure your layout files export both a default component and a Schema.')
+ } else {
+ setLayouts(loadedLayouts)
+ setError(null)
+ }
+
+ } catch (error) {
+ console.error('Error loading layouts:', error)
+ setError(error instanceof Error ? error.message : 'Failed to load layouts')
+ } finally {
+ setLoading(false)
+ }
+ }
+
+ const retry = () => {
+ loadAllLayouts()
+ }
+
+ useEffect(() => {
+ loadAllLayouts()
+ }, [])
+
+ return {
+ layouts,
+ loading,
+ error,
+ retry
+ }
+}
\ No newline at end of file
diff --git a/servers/nextjs/app/layout-preview/page.tsx b/servers/nextjs/app/layout-preview/page.tsx
new file mode 100644
index 00000000..10df0d96
--- /dev/null
+++ b/servers/nextjs/app/layout-preview/page.tsx
@@ -0,0 +1,86 @@
+'use client'
+import React from 'react'
+import { useLayoutLoader } from './hooks/useLayoutLoader'
+import LoadingStates from './components/LoadingStates'
+import { Card } from '@/components/ui/card'
+
+/**
+ * Layout Preview Page
+ *
+ * Simple vertical display of all layout components with their sample data.
+ */
+const LayoutPreview = () => {
+ const { layouts, loading, error, retry } = useLayoutLoader()
+
+ // Handle loading state
+ if (loading) {
+ return
+ }
+
+ // Handle error state
+ if (error) {
+ return
+ }
+
+ // Handle empty state
+ if (layouts.length === 0) {
+ return
+ }
+
+ return (
+
+ {/* Header */}
+
+
+
+
Layout Preview
+
+ {layouts.length} layout{layouts.length !== 1 ? 's' : ''} found
+
+
+
+
+
+ {/* Layouts List */}
+
+ {layouts.map((layout, index) => {
+ const { component: LayoutComponent, sampleData, name, fileName } = layout
+
+ return (
+
+ {/* Layout Header */}
+
+
+ {/* Layout Content */}
+
+
+
+
+ )
+ })}
+
+ {/* Footer */}
+
+
+
+
+ Layout Preview • {layouts.length} component{layouts.length !== 1 ? 's' : ''} rendered
+
+
+
+
+
+ )
+}
+
+export default LayoutPreview
diff --git a/servers/nextjs/app/layout-preview/types/index.ts b/servers/nextjs/app/layout-preview/types/index.ts
new file mode 100644
index 00000000..7c3efd2f
--- /dev/null
+++ b/servers/nextjs/app/layout-preview/types/index.ts
@@ -0,0 +1,28 @@
+/**
+ * Shared types for the Layout Preview system
+ */
+
+export interface LayoutInfo {
+ name: string
+ component: React.ComponentType
+ schema: any
+ sampleData: any
+ fileName: string
+}
+
+export interface LoadingState {
+ loading: boolean
+ error: string | null
+}
+
+export interface NavigationState {
+ currentLayout: number
+ totalLayouts: number
+}
+
+export type LoadingStateType = 'loading' | 'error' | 'empty'
+
+export interface ComponentProps {
+ className?: string
+ children?: React.ReactNode
+}
\ No newline at end of file
diff --git a/servers/nextjs/app/layout-preview/utils/sampleDataGenerator.ts b/servers/nextjs/app/layout-preview/utils/sampleDataGenerator.ts
new file mode 100644
index 00000000..dd54b854
--- /dev/null
+++ b/servers/nextjs/app/layout-preview/utils/sampleDataGenerator.ts
@@ -0,0 +1,305 @@
+/**
+ * Sample Data Generator Utility
+ *
+ * Generates realistic sample data from Zod schemas for layout previews.
+ * Provides context-aware data generation based on field names and types.
+ */
+
+export const generateSampleDataFromSchema = (schema: any, layoutName: string): any => {
+ if (!schema) return {}
+
+ try {
+ // Generate realistic sample data for all fields first
+ const generatedData = generateRealisticData(schema._def?.shape || schema.shape, layoutName)
+
+
+ // Merge generated data with defaults, giving priority to defaults
+ return generatedData
+ } catch (error) {
+ console.error(`Error generating sample data for ${layoutName}:`, error)
+ return {}
+ }
+}
+
+
+
+const generateRealisticData = (shape: any, layoutName: string): any => {
+ if (!shape) return {}
+
+ const data: any = {}
+
+ for (const [key, fieldSchema] of Object.entries(shape as any)) {
+ const field = fieldSchema as any
+
+ // Generate data for all fields (both required and optional)
+ // We'll let the defaults override this later if they exist
+ data[key] = generateFieldValue(key, field, layoutName)
+ }
+
+ return data
+}
+
+// const arrayMock = (length:number,element:any) => {
+// return Array.from({length},()=>generateFieldValue(fieldName, element, layoutName))
+// }
+// const mockObject = (shapes:any) => {
+// let obj:any = {}
+// for(const [key,shape] of Object.entries(shapes)){
+// const defaultValue = shape.def.defaultValue
+// obj[key] = defaultValue ? defaultValue : generateFieldValue(key, shape, layoutName)
+// }
+// return obj
+// }
+
+
+// const generateMockValue = (fileType:string,format?:string)=>{
+// switch(fileType){
+// case 'number':
+// return Math.floor(Math.random() * 100) + 1
+// case 'string':
+// return generateStringValue(fieldName, fieldSchema, layoutName)
+// case 'boolean':
+// return Math.random() > 0.5
+// case 'object':
+// return mockObject(fieldSchema.def.shape)
+// case 'array':
+// return arrayMock(fieldSchema.def.length,fieldSchema.def.element)
+// }
+
+// }
+
+
+
+const generateFieldValue = (fieldName: string, fieldSchema: any, layoutName: string): any => {
+ console.log('BADU',fieldSchema,fieldName,layoutName)
+ const defaultValue = fieldSchema.def.defaultValue;
+
+ if(defaultValue){
+ console.log('DEFAULT VALUE',defaultValue)
+ return defaultValue;
+ }
+
+ if(fieldSchema.def.type ==='optional'){
+ return generateFieldValue(fieldName, fieldSchema.def.innerType, layoutName)
+ }
+
+ // Get the actual field type - handle optional fields properly
+ let actualFieldSchema = fieldSchema
+ let fieldType = fieldSchema._def?.typeName
+
+ // If this is an optional field (ZodOptional), get the inner type
+ if (fieldType === 'ZodOptional') {
+ actualFieldSchema = fieldSchema._def?.innerType
+ fieldType = actualFieldSchema?._def?.typeName
+ }
+
+ // For preview purposes, always generate data for optional fields
+ // (users want to see how the layout looks with content)
+
+ // Handle different field types
+ switch (fieldType) {
+ case 'ZodString':
+ return generateStringValue(fieldName, actualFieldSchema, layoutName)
+ case 'ZodArray':
+ return generateArrayValue(fieldName, actualFieldSchema, layoutName)
+ case 'ZodObject':
+ return generateObjectValue(fieldName, actualFieldSchema, layoutName)
+ case 'ZodEnum':
+ const options = actualFieldSchema._def?.values || []
+ return options[Math.floor(Math.random() * options.length)]
+ case 'ZodBoolean':
+ return Math.random() > 0.5
+ case 'ZodNumber':
+ return Math.floor(Math.random() * 100) + 1
+ default:
+ return generateStringValue(fieldName, actualFieldSchema, layoutName)
+ }
+}
+
+
+
+const generateStringValue = (fieldName: string, fieldSchema: any, layoutName: string): string => {
+ const lowerField = fieldName.toLowerCase()
+
+ // Handle URLs (images, logos, backgrounds, etc.)
+ if (lowerField.includes('url') || lowerField.includes('image') || lowerField.includes('logo')) {
+ if (lowerField.includes('logo')) {
+ return 'https://images.unsplash.com/photo-1611224923853-80b023f02d71?w=200&h=200&fit=crop'
+ }
+ if (lowerField.includes('background')) {
+ const backgrounds = [
+ 'https://images.unsplash.com/photo-1557804506-669a67965ba0?w=1920&h=1080&fit=crop',
+ 'https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=1920&h=1080&fit=crop',
+ 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?w=1920&h=1080&fit=crop'
+ ]
+ return backgrounds[Math.floor(Math.random() * backgrounds.length)]
+ }
+ // Regular images
+ const images = [
+ 'https://images.unsplash.com/photo-1551434678-e076c223a692?w=800&h=600&fit=crop',
+ 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=800&h=600&fit=crop',
+ 'https://images.unsplash.com/photo-1504384308090-c894fdcc538d?w=800&h=600&fit=crop',
+ 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?w=800&h=600&fit=crop'
+ ]
+ return images[Math.floor(Math.random() * images.length)]
+ }
+
+ // Handle email
+ if (lowerField.includes('email')) {
+ const domains = ['example.com', 'company.com', 'business.org']
+ const names = ['contact', 'info', 'hello', 'support']
+ return `${names[Math.floor(Math.random() * names.length)]}@${domains[Math.floor(Math.random() * domains.length)]}`
+ }
+
+ // Handle phone
+ if (lowerField.includes('phone')) {
+ return `+1 (555) ${Math.floor(Math.random() * 900) + 100}-${Math.floor(Math.random() * 9000) + 1000}`
+ }
+
+ // Handle website
+ if (lowerField.includes('website')) {
+ const sites = ['https://example.com', 'https://company.com', 'https://business.org']
+ return sites[Math.floor(Math.random() * sites.length)]
+ }
+
+ // Handle LinkedIn
+ if (lowerField.includes('linkedin')) {
+ return 'https://linkedin.com/company/example'
+ }
+
+ // Handle specific field names
+ if (lowerField.includes('title')) {
+ const titles = [
+ 'Welcome to Our Presentation',
+ 'Key Business Insights',
+ 'Product Overview',
+ 'Market Analysis',
+ 'Future Vision',
+ 'Strategic Goals'
+ ]
+ return titles[Math.floor(Math.random() * titles.length)]
+ }
+
+ if (lowerField.includes('subtitle')) {
+ const subtitles = [
+ 'Driving innovation through technology',
+ 'Transforming the way we work',
+ 'Building solutions for tomorrow',
+ 'Excellence in every detail',
+ 'Your success is our mission'
+ ]
+ return subtitles[Math.floor(Math.random() * subtitles.length)]
+ }
+
+ if (lowerField.includes('author') || lowerField.includes('name')) {
+ const names = ['Alex Johnson', 'Sarah Chen', 'Michael Rodriguez', 'Emily Davis', 'David Kim']
+ return names[Math.floor(Math.random() * names.length)]
+ }
+
+ if (lowerField.includes('organization') || lowerField.includes('company')) {
+ const orgs = ['Tech Innovations Inc.', 'Future Solutions Ltd.', 'Global Dynamics Corp.', 'NextGen Enterprises']
+ return orgs[Math.floor(Math.random() * orgs.length)]
+ }
+
+ if (lowerField.includes('date')) {
+ return new Date().toLocaleDateString()
+ }
+
+ if (lowerField.includes('content')) {
+ const contents = [
+ 'Our innovative approach combines cutting-edge technology with proven methodologies to deliver exceptional results. We focus on scalability, reliability, and user experience.',
+ 'Through strategic partnerships and continuous innovation, we\'ve established ourselves as leaders in the industry. Our solutions are designed to meet evolving market demands.',
+ 'With over a decade of experience, our team brings deep expertise and fresh perspectives to every project. We\'re committed to exceeding expectations and driving growth.'
+ ]
+ return contents[Math.floor(Math.random() * contents.length)]
+ }
+
+ if (lowerField.includes('caption')) {
+ const captions = [
+ 'Innovative solutions driving business transformation',
+ 'Real-time analytics and insights at your fingertips',
+ 'Seamless integration with existing workflows',
+ 'Empowering teams to achieve more'
+ ]
+ return captions[Math.floor(Math.random() * captions.length)]
+ }
+
+ if (lowerField.includes('action') || lowerField.includes('cta')) {
+ const actions = [
+ 'Get Started Today!',
+ 'Schedule a Demo',
+ 'Contact Our Team',
+ 'Learn More',
+ 'Try It Free'
+ ]
+ return actions[Math.floor(Math.random() * actions.length)]
+ }
+
+ // Default text based on field length constraints
+ const minLength = fieldSchema._def?.checks?.find((c: any) => c.kind === 'min')?.value || 10
+ const maxLength = fieldSchema._def?.checks?.find((c: any) => c.kind === 'max')?.value || 100
+
+ if (maxLength <= 50) {
+ return 'Sample short text content'
+ } else if (maxLength <= 150) {
+ return 'This is sample medium-length text content for preview purposes'
+ } else {
+ return 'This is sample long-form text content that demonstrates how the layout will look with realistic data. It provides a good representation of the final presentation slide.'
+ }
+}
+
+const generateArrayValue = (fieldName: string, fieldSchema: any, layoutName: string): any[] => {
+ const itemSchema = fieldSchema._def?.type
+ const minItems = fieldSchema._def?.minLength?.value || 2
+ const maxItems = Math.min(fieldSchema._def?.maxLength?.value || 5, 6)
+ const itemCount = Math.floor(Math.random() * (maxItems - minItems + 1)) + minItems
+
+ const lowerField = fieldName.toLowerCase()
+
+ if (lowerField.includes('bullet') || lowerField.includes('point')) {
+ const bulletPoints = [
+ 'Increased efficiency and productivity',
+ 'Cost-effective solutions',
+ 'Enhanced user experience',
+ 'Scalable architecture',
+ 'Real-time analytics',
+ '24/7 customer support',
+ 'Seamless integration capabilities',
+ 'Advanced security features'
+ ]
+ return bulletPoints.slice(0, itemCount)
+ }
+
+ if (lowerField.includes('takeaway') || lowerField.includes('key')) {
+ const takeaways = [
+ 'Strategic advantage through innovation',
+ 'Proven ROI within 6 months',
+ 'Comprehensive support included',
+ 'Future-ready technology stack',
+ 'Industry-leading performance'
+ ]
+ return takeaways.slice(0, itemCount)
+ }
+
+ // Generate generic array items
+ const items = []
+ for (let i = 0; i < itemCount; i++) {
+ if (itemSchema) {
+ items.push(generateFieldValue(`${fieldName}Item`, itemSchema, layoutName))
+ } else {
+ items.push(`Sample item ${i + 1}`)
+ }
+ }
+ return items
+}
+
+const generateObjectValue = (fieldName: string, fieldSchema: any, layoutName: string): any => {
+ const shape = fieldSchema._def?.shape
+ if (!shape) return {}
+
+ const obj: any = {}
+ for (const [key, subSchema] of Object.entries(shape)) {
+ obj[key] = generateFieldValue(key, subSchema, layoutName)
+ }
+ return obj
+}
\ No newline at end of file
diff --git a/servers/nextjs/components/ToolTip.tsx b/servers/nextjs/components/ToolTip.tsx
index 9ec3c9b7..e1b6c59a 100644
--- a/servers/nextjs/components/ToolTip.tsx
+++ b/servers/nextjs/components/ToolTip.tsx
@@ -2,7 +2,6 @@ import { Tooltip } from '@radix-ui/react-tooltip'
import { TooltipProvider } from '@radix-ui/react-tooltip'
import React from 'react'
import { TooltipContent, TooltipTrigger, } from './ui/tooltip'
-import { Button } from './ui/button'
const ToolTip = ({ children, content }: { children: React.ReactNode, content: string }) => {
return (
diff --git a/servers/nextjs/components/layouts/BulletPointSlideLayout.tsx b/servers/nextjs/components/layouts/BulletPointSlideLayout.tsx
new file mode 100644
index 00000000..43808b41
--- /dev/null
+++ b/servers/nextjs/components/layouts/BulletPointSlideLayout.tsx
@@ -0,0 +1,139 @@
+import React from 'react'
+import { zodToJsonSchema } from "zod-to-json-schema";
+import * as z from "zod";
+
+const bulletPointSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Key Points').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).optional().describe('Optional subtitle or description'),
+ icon: z.string().optional().describe('Icon to display in the slide'),
+ bulletPoints: z.array(z.string().min(5).max(200)).min(2).max(8).default([
+ 'First key point that highlights important information',
+ 'Second bullet point with valuable insights',
+ 'Third point demonstrating clear benefits',
+ 'Fourth item showcasing key features'
+ ]).describe('List of bullet points (2-8 items)'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+console.log(zodToJsonSchema(bulletPointSlideSchema))
+
+export const Schema = bulletPointSlideSchema
+
+export type BulletPointSlideData = z.infer
+
+interface BulletPointSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const BulletPointSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = bulletPointSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const bulletColors = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Enhanced Bullet Points */}
+
+
+ {/* Content background accent */}
+
+
+
+ {slideData.bulletPoints.map((point, index) => (
+
+ {/* Enhanced bullet point icon */}
+
+
+ {/* Enhanced bullet text */}
+
+ {point}
+
+
+ ))}
+
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default BulletPointSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/ConclusionSlideLayout.tsx b/servers/nextjs/components/layouts/ConclusionSlideLayout.tsx
new file mode 100644
index 00000000..179c1a6b
--- /dev/null
+++ b/servers/nextjs/components/layouts/ConclusionSlideLayout.tsx
@@ -0,0 +1,228 @@
+import React from 'react'
+import * as z from "zod";
+
+const conclusionSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Conclusion').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).optional().describe('Optional subtitle or description'),
+ keyTakeaways: z.array(z.string().min(5).max(200)).min(2).max(6).default([
+ 'Successfully achieved our primary objectives',
+ 'Demonstrated significant value and impact',
+ 'Established clear next steps for continued success',
+ 'Built strong foundation for future growth'
+ ]).describe('Key takeaways or summary points (2-6 items)'),
+ callToAction: z.string().min(5).max(150).optional().describe('Optional call to action or next steps'),
+ contactInfo: z.object({
+ email: z.string().email().optional().describe('Contact email'),
+ phone: z.string().min(5).max(50).optional().describe('Contact phone number'),
+ website: z.string().url().optional().describe('Website URL')
+ }).optional().describe('Optional contact information'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = conclusionSlideSchema
+
+export type ConclusionSlideData = z.infer
+
+interface ConclusionSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const ConclusionSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = conclusionSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const bulletColors = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Enhanced Content Layout */}
+
+ {/* Key Takeaways - Takes up 2/3 of space */}
+
+
+ {/* Content accent */}
+
+
+
Key Takeaways
+
+
+ {slideData.keyTakeaways.map((takeaway, index) => (
+
+ {/* Enhanced bullet point */}
+
+
+
+ {takeaway}
+
+
+ ))}
+
+
+ {/* Background decoration */}
+
+
+
+
+ {/* Call to Action & Contact Info - Takes up 1/3 of space */}
+
+ {/* Call to Action */}
+ {slideData.callToAction && (
+
+ {/* CTA accent */}
+
+
+
+
+
Next Steps
+
+ {slideData.callToAction}
+
+
+ )}
+
+ {/* Contact Information */}
+ {slideData.contactInfo && Object.values(slideData.contactInfo).some(Boolean) && (
+
+ {/* Contact accent */}
+
+
+
Get in Touch
+
+
+
+ {/* Background decoration */}
+
+
+ )}
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default ConclusionSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/ContentSlideLayout.tsx b/servers/nextjs/components/layouts/ContentSlideLayout.tsx
new file mode 100644
index 00000000..d8b21d1a
--- /dev/null
+++ b/servers/nextjs/components/layouts/ContentSlideLayout.tsx
@@ -0,0 +1,122 @@
+import React from 'react'
+import * as z from "zod";
+
+const contentSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Slide Title').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).optional().describe('Optional subtitle or description'),
+ content: z.string().min(10).max(1000).default('Your slide content goes here. This is where you can add detailed information, explanations, or any other text content that supports your presentation.').describe('Main content text'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = contentSlideSchema
+
+export type ContentSlideData = z.infer
+
+interface ContentSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const ContentSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = contentSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+ {/* Grid overlay for professional look */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Main Content with Enhanced Styling */}
+
+
+ {/* Content background accent */}
+
+
+
+ {slideData.content.split('\n').map((paragraph, index) => (
+ paragraph.trim() && (
+
+ {paragraph}
+
+ )
+ ))}
+
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default ContentSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/FirstSlideLayout.tsx b/servers/nextjs/components/layouts/FirstSlideLayout.tsx
new file mode 100644
index 00000000..d30e48e0
--- /dev/null
+++ b/servers/nextjs/components/layouts/FirstSlideLayout.tsx
@@ -0,0 +1,132 @@
+import React from 'react'
+import * as z from "zod";
+
+const firstSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Welcome to Our Presentation').describe('Main title of the presentation'),
+ subtitle: z.string().min(10).max(200).default('Subtitle for the slide').optional().describe('Optional subtitle or tagline'),
+ author: z.string().min(2).max(100).default('John Doe').optional().describe('Author or presenter name'),
+ date: z.string().optional().describe('Presentation date'),
+ company: z.string().min(2).max(100).default('Company Name').optional().describe('Company or organization name'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = firstSlideSchema
+
+export type FirstSlideData = z.infer
+
+interface FirstSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const FirstSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = firstSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+ {/* Grid overlay for professional look */}
+
+
+
+ {/* Main Content */}
+
+ {/* Title */}
+
+
+ {slideData.title}
+
+
+
+ {/* Subtitle */}
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+ {/* Enhanced Accent Line */}
+
+
+ {/* Professional Metadata Container */}
+
+
+ {slideData.author && (
+
+ {slideData.author}
+
+ )}
+
+ {slideData.company && (
+
+ {slideData.company}
+
+ )}
+
+ {slideData.date && (
+
+ {slideData.date}
+
+ )}
+
+
+
+
+
+ {/* Enhanced decorative accent with glow effect */}
+
+
+ {/* Professional corner accents */}
+
+
+
+ )
+}
+
+export default FirstSlideLayout
+
diff --git a/servers/nextjs/components/layouts/ImageSlideLayout.tsx b/servers/nextjs/components/layouts/ImageSlideLayout.tsx
new file mode 100644
index 00000000..17eb2245
--- /dev/null
+++ b/servers/nextjs/components/layouts/ImageSlideLayout.tsx
@@ -0,0 +1,139 @@
+import React from 'react'
+import * as z from "zod";
+
+const imageSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Image Showcase').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).default('Subtitle for the slide').optional().describe('Optional subtitle or description'),
+ image: z.string().default('https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=800&h=600&fit=crop').describe('Main image URL'),
+ imageCaption: z.string().min(5).max(200).default('Image caption').optional().describe('Optional image caption or description'),
+ content: z.string().min(10).max(600).optional().describe('Optional supporting content text'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = imageSlideSchema
+
+export type ImageSlideData = z.infer
+
+interface ImageSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const ImageSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = imageSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Enhanced Content Layout */}
+
+
+
+
+
+ {slideData.content?.split('\n').map((paragraph, index) => (
+ paragraph.trim() && (
+
+ {paragraph}
+
+ )
+ ))}
+
+
+ {/* Background decoration */}
+
+
+
+
+
+
+
+ {slideData.imageCaption && (
+
+ {slideData.imageCaption}
+
+ )}
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default ImageSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/ProcessSlideLayout.tsx b/servers/nextjs/components/layouts/ProcessSlideLayout.tsx
new file mode 100644
index 00000000..0844af55
--- /dev/null
+++ b/servers/nextjs/components/layouts/ProcessSlideLayout.tsx
@@ -0,0 +1,181 @@
+import React from 'react'
+import * as z from "zod";
+
+const processSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Our Process').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).optional().describe('Optional subtitle or description'),
+ processSteps: z.array(z.object({
+ step: z.number().min(1).max(10).describe('Step number'),
+ title: z.string().min(3).max(100).describe('Step title'),
+ description: z.string().min(10).max(200).describe('Step description')
+ })).min(2).max(6).default([
+ {
+ step: 1,
+ title: 'Discovery',
+ description: 'Understanding requirements and gathering initial insights'
+ },
+ {
+ step: 2,
+ title: 'Planning',
+ description: 'Strategic planning and roadmap development'
+ },
+ {
+ step: 3,
+ title: 'Implementation',
+ description: 'Executing the plan with precision and quality'
+ },
+ {
+ step: 4,
+ title: 'Delivery',
+ description: 'Final delivery and ongoing support'
+ }
+ ]).describe('Process steps (2-6 items)'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = processSlideSchema
+
+export type ProcessSlideData = z.infer
+
+interface ProcessSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const ProcessSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = processSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const stepColors = {
+ blue: 'bg-blue-600 text-white border-blue-600',
+ green: 'bg-emerald-600 text-white border-emerald-600',
+ purple: 'bg-violet-600 text-white border-violet-600',
+ orange: 'bg-orange-600 text-white border-orange-600',
+ red: 'bg-red-600 text-white border-red-600'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Enhanced Process Steps */}
+
+
+
+ {slideData.processSteps.map((step, index) => (
+
+ {/* Process Step */}
+
+ {/* Step Number Circle */}
+
+
+ {/* Step Content Card */}
+
+ {/* Card accent */}
+
+
+ {/* Step Title */}
+
+ {step.title}
+
+
+ {/* Step Description */}
+
+ {step.description}
+
+
+ {/* Background decoration */}
+
+
+
+
+ {/* Arrow Between Steps */}
+ {index < slideData.processSteps.length - 1 && (
+
+ )}
+
+ ))}
+
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default ProcessSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/QuoteSlideLayout.tsx b/servers/nextjs/components/layouts/QuoteSlideLayout.tsx
new file mode 100644
index 00000000..fe73cd84
--- /dev/null
+++ b/servers/nextjs/components/layouts/QuoteSlideLayout.tsx
@@ -0,0 +1,167 @@
+import React from 'react'
+import * as z from "zod";
+
+const quoteSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Testimonials').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).optional().describe('Optional subtitle or description'),
+ quote: z.string().min(10).max(500).default('This solution has transformed our business operations and exceeded all expectations.').describe('The main quote or testimonial'),
+ author: z.string().min(2).max(100).default('John Smith').describe('Quote author name'),
+ authorTitle: z.string().min(2).max(100).optional().describe('Author job title or position'),
+ company: z.string().min(2).max(100).optional().describe('Author company or organization'),
+ authorImage: z.string().optional().describe('URL to author photo'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = quoteSlideSchema
+
+export type QuoteSlideData = z.infer
+
+interface QuoteSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const QuoteSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = quoteSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Enhanced Quote Content */}
+
+
+ {/* Enhanced Background Quote Decoration */}
+
+ "
+
+
+ "
+
+
+ {/* Quote Text */}
+
+ "{slideData.quote}"
+
+
+ {/* Professional Author Attribution */}
+
+ {/* Author Avatar */}
+
+ {slideData.authorImage ? (
+
+ ) : (
+
+ {slideData.author.split(' ').map(n => n[0]).join('')}
+
+ )}
+
+
+ {/* Author Details */}
+
+
+ {slideData.author}
+
+
+ {slideData.authorTitle && (
+
+ {slideData.authorTitle}
+
+ )}
+
+ {slideData.company && (
+
+ {slideData.company}
+
+ )}
+
+
+
+ {/* Enhanced Quote Accent Line */}
+
+
+ {/* Background decoration */}
+
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default QuoteSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/StatisticsSlideLayout.tsx b/servers/nextjs/components/layouts/StatisticsSlideLayout.tsx
new file mode 100644
index 00000000..362b0bf0
--- /dev/null
+++ b/servers/nextjs/components/layouts/StatisticsSlideLayout.tsx
@@ -0,0 +1,200 @@
+import React from 'react'
+import * as z from "zod";
+
+const statisticsSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Key Statistics').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).optional().describe('Optional subtitle or description'),
+ statistics: z.array(z.object({
+ value: z.string().min(1).max(20).describe('Statistical value (e.g., "250%", "$1.2M", "99.9%")'),
+ label: z.string().min(3).max(100).describe('Description of the statistic'),
+ trend: z.enum(['up', 'down', 'neutral']).optional().describe('Trend direction indicator'),
+ context: z.string().min(5).max(200).optional().describe('Additional context or time period')
+ })).min(2).max(6).default([
+ {
+ value: '250%',
+ label: 'Revenue Growth',
+ trend: 'up',
+ context: 'Year over year increase'
+ },
+ {
+ value: '50M+',
+ label: 'Active Users',
+ trend: 'up',
+ context: 'Global user base'
+ },
+ {
+ value: '99.9%',
+ label: 'Uptime',
+ trend: 'neutral',
+ context: 'Service reliability'
+ },
+ {
+ value: '24/7',
+ label: 'Support',
+ trend: 'neutral',
+ context: 'Customer service'
+ }
+ ]).describe('List of statistics (2-6 items)'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = statisticsSlideSchema
+
+export type StatisticsSlideData = z.infer
+
+interface StatisticsSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const StatisticsSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = statisticsSlideSchema.parse(data || {})
+ const statsCount = slideData.statistics.length
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ const trendColors = {
+ up: {
+ blue: 'text-emerald-600 bg-emerald-50 border-emerald-200',
+ green: 'text-emerald-600 bg-emerald-50 border-emerald-200',
+ purple: 'text-emerald-600 bg-emerald-50 border-emerald-200',
+ orange: 'text-emerald-600 bg-emerald-50 border-emerald-200',
+ red: 'text-emerald-600 bg-emerald-50 border-emerald-200'
+ },
+ down: 'text-red-600 bg-red-50 border-red-200',
+ neutral: 'text-slate-600 bg-slate-50 border-slate-200'
+ }
+
+ const getTrendIcon = (trend?: string) => {
+ switch (trend) {
+ case 'up':
+ return '↗'
+ case 'down':
+ return '↘'
+ case 'neutral':
+ return '→'
+ default:
+ return ''
+ }
+ }
+
+ const getGridCols = () => {
+ if (statsCount <= 2) return 'grid-cols-2'
+ if (statsCount <= 3) return 'grid-cols-3'
+ if (statsCount <= 4) return 'grid-cols-2 lg:grid-cols-4'
+ return 'grid-cols-2 lg:grid-cols-3'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Enhanced Statistics Grid */}
+
+
+ {slideData.statistics.map((stat, index) => (
+
+ {/* Card accent */}
+
+
+ {/* Statistic Value */}
+
+ {stat.value}
+
+
+ {/* Statistic Label */}
+
+ {stat.label}
+
+
+ {/* Trend Indicator */}
+ {stat.trend && (
+
+ {getTrendIcon(stat.trend)}
+ {stat.trend.toUpperCase()}
+
+ )}
+
+ {/* Context */}
+ {stat.context && (
+
+ {stat.context}
+
+ )}
+
+ {/* Background decoration */}
+
+
+ ))}
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default StatisticsSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/TeamSlideLayout.tsx b/servers/nextjs/components/layouts/TeamSlideLayout.tsx
new file mode 100644
index 00000000..e3b1518b
--- /dev/null
+++ b/servers/nextjs/components/layouts/TeamSlideLayout.tsx
@@ -0,0 +1,217 @@
+import React from 'react'
+import * as z from "zod";
+
+const teamSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Meet Our Team').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).optional().describe('Optional subtitle or team description'),
+ teamMembers: z.array(z.object({
+ name: z.string().min(2).max(100).describe('Team member name'),
+ title: z.string().min(2).max(100).describe('Job title or role'),
+ image: z.string().optional().describe('URL to team member photo'),
+ bio: z.string().min(10).max(300).optional().describe('Brief biography or description'),
+ email: z.string().email().optional().describe('Contact email'),
+ linkedin: z.string().url().optional().describe('LinkedIn profile URL')
+ })).min(1).max(6).default([
+ {
+ name: 'Sarah Johnson',
+ title: 'Chief Executive Officer',
+ image: 'https://images.unsplash.com/photo-1494790108755-2616b612b786?w=300&h=300&fit=crop&crop=face',
+ bio: 'Strategic leader with 15+ years experience driving innovation and growth in technology companies.',
+ email: 'sarah@company.com',
+ linkedin: 'https://linkedin.com/in/sarahjohnson'
+ },
+ {
+ name: 'Michael Chen',
+ title: 'Chief Technology Officer',
+ image: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=300&h=300&fit=crop&crop=face',
+ bio: 'Technology visionary specializing in scalable architecture and emerging technologies.',
+ email: 'michael@company.com',
+ linkedin: 'https://linkedin.com/in/michaelchen'
+ },
+ {
+ name: 'Emma Rodriguez',
+ title: 'Head of Design',
+ image: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=300&h=300&fit=crop&crop=face',
+ bio: 'Creative director passionate about user-centered design and innovative digital experiences.',
+ email: 'emma@company.com',
+ linkedin: 'https://linkedin.com/in/emmarodriguez'
+ }
+ ]).describe('Team members (1-6 people)'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = teamSlideSchema
+
+export type TeamSlideData = z.infer
+
+interface TeamSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const TeamSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = teamSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ const iconColors = {
+ blue: 'text-blue-600 hover:text-blue-700',
+ green: 'text-emerald-600 hover:text-emerald-700',
+ purple: 'text-violet-600 hover:text-violet-700',
+ orange: 'text-orange-600 hover:text-orange-700',
+ red: 'text-red-600 hover:text-red-700'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Enhanced Team Grid */}
+
+
+ {slideData.teamMembers.map((member, index) => (
+
+ {/* Card accent */}
+
+
+ {/* Professional Avatar */}
+
+
+ {member.image ? (
+
+ ) : (
+
+ {member.name.split(' ').map(n => n[0]).join('')}
+
+ )}
+
+
+
+
+ {/* Member Info */}
+
+
+ {member.name}
+
+
+ {member.title}
+
+
+ {member.bio && (
+
+ {member.bio}
+
+ )}
+
+
+ {/* Professional Contact Links */}
+
+ {member.email && (
+
+
+
+
+
+
+ )}
+
+ {member.linkedin && (
+
+
+
+
+
+ )}
+
+
+ {/* Background decoration */}
+
+
+ ))}
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default TeamSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/TimelineSlideLayout.tsx b/servers/nextjs/components/layouts/TimelineSlideLayout.tsx
new file mode 100644
index 00000000..e76ab41c
--- /dev/null
+++ b/servers/nextjs/components/layouts/TimelineSlideLayout.tsx
@@ -0,0 +1,225 @@
+import React from 'react'
+import * as z from "zod";
+
+const timelineSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Project Timeline').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).optional().describe('Optional subtitle or description'),
+ timelineItems: z.array(z.object({
+ date: z.string().min(2).max(50).describe('Date or time period'),
+ title: z.string().min(3).max(100).describe('Event or milestone title'),
+ description: z.string().min(10).max(300).describe('Event description'),
+ status: z.enum(['completed', 'current', 'upcoming']).default('upcoming').describe('Timeline item status')
+ })).min(2).max(6).default([
+ {
+ date: 'Q1 2024',
+ title: 'Project Initiation',
+ description: 'Project planning, team assembly, and initial requirements gathering',
+ status: 'completed'
+ },
+ {
+ date: 'Q2 2024',
+ title: 'Development Phase',
+ description: 'Core development work, prototype creation, and testing implementation',
+ status: 'current'
+ },
+ {
+ date: 'Q3 2024',
+ title: 'Testing & QA',
+ description: 'Comprehensive testing, quality assurance, and user acceptance testing',
+ status: 'upcoming'
+ },
+ {
+ date: 'Q4 2024',
+ title: 'Launch & Deployment',
+ description: 'Final deployment, go-live activities, and post-launch monitoring',
+ status: 'upcoming'
+ }
+ ]).describe('Timeline events (2-6 items)'),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = timelineSlideSchema
+
+export type TimelineSlideData = z.infer
+
+interface TimelineSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const TimelineSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+ const slideData = timelineSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ const statusColors = {
+ completed: {
+ blue: 'bg-emerald-600 border-emerald-600 shadow-emerald-200',
+ green: 'bg-emerald-600 border-emerald-600 shadow-emerald-200',
+ purple: 'bg-emerald-600 border-emerald-600 shadow-emerald-200',
+ orange: 'bg-emerald-600 border-emerald-600 shadow-emerald-200',
+ red: 'bg-emerald-600 border-emerald-600 shadow-emerald-200'
+ },
+ current: {
+ blue: 'bg-blue-600 border-blue-600 ring-4 ring-blue-200 shadow-blue-300',
+ green: 'bg-emerald-600 border-emerald-600 ring-4 ring-emerald-200 shadow-emerald-300',
+ purple: 'bg-violet-600 border-violet-600 ring-4 ring-violet-200 shadow-violet-300',
+ orange: 'bg-orange-600 border-orange-600 ring-4 ring-orange-200 shadow-orange-300',
+ red: 'bg-red-600 border-red-600 ring-4 ring-red-200 shadow-red-300'
+ },
+ upcoming: {
+ blue: 'bg-slate-300 border-slate-400 shadow-slate-200',
+ green: 'bg-slate-300 border-slate-400 shadow-slate-200',
+ purple: 'bg-slate-300 border-slate-400 shadow-slate-200',
+ orange: 'bg-slate-300 border-slate-400 shadow-slate-200',
+ red: 'bg-slate-300 border-slate-400 shadow-slate-200'
+ }
+ }
+
+ const lineColors = {
+ blue: 'bg-blue-200',
+ green: 'bg-emerald-200',
+ purple: 'bg-violet-200',
+ orange: 'bg-orange-200',
+ red: 'bg-red-200'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Enhanced Timeline */}
+
+
+
+ {/* Timeline line */}
+
+
+
+ {slideData.timelineItems.map((item, index) => (
+
+ {/* Timeline node */}
+
+ {item.status === 'completed' && (
+
+ )}
+ {item.status === 'current' && (
+
+ )}
+
+
+ {/* Timeline content card */}
+
+ {/* Card accent */}
+
+
+
+ {/* Date */}
+
+ {item.date}
+
+
+ {/* Title */}
+
+ {item.title}
+
+
+ {/* Description */}
+
+ {item.description}
+
+
+
+ {/* Status indicator */}
+
+
+ {item.status === 'completed' && '✓ Completed'}
+ {item.status === 'current' && '● In Progress'}
+ {item.status === 'upcoming' && '○ Upcoming'}
+
+
+
+ {/* Background decoration */}
+
+
+
+ ))}
+
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default TimelineSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/TwoColumnSlideLayout.tsx b/servers/nextjs/components/layouts/TwoColumnSlideLayout.tsx
new file mode 100644
index 00000000..96068947
--- /dev/null
+++ b/servers/nextjs/components/layouts/TwoColumnSlideLayout.tsx
@@ -0,0 +1,162 @@
+import React from 'react'
+import * as z from "zod";
+
+const twoColumnSlideSchema = z.object({
+ title: z.string().min(3).max(100).default('Two Column Layout').describe('Title of the slide'),
+ subtitle: z.string().min(3).max(150).optional().describe('Optional subtitle or description'),
+ leftColumn: z.object({
+ title: z.string().min(3).max(100).default('Left Column').describe('Left column title'),
+ content: z.string().min(10).max(800).default('Content for the left column goes here. This can include detailed information, explanations, or supporting details.').describe('Left column content')
+ }).default({
+ title: 'Left Column',
+ content: 'Content for the left column goes here. This can include detailed information, explanations, or supporting details.'
+ }),
+ rightColumn: z.object({
+ title: z.string().min(3).max(100).default('Right Column').describe('Right column title'),
+ content: z.string().min(10).max(800).default('Content for the right column goes here. This can include additional information, comparisons, or contrasting details.').describe('Right column content')
+ }).default({
+ title: 'Right Column',
+ content: 'Content for the right column goes here. This can include additional information, comparisons, or contrasting details.'
+ }),
+ backgroundImage: z.string().optional().describe('URL to background image for the slide')
+})
+
+export const Schema = twoColumnSlideSchema
+
+
+export type TwoColumnSlideData = z.infer
+
+interface TwoColumnSlideLayoutProps {
+ data?: Partial
+ accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
+}
+
+const TwoColumnSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
+
+ const slideData = twoColumnSlideSchema.parse(data || {})
+
+ const accentColors = {
+ blue: 'from-blue-600 to-blue-800',
+ green: 'from-emerald-600 to-emerald-800',
+ purple: 'from-violet-600 to-violet-800',
+ orange: 'from-orange-600 to-orange-800',
+ red: 'from-red-600 to-red-800'
+ }
+
+ const accentSolids = {
+ blue: 'bg-blue-600',
+ green: 'bg-emerald-600',
+ purple: 'bg-violet-600',
+ orange: 'bg-orange-600',
+ red: 'bg-red-600'
+ }
+
+ return (
+
+ {/* Enhanced geometric background decoration */}
+
+
+
+ {/* Professional Header */}
+
+
+
+ {slideData.title}
+
+
+
+ {slideData.subtitle && (
+
+ {slideData.subtitle}
+
+ )}
+
+
+
+
+ {/* Two Column Content with Enhanced Styling */}
+
+ {/* Left Column */}
+
+ {/* Column accent */}
+
+
+
+ {slideData.leftColumn.title}
+
+
+ {slideData.leftColumn.content.split('\n').map((paragraph, index) => (
+ paragraph.trim() && (
+
+ {paragraph}
+
+ )
+ ))}
+
+
+
+ {/* Right Column */}
+
+ {/* Column accent */}
+
+
+
+ {slideData.rightColumn.title}
+
+
+ {slideData.rightColumn.content.split('\n').map((paragraph, index) => (
+ paragraph.trim() && (
+
+ {paragraph}
+
+ )
+ ))}
+
+
+
+
+
+ {/* Enhanced decorative accent */}
+
+
+ {/* Professional corner accents */}
+
+
+ )
+}
+
+export default TwoColumnSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/ui/sonner.tsx b/servers/nextjs/components/ui/sonner.tsx
new file mode 100644
index 00000000..452f4d9f
--- /dev/null
+++ b/servers/nextjs/components/ui/sonner.tsx
@@ -0,0 +1,31 @@
+"use client"
+
+import { useTheme } from "next-themes"
+import { Toaster as Sonner } from "sonner"
+
+type ToasterProps = React.ComponentProps
+
+const Toaster = ({ ...props }: ToasterProps) => {
+ const { theme = "system" } = useTheme()
+
+ return (
+
+ )
+}
+
+export { Toaster }
diff --git a/servers/nextjs/package-lock.json b/servers/nextjs/package-lock.json
index ffb80ae7..18a70919 100644
--- a/servers/nextjs/package-lock.json
+++ b/servers/nextjs/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "pfm",
+ "name": "presenton",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "pfm",
+ "name": "presenton",
"version": "0.1.0",
"dependencies": {
"@dnd-kit/core": "^6.3.1",
@@ -39,20 +39,22 @@
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"cmdk": "^1.0.0",
- "html-to-image": "^1.11.13",
"jsonrepair": "^3.12.0",
"lucide-react": "^0.447.0",
"marked": "^15.0.11",
"next": "^14.2.14",
- "puppeteer": "^24.8.2",
+ "next-themes": "^0.4.6",
"react": "^18",
"react-dom": "^18",
"react-redux": "^9.1.2",
"recharts": "^2.15.0",
+ "sonner": "^2.0.6",
"tailwind-merge": "^2.5.3",
"tailwind-scrollbar-hide": "^2.0.0",
"tailwindcss-animate": "^1.0.7",
- "tiptap-markdown": "^0.8.10"
+ "tiptap-markdown": "^0.8.10",
+ "zod": "^3.25.76",
+ "zod-to-json-schema": "^3.24.6"
},
"devDependencies": {
"@types/animejs": "^3.1.12",
@@ -77,29 +79,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@babel/code-frame": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
- "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.27.1",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.1.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
- "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/runtime": {
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
@@ -587,27 +566,6 @@
"url": "https://opencollective.com/popperjs"
}
},
- "node_modules/@puppeteer/browsers": {
- "version": "2.10.5",
- "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.5.tgz",
- "integrity": "sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w==",
- "license": "Apache-2.0",
- "dependencies": {
- "debug": "^4.4.1",
- "extract-zip": "^2.0.1",
- "progress": "^2.0.3",
- "proxy-agent": "^6.5.0",
- "semver": "^7.7.2",
- "tar-fs": "^3.0.8",
- "yargs": "^17.7.2"
- },
- "bin": {
- "browsers": "lib/cjs/main-cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@radix-ui/number": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
@@ -1810,9 +1768,9 @@
}
},
"node_modules/@tiptap/core": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.26.0.tgz",
- "integrity": "sha512-MfZz5MAV6MlY3aBTCr8dCziQ7ZgTpSC6o1aogHCBmFWBrMmsyYGbqFffwWo2vZJ1VNY/VMh99qHq3wM1jrZFGg==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.26.1.tgz",
+ "integrity": "sha512-fymyd/XZvYiHjBoLt1gxs024xP/LY26d43R1vluYq7AHBL/7DE3ywzy+1GEsGyAv5Je2L0KBhNIR/izbq3Kaqg==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1823,9 +1781,9 @@
}
},
"node_modules/@tiptap/extension-blockquote": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.26.0.tgz",
- "integrity": "sha512-GKlSzwfw0TeUvcCTqYREXqnF2isAZ2VxDIy6MLQ54IS34mAsnp/tnVhYZmyuau3BSBsWzg/UyqgThhKPrbLUoA==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.26.1.tgz",
+ "integrity": "sha512-viQ6AHRhjCYYipKK6ZepBzwZpkuMvO9yhRHeUZDvlSOAh8rvsUTSre0y74nu8QRYUt4a44lJJ6BpphJK7bEgYA==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1836,9 +1794,9 @@
}
},
"node_modules/@tiptap/extension-bold": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.26.0.tgz",
- "integrity": "sha512-MvcgBVpnFlBAZXcaaVSwCTekaedeMhBKw2Uan7PZtKwAG4IjfUwbh+K7tn459RcpRI0byNqsrR8cqawpasanng==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.26.1.tgz",
+ "integrity": "sha512-zCce9PRuTNhadFir71luLo99HERDpGJ0EEflGm7RN8I1SnNi9gD5ooK42BOIQtejGCJqg3hTPZiYDJC2hXvckQ==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1849,9 +1807,9 @@
}
},
"node_modules/@tiptap/extension-bubble-menu": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.26.0.tgz",
- "integrity": "sha512-i5e20GD4IpvaG2b/AJLNxUztgWmehWq8HY3KAaBCHXsHBgyAiOFdW3+JjQtJhIPt3kWJPmwRWWdaEz1/zWiukg==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.26.1.tgz",
+ "integrity": "sha512-oHevUcZbTMFOTpdCEo4YEDe044MB4P1ZrWyML8CGe5tnnKdlI9BN03AXpI1mEEa5CA3H1/eEckXx8EiCgYwQ3Q==",
"license": "MIT",
"dependencies": {
"tippy.js": "^6.3.7"
@@ -1866,9 +1824,9 @@
}
},
"node_modules/@tiptap/extension-bullet-list": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.26.0.tgz",
- "integrity": "sha512-Y4g8vdCCX4J7yDt/ndCVMmOmIL2ecBMxffed9bRMvC/QKRVn+76q1hYl5pQvUgwdRDOvToO4qJ92mgYkrDuRhg==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.26.1.tgz",
+ "integrity": "sha512-HHakuV4ckYCDOnBbne088FvCEP4YICw+wgPBz/V2dfpiFYQ4WzT0LPK9s7OFMCN+ROraoug+1ryN1Z1KdIgujQ==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1879,9 +1837,9 @@
}
},
"node_modules/@tiptap/extension-code": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.26.0.tgz",
- "integrity": "sha512-uW99GEiZ+GSmHzSEFLXPguY8UOjqEeqFK09iDGtjCKxtY/G/A4GzHcL2AcKS7wbEh3sgztiOaWFmU3zCrESTXg==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.26.1.tgz",
+ "integrity": "sha512-GU9deB1A/Tr4FMPu71CvlcjGKwRhGYz60wQ8m4aM+ELZcVIcZRa1ebR8bExRIEWnvRztQuyRiCQzw2N0xQJ1QQ==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1892,9 +1850,9 @@
}
},
"node_modules/@tiptap/extension-code-block": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.26.0.tgz",
- "integrity": "sha512-o2TijzUlc5HXsBJau7m2w+XTRAFpZY6eEQ2siJOqjiCLr+HWxRCot+osxXHPclbaKfHgBRMrX9RAP/du6zWl7A==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.26.1.tgz",
+ "integrity": "sha512-/TDDOwONl0qEUc4+B6V9NnWtSjz95eg7/8uCb8Y8iRbGvI9vT4/znRKofFxstvKmW4URu/H74/g0ywV57h0B+A==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1906,9 +1864,9 @@
}
},
"node_modules/@tiptap/extension-document": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.26.0.tgz",
- "integrity": "sha512-a4nmzo+D2WQ0KqQEotYUK645/934H1kJo5fVP7Geksrpj4KeZgAkUunIsb6qUErgtGgPgm2qMCHkUgublJskdg==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.26.1.tgz",
+ "integrity": "sha512-2P2IZp1NRAE+21mRuFBiP3X2WKfZ6kUC23NJKpn8bcOamY3obYqCt0ltGPhE4eR8n8QAl2fI/3jIgjR07dC8ow==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1919,9 +1877,9 @@
}
},
"node_modules/@tiptap/extension-dropcursor": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.26.0.tgz",
- "integrity": "sha512-zChqWqlEKTfREg3OCHU13bCXJ2eHIWOB1jOSLtYC54B7bprCn3TgylUge3tiN7x/FLKFa5jvxo2Rl6GAiVnA0A==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.26.1.tgz",
+ "integrity": "sha512-JkDQU2ZYFOuT5mNYb8OiWGwD1HcjbtmX8tLNugQbToECmz9WvVPqJmn7V/q8VGpP81iEECz/IsyRmuf2kSD4uA==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1933,9 +1891,9 @@
}
},
"node_modules/@tiptap/extension-floating-menu": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.26.0.tgz",
- "integrity": "sha512-49UUTMQlukERQDSola3H3QNtTVh1A9aZs9NDlLoyNOtt9yKUuHEimmXJfA3bE4iwbuNxrV7NB9Nk+UK2X4rSCg==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.26.1.tgz",
+ "integrity": "sha512-OJF+H6qhQogVTMedAGSWuoL1RPe3LZYXONuFCVyzHnvvMpK+BP1vm180E2zDNFnn/DVA+FOrzNGpZW7YjoFH1w==",
"license": "MIT",
"dependencies": {
"tippy.js": "^6.3.7"
@@ -1950,9 +1908,9 @@
}
},
"node_modules/@tiptap/extension-gapcursor": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.26.0.tgz",
- "integrity": "sha512-0VzdvQy1omQbMSIHIq0eY37ZaO4FBZykJkbmCR8OM86wdzbmI4JdOfaqsSZ767fzlU48NMljx346+pk721giBA==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.26.1.tgz",
+ "integrity": "sha512-KOiMZc3PwJS3hR0nSq5d0TJi2jkNZkLZElcT6pCEnhRHzPH6dRMu9GM5Jj798ZRUy0T9UFcKJalFZaDxnmRnpg==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1964,9 +1922,9 @@
}
},
"node_modules/@tiptap/extension-hard-break": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.26.0.tgz",
- "integrity": "sha512-TxpF6a43r9XrXXWzunjqIjzTDJ3J1+I733J8JPGrAaZTnUFR+Gf6nKz/nlm/UAey5utejIAZ1jOCn4GgEgRSFw==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.26.1.tgz",
+ "integrity": "sha512-d6uStdNKi8kjPlHAyO59M6KGWATNwhLCD7dng0NXfwGndc22fthzIk/6j9F6ltQx30huy5qQram6j3JXwNACoA==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1977,9 +1935,9 @@
}
},
"node_modules/@tiptap/extension-heading": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.26.0.tgz",
- "integrity": "sha512-7PF8JCZyiZV4V419OsEzy7B+Rc+qtLYwnVJtrY+8//42eTZB8lzpcSFETz2sFs+Qa7UO1nv9QmYw81sJzgBjhQ==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.26.1.tgz",
+ "integrity": "sha512-KSzL8WZV3pjJG9ke4RaU70+B5UlYR2S6olNt5UCAawM+fi11mobVztiBoC19xtpSVqIXC1AmXOqUgnuSvmE4ZA==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1990,9 +1948,9 @@
}
},
"node_modules/@tiptap/extension-history": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.26.0.tgz",
- "integrity": "sha512-VVt7RJKrf6beOsxj178hM3LL93l+WpkRMCZ68LynyfMSP9Lr0pYl0tgFOhZIAwypMKdxdbEExqWJAgL2mzliGQ==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.26.1.tgz",
+ "integrity": "sha512-m6YR1gkkauIDo3PRl0gP+7Oc4n5OqDzcjVh6LvWREmZP8nmi94hfseYbqOXUb6RPHIc0JKF02eiRifT4MSd2nw==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2004,9 +1962,9 @@
}
},
"node_modules/@tiptap/extension-horizontal-rule": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.26.0.tgz",
- "integrity": "sha512-shF5G5+tkYCiBOS+iIU6KC8CpRxYXPMZBuPxLoqysovl9Lj2D+RBgsAEwZl44fT6AbLPEMSVEifcnvLeB+3d6w==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.26.1.tgz",
+ "integrity": "sha512-mT6baqOhs/NakgrAeDeed194E/ZJFGL692H0C7f1N7WDRaWxUu2oR0LrnRqSH5OyPjELkzu6nQnNy0+0tFGHHg==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2018,9 +1976,9 @@
}
},
"node_modules/@tiptap/extension-italic": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.26.0.tgz",
- "integrity": "sha512-xlCA4KP4p2SbeZQgkCI61j+jtcr5hkD7xlr2yCZqK+YxS32TzwjxZW/NAj3l8UlYmQYhsVBVodxKuDKsJcRhiQ==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.26.1.tgz",
+ "integrity": "sha512-pOs6oU4LyGO89IrYE4jbE8ZYsPwMMIiKkYfXcfeD9NtpGNBnjeVXXF5I9ndY2ANrCAgC8k58C3/powDRf0T2yA==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2031,9 +1989,9 @@
}
},
"node_modules/@tiptap/extension-list-item": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.26.0.tgz",
- "integrity": "sha512-4Wtf6PfNlN8+BlBokV07DSWX4EbLHJagCx3gsLI5hwcL+bsW6tZVFFxMnN5+6eYcpWyU1fi7bBJ/kI2fNEA4Yg==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.26.1.tgz",
+ "integrity": "sha512-quOXckC73Luc3x+Dcm88YAEBW+Crh3x5uvtQOQtn2GEG91AshrvbnhGRiYnfvEN7UhWIS+FYI5liHFcRKSUKrQ==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2044,9 +2002,9 @@
}
},
"node_modules/@tiptap/extension-ordered-list": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.26.0.tgz",
- "integrity": "sha512-VeXiCnp3KHPAWeCN+HVY32U84mmdSnWa8fk2ht6LbxGgGJ01fFQvaXvRDWqMN5L0Vd52b1JBfV/lL1CBTByI/g==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.26.1.tgz",
+ "integrity": "sha512-UHKNRxq6TBnXMGFSq91knD6QaHsyyOwLOsXMzupmKM5Su0s+CRXEjfav3qKlbb9e4m7D7S/a0aPm8nC9KIXNhQ==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2057,9 +2015,9 @@
}
},
"node_modules/@tiptap/extension-paragraph": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.26.0.tgz",
- "integrity": "sha512-lg3BYqJm/P6s7vjJQM/QdZ//AeRezXr31hg3dXqb8Z7/oB6LOt5qzpOkr4XZdsaRYfOmGloHuxfxQ2Lyft6Dvg==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.26.1.tgz",
+ "integrity": "sha512-UezvM9VDRAVJlX1tykgHWSD1g3MKfVMWWZ+Tg+PE4+kizOwoYkRWznVPgCAxjmyHajxpCKRXgqTZkOxjJ9Kjzg==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2070,9 +2028,9 @@
}
},
"node_modules/@tiptap/extension-strike": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.26.0.tgz",
- "integrity": "sha512-x1kJj0YaApqQUKlOInqsiUsVHnhndRLsOMsIgwlgOM1wqsNDmYzNrZV2MvNYyrd4FYXdXZABYMd/EF0U/bVSPQ==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.26.1.tgz",
+ "integrity": "sha512-CkoRH+pAi6MgdCh7K0cVZl4N2uR4pZdabXAnFSoLZRSg6imLvEUmWHfSi1dl3Z7JOvd3a4yZ4NxerQn5MWbJ7g==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2083,9 +2041,9 @@
}
},
"node_modules/@tiptap/extension-text": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.26.0.tgz",
- "integrity": "sha512-M7+S3b2nnaGN8oMV+eXfSUkgw1q0yaXlVe1h6Ug6HWzdFKr/ei9YFG0zW6cBnXW5KoQQfL9ep1FVQKgdrCsPcg==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.26.1.tgz",
+ "integrity": "sha512-p2n8WVMd/2vckdJlol24acaTDIZAhI7qle5cM75bn01sOEZoFlSw6SwINOULrUCzNJsYb43qrLEibZb4j2LeQw==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2096,9 +2054,9 @@
}
},
"node_modules/@tiptap/extension-text-style": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.26.0.tgz",
- "integrity": "sha512-JEhWobvuGu3OI2Ccivmd71WRhI2Tm3yMeooFFnHgvXoNYBTEsmXeQU3Y9pds+4KW/tn2b05Du9AoIhv+cqWPjw==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.26.1.tgz",
+ "integrity": "sha512-t9Nc/UkrbCfnSHEUi1gvUQ2ZPzvfdYFT5TExoV2DTiUCkhG6+mecT5bTVFGW3QkPmbToL+nFhGn4ZRMDD0SP3Q==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2109,9 +2067,9 @@
}
},
"node_modules/@tiptap/extension-underline": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.26.0.tgz",
- "integrity": "sha512-zmcCzWGm99xAFLdQEQcBXOkA9vcHpXkSaxCDoc8SAJbjFFtcoY3SV5YfOkyKoVkFv+MWCmmoGws7WUYqn11OgQ==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.26.1.tgz",
+ "integrity": "sha512-/fufv41WDMdf0a4xmFAxONoAz08TonJXX6NEoSJmuGKO59M/Y0Pz8DTK1g32Wk44kn7dyScDiPlvvndl+UOv0A==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2122,9 +2080,9 @@
}
},
"node_modules/@tiptap/pm": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.26.0.tgz",
- "integrity": "sha512-vcrvWHzVTZxPOpELycsWzsJVVqGT/PqVpz+yEkeflCc3e/oGlim/OXjpvHn6ObzKZRDqk0v/PGH3NTr7CcmXsA==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.26.1.tgz",
+ "integrity": "sha512-8aF+mY/vSHbGFqyG663ds84b+vca5Lge3tHdTMTKazxCnhXR9dn2oQJMnZ78YZvdRbkPkMJJHti9h3K7u2UQvw==",
"license": "MIT",
"dependencies": {
"prosemirror-changeset": "^2.3.0",
@@ -2152,13 +2110,13 @@
}
},
"node_modules/@tiptap/react": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.26.0.tgz",
- "integrity": "sha512-2grMGGi7yEDdQndcdvTQ4sGeCzUIm0xmnaSSL01MryCN7d1WQzavuPH9kjZiXZdmGwWgnZfw9YErLIvMFKjh4g==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.26.1.tgz",
+ "integrity": "sha512-Zxlwzi1iML7aELa+PyysFD2ncVo2mEcjTkhoDok9iTbMGpm1oU8hgR1i6iHrcSNQLfaRiW6M7HNhZZQPKIC9yw==",
"license": "MIT",
"dependencies": {
- "@tiptap/extension-bubble-menu": "^2.26.0",
- "@tiptap/extension-floating-menu": "^2.26.0",
+ "@tiptap/extension-bubble-menu": "^2.26.1",
+ "@tiptap/extension-floating-menu": "^2.26.1",
"@types/use-sync-external-store": "^0.0.6",
"fast-deep-equal": "^3",
"use-sync-external-store": "^1"
@@ -2175,44 +2133,38 @@
}
},
"node_modules/@tiptap/starter-kit": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.26.0.tgz",
- "integrity": "sha512-HqBHKpK61oY/EKO9eVcekvO224BD8lvkGFck5/K6SPnFGnjAy8t5Cwp4n6BDPkKQXWUYj55+CzJqMT8c2yYWew==",
+ "version": "2.26.1",
+ "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.26.1.tgz",
+ "integrity": "sha512-oziMGCds8SVQ3s5dRpBxVdEKZAmO/O//BjZ69mhA3q4vJdR0rnfLb5fTxSeQvHiqB878HBNn76kNaJrHrV35GA==",
"license": "MIT",
"dependencies": {
- "@tiptap/core": "^2.26.0",
- "@tiptap/extension-blockquote": "^2.26.0",
- "@tiptap/extension-bold": "^2.26.0",
- "@tiptap/extension-bullet-list": "^2.26.0",
- "@tiptap/extension-code": "^2.26.0",
- "@tiptap/extension-code-block": "^2.26.0",
- "@tiptap/extension-document": "^2.26.0",
- "@tiptap/extension-dropcursor": "^2.26.0",
- "@tiptap/extension-gapcursor": "^2.26.0",
- "@tiptap/extension-hard-break": "^2.26.0",
- "@tiptap/extension-heading": "^2.26.0",
- "@tiptap/extension-history": "^2.26.0",
- "@tiptap/extension-horizontal-rule": "^2.26.0",
- "@tiptap/extension-italic": "^2.26.0",
- "@tiptap/extension-list-item": "^2.26.0",
- "@tiptap/extension-ordered-list": "^2.26.0",
- "@tiptap/extension-paragraph": "^2.26.0",
- "@tiptap/extension-strike": "^2.26.0",
- "@tiptap/extension-text": "^2.26.0",
- "@tiptap/extension-text-style": "^2.26.0",
- "@tiptap/pm": "^2.26.0"
+ "@tiptap/core": "^2.26.1",
+ "@tiptap/extension-blockquote": "^2.26.1",
+ "@tiptap/extension-bold": "^2.26.1",
+ "@tiptap/extension-bullet-list": "^2.26.1",
+ "@tiptap/extension-code": "^2.26.1",
+ "@tiptap/extension-code-block": "^2.26.1",
+ "@tiptap/extension-document": "^2.26.1",
+ "@tiptap/extension-dropcursor": "^2.26.1",
+ "@tiptap/extension-gapcursor": "^2.26.1",
+ "@tiptap/extension-hard-break": "^2.26.1",
+ "@tiptap/extension-heading": "^2.26.1",
+ "@tiptap/extension-history": "^2.26.1",
+ "@tiptap/extension-horizontal-rule": "^2.26.1",
+ "@tiptap/extension-italic": "^2.26.1",
+ "@tiptap/extension-list-item": "^2.26.1",
+ "@tiptap/extension-ordered-list": "^2.26.1",
+ "@tiptap/extension-paragraph": "^2.26.1",
+ "@tiptap/extension-strike": "^2.26.1",
+ "@tiptap/extension-text": "^2.26.1",
+ "@tiptap/extension-text-style": "^2.26.1",
+ "@tiptap/pm": "^2.26.1"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
}
},
- "node_modules/@tootallnate/quickjs-emscripten": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
- "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
- "license": "MIT"
- },
"node_modules/@types/animejs": {
"version": "3.1.13",
"resolved": "https://registry.npmjs.org/@types/animejs/-/animejs-3.1.13.tgz",
@@ -2309,7 +2261,7 @@
"version": "20.19.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.7.tgz",
"integrity": "sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
@@ -2377,21 +2329,13 @@
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
"integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@types/node": "*"
}
},
- "node_modules/agent-base": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
- "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/aggregate-error": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
@@ -2559,18 +2503,6 @@
"node": ">=0.8"
}
},
- "node_modules/ast-types": {
- "version": "0.13.4",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
- "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -2622,90 +2554,12 @@
"dev": true,
"license": "MIT"
},
- "node_modules/b4a": {
- "version": "1.6.7",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
- "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
- "license": "Apache-2.0"
- },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"license": "MIT"
},
- "node_modules/bare-events": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.0.tgz",
- "integrity": "sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==",
- "license": "Apache-2.0",
- "optional": true
- },
- "node_modules/bare-fs": {
- "version": "4.1.6",
- "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.6.tgz",
- "integrity": "sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==",
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "bare-events": "^2.5.4",
- "bare-path": "^3.0.0",
- "bare-stream": "^2.6.4"
- },
- "engines": {
- "bare": ">=1.16.0"
- },
- "peerDependencies": {
- "bare-buffer": "*"
- },
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- }
- }
- },
- "node_modules/bare-os": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz",
- "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==",
- "license": "Apache-2.0",
- "optional": true,
- "engines": {
- "bare": ">=1.14.0"
- }
- },
- "node_modules/bare-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
- "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "bare-os": "^3.0.1"
- }
- },
- "node_modules/bare-stream": {
- "version": "2.6.5",
- "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz",
- "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==",
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "streamx": "^2.21.0"
- },
- "peerDependencies": {
- "bare-buffer": "*",
- "bare-events": "*"
- },
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- },
- "bare-events": {
- "optional": true
- }
- }
- },
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -2727,15 +2581,6 @@
],
"license": "MIT"
},
- "node_modules/basic-ftp": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
- "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- }
- },
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -2822,6 +2667,7 @@
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": "*"
@@ -2879,15 +2725,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/camelcase-css": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
@@ -3000,19 +2837,6 @@
"node": ">= 6"
}
},
- "node_modules/chromium-bidi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-5.1.0.tgz",
- "integrity": "sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw==",
- "license": "Apache-2.0",
- "dependencies": {
- "mitt": "^3.0.1",
- "zod": "^3.24.1"
- },
- "peerDependencies": {
- "devtools-protocol": "*"
- }
- },
"node_modules/ci-info": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz",
@@ -3103,20 +2927,6 @@
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"license": "MIT"
},
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -3218,32 +3028,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/cosmiconfig": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
- "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
- "license": "MIT",
- "dependencies": {
- "env-paths": "^2.2.1",
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/d-fischer"
- },
- "peerDependencies": {
- "typescript": ">=4.9.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
"node_modules/crelt": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
@@ -3476,15 +3260,6 @@
"node": ">=0.10"
}
},
- "node_modules/data-uri-to-buffer": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
- "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
@@ -3496,6 +3271,7 @@
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
@@ -3515,20 +3291,6 @@
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
"license": "MIT"
},
- "node_modules/degenerator": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
- "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
- "license": "MIT",
- "dependencies": {
- "ast-types": "^0.13.4",
- "escodegen": "^2.1.0",
- "esprima": "^4.0.1"
- },
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -3545,12 +3307,6 @@
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
"license": "MIT"
},
- "node_modules/devtools-protocol": {
- "version": "0.0.1464554",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1464554.tgz",
- "integrity": "sha512-CAoP3lYfwAGQTaAXYvA6JZR0fjGUb7qec1qf4mToyoH2TZgUFeIqYcjh6f9jNuhHfuZiEdH+PONHYrLhRQX6aw==",
- "license": "BSD-3-Clause"
- },
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@@ -3605,13 +3361,6 @@
"safer-buffer": "^2.1.0"
}
},
- "node_modules/ecc-jsbn/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -3622,6 +3371,7 @@
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
@@ -3653,24 +3403,6 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -3720,15 +3452,6 @@
"node": ">= 0.4"
}
},
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -3739,58 +3462,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/escodegen": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
- "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=6.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/eventemitter2": {
"version": "6.4.7",
"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
@@ -3852,6 +3523,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"debug": "^4.1.1",
@@ -3893,12 +3565,6 @@
"node": ">=6.0.0"
}
},
- "node_modules/fast-fifo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
- "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
- "license": "MIT"
- },
"node_modules/fast-glob": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
@@ -3940,6 +3606,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"pend": "~1.2.0"
@@ -4067,15 +3734,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "license": "ISC",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -4128,6 +3786,7 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
@@ -4139,20 +3798,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/get-uri": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
- "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
- "license": "MIT",
- "dependencies": {
- "basic-ftp": "^5.0.2",
- "data-uri-to-buffer": "^6.0.2",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/getos": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
@@ -4308,25 +3953,6 @@
"node": ">= 0.4"
}
},
- "node_modules/html-to-image": {
- "version": "1.11.13",
- "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.13.tgz",
- "integrity": "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==",
- "license": "MIT"
- },
- "node_modules/http-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/http-signature": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
@@ -4342,19 +3968,6 @@
"node": ">=0.10"
}
},
- "node_modules/https-proxy-agent": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
- "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/human-signals": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@@ -4396,22 +4009,6 @@
"url": "https://opencollective.com/immer"
}
},
- "node_modules/import-fresh": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
- "license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/indent-string": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
@@ -4441,25 +4038,6 @@
"node": ">=12"
}
},
- "node_modules/ip-address": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
- "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
- "license": "MIT",
- "dependencies": {
- "jsbn": "1.1.0",
- "sprintf-js": "^1.1.3"
- },
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "license": "MIT"
- },
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -4629,28 +4207,11 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"license": "MIT"
},
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
"node_modules/jsbn": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
- "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
- "license": "MIT"
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/json-schema": {
@@ -4883,13 +4444,10 @@
}
},
"node_modules/lru-cache": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
},
"node_modules/lucide-react": {
"version": "0.447.0",
@@ -5047,16 +4605,11 @@
"node": ">=16 || 14 >=14.17"
}
},
- "node_modules/mitt": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
- "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
- "license": "MIT"
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/mz": {
@@ -5088,15 +4641,6 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
- "node_modules/netmask": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
- "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
"node_modules/next": {
"version": "14.2.30",
"resolved": "https://registry.npmjs.org/next/-/next-14.2.30.tgz",
@@ -5147,6 +4691,16 @@
}
}
},
+ "node_modules/next-themes": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz",
+ "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
+ }
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -5204,6 +4758,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"wrappy": "1"
@@ -5254,74 +4809,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/pac-proxy-agent": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
- "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
- "license": "MIT",
- "dependencies": {
- "@tootallnate/quickjs-emscripten": "^0.23.0",
- "agent-base": "^7.1.2",
- "debug": "^4.3.4",
- "get-uri": "^6.0.1",
- "http-proxy-agent": "^7.0.0",
- "https-proxy-agent": "^7.0.6",
- "pac-resolver": "^7.0.1",
- "socks-proxy-agent": "^8.0.5"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/pac-resolver": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
- "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
- "license": "MIT",
- "dependencies": {
- "degenerator": "^5.0.0",
- "netmask": "^2.0.2"
- },
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"license": "BlueOak-1.0.0"
},
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "license": "MIT",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -5353,16 +4846,11 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "license": "ISC"
- },
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/performance-now": {
@@ -5552,15 +5040,6 @@
"node": ">= 0.6.0"
}
},
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -5686,9 +5165,9 @@
}
},
"node_modules/prosemirror-model": {
- "version": "1.25.1",
- "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.1.tgz",
- "integrity": "sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg==",
+ "version": "1.25.2",
+ "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.2.tgz",
+ "integrity": "sha512-BVypCAJ4SL6jOiTsDffP3Wp6wD69lRhI4zg/iT8JXjp3ccZFiq5WyguxvMKmdKFC3prhaig7wSr8dneDToHE1Q==",
"license": "MIT",
"dependencies": {
"orderedmap": "^2.0.0"
@@ -5785,31 +5264,6 @@
"prosemirror-transform": "^1.1.0"
}
},
- "node_modules/proxy-agent": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
- "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "^4.3.4",
- "http-proxy-agent": "^7.0.1",
- "https-proxy-agent": "^7.0.6",
- "lru-cache": "^7.14.1",
- "pac-proxy-agent": "^7.1.0",
- "proxy-from-env": "^1.1.0",
- "socks-proxy-agent": "^8.0.5"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/proxy-agent/node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "license": "MIT"
- },
"node_modules/proxy-from-env": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
@@ -5821,6 +5275,7 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
"integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
@@ -5836,44 +5291,6 @@
"node": ">=6"
}
},
- "node_modules/puppeteer": {
- "version": "24.12.1",
- "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.12.1.tgz",
- "integrity": "sha512-+vvwl+Xo4z5uXLLHG+XW8uXnUXQ62oY6KU6bEFZJvHWLutbmv5dw9A/jcMQ0fqpQdLydHmK0Uy7/9Ilj8ufwSQ==",
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@puppeteer/browsers": "2.10.5",
- "chromium-bidi": "5.1.0",
- "cosmiconfig": "^9.0.0",
- "devtools-protocol": "0.0.1464554",
- "puppeteer-core": "24.12.1",
- "typed-query-selector": "^2.12.0"
- },
- "bin": {
- "puppeteer": "lib/cjs/puppeteer/node/cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/puppeteer-core": {
- "version": "24.12.1",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.12.1.tgz",
- "integrity": "sha512-8odp6d3ERKBa3BAVaYWXn95UxQv3sxvP1reD+xZamaX6ed8nCykhwlOiHSaHR9t/MtmIB+rJmNencI6Zy4Gxvg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@puppeteer/browsers": "2.10.5",
- "chromium-bidi": "5.1.0",
- "debug": "^4.4.1",
- "devtools-protocol": "0.0.1464554",
- "typed-query-selector": "^2.12.0",
- "ws": "^8.18.3"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/qs": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
@@ -6142,15 +5559,6 @@
"throttleit": "^1.0.0"
}
},
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/reselect": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
@@ -6177,15 +5585,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -6297,6 +5696,7 @@
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -6424,52 +5824,14 @@
"node": ">=8"
}
},
- "node_modules/smart-buffer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "node_modules/sonner": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.6.tgz",
+ "integrity": "sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q==",
"license": "MIT",
- "engines": {
- "node": ">= 6.0.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/socks": {
- "version": "2.8.6",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz",
- "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==",
- "license": "MIT",
- "dependencies": {
- "ip-address": "^9.0.5",
- "smart-buffer": "^4.2.0"
- },
- "engines": {
- "node": ">= 10.0.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/socks-proxy-agent": {
- "version": "8.0.5",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
- "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "^4.3.4",
- "socks": "^2.8.3"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
}
},
"node_modules/source-map-js": {
@@ -6481,12 +5843,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/sprintf-js": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
- "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
- "license": "BSD-3-Clause"
- },
"node_modules/sshpk": {
"version": "1.18.0",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
@@ -6513,13 +5869,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/sshpk/node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/streamsearch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
@@ -6528,19 +5877,6 @@
"node": ">=10.0.0"
}
},
- "node_modules/streamx": {
- "version": "2.22.1",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz",
- "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==",
- "license": "MIT",
- "dependencies": {
- "fast-fifo": "^1.3.2",
- "text-decoder": "^1.1.0"
- },
- "optionalDependencies": {
- "bare-events": "^2.2.0"
- }
- },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -6828,40 +6164,6 @@
"node": ">=4"
}
},
- "node_modules/tar-fs": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz",
- "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==",
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0",
- "tar-stream": "^3.1.5"
- },
- "optionalDependencies": {
- "bare-fs": "^4.0.1",
- "bare-path": "^3.0.0"
- }
- },
- "node_modules/tar-stream": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
- "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
- "license": "MIT",
- "dependencies": {
- "b4a": "^1.6.4",
- "fast-fifo": "^1.2.0",
- "streamx": "^2.15.0"
- }
- },
- "node_modules/text-decoder": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
- "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
- "license": "Apache-2.0",
- "dependencies": {
- "b4a": "^1.6.4"
- }
- },
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -7062,17 +6364,11 @@
"node": ">=8"
}
},
- "node_modules/typed-query-selector": {
- "version": "2.12.0",
- "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz",
- "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==",
- "license": "MIT"
- },
"node_modules/typescript": {
"version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
- "devOptional": true,
+ "dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
@@ -7092,7 +6388,7 @@
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
- "devOptional": true,
+ "dev": true,
"license": "MIT"
},
"node_modules/universalify": {
@@ -7245,6 +6541,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
@@ -7280,38 +6577,9 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
"license": "ISC"
},
- "node_modules/ws": {
- "version": "8.18.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
- "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/yaml": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
@@ -7324,37 +6592,11 @@
"node": ">= 14.6"
}
},
- "node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"buffer-crc32": "~0.2.3",
@@ -7369,6 +6611,15 @@
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
+ },
+ "node_modules/zod-to-json-schema": {
+ "version": "3.24.6",
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz",
+ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==",
+ "license": "ISC",
+ "peerDependencies": {
+ "zod": "^3.24.1"
+ }
}
}
}
diff --git a/servers/nextjs/package.json b/servers/nextjs/package.json
index 8131f50e..f25ec232 100644
--- a/servers/nextjs/package.json
+++ b/servers/nextjs/package.json
@@ -1,5 +1,5 @@
{
- "name": "pfm",
+ "name": "presenton",
"version": "0.1.0",
"private": true,
"type": "module",
@@ -46,15 +46,18 @@
"lucide-react": "^0.447.0",
"marked": "^15.0.11",
"next": "^14.2.14",
- "puppeteer": "24.8.2",
+ "next-themes": "^0.4.6",
"react": "^18",
"react-dom": "^18",
"react-redux": "^9.1.2",
"recharts": "^2.15.0",
+ "sonner": "^2.0.6",
"tailwind-merge": "^2.5.3",
"tailwind-scrollbar-hide": "^2.0.0",
"tailwindcss-animate": "^1.0.7",
- "tiptap-markdown": "^0.8.10"
+ "tiptap-markdown": "^0.8.10",
+ "zod": "^3.25.76",
+ "zod-to-json-schema": "^3.24.6"
},
"devDependencies": {
"@types/animejs": "^3.1.12",