PageSourceSearch

https://viztext.com/_next/static/chunks/3peschsa_l2ll.js

js viztext.com collected 2026-10-09 22:41:32 UTC 52,621 bytes, 2 lines download raw bytes

1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,73799,(e,t,a)=>{t.exports=e.r(13505)},31166,e=>{"use strict";var t=e.i(64827),a=e.i(52734),i=e.i(98603);class n extends Error{constructor(e,t){e instanceof Error?super(void 0,{cause:{err:e,...e.cause,...t}}):"string"==typeof e?(t instanceof Error&&(t={err:t,...t.cause}),super(e,t)):super(void 0,e),this.name=this.constructor.name,this.type=this.constructor.type??"AuthError",this.kind=this.constructor.kind??"error",Error.captureStackTrace?.(this,this.constructor);const a=`https://errors.authjs.dev#${this.type.toLowerCase()}`;this.message+=`${this.message?". ":""}Read more at ${a}`}}class o extends n{}class r extends n{}async function s(e,t,a,i={}){let n=`${d(t)}/${e}`;try{let e={headers:{"Content-Type":"application/json",...i?.headers?.cookie?{cookie:i.headers.cookie}:{}}};i?.body&&(e.body=JSON.stringify(i.body),e.method="POST");let t=await fetch(n,e),a=await t.json();if(!t.ok)throw a;return a}catch(e){return a.error(new o(e.message,e)),null}}function d(e){return"u"<typeof window?`${e.baseUrlServer}${e.basePathServer}`:e.basePath}function l(){return Math.floor(Date.now()/1e3)}function c(e){let t=new URL("http://localhost:3000/api/auth");e&&!e.startsWith("http")&&(e=`https://${e}`);let a=new URL(e||t),i=("/"===a.pathname?t.pathname:a.pathname).replace(/\/$/,""),n=`${a.origin}${i}`;return{origin:a.origin,host:a.host,path:i,base:n,toString:()=>n}}let u={baseUrl:c(t.default.env.NEXTAUTH_URL??t.default.env.VERCEL_URL).origin,basePath:c(t.default.env.NEXTAUTH_URL).path,baseUrlServer:c(t.default.env.NEXTAUTH_URL_INTERNAL??t.default.env.NEXTAUTH_URL??t.default.env.VERCEL_URL).origin,basePathServer:c(t.default.env.NEXTAUTH_URL_INTERNAL??t.default.env.NEXTAUTH_URL).path,_lastSync:0,_session:void 0,_getSession:()=>{}},h=null;function m(){return"u"<typeof BroadcastChannel?{postMessage:()=>{},addEventListener:()=>{},removeEventListener:()=>{},name:"next-auth",onmessage:null,onmessageerror:null,close:()=>{},dispatchEvent:()=>!1}:new BroadcastChannel("next-auth")}function p(){return null===h&&(h=m()),h}let g={debug:console.debug,error:console.error,warn:console.warn},w=i.createContext?.(void 0);async function f(e){let t=await s("session",u,g,e);return(e?.broadcast??!0)&&m().postMessage({event:"session",data:{trigger:"getSession"}}),t}async function y(){let e=await s("csrf",u,g);return e?.csrfToken??""}async function b(){return s("providers",u,g)}async function k(e,t,a){let{callbackUrl:i,...n}=t??{},{redirect:o=!0,redirectTo:r=i??window.location.href,...s}=n,l=d(u),c=await b();if(!c){let e=`${l}/error`;window.location.href=e;return}if(!e||!c[e]){let e=`${l}/signin?${new URLSearchParams({callbackUrl:r})}`;window.location.href=e;return}let h=c[e].type;if("webauthn"===h)throw TypeError(`Provider id "${e}" refers to a WebAuthn provider.
2Please use \`import { signIn } from "next-auth/webauthn"\` instead.`);let m=`${l}/${"credentials"===h?"callback":"signin"}/${e}`,p=await y(),g=await fetch(`${m}?${new URLSearchParams(a)}`,{method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded","X-Auth-Return-Redirect":"1"},body:new URLSearchParams({...s,csrfToken:p,callbackUrl:r})}),w=await g.json();if(o){let e=w.url??r;window.location.href=e,e.includes("#")&&window.location.reload();return}let f=new URL(w.url).searchParams.get("error")??void 0,k=new URL(w.url).searchParams.get("code")??void 0;return g.ok&&await u._getSession({event:"storage"}),{error:f,code:k,status:g.status,ok:g.ok,url:f?null:w.url}}async function v(e){let{redirect:t=!0,redirectTo:a=e?.callbackUrl??window.location.href}=e??{},i=d(u),n=await y(),o=await fetch(`${i}/signout`,{method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded","X-Auth-Return-Redirect":"1"},body:new URLSearchParams({csrfToken:n,callbackUrl:a})}),r=await o.json();if(p().postMessage({event:"session",data:{trigger:"signout"}}),t){let e=r.url??a;window.location.href=e,e.includes("#")&&window.location.reload();return}return await u._getSession({event:"storage"}),r}e.s(["SessionProvider",0,function(e){if(!w)throw Error("React Context is unavailable in Server Components");let{children:t,basePath:n,refetchInterval:o,refetchWhenOffline:d}=e;n&&(u.basePath=n);let c=void 0!==e.session;u._lastSync=c?l():0;let[h,m]=i.useState(()=>(c&&(u._session=e.session),e.session)),[b,k]=i.useState(!c);i.useEffect(()=>(u._getSession=async({event:e}={})=>{try{let t="storage"===e;if(t||void 0===u._session){u._lastSync=l(),u._session=await f({broadcast:!t}),m(u._session);return}if(!e||null===u._session||l()<u._lastSync)return;u._lastSync=l(),u._session=await f(),m(u._session)}catch(e){g.error(new r(e.message,e))}finally{k(!1)}},u._getSession(),()=>{u._lastSync=0,u._session=void 0,u._getSession=()=>{}}),[]),i.useEffect(()=>{let e=()=>u._getSession({event:"storage"});return p().addEventListener("message",e),()=>p().removeEventListener("message",e)},[]),i.useEffect(()=>{let{refetchOnWindowFocus:t=!0}=e,a=()=>{t&&"visible"===document.visibilityState&&u._getSession({event:"visibilitychange"})};return document.addEventListener("visibilitychange",a,!1),()=>document.removeEventListener("visibilitychange",a,!1)},[e.refetchOnWindowFocus]);let v=function(){let[e,t]=i.useState("u">typeof navigator&&navigator.onLine),a=()=>t(!0),n=()=>t(!1);return i.useEffect(()=>(window.addEventListener("online",a),window.addEventListener("offline",n
2),()=>{window.removeEventListener("online",a),window.removeEventListener("offline",n)}),[]),e}(),x=!1!==d||v;i.useEffect(()=>{if(o&&x){let e=setInterval(()=>{u._session&&u._getSession({event:"poll"})},1e3*o);return()=>clearInterval(e)}},[o,x]);let S=i.useMemo(()=>({data:h,status:b?"loading":h?"authenticated":"unauthenticated",async update(e){if(b)return;k(!0);let t=await s("session",u,g,void 0===e?void 0:{body:{csrfToken:await y(),data:e}});return k(!1),t&&(m(t),p().postMessage({event:"session",data:{trigger:"getSession"}})),t}}),[h,b]);return(0,a.jsx)(w.Provider,{value:S,children:t})},"signIn",0,k,"signOut",0,v,"useSession",0,function(e){if(!w)throw Error("React Context is unavailable in Server Components");let t=i.useContext(w),{required:a,onUnauthenticated:n}=e??{},o=a&&"unauthenticated"===t.status;return(i.useEffect(()=>{if(o){let e=`${u.basePath}/signin?${new URLSearchParams({error:"SessionRequired",callbackUrl:window.location.href})}`;n?n():window.location.href=e}},[o,n]),o)?{data:t.data,update:t.update,status:"loading"}:t}],31166)},75679,e=>{"use strict";e.s(["track",0,function(e,t){let a=window.gtag;if("function"!=typeof a)return;let i={};for(let[e,a]of Object.entries(t??{}))null!=a&&(i[e]=a);try{a("event",e,i)}catch{}}])},61885,63009,49222,e=>{"use strict";var t=e.i(52734),a=e.i(98603),i=e.i(73799),n=e.i(31166),o=e.i(75679);function r({open:e,onClose:i,auth:d,callbackUrl:l,source:c}){return((0,a.useEffect)(()=>{if(!e)return;let t=e=>{"Escape"===e.key&&i()};document.addEventListener("keydown",t);let a=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.removeEventListener("keydown",t),document.body.style.overflow=a}},[e,i]),e)?(0,t.jsxs)("div",{role:"dialog","aria-modal":"true","aria-labelledby":"signin-modal-title",className:"fixed inset-0 z-50 flex items-center justify-center p-4",children:[(0,t.jsx)("button",{type:"button","aria-label":"Close",onClick:i,className:"absolute inset-0 bg-black/40 backdrop-blur-sm"}),(0,t.jsxs)("div",{className:"relative w-full max-w-md rounded-2xl border border-zinc-200 bg-white p-6 shadow-2xl dark:border-zinc-800 dark:bg-zinc-950",children:[(0,t.jsx)("button",{type:"button",onClick:i,"aria-label":"Close",className:"absolute right-3 top-3 grid h-8 w-8 place-items-center rounded-md text-zinc-500 hover:bg-zinc-100 hover:text-zinc-800 dark:hover:bg-zinc-800 dark:hover:text-zinc-200",children:(0,t.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:(0,t.jsx)("path",{d:"M18 6 6 18M6 6l12 12"})})}),(0,t.jsx)("h1",{id:"signin-modal-title",className:"text-xl font-semibold text-zinc-900 dark:text-zinc-100",children:d.signInPageTitle}),(0,t.jsx)("p",{className:"mt-1 text-sm text-zinc-500 dark:text-zinc-400",children:d.signInPageSubtitle}),(0,t.jsx)("div",{className:"mt-6 flex flex-col gap-2.5",children:(0,t.jsxs)("button",{type:"button",onClick:()=>{(0,o.track)("sign_in_google_click",{source:c??"unknown"}),(0,n.signIn)("google",l?{callbackUrl:l}:void 0)},className:"flex items-center justify-center gap-3 rounded-lg border border-zinc-200 bg-white px-4 py-2.5 text-sm font-medium text-zinc-800 shadow-sm transition-colors hover:bg-zinc-50 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-violet-500 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100 dark:hover:bg-zinc-800",children:[(0,t.jsx)(s,{}),d.signInWithGoogle]})})]})]}):null}function s(){return(0,t.jsxs)("svg",{width:"18",height:"18",viewBox:"0 0 48 48","aria-hidden":"true",children:[(0,t.jsx)("path",{fill:"#EA4335",d:"M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"}),(0,t.jsx)("path",{fill:"#4285F4",d:"M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"}),(0,t.jsx)("path",{fill:"#FBBC05",d:"M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"}),(0,t.jsx)("path",{fill:"#34A853",d:"M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"})]})}let d={nav:{diagramTypes:"Diagram types",diagramTypesShort:"Types",language:"Language",templates:"Templates"},quota:{label:"points today",low:"Running low",empty:"Daily limit reached"},hero:{title:"AI Diagram Generator — from Prompt or Chat",subtitle:"AI diagram generator with two modes: Quick (one prompt, no signup) or Chat (multi-turn, AI clarifies before drawing). Edit and export SVG / PNG / Markdown.",aiBadge:"AI-powered · No syntax to learn",tryLabel:"Try:",examples:[{title:"Product launch mindmap",icon:"Rocket",diagramType:"mindmap",prompt:"Mindmap for a product launch: Marketing (SEO, ads, social, PR), Engineering (backend, frontend, infra), Ops (support, billing, legal), Analytics (dashboards, funnels)."},{title:"Login flow with 2FA",icon:"Lock",diagramType:"flowchart",prompt:"Login flow with two-factor authentication: user enters credentials, backend validates, if valid send SMS code, user enters code, on match grant session token"},{title:"OAuth handshake",icon:"GitBranch",diagramType:"sequence",prompt:"OAuth 2.0 authorization code flow between browser, auth server, and resource server"},{title:"Blog schema ERD",icon:"Database",diagramType:"erd",prompt:"Blog database schema: users write posts, posts have many comments, users can leave comments. Each has 
2id, timestamps, and its own columns."},{title:"CI/CD pipeline",icon:"Workflow",diagramType:"flowchart",prompt:"CI/CD pipeline: push to main runs lint and tests in parallel, if pass build docker image, push to registry, deploy to staging, smoke test, promote to production on success"}],typePickerLabel:"Diagram type",typeNames:{auto:"Auto-detect",flowchart:"Flowchart",sequence:"Sequence",erd:"ERD",state:"State",class:"Class",mindmap:"Mindmap",gantt:"Gantt",arch:"Arch"},typeMindmapHint:"Opens the interactive mindmap tool ↗",typePickerCollapse:"Hide ▴",typePickerExpand:"Change ▾",typeArchHint:"System architecture diagrams — services, DBs, external APIs",autoDetectOn:"Auto-detect on",autoDetectOff:"Auto-detect off"},onboarding:{steps:[{title:"Describe it",desc:"Plain English. No diagram syntax, no type to pick first."},{title:"Get the diagram",desc:"Editable code on the left, live preview on the right — tweak either."},{title:"Export",desc:"SVG, PNG, or copy the Mermaid code into your docs."}]},promptBar:{placeholder:"Describe a diagram — e.g. 'login flow with 2FA' or 'ERD for blog with users and posts'.",typeHint:"No need to pick a type first — just write, we detect it.",generate:"Generate",generating:"Generating…",hint:"⌘/Ctrl + Enter to generate",hintMobile:"Tap Generate ↓",collapse:"▴ Collapse",expand:"▾ Expand",promptHidden:"Prompt hidden — click Expand to write",promptLabel:"Prompt:",viewMode:{text:"Text",split:"Split",preview:"Preview",textDesc:"Editor only",splitDesc:"Editor + Preview",previewDesc:"Preview only"},rateLimitBase:"Daily limit reached.",rateLimitResetIn:"Resets in"},preview:{label:"Preview",fullscreenLabel:"Preview (Full screen · ESC to close)",copy:"Copy code",copied:"Copied ✓",copyImage:"Copy image",copyImageUnsupported:"This browser can't copy images — use Export PNG instead.",exportSvg:"Export SVG",exportPng:"Export PNG",exporting:"Exporting…",watermarkHint:"Exports are watermarked · Sign in to remove",zoomIn:"Zoom in (or scroll wheel up)",zoomOut:"Zoom out (or scroll wheel down)",resetView:"Reset view",fullscreen:"Full screen",exitFullscreen:"Exit full screen (ESC)",savedLabel:"Auto-saved",nodesLabel:"nodes",edgesLabel:"edges",paletteHint:"Press ? for commands",untitled:"Untitled diagram",renderError:"Preview failed to render. The diagram code may have a syntax issue. Try regenerating.",renderErrorRetry:"Reload preview"},palette:{title:"Keyboard shortcuts",close:"Close"},landing:{ctaOpenTool:"Open the generator →",ctaOpenFullTool:"Or open the full generator →",heroPromptHint:"Enter to generate · Shift + Enter for a new line",heroPromptHintChat:"Enter to start a chat · Shift + Enter for a new line",heroSubmitQuick:"Generate",heroSubmitChat:"Refine in chat →",examplesHeading:"Try one of these — click to open in the generator",useCaseHeading:"When to use this",relatedHeading:"Related tools",madeWith:"Made with",breadcrumbHome:"Home",breadcrumbTypes:"Diagram Types",whenToUseHeading:"When to use",deepDiveHeading:"Deep dive",faqHeading:"Frequently asked questions",walkthroughCtaButton:"Start this conversation →",walkthroughCtaHint:"Opens the generator in chat mode with the first message already filled in.",chatCtaHeading:"Prefer a conversation?",chatCtaBody:"Not sure how to phrase your prompt? Chat mode lets AI ask 2-3 clarifying questions about actors, events, and edge cases — then draws.",chatCtaButton:"Try Chat to Diagram",guideCtaHeading:"Want to draw better diagrams?",guideCtaBody:"Read our in-depth tutorials — symbols, structures, 9 rules, and copy-paste prompt templates for real-world flows.",guideCtaButton:"Read the tutorials",midCtaHeading:"Ready to try it yourself?",footerProductHeading:"Product",footerDiagramTypesHeading:"Diagram Types",footerLegalHeading:"Legal",footerCopyright:"© 2026 VizText. All rights reserved.",footerPrivacy:"Privacy",footerTerms:"Terms",footerContact:"Contact",footerHome:"Home",footerGenerator:"Generator"},changelog:{metaTitle:"Changelog — What's New in VizText",metaDescription:"Release notes for VizText. Chat mode, new diagram types, SEO improvements, Chrome extension updates.",pageTitle:"Changelog",pageSubtitle:"Track what's new, what's better, and what got fixed. Latest releases first.",kindLabels:{feature:"New",improvement:"Better",fix:"Fixed"},relatedHeading:"Related",ctaHeading:"Try the latest version",ctaButton:"Open the tool",tryLabel:"Where to use it:"},blog:{metaTitle:"Diagram Tutorials — How to Draw Flowcharts, ER & Sequence Diagrams",metaDescription:"Step-by-step tutorials on drawing flowcharts, ER diagrams, sequence diagrams, and architecture diagrams with AI. Prompt templates, methodology (arc42 · C4), real cases.",pageTitle:"Diagram Tutorials",pageSubtitle:"Step-by-step guides to drawing diagrams with AI. Prompt templates, methodology, and real cases.",breadcrumbLabel:"Tutorials",publishedOn:"Published on",updatedOn:"Updated on",readMinutes:"min read",tagLabel:"Topics",faqHeading:"FAQ",relatedPostsHeading:"Continue reading",ctaHeading:"Try VizText now",ctaButton:"Open the tool",backToList:"← Back to all tutorials",navLabel:"Tutorials"},share:{button:"Share",menuTitle:"Share this diagram",toX:"Share on X",toLinkedIn:"Share on LinkedIn",toReddit:"Share on Reddit",copyLink:"Copy link",copied:"Link copied",tweetText:"Made this diagram from a sentence with VizText",preparing:"Getting your link ready…",tooLong:"This diagram is too big to share as a link. Export it as a PNG instead.",invalid:"Draw a diagram first, then share it.",unavailable:"We couldn't create a link just now. Try again in a moment.",pageTitle:"A diagram made with VizText",pageSubtitle:"Open it in the editor and change anything you want — free, no signup.",diagramAlt:"The shared diagram",openInEditor:"Open in the editor →",makeYourOwn:"Make your own",viewSource:"View the Mermaid source"},markmap:{placeholder:"Enter a topic to mindmap — e.g. 'Renaissance art movements' or 'How to prepare for a product launch'.",promptLabel:"Topic",generate:"Generate mindmap",generating:"Generating…",hint:"⌘/Ctrl + Enter to generate",hintMobile:"Tap Generate ↓",fit:"Fit",exportMarkdown:"Export MD",exportOpml:"Export OPML",emptyHint:"Your mindmap will appear here",heroTitle:"AI Mindmap Generator",heroSubtitle:"Type any topic — AI builds an interactive mindmap. Click nodes to fold. Export as PNG, SVG, Markdown, or OPML for XMind.",heroBadge:"Interactive · Foldable · Free",tryLabel:"Try:",viewMindmap:"Mindmap",editMode:"Edit",editModeDesc:"Show markdown editor alongside the mindmap for direct editing",examples:[{title:"Renaissance art movements",prompt:"Renaissance art movements"},{title:"Product-market fit signals",prompt:"Product-market fit — signals, measurement, common pitfalls"},{title:"Deep learning fundamentals",prompt:"Deep learning fundamentals — architectures, training, tools"},{title:"Launching a SaaS",prompt:"How to launch a SaaS product — from idea to first customer"}]},homeSeo:{howItWorks:{heading:"How the AI diagram generator works",steps:[{icon:"Type",title:"1. Describe your diagram — one sentence or a chat",body:"Write what you want in one or tw
2o sentences — a login flow with 2FA, a database schema for a blog, a product launch mindmap. Or switch to Chat mode and let AI ask a few clarifying questions first. English works. Chinese works. You do not need to know Mermaid, PlantUML, or Graphviz syntax."},{icon:"Wand2",title:"2. AI clarifies intent — then picks the right diagram type",body:"In Quick mode, auto-detect classifies your prompt into flowchart, sequence diagram, ERD, class diagram, state diagram, mindmap, or Gantt in about 300ms. In Chat mode, AI asks 2-3 questions to firm up actors, events, and edge cases before picking a type — better for complex flows."},{icon:"Sparkles",title:"3. Get a rendered diagram — review and adjust",body:"The AI returns valid Mermaid or markmap source, the preview canvas renders it live. In Chat mode, if AI made an assumption you disagree with, reject it in one click and the diagram redraws without that element. Zoom, pan, and reset view work on desktop and mobile."},{icon:"Download",title:"4. Edit and export",body:"Open the split view to tweak the generated Mermaid source directly. Every edit re-renders instantly. Export as SVG for lossless scaling, PNG for slides and docs, Markdown or OPML for mindmaps you want to import into XMind or Obsidian."}]},useCases:{heading:"What people use the diagram generator for",intro:"The AI diagram generator covers the seven diagram types most engineers, PMs, and technical writers reach for every week. Pick Quick mode for one-shot generation, or Chat mode when you want AI to ask questions before drawing. Each use case links to a focused landing page with its own examples and prompts.",cases:[{icon:"GitBranch",slug:"flowchart-from-text",title:"Flowcharts from plain English",body:"Turn a written process — user signup, order fulfilment, deploy pipeline, incident response — into a top-down or left-to-right flowchart. Nodes, decision diamonds, and edge labels are inferred from the wording. Best for onboarding docs, runbooks, and RFCs."},{icon:"ArrowLeftRight",slug:"sequence-diagram-from-text",title:"Sequence diagrams for API interactions",body:"Describe who calls whom — client, gateway, auth service, database, third-party API — and get a lifeline diagram with request and response arrows. The AI adds notes for async callbacks and error paths when the prompt implies them. Great for API design reviews and integration handoffs."},{icon:"Database",slug:"erd-from-text",title:"ERD for database schema design",body:"Sketch a data model in natural language — users write posts, posts have many comments, comments belong to users — and get an entity-relationship diagram with primary keys, foreign keys, and cardinality. Fastest way to align on a schema before writing a migration."},{icon:"Network",slug:"mindmap-from-text",title:"Mindmaps for planning and study notes",body:"Feed the generator a topic — Renaissance art movements, product-market fit signals, launch checklist — and get an interactive markmap you can fold, expand, and export as OPML for XMind. Not just for engineering: writers, students, and PMs use it for outlines."},{icon:"CircleDot",slug:"state-diagram-from-text",title:"State diagrams for lifecycle modeling",body:"Model a state machine — order status, subscription lifecycle, deployment stages — with transitions labeled by triggering event. Cleaner than trying to describe state in prose, and catches missing transitions before you code them."},{icon:"Box",slug:"class-diagram-from-text",title:"Class diagrams for OO design",body:"Turn a domain description into a UML class diagram with attributes, methods, inheritance, and associations. Useful for code review, refactoring proposals, and teaching object-oriented design without hand-drawing boxes."},{icon:"Workflow",slug:"gantt-from-text",title:"Gantt charts for project timelines",body:"Describe milestones and dependencies — design done by week 2, backend by week 5, launch week 8 — and get a Gantt chart with tasks, durations, and critical path. Lighter than Jira for anything that fits in a single sprint plan."}]},faq:{heading:"Frequently asked questions",intro:"Common questions about the AI diagram generator. Quick mode has no signup wall; Chat mode requires sign-in so it can keep the conversation context.",items:[{q:"Is VizText really free?",a:"Yes. Quick mode supports every diagram type without signup, watermark, or credit card. Chat mode is also free but requires sign-in so it can keep conversation context. Both modes have a generous daily rate limit that resets every 24 hours."},{q:"What diagram types does the AI generator support?",a:"Seven diagram types: flowchart, sequence diagram, ERD (entity-relationship diagram), class diagram, state diagram, mindmap, and Gantt chart. The first six are rendered with Mermaid; mindmaps are rendered with markmap for interactive folding and OPML export. Auto-detect picks the right type from your prompt, or you can pin it with the diagram type picker."},{q:"Do I need to know Mermaid syntax?",a:"No. You write in plain English (or Chinese). The AI generates valid Mermaid source behind the scenes, but you never need to touch it unless you want to. If you do know Mermaid, the split view lets you edit the source directly and see the change render live — good for last-mile tweaks."},{q:"What is the difference between Quick mode and Chat mode?",a:"Quick mode generates a diagram from one prompt — fastest, best for straightforward flows. 
2Chat mode lets AI ask 2-3 clarifying questions about actors, events, and edge cases before drawing — better when you're not sure of every detail. You can switch between tabs at any time and keep the same diagram type selection."},{q:"How many questions does Chat mode ask before drawing?",a:"Typically 2-3, sometimes 4-5 for complex flows. There's a built-in budget so it will not ask forever. Once AI has enough context, it produces the diagram and shows any assumptions it made — you can reject any of them in one click."},{q:"Can I skip the questions and just generate?",a:"Yes. In Chat mode, type 'just draw it' or 'skip questions' to jump straight to generation. AI will use whatever context it has and note its assumptions. If any assumption looks wrong, reject it and the diagram redraws."},{q:"What if AI adds elements I did not ask for?",a:"After Chat mode generates a diagram, it shows a confirmation card listing anything it inferred — a return arrow you did not describe, an actor you did not mention. Click 'Reject' and the AI redraws without that element. Click 'Accept' and it's added to the diagram spec for the next iteration."},{q:"Can I edit the generated diagram?",a:"Yes, in two ways. First, edit the underlying Mermaid source in the split view — every change re-renders in the preview instantly. Second, rerun the prompt with more detail, or add a follow-up sentence, and the AI regenerates the diagram from the new description. Mindmaps have a dedicated markdown editor with the same split behavior."},{q:"How do I export the diagram?",a:"Every diagram type exports as SVG (lossless, scales to any size) and PNG (raster, drop into slides and docs). Mindmaps additionally export as Markdown and OPML — OPML imports cleanly into XMind, Obsidian, and most outline tools. Export buttons live in the preview status bar."},{q:"Does it support Chinese input?",a:"Yes. Type your prompt in Chinese and the generator returns a Chinese-labeled diagram. Language is passed through the entire pipeline — from the UI locale, into the API request body, into the LLM directive — so the model does not default back to English on you. Mixed Chinese-English prompts also work."},{q:"Is there a rate limit?",a:"Yes. A daily per-IP limit caps generation requests to keep the free tier sustainable. The exact number is generous enough that normal drafting will not hit it. If you do hit the limit, the UI shows the remaining reset time. The rate limit is enforced with Upstash Redis and is consistent across all Vercel edge instances."},{q:"Is my prompt data stored?",a:"Quick mode prompts and generated code are not stored in our application database, though they may exist briefly in in-memory caches and are sent to a third-party large language model for generation. Chat mode stores messages, AI replies, diagram specifications, and generated code under your signed-in account so multi-turn context works. Production logs omit prompt content. See the privacy page for retention and deletion details."}]}},auth:{signIn:"Sign in",signOut:"Sign out",signInWithGoogle:"Continue with Google",signInWithGithub:"Continue with GitHub",signInWithEmail:"Continue with email",signInPageTitle:"Sign in to VizText",signInPageSubtitle:"Pick how you'd like to sign in.",comingSoonBadge:"Coming soon",proBadge:"Pro",upgradePrompt:"Sign in to unlock Chat mode.",accountMenu:"Account"},planMode:{title:"Diagram type",subtitle:"Choose a type and how to describe it.",typePickerLabel:"Diagram type",quickTab:"Quick",planTab:"Chat",planTabProBadge:"Limited free",planTabSubtitle:"Answer a few questions — AI will draw it",botIntro:"I'll help you create this diagram. Let me ask a few questions first.\n\nWhat kind of flow or system are you describing?",inputPlaceholder:"Type a reply...",generateButton:"Generate Diagram",stubSignIn:"Sign in to use Chat mode.",stubUpgrade:"Chat mode requires sign-in. Contact us if this message persists.",alreadyGenerated:"This chat already produced a diagram. Start a new chat to iterate.",thinking:"Thinking...",navEntry:"Chat",generatedNotice:"✓ Diagram ready",needMessageFirst:"Describe what you want first, then click Generate.",generateForceMessage:"Please generate the diagram now."},agent:{tabSubtitle:"Agent — reflects, clarifies, verifies",botIntro:"Describe the diagram you want. I'll ask what I need to know.",inputPlaceholder:"Type your answer or new requirement…",thinking:"Thinking…",thinkingSlow:"Still working, this is taking longer than usual…",generatingDrawing:"Drawing diagram · this takes a moment",ask:{header:"AskUserQuestion",other:"Other — free input",otherPlaceholder:"Type here…",submit:"Send",recommend:"Recommended"},ready:{header:"Ready confirmation",formatLabel:"format"},system:{reset:"Conversation reset",expire:"Session expired"},reset:{tooltip:"Reset conversation",confirmTitle:"Reset conversation?",confirmBody:"This will clear the current chat and start a fresh session.",cancel:"Cancel",confirm:"Reset"},questionActors:"Who are the participants in this flow? (e.g. User, Server, DB)",questionEvents:"What interactions happen between them? (each step: who does what to whom)",questionSync:"Are these calls synchronous (waiting for a response) or asynchronous?",questionNodes:"What are the main steps or decision points? (e.g. Login page, Check password, Redirect home)",questionEdges:"How do these steps connect? Which flows into which, and what conditions branch?",questionDirection:"Top-to-bottom (TD) or left-to-right (LR) layout?",questionEntities:"What entities (tables) are involved? What are their key fields? (e.g. User: id, name, email)",questionRelationships:"How are these entities related? (e.g. User has many Order · one-to-many)",questionStates:"What states exist? (e.g. Pending, Paid, Completed)",questionTransitions:"How do states transition? What triggers each transition?",questionInitialState:"Which one is the initial state?",questionClasses:"What classes exist? Fields and methods of each? (e.g. Animal
2: name/age · eat())",questionRelations:"How are the classes related? (extends / implements / aggregation / composition / association / dependency)",questionComponents:"What components are in the system? (client · service · database · cache · queue etc)",questionConnections:"How are the components connected? What protocols?",questionRootId:"What is the central topic?",questionTasks:"What tasks in the project? Timing of each? (e.g. Design: Feb 1, 3 days)",questionDiagramType:"Which kind of diagram do you want? Sequence / Flowchart / ERD / State / Class / Mindmap / Gantt / Arch. You can also pick from the button row above.",questionFallback:"Could you clarify?",errorRateLimit:"Daily limit reached. Try again after reset.",errorStale:"This confirmation is no longer active. Please continue.",errorInternal:"Server busy, please try again.",generatedNotice:"✓ Diagram generated",anonNextTurnHint:"Sign in to keep going — follow-ups, questions and confirmations all live in chat mode",confirmedNotice:"✓ Confirmed",answerAllLabel:"Yes to all remaining",answerAllEcho:"Yes to all remaining",assumptionsTitle:"I filled in a few things you didn't mention",assumptionsHint:"Ignore this and just keep going",assumptionsRemove:"Remove {n}",assumptionsKeep:"Looks good",assumptionsRemoveEcho:"Removed {n} of them",stubSignIn:"Sign in to use Agent mode.",switchConfirm:{title:"Switch diagram type?",body:"This will clear the current conversation. Sure to switch?",cancel:"Cancel",confirm:"Switch"},badge:{locked:"Locked",auto:"Auto",detecting:"Detecting…"}}};e.s(["en",0,d],63009);let l={nav:{diagramTypes:"图表类型",diagramTypesShort:"图表",language:"语言",templates:"模板"},quota:{label:"今日额度",low:"快用完了",empty:"今日已用完"},hero:{title:"AI 图表生成器 —— 一句话出图,或先聊清楚再出图",subtitle:"两种模式:快速模式一句话直接出图,不用注册;对话模式里 AI 先问几个问题 —— 谁参与、哪几步、异常怎么走 —— 问清楚了再画。画完能改,可导出 SVG、PNG、Markdown。",aiBadge:"AI 生成 · 不用记语法",tryLabel:"试试:",examples:[{title:"产品发布思维导图",icon:"Rocket",diagramType:"mindmap",prompt:"产品发布思维导图:市场(SEO、广告、社媒、PR),工程(后端、前端、基础设施),运营(客服、账单、法务),分析(dashboard、漏斗)。"},{title:"带两步验证的登录流程",icon:"Lock",diagramType:"flowchart",prompt:"Login flow with two-factor authentication: user enters credentials, backend validates, if valid send SMS code, user enters code, on match grant session token"},{title:"OAuth 握手过程",icon:"GitBranch",diagramType:"sequence",prompt:"OAuth 2.0 authorization code flow between browser, auth server, and resource server"},{title:"博客表结构 ER 图",icon:"Database",diagramType:"erd",prompt:"Blog database schema: users write posts, posts have many comments, users can leave comments. Each has id, timestamps, and its own columns."},{title:"CI/CD 流水线",icon:"Workflow",diagramType:"flowchart",prompt:"CI/CD pipeline: push to main runs lint and tests in parallel, if pass build docker image, push to registry, deploy to staging, smoke test, promote to production on success"}],typePickerLabel:"图表类型",typeNames:{auto:"自动识别",flowchart:"流程图",sequence:"时序图",erd:"ER 图",state:"状态图",class:"类图",mindmap:"思维导图",gantt:"甘特图",arch:"架构图"},typeMindmapHint:"打开思维导图工具 ↗",typePickerCollapse:"收起 ▴",typePickerExpand:"更改 ▾",typeArchHint:"系统架构图 —— 服务、数据库、外部接口",autoDetectOn:"自动识别:开",autoDetectOff:"自动识别:关"},onboarding:{steps:[{title:"用大白话描述",desc:"不用学语法,也不用先挑图型。"},{title:"拿到图",desc:"左边是可改的代码,右边实时预览,两边改哪边都行。"},{title:"导出",desc:"存 SVG / PNG,或者复制 Mermaid 代码贴进文档。"}]},promptBar:{placeholder:"说说你想画什么 —— 比如「带两步验证的登录流程」,或「博客的用户、文章、评论表关系」",typeHint:"不用先选图型,直接写,我们会自动识别。",generate:"生成",generating:"生成中…",hint:"⌘/Ctrl + 回车 生成",hintMobile:"点下面的生成 ↓",collapse:"▴ 收起",expand:"▾ 展开",promptHidden:"输入框收起来了 —— 点「展开」继续写",promptLabel:"描述:",viewMode:{text:"代码",split:"分屏",preview:"预览",textDesc:"只看编辑器",splitDesc:"编辑器 + 预览",previewDesc:"只看预览"},rateLimitBase:"今天的次数用完了。",rateLimitResetIn:"距重置还有"},preview:{label:"预览",fullscreenLabel:"预览(全屏 · 按 ESC 退出)",copy:"复制代码",copied:"已复制 ✓",copyImage:"复制图片",copyImageUnsupported:"这个浏览器不支持复制图片,请改用「导出 PNG」",exportSvg:"导出 SVG",exportPng:"导出 PNG",exporting:"导出中…",watermarkHint:"导出图片带水印 · 登录去掉",zoomIn:"放大(或向上滚轮)",zoomOut:"缩小(或向下滚轮)",resetView:"复ä
2½",fullscreen:"全屏",exitFullscreen:"退出全屏(ESC)",savedLabel:"已自动保存",nodesLabel:"个节点",edgesLabel:"条连线",paletteHint:"按 ? 看快捷键",untitled:"未命名图表",renderError:"预览没渲染出来,多半是图表代码有语法问题。重新生成一次试试。",renderErrorRetry:"重新加载预览"},palette:{title:"键盘快捷键",close:"关闭"},landing:{ctaOpenTool:"打开生成器 →",ctaOpenFullTool:"或者打开完整生成器 →",heroPromptHint:"回车生成 · Shift + 回车换行",heroPromptHintChat:"回车开始对话 · Shift + 回车换行",heroSubmitQuick:"直接生成",heroSubmitChat:"聊天修改 →",examplesHeading:"点一个试试 —— 会直接带进生成器",useCaseHeading:"什么时候用",relatedHeading:"相关工具",madeWith:"工具由",breadcrumbHome:"首页",breadcrumbTypes:"图表类型",whenToUseHeading:"适用场景",deepDiveHeading:"详细说明",faqHeading:"常见问题",walkthroughCtaButton:"用这段对话开始 →",walkthroughCtaHint:"打开对话模式,上面那句话已经替你填好了。",chatCtaHeading:"不知道怎么描述?",chatCtaBody:"对话模式里 AI 会先问你两三个问题 —— 谁参与、发生什么、异常分支怎么走 —— 弄清楚了再动笔。",chatCtaButton:"试试对话模式",guideCtaHeading:"想画得更规范?",guideCtaBody:"教程里讲了常用符号、几种基本结构、九条画法规范,还有可以直接拿去用的 prompt 模板和真实业务例子。",guideCtaButton:"看教程",midCtaHeading:"自己试一下?",footerProductHeading:"产品",footerDiagramTypesHeading:"图表类型",footerLegalHeading:"法律",footerCopyright:"© 2026 VizText. 保留所有权利。",footerPrivacy:"隐私政策",footerTerms:"服务条款",footerContact:"联系我们",footerHome:"首页",footerGenerator:"生成器"},changelog:{metaTitle:"更新日志 — VizText 更新了什么",metaDescription:"VizText 的更新记录:对话模式、新增图表类型、页面优化、Chrome 插件。",pageTitle:"更新日志",pageSubtitle:"加了什么、改好了什么、修了什么。最新的在最上面。",kindLabels:{feature:"新增",improvement:"改进",fix:"修复"},relatedHeading:"相关",ctaHeading:"去试试最新版",ctaButton:"打开工具",tryLabel:"在哪能用上:"},blog:{metaTitle:"画图教程 — 流程图 / ER 图 / 时序图 / 架构图怎么画",metaDescription:"讲怎么用 AI 画流程图、ER 图、时序图、架构图的长文教程。含 prompt 模板、arc42 与 C4 方法论、真实项目案例。",pageTitle:"画图教程",pageSubtitle:"一步步教你用 AI 画图:prompt 模板、常用方法论、真实项目案例。",breadcrumbLabel:"教程",publishedOn:"发布于",updatedOn:"更新于",readMinutes:"分钟阅读",tagLabel:"话题",faqHeading:"常见问题",relatedPostsHeading:"接着读",ctaHeading:"去试试 VizText",ctaButton:"打开工具",backToList:"← 回到全部教程",navLabel:"教程"},share:{button:"分享",menuTitle:"分享这张图",toX:"分享到 X",toLinkedIn:"分享到 LinkedIn",toReddit:"分享到 Reddit",copyLink:"复制链接",copied:"链接已复制",tweetText:"用 VizText 一句话画出来的图",preparing:"正在生成链接…",tooLong:"这张图太大了,做不成分享链接。导出 PNG 吧。",invalid:"先画一张图,再分享。",unavailable:"链接暂时生成不了,过一会儿再试试。",pageTitle:"一张用 VizText 画的图",pageSubtitle:"在编辑器里打开,想怎么改都行 —— 免费,不用注册。",diagramAlt:"被分享的图",openInEditor:"在编辑器里打开 →",makeYourOwn:"自己画一张",viewSource:"看 Mermaid 源码"},markmap:{placeholder:"写个想梳理的话题 —— 比如「文艺复兴的艺术流派」,或「产品发布前要准备什么」。",promptLabel:"话题",generate:"生成脑图",generating:"生成中…",hint:"⌘/Ctrl + 回车 生成",hintMobile:"点下面的生成 ↓",fit:"适配",exportMarkdown:"导出 MD",exportOpml:"导出 OPML",emptyHint:"生成的脑图会出现在这里",heroTitle:"AI 思维导图生成器",heroSubtitle:"给一个话题,AI 直接生成可交互的脑图。点节点能折叠。可导出 PNG、SVG、Markdown,或导出 OPML 丢进 XMind。",heroBadge:"可交互 · 能折叠 · 免费",tryLabel:"试试:",viewMindmap:"脑图",editMode:"编辑",editModeDesc:"在脑图旁边打开 markdown 编辑器,直接改内容",examples:[{title:"文艺复兴时期的艺术",prompt:"文艺复兴时期的艺术"},{title:"产品市场契合度信号",prompt:"产品市场契合度 —— 信号、如何测量、常见误区"},{title:"深度学习入门",prompt:"深度学习入门 —— 基础概念、核心架构、常用工具"},{title:"SaaS 产品上线全流程",prompt:"SaaS 产品上线全流程 —— 从想法到第一个付费用户"}]},homeSeo:{howItWorks:{heading:"AI 图表生成器怎么用",steps:[{icon:"Type",title:"1. 说清楚要画什么 —— 一句话,或者聊几句",body:"一两句话写清楚要画的东西:带两步验证的登录流程、博客的库表关系、产品发布的准备清单。要是自己也没完全想明白,切到对话模式,让 AI 先问几个问题。中文英文都能写,Mermaid、PlantUML、Graphviz 的语法一个都不用会。"},{icon:"Wand2",title:"2. 先弄清意图,再决定画成哪种图",body:"快速模式下,自动识别会在 300 毫秒左右判断你要的是流程图、时序图、ER 图、类图、状态图、思维导图还是甘特图。对话模式下,AI 会先问两三个问题,把角色、步骤、异常分支问明白再定类型 —— 流ç¨
2‹ä¸€å¤æ‚,这样出图更稳。"},{icon:"Sparkles",title:"3. 几秒钟拿到图 —— 看一眼,不对就改",body:"AI 吐出来的是合法的 Mermaid 或 markmap 源码,预览区实时渲染。对话模式下,如果 AI 自己脑补了你没说的东西,点一下拒绝,图立刻重画一版去掉它。缩放、拖动、复位在电脑和手机上都能用。"},{icon:"Download",title:"4. 改一改,导出去用",body:"切到分屏就能直接改 Mermaid 源码,改一个字预览立刻跟着变。SVG 是矢量,放多大都不糊;PNG 直接贴进 PPT 和文档;思维导图还能导出 Markdown 和 OPML,丢进 XMind、Obsidian 这类大纲工具。"}]},useCases:{heading:"大家都拿它画什么图",intro:"工程师、产品经理、写技术文档的人每周要画的图,基本就是下面这七种。想一步出图就用快速模式,想让 AI 先问清楚再画就用对话模式。每一类都有单独的页面,里面有更多例子和可以照抄的 prompt。",cases:[{icon:"GitBranch",slug:"flowchart-from-text",title:"把一段文字变成流程图",body:"把写成文字的流程 —— 用户注册、订单从下单到发货、发布上线、线上故障处理 —— 变成从上到下或从左到右的流程图。哪些是步骤、哪里要判断、分支上标什么条件,都从你的措辞里推出来。适合写新人文档、值班手册和技术方案。"},{icon:"ArrowLeftRight",slug:"sequence-diagram-from-text",title:"给接口调用画时序图",body:"写清楚谁调谁 —— 客户端、网关、鉴权服务、数据库、第三方接口 —— 就能得到一张带请求和返回箭头的时序图。描述里提到异步回调或失败分支时,AI 会自己补上注释。适合接口评审和联调对齐。"},{icon:"Database",slug:"erd-from-text",title:"设计库表结构时画 ER 图",body:"用大白话描述数据模型 —— 用户发文章、文章下面挂评论、评论属于用户 —— 直接生成带主键、外键和一对多关系的 ER 图。写 migration 之前对齐表结构,这是最快的方式。"},{icon:"Network",slug:"mindmap-from-text",title:"做规划和读书笔记用的思维导图",body:"给一个题目 —— 文艺复兴的艺术流派、判断产品是否跑通的信号、上线前的检查清单 —— 生成能折叠展开的思维导图,还能导出 OPML 丢进 XMind。不只工程师在用,写东西的人、学生、产品经理拿它列提纲也顺手。"},{icon:"CircleDot",slug:"state-diagram-from-text",title:"给生命周期建模画状态图",body:"把状态机画出来 —— 订单状态、订阅的生命周期、发布的各个阶段 —— 每条状态转移上标清楚是什么动作触发的。比用文字描述状态清楚得多,而且经常能在写代码之前就发现漏掉的转移。"},{icon:"Box",slug:"class-diagram-from-text",title:"面向对象设计画类图",body:"把领域描述变成 UML 类图,带上属性、方法、继承和关联关系。代码评审、重构方案、讲面向对象设计的时候,能省下手画一堆方框的工夫。"},{icon:"Workflow",slug:"gantt-from-text",title:"排项目进度画甘特图",body:"描述里程碑和先后依赖 —— 第 2 周设计定稿、第 5 周后端完成、第 8 周上线 —— 生成带任务、工期和关键路径的甘特图。一个迭代排得完的事,用它比开 Jira 轻。"}]},faq:{heading:"常见问题",intro:"关于这个工具的常见问题。快速模式不用注册就能用;对话模式要登录,因为多轮对话的上下文得存下来。",items:[{q:"VizText 真的免费吗?",a:"免费。快速模式七种图都能画,不用注册,导出的图上没有水印。对话模式也免费,但要登录 —— 多轮对话的上下文得跟账号绑在一起。两种模式各有一个每日次数上限,24 小时后自动重置。"},{q:"支持哪些图表类型?",a:"七种:流程图、时序图、ER 图、类图、状态图、思维导图、甘特图。前六种用 Mermaid 渲染;思维导图用 markmap 渲染,能点节点折叠,也能导出 OPML。默认自动识别你要哪一种,也可以在左边的图表类型里手动定死。"},{q:"要先学 Mermaid 语法吗?",a:"不用。你写中文或英文就行,Mermaid 源码是 AI 在背后生成的,你可以一眼都不看。如果你本来就会 Mermaid,分屏模式下可以直接改源码,改完立刻重新渲染 —— 收尾微调的时候很方便。"},{q:"快速模式和对话模式差在哪?",a:"快速模式一句话直接出图,最快,流程本来就清楚的时候用它。对话模式会先问两三个问题,把角色、步骤、异常分支确认一遍再画,适合你自己也还没想全的情况。两个 tab 随时能切,切过去选好的图表类型不会丢。"},{q:"对话模式要问几个问题才画?",a:"一般两三个,流ç¨
2‹å¤æ‚的时候可能到四五个。系统里给提问次数设了预算,不会没完没了地追问。上下文够了它就出图,同时把自己补的内容列出来,你可以逐条否掉。"},{q:"能不能跳过提问直接画?",a:"能。在对话里说「直接画」或者「别问了」,AI 就用手头已有的信息出图,并把它做的假设标出来。哪条假设不对,点掉,图立刻重画。"},{q:"AI 加了我没说的东西怎么办?",a:"对话模式画完会弹一张确认卡,把它自己推断出来的东西列清楚 —— 你没提的一条返回箭头、你没说的一个角色。点「删掉」就重画一版去掉它;点「保留」它就进入这张图的定义,后面接着改也一直在。"},{q:"生成的图能改吗?",a:"能,两条路。一是在分屏模式里直接改 Mermaid 源码,改一处预览就跟着变一处。二是把描述写得更细,或者追加一句话让 AI 重新生成。思维导图有自己的 markdown 编辑器,同样是分屏。"},{q:"怎么导出?",a:"所有图都能导出 SVG 和 PNG:SVG 是矢量,放多大都不糊;PNG 直接贴进 PPT 和文档。思维导图另外还能导出 Markdown 和 OPML,OPML 可以被 XMind、Obsidian 以及大部分大纲工具直接读进去。导出按钮在预览区的状态栏上。"},{q:"支持中文吗?",a:"支持。用中文写,出来的图上标签也是中文。语言是从界面语言一路透传到接口请求、再传进给模型的指令里的,所以模型不会画着画着自己切回英文。中英文混着写也没问题。"},{q:"有次数限制吗?",a:"有,按 IP 限制每天的生成次数 —— 免费给所有人用,总得有个上限。这个数对正常画图来说够宽,一般碰不到。真触发了,界面会告诉你还有多久重置。限流走的是 Upstash Redis,所有节点上的计数一致。"},{q:"我写的东西会被存下来吗?",a:"快速模式的描述和生成的代码不写进我们的数据库,但会短暂留在内存缓存里,并且要发给第三方大模型才能生成。对话模式会把消息、AI 的回复、图的定义和代码存在你的账号下,不然多轮对话接不上。线上日志里不记录你写的内容。存多久、怎么删,隐私政策页写了。"}]}},auth:{signIn:"登录",signOut:"退出登录",signInWithGoogle:"用 Google 登录",signInWithGithub:"用 GitHub 登录",signInWithEmail:"用邮箱登录",signInPageTitle:"登录 VizText",signInPageSubtitle:"挑一种登录方式。",comingSoonBadge:"还没上线",proBadge:"Pro",upgradePrompt:"登录后可以用对话模式。",accountMenu:"账户"},planMode:{title:"图表类型",subtitle:"先选类型,再想怎么描述。",typePickerLabel:"图表类型",quickTab:"快速",planTab:"对话",planTabProBadge:"限免",planTabSubtitle:"回答几个问题,AI 来画",botIntro:"这张图我来帮你理。先问一个:\n\n你要描述的是什么流程,或者什么系统?",inputPlaceholder:"写下你的回答……",generateButton:"生成图表",stubSignIn:"登录后使用对话模式。",stubUpgrade:"对话模式需要登录。如果登录了还看到这句,联系我们。",alreadyGenerated:"这轮对话已经出过图了。想接着改,开一轮新对话。",thinking:"思考中……",navEntry:"对话",generatedNotice:"✓ 图已生成",needMessageFirst:"先说说你想画什么,再点生成。",generateForceMessage:"现在就出图吧。"},agent:{tabSubtitle:"Agent —— 会反问、会确认、会自检",botIntro:"说说你想画什么,缺什么信息我会问你。",inputPlaceholder:"写回答,或者提新的要求……",thinking:"思考中……",thinkingSlow:"还在算,这次比平常久一点……",generatingDrawing:"画图中,稍等……",ask:{header:"反问",other:"其它 —— 自己写",otherPlaceholder:"写在这里……",submit:"发送",recommend:"推荐"},ready:{header:"信息已齐",formatLabel:"格式"},system:{reset:"对话已重置",expire:"会话过期了"},reset:{tooltip:"重置对话",confirmTitle:"重置对话?",confirmBody:"当前对话会清空,重新开一轮。",cancel:"取消",confirm:"重置"},questionActors:"这个流程里有哪些角色?(比如用户、服务端、数据库)",questionEvents:"他们之间都发生什么?(每一步谁对谁做了什么)",questionSync:"这些调用是等结果的,还是发出去就不管了?",questionNodes:"流程里有哪几步,哪里要做判断?(比如登录页、校验密码、跳首页)",questionEdges:"这些步骤怎么连?哪一步走到哪一步,分叉的条件是什么?",questionDirection:"图从上往下画,还是从左往右画?",questionEntities:"æ
2¶‰åŠå“ªäº›è¡¨?每张表的关键字段是什么?(比如 User:id、name、email)",questionRelationships:"这些表之间是什么关系?(比如一个用户对应多个订单)",questionStates:"有哪些状态?(比如待支付、已支付、已完成)",questionTransitions:"状态之间怎么转?每次转换是什么触发的?",questionInitialState:"从哪个状态开始?",questionClasses:"有哪些类?每个类的字段和方法是什么?(比如 Animal:name、age、eat())",questionRelations:"类之间是什么关系?(继承、实现、聚合、组合、关联、依赖)",questionComponents:"系统里有哪些组件?(前端、后端服务、数据库、缓存、消息队列等)",questionConnections:"这些组件之间怎么连的,走什么协议?",questionRootId:"这张脑图的中心主题是什么?",questionTasks:"有哪些任务?每个排在什么时候?(比如 设计:2 月 1 号起,3 天)",questionDiagramType:"你想要哪种图?时序图、流程图、ER 图、状态图、类图、思维导图、甘特图、架构图。也可以直接点上面的按钮选。",questionFallback:"这块能再说细一点吗?",errorRateLimit:"今天的次数用完了,等重置后再来。",errorStale:"这条确认已经过期了,接着说就行。",errorInternal:"服务器忙,过一会儿再试。",generatedNotice:"✓ 图已生成",anonNextTurnHint:"登录后接着聊 —— 追问、补充、确认都在对话模式里",confirmedNotice:"✓ 已确认",answerAllLabel:"剩下的都同意",answerAllEcho:"剩下的都同意",assumptionsTitle:"有几处你没提,我先按常见做法补上了",assumptionsHint:"不用管也行,接着说就是了",assumptionsRemove:"删掉勾中的 {n} 项",assumptionsKeep:"就这样",assumptionsRemoveEcho:"删掉了其中 {n} 项",stubSignIn:"登录后使用 Agent 模式。",switchConfirm:{title:"换一种图?",body:"当前对话会清空。确定要换吗?",cancel:"取消",confirm:"切换"},badge:{locked:"锁定",auto:"自动",detecting:"识别中…"}}};e.s(["zh",0,l],49222);let c=(0,a.createContext)(null);e.s(["SignInModalProvider",0,function({children:e}){let[n,s]=(0,a.useState)(!1),[u,h]=(0,a.useState)(void 0),[m,p]=(0,a.useState)(void 0),g=(0,i.usePathname)(),w=g?.startsWith("/zh")?l.auth:d.auth,f=(0,a.useCallback)(e=>{let t="string"==typeof e?.callbackUrl?e.callbackUrl:void 0,a="string"==typeof e?.source?e.source:void 0;h(t),p(a),(0,o.track)("sign_in_prompt",{source:a??"unknown",has_callback:!!t}),s(!0)},[]),y=(0,a.useCallback)(()=>s(!1),[]);return(0,t.jsxs)(c.Provider,{value:{open:f,close:y,isOpen:n},children:[e,(0,t.jsx)(r,{open:n,onClose:y,auth:w,callbackUrl:u,source:m})]})},"useSignInModal",0,function(){let e=(0,a.useContext)(c);if(!e)throw Error("useSignInModal must be used inside <SignInModalProvider>");return e}],61885)}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.