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 && ( + + )} +
+
+
+ ) + } + + 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 && ( + + )} +
+
+
+ ) + } + + 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 */} +
+
+
+

{name}

+

{fileName}

+
+
+ #{index + 1} +
+
+
+ + {/* 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

+ +
+ {slideData.contactInfo.email && ( + +
+ + + + +
+ {slideData.contactInfo.email} +
+ )} + + {slideData.contactInfo.phone && ( + +
+ + + +
+ {slideData.contactInfo.phone} +
+ )} + + {slideData.contactInfo.website && ( + +
+ + + +
+ {slideData.contactInfo.website.replace(/^https?:\/\//, '')} +
+ )} +
+ + {/* 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 && ( +

+ {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.step} +
+
+ + {/* 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} + ) : ( +
+ {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} + ) : ( +
+ {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",