feat: page interactive, démos Play/Step et simulateur Carnot
Ajoute le pipeline PageSpec (validation, rendu, publication /p/{slug}),
les démos TipTap /demo, et le simulateur Carnot (modes frigo/PAC/moteur,
énergie kJ vs puissance W, unités K/°C/°F) avec correctifs d’équations KaTeX.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -38,7 +38,24 @@
|
||||
"createYourSpaceSubtitle": "Join the new era of smart note-taking.",
|
||||
"forgot": "Forgot?",
|
||||
"backToSite": "Back to site",
|
||||
"privacyTerms": "© 2025 Memento Labs — Privacy · Terms"
|
||||
"privacyTerms": "© 2025 Memento Labs — Privacy · Terms",
|
||||
"checkEmailTitle": "Check your email",
|
||||
"checkEmailDescription": "We sent a confirmation link to {email}. Open it to activate your account before signing in.",
|
||||
"checkEmailDescriptionGeneric": "We sent a confirmation link to your email. Open it to activate your account before signing in.",
|
||||
"resendVerification": "Resend confirmation email",
|
||||
"verifyResent": "Confirmation email sent. Check your inbox.",
|
||||
"verifyResendFailed": "Could not send the confirmation email. Try again later.",
|
||||
"verifyMissingEmail": "Enter your email address.",
|
||||
"verifyLoading": "Confirming your email…",
|
||||
"verifySuccessTitle": "Email confirmed",
|
||||
"verifySuccessDescription": "Your account is ready. You can now sign in.",
|
||||
"verifyExpiredTitle": "Link expired",
|
||||
"verifyExpiredDescription": "This confirmation link has expired. Request a new one.",
|
||||
"verifyInvalidTitle": "Invalid link",
|
||||
"verifyInvalidDescription": "This confirmation link is invalid or already used.",
|
||||
"emailNotVerified": "Please confirm your email before signing in.",
|
||||
"emailVerifiedBanner": "Email confirmed. You can sign in now.",
|
||||
"invalidCredentials": "Invalid email or password."
|
||||
},
|
||||
"sidebar": {
|
||||
"notes": "Notes",
|
||||
@@ -792,6 +809,18 @@
|
||||
"formal": "Formal",
|
||||
"casual": "Casual"
|
||||
},
|
||||
"interactiveDemo": {
|
||||
"invalid": "Invalid interactive demo",
|
||||
"empty": "Interactive demo unavailable",
|
||||
"step": "step",
|
||||
"speed": "Playback speed",
|
||||
"needMoreText": "Select at least ~20 words (or write more content) to generate a demo",
|
||||
"generating": "Generating interactive demo…",
|
||||
"generateSuccess": "Interactive demo inserted",
|
||||
"generateFailed": "Demo generation failed",
|
||||
"insertFailed": "Could not insert the demo",
|
||||
"quotaExceeded": "Not enough AI quota"
|
||||
},
|
||||
"memoryEcho": {
|
||||
"title": "I noticed something...",
|
||||
"description": "Proactive connections between your notes",
|
||||
@@ -1602,7 +1631,58 @@
|
||||
"notSynced": "Not synced yet (cron /api/cron/sync-usage)",
|
||||
"byFeature": "By feature (PostgreSQL)",
|
||||
"topUsers": "Top users",
|
||||
"noUsageData": "No usage data for this period yet"
|
||||
"noUsageData": "No usage data for this period yet",
|
||||
"healthTitle": "Stripe health check",
|
||||
"healthDescription": "Runtime status of keys, webhooks, price IDs and billing flag (secrets are never shown).",
|
||||
"healthSecret": "Secret key (server)",
|
||||
"healthPublishable": "Publishable key",
|
||||
"healthWebhook": "Webhook secret",
|
||||
"healthBillingFlag": "Billing enabled",
|
||||
"healthTrial": "Free trial",
|
||||
"trialDaysValue": "{days} days on first checkout",
|
||||
"modeTest": "Test mode (sk_test_…)",
|
||||
"modeLive": "Live mode (sk_live_…)",
|
||||
"modePlaceholder": "Placeholder / invalid key",
|
||||
"modeMissing": "Not configured",
|
||||
"configured": "Configured",
|
||||
"missing": "Missing",
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"priceStatusTitle": "Price IDs vs Stripe",
|
||||
"colKey": "Plan",
|
||||
"colPriceId": "Price ID",
|
||||
"colSource": "Source",
|
||||
"colStripe": "Stripe amount",
|
||||
"priceError": "Lookup failed",
|
||||
"inactive": "inactive",
|
||||
"notChecked": "Not checked (no Stripe key)",
|
||||
"subsTitle": "Subscriptions overview",
|
||||
"subsDescription": "Counts from the local database (synced via Stripe webhooks).",
|
||||
"statPaid": "Active + trial",
|
||||
"statTrialing": "On trial",
|
||||
"statPastDue": "Past due",
|
||||
"statCanceling": "Cancel at period end",
|
||||
"byTier": "By tier",
|
||||
"byStatus": "By status",
|
||||
"usersWithoutSub": "Users with no Subscription row",
|
||||
"noSubs": "No subscriptions yet",
|
||||
"recentSubs": "Recent paid / trial accounts",
|
||||
"colUser": "User",
|
||||
"colTier": "Tier",
|
||||
"colStatus": "Status",
|
||||
"colPeriod": "Period / trial end",
|
||||
"canceling": "canceling",
|
||||
"manualTier": "manual (no Stripe sub)",
|
||||
"trialUntil": "Trial until {date}",
|
||||
"testGuideTitle": "How to test Stripe locally",
|
||||
"testGuideDescription": "Checklist to validate checkout, webhooks and trial.",
|
||||
"testStep1": "Stripe Dashboard → Test mode ON. Create Pro/Business products + monthly/annual prices + credit packs.",
|
||||
"testStep2": "Put sk_test_…, pk_test_… in .env. Put price_… IDs in Admin → Billing (or env) and enable billing.",
|
||||
"testStep3": "Copy the whsec_… into STRIPE_WEBHOOK_SECRET and restart the app.",
|
||||
"testStep4": "npm run dev → open /settings/billing as a BASIC user.",
|
||||
"testStep5": "Start Pro checkout. Card: 4242 4242 4242 4242, any future expiry, any CVC. Expect a 7-day trial.",
|
||||
"testStep6": "Confirm Admin → Billing shows TRIALING, and /settings/billing shows the trial end date.",
|
||||
"testCardHint": "Other cards: 4000000000009995 = payment fails · 4000002500003155 = 3D Secure. Never use real cards in test mode."
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Dashboard",
|
||||
@@ -1812,6 +1892,8 @@
|
||||
"featureBrainstormCreate": "Brainstorm creations",
|
||||
"featureBrainstormSessions": "Brainstorm sessions",
|
||||
"featureCharts": "AI Charts",
|
||||
"featureInteractiveDemo": "Interactive demos",
|
||||
"featureInteractivePage": "Interactive pages",
|
||||
"featurePublishEnhance": "AI Publishing",
|
||||
"featureBrainstormExpand": "Brainstorm expansions",
|
||||
"featureBrainstormEnrich": "Brainstorm enrichments",
|
||||
@@ -2579,6 +2661,8 @@
|
||||
"slashTableDesc": "Insert a simple grid",
|
||||
"slashDatabase": "Structured View",
|
||||
"slashDatabaseDesc": "Embed your notebook's structured data",
|
||||
"slashInteractiveDemo": "Interactive Demo",
|
||||
"slashInteractiveDemoDesc": "AI step-by-step teaching demo (Play / Step)",
|
||||
"slashToggle": "Toggle Section",
|
||||
"slashToggleDesc": "Create a collapsible section",
|
||||
"slashCallout": "Callout",
|
||||
@@ -2726,6 +2810,21 @@
|
||||
"publishTemplateMagazine": "Magazine article",
|
||||
"publishTemplateBrief": "Expert brief",
|
||||
"publishTemplateEssay": "Essay",
|
||||
"publishTemplateInteractivePage": "Interactive page",
|
||||
"publishInteractivePage": "Interactive page",
|
||||
"publishInteractivePageHint": "AI-generated page: hero, sections, Play/Step demos — 20 credits",
|
||||
"publishInteractivePageGenerating": "Building interactive page…",
|
||||
"publishInteractivePageGeneratingWait": "Almost ready…",
|
||||
"publishInteractivePageGeneratingLong": "Still working…",
|
||||
"publishInteractivePagePlanning": "Analyzing content — planning the page…",
|
||||
"publishInteractivePageSectionProgress": "Section {current}/{total}: {title}",
|
||||
"publishInteractivePageFallback": "AI generation unavailable — showing simplified page",
|
||||
"publishInteractivePagePartialFallback": "Some sections were generated in simplified mode",
|
||||
"publishInteractivePageTooShort": "Note too short — add more content and try again",
|
||||
"publishInteractivePageSuccess": "Interactive page published!",
|
||||
"publishInteractivePageFailed": "Interactive page generation failed",
|
||||
"publishInteractivePagePreviewHint": "Preview — review, then publish to the public URL",
|
||||
"publishInteractivePageConfirm": "Publish page",
|
||||
"publishAiSuccess": "AI-enhanced page published!",
|
||||
"publishRewriteLabel": "Rewrite for the web",
|
||||
"publishRewriteOnHint": "Structures your editor blocks (exercises, toggles, callouts) for the web — AI writes only the intro",
|
||||
@@ -3381,7 +3480,11 @@
|
||||
"fetchStatusFailed": "Failed to fetch billing status",
|
||||
"fetchQuotasFailed": "Failed to load credit usage",
|
||||
"fetchInvoicesFailed": "Failed to load billing history.",
|
||||
"savePercent": "Save ~17%"
|
||||
"savePercent": "Save ~17%",
|
||||
"startTrialCta": "Start {days}-day free trial",
|
||||
"trialFeature": "{days}-day free trial (card required)",
|
||||
"trialEndsOn": "Your free trial ends on {date}. You will then be billed automatically.",
|
||||
"trialEndsLabel": "Trial ends"
|
||||
},
|
||||
"quotaPaywall": {
|
||||
"title": "Out of AI credits",
|
||||
@@ -3528,6 +3631,12 @@
|
||||
"perMonthAnnual": "/mo, billed yearly",
|
||||
"perUser": "+ €3.90/user",
|
||||
"perUserAnnual": "+ €2.90/user, yearly",
|
||||
"savePercent": "Save ~17%",
|
||||
"proMonthly": "€9.90",
|
||||
"proAnnualMonthly": "€8.25",
|
||||
"businessMonthly": "€29.90",
|
||||
"businessAnnualMonthly": "€24.92",
|
||||
"enterprisePrice": "Custom",
|
||||
"popular": "Most chosen",
|
||||
"basic": {
|
||||
"name": "Basic",
|
||||
@@ -3572,7 +3681,10 @@
|
||||
"feature4": "Dedicated support",
|
||||
"feature5": "Live onboarding"
|
||||
},
|
||||
"basicPrice": "Free"
|
||||
"basicPrice": "Free",
|
||||
"trialBadge": "{days}-day free trial",
|
||||
"trialFeature": "{days}-day free trial (card required)",
|
||||
"trialCta": "Start {days}-day free trial"
|
||||
},
|
||||
"cta": {
|
||||
"title": "Stop losing your best ideas.",
|
||||
|
||||
Reference in New Issue
Block a user