From 765ded6a061cb219b75afb117286ff59eadb5573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20Kadir=20Ak=C4=B1n?= Date: Sun, 14 Dec 2025 17:25:26 +0300 Subject: [PATCH] feat(messages): add hero prompt input translations for multiple languages --- messages/ar.json | 20 +- messages/de.json | 20 +- messages/en.json | 20 +- messages/es.json | 20 +- messages/fr.json | 20 +- messages/it.json | 20 +- messages/ja.json | 20 +- messages/ko.json | 20 +- messages/pt.json | 20 +- messages/tr.json | 20 +- messages/zh.json | 20 +- package-lock.json | 1180 +++++++++++++++++- package.json | 1 + src/app/api/prompt-builder/chat/route.ts | 52 +- src/app/page.tsx | 31 +- src/app/prompts/new/page.tsx | 8 +- src/components/prompts/hero-prompt-input.tsx | 185 +++ src/components/prompts/prompt-builder.tsx | 69 +- src/components/prompts/prompt-form.tsx | 4 +- src/lib/ai/prompt-builder-tools.ts | 51 +- src/lib/i18n/client.ts | 7 +- 21 files changed, 1755 insertions(+), 53 deletions(-) create mode 100644 src/components/prompts/hero-prompt-input.tsx diff --git a/messages/ar.json b/messages/ar.json index d01eb15d..f647622f 100644 --- a/messages/ar.json +++ b/messages/ar.json @@ -650,6 +650,20 @@ "tokens": "رموز", "noChanges": "لا توجد تغييرات" }, + "heroPromptInput": { + "placeholder": "صف البرومبت الذي تريد إنشاءه...", + "ariaLabel": "صف البرومبت الذي تريد إنشاءه", + "submit": "إنشاء برومبت", + "hint": "انقر للبدء في الإنشاء بالذكاء الاصطناعي", + "modelName": "وكيل البرومبت", + "examples": { + "codeReview": "أنشئ مساعد مراجعة كود يكتشف الأخطاء", + "emailWriter": "أنشئ كاتب بريد إلكتروني احترافي لأي مناسبة", + "studyPlanner": "صمم منشئ خطط دراسية مخصصة", + "recipeGenerator": "أنشئ منشئ وصفات بناءً على المكونات المتوفرة", + "interviewCoach": "أنشئ مدرب تحضير للمقابلات" + } + }, "notFound": { "title": "الصفحة غير موجودة", "description": "الصفحة التي تبحث عنها غير موجودة أو تم نقلها.", @@ -676,7 +690,11 @@ "currentPrompt": "قيد الإنشاء:", "stateTitle": "العنوان", "stateContent": "المحتوى", - "stateTags": "وسوم" + "stateTags": "وسوم", + "editAction1": "املأ الحقول الناقصة، حدّث الوسوم.", + "editAction2": "حسّن المتغيرات", + "editAction3": "استخدم المتغيرات", + "editAction4": "حوّل إلى أمر JSON" }, "report": { "report": "إبلاغ", diff --git a/messages/de.json b/messages/de.json index 4363fd03..f8041ef4 100644 --- a/messages/de.json +++ b/messages/de.json @@ -650,6 +650,20 @@ "tokens": "Token", "noChanges": "Keine Änderungen" }, + "heroPromptInput": { + "placeholder": "Beschreiben Sie den Prompt, den Sie erstellen möchten...", + "ariaLabel": "Beschreiben Sie den Prompt, den Sie erstellen möchten", + "submit": "Prompt erstellen", + "hint": "Klicken Sie, um mit KI zu erstellen", + "modelName": "Prompt-Agent", + "examples": { + "codeReview": "Erstellen Sie einen Code-Review-Assistenten, der Bugs findet", + "emailWriter": "Bauen Sie einen professionellen E-Mail-Verfasser für jeden Anlass", + "studyPlanner": "Entwerfen Sie einen personalisierten Lernplan-Generator", + "recipeGenerator": "Erstellen Sie einen Rezeptgenerator basierend auf verfügbaren Zutaten", + "interviewCoach": "Erstellen Sie einen Vorstellungsgespräch-Coach" + } + }, "notFound": { "title": "Seite nicht gefunden", "description": "Die gesuchte Seite existiert nicht oder wurde verschoben.", @@ -676,7 +690,11 @@ "currentPrompt": "Erstellen:", "stateTitle": "Titel", "stateContent": "Inhalt", - "stateTags": "Tags" + "stateTags": "Tags", + "editAction1": "Fehlende Felder ausfüllen, Tags aktualisieren.", + "editAction2": "Variablen verbessern", + "editAction3": "Variablen verwenden", + "editAction4": "In JSON-Prompt konvertieren" }, "report": { "report": "Melden", diff --git a/messages/en.json b/messages/en.json index c11948ac..47b63353 100644 --- a/messages/en.json +++ b/messages/en.json @@ -660,6 +660,20 @@ "categories": "Categories", "createPrompt": "Create Prompt" }, + "heroPromptInput": { + "placeholder": "Describe the prompt you want to build...", + "ariaLabel": "Describe the prompt you want to build", + "submit": "Create prompt", + "hint": "Click to start building with AI", + "modelName": "Prompt Agent", + "examples": { + "codeReview": "Create a code review assistant that catches bugs", + "emailWriter": "Build a professional email writer for any occasion", + "studyPlanner": "Design a personalized study plan generator", + "recipeGenerator": "Make a recipe creator based on available ingredients", + "interviewCoach": "Create an interview preparation coach" + } + }, "promptBuilder": { "title": "Prompt Building Agent", "openBuilder": "Prompt Agent", @@ -676,7 +690,11 @@ "currentPrompt": "Building:", "stateTitle": "Title", "stateContent": "Content", - "stateTags": "tags" + "stateTags": "tags", + "editAction1": "Fill missing fields, update tags.", + "editAction2": "Make variables better", + "editAction3": "Use variables", + "editAction4": "Convert to JSON prompt" }, "report": { "report": "Report", diff --git a/messages/es.json b/messages/es.json index 367f4cc7..56ee89a7 100644 --- a/messages/es.json +++ b/messages/es.json @@ -650,6 +650,20 @@ "tokens": "tokens", "noChanges": "Sin cambios" }, + "heroPromptInput": { + "placeholder": "Describe el prompt que quieres crear...", + "ariaLabel": "Describe el prompt que quieres crear", + "submit": "Crear prompt", + "hint": "Haz clic para empezar a crear con IA", + "modelName": "Agente de Prompts", + "examples": { + "codeReview": "Crea un asistente de revisión de código que detecte errores", + "emailWriter": "Construye un escritor de emails profesionales para cualquier ocasión", + "studyPlanner": "Diseña un generador de planes de estudio personalizados", + "recipeGenerator": "Crea un generador de recetas basado en ingredientes disponibles", + "interviewCoach": "Crea un coach de preparación para entrevistas" + } + }, "notFound": { "title": "Página No Encontrada", "description": "La página que buscas no existe o ha sido movida.", @@ -676,7 +690,11 @@ "currentPrompt": "Construyendo:", "stateTitle": "Título", "stateContent": "Contenido", - "stateTags": "etiquetas" + "stateTags": "etiquetas", + "editAction1": "Completar campos faltantes, actualizar etiquetas.", + "editAction2": "Mejorar variables", + "editAction3": "Usar variables", + "editAction4": "Convertir a prompt JSON" }, "report": { "report": "Reportar", diff --git a/messages/fr.json b/messages/fr.json index d68148f3..a72f14c5 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -650,6 +650,20 @@ "tokens": "tokens", "noChanges": "Aucune modification" }, + "heroPromptInput": { + "placeholder": "Décrivez le prompt que vous voulez créer...", + "ariaLabel": "Décrivez le prompt que vous voulez créer", + "submit": "Créer un prompt", + "hint": "Cliquez pour commencer à créer avec l'IA", + "modelName": "Agent de Prompts", + "examples": { + "codeReview": "Créez un assistant de revue de code qui détecte les bugs", + "emailWriter": "Construisez un rédacteur d'emails professionnels pour toute occasion", + "studyPlanner": "Concevez un générateur de plans d'études personnalisés", + "recipeGenerator": "Créez un générateur de recettes basé sur les ingrédients disponibles", + "interviewCoach": "Créez un coach de préparation aux entretiens" + } + }, "notFound": { "title": "Page Non Trouvée", "description": "La page que vous recherchez n'existe pas ou a été déplacée.", @@ -676,7 +690,11 @@ "currentPrompt": "En construction :", "stateTitle": "Titre", "stateContent": "Contenu", - "stateTags": "tags" + "stateTags": "tags", + "editAction1": "Remplir les champs manquants, mettre à jour les tags.", + "editAction2": "Améliorer les variables", + "editAction3": "Utiliser des variables", + "editAction4": "Convertir en prompt JSON" }, "report": { "report": "Signaler", diff --git a/messages/it.json b/messages/it.json index 87fe1dbe..aa06aa5f 100644 --- a/messages/it.json +++ b/messages/it.json @@ -650,6 +650,20 @@ "tokens": "token", "noChanges": "Nessuna modifica" }, + "heroPromptInput": { + "placeholder": "Descrivi il prompt che vuoi creare...", + "ariaLabel": "Descrivi il prompt che vuoi creare", + "submit": "Crea prompt", + "hint": "Clicca per iniziare a creare con l'IA", + "modelName": "Agente Prompt", + "examples": { + "codeReview": "Crea un assistente di revisione codice che rileva bug", + "emailWriter": "Costruisci uno scrittore di email professionali per ogni occasione", + "studyPlanner": "Progetta un generatore di piani di studio personalizzati", + "recipeGenerator": "Crea un generatore di ricette basato sugli ingredienti disponibili", + "interviewCoach": "Crea un coach di preparazione ai colloqui" + } + }, "notFound": { "title": "Pagina Non Trovata", "description": "La pagina che stai cercando non esiste o è stata spostata.", @@ -676,7 +690,11 @@ "currentPrompt": "In costruzione:", "stateTitle": "Titolo", "stateContent": "Contenuto", - "stateTags": "tag" + "stateTags": "tag", + "editAction1": "Compila i campi mancanti, aggiorna i tag.", + "editAction2": "Migliora le variabili", + "editAction3": "Usa le variabili", + "editAction4": "Converti in prompt JSON" }, "report": { "report": "Segnala", diff --git a/messages/ja.json b/messages/ja.json index 4720fd59..258b1064 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -650,6 +650,20 @@ "tokens": "トークン", "noChanges": "変更なし" }, + "heroPromptInput": { + "placeholder": "作成したいプロンプトを説明してください...", + "ariaLabel": "作成したいプロンプトを説明してください", + "submit": "プロンプトを作成", + "hint": "クリックしてAIで作成を開始", + "modelName": "プロンプトエージェント", + "examples": { + "codeReview": "バグを検出するコードレビューアシスタントを作成", + "emailWriter": "あらゆる場面に対応するプロフェッショナルなメール作成ツールを構築", + "studyPlanner": "パーソナライズされた学習プランジェネレーターを設計", + "recipeGenerator": "手持ちの食材でレシピを作成するツールを作成", + "interviewCoach": "面接対策コーチを作成" + } + }, "notFound": { "title": "ページが見つかりません", "description": "お探しのページは存在しないか、移動された可能性があります。", @@ -676,7 +690,11 @@ "currentPrompt": "構築中:", "stateTitle": "タイトル", "stateContent": "内容", - "stateTags": "タグ" + "stateTags": "タグ", + "editAction1": "不足フィールドを埋め、タグを更新。", + "editAction2": "変数を改善", + "editAction3": "変数を使用", + "editAction4": "JSONプロンプトに変換" }, "report": { "report": "報告", diff --git a/messages/ko.json b/messages/ko.json index 034001f0..2a4d7158 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -650,6 +650,20 @@ "tokens": "토큰", "noChanges": "변경 없음" }, + "heroPromptInput": { + "placeholder": "만들고 싶은 프롬프트를 설명하세요...", + "ariaLabel": "만들고 싶은 프롬프트를 설명하세요", + "submit": "프롬프트 만들기", + "hint": "클릭하여 AI로 만들기 시작", + "modelName": "프롬프트 에이전트", + "examples": { + "codeReview": "버그를 잡아내는 코드 리뷰 어시스턴트 만들기", + "emailWriter": "모든 상황에 맞는 전문 이메일 작성기 만들기", + "studyPlanner": "맞춤형 학습 계획 생성기 설계", + "recipeGenerator": "가용 재료로 레시피 생성기 만들기", + "interviewCoach": "면접 준비 코치 만들기" + } + }, "notFound": { "title": "페이지를 찾을 수 없습니다", "description": "찾고 계신 페이지가 존재하지 않거나 이동되었습니다.", @@ -676,7 +690,11 @@ "currentPrompt": "구축 중:", "stateTitle": "제목", "stateContent": "내용", - "stateTags": "태그" + "stateTags": "태그", + "editAction1": "누락된 필드 채우기, 태그 업데이트.", + "editAction2": "변수 개선", + "editAction3": "변수 사용", + "editAction4": "JSON 프롬프트로 변환" }, "report": { "report": "신고", diff --git a/messages/pt.json b/messages/pt.json index 131a4981..664a00d0 100644 --- a/messages/pt.json +++ b/messages/pt.json @@ -650,6 +650,20 @@ "tokens": "tokens", "noChanges": "Sem alterações" }, + "heroPromptInput": { + "placeholder": "Descreva o prompt que você quer criar...", + "ariaLabel": "Descreva o prompt que você quer criar", + "submit": "Criar prompt", + "hint": "Clique para começar a criar com IA", + "modelName": "Agente de Prompts", + "examples": { + "codeReview": "Crie um assistente de revisão de código que detecta bugs", + "emailWriter": "Construa um escritor de emails profissionais para qualquer ocasião", + "studyPlanner": "Projete um gerador de planos de estudo personalizados", + "recipeGenerator": "Crie um gerador de receitas baseado em ingredientes disponíveis", + "interviewCoach": "Crie um coach de preparação para entrevistas" + } + }, "notFound": { "title": "Página Não Encontrada", "description": "A página que você está procurando não existe ou foi movida.", @@ -676,7 +690,11 @@ "currentPrompt": "Construindo:", "stateTitle": "Título", "stateContent": "Conteúdo", - "stateTags": "tags" + "stateTags": "tags", + "editAction1": "Preencher campos faltantes, atualizar tags.", + "editAction2": "Melhorar variáveis", + "editAction3": "Usar variáveis", + "editAction4": "Converter para prompt JSON" }, "report": { "report": "Denunciar", diff --git a/messages/tr.json b/messages/tr.json index 40bb4860..dcc053ec 100644 --- a/messages/tr.json +++ b/messages/tr.json @@ -650,6 +650,20 @@ "tokens": "token", "noChanges": "Değişiklik yok" }, + "heroPromptInput": { + "placeholder": "Oluşturmak istediğiniz promptu tanımlayın...", + "ariaLabel": "Oluşturmak istediğiniz promptu tanımlayın", + "submit": "Prompt oluştur", + "hint": "AI ile oluşturmaya başlamak için tıklayın", + "modelName": "Prompt Ajanı", + "examples": { + "codeReview": "Hataları yakalayan bir kod inceleme asistanı oluştur", + "emailWriter": "Her durum için profesyonel e-posta yazıcısı oluştur", + "studyPlanner": "Kişiselleştirilmiş çalışma planı oluşturucu tasarla", + "recipeGenerator": "Mevcut malzemelere göre tarif oluşturucu yap", + "interviewCoach": "Mülakat hazırlık koçu oluştur" + } + }, "notFound": { "title": "Sayfa Bulunamadı", "description": "Aradığınız sayfa mevcut değil veya taşınmış olabilir.", @@ -676,7 +690,11 @@ "currentPrompt": "Oluşturuluyor:", "stateTitle": "Başlık", "stateContent": "İçerik", - "stateTags": "etiketler" + "stateTags": "etiketler", + "editAction1": "Eksik alanları doldur, etiketleri güncelle.", + "editAction2": "Değişkenleri iyileştir", + "editAction3": "Değişkenleri kullan", + "editAction4": "JSON promptuna dönüştür" }, "report": { "report": "Şikayet Et", diff --git a/messages/zh.json b/messages/zh.json index 41eccc50..3ffb4ffc 100644 --- a/messages/zh.json +++ b/messages/zh.json @@ -650,6 +650,20 @@ "tokens": "token", "noChanges": "无变更" }, + "heroPromptInput": { + "placeholder": "描述你想要创建的提示词...", + "ariaLabel": "描述你想要创建的提示词", + "submit": "创建提示词", + "hint": "点击开始用AI创建", + "modelName": "提示词助手", + "examples": { + "codeReview": "创建一个能发现bug的代码审查助手", + "emailWriter": "打造一个适用于各种场合的专业邮件撰写器", + "studyPlanner": "设计一个个性化学习计划生成器", + "recipeGenerator": "制作一个根据现有食材生成食谱的工具", + "interviewCoach": "创建一个面试准备教练" + } + }, "notFound": { "title": "页面未找到", "description": "您要查找的页面不存在或已被移动。", @@ -676,7 +690,11 @@ "currentPrompt": "构建中:", "stateTitle": "标题", "stateContent": "内容", - "stateTags": "标签" + "stateTags": "标签", + "editAction1": "填写缺失字段,更新标签。", + "editAction2": "改进变量", + "editAction3": "使用变量", + "editAction4": "转换为JSON提示词" }, "report": { "report": "举报", diff --git a/package-lock.json b/package-lock.json index 9d4f6d46..00147dea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,7 @@ "react": "19.2.0", "react-dom": "19.2.0", "react-hook-form": "^7.68.0", + "react-markdown": "^10.1.0", "sharp": "^0.33.5", "sonner": "^2.0.7", "tailwind-merge": "^3.4.0", @@ -6071,13 +6072,39 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -6092,6 +6119,21 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.25", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", @@ -6106,7 +6148,6 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", - "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -6130,6 +6171,12 @@ "optional": true, "peer": true }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.48.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.1.tgz", @@ -6400,6 +6447,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", @@ -6977,6 +7030,16 @@ "@babel/types": "^7.26.0" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -7176,6 +7239,16 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7193,6 +7266,46 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -7303,6 +7416,16 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -7353,7 +7476,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -7431,7 +7553,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -7451,6 +7572,19 @@ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "license": "MIT" }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -7511,6 +7645,15 @@ "devOptional": true, "license": "MIT" }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/destr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", @@ -7533,6 +7676,19 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -8289,6 +8445,16 @@ "node": ">=4.0" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -8306,6 +8472,12 @@ "devOptional": true, "license": "MIT" }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fast-check": { "version": "3.23.2", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", @@ -8825,6 +8997,46 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", @@ -8842,6 +9054,16 @@ "hermes-estree": "0.25.1" } }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -8879,6 +9101,12 @@ "node": ">=0.8.19" } }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -8906,6 +9134,30 @@ "tslib": "^2.8.0" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -9070,6 +9322,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -9129,6 +9391,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -9182,6 +9454,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -9789,6 +10073,16 @@ "dev": true, "license": "MIT" }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -9854,6 +10148,159 @@ "node": ">= 0.4" } }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9864,6 +10311,448 @@ "node": ">= 8" } }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9916,7 +10805,6 @@ "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/nanoid": { @@ -10894,6 +11782,31 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -11078,6 +11991,16 @@ "react-is": "^16.13.1" } }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -11181,6 +12104,33 @@ "dev": true, "license": "MIT" }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, "node_modules/react-remove-scroll": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", @@ -11308,6 +12258,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -11682,6 +12665,16 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -11822,6 +12815,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -11857,6 +12864,24 @@ ], "license": "MIT" }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, "node_modules/styled-jsx": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", @@ -12008,6 +13033,26 @@ "node": ">=8.0" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -12238,6 +13283,93 @@ "dev": true, "license": "MIT" }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -12380,6 +13512,34 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -12536,6 +13696,16 @@ "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 5d557734..f4c32683 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "react": "19.2.0", "react-dom": "19.2.0", "react-hook-form": "^7.68.0", + "react-markdown": "^10.1.0", "sharp": "^0.33.5", "sonner": "^2.0.7", "tailwind-merge": "^3.4.0", diff --git a/src/app/api/prompt-builder/chat/route.ts b/src/app/api/prompt-builder/chat/route.ts index bfe909a6..f1d22dca 100644 --- a/src/app/api/prompt-builder/chat/route.ts +++ b/src/app/api/prompt-builder/chat/route.ts @@ -10,17 +10,23 @@ import { const GENERATIVE_MODEL = process.env.OPENAI_GENERATIVE_MODEL || "gpt-4o-mini"; -const SYSTEM_PROMPT = `You are an expert prompt engineer agent. Your job is to quickly build high-quality prompts. +const SYSTEM_PROMPT = `You are an expert prompt engineer agent. Your job is to quickly build high-quality prompts that match the style and quality of existing prompts in the database. + +MANDATORY FIRST STEP - LEARN FROM EXAMPLES: +Before creating ANY prompt, you MUST first call search_prompts to study existing prompts in the database. +This is NON-NEGOTIABLE. You need to understand how prompts are written in this system before creating new ones. +Study the structure, tone, format, and quality of existing prompts and match that style. IMPORTANT - REASONING FORMAT: Before EVERY tool call, write a brief reasoning line starting with "→" to explain what you're about to do. -Example: "→ Searching for similar prompts to get inspiration..." +Example: "→ Searching for similar prompts to learn the style..." This makes your actions transparent and agentic. WORKFLOW FOR NEW PROMPTS: -1. ALWAYS call search_prompts first to find similar examples for inspiration -2. Immediately set the prompt fields using tools (set_title, set_description, set_content, set_tags) -3. Only respond with a brief summary of what you created +1. MANDATORY: Call search_prompts FIRST to study 3-5 similar examples - learn their structure, tone, and format +2. Analyze the examples to understand how prompts are written in this database +3. Create your prompt matching that same quality and style using tools (set_title, set_description, set_content, set_tags) +4. Only respond with a brief summary of what you created WORKFLOW FOR CHANGES/EDITS: 1. The current prompt state is provided below - review it first @@ -52,23 +58,53 @@ If the user's request mentions any of these, automatically call set_media_requir Set appropriate mediaType (IMAGE, VIDEO, DOCUMENT) based on context. RULES: +- NEVER skip searching for examples - this is your first action for ANY new prompt - Be ACTION-ORIENTED: Use tools immediately, don't ask many questions - ALWAYS write reasoning ("→ ...") before each tool call -- For NEW prompts: search for examples first, then build +- For NEW prompts: MUST search for examples first to learn the style, then build matching that style - For EDITS: modify only what the user asked, don't rewrite everything - For JSON: search structured prompts first, then convert preserving all content - Auto-detect and set media requirements when user mentions files/uploads - Use variables: \${variableName} or \${variableName:defaultValue} for customizable parts - Keep responses SHORT - just confirm what you did -- If the request is clear, act immediately +- If the request is clear, act immediately (but always search examples first for new prompts) - Only ask ONE clarifying question if absolutely necessary +PROMPT STYLE (MANDATORY FOR TEXT PROMPTS): +- ALWAYS use "Act as" role-playing format: "Act as a [role]. You are [description]..." +- Be INSTRUCTIVE and IMPERATIVE: Use "do this", "act as", "you will", "your task is" +- Define a clear ROLE/PERSONA the AI should adopt +- Include specific RESPONSIBILITIES and BEHAVIORS +- Add CONSTRAINTS and RULES for the role +- Example format: + "Act as a [Role]. You are an expert in [domain] with [experience/skills]. + Your task is to [main objective]. + You will: + - [Responsibility 1] + - [Responsibility 2] + Rules: + - [Constraint 1] + - [Constraint 2]" + +VARIABLES (HIGHLY ENCOURAGED): +- ALWAYS look for opportunities to add variables to make prompts reusable +- Use syntax: \${variableName} or \${variableName:defaultValue} +- Common variable patterns: + - \${topic} - main subject/topic + - \${language:English} - target language with default + - \${tone:professional} - writing tone + - \${length:medium} - output length + - \${context} - additional context from user + - \${input} - user's input text to process +- Variables make prompts flexible and powerful - include at least 1-2 in every prompt +- Example: "Translate the following text to \${language:Spanish}" + PROMPT QUALITY: - Write clear, specific instructions - Include context and constraints - Add examples when helpful - Use structured sections for complex prompts -- Make prompts reusable with variables +- Make prompts reusable with variables (see above) You have tools to: search_prompts (with promptType and structuredFormat filters), set_title, set_description, set_content, set_type, set_tags, set_category, set_privacy, set_media_requirements, get_current_state, get_available_tags, get_available_categories. diff --git a/src/app/page.tsx b/src/app/page.tsx index 24bdf2e7..e432c546 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -6,6 +6,7 @@ import { auth } from "@/lib/auth"; import { getConfig } from "@/lib/config"; import { Button } from "@/components/ui/button"; import { DiscoveryPrompts } from "@/components/prompts/discovery-prompts"; +import { HeroPromptInput } from "@/components/prompts/hero-prompt-input"; function getOrdinalSuffix(n: number): string { const s = ["th", "st", "nd", "rd"]; @@ -24,6 +25,7 @@ export default async function HomePage() { const showRegisterButton = !session && (isOAuth || (config.auth.provider === "credentials" && config.auth.allowRegistration)); const useCloneBranding = config.homepage?.useCloneBranding ?? false; + const aiGenerationEnabled = config.features?.aiGeneration ?? false; // Fetch GitHub stars dynamically (with caching) - only if not using clone branding let githubStars = 139000; // fallback @@ -67,16 +69,25 @@ export default async function HomePage() { ) : (
-
- + {/* Video background */} +
+
+ +
+ {/* Animated input overlay - only show if AI generation is enabled */} + {aiGenerationEnabled && ( +
+ +
+ )}
)} diff --git a/src/app/prompts/new/page.tsx b/src/app/prompts/new/page.tsx index 2c46a932..576278f9 100644 --- a/src/app/prompts/new/page.tsx +++ b/src/app/prompts/new/page.tsx @@ -11,9 +11,14 @@ export const metadata: Metadata = { description: "Create a new prompt", }; -export default async function NewPromptPage() { +interface PageProps { + searchParams: Promise<{ prompt?: string }>; +} + +export default async function NewPromptPage({ searchParams }: PageProps) { const session = await auth(); const t = await getTranslations("prompts"); + const { prompt: initialPromptRequest } = await searchParams; if (!session?.user) { redirect("/login"); @@ -46,6 +51,7 @@ export default async function NewPromptPage() { tags={tags} aiGenerationEnabled={aiGenerationEnabled} aiModelName={aiModelName} + initialPromptRequest={initialPromptRequest} />
); diff --git a/src/components/prompts/hero-prompt-input.tsx b/src/components/prompts/hero-prompt-input.tsx new file mode 100644 index 00000000..d97e9a41 --- /dev/null +++ b/src/components/prompts/hero-prompt-input.tsx @@ -0,0 +1,185 @@ +"use client"; + +import { useState, useRef, useEffect, useCallback, useMemo } from "react"; +import { useRouter } from "next/navigation"; +import { useTranslations } from "next-intl"; +import { Bot, ArrowUp } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { cn } from "@/lib/utils"; + +const TYPING_SPEED = 50; // ms per character +const PAUSE_BETWEEN_PROMPTS = 2000; // ms to pause after completing a prompt +const DELETE_SPEED = 30; // ms per character when deleting + +export function HeroPromptInput() { + const t = useTranslations("heroPromptInput"); + const router = useRouter(); + const textareaRef = useRef(null); + + const examplePrompts = useMemo(() => [ + t("examples.codeReview"), + t("examples.emailWriter"), + t("examples.studyPlanner"), + t("examples.recipeGenerator"), + t("examples.interviewCoach"), + ], [t]); + + const [displayText, setDisplayText] = useState(""); + const [inputValue, setInputValue] = useState(""); + const [isFocused, setIsFocused] = useState(false); + const [isAnimating, setIsAnimating] = useState(true); + const [currentPromptIndex, setCurrentPromptIndex] = useState(0); + const [isDeleting, setIsDeleting] = useState(false); + + const animationRef = useRef(null); + + const clearAnimation = useCallback(() => { + if (animationRef.current) { + clearTimeout(animationRef.current); + animationRef.current = null; + } + }, []); + + // Typing animation effect + useEffect(() => { + if (!isAnimating || isFocused) { + clearAnimation(); + return; + } + + const currentPrompt = examplePrompts[currentPromptIndex]; + + if (isDeleting) { + if (displayText.length > 0) { + animationRef.current = setTimeout(() => { + setDisplayText((prev) => prev.slice(0, -1)); + }, DELETE_SPEED); + } else { + setIsDeleting(false); + setCurrentPromptIndex((prev) => (prev + 1) % examplePrompts.length); + } + } else { + if (displayText.length < currentPrompt.length) { + animationRef.current = setTimeout(() => { + setDisplayText(currentPrompt.slice(0, displayText.length + 1)); + }, TYPING_SPEED); + } else { + // Finished typing, wait then start deleting + animationRef.current = setTimeout(() => { + setIsDeleting(true); + }, PAUSE_BETWEEN_PROMPTS); + } + } + + return clearAnimation; + }, [displayText, isAnimating, isFocused, currentPromptIndex, isDeleting, clearAnimation, examplePrompts]); + + const handleFocus = () => { + setIsFocused(true); + setIsAnimating(false); + clearAnimation(); + // Transfer the animated text to the actual input value + setInputValue(displayText); + setDisplayText(""); + }; + + const handleBlur = () => { + setIsFocused(false); + // Only restart animation if input is empty + if (!inputValue.trim()) { + setIsAnimating(true); + } + }; + + const handleSubmit = (e?: React.FormEvent) => { + e?.preventDefault(); + const value = inputValue.trim(); + if (value) { + router.push(`/prompts/new?prompt=${encodeURIComponent(value)}`); + } + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + handleSubmit(); + } + }; + + const handleAnimatedTextClick = () => { + // Stop animation, clear input, and focus for user to type + setIsFocused(true); + setIsAnimating(false); + clearAnimation(); + setInputValue(""); + setDisplayText(""); + // Focus the textarea + setTimeout(() => { + textareaRef.current?.focus(); + }, 0); + }; + + return ( +
+
+ {/* Textarea area with animated text overlay */} +
+ {/* Animated placeholder text - clickable to redirect */} + {!isFocused && isAnimating && ( + + )} + + {/* Actual textarea */} +