PageSourceSearch

https://shapewords.fun/assets/index-DbQVh1MB.js

js shapewords.fun collected 2026-10-02 01:54:06 UTC 426,324 bytes, 14 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/WordManagerDialog-BtniFgR7.js","assets/rolldown-runtime-COnpUsM8.js","assets/account-core-PbODbfoQ.js","assets/ShapeBuilderModal-Dp2S3YQk.js","assets/CanvasExportControls-CdoE5EgH.js","assets/vendor-icons-CBqri4QL.js","assets/page-templates-BFLjf14V.css","assets/CanvasShareControls-BjRY4y8Z.js","assets/outlineWordGeometry-gObrdTOL.js","assets/AccountLibraryDialog-DxC9TpNE.js","assets/PrivacyPolicyPage-BaNPcC5l.js","assets/PublicTemplatesPage-DgCInNac.js","assets/PublicTemplateDetailPage-BxgLV_SP.js","assets/LiveRoomsPage-Dz4utdRV.js","assets/LiveActivities-C4q0JvLE.js","assets/live-api-UL2uUYsP.js","assets/LiveLandingPage-CANkOPW4.js","assets/LiveJoinPage-CHsKrdlE.js","assets/LiveViewerPage-CznMncFD.js","assets/LiveD3Cloud-I5qGjO1E.js","assets/vendor-layout-DRbCABxT.js","assets/LiveWorkspacePage-v8yZ8h34.js","assets/WordCloud3DStage-DI4JUT7N.js","assets/WorldWordMapPage-D74TEcax.js","assets/AdminPage-CM21EdDR.js","assets/renderAutomation-DSK-dnlg.js","assets/liveApi-CL7OMpE0.js","assets/liveWorkspace-vYxRq0id.js"])))=>i.map(i=>d[i]);
2import{a as e}from"./rolldown-runtime-COnpUsM8.js";import{c as t,f as n,l as r,t as i,u as a}from"./account-core-PbODbfoQ.js";import{t as o}from"./vendor-react-DDlP9PtK.js";import{$t as s,At as c,Bt as l,C as u,Dt as d,Et as f,Gt as p,Ht as m,It as h,Jt as g,Kt as _,L as v,Lt as y,Mt as b,N as x,Nt as S,Ot as C,P as w,Pt as T,Rt as E,S as D,Tt as O,V as k,Vt as A,Xt as j,Zt as M,an as N,en as ee,ft as te,jt as P,ln as F,nn as I,on as ne,pt as L,qt as re,rn as R,sn as z,tn as ie,un as ae,vt as oe,wt as se,zt as ce}from"./feature-3d-AcrIrn_D.js";import{m as le,p as ue,u as de}from"./feature-export-renderer-B-OHjZcN.js";import{A as fe,C as pe,D as me,E as B,F as he,L as ge,M as _e,N as V,O as ve,P as ye,R as be,S as xe,T as H,_ as Se,a as Ce,b as we,c as Te,d as Ee,f as De,g as Oe,h as ke,j as Ae,k as U,l as je,m as Me,o as Ne,p as Pe,s as Fe,u as Ie,v as Le,w as Re,y as ze}from"./feature-word-manager-CznUkGOC.js";import{D as Be,F as Ve,G as He,H as Ue,K as We,O as Ge,S as Ke,T as qe,Z as Je,b as Ye,f as Xe,j as Ze,k as Qe,m as $e,n as et,ot as tt,p as nt,s as rt,t as it,u as at,y as ot}from"./vendor-icons-CBqri4QL.js";import{n as st}from"./page-legal--v79Ih-l.js";import{_ as ct,b as lt,c as ut,f as dt,g as ft,h as pt,m as W,p as mt,v as ht}from"./page-templates-gakMcn_M.js";import{B as gt,H as _t,R as vt,V as yt,W as bt,_ as xt,b as St,d as Ct,f as wt,g as Tt,h as Et,l as Dt,m as G,p as Ot,q as kt,u as At,v as jt,x as Mt,y as Nt,z as Pt}from"./feature-shape-builder-I5LmKqYA.js";import{n as Ft}from"./page-word-map-EeTF-SJn.js";import{a as It,i as Lt,n as Rt,r as zt,t as Bt}from"./vendor-radix-wxGd-p2C.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var K=e(n(),1),Vt=o(),Ht=`https://chromewebstore.google.com/detail/word-clouds-by-shapewords/gdokfidnkbeoljiikcfebkhhfnnlldni`,Ut=`shapewords.chromeExtensionPrompt.dismissed`;function Wt(e){return`${Ht}?${new URLSearchParams({utm_source:`shapewords_fun`,utm_medium:`site_${e}`,utm_campaign:`chrome_extension`}).toString()}`}async function Gt(){if(typeof navigator>`u`)return!1;let e=navigator,t=e.userAgentData?.brands??[];if(e.userAgentData?.mobile)return!1;if(t.length>0)return t.some(({brand:e})=>e===`Google Chrome`);let n=e.userAgent;if(/(Mobi|Android|iPhone|iPad|iPod)/i.test(n))return!1;try{if(await e.brave?.isBrave?.())return!1}catch{return!1}return e.vendor===`Google Inc.`&&/\bChrome\//.test(n)&&!/\b(?:Chromium|Edg|OPR|Opera|SamsungBrowser|YaBrowser|DuckDuckGo)\//.test(n)}function Kt(){if(typeof window>`u`)return!0;try{return window.localStorage.getItem(Ut)===`1`}catch{return!0}}function qt(){if(!(typeof window>`u`))try{window.localStorage.setItem(Ut,`1`)}catch{}}var Jt=`live`;function Yt(){return``}function Xt(e=window.location.hostname){return e.toLowerCase().startsWith(`${Jt}.`)}function Zt(){let e=Yt();if(e)return e;let{protocol:t,hostname:n,port:r,origin:i}=window.location;return n===`localhost`||n===`127.0.0.1`||n===`::1`||Xt(n)?i:`${t}//${Jt}.${n.replace(/^www\./i,``)}${r?`:${r}`:``}`}function Qt(e,t,n){return`/${e}/live/${t}/${n}`}function $t(e){return`${Zt()}/${e}/live-word-cloud`}
2function en(e,t,n){return`${Zt()}${Qt(e,t,n)}`}function tn(){let[e,t]=(0,K.useState)(!1);return(0,K.useEffect)(()=>{let e=!1;return Gt().then(n=>{e||t(n)}).catch(()=>{e||t(!1)}),()=>{e=!0}},[]),e}var q=v(),nn=`M17 9h67v18c0 5.8-4.7 10.5-10.5 10.5H43c-6.4 0-11.6 5.2-11.6 11.6v6.3L12.8 36.8C4.8 28.4 6.5 15.5 17 9Z`,rn=`M9.6 16.4 52.7 59.5H28C15.9 59.5 6 49.7 6 37.6v-8.2c0-4.9 1.2-9.3 3.6-13Z`,an=`M43.7 38.8h23.6C79.8 38.8 90 49 90 61.5v7.8c0 5-1.1 9.6-3.4 13.5L43.7 38.8Z`,on=`M86.2 80.5C80.7 87.1 72.3 90 62.1 90H8V72.4c0-5.9 4.8-10.7 10.7-10.7h34.1c6.2 0 11.2-5 11.2-11.2v-6.2l22.2 36.2Z`,sn=(0,K.memo)(function({label:e,className:t}){let n=(0,K.useId)().replace(/:/g,``),r=`brandLogoGreen-${n}`,i=`brandLogoGold-${n}`,a=`brandLogoClip-${n}`,o=e.toLowerCase()===`shapewords`?5:-1;return(0,q.jsxs)(`span`,{className:w(`inline-flex min-w-0 items-center gap-0 sm:gap-2`,t),children:[(0,q.jsxs)(`svg`,{className:`h-9 w-9 shrink-0`,viewBox:`0 0 96 96`,"aria-hidden":`true`,children:[(0,q.jsxs)(`defs`,{children:[(0,q.jsxs)(`linearGradient`,{id:r,x1:`8`,y1:`12`,x2:`74`,y2:`64`,gradientUnits:`userSpaceOnUse`,children:[(0,q.jsx)(`stop`,{stopColor:`#0f3a25`}),(0,q.jsx)(`stop`,{offset:`1`,stopColor:`#185438`})]}),(0,q.jsxs)(`linearGradient`,{id:i,x1:`20`,y1:`88`,x2:`90`,y2:`42`,gradientUnits:`userSpaceOnUse`,children:[(0,q.jsx)(`stop`,{stopColor:`#d8c174`}),(0,q.jsx)(`stop`,{offset:`1`,stopColor:`#b99a49`})]}),(0,q.jsxs)(`clipPath`,{id:a,children:[(0,q.jsx)(`path`,{d:nn}),(0,q.jsx)(`path`,{d:rn}),(0,q.jsx)(`path`,{d:an}),(0,q.jsx)(`path`,{d:on})]})]}),(0,q.jsx)(`path`,{d:nn,fill:`url(#${r})`}),(0,q.jsx)(`path`,{d:rn,fill:`url(#${r})`}),(0,q.jsx)(`path`,{d:an,fill:`url(#${i})`}),(0,q.jsx)(`path`,{d:on,fill:`url(#${i})`}),(0,q.jsx)(`path`,{d:`M9 8 88 87`,clipPath:`url(#${a})`,fill:`none`,stroke:`#fff`,strokeWidth:`7.4`,strokeLinecap:`butt`})]}),(0,q.jsx)(`span`,{className:`hidden min-w-0 truncate text-xl font-extrabold tracking-normal sm:block sm:text-2xl`,children:o>0?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`span`,{className:`text-[#123d2b] dark:text-[#d8f2df]`,children:e.slice(0,o)}),(0,q.jsx)(`span`,{className:`text-[#b99542] dark:text-[#ead58c]`,children:e.slice(o)})]}):(0,q.jsx)(`span`,{className:`text-[#123d2b] dark:text-[#d8f2df]`,children:e})})]})}),cn=`/chrome-web-store-badge.png`;function ln({size:e=16}){return(0,q.jsxs)(`svg`,{width:e,height:e,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,q.jsx)(`path`,{d:`M16.247 7.761a6 6 0 0 1 0 8.478`}),(0,q.jsx)(`path`,{d:`M19.075 4.933a10 10 0 0 1 0 14.134`}),(0,q.jsx)(`path`,{d:`M4.925 19.067a10 10 0 0 1 0-14.134`}),(0,q.jsx)(`path`,{d:`M7.753 16.239a6 6 0 0 1 0-8.478`}),(0,q.jsx)(`circle`,{cx:`12`,cy:`12`,r:`2`})]})}function un({size:e=16}){return(0,q.jsxs)(`svg`,{width:e,height:e,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,q.jsx)(`path`,{d:`m16 6 4 14`}),(0,q.jsx)(`path`,{d:`M12 6v14`}),(0,q.jsx)(`path`,{d:`M8 8v12`}),(0,q.jsx)(`path`,{d:`M4 4v16`})]})}function dn({size:e=16}){return(0,q.jsxs)(`svg`,{width:e,height:e,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,q.jsx)(`path`,{d:`M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2`}),(0,q.jsx)(`circle`,{cx:`12`,cy:`7`,r:`4`})]})}var fn=(0,K.memo)(function({locale:e,onOpenSidebar:t,onOpenAccount:n,onPreloadLive:r,onPreloadAccount:a,onNavigate:o,onSwitchLocale:s}){let{t:c}=F(),[l,u]=(0,K.useState)(!1),[d,f]=(0,K.useState)(()=>Kt()),p=tn(),{darkMode:m,toggleDarkMode:g,renderMode:_,setRenderMode:v}=k(be(e=>({darkMode:e.darkMode,toggleDarkMode:e.toggleDarkMode,renderMode:e.renderMode,setRenderMode:e.setRenderMode}))),{user:y}=i(be(e=>({user:e.user}))),S=p&&!d;function C(){qt(),f(!0)}let T=[{key:`live`,icon:(0,q.jsx)(ln,{size:16}),label:c(`app.live`),ariaLabel:c(`app.openLive`),href:$t(e),onClick:void 0,onPreload:r,active:!1,external:!1},{key:`account`,icon:y?(0,q.jsx)(un,{size:16}):(0,q.jsx)(dn,{size:16}),label:c(y?`app.account`:`app.signIn`),ariaLabel:c(y?`app.openAccount`:`app.signIn`),href:``,onClick:n,onPreload:a,active:!!y,external:!1}];return(0,q.jsxs)(`header`,{className:`relative flex min-h-14 shrink-0 items-center justify-between gap-3 border-b border-slate-200 bg-sidebar px-3 py-2 dark:border-slate-700 dark:bg-sidebar-dark sm:px-4 sm:py-3`,children:[(0,q.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-2`,children:[(0,q.jsx)(x,{type:`button`,onClick:t,variant:`ghost`,size:`icon`,className:`lg:hidden`,"aria-label":c(`app.openSettings`),"aria-controls":`app-sidebar`,children:(0,q.jsx)(Ve,{size:20})}),(0,q.jsx)(`button`,{type:`button`,onClick:()=>o(`/${e}/`),className:`group flex max-w-[11rem] min-w-0 items-center rounded-md py-0.5 pr-2 text-left outline-none transition-opacity hover:opacity-90 focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-sidebar dark:focus-visible:ring-offset-sidebar-dark sm:max-w-none`,"aria-label":c(`app.title`),children:(0,q.jsx)(sn,{label:c(`a
2pp.title`)})}),(0,q.jsx)(`span`,{className:`hidden truncate text-sm text-slate-500 dark:text-slate-400 md:inline`,children:c(`app.subtitle`)})]}),(0,q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5 sm:gap-2`,children:[T.map(e=>e.href?(0,q.jsx)(x,{asChild:!0,variant:`ghost`,size:`sm`,className:`hidden sm:inline-flex`,"aria-label":e.ariaLabel,children:(0,q.jsxs)(`a`,{href:e.href,onMouseEnter:e.onPreload,onFocus:e.onPreload,target:e.external?`_blank`:void 0,rel:e.external?`noopener noreferrer`:void 0,children:[e.icon,(0,q.jsx)(`span`,{children:e.label})]})},e.key):(0,q.jsxs)(x,{onClick:e.onClick,onMouseEnter:e.onPreload,onFocus:e.onPreload,variant:e.active?`secondary`:`ghost`,size:`sm`,className:`hidden sm:inline-flex`,"aria-label":e.ariaLabel,children:[e.icon,(0,q.jsx)(`span`,{children:e.label})]},e.key)),S&&(0,q.jsxs)(`div`,{className:`hidden h-9 shrink-0 items-center overflow-hidden rounded-md border border-slate-200 bg-white shadow-sm shadow-slate-950/5 dark:border-slate-700 dark:bg-slate-900 md:flex`,children:[(0,q.jsx)(`a`,{href:Wt(`header`),target:`_blank`,rel:`noopener noreferrer`,className:`flex h-full items-center outline-none transition-opacity hover:opacity-90 focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-sidebar dark:focus-visible:ring-offset-sidebar-dark`,"aria-label":c(`app.openChromeExtension`),children:(0,q.jsx)(`img`,{src:cn,width:`128`,height:`36`,alt:c(`app.chromeExtensionBadgeAlt`),className:`h-9 w-auto shrink-0`})}),(0,q.jsx)(`button`,{type:`button`,onClick:C,className:`flex h-full w-8 shrink-0 items-center justify-center border-l border-slate-200 text-slate-400 outline-none transition-colors hover:bg-slate-100 hover:text-slate-700 focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-inset dark:border-slate-700 dark:hover:bg-slate-800 dark:hover:text-slate-200`,"aria-label":c(`app.dismissChromeExtension`),children:(0,q.jsx)(vt,{size:13,"aria-hidden":`true`})})]}),(0,q.jsx)(`div`,{className:`flex shrink-0 items-center overflow-hidden rounded-md border border-slate-200 dark:border-slate-700`,role:`group`,"aria-label":c(`view3d.modeLabel`),children:[`2d`,`3d`].map(e=>(0,q.jsx)(`button`,{type:`button`,onClick:()=>v(e),"aria-pressed":_===e,className:w(`px-2.5 py-1 text-xs font-semibold transition-colors`,_===e?`bg-primary text-primary-foreground`:`text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-slate-800`),children:e===`2d`?`2D`:`3D`},e))}),(0,q.jsxs)(xt,{value:e,onValueChange:e=>s(e),children:[(0,q.jsxs)(St,{size:`sm`,className:`h-9 min-w-[4.75rem] gap-2 border-none bg-transparent px-2 shadow-none hover:bg-slate-100 dark:hover:bg-slate-800`,"aria-label":c(`app.language`),children:[(0,q.jsx)(We,{size:16}),(0,q.jsx)(Mt,{children:h(e,`short`)})]}),(0,q.jsx)(jt,{children:b.map(e=>(0,q.jsx)(Nt,{value:e,children:h(e,`short`)},e))})]}),(0,q.jsx)(x,{onClick:g,variant:`ghost`,size:`icon-sm`,"aria-label":`Toggle dark mode`,children:m?(0,q.jsx)(at,{size:18}):(0,q.jsx)(Ze,{size:18})}),(0,q.jsx)(x,{type:`button`,onClick:()=>u(e=>!e),variant:`ghost`,size:`icon-sm`,className:`sm:hidden`,"aria-label":c(`app.openSettings`),"aria-expanded":l,children:(0,q.jsx)(Je,{size:18})})]}),l&&(0,q.jsx)(`div`,{className:`absolute inset-x-0 top-full z-50 border-b border-slate-200 bg-sidebar/96 px-3 py-3 shadow-lg shadow-slate-950/10 backdrop-blur-md dark:border-slate-700 dark:bg-sidebar-dark/96 sm:hidden`,onMouseDown:e=>e.stopPropagation(),children:(0,q.jsx)(`div`,{className:`grid gap-2`,children:T.map(e=>e.href?(0,q.jsx)(x,{asChild:!0,variant:`outline`,size:`sm`,className:`justify-start`,children:(0,q.jsxs)(`a`,{href:e.href,onClick:()=>u(!1),onMouseEnter:e.onPreload,onFocus:e.onPreload,target:e.external?`_blank`:void 0,rel:e.external?`noopener noreferrer`:void 0,children:[e.icon,e.label]})},e.key):(0,q.jsxs)(x,{onClick:()=>{u(!1),e.onClick?.()},onMouseEnter:e.onPreload,onFocus:e.onPreload,variant:e.active?`secondary`:`outline`,size:`sm`,className:`justify-start`,children:[e.icon,e.label]},e.key))})})]})});function J({className:e,value:t,defaultValue:n,...r}){let i=Math.max(1,Array.isArray(t)?t.length:Array.isArray(n)?n.length:1);return(0,q.jsxs)(zt,{"data-slot":`slider`,className:w(`relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50`,e),value:t,defaultValue:n,...r,children:[(0,q.jsx)(It,{"data-slot":`slider-track`,className:`relative h-1.5 w-full grow overflow-hidden rounded-full bg-secondary`,children:(0,q.jsx)(Rt,{"data-slot":`slider-range`,className:`absolute h-full bg-primary`})}),Array.from({length:i}).map((e,t)=>(0,q.jsx)(Lt,{"data-slot":`slider-thumb`,className:`block size-4 rounded-full border border-primary/50 bg-background shadow-sm transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50`},t))]})}var Y={action:`topic`,languages:[],wordCount:45,generationMode:`expand`,tone:`neutral`,phraseMode:`mixed`,creativity:40,preserveProperNouns:!0,balancedLanguages:!0};async function X(){let e=await fetch(`/api/ai/session`,{method:`GET`,headers:{"X-Shapewords-Client":`app`},cache:`no-store`,credentials:`same-origin`});return await e.json().catch(()=>({})),e.ok}async function pn(e,t,n=!0){let r=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,"X-Shapewords-Client":`app`},body:JSON.stringify(t),credentials:`same-origin`}),i=await r.json().catch(()=>({}));if(!r.ok){if(n&&r.status===403&&i.error?.code===`forbidden_ai_guard`&&await X())return pn(e,t,!1);let a=i.error?.message||`AI request failed: ${r.status}`,o=i.error?.requestId?` (${i.error.requestId})`:``;throw Error(`${a}${o}`)}return i}function mn(e){return Array.isArray(e)?e.map(e=>({text:typeof e?.text==`string`?d(e.text):``,value:Math.max(1,Math.min(10,Math.round(Number(e?.value)||1))),repeat:e?.repeat!==!1})).filter(e=>e.text.length>0):[]}async function hn(e,t,n){return mn((await pn(`/api/ai/generate-words`,a({topic:e,lang:t,settings:n}))).words)}function gn(e){let t=[...e].filter(e=>e.kind!==`emoji`&&e.text.trim().length>0).sort((e,t)=>
2t.value-e.value||e.text.localeCompare(t.text)),n=``;for(let e of t){let t=n?`${n}, ${e.text}`:e.text;if(t.length>900)break;n=t}return n}async function _n(e,t,n,r){let i=gn(e);return i?hn(i,t,{...Y,generationMode:`synonyms`,languages:[],wordCount:Math.max(1,Math.min(80,Math.round(n))),tone:`neutral`,phraseMode:r?.phraseMode??`mixed`,creativity:Math.max(0,Math.min(100,Math.round(r?.creativity??65))),preserveProperNouns:!1,balancedLanguages:!1}):[]}var Z={Russian:{script:`cyrillic`,preferredFont:`Montserrat`},English:{script:`latin`,preferredFont:`Montserrat`},Spanish:{script:`latin`,preferredFont:`Montserrat`},French:{script:`latin`,preferredFont:`Montserrat`},German:{script:`latin`,preferredFont:`Montserrat`},Italian:{script:`latin`,preferredFont:`Montserrat`},Portuguese:{script:`latin`,preferredFont:`Montserrat`},Chinese:{script:`han`,preferredFont:`Noto Sans SC`},Japanese:{script:`japanese`,preferredFont:`Noto Sans JP`},Arabic:{script:`arabic`,preferredFont:`Noto Sans Arabic`},Ukrainian:{script:`cyrillic`,preferredFont:`Montserrat`},Greek:{script:`greek`,preferredFont:`Noto Sans`},Hebrew:{script:`hebrew`,preferredFont:`Noto Sans Hebrew`},Hindi:{script:`devanagari`,preferredFont:`Noto Sans Devanagari`},Bengali:{script:`bengali`,preferredFont:`Noto Sans Bengali`},"Punjabi (Gurmukhi)":{script:`gurmukhi`,preferredFont:`Noto Sans Gurmukhi`},Tamil:{script:`tamil`,preferredFont:`Noto Sans Tamil`},Telugu:{script:`telugu`,preferredFont:`Noto Sans Telugu`},Thai:{script:`thai`,preferredFont:`Noto Sans Thai`},Korean:{script:`hangul`,preferredFont:`Noto Sans KR`},Gujarati:{script:`gujarati`,preferredFont:`Noto Sans Gujarati`},Kannada:{script:`kannada`,preferredFont:`Noto Sans Kannada`}
2,Malayalam:{script:`malayalam`,preferredFont:`Noto Sans Malayalam`},Sinhala:{script:`sinhala`,preferredFont:`Noto Sans Sinhala`},Lao:{script:`lao`,preferredFont:`Noto Sans Lao`},Khmer:{script:`khmer`,preferredFont:`Noto Sans Khmer`},Burmese:{script:`myanmar`,preferredFont:`Noto Sans Myanmar`},Georgian:{script:`georgian`,preferredFont:`Noto Sans Georgian`},Armenian:{script:`armenian`,preferredFont:`Noto Sans Armenian`},Amharic:{script:`ethiopic`,preferredFont:`Noto Sans Ethiopic`}},vn=[`Russian`,`English`,`Spanish`,`French`,`German`,`Italian`,`Portuguese`,`Chinese`,`Japanese`,`Arabic`],yn=[...vn,`Ukrainian`,`Greek`,`Hebrew`,`Hindi`,`Bengali`,`Punjabi (Gurmukhi)`,`Tamil`,`Telugu`,`Thai`,`Korean`],bn=[...yn,`Gujarati`,`Kannada`,`Malayalam`,`Sinhala`,`Lao`,`Khmer`,`Burmese`,`Georgian`,`Armenian`,`Amharic`];function xn(e,t){return{id:e,languages:t,fontCoverage:t.map(e=>({language:e,...Z[e]}))}}var Sn=[xn(`ten`,vn),xn(`twenty`,yn),xn(`thirty`,bn)],Cn={ru:`день рождения.юбилей бабушки.школьный выпускной.свадьба друзей.новый год.семейный ужин.рождение ребенка.первый класс.последний звонок.летний лагерь.день учителя.университет.стартап.запуск продукта.командная встреча.корпоратив.конференция.кофейня.путешествие к морю.поход в горы.город мечты.весна.футбол.книжный клуб.музыкальный фестиваль.кино вечер.здоровые привычки.любовь.дружба.благодарность`.split(`.`),en:`birthday.grandma anniversary.school graduation.friends wedding.new year.family dinner.new baby.first grade.last school bell.summer camp.teacher day.university.startup.product launch.team meeting.office party.conference.coffee shop.seaside trip.mountain hike.dream city.spring.football.book club.music festival.movie night.healthy habits.love.friendship.gratitude`.split(`.`),es:`cumpleaños.aniversario de la abuela.graduación escolar.boda de amigos.año nuevo.cena familiar.nacimiento de un bebé.primer grado.último día de clase.campamento de verano.día del maestro.universidad.startup.lanzamiento de producto.reunión de equipo.fiesta de empresa.conferencia.cafetería.viaje al mar.senderismo en montaña.ciudad soñada.primavera.fútbol.club de lectura.festival de música.noche de cine.hábitos saludables.amor.amistad.gratitud`.split(`.`),fr:`anniversaire.anniversaire de grand-mère.remise des diplômes.mariage d’amis.nouvel an.dîner de famille.naissance d’un bébé.première classe.dernier jour d’école.camp d’été.journée des enseignants.université.startup.lancement de produit.réunion d’équipe.fête d’entreprise.conférence.café.voyage à la mer.randonnée en montagne.ville de rêve.printemps.football.club de lecture.festival de musique.soirée cinéma.habitudes saines.amour.amitié.gratitude`.split(`.`),ar:`عيد ميلاد.ذكرى الجدة.تخرج مدرسي.زفاف الأصدقاء.رأس السنة.عشاء عائلي.مولود جديد.الصف الأول.آخر يوم دراسي.مخيم صيفي.يوم المعلم.جامعة.شركة ناشئة.إطلاق منتج.اجتماع الفريق.حفلة شركة.مؤتمر.مقهى.رحلة إلى البحر.رحلة جبلية.مدينة الأحلام.الربيع.كرة القدم.نادي قراءة.مهرجان موسيقي.ليلة سينما.عادات صحية.حب.صداقة.امتنان`.split(`.`),zh:`生日.奶奶周年纪念.学校毕业典礼.朋友婚礼.新年.家庭晚餐.新生儿.一年级.最后一课.夏令营.教师节.大学.创业公司.产品发布.团队会议.公司聚会.会议.咖啡馆.海边旅行.山地徒步.梦想城市.春天.足球.读书会.音乐节.电影之夜.健康习惯.爱情.友谊.感恩`.split(`.`)};function wn(e){return Cn[e]??Cn.en}var Tn=`shapewords.aiSettings.v1`,En=[`neutral`,`festive`,`professional`,`playful`,`poetic`,`minimal`],Dn=[`mixed`,`words`,`phrases`],On=[`expand`,`translateOnly`],kn=[`topic`],An=6e4;function jn(e){return e.map(e=>{let t=Math.max(1,Math.min(10,Math.round(e.value)));return Array.from({length:t},()=>e.text).join(` `)}).join(`
3`)}function Mn(e){let t=l(e);return t===`ru`?`Russian`:t===`ar`?`Arabic`:t===`es`?`Spanish`:t===`fr`?`French`:t===`zh`?`Chinese`:`English`}function Nn(e){let t=Mn(e);return t===`English`?[t]:[t,`English`]}function Pn(e){let t=new Set;return e.split(/[\n,;]+/).map(e=>
3e.trim().replace(/\s+/g,` `)).filter(Boolean).filter(e=>{let n=e.toLowerCase();return t.has(n)?!1:(t.add(n),!0)}).slice(0,30)}function Fn(e){return e.join(`, `)}function In(e,t,n,r){let i=Number(e);return Math.max(t,Math.min(n,Math.round(Number.isFinite(i)?i:r)))}function Ln(e){let t=e&&typeof e==`object`?e:{},n=Array.isArray(t.languages)?t.languages.filter(e=>typeof e==`string`).slice(0,30):Y.languages;return{...Y,...t,languages:n,action:kn.includes(t.action)?t.action:Y.action,wordCount:In(t.wordCount,1,80,Y.wordCount),generationMode:On.includes(t.generationMode)?t.generationMode:Y.generationMode,creativity:In(t.creativity,0,100,Y.creativity),tone:En.includes(t.tone)?t.tone:Y.tone,phraseMode:Dn.includes(t.phraseMode)?t.phraseMode:Y.phraseMode,preserveProperNouns:t.preserveProperNouns!==!1,balancedLanguages:t.balancedLanguages!==!1}}function Rn(){if(typeof window>`u`)return Y;let e=window.localStorage.getItem(Tn);if(!e)return Y;try{return Ln(JSON.parse(e))}catch{return Y}}function zn(){let{t:e,i18n:t}=F(),n=(0,K.useRef)(null),r=l(t.language),i=Mn(t.language),a=Nn(t.language),o=a.length>1?`${h(r,`short`)} + EN`:null,{isAiProcessing:s,aiError:c,setIsAiProcessing:d,setAiError:f,setImportedWords:p}=k(be(e=>({isAiProcessing:e.isAiProcessing,aiError:e.aiError,setIsAiProcessing:e.setIsAiProcessing,setAiError:e.setAiError,setImportedWords:e.setImportedWords}))),[m,g]=(0,K.useState)(``),[_,v]=(0,K.useState)(0),[y,b]=(0,K.useState)(!1),[S,C]=(0,K.useState)(()=>Rn()),[w,T]=(0,K.useState)(()=>Fn(S.languages)),E=(0,K.useMemo)(()=>({...S,languages:S.languages.length?S.languages:[i]}),[S,i]),D=Pn(w).length,O=E.generationMode===`translateOnly`?e(`ai.settings.translationCount`,{count:E.languages.length}):E.wordCount,A=(0,K.useMemo)(()=>wn(r),[r]),j=A.length?A[_%A.length]:null;(0,K.useEffect)(()=>{window.localStorage.setItem(Tn,JSON.stringify(S))},[S]),(0,K.useEffect)(()=>{v(0)},[r]),(0,K.useEffect)(()=>{if(A.length<=1)return;let e=window.setInterval(()=>{v(e=>e+1)},An);return()=>window.clearInterval(e)},[A.length]),(0,K.useEffect)(()=>{let e=n.current;e&&(e.style.height=`0px`,e.style.height=`${Math.min(e.scrollHeight,104)}px`)},[m]);let M=()=>{T(Fn(S.languages.length?S.languages:[i])),b(!0)},N=()=>{let e=Pn(w);C(t=>({...t,languages:e.length?e:[]}))},ee=()=>{N(),b(!1)},te=()=>{C({...Y,languages:[]}),T(i)},P=e=>{C(t=>({...t,wordCount:In(e,1,80,t.wordCount)}))},I=async()=>{if(!(!m.trim()||s)){d(!0),f(null);try{let e=await hn(m,t.language,E);p(e,jn(e))}catch(e){f(e instanceof Error?e.message:String(e))}finally{d(!1)}}},ne=e=>{g(e),f(null),window.setTimeout(()=>n.current?.focus(),0)},L=e=>{e.preventDefault(),I()},re=e(`ai.settings.generationModes.${E.generationMode}`),R=E.generationMode===`translateOnly`?e(`ai.actionPlaceholders.translateOnly`):e(`ai.actionPlaceholders.topic`);return(0,q.jsxs)(`div`,{className:`min-w-0 space-y-3`,children:[(0,q.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-2`,children:[(0,q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5`,children:[(0,q.jsxs)(`h3`,{className:`flex min-w-0 items-center gap-1.5 text-sm font-semibold text-slate-700 dark:text-slate-300`,children:[(0,q.jsx)(_e,{size:14,className:`text-emerald-500`}),(0,q.jsx)(`span`,{className:`min-w-0 truncate`,children:e(`ai.title`)})]}),(0,q.jsx)(U,{content:e(`tooltips.ai.title`)})]}),(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`icon-sm`,"aria-label":e(`ai.settings.open`),onClick:M,children:(0,q.jsx)(V,{size:14})})]}),(0,q.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5 text-[0.7rem] text-slate-500 dark:text-slate-400`,children:[(0,q.jsx)(ct,{size:12}),(0,q.jsx)(`span`,{className:`min-w-0 truncate`,children:e(`ai.settings.summary`,{languages:E.languages.length>1?e(`ai.settings.languagesCount`,{count:E.languages.length}):E.languages[0],count:O,mode:e(`ai.settings.generationModes.${E.generationMode}`),tone:e(`ai.settings.tones.${E.tone}`)})})]}),(0,q.jsxs)(`form`,{className:`overflow-hidden rounded-xl border border-slate-200 bg-white shadow-xs transition-[border-color,box-shadow] focus-within:border-emerald-300 focus-within:ring-3 focus-within:ring-emerald-400/15 dark:border-slate-800 dark:bg-slate-950/70 dark:focus-within:border-emerald-400/45`,onSubmit:L,children:[(0,q.jsx)(ve,{ref:n,value:m,onChange:e=>g(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),I())},placeholder:R,disabled:s,rows:1,className:`max-h-[104px] min-h-12 resize-none border-0 bg-transparent px-3 py-2 text-xs leading-5 shadow-none focus-visible:border-transparent focus-visible:ring-0 dark:bg-transparent`}),(0,q.jsxs)(`div`,{className:`flex min-h-10 flex-col gap-1.5 border-t border-slate-100 px-2 py-1.5 dark:border-slate-800/80`,children:[(0,q.jsxs)(x,{t
3ype:`submit`,size:`sm`,"aria-label":re,title:re,disabled:!m.trim()||s,className:`h-8 w-full min-w-0 justify-center rounded-lg px-3`,children:[s?(0,q.jsx)(bt,{size:14,className:`animate-spin`}):(0,q.jsx)(ge,{size:14}),(0,q.jsx)(`span`,{className:`min-w-0 truncate`,children:re})]}),j&&(0,q.jsx)(`button`,{type:`button`,className:`shapewords-ai-hints mx-auto block max-w-full truncate text-xs leading-5 text-slate-600 underline decoration-dotted decoration-emerald-400/55 decoration-1 underline-offset-4 transition hover:text-emerald-700 hover:decoration-emerald-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-400/35 dark:text-slate-300 dark:decoration-emerald-300/45 dark:hover:text-emerald-100 dark:hover:decoration-emerald-300`,title:j,onClick:()=>ne(j),children:j},`${r}-${_}`)]})]}),s&&(0,q.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-emerald-500`,children:[(0,q.jsx)(bt,{size:12,className:`animate-spin`}),e(`ai.processing`)]}),c&&(0,q.jsxs)(`div`,{className:`flex items-start gap-1.5 p-2 rounded-lg bg-red-50 dark:bg-red-900/20 text-xs text-red-600 dark:text-red-400`,children:[(0,q.jsx)(lt,{size:12,className:`shrink-0 mt-0.5`}),c]}),(0,q.jsx)(pe,{open:y,onOpenChange:b,children:(0,q.jsxs)(Re,{className:`top-[max(0.75rem,env(safe-area-inset-top))] bottom-[max(0.75rem,env(safe-area-inset-bottom))] flex max-h-none max-w-xl translate-y-0 flex-col gap-0 overflow-hidden p-0 sm:bottom-auto sm:top-1/2 sm:max-h-[88vh] sm:-translate-y-1/2`,children:[(0,q.jsxs)(B,{className:`border-b border-slate-200 px-5 py-4 text-left dark:border-slate-800`,children:[(0,q.jsxs)(me,{className:`flex items-center gap-2 text-base`,children:[(0,q.jsx)(nt,{size:16,className:`text-emerald-500`}),e(`ai.settings.title`)]}),(0,q.jsx)(H,{className:`text-xs`,children:e(`ai.settings.description`)})]}),(0,q.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-5 overflow-y-auto px-5 py-4 sm:max-h-[68vh] sm:flex-none`,children:[(0,q.jsxs)(`section`,{className:`space-y-2`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-700 dark:text-slate-300`,children:e(`ai.settings.generationMode`)}),(0,q.jsx)(`div`,{className:`grid min-w-0 grid-cols-2 gap-2`,children:On.map(t=>(0,q.jsx)(x,{type:`button`,variant:S.generationMode===t?`default`:`outline`,size:`sm`,className:`min-w-0 justify-center px-2`,onClick:()=>C(e=>({...e,generationMode:t})),children:(0,q.jsx)(`span`,{className:`min-w-0 truncate`,children:e(`ai.settings.generationModes.${t}`)})},t))}),(0,q.jsx)(`p`,{className:`text-[0.68rem] leading-relaxed text-slate-500 dark:text-slate-400`,children:e(`ai.settings.generationModeHints.${S.generationMode}`)})]}),(0,q.jsxs)(`section`,{className:`space-y-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,q.jsx)(`label`,{className:`text-xs font-medium text-slate-700 dark:text-slate-300`,htmlFor:`ai-output-languages`,children:e(`ai.settings.languages`)}),(0,q.jsx)(`span`,{className:`text-[0.68rem] text-slate-500 dark:text-slate-400`,children:e(`ai.settings.languageLimit`)})]}),(0,q.jsx)(ve,{id:`ai-output-languages`,value:w,onChange:e=>T(e.target.value),className:`min-h-20 resize-none text-xs`,placeholder:e(`ai.settings.languagesPlaceholder`)}),(0,q.jsxs)(`div`,{className:`flex flex-wrap gap-1.5`,children:[(0,q.jsx)(x,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>T(i),children:e(`ai.settings.currentLanguage`)}),o&&(0,q.jsx)(x,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>T(a.join(`, `)),children:o}),Sn.map(t=>(0,q.jsx)(x,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>T(t.languages.join(`, `)),children:e(`ai.settings.languagePresets.${t.id}`)},t.id))]})]}),(0,q.jsxs)(`section`,{className:`space-y-3 border-t border-slate-200 pt-4 dark:border-slate-800`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,q.jsx)(`label`,{className:`text-xs font-medium text-slate-700 dark:text-slate-300`,htmlFor:`ai-word-count`,children:e(`ai.settings.wordCount`)}),(0,q.jsx)(Tt,{id:`ai-word-count`,type:`number`,min:1,max:80,step:1,value:S.wordCount,onChange:e=>P(Number(e.target.value)),className:`h-8 w-20 text-right text-xs tabular-nums`})]}),(0,q.jsx)(J,{value:[S.wordCount],min:1,max:80,step:1,onValueChange:([e])=>P(e)}),(0,q.jsx)(`p`,{className:`text-[0.68rem] leading-relaxed text-slate-500 dark:text-slate-400`,children:e(`ai.settings.wordCountHint`)})]}),(0,q.jsxs)(`section`,{className:`grid gap-3 border-t border-slate-200 pt-4 dark:border-slate-800 sm:grid-cols-2`,children:[(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-700 dark:text-slate-300`,children:e(`ai.settings.tone`)}),(0,q.jsxs)(xt,{value:S.tone,onValueChange:e=>C(t=>
3({...t,tone:e})),children:[(0,q.jsx)(St,{className:`h-8 text-xs`,size:`sm`,children:(0,q.jsx)(Mt,{})}),(0,q.jsx)(jt,{children:En.map(t=>(0,q.jsx)(Nt,{value:t,children:e(`ai.settings.tones.${t}`)},t))})]})]}),(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-700 dark:text-slate-300`,children:e(`ai.settings.phraseMode`)}),(0,q.jsxs)(xt,{value:S.phraseMode,onValueChange:e=>C(t=>({...t,phraseMode:e})),children:[(0,q.jsx)(St,{className:`h-8 text-xs`,size:`sm`,children:(0,q.jsx)(Mt,{})}),(0,q.jsx)(jt,{children:Dn.map(t=>(0,q.jsx)(Nt,{value:t,children:e(`ai.settings.phraseModes.${t}`)},t))})]})]})]}),(0,q.jsxs)(`section`,{className:`space-y-3 border-t border-slate-200 pt-4 dark:border-slate-800`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-700 dark:text-slate-300`,children:e(`ai.settings.creativity`)}),(0,q.jsx)(`span`,{className:`tabular-nums text-xs text-slate-500 dark:text-slate-400`,children:S.creativity})]}),(0,q.jsx)(J,{value:[S.creativity],min:0,max:100,step:10,onValueChange:([e])=>C(t=>({...t,creativity:e}))})]}),(0,q.jsxs)(`section`,{className:`space-y-3 border-t border-slate-200 pt-4 dark:border-slate-800`,children:[(0,q.jsxs)(`label`,{className:`flex items-center justify-between gap-3`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-700 dark:text-slate-300`,children:e(`ai.settings.preserveProperNouns`)}),(0,q.jsx)(u,{checked:S.preserveProperNouns,onCheckedChange:e=>C(t=>({...t,preserveProperNouns:e}))})]}),(0,q.jsxs)(`label`,{className:`flex items-center justify-between gap-3`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-700 dark:text-slate-300`,children:e(`ai.settings.balancedLanguages`)}),(0,q.jsx)(u,{checked:S.balancedLanguages,disabled:D<2,onCheckedChange:e=>C(t=>({...t,balancedLanguages:e}))})]})]})]}),(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-slate-200 px-5 py-4 dark:border-slate-800`,children:[(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`sm`,onClick:te,children:e(`ai.settings.reset`)}),(0,q.jsx)(x,{type:`button`,size:`sm`,onClick:ee,children:e(`ai.settings.done`)})]})]})})]})}var Bn=(0,K.lazy)(()=>G(()=>j(()=>import(`./WordManagerDialog-BtniFgR7.js`),__vite__mapDeps([0,1,2]))).then(e=>({default:e.WordManagerDialog})));function Vn(e,t){return t===`emoji`||O(e)}function Hn(e,t){return t===`unsupported`?e(`text.voiceUnsupported`):t===`permission_denied`?e(`text.voicePermissionDenied`):t===`no_speech`?e(`text.voiceNoSpeech`):t===`no_microphone`?e(`text.voiceNoMicrophone`):t===`start_failed`?e(`text.voiceError`):``}function Un(){let{t:e,i18n:t}=F(),{rawText:n,words:i,addWords:a,setWords:o,setImportedWords:s,removeWordsByKeys:c,setWordRepeat:l,updateWordsBulk:u,updateWordText:d,languageProcessing:p,customStopWords:m,smartImportOptions:h,isPreciseTextProcessing:g,isWordListProcessing:_,setIsWordListProcessing:v}=k(be(e=>({rawText:e.rawText,words:e.words,addWords:e.addWords,setWords:e.setWords,setImportedWords:e.setImportedWords,removeWordsByKeys:e.removeWordsByKeys,setWordRepeat:e.setWordRepeat,updateWordsBulk:e.updateWordsBulk,updateWordText:e.updateWordText,languageProcessing:e.languageProcessing,customStopWords:e.customStopWords,smartImportOptions:e.smartImportOptions,isPreciseTextProcessing:e.isPreciseTextProcessing,isWordListProcessing:e.isWordListProcessing,setIsWordListProcessing:e.setIsWordListProcessing}))),[y,b]=(0,K.useState)(``),[S,C]=(0,K.useState)(!1),T=(0,K.useRef)(null),E=(0,K.useRef)(0),D=i.length>0&&i.every(e=>e.repeat!==!1);(0,K.useEffect)(()=>()=>{E.current+=1,v(!1)},[v]);let O=(0,K.useCallback)(async()=>{if(i.length===0||g||_)return;let e=i,t=n,a=++E.current,c=p.enabled?p:{...p,enabled:!0},l=e.map(e=>e.text).join(`
4`),u=te(l,c);L(l,c);let d=performance.now(),f=`failed`,y=0;v(!0);try{let n=await ze([[`word`,`weight`],...e.map(e=>[e.text,String(e.value)])],{keepCase:!1,countFrequency:!0,removeStopWords:!0,stopWordsLanguage:`auto`,customStopWords:m,detectDuplicates:!0,includePhrases:!1,includeEmoji:!0,lemmatizeWords:h.lemmatizeWords,languageProcessing:c});if(E.current===a&&k.getState().words===e&&k.getState().rawText===t){o(n.words);let e=k.getState().words;s(e,t),y=e.length,f=`applied`}else y=n.words.length,f=`discarded`}catch{}finally{r(`nlp.processed`,{source:`word_list`,processor:u.language??`fast`,exactRequested:u.language!==null,prewarmState:u.state,durationMs:Math.round(performance.now()-d),inputWords:e.length,outputWords:y,outcome:f}),E.current===a&&v(!1)}},[m,g,_,p,v,s,h.lemmatizeWords,o,n,i]),A=(0,K.useCallback)(()=>
4{if(i.length===0)return;let e=p.enabled?p:{...p,enabled:!0};L(i.map(e=>e.text).join(`
5`),e)},[p,i]),j=(0,K.useCallback)(e=>{a(e),b(``)},[a]),M=xe({locale:t.resolvedLanguage||t.language,onFinalTranscript:j}),N=(0,K.useMemo)(()=>Hn(e,M.errorCode),[M.errorCode,e]),ee=()=>{y.trim()&&a(y),b(``),M.clearFeedback()},P=e=>{b(e),M.clearFeedback()},I=e=>c([f(e)]),ne=()=>c(i.map(f)),re=e=>{i.length!==0&&u(i.map(f),{repeat:e})},R=()=>{let e=e=>/[",\n\r]/.test(e)?`"${e.replace(/"/g,`""`)}"`:e,t=[`word,weight`,...i.map(t=>`${e(t.text)},${t.value??``}`)].join(`\r
6`);ue(new Blob([``,t],{type:`text/csv;charset=utf-8;`}),`shapewords-words.csv`)},ie=(e,t)=>{let n=t.normalize(`NFC`).trim(),r=f(e),a=f({text:n,kind:e.kind}),o=a!==r&&i.some(e=>f(e)===a);return n&&!o&&n!==e.text?(d(e.text,e.kind,n),!0):!1},ae=(e,t)=>{let n=f(e),r=Number(t),i=Number.isFinite(r)?Math.max(1,Math.round(r)):e.value;return i===e.value?!1:(u([n],{value:i}),!0)};return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`div`,{className:`space-y-3`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,q.jsx)(`h3`,{className:`text-sm font-semibold text-slate-700 dark:text-slate-300`,children:e(`words.title`)}),(0,q.jsx)(U,{content:e(`tooltips.words.sidebar`)})]}),(0,q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,q.jsx)(`span`,{className:`text-xs text-slate-400 dark:text-slate-500`,children:e(`words.total`,{count:i.length})}),i.length>0&&(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`icon-sm`,onClick:R,"aria-label":e(`words.exportCsv`),title:e(`words.exportCsv`),children:(0,q.jsx)(z,{})}),(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`icon-sm`,className:`text-red-500 hover:text-red-600 dark:text-red-500 dark:hover:text-red-400`,onClick:ne,"aria-label":e(`words.clearList`),title:e(`words.clearList`),children:(0,q.jsx)(gt,{})})]})]})]}),(0,q.jsxs)(x,{type:`button`,variant:`outline`,size:`sm`,className:`h-8 w-full border-slate-200 bg-slate-50/70 text-slate-600 hover:bg-emerald-50 hover:text-emerald-700 dark:border-slate-800 dark:bg-slate-950/35 dar
6k:text-slate-300 dark:hover:bg-emerald-950/35 dark:hover:text-emerald-300`,onClick:()=>void O(),onPointerEnter:A,onFocus:A,disabled:i.length===0||g||_,"aria-busy":_,children:[_?(0,q.jsx)(bt,{size:14,className:`animate-spin`}):(0,q.jsx)(_e,{size:14}),e(`text.languageProcessing`)]}),(0,q.jsxs)(`div`,{className:`flex min-w-0 gap-2`,children:[(0,q.jsx)(Tt,{ref:T,value:y,onChange:e=>P(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),ee())},onBlur:ee,placeholder:i.length===0?e(`words.addPlaceholderEmpty`):e(`words.addPlaceholder`),className:`h-9 min-w-0 flex-1`,"aria-label":e(`words.addWord`)}),(0,q.jsx)(x,{type:`button`,variant:M.isListening?`secondary`:`outline`,size:`icon-sm`,className:`h-9 w-9 shrink-0`,onClick:M.toggle,disabled:!M.isSupported||M.phase===`stopping`,"aria-pressed":M.isListening,"aria-label":M.isListening?e(`text.voiceStop`):e(`text.voiceStart`),title:M.isSupported?M.isListening?e(`text.voiceStop`):e(`text.voiceStart`):e(`text.voiceUnsupported`),children:M.phase===`stopping`?(0,q.jsx)(bt,{size:14,className:`animate-spin`}):M.isListening?(0,q.jsx)(Ae,{size:14}):(0,q.jsx)(ye,{size:14})})]}),(M.isListening||M.interimText||N)&&(0,q.jsxs)(`div`,{"aria-live":`polite`,className:N?`rounded-md border border-red-200 bg-red-50 px-2.5 py-2 text-xs text-red-700 dark:border-red-900/50 dark:bg-red-950/30 dark:text-red-300`:`rounded-md border border-emerald-200 bg-emerald-50 px-2.5 py-2 text-xs text-emerald-700 dark:border-emerald-900/50 dark:bg-emerald-950/30 dark:text-emerald-300`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[N?(0,q.jsx)(vt,{size:12}):M.isListening?(0,q.jsx)(ye,{size:12}):(0,q.jsx)(he,{size:12}),(0,q.jsx)(`span`,{className:`font-medium`,children:N||(M.isListening?e(`text.voiceListening`):e(`text.voiceInput`))})]}),!N&&M.interimText&&(0,q.jsx)(`div`,{className:`mt-1 text-[11px] opacity-90`,children:M.interimText})]}),(0,q.jsx)(`div`,{className:`overflow-hidden rounded-lg border border-slate-200 bg-white dark:border-slate-700 dark:bg-slate-950`,children:i.length===0?(0,q.jsx)(`div`,{className:`grid min-h-32 place-items-center bg-[repeating-linear-gradient(135deg,rgba(148,163,184,0.10)_0,rgba(148,163,184,0.10)_1px,transparent_1px,transparent_12px)] px-4 py-6 dark:bg-[repeating-linear-gradient(135deg,rgba(148,163,184,0.13)_0,rgba(148,163,184,0.13)_1px,transparent_1px,transparent_12px)]`,children:(0,q.jsxs)(`div`,{className:`max-w-56 text-center`,children:[(0,q.jsx)(`div`,{className:`mx-auto mb-2 flex size-8 items-center justify-center rounded-md border border-slate-200/80 bg-white/75 text-slate-400 shadow-sm dark:border-slate-700/80 dark:bg-slate-950/75 dark:text-slate-500`,children:(0,q.jsx)(he,{size:14})}),(0,q.jsx)(`p`,{className:`text-xs font-medium text-slate-500 dark:text-slate-400`,children:e(`words.emptyListTitle`)}),(0,q.jsx)(`p`,{className:`mt-1 text-[11px] leading-4 text-slate-400 dark:text-slate-500`,children:e(`words.emptyListDescription`)})]})}):(0,q.jsx)(`div`,{className:`max-h-64 overflow-y-auto`,children:(0,q.jsxs)(Pe,{children:[(0,q.jsx)(Se,{className:`sticky top-0 z-10 bg-white dark:bg-slate-950`,children:(0,q.jsxs)(Le,{className:`hover:bg-white dark:hover:bg-slate-950`,children:[(0,q.jsx)(Oe,{className:`h-8 px-2`,children:e(`words.word`)}),(0,q.jsxs)(Oe,{className:`h-8 w-8 px-0 text-center`,children:[(0,q.jsx)(Ye,{size:13,className:`mx-auto text-slate-400`,"aria-hidden":`true`}),(0,q.jsx)(`span`,{className:`sr-only`,children:e(`words.repeatShort`)})]}),(0,q.jsx)(Oe,{className:`h-8 w-8 px-0`})]})}),(0,q.jsx)(Me,{children:i.map(t=>{let n=f(t),r=Vn(t.text,t.kind),i=r?se(t.text):null,a=t.repeat!==!1;return(0,q.jsxs)(Le,{children:[(0,q.jsx)(ke,{className:`px-1.5 py-1`,children:(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[i?(0,q.jsx)(`img`,{src:i,alt:``,className:`size-4 shrink-0`}):null,r?(0,q.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm text-slate-700 dark:text-slate-200`,children:t.text}):(0,q.jsx)(Tt,{defaultValue:t.text,"aria-label":e(`words.editWord`),onKeyDown:e=>{e.key===`Enter`&&e.currentTarget.blur()},onBlur:e=>{ie(t,e.target.value)||(e.target.value=t.text)},className:`h-7 flex-1 border-transparent bg-transparent px-1.5 text-sm shadow-none hover:border-slate-200 focus-visible:border-ring dark:bg-transparent dark:hover:border-slate-700`},`${n}-edit`),(0,q.jsxs)(`label`,{className:`flex shrink-0 items-center gap-0.5 text-[10px] text-slate-400 dark:text-slate-500`,children:[(0,q.jsx)(`span`,{"aria-hidden":`true`,children:`×`}),(0,q.jsx)(Tt,{type:`number`,min:1,step:1,defaultValue:String(t.value),"aria-label":e(`words.count`),title:e(`words.count`),onKeyDown:e=>{e.key===`Enter`&&e.currentTarget.blur()},onBlur:e=>{ae(t,e.target.value)||(e.target.value=String(t.value))},className:`h-7 w-11 px-1 text-right text-xs tabular-nums`},`${n}-frequency-${t.value}`)]})]})}),(0,q.jsx)(ke,{className:`px-0 py-1 text-center`,children:(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`icon-sm`,className:`mx-auto 
6size-7`,"aria-pressed":a,"aria-label":e(a?`words.disableRepeatWord`:`words.enableRepeatWord`,{word:t.text}),title:e(`words.repeatTitle`),onClick:()=>l(t.text,t.kind,!a),children:(0,q.jsx)(Ye,{size:14,className:w(a?`text-emerald-500 dark:text-emerald-300`:`text-slate-300 dark:text-slate-600`)})})}),(0,q.jsx)(ke,{className:`px-0 py-1 pr-1 text-center`,children:(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`icon-sm`,className:`mx-auto size-7 text-slate-400 hover:text-red-500 dark:text-slate-500 dark:hover:text-red-400`,"aria-label":e(`canvas.deleteWord`),onClick:()=>I(t),children:(0,q.jsx)(gt,{size:14})})})]},n)})})]})})}),(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,q.jsxs)(x,{type:`button`,variant:`outline`,size:`sm`,className:`min-w-[9rem] flex-1`,onClick:()=>C(!0),children:[(0,q.jsx)(V,{size:14}),e(`words.openManager`)]}),i.length>0&&(0,q.jsxs)(`div`,{className:`flex shrink-0 items-center rounded-lg border border-slate-200 bg-white p-0.5 dark:border-slate-700 dark:bg-slate-950`,"aria-label":e(`words.repeatAll`),children:[(0,q.jsx)(`span`,{className:`px-2 text-[11px] font-medium text-slate-500 dark:text-slate-400`,children:e(`words.repeatAll`)}),(0,q.jsx)(x,{type:`button`,variant:D?`secondary`:`ghost`,size:`sm`,className:`h-7 px-2 text-xs`,"aria-pressed":D,onClick:()=>re(!0),children:e(`common.on`)}),(0,q.jsx)(x,{type:`button`,variant:D?`ghost`:`secondary`,size:`sm`,className:`h-7 px-2 text-xs`,"aria-pressed":!D,onClick:()=>re(!1),children:e(`common.off`)})]})]})]}),S&&(0,q.jsx)(K.Suspense,{fallback:null,children:(0,q.jsx)(Bn,{open:S,onOpenChange:C})})]})}var Wn=[`#123d2b`,`#0f766e`,`#b99542`,`#d8c174`,`#dc2626`,`#4d7c0f`,`#84cc16`,`#f59e0b`,`#ec4899`,`#111827`,`#64748b`,`#f8fafc`],Gn=[0,1,2];function Kn({colors:e,label:t,selected:n,onSelect:r}){return(0,q.jsxs)(x,{onClick:r,type:`button`,variant:`outline`,className:w(`h-auto min-w-0 flex-col gap-1 p-1.5`,n?`border-emerald-400 bg-emerald-50 ring-1 ring-emerald-400 dark:bg-emerald-900/20`:`border-slate-200 hover:border-slate-300 dark:border-slate-600 dark:hover:border-slate-500`),children:[(0,q.jsx)(`div`,{className:`flex gap-0.5`,children:e.slice(0,5).map((e,t)=>(0,q.jsx)(`div`,{className:`h-3 w-3 rounded-full`,style:{backgroundColor:e}},`${e}-${t}`))}),(0,q.jsx)(`span`,{className:`w-full truncate text-center text-[10px] text-slate-500 dark:text-slate-400`,children:t})]})}function qn(){let{t:e,i18n:t}=F(),[n,r]=(0,K.useState)(!1),{paletteIndex:i,customPaletteColors:a,setPaletteIndex:o,setCustomPaletteColors:s,colorMode:l,setColorMode:u}=k(be(e=>({paletteIndex:e.paletteIndex,customPaletteColors:e.customPaletteColors,setPaletteIndex:e.setPaletteIndex,setCustomPaletteColors:e.setCustomPaletteColors,colorMode:e.colorMode,setColorMode:e.setColorMode}))),d=c(a),f=i===-1,p=[{value:`sequential`,label:e(`style.sequential`)},{value:`random`,label:e(`style.random`)},{value:`byFrequency`,label:e(`style.byFrequency`)}],h=n=>n===-1?e(`style.customPalette`):t.language===`ru`?m[n].name:m[n].nameEn,g=e=>e===-1?d:m[e].colors,_=Gn.includes(i)?Gn:[i,...Gn.filter(e=>e!==i)].slice(0,3),v=[...m.map((e,t)=>t),-1],y=(e,t=!1)=>{o(e),t&&r(!1)},b=(e,t)=>{s(d.map((n,r)=>r===e?t:n))},S=()=>{let e=Wn.find(e=>!d.includes(e))??`#123d2b`;s([...d,e])},T=e=>{d.length<=2||s(d.filter((t,n)=>n!==e))};return(0,q.jsxs)(`div`,{className:`space-y-3`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,q.jsx)(`h3`,{className:`text-sm font-semibold text-slate-700 dark:text-slate-300`,children:e(`style.palette`)}),(0,q.jsx)(U,{content:e(`tooltips.style.palette`)})]}),(0,q.jsx)(`div`,{className:`grid grid-cols-3 gap-1.5`,children:_.map(e=>(0,q.jsx)(Kn,{colors:g(e),label:h(e),selected:e===i,onSelect:()=>y(e)},e))}),(0,q.jsxs)(x,{type:`button`,onClick:()=>r(!0),variant:`outline`,size:`sm`,className:`w-full`,children:[(0,q.jsx)(Je,{size:15}),e(`style.morePalettes`)]}),n&&(0,q.jsx)(pe,{open:n,onOpenChange:r,children:(0,q.jsxs)(Re,{showCloseButton:!1,className:`flex max-h-[84vh] max-w-3xl flex-col gap-0 overflow-hidden p-0`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between border-b border-border px-4 py-3`,children:[(0,q.jsxs)(B,{className:`gap-1 text-left`,children:[(0,q.jsx)(me,{className:`text-sm`,children:e(`style.paletteDialogTitle`)}),(0,q.jsx)(H,{className:`text-xs`,children:e(`style.paletteDialogCount`,{count:v.length})})]}),(0,q.jsx)(x,{type:`button`,onClick:()=>r(!1),variant:`ghost`,size:`icon-sm`,"aria-label":e(`style.closePalettes`),children:(0,q.jsx)(vt,{size:17})})]}),(0,q.jsx)(`div`,{className:`overflow-y-auto p-4`,children:(0,q.jsx)(`div`,{className:`grid grid-cols-3 gap-2 sm:grid-cols-4 md:grid-cols-5`,children:v.map(e=>(0,q.jsx)(Kn,{colors:g(e),label:h(e),selected:e===i,onSelect:()=>y(e,!0)},e))})})]})}),f&&(0,q.jsxs)(`div`,{className:`rounded-lg border border-emerald-100 bg-emerald-50/55 p-2 dark:border-emerald-950/70 dark:bg-emerald-950/20`,children:[(0,q.jsxs)(`div`,{className:`mb-2 flex items-start justify-between gap-2`,children:[(0,q.jsxs)(`div`,{className:`min-w-0`,children:[(0,q.jsx)(`div`,{className:`text-xs font-semibold text-slate-700 dark:text-slate-200`,children:e(`style.customPaletteTitle`)}),(0,q.jsx)(`div`,{className:`mt-0.5 text-[11px] leading-4 text-slate-500 dark:text-slate-400`,children:e(`style.customPaletteHint`)})]}),(0,q.jsx)(x,{type:`button`,size:`icon-sm`,variant:`ghost`,className:`shrink-0 text-slate-400 hover:text-slate-700 dark:hover:text-slate-100`,onClick:()=>s(C),"aria-label":e(`style.resetCustomPalette`),title:e(`style.resetCustomPalette`),children:(0,q.jsx)(R,{size:14})})]}),(0,q.jsx)(`div`,{className:`grid gap-1.5`,children:d.map((t,n)=>(0,q.jsxs)(`div`,{className:`grid grid-cols-[2rem_minmax(0,1fr)_1.75rem] items-center gap-1.5`,children:[(0,q.jsx)(`input`,{type:`color`,value:t,onChange:e=>b(n,e.target.value),className:`h-8 w-8 cursor-pointer rounded-md border border-white/80 bg-transparent p-0 shadow-sm dark:border-slate-700`,"aria-label":e(`style.customColorNumber`,{number:n+1})}),(0,q.jsx)(`div`,{className:`min-w-0 rounded-md border border-white/80 bg-white/75 px-2 py-1 font-mono text-[11px] uppercase text-slate-500 shadow-sm dark:border-slate-800 dark:bg-slate-950/45 dark:text-slate-400`,children:t}),(0,q.jsx)(x,{type:`button`,size:`icon-sm`,variant:`ghost`,className:`h-7 w-7 text-slate-400 hover:bg-white/80 hover:text-red-500 disabled:opacity-35 dark:hover:bg-slate-900`,onClick:()=>T(n),disabled:d.length<=2,"aria-label":e(`style.removeCustomColor`),title:e(`style.removeCustomColor`),
6children:(0,q.jsx)(vt,{size:13})})]},`${t}-${n}`))}),(0,q.jsxs)(x,{type:`button`,size:`sm`,variant:`ghost`,className:`mt-2 h-8 w-full border border-dashed border-emerald-200 bg-white/65 text-xs text-emerald-700 hover:bg-white dark:border-emerald-900 dark:bg-slate-950/25 dark:text-emerald-200 dark:hover:bg-slate-950/45`,onClick:S,disabled:d.length>=12,children:[(0,q.jsx)(qe,{size:14}),e(`style.addCustomColor`)]})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-500 dark:text-slate-400`,children:e(`style.colorMode`)}),(0,q.jsx)(U,{content:e(`tooltips.style.colorMode`)})]}),(0,q.jsx)(`div`,{className:`flex min-w-0 gap-1`,children:p.map(e=>(0,q.jsx)(x,{onClick:()=>u(e.value),type:`button`,variant:l===e.value?`subtle`:`ghost`,size:`sm`,className:w(`h-auto min-w-0 flex-1 px-1 py-1.5 text-[11px] leading-tight sm:px-2 sm:text-xs`,l!==e.value&&`text-slate-500 dark:text-slate-400`),children:e.label},e.value))})]})]})}var Jn=10,Yn=200,Xn=30,Zn=`Impact, Haettenschweiler, "Arial Narrow Bold", "Arial Narrow", sans-serif`;function Qn({children:e,className:t,style:n}){return(0,q.jsx)(`span`,{className:w(`absolute whitespace-nowrap font-black uppercase leading-none tracking-normal text-slate-800 dark:text-slate-100`,t),style:{fontFamily:Zn,...n},children:e})}function $n({words:e,rotation:t,className:n}){return(0,q.jsx)(`span`,{className:w(`absolute left-1/2 top-1/2 flex flex-col items-center justify-center whitespace-nowrap text-[15px] font-black uppercase leading-[0.9] tracking-normal text-slate-800 dark:text-slate-100`,n),style:{fontFamily:Zn,transform:`translate(-50%, -50%) rotate(${t}deg)`},children:e.filter(e=>e.trim().length>0).map((e,t)=>(0,q.jsx)(`span`,{children:e},`${t}-${e}`))})}function er({option:e}){let t=e.label,n=e.preview,r=t.split(/\s+/)[0]||t;return e.value===`vertical`?(0,q.jsx)(Qn,{className:`left-1/2 top-1/2 text-[13px]`,style:{transform:`translate(-50%, -50%) rotate(-90deg)`},children:t}):e.value===`orthogonal`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Qn,{className:`bottom-6 left-3 text-[12px]`,children:t.split(/\s+/)[0]||t}),(0,q.jsx)(Qn,{className:`right-[-18px] top-1/2 text-[12px]`,style:{transform:`translateY(-50%) rotate(-90deg)`},children:n[1]??t})]}):e.value===`crossing`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Qn,{className:`bottom-5 left-2.5 text-[12px]`,children:n[2]??t}),(0,q.jsx)(Qn,{className:`right-[-18px] top-1/2 text-[12px]`,style:{transform:`translateY(-50%) rotate(-90deg)`},children:n[1]??t}),(0,q.jsx)(Qn,{className:`left-2.5 top-5 text-[12px]`,style:{transform:`rotate(45deg)`},children:n[0]??t})]}):e.value===`crossingVoids`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Qn,{className:`left-3 top-8 text-[12px]`,style:{transform:`rotate(45deg)`},children:n[0]??t}),(0,q.jsx)(Qn,{className:`right-2 top-5 text-[12px]`,style:{transform:`rotate(-45deg)`},children:n[1]??t})]}):e.value===`dancing`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Qn,{className:`left-3 top-7 text-[12px]`,style:{transform:`rotate(-10deg)`},children:n[0]??t}),(0,q.jsx)(Qn,{className:`left-10 top-12 text-[12px]`,style:{transform:`rotate(18deg)`},children:n[1]??t})]}):e.value===`positiveSlope`||e.value===`negativeSlope`?(0,q.jsx)($n,{words:[n[0]??t,n[1]??``],rotation:e.value===`positiveSlope`?-Xn:Xn,className:`text-[16px]`}):e.value===`random`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Qn,{className:`left-2.5 top-4 text-[11px]`,style:{transform:`rotate(9deg)`},children:n[0]??t}),(0,q.jsx)(Qn,{className:`right-5 top-9 text-[11px]`,style:{transform:`rotate(-55deg)`},children:n[0]??t}),(0,q.jsx)(Qn,{className:`bottom-3 left-3 text-[14px]`,style:{transform:`rotate(11deg)`},children:n[0]??t})]}):e.value===`custom`?(0,q.jsx)(Qn,{className:`left-1/2 top-1/2 text-[17px] text-emerald-800 dark:text-emerald-300`,style:{transform:`translate(-50%, -50%)`},children:t}):(0,q.jsx)(Qn,{className:`left-1/2 top-1/2 text-[15px]`,style:{transform:`translate(-50%, -50%)`},children:r})}function tr({option:e,selected:t,onSelect:n}){return(0,q.jsx)(x,{onClick:n,type:`button`,"aria-label":e.label,variant:`outline`,className:w(`relative h-32 min-w-0 overflow-hidden p-0`,t?`border-emerald-300 bg-emerald-100 text-emerald-950 shadow-sm dark:border-emerald-600 dark:bg-emerald-950/50`:`border-slate-200 bg-white text-slate-600 hover:border-slate-300 hover:bg-slate-50 dark:border-slate-700 dark:bg-slate-800/70 dark:text-slate-300 dark:hover:bg-slate-800`),children:(0,q.jsx)(er,{option:e})},e.value)}function nr(){let{t:e}=F(),[t,n]=(0,K.useState)(!1),{rotationPreset:r,setRotationPreset:i,customRotationInput:a,setCustomRotationInput:o,padding:s,setPadding:c,maxWords:l,setMaxWords:u,minFontSize:d,maxFontSize:f,setFontSizeRange:p}=k(be(e=>({rotationPreset:e.rotationPreset,setRotationPreset:e.setRotationPreset,customRotationInput:e.customRotationInput,setCustomRotationInput:e.setCustomRotationInput,padding:e.padding,setPadding:e.setPadding,maxWords:e.maxWords,setMaxWords:e.setMaxWords,minFontSize:e.minFontSize,maxFontSize:e.maxFontSize,setFontSizeRange:e.setFontSizeRange}))),m=[{value:`horizontal`,label:e(`layout.horizontal`),preview:[e(`layout.horizontal`)]},{value:`vertical`,label:e(`layout.vertical`),preview:[e(`layout.vertical`)]},{value:`orthogonal`,label:e(`layout.orthogonal`),preview:[e(`layout.horizontal`),e(`layout.vertical`)]},{value:`crossing`,label:e(`layout.crossing`),preview:[e(`layout.crossingPreview`),e(`layout.vertical`),e(`layout.horizontal`)]},{value:`crossingVoids`,label:e(`layout.crossingVoids`),preview:[e(`layout.crossingPreview`),e(`layout.voidsPreview`)]},{value:`dancing`,label:e(`layout.dancing`),preview:[e(`layout.dancingPreview`),e(`layout.wordsPreview`)]},{value:`positiveSlope`,label:e(`layout.positiveSlope`),preview:[e(`layout.positivePreview`),e(`layout.slopePreview`)]},{value:`negativeSlope`,label:e(`layout.negativeSlope`),preview:[e(`layout.negativePreview`),e(`layout.slopePreview`)]},{value:`random`,label:e(`layout.random`),preview:[e(`layout.random`)]},{value:`custom`,label:e(`layout.custom`),preview:[e(`layout.custom`)]}],h=[`horizontal`,`vertical`,`orthogonal`,`random`],g=(h.includes(r)?h:[r,...h.filter(e=>e!==r).slice(0,3)]).map(e=>m.find(t=>t.value===e)).filter(e=>!!e),_=(e,t=!1)=>{i(e),t&&n(!1)},v=[Math.min(d,f),Math.max(d,f)],y=e=>{let t=e[0]??v[0],n=e[1]??v[1],r=Math.max(Jn,Math.min(Yn,Math.round(Math.min(t,n)))),i=Math.max(r,Math.min(Yn,Math.round(Math.max(t,n))));(r!==d||i!==f)&&p(r,i)};return(0,q.jsxs)(`div`,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,q.jsx)(`h3`,{className:`text-sm font-semibold text-slate-700 dark:text-slate-300`,children:e(`layout.title`)}),(0,q.jsx)(U,{content:e(`tooltips.layout.title`)})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-500 dark:text-slate-400`,children:e(`layout.rotation`)}),(0,q.jsx)(U,{content:e(`tooltips.layout.rotation`)})]}),(0,q.jsx)(`div`,{className:`grid grid-cols-2 gap-1.5`,children:g.map(e=>(0,q.jsx)(tr,{option:e,selected:r===e.value,onSelect:()=>_(e.value)},e.value))}
6),(0,q.jsxs)(x,{type:`button`,onClick:()=>n(!0),variant:`outline`,size:`sm`,className:`mt-2 w-full`,children:[(0,q.jsx)(Je,{size:15}),e(`layout.moreOrientations`)]}),r===`custom`&&(0,q.jsxs)(`div`,{className:`mt-2`,children:[(0,q.jsx)(`label`,{className:`mb-1 block text-xs font-medium text-slate-500 dark:text-slate-400`,children:e(`layout.customAngles`)}),(0,q.jsx)(Tt,{value:a,onChange:e=>o(e.target.value),placeholder:e(`layout.customAnglesPlaceholder`),className:`h-8 bg-white text-xs dark:bg-slate-950`})]}),t&&(0,q.jsx)(pe,{open:t,onOpenChange:n,children:(0,q.jsxs)(Re,{showCloseButton:!1,className:`flex max-h-[88vh] max-w-5xl flex-col gap-0 overflow-hidden p-0`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between border-b border-border px-4 py-3`,children:[(0,q.jsxs)(B,{className:`gap-1 text-left`,children:[(0,q.jsx)(me,{className:`text-sm`,children:e(`layout.orientationDialogTitle`)}),(0,q.jsx)(H,{className:`text-xs`,children:e(`layout.orientationDialogCount`,{count:m.length})})]}),(0,q.jsx)(x,{type:`button`,onClick:()=>n(!1),variant:`ghost`,size:`icon-sm`,"aria-label":e(`layout.closeOrientations`),children:(0,q.jsx)(vt,{size:17})})]}),(0,q.jsx)(`div`,{className:`overflow-y-auto p-4`,children:(0,q.jsx)(`div`,{className:`grid grid-cols-2 gap-2 sm:grid-cols-3 md:grid-cols-5`,children:m.map(e=>(0,q.jsx)(tr,{option:e,selected:r===e.value,onSelect:()=>_(e.value,!0)},e.value))})})]})})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-500 dark:text-slate-400`,children:e(`style.fontSize`)}),(0,q.jsx)(U,{content:e(`tooltips.style.fontSize`)})]}),(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(J,{min:Jn,max:Yn,step:1,minStepsBetweenThumbs:0,value:v,onValueChange:y,className:`py-1`}),(0,q.jsxs)(`div`,{className:`flex items-center justify-between text-[11px] text-slate-500 dark:text-slate-400`,children:[(0,q.jsxs)(`span`,{children:[e(`style.min`),` `,(0,q.jsx)(`span`,{className:`font-medium tabular-nums text-slate-700 dark:text-slate-200`,children:v[0]})]}),(0,q.jsxs)(`span`,{children:[e(`style.max`),` `,(0,q.jsx)(`span`,{className:`font-medium tabular-nums text-slate-700 dark:text-slate-200`,children:v[1]})]})]})]})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-500 dark:text-slate-400`,children:e(`layout.padding`)}),(0,q.jsx)(U,{content:e(`tooltips.layout.padding`)})]}),(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(J,{min:0,max:20,value:[s],onValueChange:([e])=>c(e??s),className:`flex-1`}),(0,q.jsx)(`span`,{className:`text-xs text-slate-500 dark:text-slate-400 w-6 text-right`,children:s})]})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-500 dark:text-slate-400`,children:e(`layout.maxWords`)}),(0,q.jsx)(U,{content:e(`tooltips.layout.maxWords`)})]}),(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(J,{min:10,max:1200,step:10,value:[l],onValueChange:([e])=>u(e??l),className:`flex-1`}),(0,q.jsx)(`span`,{className:`w-9 text-right text-xs text-slate-500 dark:text-slate-400`,children:l})]})]})]})}var rr=`shapewords.customShapes.v1`,ir=80;function ar(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`shape-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function or(e){return{...e,id:`custom`,category:`custom`,tags:Array.from(new Set([`custom`,`своя форма`,...e.tags??[]]))}}function sr(e){return`${e.viewBox}|${e.fillRule??`nonzero`}|${e.path}`}function cr(){if(typeof window>`u`)return[];try{let e=JSON.parse(window.localStorage.getItem(rr)??`[]`);return Array.isArray(e)?e:[]}catch{return[]}}function lr(e){if(!(typeof window>`u`))try{window.localStorage.setItem(rr,JSON.stringify(e.slice(0,ir)))}catch{}}function ur(){return cr().filter(e=>typeof e?.path==`string`&&typeof e?.viewBox==`string`).map(e=>or({...e,localShapeId:e.localShapeId??ar()}
6))}function dr(e){let t=or({...e,localShapeId:e.localShapeId??ar(),userShapeId:void 0}),n=sr(t);return lr([t,...ur().filter(e=>sr(e)!==n)].slice(0,ir)),t}function fr(e){lr(ur().filter(t=>t.localShapeId!==e))}function pr(e,t){return sr(e)===sr(t)}var mr=(0,K.lazy)(()=>G(()=>j(()=>import(`./ShapeBuilderModal-Dp2S3YQk.js`),__vite__mapDeps([3,1,2]))).then(e=>({default:e.ShapeBuilderModal}))),hr=[{value:`transparent`,color:`transparent`,labelKey:`shape.backgroundNone`},{value:`#f8fafc`,color:`#f8fafc`,labelKey:`shape.backgroundWhite`},{value:`#dff4ff`,color:`#dff4ff`,labelKey:`shape.backgroundSky`},{value:`#dcfce7`,color:`#dcfce7`,labelKey:`shape.backgroundMint`},{value:`#fef3c7`,color:`#fef3c7`,labelKey:`shape.backgroundWarm`},{value:`#fce7f3`,color:`#fce7f3`,labelKey:`shape.backgroundRose`}];function gr({shape:e,className:t,fillColor:n}){let r=n&&n!==`transparent`?{fill:n}:void 0;return(0,q.jsx)(`svg`,{viewBox:e.viewBox,className:w(t??`size-8`),"aria-hidden":`true`,children:(0,q.jsx)(`path`,{d:e.path,fillRule:e.fillRule,clipRule:e.fillRule,className:`fill-slate-400 dark:fill-slate-500`,style:r})})}function _r({shape:e,selected:t,label:n,onSelect:r,onDelete:i,deleteLabel:a,size:o=`compact`}){return(0,q.jsxs)(`div`,{className:`relative min-w-0`,children:[(0,q.jsxs)(x,{type:`button`,onClick:r,variant:`outline`,className:w(`h-auto w-full min-w-0 flex-col gap-1`,o===`catalog`?`min-h-28 rounded-lg p-3`:`rounded-lg p-2`,t?`border-emerald-400 bg-emerald-50 ring-1 ring-emerald-400 dark:bg-emerald-900/20`:`border-slate-200 hover:border-slate-300 hover:bg-slate-50 dark:border-slate-600 dark:hover:border-slate-500 dark:hover:bg-slate-800`),children:[(0,q.jsx)(gr,{shape:e,className:o===`catalog`?`size-14 sm:size-16`:void 0}),(0,q.jsx)(`span`,{className:`w-full truncate text-center text-[10px] text-slate-500 dark:text-slate-400`,children:n})]}),i&&(0,q.jsx)(x,{type:`button`,onClick:e=>{e.stopPropagation(),i()},variant:`outline`,size:`icon-sm`,className:`absolute right-1 top-1 size-7 border-red-200 bg-white/92 text-red-500 shadow-sm hover:bg-red-50 hover:text-red-600 dark:border-red-900/70 dark:bg-slate-950/90 dark:text-red-300 dark:hover:bg-red-950/60`,"aria-label":a,title:a,children:(0,q.jsx)(gt,{size:13})})]})}function vr(e,t){return!!(e&&t&&e.id===t.id&&e.path===t.path&&e.viewBox===t.viewBox)}function yr(e){return{...e,id:`custom`,category:`custom`,tags:Array.from(new Set([`custom`,`своя форма`,...e.tags??[]]))}}function br(e,t){return E(t)?e.name:e.nameEn}function xr(e){return Number.isInteger(e)?String(e):Number(e.toFixed(3)).toString()}function Sr(e){let t=e.trim().split(/[\s,]+/).map(Number);return t.length!==4||t.some(e=>!Number.isFinite(e))?{x:0,y:0,width:100,height:100}:{x:t[0]??0,y:t[1]??0,width:Math.max(1,t[2]??100),height:Math.max(1,t[3]??100)}}function Cr(e,t,n,r){let i=e+n,a=t+r;return[`M ${xr(e)} ${xr(t)}`,`L ${xr(i)} ${xr(t)}`,`L ${xr(i)} ${xr(a)}`,`L ${xr(e)} ${xr(a)}`,`Z`].join(` `)}function wr(e){let t=Sr(e.viewBox);return{id:`custom`,name:`Инверсия: ${e.name}`,nameEn:`Inverted: ${e.nameEn}`,category:`custom`,tags:[...new Set([...e.tags,`custom`,`inverse`,`inverted`,`инверсия`])],viewBox:e.viewBox,path:`${Cr(t.x,t.y,t.width,t.height)} ${e.path}`,fillRule:`evenodd`}}function Tr(){let{t:e,i18n:t}=F(),{shapeType:n,customShapeDefinition:r,shapeBackgroundColor:a,setShapeType:o,setCustomShapeDefinition:c,setShapeBackgroundColor:l}=k(be(e=>({shapeType:e.shapeType,customShapeDefinition:e.customShapeDefinition,shapeBackgroundColor:e.shapeBackgroundColor,setShapeType:e.setShapeType,setCustomShapeDefinition:e.setCustomShapeDefinition,setShapeBackgroundColor:e.setShapeBackgroundColor}))),{user:d,savedAccountShapes:f,saveCurrentShape:p,deleteAccountShape:m}=i(be(e=>({user:e.user,savedAccountShapes:e.shapes,saveCurrentShape:e.saveCurrentShape,deleteAccountShape:e.deleteShape}))),[h,g]=(0,K.useState)(!1),[_,v]=(0,K.useState)(null),[y,b]=(0,K.useState)(`transparent`),[S,C]=(0,K.useState)(!1),[T,E]=(0,K.useState)(!1),[D,O]=(0,K.useState)(null),[A,j]=(0,K.useState)(!1),[N,te]=(0,K.useState)(``),[P,ne]=(0,K.useState)(`all`),[L,re]=(0,K.useState)(42),[R,z]=(0,K.useState)(``),[ae,oe]=(0,K.useState)(!1),[se,ce]=(0,K.useState)(()=>ur()),le=(0,K.useRef)(null),ue=a===`transparent`?`#dff4ff`:a,de=y===`transparent`?`#dff4ff`:y,fe=(0,K.useMemo)(()=>f.map(e=>yr({...e.shape,userShapeId:e.id,localShapeId:void 0})),[f]),he=(0,K.useMemo)(()=>{let e=[],t=t=>{if(!t)return;let n=yr(t);e.some(e=>pr(e,n))||e.push(n)};return fe.forEach(t),se.forEach(t),r?.id===`custom`&&t(r),e},[fe,r,se]),ge=(0,K.useMemo)(()=>[...he,...I],[he]),_e=(0,K.useMemo)(()=>s.map(e=>I.find(t=>
6t.id===e)).filter(e=>!!e),[]),V=ee(n,r),ve=(0,K.useMemo)(()=>_?S?wr(_):_:null,[_,S]),ye=!!V,xe=(0,K.useMemo)(()=>{let t=N.trim().toLowerCase();return ge.filter(n=>P===`all`||n.category===P?t?[n.id,n.name,n.nameEn,...n.tags,e(`shape.categories.${n.category}`)].join(` `).toLowerCase().includes(t):!0:!1)},[P,ge,N,e]);(0,K.useEffect)(()=>{if(!h)return;let e=e=>{e.key===`Escape`&&g(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[h]),(0,K.useEffect)(()=>{h&&(v(null),b(a),C(!1))},[h,a]);let Se=e=>{o(e),g(!1)},Ce=(e=null)=>{O(e),E(!0)},we=e=>{v(e),b(a),C(!1)},Te=()=>{_&&(async()=>{S?(c(await De(wr(_))),o(`custom`)):_.id===`custom`?(c(_),o(`custom`)):o(_.id),l(y),g(!1)})()},Ee=()=>ce(ur()),De=async e=>{let t=yr(e);if(d){let e=await p(t);if(e)return yr({...e.shape,userShapeId:e.id,localShapeId:void 0})}let n=dr(t);return Ee(),n},Oe=i=>{let a=br(i,t.language);window.confirm(e(`shape.deleteShapeConfirm`,{name:a}))&&(async()=>{i.userShapeId?await m(i.userShapeId):i.localShapeId&&(fr(i.localShapeId),Ee()),n===`custom`&&r&&pr(i,r)&&(c(null),o(M))})()},ke=()=>{ae||(z(``),j(!0))},Ae=async n=>{oe(!0),z(``);try{let r=await De(await Ot(n,{mode:`auto`,threshold:L}));c(r),o(`custom`),z(e(`shape.customReady`,{name:br(r,t.language)})),j(!1)}catch(t){z(t instanceof Error?t.message:e(`shape.customError`))}finally{oe(!1)}},je=()=>{try{le.current?.click()}catch{z(e(`shape.customError`))}},Me=n=>{(async()=>{let r=await De(n);c(r),o(`custom`),z(e(`shape.customReady`,{name:br(r,t.language)})),E(!1),O(null)})()};return(0,q.jsxs)(`div`,{className:`space-y-3`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,q.jsx)(`h3`,{className:`text-sm font-semibold text-slate-700 dark:text-slate-300`,children:e(`shape.title`)}),(0,q.jsx)(U,{content:e(`tooltips.shape.title`)})]}),(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-500 dark:text-slate-400`,children:e(`shape.popular`)}),(0,q.jsxs)(x,{type:`button`,onClick:()=>g(!0),variant:`outline`,size:`sm`,className:`h-7`,children:[(0,q.jsx)(pt,{size:13}),e(`shape.openCatalog`)]})]}),V&&(0,q.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_auto] gap-1.5`,children:[(0,q.jsxs)(x,{type:`button`,onClick:()=>g(!0),variant:`subtle`,className:`h-auto min-w-0 justify-between px-2.5 py-2 text-left`,children:[(0,q.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,q.jsx)(gr,{shape:V,className:`size-6 shrink-0`}),(0,q.jsxs)(`span`,{className:`min-w-0`,children:[(0,q.jsx)(`span`,{className:`block text-[10px] uppercase text-emerald-500 dark:text-emerald-400`,children:e(`shape.selected`)}),(0,q.jsx)(`span`,{className:`block truncate text-xs font-medium text-emerald-700 dark:text-emerald-200`,children:br(V,t.language)})]})]}),(0,q.jsx)(pt,{size:14,className:`shrink-0 text-emerald-500`})]}),(0,q.jsx)(x,{type:`button`,onClick:()=>Ce(V),variant:`outline`,size:`icon-sm`,className:`h-full min-h-12 w-11 shrink-0`,"aria-label":e(`shape.editShape`),title:e(`shape.editShape`),children:(0,q.jsx)(_t,{size:15})})]}),(0,q.jsx)(`div`,{className:`grid grid-cols-3 gap-1.5`,children:_e.map(e=>(0,q.jsx)(_r,{shape:e,selected:n===e.id,label:br(e,t.language),onSelect:()=>Se(e.id)},e.id))}),(0,q.jsxs)(`div`,{className:`grid gap-2 rounded-lg border border-slate-200 p-2 dark:border-slate-700`,children:[(0,q.jsxs)(`div`,{className:`grid gap-2`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`div`,{className:`text-xs font-medium text-slate-600 dark:text-slate-300`,children:e(`shape.customTitle`)}),(0,q.jsx)(`div`,{className:`text-[11px] leading-snug text-slate-400 dark:text-slate-500`,children:e(`shape.customDescription`)})]}),(0,q.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_auto] gap-1.5`,children:[(0,q.jsxs)(x,{type:`button`,onClick:()=>Ce(null),size:`sm`,className:`h-8 min-w-0`,children:[(0,q.jsx)(pt,{size:13}),(0,q.jsx)(`span`,{className:`truncate`,children:e(`shape.builderOpen`)})]}),(0,q.jsxs)(x,{type:`button`,onClick:ke,disabled:ae,variant:`outline`,size:`sm`,className:`h-8 shrink-0`,children:[ae?(0,q.
6jsx)(bt,{size:13,className:`animate-spin`}):(0,q.jsx)(Ue,{size:13}),(0,q.jsx)(`span`,{className:`hidden sm:inline`,children:e(`shape.customUpload`)})]})]})]}),R&&(0,q.jsx)(`div`,{className:`rounded-md bg-slate-50 px-2 py-1.5 text-xs text-slate-500 dark:bg-slate-800/70 dark:text-slate-400`,children:R})]}),A&&(0,q.jsx)(pe,{open:A,onOpenChange:j,children:(0,q.jsxs)(Re,{showCloseButton:!1,className:`max-w-md`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between border-b border-border pb-3`,children:[(0,q.jsxs)(B,{className:`gap-1 text-left`,children:[(0,q.jsx)(me,{children:e(`shape.customTitle`)}),(0,q.jsx)(H,{className:`text-xs`,children:e(`shape.customDescription`)})]}),(0,q.jsx)(x,{type:`button`,onClick:()=>j(!1),variant:`ghost`,size:`icon-sm`,"aria-label":e(`shape.closeCatalog`),children:(0,q.jsx)(vt,{size:17})})]}),(0,q.jsxs)(`div`,{className:`grid gap-3 pt-1`,children:[(0,q.jsx)(`input`,{ref:le,type:`file`,accept:`image/png,image/jpeg,image/webp,image/svg+xml`,className:`hidden`,tabIndex:-1,disabled:ae,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&Ae(t)}}),(0,q.jsxs)(x,{type:`button`,onClick:je,disabled:ae,className:`h-10`,children:[ae?(0,q.jsx)(bt,{size:13,className:`animate-spin`}):(0,q.jsx)(Ue,{size:13}),e(`shape.customUpload`)]}),(0,q.jsxs)(`label`,{className:`grid gap-1`,children:[(0,q.jsxs)(`span`,{className:`flex justify-between text-[11px] text-slate-500 dark:text-slate-400`,children:[(0,q.jsx)(`span`,{children:e(`shape.customThreshold`)}),(0,q.jsx)(`span`,{className:`tabular-nums`,children:L})]}),(0,q.jsx)(J,{min:8,max:120,value:[L],onValueChange:([e])=>re(e??L),disabled:ae})]})]}),R&&(0,q.jsx)(`div`,{className:`rounded-md bg-slate-50 px-2 py-1.5 text-xs text-slate-500 dark:bg-slate-800/70 dark:text-slate-400`,children:R})]})}),T&&(0,q.jsx)(K.Suspense,{fallback:null,children:(0,q.jsx)(mr,{initialShape:D,onClose:()=>{E(!1),O(null)},onApply:Me})}),h&&(0,q.jsx)(pe,{open:h,onOpenChange:g,children:(0,q.jsxs)(Re,{showCloseButton:!1,className:`flex max-h-[84vh] max-w-4xl flex-col gap-0 overflow-hidden p-0`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between border-b border-border px-4 py-3`,children:[(0,q.jsxs)(B,{className:`gap-1 text-left`,children:[(0,q.jsx)(me,{className:`text-sm`,children:e(`shape.catalogTitle`)}),(0,q.jsx)(H,{className:`text-xs`,children:e(`shape.catalogCount`,{count:xe.length})})]}),(0,q.jsx)(x,{type:`button`,onClick:()=>g(!1),variant:`ghost`,size:`icon-sm`,"aria-label":e(`shape.closeCatalog`),children:(0,q.jsx)(vt,{size:17})})]}),_&&ve?(0,q.jsxs)(`div`,{className:`grid min-h-0 flex-1 gap-4 overflow-y-auto p-4 md:grid-cols-[minmax(0,1fr)_18rem]`,children:[(0,q.jsx)(`div`,{className:`min-w-0 rounded-xl border border-slate-200 bg-slate-50 p-3 dark:border-slate-700 dark:bg-slate-950/35`,children:(0,q.jsx)(`div`,{className:`flex aspect-square min-h-72 items-center justify-center rounded-lg bg-white p-8 shadow-inner dark:bg-slate-900`,children:(0,q.jsx)(gr,{shape:ve,fillColor:y,className:`h-full max-h-[25rem] w-full max-w-[25rem]`})})}),(0,q.jsxs)(`div`,{className:`grid content-start gap-3`,children:[(0,q.jsxs)(`div`,{className:`rounded-lg border border-slate-200 p-3 dark:border-slate-700`,children:[(0,q.jsx)(`div`,{className:`text-[10px] font-semibold uppercase text-emerald-500 dark:text-emerald-400`,children:e(`shape.catalogCustomize`)}),(0,q.jsx)(`div`,{className:`mt-1 text-sm font-semibold text-slate-800 dark:text-slate-100`,children:br(_,t.language)}),(0,q.jsx)(`div`,{className:`mt-1 text-[11px] leading-snug text-slate-500 dark:text-slate-400`,children:_.tags.slice(0,5).join(` · `)})]}),(0,q.jsxs)(`div`,{className:`grid gap-2 rounded-lg border border-slate-200 p-3 dark:border-slate-700`,children:[(0,q.jsx)(`div`,{className:`text-xs font-medium text-slate-600 dark:text-slate-300`,children:e(`shape.catalogColor`)}),(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[hr.map(t=>{let n=y===t.value;return(0,q.jsx)(x,{type:`button`,onClick:()=>b(t.value),"aria-label":e(t.labelKey),variant:`outline`,className:w(`relative h-8 w-8 p-0`,n?`border-emerald-400 ring-2 ring-emerald-200 dark:ring-emerald-900/60`:`border-slate-200 hover:border-slate-300 dark:border-slate-600 dar
6k:hover:border-slate-500`),style:{background:t.value===`transparent`?`linear-gradient(135deg, #f8fafc 25%, #e2e8f0 25%, #e2e8f0 50%, #f8fafc 50%, #f8fafc 75%, #e2e8f0 75%)`:void 0,backgroundSize:t.value===`transparent`?`8px 8px`:void 0,backgroundColor:t.color}},t.value)}),(0,q.jsx)(`label`,{className:`relative h-8 w-8 overflow-hidden rounded-md border border-slate-200 transition-all hover:border-slate-300 dark:border-slate-600 dark:hover:border-slate-500`,children:(0,q.jsx)(`input`,{type:`color`,value:de,onChange:e=>b(e.target.value),className:`absolute -inset-1 h-10 w-10 cursor-pointer border-0 bg-transparent p-0`,"aria-label":e(`shape.backgroundCustom`)})})]})]}),(0,q.jsxs)(`label`,{className:`flex items-center justify-between gap-3 rounded-lg border border-slate-200 p-3 dark:border-slate-700`,children:[(0,q.jsxs)(`span`,{className:`min-w-0`,children:[(0,q.jsx)(`span`,{className:`block text-xs font-medium text-slate-700 dark:text-slate-200`,children:e(`shape.catalogInvert`)}),(0,q.jsx)(`span`,{className:`block text-[11px] leading-snug text-slate-500 dark:text-slate-400`,children:e(`shape.catalogInvertHint`)})]}),(0,q.jsx)(u,{checked:S,onCheckedChange:C})]}),(0,q.jsxs)(`div`,{className:`grid grid-cols-3 gap-2`,children:[(0,q.jsx)(x,{type:`button`,onClick:()=>v(null),variant:`outline`,className:`h-10`,children:e(`shape.catalogBack`)}),(0,q.jsxs)(x,{type:`button`,onClick:()=>{O(ve),E(!0),g(!1)},variant:`outline`,className:`h-10`,children:[(0,q.jsx)(_t,{size:16}),e(`shape.catalogEditFree`)]}),(0,q.jsxs)(x,{type:`button`,onClick:Te,className:`h-10`,children:[(0,q.jsx)(kt,{size:16}),e(`shape.catalogApply`)]})]})]})]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`div`,{className:`grid gap-3 border-b border-slate-200 p-4 dark:border-slate-700`,children:[(0,q.jsxs)(`label`,{className:`relative block`,children:[(0,q.jsx)(yt,{className:`pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-slate-400`,size:15}),(0,q.jsx)(Tt,{value:N,onChange:e=>te(e.target.value),placeholder:e(`shape.searchPlaceholder`),className:`h-9 bg-slate-50 pl-8 dark:bg-slate-950`,autoFocus:!0})]}),(0,q.jsx)(`div`,{className:`flex gap-1.5 overflow-x-auto pb-0.5`,children:[`all`,...ie].map(t=>(0,q.jsx)(x,{type:`button`,onClick:()=>ne(t),variant:P===t?`subtle`:`ghost`,size:`sm`,className:w(`h-8 shrink-0 px-2.5 text-xs font-medium`,P!==t&&`text-slate-500 dark:text-slate-400`),children:e(`shape.categories.${t}`)},t))})]}),(0,q.jsx)(`div`,{className:`overflow-y-auto p-4`,children:xe.length>0?(0,q.jsx)(`div`,{className:`grid grid-cols-3 gap-2 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6`,children:xe.map(i=>{let a=!!(i.userShapeId||i.localShapeId);return(0,q.jsx)(_r,{shape:i,selected:vr(_,i)||!_&&(n===`custom`?vr(r,i):n===i.id),label:br(i,t.language),onSelect:()=>we(i),onDelete:a?()=>Oe(i):void 0,deleteLabel:e(`shape.deleteShape`,{name:br(i,t.language)}),size:`catalog`},`${i.userShapeId??i.localShapeId??i.id}-${i.path}`)})}):(0,q.jsx)(`div`,{className:`flex min-h-40 items-center justify-center rounded-lg border border-dashed border-slate-200 text-sm text-slate-400 dark:border-slate-700 dark:text-slate-500`,children:e(`shape.catalogEmpty`)})})]})]})}),ye&&(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium text-slate-500 dark:text-slate-400`,children:e(`shape.background`)}),(0,q.jsx)(U,{content:e(`tooltips.shape.background`)})]}),(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[hr.map(t=>{let n=a===t.value;return(0,q.jsx)(x,{type:`button`,onClick:()=>l(t.value),"aria-label":e(t.labelKey),variant:`outline`,className:w(`relative h-7 w-7 p-0`,n?`border-emerald-400 ring-2 ring-emerald-200 dark:ring-emerald-900/60`:`border-slate-200 hover:border-slate-300 dark:border-slate-600 dark:hover:border-slate-500`),style:{background:t.value===`transparent`?`linear-gradient(135deg, #f8fafc 25%, #e2e8f0 25%, #e2e8f0 50%, #f8fafc 50%, #f8fafc 75%, #e2e8f0 75%)`:void 0,backgroundSize:t.value===`transparent`?`8px 8px`:void 0,backgroundColor:t.color}},t.value)}),(0,q.jsx)(`label`,{className:`relative h-7 w-7 overflow-hidden rounded-md border border-slate-200 transition-all hover:border-slate-300 dark:border-slate-600 dar
6k:hover:border-slate-500`,children:(0,q.jsx)(`input`,{type:`color`,value:ue,onChange:e=>l(e.target.value),className:`absolute -inset-1 h-9 w-9 cursor-pointer border-0 bg-transparent p-0`,"aria-label":e(`shape.backgroundCustom`)})})]})]})]})}function Er({className:e,orientation:t=`horizontal`,decorative:n=!0,...r}){return(0,q.jsx)(Bt,{"data-slot":`separator`,decorative:n,orientation:t,className:w(`shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px`,e),...r})}function Dr(){let e=k(be(e=>({wordsLength:e.words.length,layoutWordsCount:e.layoutWords.length,isGenerating:e.isGenerating,isPreciseTextProcessing:e.isPreciseTextProcessing,isWordListProcessing:e.isWordListProcessing,preservedLayoutSignature:e.preservedLayoutSignature,preservedColorSignature:e.preservedColorSignature,requestGeneration:e.requestGeneration})));return{hasPendingGeneration:e.wordsLength>0&&(e.layoutWordsCount===0||e.preservedLayoutSignature===null||e.preservedColorSignature===null),canGenerate:e.wordsLength>0&&!e.isGenerating&&!e.isPreciseTextProcessing&&!e.isWordListProcessing,isGenerating:e.isGenerating,requestGeneration:e.requestGeneration}}var Or=(0,K.memo)(function({isOpen:e,onClose:t}){let{t:n}=F(),{hasPendingGeneration:r,canGenerate:i,requestGeneration:a}=Dr(),o=(0,K.useCallback)(()=>{a(),typeof window<`u`&&window.matchMedia(`(max-width: 1023px)`).matches&&t()},[t,a]);return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`div`,{className:w(`fixed inset-0 z-40 bg-slate-950/35 backdrop-blur-sm transition-opacity duration-200 lg:hidden`,e?`pointer-events-auto opacity-100`:`pointer-events-none opacity-0`),onMouseDown:e=>{e.target===e.currentTarget&&t()},"aria-hidden":`true`}),(0,q.jsxs)(`aside`,{id:`app-sidebar`,className:w(`fixed inset-y-0 left-0 z-50 flex h-dvh w-[min(22rem,100dvw)] min-w-0 max-w-full flex-col overflow-hidden border-r border-slate-200 bg-sidebar shadow-2xl shadow-slate-950/20 transition-transform duration-200 dark:border-slate-700 dark:bg-sidebar-dark lg:static lg:z-auto lg:h-full lg:w-[340px] lg:translate-x-0 lg:shadow-none`,e?`translate-x-0`:`-translate-x-full`),children:[(0,q.jsxs)(`div`,{className:`z-10 flex min-h-14 shrink-0 items-center justify-between border-b border-slate-200 bg-sidebar/95 px-3 backdrop-blur-sm dark:border-slate-700 dark:bg-sidebar-dark/95 lg:hidden`,children:[(0,q.jsx)(`div`,{className:`text-sm font-semibold text-slate-700 dark:text-slate-200`,children:n(`app.settings`)}),(0,q.jsx)(x,{type:`button`,onClick:t,variant:`ghost`,size:`icon`,"aria-label":n(`app.closeSettings`),children:(0,q.jsx)(vt,{size:18})})]}),(0,q.jsxs)(`div`,{className:`min-h-0 w-full min-w-0 flex-1 space-y-4 overflow-y-auto overflow-x-hidden overscroll-contain p-3 sm:p-4 lg:space-y-5`,children:[(0,q.jsx)(Un,{}),(0,q.jsx)(Er,{}),(0,q.jsx)(zn,{}),(0,q.jsx)(qn,{}),(0,q.jsx)(Er,{}),(0,q.jsx)(nr,{}),(0,q.jsx)(Tr,{})]}),(0,q.jsx)(`div`,{className:`border-t border-slate-200 bg-sidebar/95 p-3 backdrop-blur-sm dark:border-slate-700 dark:bg-sidebar-dark/95`,children:(0,q.jsxs)(x,{type:`button`,onClick:o,disabled:!r||!i,className:w(`h-10 w-full transition-opacity`,r?`bg-emerald-600 text-white hover:bg-emerald-700`:`bg-slate-200/80 text-slate-400 hover:bg-slate-200 dark:bg-slate-800 dark:text-slate-500 dark:hover:bg-slate-800`),children:[(0,q.jsx)(_e,{size:16}),n(`canvas.generate`)]})})]})]})}),kr=`/chrome-web-store-badge.png`;function Ar(){return(0,q.jsx)(`span`,{className:`hidden text-slate-300 sm:inline dark:text-slate-600`,children:`|`})}function jr({locale:e,onNavigate:t,onPreloadLiveLanding:n}){let{t:r}=F(),i=tn();return(0,q.jsx)(`footer`,{className:`flex shrink-0 flex-col items-center justify-center gap-2 border-t border-slate-200 px-4 py-2 text-center text-xs text-slate-400 dark:border-slate-700 dark:text-slate-500 sm:flex-row sm:flex-wrap`,children:(0,q.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center justify-center gap-x-2 gap-y-1`,children:[(0,q.jsxs)(`span`,{className:`hidden items-center gap-1 sm:inline-flex`,children:[(0,q.jsx)(ht,{size:12,className:`text-red-400`}),(0,q.jsx)(`span`,{children:r(`footer.free`)})]}),(0,q.jsx)(Ar,{}),(0,q.jsx)(`span`,{className:`hidden truncate sm:inline`,children:r(`footer.description`)}),(0,q.jsx)(Ar,{}),(0,q.jsx)(`a`,{href:$t(e),onMouseEnter:n,onFocus:n,className:`shrink-0 text-slate-500 underline-offset-4 hover:text-slate-700 hover:underline dark:text-slate-400 dark:hover:text-slate-200`,children:r(`footer.live`)}),(0,q.jsx)(Ar,{}),(0,q.jsx)(`a`,{href:`/${e}/templates`,onClick:n=>{n.preventDefault(),t(`/${e}/templates`)},className:`shrink-0 text-slate-500 underline-offset-4 hover:text-slate-700 hover:underline dark:text-slate-400 dark:hover:text-slate-200`,children:r(`footer.templates`)}),(0,q.jsx)(Ar,{}),(0,q.jsx)(`a`,{href:`/${e}/word-map`,onClick:n=>{n.preventDefault(),t(`/${e}/word-map`)},className:`shrink-0 text-slate-500 underline-offset-4 hover:text-slate-700 hover:underline dark:text-slate-400 dark:hover:text-slate-200`,children:r(`footer.wordMap`)}
6),i&&(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Ar,{}),(0,q.jsx)(`a`,{href:Wt(`footer`),target:`_blank`,rel:`noopener noreferrer`,className:`shrink-0 transition-opacity hover:opacity-90`,"aria-label":r(`app.openChromeExtension`),children:(0,q.jsx)(`img`,{src:kr,width:`114`,height:`32`,alt:r(`app.chromeExtensionBadgeAlt`),className:`h-8 w-auto`})})]}),(0,q.jsx)(Ar,{}),(0,q.jsx)(`a`,{href:`/${e}/privacy`,onClick:n=>{n.preventDefault(),t(`/${e}/privacy`)},className:`shrink-0 text-slate-500 underline-offset-4 hover:text-slate-700 hover:underline dark:text-slate-400 dark:hover:text-slate-200`,children:r(`footer.privacy`)})]})})}function Mr(e){return e.categories.some(e=>[`decorative`,`handwritten`,`display`].includes(e))}function Nr(e){return[...e.styles].filter(e=>e.style===`normal`).sort((e,t)=>Number(t.weight)-Number(e.weight))[0]??g(e)}async function Pr(e,t,n){let r=[...n?[`Russo One`,`Bebas Neue`,`Bungee`,`Lobster`,`Pacifico`]:[`Pacifico`,`Lobster`,`Yeseva One`,`Russo One`,`Bungee`],`ZCOOL KuaiLe`,`Dela Gothic One`,`Droid Arabic Naskh`,...Ee(Te(e)).filter(Mr).map(e=>e.family)],i=[...new Set(r)].filter(e=>e!==t);for(let n of[...i,t]){let t=re(n);try{await _(t);let n=Nr(t);if(!je(t,e,n.id))continue;return await Dt({family:t.family,styleId:n.id},e),t}catch{}}throw Error(`Unable to load a compatible accent font`)}var Fr=(0,K.lazy)(()=>G(()=>j(()=>import(`./CanvasExportControls-CdoE5EgH.js`),__vite__mapDeps([4,1,2,5,6]))).then(e=>({default:e.CanvasExportControls}))),Ir=(0,K.lazy)(()=>G(()=>j(()=>import(`./CanvasShareControls-BjRY4y8Z.js`),__vite__mapDeps([7,1,2,5,6]))).then(e=>({default:e.CanvasShareControls}))),Lr=80,Rr=8,zr=16,Br=960,Vr=.9,Hr=.94,Ur={mainAccent:`shapewords.canvas-hint.main-accent.shown`,sparseFill:`shapewords.canvas-hint.sparse-fill.shown`},Wr=new Set([`tree`,`drop`,`flame`,`leaf`,`location`,`rocket`,`lightning`]),Gr=new Set([`circle`,`heart`,`cloud`,`moon`,`sun`,`flower`,`apple`,`infinity`]),Kr={diamond:-14,leaf:-24,lightning:-52,plane:-8},qr=`bg-white/85 text-slate-500 backdrop-blur-sm dark:bg-slate-800/85`,Jr=[`curve`,`font`,`fontStyleId`,`fontWeight`,`fontStyle`],Yr=new Map,Xr=null;function Zr(e){if(typeof window>`u`)return!1;try{return window.sessionStorage.getItem(Ur[e])===`1`}catch{return!1}}function Qr(e){try{window.sessionStorage.setItem(Ur[e],`1`)}catch{}}function $r(e,t){let n=Math.ceil(e*(Hr/Math.max(.15,t)-1));return Math.max(12,Math.min(80,n))}
6function ei(e){let t=e.text.trim().split(/\s+/u).filter(Boolean).length;return t>=2&&t<=4}function ti(e,t){let n=e.filter(e=>e.kind!==`emoji`&&!O(e.text)&&e.text.trim()).sort((e,t)=>{let n=t.value-e.value;if(n!==0)return n;let r=/\s/u.test(e.text.trim()),i=/\s/u.test(t.text.trim());return r===i?Array.from(t.text.trim()).length-Array.from(e.text.trim()).length:Number(i)-Number(r)})[0];if(!n)return null;let r=f(n),i=-1;for(let e=0;e<t.length;e++){let n=t[e];if(f(n)!==r)continue;let a=i>=0?t[i]:null;(!a||!a.pinned&&n.pinned||a.pinned===n.pinned&&n.size>a.size)&&(i=e)}return i>=0?{index:i,source:n,word:t[i]}:null}function ni(e){if(e===`bold`)return 700;let t=Number(e);return Number.isFinite(t)?t:400}function ri(e){return e?!!(e.word.pinned&&(ni(e.word.fontWeight)>=600||Mr(re(e.word.font)))):!1}function ii(e,t,n,r,i){let{word:a}=e,o=Nr(i),s=Array.from(a.text.replace(/\s+/gu,``)).length,c=/\s/u.test(a.text.trim()),l=r.width*r.scale,u=r.height*r.scale,d=(l/Math.max(1,u)<.78||Wr.has(n))&&(c||s>=8),p=Kr[n],m=!d&&p===void 0&&Gr.has(n)&&s>=5&&s<=28,h=d?-90:p??0,g=m?n===`moon`||n===`infinity`?44:32:0,_=Math.max(1,fi({...a,font:i.family,fontStyleId:o.id,fontWeight:o.weight,fontStyle:o.style,outlinePath:void 0,outlineBounds:void 0,outlineGlyphs:void 0,outlineBaseSize:void 0})),v=Math.max(1,a.size*(m?1.34:.96)),y=Math.abs(h)*Math.PI/180,b=Math.abs(Math.cos(y))*_+Math.abs(Math.sin(y))*v,x=Math.abs(Math.sin(y))*_+Math.abs(Math.cos(y))*v,S=l*(d?.42:.68),C=u*(d?.72:m?.38:.44),w=Math.max(1,Math.min(S/b,C/x)),T=s<=7?1.62:s<=15?1.42:1.24,E=t.reduce((e,t)=>f(t)===f(a)?e:Math.max(e,t.size),0),D=E>0?E*1.2/Math.max(1,a.size):1,O=Math.min(w,Math.max(T,D)),k=Math.max(a.size,Math.round(a.size*O));return{fontStyleId:o.id,patch:{size:k,rotate:h,curve:g,font:i.family,fontStyleId:o.id,fontWeight:String(Math.max(700,ni(o.weight))),fontStyle:o.style,pinId:a.pinId??oi(),pinned:!0,pinStatus:`locked`}}}var ai=`__auto__`;function oi(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`pin-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function si(e,t){return e===` `?t*.34:/[ilI1|.,:;!]/.test(e)?t*.32:/[mwMWЖШЩЮ]/.test(e)?t*.82:/[A-ZА-ЯЁ]/.test(e)?t*.66:t*.58}function ci(e){return`"${e.replace(/"/g,`\\"`)}", Arial, sans-serif`}function li(e){return`"${e.replace(/"/g,`\\"`)}", Arial, sans-serif`}function ui(e,t){let n=si(e,t.size);if(typeof document>`u`)return n;let r=`${t.fontStyle??`normal`} ${t.fontWeight??400} ${t.size}px ${li(t.font)}`,i=`${r}|${e}`,a=Yr.get(i);if(a!==void 0)return a;Xr??=document.createElement(`canvas`);let o=Xr.getContext(`2d`);if(!o)return n;o.font=r;let s=o.measureText(e).width,c=Number.isFinite(s)&&s>0?s:n;if(Yr.set(i,c),Yr.size>4e3){let e=Yr.keys().next().value;e!==void 0&&Yr.delete(e)}return c}function di({font:e}){return e.previewImage?(0,q.jsx)(`img`,{src:e.previewImage,alt:``,className:`h-6 w-full max-w-[11rem] rounded-sm object-contain object-left`,loading:`lazy`}):(0,q.jsx)(`span`,{className:`block truncate text-sm leading-6 text-slate-700 dark:text-slate-200`,style:{fontFamily:e.family},children:e.label})}function Q(e){return e.kind===`emoji`||O(e.text)}function fi(e){if(Q(e))return e.size;let t=mi(e);return t?Math.max(e.size,t.width):Math.max(e.size,hi(e))}function pi(e){return!e.outlineBaseSize||!Number.isFinite(e.outlineBaseSize)||e.outlineBaseSize<=0?1:e.size/e.outlineBaseSize}function mi(e){if(!e.outlinePath||!e.outlineBounds)return null;let t=pi(e);return{x:e.outlineBounds.x*t,y:e.outlineBounds.y*t,width:e.outlineBounds.width*t,height:e.outlineBounds.height*t}}function hi(e){return Array.from(e.text).reduce((t,n)=>t+ui(n,e),0)}function gi(e,t,n,r,i){let a=i*Math.PI/180,o=Math.cos(a),s=Math.sin(a),c=n/2,l=r/2,u=[{x:-c,y:-l},{x:c,y:-l},{x:c,y:l},{x:-c,y:l}].map(n=>({x:e+n.x*o-n.y*s,y:t+n.x*s+n.y*o})),d=Math.min(...u.map(e=>e.x)),f=Math.max(...u.map(e=>e.x)),p=Math.min(...u.map(e=>e.y)),m=Math.max(...u.map(e=>e.y));return{x:d,y:p,width:f-d,height:m-p}}function _i(e){if(Q(e))return null;let t=Array.from(e.text),n=Math.max(-100,Math.min(100,e.curve??0));if(t.length===0||n===0)return null;let r=t.map(t=>ui(t,e)),i=hi(e),a=fi(e),o=Math.max(1,a/2),s=-(n/100)*Math.min(a*.38,e.size*5),c=-i/2,l=t.map((e,t)=>{let n=r[t],i=c+n/2;c+=n;let a=i/o,l=s*(1-a*a),u=s*(-2*i/(o*o));return{char:e,x:i,y:l,rotate:Math.atan(u)*180/Math.PI}}),u=e.size*.96,d=l.map((e,t)=>({glyph:e,bounds:gi(e.x,e.y,Math.max(1,r[t]),u,e.rotate)})).filter(({glyph:e})=>e.char.trim().length>0),f=d.length>0?d.map(e=>e.bounds):l.map((e,t)=>gi(e.x,e.y,Math.max(1,r[t]),u,e.rotate)),p=Math.min(...f.map(e=>
6e.x)),m=Math.max(...f.map(e=>e.x+e.width)),h=Math.min(...f.map(e=>e.y)),g=Math.max(...f.map(e=>e.y+e.height)),_=(p+m)/2,v=(h+g)/2;return{glyphs:l.map(e=>({...e,x:e.x-_,y:e.y-v})),bounds:{x:p-_,y:h-v,width:m-p,height:g-h}}}function vi(e){let t=mi(e);if(t)return t;if(Q(e))return{x:-e.size/2,y:-e.size/2,width:e.size,height:e.size};let n=fi(e),r=_i(e);if(r)return r.bounds;let i=e.size*.46;return{x:-n/2,y:-i,width:n,height:e.size*.92}}function yi(e,t){let n=t??vi(e),r=Math.max(14,e.size*.26),i=Math.max(8,e.size*.16);return{x:n.x-r,y:n.y-i,width:n.width+r*2,height:n.height+i*2,radius:Math.max(4,Math.min(10,e.size*.1))}}function bi({word:e,measuredBounds:t}){let n=yi(e,t);return(0,q.jsx)(`g`,{"data-export-ignore":`true`,children:(0,q.jsx)(`rect`,{x:n.x,y:n.y,width:n.width,height:n.height,rx:Math.min(n.radius,5),fill:`transparent`,stroke:`#38bdf8`,strokeOpacity:.96,strokeWidth:Math.max(1.6,e.size*.018),vectorEffect:`non-scaling-stroke`})})}function xi({word:e,measuredBounds:t}){let n=yi(e,t);return(0,q.jsx)(`g`,{"data-export-ignore":`true`,"data-pinned-frame":`true`,pointerEvents:`none`,children:(0,q.jsx)(`rect`,{x:n.x,y:n.y,width:n.width,height:n.height,rx:Math.min(n.radius,5),fill:`transparent`,stroke:`#123d2b`,strokeOpacity:.38,strokeWidth:Math.max(1.1,e.size*.014),strokeDasharray:`3 3`,vectorEffect:`non-scaling-stroke`})})}function Si({word:e,measuredBounds:t}){let n=yi(e,t),r=Wi(e.size*.12,6,11),i=n.x+n.width-r*.35,a=n.y+r*.25,o=r*1.1,s=e.protectPinnedArea?st:Be;return(0,q.jsxs)(`g`,{"data-export-ignore":`true`,"data-pin-mark":`true`,pointerEvents:`none`,transform:`translate(${i}, ${a})`,children:[(0,q.jsx)(`circle`,{r,fill:`#123d2b`,stroke:`white`,strokeWidth:1.4,vectorEffect:`non-scaling-stroke`}),(0,q.jsx)(s,{x:-o/2,y:-o/2,width:o,height:o,color:`white`,strokeWidth:2.35,"aria-hidden":`true`})]})}function Ci({word:e,measuredBounds:t}){return(0,q.jsxs)(`g`,{"data-export-ignore":`true`,"data-pin-overlay":`true`,pointerEvents:`none`,transform:`translate(${e.x}, ${e.y}) rotate(${Q(e)?0:e.rotate})`,children:[(0,q.jsx)(xi,{word:e,measuredBounds:t}),(0,q.jsx)(Si,{word:e,measuredBounds:t})]})}function wi({word:e,measuredBounds:t,onBeginTransform:n}){let r=yi(e,t),i=Q(e),a=Wi(e.size*.13,7,14),o=a+7,s=r.y+r.height,c=r.x,l=r.x+r.width,u=r.y,d=r.x+r.width/2,f=r.y+r.height/2,p=Math.max(20,r.width-Math.min(34,r.width*.16)),m=-(Wi(e.curve??0,-100,100)/100)*Math.min(p*.34,e.size*1.8),h=c-a*1.55,g=f,_=d,v=u-a*2.2,y=[{x:c,y:u,cursor:`nwse-resize`},{x:l,y:u,cursor:`nesw-resize`},{x:c,y:s,cursor:`nesw-resize`},{x:l,y:s,cursor:`nwse-resize`}],b=a*1.3,x=`fill-white stroke-emerald-400 dark:fill-slate-950 dark:stroke-emerald-300`,S=`text-emerald-500 dark:text-emerald-300`;return(0,q.jsxs)(`g`,{"data-export-ignore":`true`,children:[!i&&(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`path`,{d:`M ${-p/2} 0 Q 0 ${m} ${p/2} 0`,fill:`none`,stroke:`#38bdf8`,strokeOpacity:.76,strokeWidth:1.5,strokeDasharray:`4 3`,vectorEffect:`non-scaling-stroke`,pointerEvents:`none`}),(0,q.jsx)(`line`,{x1:c,y1:f,x2:h,y2:g,stroke:`#38bdf8`,strokeOpacity:.5,strokeWidth:1,vectorEffect:`non-scaling-stroke`,pointerEvents:`none`}),(0,q.jsxs)(`g`,{role:`button`,"aria-label":`Curve`,style:{cursor:`ns-resize`},onPointerDown:e=>n(e,`curve`),children:[(0,q.jsx)(`circle`,{cx:h,cy:g,r:o,fill:`transparent`}
6),(0,q.jsx)(`circle`,{cx:h,cy:g,r:a,className:x,strokeWidth:1.2}),(0,q.jsx)(Xe,{x:h-b/2,y:g-b/2,width:b,height:b,className:S,strokeWidth:2.2,pointerEvents:`none`,"aria-hidden":`true`})]})]}),!i&&(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`line`,{x1:d,y1:u,x2:_,y2:v,stroke:`#38bdf8`,strokeOpacity:.86,strokeWidth:1.3,vectorEffect:`non-scaling-stroke`,pointerEvents:`none`}),(0,q.jsxs)(`g`,{role:`button`,"aria-label":`Rotate`,style:{cursor:`grab`},onPointerDown:e=>n(e,`rotate`),children:[(0,q.jsx)(`circle`,{cx:_,cy:v,r:o,fill:`transparent`}),(0,q.jsx)(`circle`,{cx:_,cy:v,r:a,className:x,strokeWidth:1.2}),(0,q.jsx)(ot,{x:_-b/2,y:v-b/2,width:b,height:b,className:S,strokeWidth:2.2,pointerEvents:`none`,"aria-hidden":`true`})]})]}),y.map((e,t)=>(0,q.jsxs)(`g`,{role:`button`,"aria-label":`Scale`,style:{cursor:e.cursor},onPointerDown:e=>n(e,`scale`),children:[(0,q.jsx)(`circle`,{cx:e.x,cy:e.y,r:o,fill:`transparent`}),(0,q.jsx)(`circle`,{cx:e.x,cy:e.y,r:a,className:x,strokeWidth:1.45})]},`${e.x}:${e.y}:${t}`))]})}function Ti({word:e,fillOverride:t,textRef:n}){let r=_i(e)?.glyphs??[];return(0,q.jsx)(`g`,{ref:n,style:{fontSize:`${e.size}px`,fontFamily:ci(e.font),fontWeight:e.fontWeight??400,fontStyle:e.fontStyle??`normal`,fill:t??e.fill},children:r.map((e,t)=>e.char.trim().length>0&&(0,q.jsx)(`text`,{textAnchor:`middle`,dominantBaseline:`central`,transform:`translate(${e.x}, ${e.y}) rotate(${e.rotate})`,children:e.char},`${e.char}-${t}`))})}function Ei({word:e,fillOverride:t,textRef:n}){if(!e.outlinePath)return null;let r=pi(e),i=Math.abs(r-1)>1e-4?`scale(${r})`:void 0;return(0,q.jsx)(`path`,{ref:n,d:e.outlinePath,transform:i,fill:t??e.fill,"data-word-outline":`true`})}function Di({word:e,useMiddleBaseline:t,fillOverride:n,selected:r=!1,textRef:i}){return(e.curve??0)===0?(0,q.jsx)(`text`,{ref:i,textAnchor:`middle`,dominantBaseline:t?`middle`:void 0,style:{fontSize:`${e.size}px`,fontFamily:ci(e.font),fontWeight:e.fontWeight??400,fontStyle:e.fontStyle??`normal`,fill:n??e.fill},children:e.text}):(0,q.jsx)(Ti,{word:e,fillOverride:n,selected:r,textRef:i})}function Oi({word:e,useMiddleBaseline:t,fillOverride:n,selected:r=!1,textRef:i}){let a=Q(e)?se(e.text):null;return a?(0,q.jsx)(`image`,{ref:i,href:a,x:-e.size/2,y:-e.size/2,width:e.size,height:e.size,preserveAspectRatio:`xMidYMid meet`,"data-emoji-asset":`twemoji`,"data-emoji":e.text}):e.outlinePath?(0,q.jsx)(Ei,{word:e,fillOverride:n,selected:r,textRef:i}):(0,q.jsx)(Di,{word:e,useMiddleBaseline:t,fillOverride:n,selected:r,textRef:i})}function ki(e){let t=vi(e),n=Wi(e.size*.1,4,12),r=Wi(e.size*.06,2,8);return{x:t.x-n,y:t.y-r,width:t.width+n*2,height:t.height+r*2,radius:Wi(e.size*.04,2,5)}}function Ai({word:e,hasRenderableShape:t}){let n=ki(e);return(0,q.jsxs)(`g`,{"data-export-ignore":`true`,"data-word-hover-overlay":`true`,pointerEvents:`none`,"aria-hidden":`true`,transform:`translate(${e.x}, ${e.y}) rotate(${Q(e)?0:e.rotate})`,className:`shapewords-word-hover-overlay`,children:[(0,q.jsx)(`rect`,{"data-word-hover-plate":`true`,x:n.x,y:n.y,width:n.width,height:n.height,rx:n.radius,className:`fill-white stroke-slate-900/15`,fillOpacity:.82,strokeWidth:.8}),(0,q.jsx)(Oi,{word:e,useMiddleBaseline:Ji(e,t)})]})}function ji({word:e,useMiddleBaseline:t}){let n=Wi(e.size*.16,8,18),r={fill:`none`,stroke:`transparent`,strokeWidth:n,strokeLinecap:`round`,strokeLinejoin:`round`,vectorEffect:`non-scaling-stroke`,pointerEvents:`stroke`};if(Q(e)&&se(e.text)){let t=n/2;return(0,q.jsx)(`rect`,{x:-e.size/2-t,y:-e.size/2-t,width:e.size+t*2,height:e.size+t*2,fill:`transparent`,pointerEvents:`all`})}if(e.outlinePath){let t=pi(e),n=Math.abs(t-1)>1e-4?`scale(${t})`:void 0;return(0,q.jsx)(`path`,{d:e.outlinePath,transform:n,...r})}if((e.curve??0)!==0){let t=_i(e);return(0,q.jsx)(`g`,{style:{fontSize:`${e.size}px`,fontFamily:ci(e.font),fontWeight:e.fontWeight??400,fontStyle:e.fontStyle??`normal`},children:(t?.glyphs??[]).map((e,t)=>e.char.trim().length>0&&(0,q.jsx)(`text`,{textAnchor:`middle`,dominantBaseline:`central`,transform:`translate(${e.x}, ${e.y}) rotate(${e.rotate})`,...r,children:e.char},`${e.char}-${t}`))})}return(0,q.jsx)(`text`,{textAnchor:`middle`,dominantBaseline:t?`middle`:void 0,style:{fontSize:`${e.size}px`,fontFamily:ci(e.font),fontWeight:e.fontWeight??400,fontStyle:e.fontStyle??`normal`},...r,children:e.text})}function Mi(e,t){return[e.text,e.kind??`word`,t].join(`|`)}var Ni=(0,K.memo)(function({word:e,index:t,interactionsEnabled:n,hasRenderableShape:r,animationDelayMs:i,selectWordLabel:a,onBeginWordDrag:o,onSelectWord:s,onHoverChange:c}){let l=Ji(e,r),u=n=>{let r=n.getBoundingClientRect();
6c({index:t,text:e.text,wordKind:e.kind,anchorX:r.left+r.width/2,anchorTop:r.top,anchorBottom:r.bottom})};return(0,q.jsxs)(`g`,{transform:`translate(${e.x}, ${e.y}) rotate(${Q(e)?0:e.rotate})`,className:`shapewords-cloud-word`,"data-word-cloud-word":`true`,"data-word-appear":`true`,"data-word-text":e.text,onPointerDown:n?n=>o(n,t,e):void 0,tabIndex:n?0:void 0,role:n?`button`:void 0,"aria-label":n?a:void 0,style:{"--word-delay":`${i}ms`,cursor:n?`pointer`:`default`,transition:`opacity 0.15s`,outline:`none`},onPointerEnter:e=>{!n||e.pointerType===`touch`||u(e.currentTarget)},onPointerLeave:e=>{!n||e.pointerType===`touch`||c(null)},onFocus:n?e=>u(e.currentTarget):void 0,onBlur:n?()=>c(null):void 0,onKeyDown:r=>{n&&(r.key!==`Enter`&&r.key!==` `||(r.preventDefault(),r.stopPropagation(),s(t,e)))},children:[(0,q.jsx)(`g`,{"data-export-ignore":`true`,"aria-hidden":`true`,children:(0,q.jsx)(ji,{word:e,useMiddleBaseline:l})}),(0,q.jsx)(Oi,{word:e,useMiddleBaseline:l})]})});function Pi(e){return e.map(e=>({...e}))}function Fi(e){return{words:Pi(e.words),offset:{...e.offset},selectedWordIndex:e.selectedWordIndex}}function Ii(e,t,n){return{words:Pi(e),offset:{...t},selectedWordIndex:n}}function Li(e,t){return Object.keys(t).some(n=>e[n]!==t[n])}function Ri(e,t){return Jr.some(n=>t[n]!==void 0&&e[n]!==t[n])}function zi(e,t,n){let r=e[t];if(!r)return null;let i=Ri(r,n),a=i&&!!(r.outlinePath||r.outlineGlyphs||r.outlineBounds||r.outlineBaseSize);if(!Li(r,n)&&!a)return null;let o=e.slice();return o[t]={...r,...n,...i?{outlinePath:void 0,outlineGlyphs:void 0,outlineBounds:void 0,outlineBaseSize:void 0}:{}},o}function Bi(e,t){return e.text===t.text&&e.value===t.value&&(e.kind??`word`)===(t.kind??`word`)&&e.size===t.size&&e.x===t.x&&e.y===t.y&&e.rotate===t.rotate&&(e.curve??0)===(t.curve??0)&&e.font===t.font&&(e.fontStyleId??`regular`)===(t.fontStyleId??`regular`)&&(e.fontWeight??`400`)===(t.fontWeight??`400`)&&(e.fontStyle??`normal`)===(t.fontStyle??`normal`)&&(e.baseline??`alphabetic`)===(t.baseline??`alphabetic`)&&(e.outlinePath??``)===(t.outlinePath??``)&&(e.outlineBaseSize??0)===(t.outlineBaseSize??0)&&Math.abs((e.outlineBounds?.x??0)-(t.outlineBounds?.x??0))<.01&&Math.abs((e.outlineBounds?.y??0)-(t.outlineBounds?.y??0))<.01&&Math.abs((e.outlineBounds?.width??0)-(t.outlineBounds?.width??0))<.01&&Math.abs((e.outlineBounds?.height??0)-(t.outlineBounds?.height??0))<.01&&(e.pinId??``)===(t.pinId??``)&&(e.pinned??!1)===(t.pinned??!1)&&(e.pinStatus??`locked`)===(t.pinStatus??`locked`)&&(e.protectPinnedArea??!1)===(t.protectPinnedArea??!1)&&e.fill===t.fill}function Vi(e,t,n=!0){return n&&e.selectedWordIndex!==t.selectedWordIndex||e.offset.x!==t.offset.x||e.offset.y!==t.offset.y||e.words.length!==t.words.length?!1:e.words.every((e,n)=>Bi(e,t.words[n]))}function Hi(e,t){return Math.abs(e.x-t.x)<.5&&Math.abs(e.y-t.y)<.5&&Math.abs(e.width-t.width)<.5&&Math.abs(e.height-t.height)<.5}function Ui(e,t,n){return[t,e.text,e.kind??`word`,e.size,e.font,e.fontStyleId??`regular`,e.fontWeight??`400`,e.fontStyle??`normal`,e.curve??0,e.outlineBaseSize??0,e.outlinePath??``,n?`middle`:`baseline`].join(`|`)}function Wi(e,t,n){return t>n?(t+n)/2:Math.max(t,Math.min(n,e))}function Gi(e){let t=e%360;return t>180&&(t-=360),t<-180&&(t+=360),t}function Ki(e,t){return Math.atan2(e.y-t.y,e.x-t.x)*180/Math.PI}function qi(e,t,n){let r=e.x-t.x,i=e.y-t.y,a=-n*Math.PI/180,o=Math.cos(a),s=Math.sin(a);return{x:r*o-i*s,y:r*s+i*o}}function Ji(e,t){return t||e.baseline===`middle`}function Yi(e){return e.x!==void 0||e.y!==void 0||e.size!==void 0||e.rotate!==void 0||e.curve!==void 0||e.font!==void 0||e.fontStyleId!==void 0||e.fontWeight!==void 0||e.fontStyle!==void 0||e.baseline!==void 0||e.protectPinnedArea!==void 0}function Xi(e,t){return Math.abs(e.x-t.x)<.5&&Math.abs(e.y-t.y)<.5}function Zi(e){return e instanceof Element?!!e.closest([`input`,`textarea`,`select`,`button`,`[contenteditable="true"]`,`[role="textbox"]`,`[role="combobox"]`,`[data-canvas-keyboard-ignore="true"]`].join(`,`)):!1}function Qi(e,t,n,r,i=1){if(!r)return e;let a=r.offsetX+r.minX*r.scale,o=r.offsetY+r.minY*r.scale,s=a+r.width*r.scale,c=o+r.height*r.scale,l=Number.isFinite(i)&&i>0?i:1,u=t/l,d=n/l,f=(t-u)/2,p=(n-d)/2,m=f+u,h=p+d,g=Rr/l,_=(e,t,n,r,i)=>{let a=n-t,o=i-r;return a<=Math.max(0,o-g*2)?Wi(e,r+g-t,i-g-n):Wi(e,i-g-n,r+g-t)};return{x:_(e.x,a,s,f,m),y:_(e.y,o,c,p,h)}}function $i({onOpenSidebar:e,initialCloudOffset:t,presentationMode:n=!1}){let{t:r,i18n:i}=F(),{layoutWords:a,layoutProgress:o,layoutQuality:s,isGenerating:c,isAiProcessing:l,canvasWidth:u,canvasHeight:d,setCanvasSize:p,shapeType:m,customShapeDefinition:h,shapeBackgroun
6dColor:_,setLayoutWords:v,words:y,addWordItems:b,setIsAiProcessing:S,setAiError:C,generationRequestId:T,setWordFont:E,setWordRepeat:O,markPinnedLayoutChanged:A}=k(be(e=>({layoutWords:e.layoutWords,layoutProgress:e.layoutProgress,layoutQuality:e.layoutQuality,isGenerating:e.isGenerating,isAiProcessing:e.isAiProcessing,canvasWidth:e.canvasWidth,canvasHeight:e.canvasHeight,setCanvasSize:e.setCanvasSize,shapeType:e.shapeType,customShapeDefinition:e.customShapeDefinition,shapeBackgroundColor:e.shapeBackgroundColor,setLayoutWords:e.setLayoutWords,words:e.words,addWordItems:e.addWordItems,setIsAiProcessing:e.setIsAiProcessing,setAiError:e.setAiError,generationRequestId:e.generationRequestId,setWordFont:e.setWordFont,setWordRepeat:e.setWordRepeat,markPinnedLayoutChanged:e.markPinnedLayoutChanged}))),{hasPendingGeneration:M,canGenerate:te,requestGeneration:P}=Dr();Ne();let I=(0,K.useMemo)(()=>ee(m,h),[h,m]),L=(0,K.useMemo)(()=>wt(m,u,d,h),[d,u,h,m]),R=!!(I&&L),z=R,ie=(0,K.useRef)(null),{active:ae,cssFallback:oe,toggle:se}=D(ie),ce=(0,K.useRef)(null),le=(0,K.useRef)(null),ue=(0,K.useRef)({x:0,y:0}),[pe,me]=(0,K.useState)(1),[B,ge]=(0,K.useState)(()=>t??{x:0,y:0}),[V,ve]=(0,K.useState)(null),[ye,xe]=(0,K.useState)(null),[H,Se]=(0,K.useState)(null),[we,Oe]=(0,K.useState)([]),[ke,Ae]=(0,K.useState)([]),[U,Me]=(0,K.useState)(!1),[Pe,Fe]=(0,K.useState)(!1),[Ie,Le]=(0,K.useState)(()=>({mainAccent:!Zr(`mainAccent`),sparseFill:!Zr(`sparseFill`)})),[Re,ze]=(0,K.useState)(null),[Ue,We]=(0,K.useState)(!1),[qe,Je]=(0,K.useState)(null),Ye=(0,K.useRef)(0),[Ze,nt]=(0,K.useState)(null),[at,ot]=(0,K.useState)(()=>a.length>0?1:0),ct=(0,K.useRef)(!1),lt=(0,K.useRef)(null),ut=(0,K.useRef)(!1),dt=(0,K.useRef)(null),pt=(0,K.useRef)({hadWords:a.length>0,isGenerating:c}),W=V===null?null:a[V]??null,mt=H&&V!==H.index?a[H.index]??null:null,ht=!!(mt&&H&&mt.text===H.text&&mt.kind===H.wordKind),_t=s?.perceptualCoverageRatio??0,yt=y.length>0&&y.every(e=>e.repeat===!1),Ct=(0,K.useMemo)(()=>ti(y,a),[a,y]),Tt=!!(!n&&!c&&!M&&!Pe&&V===null&&y.length>=3&&a.length>=3&&R&&Ct&&!ri(Ct)),Et=!!(!n&&!c&&!M&&!Pe&&V===null&&a.length>0&&R&&yt&&_t>0&&_t<Vr),Ot=Re===`mainAccent`&&Tt,kt=Re===`sparseFill`&&Et,At=Ot||kt,It=c&&o!==null,Lt=a.length>0||c,Rt=o?.phase===`assigning-fonts`||o?.phase===`loading-fonts`||o?.phase===`preparing`||o?.phase===`preparing-outline`,zt=o?.phase===`assigning-fonts`?r(`canvas.assigningFontsProgress`):o?.phase===`loading-fonts`?r(`canvas.loadingFontsProgress`):o?.phase===`preparing-outline`?r(`canvas.preparingOutlineProgress`):r(Rt?`canvas.prepareProgress`:`canvas.fillProgress`),Bt=o?.phase===`assigning-fonts`?r(`canvas.progressAssigningFonts`):o?.phase===`loading-fonts`?r(`canvas.progressLoadingFonts`):o?.phase===`preparing-outline`?r(`canvas.progressPreparingOutline`):r(`canvas.progressPreparing`),Vt=Math.max(0,Math.min(100,o?.percent??0)),Ht=o?.target??0,Ut=c?Math.max(a.length,o?.placed??0):a.length,Wt=L?L.offsetX+B.x:0,Gt=L?L.offsetY+B.y:0,Kt=we.length>0,qt=ke.length>0,Jt=(0,K.useRef)(null),Yt=(0,K.useRef)(null),[Xt,Zt]=(0,K.useState)(null),Qt=W&&V!==null?Ui(W,V,Ji(W,R)):``,$t=ye?.key===Qt?ye.bounds:null,en=(0,K.useMemo)(()=>new Map(y.map(e=>[`${e.kind??`word`}:${e.text}`,e])),[y]),tn=(0,K.useMemo)(()=>W?en.get(`${W.kind??`word`}:${W.text}`)??null:null,[W,en]),nn=W?Te(W.text):null,rn=W?re(W.font):null,an=rn?g(rn,W?.fontStyleId):null,on=(0,K.useMemo)(()=>{if(!W||!rn||!nn)return[];let e=Ee(nn).filter(e=>je(e,W.text));return e.some(e=>e.family===rn.family)?e:[rn,...e]},[W,rn,nn]),sn=tn?.fontFamily??ai,[cn,ln]=(0,K.useState)(null),un=(0,K.useCallback)(async e=>{let t=k.getState().layoutWords[e];if(!t||Q(t))return;let n=re(t.font),r=g(n,t.fontStyleId);await Dt({family:n.family,styleId:r.id},t.text);let i=k.getState().layoutWords[e];if(!i||Q(i))return;let a=re(i.font),o=g(a,i.fontStyleId),s=i.fontWeight??o.weight,c=i.fontStyle??o.style,l=de(o.assets??a.fontAssets,i.text,s,c),{buildWordOutlineGeometry:u}=await G(()=>j(()=>import(`./outlineWordGeometry-gObrdTOL.js`),__vite__mapDeps([8,1,2]))),d=await u({family:a.family,assets:l,text:i.text,weight:s,style:c,size:i.size,curve:i.curve??0});if(!d)return;let f=k.getState().layoutWords,p=f[e];if(!p||p.text!==i.text||p.font!==i.font)return;let m=zi(f,e,{outlinePath:d.path,outlineGlyphs:d.glyphs,outlineBounds:d.bounds,outlineBaseSize:d.baseSize});m&&v(m)},[v]),dn=(0,K.useCallback)(e=>{if(!(!e||!Qt))try{let t=e.getBBox(),n={x:t.x,y:t.y,width:t.width,height:t.height};if(!Number.isFinite(n.x)||!Number.isFinite(n.y)||!Number.isFinite(n.width)||!Number.isFinite(n.height)||n.width<=0||n.height<=0)return;xe(e=>e?.key===Qt&&Hi(e.bounds,n)?e:{key:Qt,bounds:n})}catch{}},[Qt]);(0,K.useLayoutEffect)(()=>
6{if(!W||V===null)return;let e=0,t=0,n=()=>{let e=ie.current,t=Jt.current;if(!e||!t){Zt(null);return}let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();if(n.width<=0||n.height<=0||r.width<=0||r.height<=0){Zt(null);return}let i=n.width<520?8:12,a=Math.min(460,Math.max(240,n.width-i*2)),o=Math.max(160,n.height-i*2),s=n.width<520,c=W.pinStatus===`conflict`||cn?s?106:118:s?58:52,l=Yt.current?.getBoundingClientRect().height??c,u=Math.min(o,l),d=s?18:22,f=r.left-n.left+r.width/2,p=r.top-n.top-u-d,m=r.bottom-n.top+d,h=p>=i,g=m+u<=n.height-i,_=h||!g?`top`:`bottom`,v=_===`top`?p:m,y=Wi(f-a/2,i,Math.max(i,n.width-a-i)),b={left:y,top:Wi(v,i,Math.max(i,n.height-u-i)),width:a,maxHeight:o,arrowLeft:Wi(f-y,18,a-18),placement:_};Zt(e=>e&&e.placement===b.placement&&Math.abs(e.left-b.left)<.5&&Math.abs(e.top-b.top)<.5&&Math.abs(e.width-b.width)<.5&&Math.abs(e.maxHeight-b.maxHeight)<.5&&Math.abs(e.arrowLeft-b.arrowLeft)<.5?e:b)},r=()=>{window.cancelAnimationFrame(e),window.cancelAnimationFrame(t),e=window.requestAnimationFrame(()=>{n(),t=window.requestAnimationFrame(n)})};return r(),window.addEventListener(`resize`,r),()=>{window.cancelAnimationFrame(e),window.cancelAnimationFrame(t),window.removeEventListener(`resize`,r)}},[d,u,B.x,B.y,pe,Qt,$t?.height,$t?.width,W,cn,V]);let fn=(0,K.useCallback)((e,t)=>{let n=ce.current;if(!n)return null;let r=n.getBoundingClientRect(),i=n.viewBox.baseVal;return r.width<=0||r.height<=0||i.width<=0||i.height<=0?null:{x:i.x+(e-r.left)/r.width*i.width,y:i.y+(t-r.top)/r.height*i.height}},[]),J=(0,K.useCallback)((e=V)=>Ii(k.getState().layoutWords,ue.current,e),[V]),Y=(0,K.useCallback)(e=>{let t=Fi(e);v(t.words),ge(t.offset),Se(null),ve(t.selectedWordIndex!==null&&t.words[t.selectedWordIndex]?t.selectedWordIndex:null)},[v]),X=(0,K.useCallback)((e=J())=>{let t=e;Oe(e=>{let n=e[e.length-1];return n&&Vi(n,t)?e:[...e.slice(-(Lr-1)),t]}),Ae([])},[J]),pn=(0,K.useCallback)(()=>{let e=we[we.length-1];if(!e)return;let t=J();Oe(we.slice(0,-1)),Ae(e=>[t,...e].slice(0,Lr)),Y(e),ct.current=!1},[we,J,Y]),mn=(0,K.useCallback)(()=>{let e=ke[0];if(!e)return;let t=J();Ae(ke.slice(1)),Oe(e=>[...e.slice(-(Lr-1)),t]),Y(e),ct.current=!1},[ke,J,Y]),hn=(0,K.useCallback)((e,t)=>{let n=k.getState().layoutWords,r=n[e];if(!r)return;r.pinned&&Yi(t)&&(ut.current=!0);let i=zi(n,e,t);i&&v(i)},[v]),gn=(0,K.useCallback)(e=>{let t=k.getState().layoutWords,n=t[e];if(!n||n.pinned&&n.pinId)return!1;let r=zi(t,e,{pinId:n.pinId??oi(),pinned:!0,pinStatus:n.pinStatus??`locked`});return r?(v(r),ut.current=!0,!0):!1},[v]),Z=(0,K.useCallback)(()=>ut.current?(ut.current=!1,A(),!0):!1,[A]),vn=(0,K.useCallback)((e,t)=>{ct.current||=(X(),!0),gn(e),hn(e,t)},[gn,X,hn]),yn=(0,K.useCallback)(()=>{let e=V;if(ct.current=!1,Z(),e===null)return;let t=k.getState().layoutWords[e];!t||Q(t)||t.outlinePath||un(e).catch(e=>ln(e instanceof Error?e.message:String(e)))},[Z,un,V]),bn=(0,K.useCallback)((e,t)=>{if(V===null)return;let n=k.getState().layoutWords[V];if(!n||Q(n))return;let r=en.get(`${n.kind??`word`}:${n.text}`);if(!r)return;let i=e===ai?null:e,a=De({...r,fontFamily:i??void 0,fontStyleId:i?t??r.fontStyleId??n.fontStyleId:void 0},k.getState().fontFamily,k.getState().fontStyleId,k.getState().scriptFontOverrides,k.getState().fontAssignmentMode),o={font:a.fontFamily,fontStyleId:a.fontStyleId,fontWeight:a.fontWeight,fontStyle:a.fontStyle};ln(null),X(),gn(V),E(n.text,n.kind,i,i?a.fontStyleId:null),hn(V,o),ct.current=!1,Z(),un(V).catch(e=>ln(e instanceof Error?e.message:String(e)))},[Z,gn,X,un,V,E,en,hn]),xn=(0,K.useCallback)(()=>{if(V===null)return;let e=k.getState().layoutWords[V];if(!e||Q(e))return;let t=e.curve??0;vn(V,{curve:Math.abs(t)<8?40:t>0?-40:0}),yn()},[yn,V,vn]);(0,K.useEffect)(()=>{let e=ie.current;if(!e)return;let t=new ResizeObserver(e=>{let{width:t,height:n}=e[0].contentRect;t>100&&n>100&&p(Math.round(t),Math.round(n))});return t.observe(e),()=>t.disconnect()},[p]),(0,K.useEffect)(()=>{ue.current=B},[B]),(0,K.useEffect)(()=>{let e=window.setTimeout(()=>{ge(e=>{let t=Qi(e,u,d,L,pe);return Xi(e,t)?e:t})},0);return()=>window.clearTimeout(e)},[d,u,pe,L]),(0,K.useEffect)(()=>
6{if(!c)return;le.current=null,ct.current=!1;let e=window.setTimeout(()=>{Oe([]),Ae([])},0);return()=>window.clearTimeout(e)},[c]),(0,K.useEffect)(()=>{let e=a.length>0,t=pt.current;e&&(!t.hadWords||t.isGenerating&&!c)&&ot(e=>e+1),pt.current={hadWords:e,isGenerating:c}},[c,a.length]),(0,K.useEffect)(()=>{nt(null)},[T]),(0,K.useEffect)(()=>{if(Re){(Re===`mainAccent`?Tt:Et)||(Ye.current++,ze(null));return}let e=Ie.mainAccent&&Tt?`mainAccent`:Ie.sparseFill&&Et?`sparseFill`:null;e&&(Qr(e),Le(t=>({...t,[e]:!1})),ze(e))},[Re,Ie.mainAccent,Ie.sparseFill,Tt,Et]);let Sn=(0,K.useCallback)(()=>{Ye.current++,ze(null)},[]);(0,K.useEffect)(()=>()=>{Ye.current++},[]);let Cn=(0,K.useCallback)(e=>{e.preventDefault(),me(t=>Math.max(.3,Math.min(3,t-e.deltaY*.001)))},[]),wn=()=>{P()},Tn=(0,K.useCallback)(async()=>{if(Ue)return;let e=k.getState(),t=ti(e.words,e.layoutWords),n=wt(e.shapeType,e.canvasWidth,e.canvasHeight,e.customShapeDefinition);if(!t||!n)return;let i=++Ye.current;We(!0),Je(null);try{let r=Wr.has(e.shapeType)||n.width/Math.max(1,n.height)<.78||Array.from(t.word.text).length>28,a=await Pr(t.word.text,t.word.font,r),o=k.getState();if(i!==Ye.current||o.words!==e.words||o.layoutWords!==e.layoutWords||o.shapeType!==e.shapeType||o.customShapeDefinition!==e.customShapeDefinition||o.canvasWidth!==e.canvasWidth||o.canvasHeight!==e.canvasHeight||o.generationRequestId!==e.generationRequestId)return;let s=ii(t,o.layoutWords,o.shapeType,n,a),c=zi(o.layoutWords,t.index,s.patch);if(!c)return;X(Ii(o.layoutWords,ue.current,null)),v(c),ut.current=!0,Z(),O(t.word.text,t.word.kind,!1),E(t.word.text,t.word.kind,a.family,s.fontStyleId),Sn(),ve(null),P()}catch{i===Ye.current&&Je(r(`canvas.mainAccentFontError`))}finally{We(!1)}},[Z,Sn,Ue,X,P,v,E,O,r]),En=(0,K.useCallback)(async()=>{if(!(l||y.length===0||_t<=0)){S(!0),C(null),nt(null);try{let e=$r(y.length,_t),t=await _n(y,i.language,e),n=k.getState().words,a=new Set(n.map(f)),o=e=>e.filter(e=>{let t=f(e);return a.has(t)?!1:(a.add(t),!0)}).map(e=>({...e,repeat:!1})),s=o(t),c=e>=8?Math.max(2,Math.round(e*.25)):1,l=s.filter(ei).length;if(l<c){let e=c-l,t=Math.max(8,Math.min(24,e*3)),r=await _n([...n,...s],i.language,t,{phraseMode:`phrases`,creativity:82});s=[...s,...o(r)]}if(s.length===0){let e=r(`canvas.sparseFillNoNewWords`);nt(e),C(e);return}b(s),Sn(),P()}catch(e){let t=e instanceof Error?e.message:String(e);nt(t),C(t)}finally{S(!1)}}},[b,_t,Sn,i.language,l,P,C,S,r,y]),Dn=(0,K.useCallback)(e=>{ie.current?.focus({preventScroll:!0}),!(e.pointerType===`mouse`&&e.button!==0)&&(ve(null),Se(null))},[]),On=(0,K.useCallback)((e,t,n)=>{if(e.pointerType===`mouse`&&e.button!==0)return;e.preventDefault(),e.stopPropagation();let r=fn(e.clientX,e.clientY);r&&(ie.current?.focus({preventScroll:!0}),ve(t),Se(null),le.current={kind:`word`,pointerId:e.pointerId,index:t,text:n.text,wordKind:n.kind,startPoint:r,startWord:{x:n.x,y:n.y},startSnapshot:J(t),wasPinned:n.pinned===!0,hasMoved:!1},ce.current?.setPointerCapture(e.pointerId))},[J,fn]),kn=(0,K.useCallback)((e,t,n,r)=>{if(e.pointerType===`mouse`&&e.button!==0)return;e.preventDefault(),e.stopPropagation();let i=fn(e.clientX,e.clientY);if(!i)return;ie.current?.focus({preventScroll:!0});let a={x:u/2+ue.current.x+n.x,y:d/2+ue.current.y+n.y};ve(t),Se(null),le.current={kind:`word-transform`,pointerId:e.pointerId,index:t,text:n.text,wordKind:n.kind,handle:r,startPoint:i,startSnapshot:J(t),wasPinned:n.pinned===!0,hasChanged:!1,center:a,startDistance:Math.max(1,Math.hypot(i.x-a.x,i.y-a.y)),startAngle:Ki(i,a),startLocalPoint:qi(i,a,Q(n)?0:n.rotate),startWord:{size:n.size,rotate:n.rotate,curve:n.curve??0}},ce.current?.setPointerCapture(e.pointerId)},[d,u,J,fn]),An=(0,K.useCallback)(()=>{dt.current!==null&&(window.clearTimeout(dt.current),dt.current=null)},[]),jn=(0,K.useCallback)(()=>{An(),dt.current=window.setTimeout(()=>{dt.current=null,Se(null)},120)},[An]);(0,K.useEffect)(()=>()=>An(),[An]),(0,K.useEffect)(()=>{An(),Se(null)},[An,B.x,B.y,c,pe,at]);let Mn=(0,K.useCallback)(e=>{if(!e){jn();return}n||(An(),Se(e))},[An,n,jn]),Nn=(0,K.useCallback)((e,t)=>{let n=k.getState().layoutWords[e];if(!n||n.text!==t.text||n.kind!==t.kind){Se(null);return}An(),Se(null),ve(e),ie.current?.focus({preventScroll:!0})},[An]),Pn=(0,K.useMemo)(()=>a.flatMap((e,t)=>V===t?[]:[(0,q.jsx)(Ni,{word:e,index:t,interactionsEnabled:!n,hasRenderableShape:R,animationDelayMs:Math.min(t*zr,Br),selectWordLabel:r(`canvas.selectWord`,{word:e.text}),onBeginWordDrag:On,onSelectWord:Nn,onHoverChange:Mn},`${at}|${Mi(e,t)}`)]),[On,Mn,R,a,n,Nn,V,r,at]),Fn=(0,K.useMemo)(()=>a.flatMap((e,t)=>e.pinned?[(0,q.jsx)(Ci,{word:e,measuredBounds:t===V?$t:void 0},`pin|${Mi(e,t)}`)]:[]),[a,$t,V]),In=(0,K.useCallback)(e=>{let t=le.current;if(!t||t.pointerId!==e.pointerId)return;e.preventDefault();let n=fn(e.clientX,e.clientY);if(!n)return;let r=n.x-t.startPoint.x,i=n.y-t.startPoint.y;if(t.kind===`word-transform`){if(!t.hasChanged&&Math.hypot(r,i)<1.5)return;if(t.hasChanged||(t.hasChanged=!0,t.wasPinned||gn(t.index)),t.handle===`scale`){let e=Math.max(1,Math.hypot(n.x-t.center.x,n.y-t.center.y)),r=Math.round(Wi(t.startWord.size*(e/t.startDistance),2,220));hn(t.index,{size:r});return}if(t.handle===`rotate`){let e=Gi(Ki(n,t.center)-t.startAngle),r=Math.round(Gi(t.startWord.rotate+e));hn(t.index,{rotate:r});return}let e=qi(n,t.center,t.startWord.rotate).y-t.startLocalPoint.y,a=Math.max(24,t.startWord.size*1.25),o=Math.round(Wi(t.startWord.curve-e/a*70,-100,100));hn(t.index,{curve:o});return}!t.hasMoved&&Math.hypot(r,i)<2||(t.hasMoved||(t.hasMoved=!0,t.wasPinned||gn(t.index)),hn(t.index,{x:t.startWord.x+r,y:t.startWord.y+i}))},[gn,fn,hn]),Ln=(0,K.useCallback)(e=>{let t=le.current;if(!t||t.pointerId!==e.pointerId)return;e.currentTarget.hasPointerCapture(e.pointerId)&&e.currentTarget.releasePointerCapture(e.pointerId);let n=J(),r=!Vi(t.startSnapshot,n,!1);r&&X(t.startSnapshot);let i=r&&t.kind===`word-transform`&&t.handle===`curve`,a=t.kind===`word-transform`?t.index:null;le.current=null,Z(),i&&a!==null&&un(a).catch(e=>ln(e instanceof Error?e.message:String(e)))},[Z,J,X,un]),Rn=(0,K.useCallback)(()=>{let e=lt.current;lt.current=null,e?.changed&&(X(e.startSnapshot),Z())},[Z,X]),zn=(0,K.useCallback)(()=>
6{if(V===null)return;Rn();let e=k.getState().layoutWords;if(!e[V]){ve(null);return}let t=e[V];X(Ii(e,ue.current,V)),v(e.filter((e,t)=>t!==V)),t.pinned&&(ut.current=!0,Z()),ve(null),Se(null),ct.current=!1},[Z,Rn,X,V,v]),Bn=(0,K.useCallback)((e,t)=>{if(V===null)return!1;let n=k.getState().layoutWords,r=n[V];if(!r)return ve(null),lt.current=null,!1;let i=lt.current;(!i||i.index!==V||i.text!==r.text||i.wordKind!==r.kind)&&(lt.current={index:V,text:r.text,wordKind:r.kind,startSnapshot:Ii(n,ue.current,V),wasPinned:r.pinned===!0,changed:!1});let a=lt.current;return a?(!a.changed&&!a.wasPinned&&gn(V),a.changed=!0,Se(null),hn(V,{x:r.x+e,y:r.y+t}),!0):!1},[gn,V,hn]),Vn=(0,K.useCallback)(e=>{if(e.nativeEvent.isComposing||Zi(e.target)||V===null||e.altKey||e.ctrlKey||e.metaKey)return;let t=e.shiftKey?10:1,n={ArrowLeft:{x:-t,y:0},ArrowRight:{x:t,y:0},ArrowUp:{x:0,y:-t},ArrowDown:{x:0,y:t}}[e.key];if(n){e.preventDefault(),e.stopPropagation(),Bn(n.x,n.y);return}(e.key===`Delete`||e.key===`Backspace`)&&(e.preventDefault(),e.stopPropagation(),zn())},[zn,Bn,V]),Hn=(0,K.useCallback)(e=>{(e.key===`ArrowLeft`||e.key===`ArrowRight`||e.key===`ArrowUp`||e.key===`ArrowDown`)&&Rn()},[Rn]),Un=(0,K.useCallback)(e=>{e.relatedTarget instanceof Node&&e.currentTarget.contains(e.relatedTarget)||Rn()},[Rn]),Wn=(0,K.useCallback)((e,t)=>{let n=k.getState().layoutWords,r=n[e];if(!r||t&&(r.text!==t.text||r.kind!==t.kind)){Se(null);return}Rn(),X();let i=!r.pinned,a=zi(n,e,{pinId:i?r.pinId??oi():void 0,pinned:i?!0:void 0,pinStatus:i?r.pinStatus??`locked`:void 0,protectPinnedArea:i&&r.protectPinnedArea?!0:void 0});a&&(v(a),ut.current=!0,Z()),ct.current=!1},[Z,Rn,X,v]),Gn=()=>{!W||V===null||Wn(V,W)},Kn=()=>{if(!W?.pinned||V===null||Q(W))return;let e=k.getState().layoutWords,t=e[V];if(!t?.pinned)return;X();let n=zi(e,V,{protectPinnedArea:t.protectPinnedArea?void 0:!0});n&&(v(n),ut.current=!0,Z()),ct.current=!1};return(0,q.jsxs)(`div`,{ref:ie,className:w(`relative flex-1 min-h-0 min-w-0 touch-none overflow-hidden rounded-lg border border-slate-200 bg-white outline-none dark:border-slate-700 dark:bg-slate-800 sm:rounded-xl`,oe&&`fixed inset-0 z-[70] rounded-none border-0`),tabIndex:0,"aria-keyshortcuts":`ArrowUp ArrowDown ArrowLeft ArrowRight Delete Backspace`,onWheel:Cn,onKeyDown:Vn,onKeyUp:Hn,onBlur:Un,children:[!n&&(0,q.jsxs)(K.Suspense,{fallback:null,children:[(0,q.jsx)(Fr,{onOpenChange:Fe}),(0,q.jsx)(Ir,{cloudOffset:B,onOpenChange:Fe})]}),!n&&(0,q.jsxs)(`div`,{className:w(`absolute right-2 top-12 z-10 flex gap-1 sm:right-3 sm:top-14`,Pe&&`hidden sm:flex`),"data-canvas-keyboard-ignore":`true`,children:[(0,q.jsx)(x,{onClick:pn,disabled:c||!Kt,type:`button`,variant:`outline`,size:`icon-sm`,className:qr,"aria-label":r(`canvas.undo`),title:r(`canvas.undo`),children:(0,q.jsx)(rt,{size:16})}),(0,q.jsx)(x,{onClick:mn,disabled:c||!qt,type:`button`,variant:`outline`,size:`icon-sm`,className:qr,"aria-label":r(`canvas.redo`),title:r(`canvas.redo`),children:(0,q.jsx)(Ke,{size:16})})]}),!n&&(0,q.jsxs)(`div`,{className:w(`absolute right-2 top-1/2 z-10 flex -translate-y-1/2 flex-col gap-1 sm:right-3`,Pe&&`hidden sm:flex`),"data-canvas-keyboard-ignore":`true`,children:[(0,q.jsx)(x,{onClick:()=>me(e=>Math.min(3,e+.2)),type:`button`,variant:`outline`,size:`icon-sm`,className:qr,"aria-label":`Zoom in`,children:(0,q.jsx)(et,{size:16})}),(0,q.jsx)(x,{onClick:()=>me(e=>Math.max(.3,e-.2)),type:`button`,variant:`outline`,size:`icon-sm`,className:qr,"aria-label":`Zoom out`,children:(0,q.jsx)(it,{size:16})})]}),!n&&(0,q.jsxs)(`div`,{className:w(`absolute right-2 top-2 z-10 flex gap-1 sm:right-3 sm:top-3`,Pe&&`hidden sm:flex`),"data-canvas-keyboard-ignore":`true`,children:[(0,q.jsx)(x,{onClick:wn,disabled:M?!te:c,type:`button`,variant:M?`default`:`outline`,size:`icon-sm`,className:w(`backdrop-blur-sm`,M?`bg-emerald-600 text-white shadow-sm shadow-emerald-500/25 hover:bg-emerald-700 dark:bg-emerald-600 dark:text-white dark:hover:bg-emerald-700`:`bg-white/85 text-slate-500 dark:bg-slate-800/85`),"aria-label":r(M?`canvas.generate`:`canvas.regenerate`),title:r(M?`canvas.generate`:`canvas.regenerate`),children:M?(0,q.jsx)(_e,{size:16}):(0,q.jsx)(Ft,{size:16,className:c?`animate-spin`:``})}),(0,q.jsx)(x,{onClick:()=>Me(e=>!e),type:`button`,variant:U?`secondary`:`outline`,size:`icon-sm`,className:w(`backdrop-blur-sm`,U?`bg-emerald-50/90 text-emerald-700 hover:bg-emerald-100 dark:bg-emerald-950/80 dark:text-emerald-200`:`bg-white/85 text-slate-500 dark:bg-slate-800/85`),"aria-label":r(U?`canvas.hideGrid`:`canvas.showGrid`),title:r(U?`canvas.hideGrid`:`canvas.showGrid`),"aria-pressed":U,children:(0,q.jsx)(He,{size:16})}),(0,q.jsx)(x,{onClick:se,type:`button`,variant:`outline`,size:`icon-sm`,className:qr,"aria-label":r(`canvas.fullscreen`),children:ae?(0,q.jsx)(N,{size:16}):(0,q.jsx)(ne,{size:16})})]}),It&&(0,q.jsxs)(`div`,{className:`pointer-events-none absolute left-3 right-3 top-24 z-20 rounded-lg border border-slate-200/80 bg-white/90 px-3 py-2 shadow-sm backdrop-blur-sm dark:border-slate-700/80 dark:bg-slate-900/85 sm:left-4 sm:right-28 sm:top-4`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Vt,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 text-xs font-medium text-slate-600 dar
6k:text-slate-300`,children:[(0,q.jsx)(`span`,{children:zt}),(0,q.jsxs)(`span`,{className:`tabular-nums text-slate-500 dark:text-slate-400`,children:[Vt,`%`]})]}),(0,q.jsxs)(`div`,{className:`relative mt-2 h-1.5 overflow-hidden rounded-full bg-slate-100 dark:bg-slate-800`,children:[(0,q.jsx)(`div`,{className:w(`h-full rounded-full transition-[width] duration-200 ease-out`,Rt?`bg-emerald-400/75 dark:bg-emerald-300/75`:`bg-emerald-500`),style:{width:`${Math.max(Rt?8:0,Vt)}%`}}),Rt&&(0,q.jsx)(`div`,{className:`shapewords-prepare-sheen absolute inset-y-0 w-1/2 rounded-full bg-gradient-to-r from-transparent via-white/80 to-transparent dark:via-white/45`})]}),(0,q.jsx)(`div`,{className:`mt-1 text-[11px] tabular-nums text-slate-400 dark:text-slate-500`,children:Rt?Bt:Ht>0?r(`canvas.progressWords`,{placed:o?.placed??0,target:Ht}):(o?.placed??0)>0?r(`canvas.progressPlaced`,{placed:o?.placed??0}):r(`canvas.progressPreparing`)})]}),Ot&&Ct&&(0,q.jsxs)(`div`,{"data-export-ignore":`true`,"data-canvas-keyboard-ignore":`true`,className:`absolute bottom-2 left-2 right-2 z-20 rounded-xl border border-slate-200/90 bg-white/95 p-3 shadow-lg shadow-slate-950/10 backdrop-blur-md dark:border-slate-700/90 dark:bg-slate-900/95 sm:bottom-3 sm:left-3 sm:right-auto sm:w-[24rem]`,role:`status`,"aria-live":`polite`,children:[(0,q.jsxs)(`div`,{className:`flex items-start gap-2.5`,children:[(0,q.jsx)(`div`,{className:`mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-lg bg-emerald-50 text-emerald-600 ring-1 ring-emerald-100 dark:bg-emerald-950/55 dark:text-emerald-300 dark:ring-emerald-900/70`,children:(0,q.jsx)(Pt,{size:16,"aria-hidden":`true`})}),(0,q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,q.jsx)(`div`,{className:`text-xs font-semibold text-slate-700 dark:text-slate-100`,children:r(`canvas.mainAccentTitle`)}),(0,q.jsx)(`p`,{className:`mt-0.5 text-[11px] leading-4 text-slate-500 dark:text-slate-400`,children:r(`canvas.mainAccentDescription`,{word:Ct.word.text})})]}),(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`icon-sm`,className:`-mr-1 -mt-1 shrink-0 rounded-md text-slate-400 hover:text-slate-700 dark:hover:text-slate-200`,"aria-label":r(`canvas.mainAccentDismiss`),onClick:Sn,children:(0,q.jsx)(vt,{size:14})})]}),qe&&(0,q.jsx)(`p`,{className:`mt-2 text-[11px] leading-4 text-red-600 dark:text-red-300`,role:`alert`,children:qe}),(0,q.jsxs)(x,{type:`button`,size:`sm`,className:`mt-2.5 h-8 w-full justify-center rounded-lg text-xs`,disabled:Ue,onClick:()=>void Tn(),children:[Ue?(0,q.jsx)(bt,{size:14,className:`animate-spin`,"aria-hidden":`true`}):(0,q.jsx)(_e,{size:14,"aria-hidden":`true`}),r(Ue?`canvas.mainAccentProcessing`:`canvas.mainAccentAction`)]})]}),kt&&(0,q.jsxs)(`div`,{"data-export-ignore":`true`,"data-canvas-keyboard-ignore":`true`,className:`absolute bottom-2 left-2 right-2 z-20 rounded-xl border border-slate-200/90 bg-white/95 p-3 shadow-lg shadow-slate-950/10 backdrop-blur-md dark:border-slate-700/90 dark:bg-slate-900/95 sm:bottom-3 sm:left-3 sm:right-auto sm:w-[24rem]`,role:`status`,"aria-live":`polite`,children:[(0,q.jsxs)(`div`,{className:`flex items-start gap-2.5`,children:[(0,q.jsx)(`div`,{className:`mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-lg bg-emerald-50 text-emerald-600 ring-1 ring-emerald-100 dark:bg-emerald-950/55 dark:text-emerald-300 dark:ring-emerald-900/70`,children:(0,q.jsx)(_e,{size:16,"aria-hidden":`true`})}),(0,q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,q.jsx)(`div`,{className:`text-xs font-semibold text-slate-700 dark:text-slate-100`,children:r(`canvas.sparseFillTitle`)}),(0,q.jsx)(`p`,{className:`mt-0.5 text-[11px] leading-4 text-slate-500 dark:text-slate-400`,children:r(`canvas.sparseFillDescription`)})]}),(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`icon-sm`,className:`-mr-1 -mt-1 shrink-0 rounded-md text-slate-400 hover:text-slate-700 dark:hover:text-slate-200`,"aria-label":r(`canvas.sparseFillDismiss`),onClick:Sn,children:(0,q.jsx)(vt,{size:14})})]}),Ze&&(0,q.jsxs)(`div`,{className:`mt-2 flex items-start gap-1.5 rounded-lg bg-red-50 px-2 py-1.5 text-[11px] leading-4 text-red-600 dark:bg-red-950/35 dar
6k:text-red-300`,children:[(0,q.jsx)(fe,{size:13,className:`mt-0.5 shrink-0`,"aria-hidden":`true`}),(0,q.jsx)(`span`,{children:Ze})]}),(0,q.jsxs)(x,{type:`button`,size:`sm`,className:`mt-2.5 h-8 w-full justify-center rounded-lg text-xs`,disabled:l,onClick:()=>void En(),children:[l?(0,q.jsx)(bt,{size:14,className:`animate-spin`,"aria-hidden":`true`}):(0,q.jsx)(_e,{size:14,"aria-hidden":`true`}),r(l?`canvas.sparseFillProcessing`:`canvas.sparseFillAction`)]})]}),Lt&&(0,q.jsxs)(`div`,{"data-export-ignore":`true`,className:w(`pointer-events-none absolute bottom-2 right-2 z-10 rounded-lg border border-slate-200/80 bg-white/90 px-2 py-1.5 text-right shadow-sm backdrop-blur-sm dark:border-slate-700/80 dark:bg-slate-900/85 sm:bottom-3 sm:right-3 sm:px-3 sm:py-2`,At?`hidden`:W&&`hidden sm:block`),"aria-live":`polite`,children:[(0,q.jsx)(`div`,{className:`text-[11px] font-medium text-slate-400 dark:text-slate-500`,children:r(`canvas.shapeWordCountLabel`)}),(0,q.jsx)(Ce,{variant:`secondary`,className:`mt-0.5 text-lg font-semibold leading-none tabular-nums`,children:Ut})]}),!n&&pe!==1&&(0,q.jsxs)(x,{onClick:()=>me(1),type:`button`,variant:`outline`,size:`sm`,className:w(`absolute right-2 z-10 h-7 bg-white/85 text-xs text-slate-500 backdrop-blur-sm dark:bg-slate-800/85 sm:right-3`,Lt?`bottom-14 sm:bottom-16`:`bottom-2 sm:bottom-3`),children:[Math.round(pe*100),`%`]}),c&&a.length===0&&(0,q.jsx)(`div`,{className:`pointer-events-none absolute inset-0 z-10 flex items-center justify-center bg-white/35 dark:bg-slate-900/35`,children:(0,q.jsxs)(`div`,{className:`flex items-center gap-2 text-emerald-500`,children:[(0,q.jsx)(bt,{size:24,className:`animate-spin`}),(0,q.jsx)(`span`,{className:`text-sm font-medium`,children:r(`canvas.generating`)})]})}),a.length===0&&!c&&(0,q.jsx)(`div`,{"data-export-ignore":`true`,className:`pointer-events-none absolute inset-0 z-10 flex items-center justify-center px-4 py-24 sm:px-6`,children:(0,q.jsxs)(`div`,{className:`pointer-events-auto flex w-[min(21rem,calc(100vw-2rem))] flex-col items-center rounded-2xl border border-emerald-200/80 bg-white/92 px-3 py-4 text-center shadow-xl shadow-slate-950/7 backdrop-blur-md dark:border-emerald-900/60 dark:bg-slate-900/88 sm:w-full sm:max-w-[24rem] sm:px-5 sm:py-5`,children:[(0,q.jsx)(`div`,{className:`mb-3 flex size-10 items-center justify-center rounded-xl bg-emerald-50 text-emerald-500 ring-1 ring-emerald-100 dark:bg-emerald-950/50 dark:text-emerald-300 dark:ring-emerald-900/70`,children:(0,q.jsx)(he,{size:19})}),(0,q.jsx)(`div`,{className:`text-sm font-semibold text-slate-700 dark:text-slate-100`,children:r(`canvas.emptyTitle`)}),(0,q.jsxs)(`div`,{className:`mt-1 text-xs leading-5 text-slate-500 dark:text-slate-400`,children:[(0,q.jsx)(`span`,{className:`hidden lg:inline`,children:r(`canvas.emptyDesktopDescription`)}),(0,q.jsx)(`span`,{className:`lg:hidden`,children:r(`canvas.emptyMobileDescription`)})]}),e&&(0,q.jsxs)(x,{type:`button`,onClick:e,variant:`outline`,size:`sm`,className:`mt-3 w-full min-w-0 justify-center overflow-hidden border-emerald-200/80 bg-white/70 px-2 text-xs text-emerald-700 hover:bg-emerald-50 dark:border-emerald-900/60 dark:bg-slate-900/70 dark:text-emerald-200 dark:hover:bg-emerald-950/50 lg:hidden`,"aria-label":r(`canvas.openMenuHint`),children:[(0,q.jsx)(tt,{size:14,className:`shrink-0`}),(0,q.jsx)(`span`,{className:`min-w-0 truncate`,children:r(`canvas.openMenuHint`)}),(0,q.jsx)(Ve,{size:14,className:`shrink-0`})]})]})}),W&&V!==null&&Xt&&(0,q.jsx)(`div`,{ref:Yt,"data-export-ignore":`true`,"data-canvas-keyboard-ignore":`true`,className:`absolute z-30 overflow-hidden rounded-xl border border-slate-200/90 bg-white/95 p-0.5 shadow-xl shadow-slate-950/12 backdrop-blur-md dark:border-slate-700/90 dark:bg-slate-900/95`,style:{left:Xt.left,top:Xt.top,width:Xt.width,maxHeight:Xt.maxHeight,touchAction:`auto`},onPointerDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),onWheel:e=>e.stopPropagation(),children:(0,q.jsxs)(`div`,{className:`relative z-10 grid gap-1.5`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1 overflow-x-auto overscroll-x-contain px-1 py-1`,children:[!Q(W)&&rn&&an&&(0,q.jsxs)(xt,{value:sn,onValueChange:e=>bn(e),children:[(0,q.jsxs)(St,{"data-qa":`selected-word-font-trigger`,className:`h-9 w-auto shrink-0 gap-2 rounded-lg border-transparent bg-transparent px-2.5 text-sm font-medium text-slate-600 shadow-none hover:bg-slate-100 focus:ring-0 data-[state=open]:bg-slate-100 dar
6k:text-slate-300 dark:hover:bg-slate-800 dark:data-[state=open]:bg-slate-800`,size:`sm`,"aria-label":r(`canvas.wordFont`),title:r(`canvas.wordFont`),children:[(0,q.jsx)(Pt,{size:17,className:`shrink-0 text-slate-500 dark:text-slate-400`}),(0,q.jsx)(`span`,{className:`min-w-0 max-w-[6rem] truncate`,children:sn===ai?r(`style.autoFont`):rn.label})]}),(0,q.jsxs)(jt,{className:`w-[min(22rem,var(--radix-select-trigger-width))]`,children:[(0,q.jsx)(Nt,{value:ai,children:r(`style.autoFont`)}),on.map(e=>(0,q.jsx)(Nt,{value:e.family,textValue:e.label,className:`h-10 pr-8`,children:(0,q.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-2`,children:[(0,q.jsx)(`span`,{className:`sr-only`,children:e.label}),(0,q.jsx)(di,{font:e}),e.source===`custom`&&(0,q.jsx)(`span`,{className:`rounded border border-amber-200 bg-amber-50 px-1.5 py-0.5 text-[0.62rem] uppercase tracking-wide text-amber-700 dark:border-amber-800 dark:bg-amber-950/40 dark:text-amber-300`,children:`custom`})]})},e.id))]})]}),!Q(W)&&rn&&an&&sn!==ai&&rn.styles.length>1&&(0,q.jsxs)(xt,{value:an.id,onValueChange:e=>bn(rn.family,e),children:[(0,q.jsx)(St,{"data-qa":`selected-word-font-style-trigger`,className:`h-9 w-auto shrink-0 rounded-lg border-transparent bg-transparent px-2.5 text-sm font-medium text-slate-600 shadow-none hover:bg-slate-100 focus:ring-0 data-[state=open]:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800 dark:data-[state=open]:bg-slate-800`,size:`sm`,"aria-label":r(`canvas.wordFont`),title:r(`canvas.wordFont`),children:(0,q.jsx)(Mt,{})}),(0,q.jsx)(jt,{children:rn.styles.map(e=>(0,q.jsx)(Nt,{value:e.id,children:e.label},e.id))})]}),(0,q.jsx)(x,{type:`button`,onClick:Gn,variant:`ghost`,className:w(`h-9 w-9 shrink-0 rounded-lg p-0`,W.pinned?`bg-emerald-50 text-emerald-700 hover:bg-emerald-100 dark:bg-emerald-950/55 dark:text-emerald-200 dark:hover:bg-emerald-900/70`:`text-slate-600 hover:bg-slate-100 hover:text-slate-900 dark:text-slate-300 dark:hover:bg-slate-800 dark:hover:text-slate-100`),"aria-label":W.pinned?r(`canvas.unpinWord`):r(`canvas.pinWord`),title:W.pinned?r(`canvas.unpinWord`):r(`canvas.pinWord`),children:W.pinned?(0,q.jsx)(Ge,{size:17}):(0,q.jsx)(Be,{size:17})}),W.pinned&&!Q(W)&&(0,q.jsx)(x,{type:`button`,onClick:Kn,variant:`ghost`,className:w(`h-9 w-9 shrink-0 rounded-lg p-0`,W.protectPinnedArea?`bg-emerald-50 text-emerald-700 hover:bg-emerald-100 dark:bg-emerald-950/55 dark:text-emerald-200 dark:hover:bg-emerald-900/70`:`text-slate-600 hover:bg-slate-100 hover:text-slate-900 dark:text-slate-300 dark:hover:bg-slate-800 dark:hover:text-slate-100`),"aria-pressed":W.protectPinnedArea===!0,"aria-label":W.protectPinnedArea?r(`canvas.unprotectPinnedArea`):r(`canvas.protectPinnedArea`),title:W.protectPinnedArea?r(`canvas.unprotectPinnedArea`):r(`canvas.protectPinnedArea`),children:W.protectPinnedArea?(0,q.jsx)(st,{size:17}):(0,q.jsx)($e,{size:17})}),(0,q.jsxs)(`label`,{className:`relative flex h-9 shrink-0 cursor-pointer items-center gap-2 overflow-hidden rounded-lg px-2.5 text-sm font-medium text-slate-600 transition-colors hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800`,"aria-label":r(`canvas.wordColor`),title:r(`canvas.wordColor`),children:[(0,q.jsx)(ft,{size:17,className:`shrink-0`}),(0,q.jsx)(`span`,{children:r(`canvas.wordColor`)}),(0,q.jsx)(`span`,{className:`size-3 rounded-full border border-white shadow-sm ring-1 ring-slate-200 dark:border-slate-950 dark:ring-slate-700`,style:{backgroundColor:W.fill},"aria-hidden":`true`}),(0,q.jsx)(`input`,{type:`color`,value:W.fill,onChange:e=>vn(V,{fill:e.target.value}),onBlur:yn,className:`absolute inset-0 cursor-pointer opacity-0`,"aria-label":r(`canvas.wordColor`)})]}),!Q(W)&&(0,q.jsxs)(x,{type:`button`,onClick:xn,variant:`ghost`,className:w(`h-9 shrink-0 rounded-lg px-2.5 text-sm font-medium`,(W.curve??0)===0?`text-slate-600 hover:bg-slate-100 hover:text-slate-900 dark:text-slate-300 dark:hover:bg-slate-800 dark:hover:text-slate-100`:`bg-emerald-50 text-emerald-700 hover:bg-emerald-100 dark:bg-emerald-950/45 dark:text-emerald-200 dark:hover:bg-emerald-900/65`),"aria-label":r(`canvas.wordCurve`),title:r(`canvas.wordCurve`),children:[(0,q.jsx)(Xe,{size:17}),(0,q.jsx)(`span`,{children:r(`canvas.wordCurve`)})]}),(0,q.jsx)(x,{type:`button`,onClick:zn,variant:`ghost`,className:`h-9 shrink-0 rounded-lg px-2.5 text-sm font-medium text-slate-600 hover:bg-red-50 hover:text-red-600 dark:text-slate-300 dark:hover:bg-red-950/40 dark:hover:text-red-300`,"aria-label":r(`canvas.deleteWord`),title:r(`canvas.deleteWord`),children:(0,q.jsx)(gt,{size:17})})]}),W.pinStatus===`conflict`&&(0,q.jsxs)(`div`,{className:`flex items-start gap-1.5 rounded-lg border border-amber-200 bg-amber-50 px-2 py-1.5 text-[11px] leading-4 text-amber-800 dark:border-amber-900/70 dark:bg-amber-950/35 dar
6k:text-amber-200`,children:[(0,q.jsx)(fe,{size:13,className:`mt-0.5 shrink-0`}),(0,q.jsx)(`span`,{children:r(`canvas.pinConflict`)})]}),cn&&(0,q.jsxs)(`div`,{className:`flex items-start gap-1.5 rounded-lg border border-amber-200 bg-amber-50 px-2 py-1.5 text-[11px] leading-4 text-amber-800 dark:border-amber-900/70 dark:bg-amber-950/35 dark:text-amber-200`,children:[(0,q.jsx)(fe,{size:13,className:`mt-0.5 shrink-0`}),(0,q.jsx)(`span`,{children:cn})]})]})}),(0,q.jsxs)(`svg`,{ref:ce,id:`word-cloud-svg`,width:u,height:d,viewBox:`0 0 ${u} ${d}`,"data-pan-x":B.x,"data-pan-y":B.y,style:{transform:`scale(${pe})`,transformOrigin:`center center`,transformBox:`fill-box`,transition:`transform 0.1s ease-out`,maxWidth:`100%`,maxHeight:`100%`,display:`block`,overflow:`visible`,touchAction:`none`,cursor:`default`},onPointerDown:Dn,onPointerMove:In,onPointerUp:Ln,onPointerCancel:Ln,role:n?`img`:`group`,"aria-label":a.length>0?`Word cloud: ${a.slice(0,10).map(e=>e.text).join(`, `)}`:r(`canvas.emptyTitle`),children:[(0,q.jsxs)(`defs`,{children:[(0,q.jsx)(`pattern`,{id:`canvas-grid-pattern`,"data-export-ignore":`true`,width:24,height:24,patternUnits:`userSpaceOnUse`,children:(0,q.jsx)(`path`,{d:`M 24 0 L 0 0 0 24`,fill:`none`,className:`stroke-slate-300 dark:stroke-slate-600`,strokeWidth:.6,opacity:.55,vectorEffect:`non-scaling-stroke`})}),I&&L&&(0,q.jsx)(`clipPath`,{id:`shape-clip`,children:(0,q.jsx)(`path`,{d:I.path,transform:`translate(${Wt},${Gt}) scale(${L.scale})`,fillRule:I.fillRule,clipRule:I.fillRule})})]}),(a.length>0||c)&&I&&L&&(0,q.jsxs)(q.Fragment,{children:[_!==`transparent`&&(0,q.jsx)(`path`,{d:I.path,transform:`translate(${Wt},${Gt}) scale(${L.scale})`,fillRule:I.fillRule,clipRule:I.fillRule,fill:_,opacity:.42}),z&&(0,q.jsx)(`path`,{d:I.path,transform:`translate(${Wt},${Gt}) scale(${L.scale})`,fill:`none`,className:`stroke-slate-300 dark:stroke-slate-500`,strokeWidth:1.1/L.scale,opacity:.72})]}
6),U&&(0,q.jsx)(`rect`,{"data-export-ignore":`true`,x:0,y:0,width:u,height:d,fill:`url(#canvas-grid-pattern)`,pointerEvents:`none`,opacity:.72}),a.length>0&&(0,q.jsx)(`g`,{clipPath:R?`url(#shape-clip)`:void 0,children:(0,q.jsxs)(`g`,{transform:`translate(${u/2+B.x}, ${d/2+B.y})`,children:[Pn,!n&&ht&&mt&&(0,q.jsx)(Ai,{word:mt,hasRenderableShape:R},`hover|${Mi(mt,H.index)}`),W&&V!==null&&(0,q.jsxs)(`g`,{ref:Jt,"data-selected-word":`true`,transform:`translate(${W.x}, ${W.y}) rotate(${Q(W)?0:W.rotate})`,onPointerDown:e=>On(e,V,W),tabIndex:0,"aria-label":r(`canvas.selectWord`,{word:W.text}),style:{cursor:`grab`,outline:`none`},children:[(0,q.jsx)(bi,{word:W,measuredBounds:$t}),(0,q.jsx)(Oi,{word:W,useMiddleBaseline:Ji(W,R),selected:!0,textRef:dn}),(0,q.jsx)(wi,{word:W,measuredBounds:$t,onBeginTransform:(e,t)=>kn(e,V,W,t)})]},`selected|${Mi(W,V)}`)]})}),Fn.length>0&&(0,q.jsx)(`g`,{transform:`translate(${u/2+B.x}, ${d/2+B.y})`,children:Fn})]}),!n&&ht&&H&&mt&&(0,q.jsx)(`div`,{"data-export-ignore":`true`,"data-canvas-keyboard-ignore":`true`,"data-word-hover-actions":`true`,className:`fixed z-50`,style:{left:typeof window>`u`?H.anchorX:Wi(H.anchorX,40,Math.max(40,window.innerWidth-40)),top:H.anchorTop<52?H.anchorBottom:H.anchorTop,transform:H.anchorTop<52?`translateX(-50%)`:`translate(-50%, -100%)`},onPointerEnter:An,onPointerLeave:jn,onFocus:An,onBlur:jn,onPointerDown:e=>{e.stopPropagation(),An()},onClick:e=>e.stopPropagation(),onWheel:e=>e.stopPropagation(),children:(0,q.jsxs)(`div`,{className:`shapewords-word-hover-actions flex items-center gap-0.5 rounded-lg border border-slate-900/10 bg-white/85 p-1 text-slate-900 shadow-md shadow-slate-950/15 backdrop-blur-sm`,children:[(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`icon-sm`,"data-word-hover-action":`edit`,className:`rounded-md text-current hover:bg-slate-900/10 hover:text-current`,"aria-label":r(`canvas.editWord`,{word:mt.text}),onClick:()=>Nn(H.index,mt),children:(0,q.jsx)(Qe,{size:16})}),(0,q.jsx)(x,{type:`button`,variant:`ghost`,size:`icon-sm`,"data-word-hover-action":`pin`,className:w(`rounded-md hover:text-current`,mt.pinned?`bg-emerald-100/90 text-emerald-700 hover:bg-emerald-200/90`:`text-current hover:bg-slate-900/10`),"aria-label":mt.pinned?r(`canvas.unpinWord`):r(`canvas.pinWord`),"aria-pressed":mt.pinned===!0,onClick:()=>Wn(H.index,mt),children:mt.pinned?(0,q.jsx)(Ge,{size:16}):(0,q.jsx)(Be,{size:16})})]})})]})}function ea(e){return Ct(e)}function ta(e,t,n,r={}){let i=(e,t)=>({...e,fill:r.preserveExistingFill&&e.fill?e.fill:t});if(t.length===0)return e.map(e=>i(e,`#333`));switch(n){case`sequential`:return e.map((e,n)=>i(e,t[n%t.length]));case`random`:return e.map(e=>i(e,t[Math.floor(Math.random()*t.length)]));case`byFrequency`:{let n=[...e].sort((e,t)=>t.value-e.value),r=n[0]?.value||1,a=n[n.length-1]?.value||0,o=r-a||1;return e.map(e=>{let n=(e.value-a)/o;return i(e,t[Math.min(Math.floor(n*t.length),t.length-1)])})}}}var na=45;function ra(e,t){let n=Math.max(0,t-e);return n<=0?0:t<=48?Math.min(n,2):t<=120?Math.min(n,4):t<=260?Math.min(n,7):Math.min(n,12)}function ia(e,t){if(t.length===0)return[];let n=new Map(e.map(e=>[f(e),e.value])),r=new Map(e.map(e=>[f(e),e.sizeScale??1]));return t.filter(e=>e.pinned&&n.has(f(e))).map(e=>{let t=f(e),i=e.sizeScale??1,a=r.get(t)??1;return{...e,value:n.get(t)??e.value,size:Math.max(1,Math.round(e.size*(a/i))),sizeScale:a===1?void 0:a,pinned:!0,pinStatus:e.pinStatus??`locked`}})}function aa(e,t=2500){return new Promise(n=>{let r=window.setTimeout(n,t);e.catch(()=>void 0).finally(()=>{window.clearTimeout(r),n()})})}function oa(){return`fill`}function sa(){let{rawText:e,importedWords:n,includePhrases:i,smartImportOptions:a,languageProcessing:o,useStopWords:s,stopWordsLanguage:c,customStopWords:l,maxWords:u,setWords:d,words:f,pinnedLayoutRevision:m,setLayoutWords:h,setLayoutProgress:_,setLayoutQuality:v,preservedLayoutSignature:y,preservedColorSignature:b,setPreservedLayoutSignature:x,setPreservedColorSignature:S,fontFamily:C,fontStyleId:w,fontAssignmentMode:T,layoutPolicy:E,scriptFontOverrides:D,minFontSize:O,maxFontSize:A,padding:j,spiralType:M,rotations:N,canvasWidth:ee,canvasHeight:te,shapeType:F,customShapeDefinition:I,setIsGenerating:ne,isPreciseTextProcessing:L,isWordListProcessing:R,setIsPreciseTextProcessing:z,paletteIndex:ie,customPaletteColors:ae,colorMode:se,generationRequestId:ce}=k(be(e=>({rawText:e.rawText,importedWords:e.importedWords,includePhrases:e.includePhrases,smartImportOptions:e.smartImportOptions,languageProcessing:e.languageProcessing,useStopWords:e.useStopWords,stopWordsLanguage:e.stopWordsLanguage,customStopWords:e.customStopWords,maxWords:e.maxWords,setWords:e.setWords,words:e.words,pinnedLayoutRevision:e.pinnedLayoutRevision,setLayoutWords:e.setLayoutWords,setLayoutProgress:e.setLayoutProgress,setLayoutQuality:e.setLayoutQuality,preservedLayoutSignature:e.preservedLayoutSignature,preservedColorSignature:e.preservedColorSignature,setPreservedLayoutSignature:e.setPreservedLayoutSignature,setPreservedColorSignature:e.setPreservedColorSignature,fontFamily:e.fontFamily,fontStyleId:e.fontStyleId,fontAssignmentMode:e.fontAssignmentMode,layoutPolicy:e.layoutPolicy,scriptFontOverrides:e.scriptFontOverrides,minFontSize:e.minFontSize,maxFontSize:e.maxFontSize,padding:e.padding,spiralType:e.spiralType,rotations:e.rotations,canvasWidth:e.canvasWidth,canvasHeight:e.canvasHeight,shapeType:e.shapeType,customShapeDefinition:e.customShapeDefinition,setIsGenerating:e.setIsGenerating,isPreciseTextProcessing:e.isPreciseTextProcessing,isWordListProcessing:e.isWordListProcessing,setIsPreciseTextProcessing:e.setIsPreciseTextProcessing,paletteIndex:e.paletteIndex,customPaletteColors:e.customPaletteColors,colorMode:e.colorMode,generationRequestId:e.generationRequestId}))),le=(0,K.useRef)(0),ue=(0,K.useRef)(0),de=(0,K.useMemo)(()=>W(f),[f]),fe=(0,K.useMemo)(()=>mt({wordsSignature:de,fontFamily:C,fontStyleId:w,fontAssignmentMode:T,layoutPolicy:E,scriptFontOverrides:D,minFontSize:O,maxFontSize:A,padding:j,spiralType:M,rotations:N,maxWords:u,canvasWidth:ee,canvasHeight:te,shapeType:F,fillMode:oa(),customShapeDefinition:I,pinnedLayoutRevision:m}),[de,C,w,T,E,D,O,A,j,M,N,u,ee,te,F,I,m]),pe=dt({paletteIndex:ie,customPaletteColors:ae,colorMode:se});(0,K.useEffect)(()=>
6{if(n){z(!1),k.getState().words!==n&&d(n);return}if(k.getState().importedWords){z(!1);return}d(we(e,{useStopWords:s,stopWordsLanguage:c,customStopWords:l,maxWords:null,includePhrases:i,keepCase:a.keepCase,countFrequency:a.countFrequency,detectDuplicates:a.detectDuplicates,includeEmoji:a.includeEmoji,lemmatizeWords:a.lemmatizeWords,languageProcessing:o})),z(!1)},[e,n,i,a.keepCase,a.countFrequency,a.detectDuplicates,a.includeEmoji,a.lemmatizeWords,o,s,c,l,d,z]),(0,K.useEffect)(()=>{if(L||R)return;if(f.length===0){h([]),_(null),v(null),ne(!1),y!==null&&x(null),b!==null&&S(null);return}if(ce===0||ce===ue.current)return;ue.current=ce;let e=++le.current,n=k.getState().layoutWords;if(y===fe&&n.length>0){let e=P(ie,ae);h(ta(n.map(({text:e,value:t,kind:n,sizeScale:r,size:i,x:a,y:o,rotate:s,curve:c,font:l,fontStyleId:u,fontWeight:d,fontStyle:f,baseline:p,outlinePath:m,outlineGlyphs:h,outlineBounds:g,outlineBaseSize:_,pinId:v,pinned:y,pinStatus:b,protectPinnedArea:x})=>({text:e,value:t,kind:n,sizeScale:r,size:i,x:a,y:o,rotate:s,curve:c,font:l,fontStyleId:u,fontWeight:d,fontStyle:f,baseline:p,outlinePath:m,outlineGlyphs:h,outlineBounds:g,outlineBaseSize:_,pinId:v,pinned:y,pinStatus:b,protectPinnedArea:x})),e,se)),_(null),S(pe),ne(!1),t(`generate`);return}ne(!0),v(null),_({phase:`assigning-fonts`,percent:1,placed:0,target:0});let i=null,a=[],o=[],s=()=>e===le.current&&k.getState().generationRequestId===ce,c=()=>{let e=k.getState();return mt({wordsSignature:W(e.words),fontFamily:e.fontFamily,fontStyleId:e.fontStyleId,fontAssignmentMode:e.fontAssignmentMode,layoutPolicy:e.layoutPolicy,scriptFontOverrides:e.scriptFontOverrides,minFontSize:e.minFontSize,maxFontSize:e.maxFontSize,padding:e.padding,spiralType:e.spiralType,rotations:e.rotations,maxWords:e.maxWords,canvasWidth:e.canvasWidth,canvasHeight:e.canvasHeight,shapeType:e.shapeType,fillMode:oa(),customShapeDefinition:e.customShapeDefinition,pinnedLayoutRevision:e.pinnedLayoutRevision})},l=()=>s()&&c()===fe,d=()=>{i!==null&&(window.clearTimeout(i),i=null)},m=null,z=()=>{if(!m)return;let e=m;m=null,e()},de=()=>{if(i=null,!l()){z();return}let e=a.length+ra(a.length,o.length);if(e<=a.length){z();return}a=o.slice(0,e),h(a),a.length<o.length?i=window.setTimeout(de,na):z()},me=e=>{e.length<a.length&&(a=[],h([])),o=e,i===null&&de()},B=e=>new Promise(t=>{m=t,me(e),a.length>=o.length&&z()});return(async()=>{let e=!1;try{let t=ia(f,k.getState().layoutWords);h([]);let n=Ie(f,C,D,T,E,w);_({phase:`loading-fonts`,percent:4,placed:0,target:f.length}),await p([C,...n,...t.map(e=>e.font)]);let r=g(re(C),w);_({phase:`assigning-fonts`,percent:8,placed:0,target:f.length});let i=Fe(f,C,r.id,D,T,E);oe(E)&&(await p(Array.from(new Set(i.map(e=>e.fontFamily)))),i=Fe(f,C,r.id,D,T,E));let a=new Map;i.forEach(e=>{let t=`${e.fontFamily}|${e.fontStyleId??`regular`}`,n=a.get(t);a.set(t,{family:e.fontFamily,styleId:e.fontStyleId,text:n?`${n.text} ${e.text}`:e.text})}),_({phase:`loading-fonts`,percent:12,placed:0,target:i.length}),await Promise.all(Array.from(a.values()).map(e=>aa(Dt({family:e.family,styleId:e.styleId},e.text)))),_({phase:`preparing-outline`,percent:18,placed:0,target:i.length});let o=await ea({words:f,wordFonts:i,pinnedWords:t,width:ee,height:te,fontFamily:C,fontStyleId:r.id,layoutPolicy:E,minFontSize:O,maxFontSize:A,padding:j,spiralType:M,rotations:N,maxWords:u,shapeType:F,customShapeDefinition:I,fillMode:oa(),onQuality:e=>{l()&&v(e)},onProgress:(e,t)=>{if(!l())return;let{paletteIndex:n,customPaletteColors:r,colorMode:i}=k.getState(),a=P(n,r);e.length>0&&me(ta(e,a,i,{preserveExistingFill:!0})),t&&_(t)}});if(!l()){s()&&(d(),h([]),_(null));return}let{paletteIndex:c,customPaletteColors:m,colorMode:y}=k.getState();if(await B(ta(o,P(c,m),y,{preserveExistingFill:!0})),!l())return;_({phase:`complete`,percent:100,placed:o.length,target:k.getState().layoutProgress?.target??o.length}),x(fe),S(dt({paletteIndex:c,customPaletteColors:m,colorMode:y})),e=!0}catch{s()&&(d(),h([]),_(null),v(null))}finally{s()&&(ne(!1),e&&(t(`generate`),r(`cloud.generated`,ut())))}})(),()=>{d(),z()}},[ce,L,R,f,C,w,T,E,D,O,A,j,M,N,ee,te,F,I,u,m,fe,pe,y,b,h,_,v,ne,x,S,ie,ae,se])}var ca=`shapewords.starterWords.v3`,la=`shapewords.starterWords.seen.v3`,ua={en:`Hello`,ru:`Привет`,ar:`مرحبا`,es:`Hola`,fr:`Bonjour`,zh:`你好`},da={en:[{text:`welcome`,value:9,kind:`word`},{text:`create`,value:8,kind:`word`},{text:`bright`,value:7,kind:`word`},{text:`spark`,value:6,kind:`word`}],ru:[{text:`мир`,value:9,kind:`word`},{text:`радость`,value:8,kind:`word`},{text:`тепло`,value:7,kind:`word`},{text:`свет`,value:6,kind:`word`}],ar:[{text:`سلام`,value:9,kind:`word`},{text:`نور`,value:8,kind:`word`},{text:`إبداع`,value:7,kind:`word`},{text:`أمل`,value:6,kind:`word`}],es:[{text:`alegría`,value:9,kind:`word`},{text:`color`,value:8,kind:`word`},{text:`sueño`,value:7,kind:`word`}
6,{text:`fiesta`,value:6,kind:`word`}],fr:[{text:`lumière`,value:9,kind:`word`},{text:`idée`,value:8,kind:`word`},{text:`sourire`,value:7,kind:`word`},{text:`éclat`,value:6,kind:`word`}],zh:[{text:`创意`,value:9,kind:`word`},{text:`色彩`,value:8,kind:`word`},{text:`灵感`,value:7,kind:`word`},{text:`欢迎`,value:6,kind:`word`}]};function fa(e){let t=ua[e],n=Object.entries(ua).filter(([t])=>t!==e).map(([,e])=>({text:e,value:5,kind:`word`}));return[{text:t,value:18,kind:`word`},...da[e].map(e=>({...e})),...n]}function pa(e){let t=fa(e);return{locale:e,sourceText:t.map(e=>e.text).join(`
7`),words:t}}function ma(e){return{locale:e.locale,sourceText:e.sourceText,words:e.words.map(e=>({...e}))}}function ha(e,t){if(!e||typeof e!=`object`)return!1;let n=e;return n.locale===t&&typeof n.sourceText==`string`&&Array.isArray(n.words)&&n.words.length>0&&n.words.every(e=>e&&typeof e==`object`&&typeof e.text==`string`&&typeof e.value==`number`)}function ga(e){let t=pa(e);if(typeof window>`u`)return ma(t);let n=`${ca}.${e}`;try{let r=window.localStorage.getItem(n);if(r){let t=JSON.parse(r);if(ha(t,e))return ma(t)}window.localStorage.setItem(n,JSON.stringify(t))}catch{}return ma(t)}function _a(){if(typeof window>`u`)return!0;try{return window.localStorage.getItem(la)===`1`}catch{return!1}}function va(){if(!(typeof window>`u`))try{window.localStorage.setItem(la,`1`)}catch{}}var{slice:ya,forEach:ba}=[];function xa(e){return ba.call(ya.call(arguments,1),t=>{if(t)for(let n in t)e[n]===void 0&&(e[n]=t[n])}),e}function Sa(e){return typeof e==`string`?[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(t=>t.test(e)):!1}var Ca=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,wa=function(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:`/`},r=`${e}=${encodeURIComponent(t)}`;if(n.maxAge>0){let e=n.maxAge-0;if(Number.isNaN(e))throw Error(`maxAge should be a Number`);r+=`; Max-Age=${Math.floor(e)}`}if(n.domain){if(!Ca.test(n.domain))throw TypeError(`option domain is invalid`);r+=`; Domain=${n.domain}`}if(n.path){if(!Ca.test(n.path))throw TypeError(`option path is invalid`);r+=`; Path=${n.path}`}if(n.expires){if(typeof n.expires.toUTCString!=`function`)throw TypeError(`option expires is invali
7d`);r+=`; Expires=${n.expires.toUTCString()}`}if(n.httpOnly&&(r+=`; HttpOnly`),n.secure&&(r+=`; Secure`),n.sameSite)switch(typeof n.sameSite==`string`?n.sameSite.toLowerCase():n.sameSite){case!0:r+=`; SameSite=Strict`;break;case`lax`:r+=`; SameSite=Lax`;break;case`strict`:r+=`; SameSite=Strict`;break;case`none`:r+=`; SameSite=None`;break;default:throw TypeError(`option sameSite is invalid`)}return n.partitioned&&(r+=`; Partitioned`),r},Ta={create(e,t,n,r){let i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:`/`,sameSite:`strict`};n&&(i.expires=new Date,i.expires.setTime(i.expires.getTime()+n*60*1e3)),r&&(i.domain=r),document.cookie=wa(e,t,i)},read(e){let t=`${e}=`,n=document.cookie.split(`;`);for(let e=0;e<n.length;e++){let r=n[e];for(;r.charAt(0)===` `;)r=r.substring(1,r.length);if(r.indexOf(t)===0)return r.substring(t.length,r.length)}return null},remove(e,t){this.create(e,``,-1,t)}},Ea={name:`cookie`,lookup(e){let{lookupCookie:t}=e;if(t&&typeof document<`u`)return Ta.read(t)||void 0},cacheUserLanguage(e,t){let{lookupCookie:n,cookieMinutes:r,cookieDomain:i,cookieOptions:a}=t;n&&typeof document<`u`&&Ta.create(n,e,r,i,a)}},Da={name:`querystring`,lookup(e){let{lookupQuerystring:t}=e,n;if(typeof window<`u`){let{search:e}=window.location;!window.location.search&&window.location.hash?.indexOf(`?`)>-1&&(e=window.location.hash.substring(window.location.hash.indexOf(`?`)));let r=e.substring(1).split(`&`);for(let e=0;e<r.length;e++){let i=r[e].indexOf(`=`);i>0&&r[e].substring(0,i)===t&&(n=r[e].substring(i+1))}}return n}},Oa={name:`hash`,lookup(e){let{lookupHash:t,lookupFromHashIndex:n}=e,r;if(typeof window<`u`){let{hash:e}=window.location;if(e&&e.length>2){let i=e.substring(1);if(t){let e=i.split(`&`);for(let n=0;n<e.length;n++){let i=e[n].indexOf(`=`);i>0&&e[n].substring(0,i)===t&&(r=e[n].substring(i+1))}}if(r)return r;if(!r&&n>-1){let t=e.match(/\/([a-zA-Z-]*)/g);
7return Array.isArray(t)?t[typeof n==`number`?n:0]?.replace(`/`,``):void 0}}}return r}},ka=null,Aa=()=>{if(ka!==null)return ka;try{if(ka=typeof window<`u`&&window.localStorage!==null,!ka)return!1;let e=`i18next.translate.boo`;window.localStorage.setItem(e,`foo`),window.localStorage.removeItem(e)}catch{ka=!1}return ka},ja={name:`localStorage`,lookup(e){let{lookupLocalStorage:t}=e;if(t&&Aa())return window.localStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupLocalStorage:n}=t;n&&Aa()&&window.localStorage.setItem(n,e)}},Ma=null,Na=()=>{if(Ma!==null)return Ma;try{if(Ma=typeof window<`u`&&window.sessionStorage!==null,!Ma)return!1;let e=`i18next.translate.boo`;window.sessionStorage.setItem(e,`foo`),window.sessionStorage.removeItem(e)}catch{Ma=!1}return Ma},Pa={name:`sessionStorage`,lookup(e){let{lookupSessionStorage:t}=e;if(t&&Na())return window.sessionStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupSessionStorage:n}=t;n&&Na()&&window.sessionStorage.setItem(n,e)}},Fa={name:`navigator`,lookup(e){let t=[];if(typeof navigator<`u`){let{languages:e,userLanguage:n,language:r}=navigator;if(e)for(let n=0;n<e.length;n++)t.push(e[n]);n&&t.push(n),r&&t.push(r)}return t.length>0?t:void 0}},Ia={name:`htmlTag`,lookup(e){let{htmlTag:t}=e,n,r=t||(typeof document<`u`?document.documentElement:null);return r&&typeof r.getAttribute==`function`&&(n=r.getAttribute(`lang`)),n}},La={name:`path`,lookup(e){let{lookupFromPathIndex:t}=e;if(typeof window>`u`)return;let n=window.location.pathname.match(/\/([a-zA-Z-]*)/g);if(Array.isArray(n))return n[typeof t==`number`?t:0]?.replace(`/`,``)}},Ra={name:`subdomain`,lookup(e){let{lookupFromSubdomainIndex:t}=e,n=typeof t==`number`?t+1:1,r=typeof window<`u`&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(r)return r[n]}},za=!1;try{document.cookie,za=!0}catch{}var Ba=[`querystring`,`cookie`,`localStorage`,`sessionStorage`,`navigator`,`htmlTag`];za||Ba.splice(1,1);var Va=()=>({order:Ba,lookupQuerystring:`lng`,lookupCookie:`i18next`,lookupLocalStorage:`i18nextLng`,lookupSessionStorage:`i18nextLng`,caches:[`localStorage`],excludeCacheFor:[`cimode`],convertDetectedLanguage:e=>e}),Ha=class{constructor(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type=`languageDetector`,this.detectors={},this.init(e,t)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=e,this.options=xa(t,this.options||{},Va()),typeof this.options.convertDetectedLanguage==`string`&&this.options.convertDetectedLanguage.indexOf(`15897`)>-1&&(this.options.convertDetectedLanguage=e=>e.replace(`-`,`_`)),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=n,this.addDetector(Ea),this.addDetector(Da),this.addDetector(ja),this.addDetector(Pa),this.addDetector(Fa),this.addDetector(Ia),this.addDetector(La),this.addDetector(Ra),this.addDetector(Oa)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,t=[];return e.forEach(e=>{if(this.detectors[e]){let n=this.detectors[e].lookup(this.options);n&&typeof n==`string`&&(n=[n]),n&&(t=t.concat(n))}}),t=t.filter(e=>e!=null&&!Sa(e)).map(e=>this.options.convertDetectedLanguage(e)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?t:t.length>0?t[0]:null}cacheUserLanguage(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;t&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||t.forEach(t=>{this.detectors[t]&&this.detectors[t].cacheUserLanguage(e,this.options)}))}};Ha.type=`languageDetector`;var Ua={templateCommunity:{about:`حول القالب`,author:`اسم المؤلف العلني`,noAuthor:`المؤلف غير محدد`,authorProfile:`القوالب العامة لهذا المؤلف`,uses:`مرات الاستخدام`,usesNote:`مرات الفتح في المحرر، بحد أقصى مرة لكل زائر يوميًا. ليست عدد التنزيلات.`,favorite:`إضافة للمفضلة`,saved:`في المفضلة`,loginHint:`سجّل الدخول لحفظ المفضلة`,actionError:`تعذّر الحفظ. حاول مجددًا.`,license:`شروط الاستخدام`,unspecified:`غير محددة`,licenseUnknown:`لم يُحدد ترخيص. النشر لا يمنح الإذن لكل استخدام؛ تواصل مع صاحب الحقوق عند الحاجة.`,licenseScope:`اختاره المؤلف ويشمل فقط المواد التي يملك حقوقها. قد تخضع الخطوط والعناصر الخارجية لشروط منفصلة.`,licenseTerms:`قراءة شروط الترخيص`,versions:`سجل الإصدارات`,versionsNote:`منشورات منفصلة ضمن السلسلة نفسها. لا يتم استبدال الإصدارات المحفوظة.`,ver
7sionHow:`افتح المحرر وعدّل القالب، ثم اختر «إصدار جديد» عند النشر.`,contrast:`فحص التباين`,contrastNote:`مرجع: 4.5:1 للنص العادي، و3:1 للنص الكبير (24 بكسل أو نحو 19 بكسل عريض). الفحص للألوان فقط؛ يؤثر التكبير والتداخل في القراءة.`,backdrop:`خلفية الشفافية`,white:`بيضاء`,dark:`داكنة`,shapeBackground:`خلفية الشكل`,notMeasured:`لون غير مدعوم للحساب`,normalText:`نص عادي وكبير`,largeText:`نص كبير فقط`,lowContrast:`تباين أقل من 3:1`,related:`قوالب مشابهة`,relatedNote:`حسب الوسوم والشكل واللغة ضمن المنشورات الحديثة.`,relatedError:`القوالب المشابهة غير متاحة مؤقتًا.`,publicationDetails:`تفاصيل النشر`,description:`الوصف`,tags:`الوسوم`,tagsHint:`حتى 8 وسوم مفصولة بفواصل، بحد 32 حرفًا لكل وسم.`,useCases:`مناسب لـ`,authorHint:`اختياري. سيظهر الاسم والملف علنًا. تغيير الاسم يحدّث ملفك في جميع المنشورات.`,authorLogin:`يتطلب الاسم العلني تسجيل الدخول والنشر العام.`,licenseConsent:`اختر ترخيصًا فقط للمواد التي تملك حقوقها. اقرأ الشروط: قد يكون الترخيص غير قابل للإلغاء.`,publishVersion:`إصدار جديد من «{{title}}»`,myFavorites:`مفضلتي`,allTemplates:`كل القوالب`,cases:{education:`التعليم`,gift:`الهدايا`,presentation:`العروض`,social:`التواصل الاجتماعي`,research:`البحث`,decor:`الديكور`}},app:{title:`shapewords`,subtitle:`مولد سحابة الكلمات`,settings:`إعدادات`,openSettings:`افتح الإعدادات`,closeSettings:`إغلاق الإعدادات`,account:`حساب`,openAccount:`افتح الحساب`,signIn:`تسجيل الدخول`,templates:`قوالب`,openTemplates:`فتح القوالب الجاهزة`,wordMap:`خريطة الكلمات`,openWordMap:`فتح خريطة الكلمات ثلاثية الأبعاد`,live:`مباشر`,openLive:`افتح الغرف المباشرة`,chromeExtension:`Chrome`,openChromeExtension:`فتح إضافة Chrome`,chromeExtensionBadgeAlt:`إضافة Chrome`,dismissChromeExtension:`إخفاء اقتراح إضافة Chrome`,language:`لغة`},common:{loading:`جارٍ التحميل...`,on:`تشغيل`,off:`إيقاف`},account:{title:`حساب`,subtitle:`يتم حفظ سجل الإنشاء والقوالب والأنماط في حسابك.`,signInTitle:`قم بتسجيل الدخول لحفظ عملك`,signInSubtitle:`استخدم حسابًا لتاريخ الإنشاء والقوالب والأنماط الشخصية.`,login:`تسجيل الدخول`,register:`يسجل`,name:`اسم`,email:`بريد إلكتروني`,password:`كلمة المرور`,confirmPassword:`تأكيد كلمة المرور`,passwordHint:`متطلبات كلمة المرور`,passwordMismatch:`كلمات المرور غير متطابقة.`,passwordMinLength:`8 حرفًا على الأقل`,passwordLetter:`حرف واحد على الأقل`,passwordNumber:`رقم واحد على الأقل`,socialTitle:`تسجيل الدخول عبر خدمة`,socialSubtitle:`استخدم Google أو Yandex أو Facebook أو X لتسجيل الدخول من دون كلمة مرور منفصلة.`,socialDivider:`أو`,socialGoogle:`Google`,socialFacebook:`Facebook`,socialX:`X`,socialYandex:`Yandex`,noAccount:`إنشاء حساب`,hasAccount:`لديك حساب بالفعل`,history:`تاريخ`,templates:`قوالب`,styles:`الأنماط`,account:`حساب`,saveHistory:`يحفظ`,saveTemplate:`نموذج`,saveStyle:`أسلوب`,saveCurrentHistory:`حفظ الجيل`,saveCurrentTemplate:`حفظ القالب`,saveCurrentStyle:`حفظ النمط`,saveHistoryHint:`يحفظ إعدادات النص والشكل والنمط والتخطيط الحالية كعنصر محفوظات.`,saveTemplateHint:`يحفظ المشروع الحالي كقالب قابل لإعادة الاستخدام لسحابات الكلمات الجديدة.`,saveStyleHint:`يحفظ فقط الإعدادات المرئية: الخط، ولوحة الألوان، والخلفية، والاتجاه، وخيارات العرض.`,saveName:`اسم`,cancel:`يلغي`,save:`يحفظ`,close:`إغلاق الحساب`,backToEditor:`العودة إلى المحرر`,open:`يفتح`,apply:`يتقدم`,delete:`يمسح`,emptyHistory:`لا توجد أجيال محفوظة بعد.`,emptyTemplates:`لا توجد قوالب حتى الآن.`,emptyStyles:`لا توجد أنماط حتى الآن.`,words:`كلمات`,placed:`وضعت`,logout:`تسجيل الخروج`,signedInAs:`تم تسجيل الدخول باسم`,palette:`لوحة`,libraryActions:`حفظ العمل الحالي`,libraryHint:`يحتفظ السجل بالمشروع الكامل، ويحتفظ القالب بمشروع قابل لإعادة الاستخدام، ويخزن النمط الإعدادات المرئية فقط.`,oauthCancelled:`تم إلغاء تسجيل الدخول عبر الخدمة الخارجية.`,oauthEmailRequired:`لم يرسل المزوّد عنوان البريد الإلكتروني. استخدم طريقة دخول أخرى.`,oauthEmailUnverified:`لم يؤكد المزوّد عنوان البريد الإلكتروني. استخدم طريقة دخول أخرى.`,oauthProviderDisabled:`طريقة تسجيل الدخول هذه غير مُعدّة بعد.`,oauthStateInvalid:`انتهت جلسة تسجيل الدخول. حاول مرة أخرى.`,oauthFailed:`تعذر إكمال تسجيل الدخول عبر الخدمة الخارجية.`},templates:{metaTitle:`قوالب سحابة الكلمات العامة | shapewords`,metaDescription:`استكشف القوالب التي نشرها مجتمع shapewords وافتح أي تصميم في المحرر.`,badge:`مجموعة مفتوحة`,title:`قوالب عامة`,de
7scription:`استكشف سحب الكلمات المنشورة من المجتمع. افتح أي عمل كقالب وتابع تحريره.`,searchPlaceholder:`ابحث في العناوين والكلمات...`,languageFilter:`لغة القالب`,allLanguages:`كل اللغات`,resultCount:`{{count}} منشورات`,resetSearch:`إعادة البحث`,loadError:`تعذر تحميل القوالب العامة`,loadMore:`عرض المزيد`,emptyTitle:`لا توجد نتائج`,emptyDescription:`جرّب بحثًا آخر أو اختر كل اللغات أو انشر أول سحابة في هذا القسم.`,noPreview:`المعاينة غير متاحة`,wordsCount:`{{count}} كلمات`,open:`يفتح`,backToList:`جميع القوالب`,notFoundTitle:`لم يتم العثور على القالب`,notFoundDescription:`بطاقة القالب العامة هذه غير موجودة. ارجع إلى الكتالوج واختر أحد القوالب الجاهزة.`,includesTitle:`ما هو في الداخل`,shape:`شكل`,palette:`لوحة`,words:`كلمات`,useTemplate:`استخدم القالب`,useHint:`يقوم القالب بتحميل النص والكلمات والشكل والنمط في مساحة العمل.`},text:{title:`نص`,smartImport:`الاستيراد الذكي`,smartImportDescription:`نص وCSV/TSV وExcel ‏.xlsx وGoogle Sheets ومنشورات من X وReddit وHacker News وYouTube وTelegram وخلاصات RSS`,closeSmartImport:`أغلق الاستيراد الذكي`,smartImportPlaceholder:`الصق النص، CSV/TSV، أو اسحب ملفًا وأفلته...`,placeholder:`لصق النص هنا...`,sample:`جرب عينة`,voiceInput:`صوت`,voiceStart:`ابدأ الإدخال الصوتي`,voiceStop:`أوقف الإدخال الصوتي`,voiceStopShort:`إيقاف`,voiceListening:`جارٍ الاستماع إلى الميكروفون`,voiceUnsupported:`الإدخال الصوتي غير مدعوم في هذا المتصفح`,voicePermissionDenied:`تم حظر الوصول إلى الميكروفون. اسمح بالوصول ثم حاول مرة أخرى.`,voiceNoSpeech:`لم يتم اكتشاف كلام. حاول مرة أخرى وتحدث أقرب إلى الميكروفون.`,voiceNoMicrophone:`لم يتم العثور على إدخال من الميكروفون على هذا الجهاز.`,voiceError:`تعذر بدء الإدخال الصوتي`,emoji:`الرموز التعبيرية`,emojiSearchPlaceholder:`ابحث عن الرموز التعبيرية: الضحك، النار، القلب...`,emojiSearchLoading:`جارٍ تحميل الرموز التعبيرية`,emojiSearchNoResults:`لم يتم العثور على رموز تعبيرية`,addEmojiAria:`أضف {{emoji}}`,dropHint:`قم بإسقاط ملف .txt أو .csv أو .tsv أو .xlsx`,clear:`واضح`,importFile:`ملف`,importText:`استيراد النص`,googleSheets:`Google Sheets`,googleSheetsPlaceholder:`رابط الورقة أو المنشورة CSV`,googleFileSharingHelp:`كيفية مشاركة ملف Google`,import:`يستورد`,xImport:`X (تويتر)`,xImportPlaceholder:`الصق رابط منشور من x.com`,xImportHint:`المنشورات العامة فقط. الصق رابطًا واحدًا أو أكثر — نستورد نص المنشور.`,redditImport:`Reddit`,redditImportPlaceholder:`الصق رابط منشور أو مجتمع فرعي على Reddit`,redditImportHint:`المناقشات والمجتمعات العامة فقط. نستورد العناوين والتعليقات.`,hnImport:`Hacker News`,hnImportPlaceholder:`الصق رابط عنصر على Hacker News`,hnImportHint:`نستورد المقال وتعليقاته.`,youtubeImport:`YouTube`,youtubeImportPlaceholder:`الصق رابط فيديو على YouTube`,youtubeImportHint:`نستورد العنوان والوصف والوسوم وأبرز التعليقات.`,telegramImport:`Telegram`,telegramImportPlaceholder:`الصق رابط قناة عامة أو @الاسم`,telegramImportHint:`القنوات العامة فقط. نستورد المنشورات الأخيرة.`,rssImport:`RSS`,rssImportPlaceholder:`الصق رابط أي خلاصة RSS أو Atom`,rssImportHint:`أي مدونة أو خلاصة أخبار. نستورد عناوين العناصر وملخصاتها.`,importOptions:`قواعد الاستيراد`,keepCase:`احتفظ بالقضية`,countFrequency:`تردد العد`,removeStopWords:`إزالة كلمات التوقف`,detectDuplicates:`كشف التكرارات`,lemmatizeWords:`تكلم`,languageProcessing:`معالجة اللغة`,languageProcessingStatus:`المعالجة: {{language}}`,languageProcessingSection:`إعدادات معالجة اللغة`,processingLanguage:`لغة النص`,autoLanguage:`اكتشاف تلقائي`,chineseLanguage:`الصينية`,chineseScript:`نظام الكتابة الصينية`,chineseScriptAuto:`اكتشاف تلقائي`,chineseSimplified:`الصينية المبسطة`,chineseTraditional:`الصينية التقليدية`,chineseMode:`وضع معالجة الصينية`,chineseFast:`سريع`,chinesePrecise:`دقيق`,keepSingleHan:`الاحتفاظ بمحارف هان المفردة`,includeNumbers:`تضمين الأرقام`,normalizeChineseVariants:`دمج الصيغ الصينية التقليدية والمبسطة`,minTokenLength:`الحد الأدنى لطول المصطلح`,chineseStopWordsProfile:`كلمات الوقف`,chineseStopWordsCore:`آمنة`,chineseStopWordsExtended:`موسعة`,chinesePosFilter:`أقسام الكلام`,chinesePosAll:`الكل`,chinesePosContent:`دلالية`,chinesePosNouns:`أسماء`,chineseKeywordRanking:`ترجيح المصطلحات`,chineseKeywordSmart:`ذكي`,chineseKeywordFrequency:`التكرار`,chineseKeywordRankingHint:`يجمع الوضع الذكي بين التكرار وTF-IDF وTextRank والموضع وقسم الكلام، مع الاحتفاظ بالتكرار الخام في البيانات الوصفية.`,englishLanguage:`الإنجليزية`,englishProcessingHint:`يُحلَّل النص الإنجليزي محليًا في متصفحك مع تمييز أجزاء الكلام وإرجاع الصيغ الأساسية.`,englishPosFilter:`أقسام الكلام`,englishPosAll:`كل الكلمات`,englishPosContent:`الكلمات الدلالية`,englishPosNouns:`الأسماء`,englishLemmatize:`إرجاع الكلمات الإنجليزية إلى صيغتها الأساسية`,englishStopWordsProfile:`كلمات الوقف`,englishStopWordsCore:`أساسية`,englishStopWordsExtended:`موسعة`,englishStopWordsHint:`تزيل القائمة الأساسية الكلمات الوظيفية الشائعة؛ وتُصفّي الموسعة أيضًا الكلمات الحشوية المتكررة.`,russianLanguage:`الروسية`,russianLocale:`صيغة اللغة الروسية`,russianMode:`وضع معالجة الروسية`,russianFast:`سريع`,russianPrecise:`OpenCorpora`,russianPreciseHint:`يحمّل الاستيراد الدقيق محلياً مقاطع القاموس المطلوبة فقط ولا يخمّن الصيغ الملتبسة.`,russianPosFilter:`أجزاء الكلام`,russianPosAll:`الكل`,russianPosContent:`الكلمات الدلالية`,russianPosNouns:`الأسماء`,russianLemmatize:`إرجاع الكلمات الروسية إلى صيغتها الأساسية`,russianYoNormalization:`تطبيع Ё/Е`,russianYoPreserve:`إبقاء Ё وЕ منفصلين`,russianYoFold:`دمج Ё مع Е`,russianYoHint:`الدمج يحسن تجميع التكرار؛ ويحفظ الرسم الأصلي متى أمكن.`,russianStopWordsProfile:`كلمات الوقف`,russianStopWordsCore:`أساسية`,russianStopWordsExtended:`موسعة`,russianStopWordsHint:`تزيل القائمة الأساسية الكلمات الوظيفية الموثوقة فقط؛ بينما ترشح الموسعة مزيدًا من الكلمات الشائعة غير المهمة.`,genericLanguageProcessingHint:`التقسيم المحلي الأساسي مفعّل لهذه اللغة. اختر الصينية أو الروسية أو الإنجليزية لضبط معالج تفصيلي.`,customDictionary:`قاموس مخصص`,customDictionaryPlaceholder:`مصطلح واحد في كل سطر. تُعطى الأولوية للمصطلحات الأطول.`,synonyms:`المرادفات`,synonymsPlaceholder:`مجموعة واحدة في كل سطر: المصطلح الرئيسي: المرادف 1، المرادف 2`,processingPrivacyLocal:`تتم المعالجة محليًا في متصفحك.`,preciseProcessingHint:`يوفر الوضع الدقيق حدودًا أفضل للكلمات الصينية وقد يستغرق وقتًا أطول قليلًا.`,preserveStyles:`الحفاظ على الأنماط`,replaceWordsOnly:`استبدال الكلمات فقط`,includeEmoji:`الرموز التعبيرية`,customStopWordsPlaceholder:`قائمة كلمات التوقف المخصصة: كلمة واحدة في كل سطر، أو فاصلة، أو ؛`,importResult:`{{source}}: {{count}} كلمات، {{rows}} صفوف، وضع {{mode}}`,includePhrases:`عبارات`,importMode:{text:`نص`,table:`طاولة`}
7,errors:{xlsUnsupported:`إن ملف .xls القديم غير مدعوم حتى الآن. احفظ الملف بتنسيق .xlsx أو CSV.`,googleSheetsFailed:`تعذر تحميل Google Sheets. استخدم رابطًا عامًا أو منشورًا CSV.`,googleSheetsInvalidUrl:`هذا لا يبدو رابط Google Sheets صالحًا أو CSV منشورًا. الصق رابط الورقة الكامل أو رابط HTTPS CSV عامًا.`,googleFileAccessDenied:`مستند Google غير متاح للعامة. في Google Docs أو Google Drive، افتح مشاركة واضبط الوصول العام على أي شخص لديه الرابط.`,importFailed:`لا يمكن استيراد البيانات`,xImportFailed:`تعذّر تحميل منشور X. استخدم رابط منشور عام.`,redditImportFailed:`تعذّر تحميل رابط Reddit. استخدم منشورًا أو مجتمعًا فرعيًا عامًا.`,hnImportFailed:`تعذّر تحميل عنصر Hacker News. استخدم رابطًا عامًا.`,youtubeImportFailed:`تعذّر تحميل فيديو YouTube. قد يكون غير متاح أو أن الاستيراد غير مُهيأ.`,telegramImportFailed:`تعذّر تحميل قناة Telegram. استخدم رابط قناة عامة.`,rssImportFailed:`تعذّر تحميل هذه الخلاصة. استخدم رابط RSS أو Atom صالحًا.`}},words:{title:`كلمات`,word:`كلمة`,editWord:`تعديل الكلمة`,delete:`حذف الكلمة`,clearList:`مسح قائمة الكلمات`,count:`تكرار`,size:`مقاس`,sizeTitle:`مقياس الكلمات أو الرموز التعبيرية بالنسبة للتكرار`,sizeWord:`حجم {{word}}`,resetSize:`إعادة ضبط الحجم`,resetSizeShort:`100`,empty:`أدخل النص لتحليله`,total:`{{count}} الكلمات`,filteredTotal:`{{count}} من {{total}}`,searchPlaceholder:`ابحث عن كلمة أو رمز تعبيري`,noMatches:`لا توجد مباريات`,showing:`عرض {{shown}} من {{count}}`,emoji:`com.emoji`,repeatShort:`مندوب.`,repeatTitle:`كرر الكلمة أثناء التعبئة`,repeatWord:`كرر {{word}} أثناء التعبئة`,enableRepeatWord:`تفعيل التكرار لـ {{word}}`,disableRepeatWord:`تعطيل التكرار لـ {{word}}`,managerTitle:`مدير الكلمات`,managerApply:`تطبيق`,managerDescription:`{{count}} عنصرًا مع الفرز والإجراءات الجماعية وإعدادات لكل كلمة.`,openManager:`إدارة الكلمات`,selected:`المحدد: {{count}}`,selectAll:`تحديد كل الكلمات الظاهرة`,kind:`النوع`,frequencyValue:`الوزن {{count}}`,bulkActions:`إجراءات جماعية`,bulkDescription:`طبّق تغييرًا واحدًا على الكلمات المحددة دفعة واحدة.`,bulkFont:`خط جماعي`,fontAutoAll:`تلقائي للمحدد`,repeatOn:`تكرار تشغيل`,repeatOff:`تكرار إيقاف`,repeatAll:`تكرار الكل`,deleteSelected:`حذف المحدد`,wordFont:`خط الكلمة`,addWord:`إضافة كلمة`,addPlaceholder:`أضف كلمة أخرى…`,addPlaceholderEmpty:`اكتب كلمة واضغط Enter`,emptyListTitle:`قائمة الكلمات فارغة`,emptyListDescription:`أضف الكلمات في النموذج أعلاه: اكتب كلمة واضغط Enter.`,sourceTitle:`النص المصدر`,sourceDescription:`الصق النص أو استورده لتحويله إلى كلمات.`},style:{title:`أسلوب`,font:`الخط`,uploadFont:`تحميل الخط`,customFonts:`مخصص {{count}}`,customFontsBadge:`{{count}}`,fontLoading:`تحميل`,deleteCustomFont:`حذف الخط المخصص`,scriptFonts:`خطوط اللغة`,autoFont:`آلي`,fontUpload:{title:`تحميل خط مخصص`,description:`أضف ملف خط يمكن استخدامه بواسطة منشئ سحابة الكلمات.`,formatsTitle:`التنسيقات المدعومة`,formatsBody:`يوصى باستخدام WOFF2. يتم أيضًا قبول ملفات WOFF وTTF وOTF التي يصل حجمها إلى 6 ميغابايت. قد لا تعمل مجموعات TTC والمحفوظات وخطوط SVG والخطوط الملونة/المتغيرة بشكل موثوق.`,licenseTitle:`شروط الاستخدام`,licenseOwn:`قم بتحميل الخطوط التي يحق لك استخدامها فقط.`,licenseAllowed:`تعتبر الخطوط المجانية ومفتوحة المصدر، على سبيل المثال SIL OFL أو Apache أو التراخيص المشابهة، مناسبة. تكون الخطوط التجارية مناسبة فقط عندما يسمح ترخيصك باستخدام الويب/سطح المكتب وإنشاء الصور.`,licenseRestricted:`لا تقم بتحميل الخطوط التي يحظر ترخيصها التضمين أو استخدام الويب أو إنشاء الصور أو استخدامها في خدمات الإنشاء.`,storageTitle:`حيث يتم تخزين الملف`,storageBody:`يتم تخزين الملف محليًا في هذا المتصفح باستخدام IndexedDB ولا يتم إرساله إلى الخادم أثناء التحميل. ستستخدم عمليات التصدير من هذا المتصفح الخط، ولكن الروابط العامة والمتصفح الآخر قد يتراجعان إذا لم يكن الملف نÙ
7Ø³Ù‡ متاحًا هناك.`,warning:`يتم التعامل مع ملف واحد كنمط واحد. قم بتحميل ملفات منفصلة إذا كنت بحاجة إلى أنماط عادية أو غامقة أو مائلة.`,chooseFile:`اختر ملف الخط`},palette:`لوحة`,customPalette:`مخصص`,customPaletteTitle:`لوحة مخصصة`,customPaletteHint:`بناء مجموعة ألوان الكلمة. يتم تطبيق التغييرات على السحابة الحالية على الفور.`,addCustomColor:`أضف اللون`,removeCustomColor:`إزالة اللون`,resetCustomPalette:`إعادة ضبط اللوحة`,customColorNumber:`اللون {{number}}`,colorMode:`وضع اللون`,sequential:`تسلسلي`,random:`عشوائي`,byFrequency:`حسب التردد`,fontSize:`نطاق الحجم`,min:`دقيقة`,max:`الأعلى`,morePalettes:`جميع اللوحات`,paletteDialogTitle:`لوحة الألوان`,paletteDialogCount:`{{count}} لوحات`,closePalettes:`إغلاق اللوحات`},layout:{title:`تَخطِيط`,spiral:`دوامة`,archimedean:`أرخميدس`,rectangular:`مستطيلة`,rotation:`توجيه`,horizontal:`أفقي`,mixed:`مختلط`,vertical:`رَأسِيّ`,orthogonal:`أفقي عمودي`,crossing:`عبور أفقي عمودي`,crossingVoids:`عبور الفراغات`,dancing:`كلمات الرقص`,positiveSlope:`قطري صاعد`,negativeSlope:`قطري هابط`,random:`عشوائي`,custom:`مخصص`,moreOrientations:`جميع التوجهات`,orientationDialogTitle:`اتجاه الكلمة`,orientationDialogCount:`أوضاع {{count}}`,closeOrientations:`التوجهات القريبة`,crossingPreview:`معبر`,voidsPreview:`الفراغات`,dancingPreview:`الرقص`,wordsPreview:`كلمات`,positivePreview:`صاعد`,negativePreview:`هابط`,slopePreview:`قطري`,customAngles:`الزوايا`,customAnglesPlaceholder:`0، -30، 30، 90`,angled:`بزاوية`,free:`زوايا حرة`,padding:`تباعد الكلمات`,maxWords:`حد الكلمات`},shape:{title:`شكل`,popular:`شائع`,selected:`مختارة`,openCatalog:`كتالوج`,catalogTitle:`كتالوج الشكل`,catalogCount:`{{count}} الأشكال`,closeCatalog:`إغلاق كتالوج الشكل`,catalogCustomize:`تخصيص الشكل`,catalogColor:`لون الشكل`,catalogInvert:`عكس الشكل`,catalogInvertHint:`املأ المنطقة حول هذا المحيط بدلاً من المحيط نفسه.`,catalogBack:`رجوع`,catalogEditFree:`تحرير`,catalogApply:`تطبيق`,searchPlaceholder:`البحث عن الأشكال والعلامات`,catalogEmpty:`لم يتم العثور على أشكال`,deleteShape:`حذف الشكل "{{name}}"`,deleteShapeConfirm:`هل تريد حذف الشكل "{{name}}" من أشكالك؟`,customTitle:`شكل مخصص`,customDescription:`ارسم محيطًا في المنشئ أو قم باستيراد صورة`,builderOpen:`منشئ`,builderTitle:`منشئ الشكل`,builderDescription:`أنشئ محيطًا نقطيًا أو حوّل الحروف والأرقام إلى قناع متجه.`,builderDrawMode:`كفاف`,builderTextMode:`الحروف والأرقام`,builderControls:`كيفية الرسم`,builderHintAdd:`انقر أو اضغط على الشبكة لإضافة نقطة جديدة.`,builderHintDrag:`اسحب العقد لإعادة تشكيل الكفاف. يتم إغلاق الشكل تلقائيًا.`,builderHintSnap:`يشير مغناطيس خفيف إلى الشبكة. اضغط مع الاستمرار على Alt لتجاوز الالتقاط.`,builderTextInput:`الشخصيات`,builderTextPlaceholder:`2026`,builderTextFont:`الخط`,builderTextFontSearch:`خط البحث`,builderTextFontSearchClear:`مسح البحث عن الخط`,builderTextFontSearchEmpty:`لم يتم العثور على الخطوط`,builderTextStyle:`أسلوب`,builderTextInvert:`عكس`,builderTextInvertHint:`افتراضيا يتم ملء الحروف. عند قلبها، تمتلئ المنطقة المحيطة بها.`,builderTextLoading:`إعداد الخطوط العريضة`,builderTextPreviewEmpty:`أدخل الحروف أو الأرقام`,builderTextError:`تعذر إنشاء شكل نص`,builderUndo:`تراجع`,builderClear:`واضح`,builderReset:`عينة`,builderApply:`استخدم الشكل`,builderStats:`{{count}} نقطة، المنطقة {{area}}`,builderShapeName:`شكل المتجهات`,builderEditedSuffix:`تم تحريره`,closeBuilder:`إغلاق البناء`,editShape:`تحرير الشكل`,customUpload:`رفع`,customThreshold:`عتبة القناع`,customReady:`الشكل "{{name}}" جاهز`,customError:`لا يمكن إنشاء شكل من الصورة`,customModes:{auto:`آلي`,alpha:`ألفا`,contrast:`مقابلة`},categories:{all:`الجميع`,basic:`أساسي`,nature:`طبيعة`,animals:`الحيوانات`,kids:`الأطفال`,numbers:`أرقام`,objects:`أشياء`,symbols:`الرموز`,travel:`يسافر`,brands:`العلامات التجارية`,custom:`مخصص`},mode:`وضع`,frequency:`حسب التردد`,fill:`ملء الشكل`,background:`خلفية الشكل`,backgroundNone:`لا يوجد خلفية`,backgroundWhite:`خلفية فاتحة`,backgroundSky:`خلفية السماء`,backgroundMint:`خلفية النعناع`,backgroundWarm:`خلفية دافئة`,backgroundRose:`خلفية الورد`,backgroundCustom:`اختيار لون خلفية الشكل`},stopWords:{title:`توقف عن الكلمات`,enable:`تصفية كلمات التوقف`,language:`لغة`,auto:`آلي`,ru:`الروسية`,en:`الإنجليزية`,es:`الإسبانية`,fr:`الفرنسية`,ar:`العربية`,zh:`الصينية`},export:{title:`يصدّر`,format:`شكل`,quality:`جودة`,background:`خلفية`,transparent:`شفاف`,white:`أبيض`,dark:`مظلم`,save:`يحفظ`,download:`تحميل`,toggleOptions:`خيارات التصدير`,close:`إغلاق`,printReady:`جاهز للطباعة PDF`,printReadyDescription:`الورقة الثابتة والهوامش وعلامات الطباعة`,page:`صفحة`,margin:`هامِش`,bleed:`ينزف`,safeZone:`منطقة آمنة`,cropMarks:`علامات المحاصيل`,downloading:`جارٍ التنزيل...`,watermark:`المصدر: {{site}}`,hideWatermark:`بدون حقوق الخدمة`,hideWatermarkDescription:`إزالة توقيع الموقع من الملفات المصدَّرة`},publish:{button:`مشاركة`,creating:`جارٍ النشر...`,title:`نشر سحابة`,description:`ينشئ رابطًا لهذه السحابة بتخطيطها وشكلها ونمطها الحالي.`,publicLifetime:`يُحفظ القالب العام بلا انتهاء ويُصنّف ضمن لغة الواجهة الحالية.`,privateLifetime:`يعمل الرابط الخاص لمدة 90 يومًا ولا يظهر في الكتالوج.`,defaultTitle:`سحابة كلماتي`,nameLabel:`عنوان المنشور`,namePlaceholder:`مثال: خريطة أفكار المشروع`,publicNotice:`سيكون العنوان والكلمات والصورة مرئية للجميع في الكتالوج العام.`,privateToggle:`الاحتفاظ برابط خاص`,privateDescription:`عدم عرض هذا العمل في الكتالوج العام`,privateNotice:`يتاح القالب فقط لمن يملك الرابط. سيتوقف الرابط عن العمل بعد 90 يومًا.`,create:`نشر القالب`,createPrivate:`إنشاء رابط خاص`,publicResult:`نُشر القالب في الكتالوج وسيُحفظ بلا انتهاء.`,privateResult:`الرابط الخاص صالح لمدة 90 يومًا، ولن يظهر القالب في الكتالوج.`,newPublication:`جديد`,link:`وصلة`,copy:`ينسخ`,copied:`منقول`,open:`يفتح`,close:`يغلق`,native:`يشارك`,nativeTitle:`shapewords سحابة الكلمات`,socialTitle:`نشر`,socialOpen:`نشر على {{name}}`,socialPreviewNote:`تظهر الصورة عبر Open Graph عندما تجلب الشبكة معاينة الرابط.`,qrAlt:`رمز QR للرابط`,empty:`قم بإنشاء سحابة أولاً`,error:`تعذر نشر القالب`,previewError:`تعذر إعداد معاينة المنشور`},templatePage:{badge:`قالب عام`,description:`استكشف الكلمات والشكل ولوحة الألوان وتخطيط هذا القالب المنشور.`,back:`كتالوج القوالب`,loading:`جارٍ تحميل القالب...`,words:`{{count}} الكلمات`,notFoundTitle:`لم يتم العثور على الرابط`,expiredTitle:`انتهت صلاحية هذا الرابط`,expiredDescription:`هذا الرابط القديم لم يعد نشطًا. اختر قالبًا آخر من الكتالوج.`,loadError:`تعذر تحميل القالب`,applyError:`تعذر فتح القالب في المحرر`,copyError:`تعذر نسخ الرابط`,templateNumber:`القالب · {{id}}`,copyLink:`نسخ الرابط`,copied:`تم نسخ الرابط`,useTemplate:`استخدام هذا القالب`,opening:`جارٍ الفتح...`,language:`اللغة`,shape:`الشكل`,shapeCaption:`المخطط المحدد للسحابة`,font:`الخط`,orientation:`الاتجاه`,fontSize:`مقياس الخط`,published:`تاريخ النشر`,details:`تفاصيل القالب`,contents:`المحتوى`,preview:`معاينة`,usedWords:`الكلمات المستخدمة`,wordWeight:`وزن الكلمة`,colorScheme:`نظام الألوان`,customPalette:`لوحة مخصصة`,technicalDetails:`تفاصيل التخطيط`,spiral:`المسار الحلزوني`,wordSpacing:`تباعد الكلمات`,colorMode:`ترتيب الألوان`,wordLimit:`حد الكلمات`,placedWords:`الكلمات الموضوعة`,canvasSize:`اللوحة`,viewMode:`العرض`,readyBadge:`اجعله خاصًا بك`,readyTitle:`احتفظ بالتكوين وغيّر القصة.`,readyDescription:`افتح القالب في المحرر لاستبدال الكلمات أو ضبط الشكل والألوان أو تصدير النتيجة.`},wordMap:{metaTitle:`خريطة كلمات ثلاثية الأبعاد تفاعلية للعالم | shapewords`,metaDescription:`استكشف الكلمات الأكثر تكرارًا من آخر نتائج Google News RSS للبلدان على كرة أرضية ثلاثية الأبعاد مع تخزين يومي مؤقت.`,title:`خريطة كلمات العالم`,search:`بحث عن مكان`,searchPlaceholder:`ابحث عن بلد`,placePicker:`اختيار المكان`,country:`بلد`,results:`النتائج`,noResults:`لم يتم العثور على أماكن`,world:`العالم`,toggleOrbit:`تشغيل أو إيقاف دوران الكرة الأرضية`,words:`الكلمات`,empty:`اختر بلدًا`,scale:{world:`العالم`,country:`البلد`},newsSource:`Google News RSS`,newsSelectCountry:`ابحث عن بلد واختره لتحميل كلمات الأخبار`,newsReady:`كلمات الأخبار جاهزة`,newsLoading:`جارٍ تحميل الكلمات الأكثر تكرارًا من الأخبار`,newsFresh:`تم التحميل من Google News RSS`,newsCached:`استخدام ذاكرة الأخبار اليومية`,newsErrorShort:`الأخبار غير متاحة`,newsError:`تعذر تحميل كلمات أخبار البلد`,newsEmpty:`لم يتم العثور على كلمات متكررة`,reloadNews:`إعادة تحميل كلمات الأخبار`},canvas:{undo:`تراجع`,redo:`إعادة`,generate:`إنشاء`,regenerate:`تجديد`,fullscreen:`ملء الشاشة`,zoom:`تكبير`,showGrid:`عرض الشبكة`,hideGrid:`إخفاء الشبكة`,openMenuHint:`افتح القائمة لإضافة كلمات`,emptyTitle:`مساحة العمل فارغة`,emptyDesktopDescription:`أضف نصًا في اللوحة اليمنى أو استخدم النموذج لإنشاء سحابة كلمات.`,emptyMobileDescription:`افتح القائمة وأضف نصًا لإنشاء سحابة كلمات.`,generating:`جارٍ الإنشاء...`,assigningFontsProgress:`تعيين الخطوط`,loadingFontsProgress:`تحميل الخطوط`,prepareProgress:`تحضير`,preparingOutlineProgress:`إنشاء المسارات`,fillProgress:`ملء الشكل`,shapeWordCountLabel:`الكلمات في الشكل`,progressAssigningFonts:`اختيار الحروف المدعومة`,progressLoadingFonts:`تحميل ملفات الخطوط المحددة`,progressPreparing:`القناع والخطوط والصور الرمزية`,progressPreparingOutline:`تحويل الكلمات إلى مسارات`,progressWords:`{{placed}} / {{target}} الكلمات`,progressPlaced:`{{placed}} الكلمات`,selectedWord:`الكلمة المختارة`,selectWord:`اختر الكلمة {{word}}`,editWord:`تعديل الكلمة {{word}}`,wordColor:`لون`,wordFont:`الخط`,wordSize:`مقاس`,wordRotation:`تناوب`,wordCurve:`منحنى`,pinWord:`موضع الدبوس`,unpinWord:`إزالة تثبيت الموضع`,protectPinnedArea:`حماية مساحة العبارة بالكامل`,unprotectPinnedArea:`إزالة حماية مساحة العبارة`,pinConflict:`تم تثبيت الموضع، لكن الكلمة تتعارض جزئيًا مع الشكل أو مع كلمة مثبتة أخرى.`,deleteWord:`حذف كلمة`,mainAccentTitle:`هل تريد إضافة نقطة تركيز؟`,mainAccentDescription:`يمكن أن تصبح «{{word}}» مركز التصميم بصريًا. سنختار خطًا مميزًا ونكيّف الحجم أو الدوران أو الانحناء مع الشكل. ستملأ الكلمات المساحة المحيطة بها.`,mainAccentProcessing:`جارٍ اختيار الخط…`,mainAccentFontError:`تعذر تحميل خط لإبراز العبارة. حاول مرة أخرى.`,mainAccentAction:`اجعلها العنصر الرئيسي`,mainAccentDismiss:`إخفاء الاقتراح`,sparseFillTitle:`ما زالت هناك مساحة فارغة في الشكل`,sparseFillDescription:`التكرار متوقف، لذلك لا توجد عناصر كافية لملء الشكل بكثافة. يمكن للذكاء الاصطناعي إيجاد مرادفات جديدة وعبارات قصيرة مرتبطة بالمعنى.`,sparseFillAction:`البحث عن مرادفات بالذكاء الاصطناعي`,sparseFillProcessing:`يبحث الذكاء الاصطناعي عن كلمات…`,sparseFillDism
7iss:`إخفاء الاقتراح`,sparseFillNoNewWords:`لم يجد الذكاء الاصطناعي كلمات أو عبارات جديدة وفريدة. جرّب تعديل القائمة الأصلية.`},tooltips:{help:`يساعد`,text:{title:`يقبل Smart Import النص العادي، CSV/TSV، Excel .xlsx، وGoogle Sheets العام. يتم استيراد الجداول التي تحتوي على أعمدة الكلمات والتكرار مباشرةً.`,languageProcessing:`يقسّم النص إلى كلمات وفقًا للغته قبل حساب التكرار. يكون مفعّلًا افتراضيًا؛ عطّله لاستخدام التقسيم الأساسي.`,keepCase:`يحتفظ بأول حالة تم اكتشافها لكل كلمة. عند إيقاف التشغيل، يتم تطبيع الكلمات إلى أحرف صغيرة.`,countFrequency:`عند التشغيل، تؤدي المصطلحات المتكررة إلى زيادة وزن الكلمة. عند إيقاف التشغيل، تحصل كل كلمة مستوردة على وزن 1.`,removeStopWords:`يقوم بتصفية الكلمات الوظيفية الشائعة للغة المحددة أو لكل اللغات المدعومة التي يتم اكتشافها في النص، بالإضافة إلى قائمة كلمات التوقف المخصصة.`,detectDuplicates:`عند التشغيل، يتم دمج الكلمات المتطابقة. عند إيقاف التشغيل، يتم الحفاظ على تسلسل الكلمات الأصلي.`,lemmatizeWords:`عند التمكين، تتم تسوية أشكال الكلمات الروسية والإنجليزية قبل حساب التكرار، بحيث يمكن للسيارات والسيارات والجري والجري مشاركة مجموعاتها الأساسية.`,russianLemmatize:`يجمع بشكل متحفظ صيغ الكلمات الروسية المدعومة؛ تبقى الكلمات الملتبسة منفصلة وتُحفظ مواضعها الأصلية.`,englishLemmatize:`يجمع التصريفات الإنجليزية في صيغ القاموس قبل حساب التكرار مع الاحتفاظ بمواضع النص الأصلية.`,preserveStyles:`عند التشغيل، يؤدي الاستيراد إلى تغيير البيانات فقط. عند إيقاف التشغيل، تتم إعادة تعيين إعدادات الخط ولوحة الألوان والنص الأساسية إلى الإعدادات الافتراضية.`,replaceWordsOnly:`عند تشغيله، يؤدي الاستيراد إلى استبدال جدول الكلمات مباشرةً دون إعادة معالجة النص الخام. عند إيقاف التشغيل، يمر المصدر المستورد عبر معالج النص العادي.`,includePhrases:`عند التمكين، تتم إضافة مجموعات متكررة من كلمتين كعبارات. عند التعطيل، يتم استخدام الكلمات الفردية فقط.`,includeEmoji:`عند التمكين، يتم استخراج الرموز التعبيرية كرموز مميزة منفصلة ويتم عرضها باستخدام أصول Twemoji SVG.`},words:{title:`يعرض قسم الكلمات الإدخال السريع والحذف والتحكم في التكرار. افتح المدير للفرز والتعديل الجماعي وخط كل كلمة.`,sidebar:`استخدم الشريط الجانبي لإدارة قائمة الكلمات والتكرار. التثبيت متاح فقط للنسخة المحددة على اللوحة.`,manager:`يدعم المدير الفرز حسب كل الأعمدة، والإجراءات الجماعية، والتحكم في العدد والحجم والتكرار والخط لكل كلمة.`},ai:{title:`يوسع مساعد الذكاء الاصطناعي الموضوع المدخل أو يترجمه إلى اللغات المحددة.`},style:{font:`يؤثر الخط على كل من الشخصية المرئية وموضع الكلمة الفعلي داخل الأشكال.`,palette:`تحدد اللوحة ألوان الكلمات المتاحة. يتحكم وضع الألوان في كيفية تعيين تلك الألوان.`,colorMode:`يتبع التسلسل لوحة الألوان، ويخلط الألوان بشكل عشوائي، ويؤكد حسب التكرار على الكلمات الأكثر أهمية.`,fontSize:`يحدد نطاق الحجم الأدنى والأقصى. عند تعبئة الشكل، يواصل المحرك تكييف الأحجام داخل هذا النطاق بدلاً من استخدام قيم ثابتة.`},layout:{title:`تتحكم إعدادات التخطيط في البحث عن المساحة الحرة، والزوايا المسموح بها، والتباعد بين الكلمات، وحد الكلمات المستخدم في التخطيط.`,spiral:`يتحكم الشكل الحلزوني في كيفية البحث عن المساحة الحرة في السحب العادية بدون شكل.`,rotation:`يحدد الاتجاه الزوايا المسموح بها. تعمل الزوايا الحرة بشكل أفضل لملء الشكل الكثيف.`,padding:`يتحكم في الحد الأدنى للمسافة بين الكلمات الموضوعة. القيم المنخفضة تعطي كثافة أعلى، والقيم الأعلى تترك فراغاً أكبر.`,maxWords:`يحدد عدد الكلمات التي تدخل في توليد التخطيط. ينطبق ذلك على السحب العادية وعلى تعبئة الأشكال؛ القيم الأعلى قد تحسن التغطية لكنها تزيد زمن التوليد.`},shape:{title:`يحدد الشكل قناعًا حيث يتم وضع الكلمات بواسطة خطوط البكسل دون تجاوز الحدود. يتم عرض الأشكال الشائعة سطريًا، ويتم فتح الكتالوج الكامل بشكل منفصل.`,background:`تقوم الخلفية بتمييز منطقة الشكل خلف الكلمات ويتم تضمينها في تصدير PNG، JPGØ
7Œ SVG، وPDF.`},stopWords:{title:`تقوم كلمات التوقف بإزالة الكلمات الوظيفية الشائعة بحيث لا تهيمن حروف الجر وحروف العطف على السحابة.`,enable:`عند التمكين، تتم التصفية للغة المحددة أو لكل اللغات المدعومة التي تظهر في النص المستورد.`},export:{title:`يقوم التصدير بحفظ السحابة الحالية بالتنسيق والجودة والخلفية المحددة.`,format:`PNG/JPG هي الأفضل للصور، وSVG تحتفظ بالنص المتجه، وPDF مفيدة للطباعة والمستندات.`,quality:`يقوم SQ بتصدير التنسيقات النقطية بمعدل 2x، وHQ بمعدل 4x. يستخدم PDF ضغط JPEG لتجنب الملفات ذات الحجم الكبير دون تفاصيل مفيدة.`,background:`تؤثر الخلفية على الملف الذي تم تصديره فقط، وليس على مساحة عمل المحرر.`}},ai:{title:`مساعد الذكاء الاصطناعي`,serverMode:`الخادم`,setupApi:`قم بإعداد OpenRouter API`,actions:{topic:`توسيع الموضوع`,phrases:`العبارات الرئيسية`,style:`اقتراح أسلوب`},actionPlaceholders:{topic:`الموضوع: عيد ميلاد...`,translateOnly:`كلمة أو عبارة للترجمة...`,style:`موضوع للأسلوب (اختياري)`},actionPhrasesNote:`يستخرج العبارات الرئيسية من النص المستورد.`,processing:`الذكاء الاصطناعي يفكر...`,apiKeyTitle:`OpenRouter مفتاح واجهة برمجة التطبيقات`,apiKeyDescription:`تتطلب ميزات الذكاء الاصطناعي مفتاح OpenRouter مجاني. يتم تخزين المفتاح فقط في المتصفح الخاص بك.`,getKey:`احصل على المفتاح على openrouter.ai`,save:`يحفظ`,clear:`يزيل`,promptHints:{title:`إدراج سريع`,rotate:`عرض اقتراحات أخرى`},settings:{open:`إعدادات الذكاء الاصطناعي`,action:`إجراء الذكاء الاصطناعي`,actionHints:{topic:`ينشئ سحابة كلمات من الموضوع الذي تكتبه.`,phrases:`يستخرج الكلمات والعبارات الرئيسية من النص المستورد.`,style:`يختار لوحة ألوان وخطًا وشكلًا يناسب موضوعك أو نصك.`},title:`إعدادات الجيل`,description:`التحكم في اللغات ومستوى الصوت والنغمة وكثافة العبارة قبل الاتصال بالذكاء الاصطناعي.`,summary:`{{mode}} · {{languages}} · {{count}} · {{tone}}`,languagesCount:`{{count}} اللغات`,translationCount:`{{count}} الترجمات`,generationMode:`وضع`,generationModes:{expand:`قم بتوسيع الموضوع`,translateOnly:`الترجمات فقط`},generationModeHints:{expand:`سيضيف الذكاء الاصطناعي الكلمات والعبارات والمتغيرات حول الموضوع المصدر باستخدام العدد المحدد.`,translateOnly:`سيعيد الذكاء الاصطناعي ترجمة واحدة بالضبط للكلمة أو العبارة المصدر لكل لغة محددة.`},languages:`اللغة أو اللغات`,languageLimit:`ما يصل إلى 30`,languagesPlaceholder:`الروسية، الإنجليزية، الإسبانية...
8افصل بفواصل أو أسطر جديدة.`,currentLanguage:`حاضِر`,twoLanguages:`رو + إن`,languagePresets:{ten:`10 اللغات`,twenty:`20 اللغات`,thirty:`30 اللغات`},wordCount:`الحد الأدنى من الكلمات`,wordCountHint:`استخدم أي قيمة من 1 إلى 80. في وضع الترجمات فقط، يساوي العدد النهائي عدد اللغة المحددة.`,tone:`نغمة`,phraseMode:`عبارات`,creativity:`متنوع`,preserveProperNouns:`احتفظ بالأسماء والعلامات التجارية`,balancedLanguages:`توازن اللغات بالتساوي`,reset:`إعادة Ø
8¶Ø¨Ø·`,done:`منتهي`,tones:{neutral:`حيادي`,festive:`احتفالي`,professional:`احترافي`,playful:`لعوب`,poetic:`شعري`,minimal:`الحد الأدنى`},phraseModes:{mixed:`مختلط`,words:`كلمات`,phrases:`عبارات قصيرة`}}},footer:{free:`مجاني ولا يتطلب التسجيل`,description:`قم بإنشاء سحب كلمات على شكل من النص، CSV، Excel، وGoogle Sheets.`,github:`جيثب`,live:`سحابة حية`,templates:`قوالب`,wordMap:`خريطة الكلمات`,chromeExtension:`إضافة Chrome`,privacy:`خصوصية`}},Wa={templateCommunity:{about:`About this template`,author:`Public author name`,noAuthor:`Author not specified`,authorProfile:`Public templates by this author`,uses:`Uses`,usesNote:`Editor opens, counted at most once per visitor per day. Not a download count.`,favorite:`Save favorite`,saved:`Saved`,loginHint:`Sign in to save favorites`,actionError:`Could not save. Please try again.`,license:`Reuse terms`,unspecified:`Not specified`,licenseUnknown:`No license was provided. Publication alone does not grant permission for every use; contact the rights holder when needed.`,licenseScope:`Selected by the author, covering only materials they have rights to. Fonts and other third-party elements may have separate terms.`,licenseTerms:`Read license terms`,versions:`Version history`,versionsNote:`Separate publications in the same series. Saved versions are never overwritten.`,versionHow:`Open in the editor, make changes, then select “New version” when publishing.`,contrast:`Contrast check`,contrastNote:`Guidance: 4.5:1 for regular text, 3:1 for large text (24 px, or about 19 px bold). This tests colors, not the whole image: scaling and overlaps affect readability.`,backdrop:`Backdrop for transparency`,white:`White`,dark:`Dark`,shapeBackground:`Shape background`,notMeasured:`Color not supported for calculation`,normalText:`Regular and large text`,largeText:`Large text only`,lowContrast:`Contrast below 3:1`,related:`Related templates`,relatedNote:`Matched by tags, shape and language among recent publications.`,relatedError:`Related templates are temporarily unavailable.`,publicationDetails:`Publication details`,description:`Description`,tags:`Tags`,tagsHint:`Up to 8 comma-separated tags, 32 characters each.`,useCases:`Good for`,authorHint:`Optional. This name and profile will be public. A new name updates your profile across publications.`,authorLogin:`A public name requires sign-in and a public publication.`,licenseConsent:`Only license materials you have rights to. Read the terms: open licenses may be irrevocable.`,publishVersion:`New version of “{{title}}”`,myFavorites:`My favorites`,allTemplates:`All templates`,cases:{education:`Education`,gift:`Gift`,presentation:`Presentation`,social:`Social media`,research:`Research`,decor:`Decoration`}},app:{title:`shapewords`,subtitle:`Word Cloud Generator`,settings:`Settings`,openSettings:`Open settings`,closeSettings:`Close settings`,account:`Account`,openAccount:`Open account`,signIn:`Sign in`,templates:`Templates`,openTemplates:`Open ready-made templates`,wordMap:`Word map`,openWordMap:`Open 3D word map`,live:`Live`,openLive:`Open live rooms`,chromeExtension:`Chrome`,openChromeExtension:`Open Chrome extension`,chromeExtensionBadgeAlt:`Chrome extension`,dismissChromeExtension:`Dismiss Chrome extension prompt`,language:`Language`},common:{loading:`Loading...`,on:`On`,off:`Off`},account:{title:`Account`,subtitle:`Generation history, templates, and styles are saved to your account.`,signInTitle:`Sign in to save your work`,signInSubtitle:`Use an account for generation history, templates, and personal styles.`,login:`Sign in`,register:`Register`,name:`Name`,email:`Email`,password:`Password`,confirmPassword:`Confirm password`,passwordHint:`Password requirements`,passwordMismatch:`Passwords do not match.`,passwordMinLength:`At least 8 characters`,passwordLetter:`At least one letter`,passwordNumber:`At least one number`,socialTitle:`Sign in with a service`,socialSubtitle:`Use Google, Yandex, Facebook, or X to sign in without a separate password.`,socialDivider:`or`,socialGoogle:`Google`,socialFacebook:`Facebook`,socialX:`X`,socialYandex:`Yandex`,noAccount:`Create account`,hasAccount:`Already have an account`,history:`History`,templates:`Templates`,styles:`Styles`,account:`Account`,saveHistory:`Save`,saveTemplate:`Template`,saveStyle:`Style`,saveCurrentHistory:`Save generation`,saveCurrentTemplate:`Save template`,saveCurrentStyle:`Save style`,saveHistoryHint:`Saves the current text, shape, style, and layout settings as a history item.`,saveTemplateHint:`Saves the current project as a reusable template for new w
8ord clouds.`,saveStyleHint:`Saves only visual settings: font, palette, background, orientation, and display options.`,saveName:`Name`,cancel:`Cancel`,save:`Save`,close:`Close account`,backToEditor:`Back to editor`,open:`Open`,apply:`Apply`,delete:`Delete`,emptyHistory:`No saved generations yet.`,emptyTemplates:`No templates yet.`,emptyStyles:`No styles yet.`,words:`words`,placed:`placed`,logout:`Sign out`,signedInAs:`Signed in as`,palette:`palette`,libraryActions:`Save current work`,libraryHint:`History keeps the full project, a template keeps a reusable project, and a style stores only visual settings.`,oauthCancelled:`Sign-in with the external service was cancelled.`,oauthEmailRequired:`The provider did not return an email address. Use another sign-in method.`,oauthEmailUnverified:`The provider did not confirm the email address. Use another sign-in method.`,oauthProviderDisabled:`This sign-in method is not configured yet.`,oauthStateInvalid:`The sign-in session expired. Try again.`,oauthFailed:`Could not complete sign-in with the external service.`},templates:{metaTitle:`Public word cloud templates | shapewords`,metaDescription:`Explore word cloud templates published by the shapewords community and open any design in the editor.`,badge:`Open collection`,title:`Public templates`,description:`Explore word clouds published by the shapewords community. Open any work as a template, replace its words, and keep editing.`,searchPlaceholder:`Search titles and words...`,languageFilter:`Template language`,allLanguages:`All languages`,resultCount:`{{count}} publications`,resetSearch:`Reset search`,loadError:`Could not load public templates`,loadMore:`Show more`,emptyTitle:`Nothing found`,emptyDescription:`Try another search, select all languages, or publish the first word cloud in this section.`,noPreview:`Preview unavailable`,wordsCount:`{{count}} words`},text:{title:`Text`,smartImport:`Smart Import`,smartImportDescription:`Text, CSV/TSV, Excel .xlsx, Google Sheets, and posts from X, Reddit, Hacker News, YouTube, Telegram, and RSS feeds`,closeSmartImport:`Close Smart Import`,smartImportPlaceholder:`Paste text, CSV/TSV, or drag and drop a file...`,placeholder:`Paste text here...`,sample:`Try a sample`,voiceInput:`Voice`,voiceStart:`Start voice input`,voiceStop:`Stop voice input`,voiceStopShort:`Stop`,voiceListening:`Listening to your microphone`,voiceUnsupported:`Voice input is not supported in this browser`,voicePermissionDenied:`Microphone access was blocked. Allow microphone access and try again.`,voiceNoSpeech:`No speech detected. Try again and speak a little closer to the microphone.`,voiceNoMicrophone:`No microphone input was found on this device.`,voiceError:`Could not start voice input`,emoji:`Emoji`,emojiSearchPlaceholder:`Search emoji: laugh, fire, heart...`,emojiSearchLoading:`Loading emoji`,emojiSearchNoResults:`No emoji found`,addEmojiAria:`Add {{emoji}}`,dropHint:`Drop .txt, .csv, .tsv, or .xlsx file`,clear:`Clear`,importFile:`File`,importText:`Import text`,googleSheets:`Google Sheets`,googleSheetsPlaceholder:`Sheet link or published CSV`,googleFileSharingHelp:`How to share a Google file`,import:`Import`,xImport:`X (Twitter)`,xImportPlaceholder:`Paste a post link from x.com`,xImportHint:`Public posts only. Paste one or more links — we import the post text.`,redditImport:`Reddit`,redditImportPlaceholder:`Paste a Reddit post or subreddit link`,redditImportHint:`Public threads and subreddits. We import titles and comments.`,hnImport:`Hacker News`,hnImportPlaceholder:`Paste a Hacker News item link`,hnImportHint:`We import the story and its comments.`,youtubeImport:`YouTube`,youtubeImportPlaceholder:`Paste a YouTube video link`,youtubeImportHint:`We import the title, description, tags, and top comments.`,telegramImport:`Telegram`,telegramImportPlaceholder:`Paste a public channel link or @name`,telegramImportHint:`Public channels only. We import recent posts.`,rssImport:`RSS`,rssImportPlaceholder:`Paste any RSS or Atom feed URL`,rssImportHint:`Any blog or news feed. We import item titles and summaries.`,importOptions:`Import rules`,keepCase:`Keep case`,countFrequency:`Count frequency`,removeStopWords:`Remove stop words`,detectDuplicates:`Detect duplicates`,lemmatizeWords:`Lemmatize`,languageProcessing:`Language processing`,languageProcessingStatus:`Processing: {{language}}`,languageProcessingSection:`Language processing`,processingLanguage:`Text language`,autoLanguage:`Detect automatically`,chineseLanguage:`Chinese`,chineseScript:`Chinese script`,chineseScriptAuto:`Detect automatically`,chineseSimplified:`Simplified Chinese`,chineseTraditional:`Traditional Chinese`,chineseMode:`Chinese processing mode`,chineseFast:`Fast`,chinesePrecise:`Precise`,keepSingleHan:`Keep single Chinese characters`,includeNumbers:`Include numbers`,normalizeChineseVariants:`Merge Traditional and Simplified forms`,minTokenLength:`Minimum term length`,chineseStopWordsProfile:`Stop words`,chineseStopWordsCore:`Safe`,chineseStopWordsExtended:`Extended`,chinesePosFilter:`Parts of speech`,chinesePosAll:`All`,chinesePosContent:`Content`,chinesePosNouns:`Nouns`,chineseKeywordRanking:`Term weighting`,chineseKeywordSmart:`Smart`,chineseKeywordFrequency:`Frequency`,chineseKeywordRankingHint:`Smart weighting combines frequency, TF-IDF, TextRank, position, and part of speech; raw frequency remains available in metadata.`,englishLanguage:`English`,englishProcessingHint:`English text is analyzed locally in this browser with part-of-speech tagging and lemmatization.`,englishPosFilter:`Parts of speech`,englishPosAll:`All terms`,englishPosContent:`Content words`,englishPosNouns:`Nouns`,englishLemmatize:`Lemmatize English words`,englishStopWordsProfile:`Stop words`,englishStopWordsCore:`Core`,englishStopWordsExtended:`Extended`,englishStopWordsHint:`Core removes common function words; Extended also filters frequent filler words.`,russianLanguage:`Russian`,russianLocale:`Russian locale`,russianMode:`Russian processing mode`,russianFast:`Fast`,russianPrecise:`OpenCorpora`,russianPreciseHint:`Precise Smart Import loads only the needed local dictionary fragments. Ambiguous forms are never guessed.`,russianPosFilter:`Parts of speech`,russianPosAll:`All`,russianPosContent:`Content words`,russianPosNouns:`Nouns`,russianLemmatize:`Lemmatize Russian words`,russianYoNormalization:`Ё/Е normalization`,russianYoPreserve:`Keep Ё and Е distinct`,russianYoFold:`Merge Ё with Е`,russianYoHint:`Merging improves frequency grouping; original spelling is preserved where possible.`,russianStopWordsProfile:`Stop words`,russianStopWordsCore:`Core`,russianStopWordsExtended:`Extended`,russianStopWordsHint:`Core removes only high-confidence function words; Extended filters more common filler words.`,genericLanguageProcessingHint:`Basic local tokenization is active for this language. Select Chinese, Russian, or English to configure a detailed processor.`,customDictionary:`Custom dictionary`,customDictionaryPlaceholder:`One term per line. Longer terms take priority.`,synonyms:`Synonyms`,synonymsPlaceholder:`One group per line: main term: synonym 1, synonym 2`,processingPrivacyLocal:`Processing runs locally in your browser.`,preciseProcessingHint:`Precise mode improves Chinese word boundaries and may take a little longer.`,preserveStyles:`Preserve styles`,replaceWordsOnly:`Replace words only`,includeEmoji:`Emoji`,customStopWordsPlaceholder:`Custom stop-word list: one word per line, comma, or ;`,importResult:`{{source}}: {{count}} words, {{rows}} rows, {{mode}} mode`,includePhrases:`Phrases`,importMode:{text:`text`,table:`table`}
8,errors:{xlsUnsupported:`Legacy .xls is not supported yet. Save the file as .xlsx or CSV.`,googleSheetsFailed:`Could not load Google Sheets. Use a public link or published CSV.`,googleSheetsInvalidUrl:`This is not a valid Google Sheets or published CSV link. Paste the full sheet link or a public HTTPS CSV URL.`,googleFileAccessDenied:`The Google document is not publicly accessible. In Google Docs or Google Drive, open Share and set General access to Anyone with the link.`,importFailed:`Could not import data`,xImportFailed:`Could not load the X post. Use a public post link.`,redditImportFailed:`Could not load this Reddit link. Use a public post or subreddit.`,hnImportFailed:`Could not load this Hacker News item. Use a public item link.`,youtubeImportFailed:`Could not load this YouTube video. It may be unavailable, or import is not configured.`,telegramImportFailed:`Could not load this Telegram channel. Use a public channel link.`,rssImportFailed:`Could not load this feed. Use a valid RSS or Atom URL.`}},words:{title:`Words`,exportCsv:`Export to CSV`,word:`Word`,editWord:`Edit word`,delete:`Delete word`,clearList:`Clear word list`,count:`Frequency`,size:`Size`,sizeTitle:`Word or emoji scale relative to frequency`,sizeWord:`Size of {{word}}`,resetSize:`Reset size`,resetSizeShort:`100`,empty:`Enter text to analyze`,total:`{{count}} words`,filteredTotal:`{{count}} of {{total}}`,searchPlaceholder:`Search word or emoji`,noMatches:`No matches`,showing:`Showing {{shown}} of {{count}}`,emoji:`emoji`,repeatShort:`rep.`,repeatTitle:`Repeat word while filling`,repeatWord:`Repeat {{word}} while filling`,enableRepeatWord:`Enable repeat for {{word}}`,disableRepeatWord:`Disable repeat for {{word}}`,managerTitle:`Word manager`,managerApply:`Apply`,managerDescription:`{{count}} items with sorting, bulk actions, and per-word settings.`,openManager:`Manage words`,selected:`Selected: {{count}}`,selectAll:`Select all visible words`,kind:`Type`,frequencyValue:`Weight {{count}}`,bulkActions:`Bulk actions`,bulkDescription:`Apply one change to the selected words at once.`,bulkFont:`Bulk font`,fontAutoAll:`Auto for selected`,repeatOn:`Repeat on`,repeatOff:`Repeat off`,repeatAll:`Repeat all`,deleteSelected:`Delete selected`,wordFont:`Word font`,addWord:`Add word`,addPlaceholder:`Add another…`,addPlaceholderEmpty:`Type a word and press Enter`,emptyListTitle:`The word list is empty`,emptyListDescription:`Add words in the form above: type a word and press Enter.`,sourceTitle:`Source text`,sourceDescription:`Paste or import text to turn it into words.`},style:{title:`Style`,font:`Font`,uploadFont:`Upload font`,customFonts:`Custom {{count}}`,customFontsBadge:`{{count}}`,fontLoading:`Loading`,deleteCustomFont:`Delete custom font`,scriptFonts:`Language fonts`,autoFont:`Auto`,fontUpload:{title:`Upload a custom font`,description:`Add a font file that can be used by the word cloud generator.`,formatsTitle:`Supported formats`,formatsBody:`WOFF2 is recommended. WOFF, TTF, and OTF files up to 6 MB are also accepted. TTC collections, archives, SVG fonts, and color/variable fonts may not work reliably.`,licenseTitle:`Usage conditions`,licenseOwn:`Upload only fonts that you have the right to use.`,licenseAllowed:`Free and open-source fonts, for example SIL OFL, Apache, or similar licenses, are suitable. Commercial fonts are suitable only when your license allows web/desktop use and image generation.`,licenseRestricted:`Do not upload fonts whose license forbids embedding, web use, image creation, or use in generation services.`,storageTitle:`Where the file is stored`,storageBody:`The file is stored locally in this browser using IndexedDB and is not sent to the server during upload. Exports from this browser will use the font, but public links and another browser may fall back if the same file is not available there.`,warning:`One file is treated as one style. Upload separate files if you need Regular, Bold, or Italic styles.`,chooseFile:`Choose font file`},palette:`Palette`,customPalette:`Custom`,customPaletteTitle:`Custom palette`,customPaletteHint:`Build a word color set. Changes are applied to the current cloud immediately.`,addCustomColor:`Add color`,removeCustomColor:`Remove c
8olor`,resetCustomPalette:`Reset palette`,customColorNumber:`Color {{number}}`,colorMode:`Color mode`,sequential:`Sequential`,random:`Random`,byFrequency:`By frequency`,fontSize:`Size range`,min:`Min`,max:`Max`,morePalettes:`All palettes`,paletteDialogTitle:`Color palette`,paletteDialogCount:`{{count}} palettes`,closePalettes:`Close palettes`},layout:{title:`Layout`,spiral:`Spiral`,archimedean:`Archimedean`,rectangular:`Rectangular`,rotation:`Orientation`,horizontal:`Horizontal`,mixed:`Mixed`,vertical:`Vertical`,orthogonal:`Horizontal Vertical`,crossing:`Crossing Horizontal Vertical`,crossingVoids:`Crossing Voids`,dancing:`Dancing Words`,positiveSlope:`Upward Diagonal`,negativeSlope:`Downward Diagonal`,random:`Random`,custom:`Custom`,moreOrientations:`All orientations`,orientationDialogTitle:`Word orientation`,orientationDialogCount:`{{count}} modes`,closeOrientations:`Close orientations`,crossingPreview:`Crossing`,voidsPreview:`Voids`,dancingPreview:`Dancing`,wordsPreview:`Words`,positivePreview:`Upward`,negativePreview:`Downward`,slopePreview:`Diagonal`,customAngles:`Angles`,customAnglesPlaceholder:`0, -30, 30, 90`,angled:`Angled`,free:`Free angles`,padding:`Word spacing`,maxWords:`Word limit`},shape:{title:`Shape`,popular:`Popular`,selected:`Selected`,openCatalog:`Catalog`,catalogTitle:`Shape catalog`,catalogCount:`{{count}} shapes`,closeCatalog:`Close shape catalog`,catalogCustomize:`Customize shape`,catalogColor:`Shape color`,catalogInvert:`Invert shape`,catalogInvertHint:`Fill the area around this contour instead of the contour itself.`,catalogBack:`Back`,catalogEditFree:`Edit`,catalogApply:`Apply`,searchPlaceholder:`Search shapes and tags`,catalogEmpty:`No shapes found`,deleteShape:`Delete shape "{{name}}"`,deleteShapeConfirm:`Delete shape "{{name}}" from your shapes?`,customTitle:`Custom shape`,customDescription:`Draw a contour in the builder or import an image`,builderOpen:`Builder`,builderTitle:`Shape builder`,builderDescription:`Build a point contour or turn letters and digits into a vector mask.`,builderDrawMode:`Contour`,builderTextMode:`Letters and digits`,builderControls:`How to draw`,builderHintAdd:`Click or tap the grid to add a new point.`,builderHintDrag:`Drag nodes to reshape the contour. The shape closes automatically.`,builderHintSnap:`A light magnet snaps points to the grid. Hold Alt to bypass snapping.`,builderTextInput:`Characters`,builderTextPlaceholder:`A 2026`,builderTextFont:`Font`,builderTextFontSearch:`Search font`,builderTextFontSearchClear:`Clear font search`,builderTextFontSearchEmpty:`No fonts found`,builderTextStyle:`Style`,builderTextInvert:`Invert`,builderTextInvertHint:`By default the letters are filled. When inverted, the area around them is filled.`,builderTextLoading:`Preparing outline`,builderTextPreviewEmpty:`Enter letters or digits`,builderTextError:`Could not build a text shape`,builderUndo:`Undo`,builderClear:`Clear`,builderReset:`Sample`,builderApply:`Use shape`,builderStats:`{{count}} points, area {{area}}`,builderShapeName:`Vector shape`,builderEditedSuffix:`edited`,closeBuilder:`Close builder`,editShape:`Edit shape`,customUpload:`Upload`,customThreshold:`Mask threshold`,customReady:`Shape "{{name}}" is ready`,customError:`Could not create a shape from the image`,customModes:{auto:`Auto`,alpha:`Alpha`,contrast:`Contrast`},categories:{all:`All`,basic:`Basic`,nature:`Nature`,animals:`Animals`,kids:`Kids`,numbers:`Numbers`,objects:`Objects`,symbols:`Symbols`,travel:`Travel`,brands:`Brands`,custom:`Custom`},mode:`Mode`,frequency:`By frequency`,fill:`Fill shape`,background:`Shape background`,backgroundNone:`No background`,backgroundWhite:`Light background`,backgroundSky:`Sky background`,backgroundMint:`Mint background`,backgroundWarm:`Warm background`,backgroundRose:`Rose background`,backgroundCustom:`Choose shape background color`},stopWords:{title:`Stop words`,enable:`Filter stop words`,language:`Language`,auto:`Auto`,ru:`Russian`,en:`English`,es:`Spanish`,fr:`French`,ar:`Arabic`,zh:`Chinese`},export:{title:`Export`,format:`Format`,quality:`Quality`,background:`Background`,transparent:`Transparent`,white:`White`,dark:`Dark`,save:`Save`,download:`Download`,toggleOptions:`Export options`,close:`Close`,printReady:`Print-ready PDF`,printReadyDescription:`Fixed sheet, margins, and print marks`,page:`Page`,margin:`Margin`,bleed:`Bleed`,safeZone:`Safe zone`,cropMarks:`Crop marks`,downloading:`Downloading...`,watermark:`source: {{site}}`,hideWatermark:`Without service copyright`,hideWatermarkDescription:`Remove the source signature from exports`},publish:{button:`Share`,creating:`Publishing...`,title:`Publish cloud`,description:`Creates a link to this cloud with its current layout, shape, and style.`,publicLifetime:`A public template is kept indefinitely and filed under the current interface language.`,privateLifetime:`A private link works for 90 days and is not listed in the catalog.`,defaultTitle:`My word cloud`,nameLabel:`Publication title`,namePlaceholder:`For example, Project idea map`,publicNotice:`The title, words, and image will be visible to everyone browsing the public catalog.`,privateToggle:`Keep a private link`,privateDescription:`Do not list this work in the public catalog`,privateNotice:`The template is available only to people with the link. The link stops working after 90 days.`,create:`Publish template`,createPrivate:`Create private link`,publicResult:`The template is published in the catalog and stored indefinitely.`,privateResult:`The private link is active for 90 days. The template is not listed in the catalog.`,newPublication:`New`,link:`Link`,copy:`Copy`,copied:`Copied`,open:`Open`,close:`Close`,native:`Share`,nativeTitle:`shapewords word cloud`,socialTitle:`Share publication`,socialOpen:`Share to {{name}}`,socialPreviewNote:`The image is served through Open Graph when the network fetches the link preview.`,qrAlt:`Link QR code`,empty:`Generate a cloud first`,error:`Could not publish the template`,previewError:`Could not prepare the publication preview`},templatePage:{badge:`Public template`,description:`Explore the words, shape, palette, and layout of this published word cloud template.`,back:`Template catalog`,loading:`Loading template...`,notFoundTitle:`Template not found`,expiredTitle:`Template unavailable`,expiredDescription:`This legacy link is no longer active. Choose another template from the catalog.`,loadError:`Could not load the template`,applyError:`Could not open the template in the editor`,copyError:`Could not copy the link`,templateNumber:`Template · {{id}}`,copyLink:`Copy link`,copied:`Link copied`,useTemplate:`Use this template`,opening:`Opening...`,language:`Language`,shape:`Shape`,shapeCaption:`Selected cloud outline`,font:`Typeface`,orientation:`Orientation`,fontSize:`Type scale`,published:`Published`,details:`Template details`,contents:`Contents`,preview:`Preview`,usedWords:`Words used`,wordWeight:`Word weight`,colorScheme:`Color scheme`,customPalette:`Custom palette`,technicalDetails:`Layout details`,spiral:`Spiral`,wordSpacing:`Word spacing`,colorMode:`Color order`,wordLimit:`Word limit`,placedWords:`Placed words`,canvasSize:`Canvas`,viewMode:`View`,readyBadge:`Make it yours`,readyTitle:`Keep the composition. Change the story.`,readyDescription:`Open the template in the editor to replace words, adju
8st the shape and colors, or export the result.`},view3d:{modeLabel:`View mode`,sphere:`Sphere`,cube:`Cube`,autoRotate:`Auto-rotate`,depth:`Depth`,reset:`Reset`,fullscreen:`Fullscreen`,exportPng:`PNG`,empty:`Generate a word cloud to see it in 3D.`,hint:`Drag to rotate · scroll to zoom · hover for details`},wordMap:{metaTitle:`Interactive 3D word map of the world | shapewords`,metaDescription:`Explore frequent words from the latest Google News RSS results for countries on an interactive 3D globe, with daily cached news word clusters by map scale.`,title:`World word map`,search:`Search place`,searchPlaceholder:`Search country`,placePicker:`Place picker`,country:`Country`,results:`Results`,noResults:`No places found`,world:`World`,toggleOrbit:`Toggle globe rotation`,hidePanel:`Collapse map panel`,showPanel:`Show map panel`,words:`Words`,empty:`Select a country`,scale:{world:`world`,country:`country`},newsSource:`Google News RSS`,newsSelectCountry:`Search and select a country to load news words`,newsReady:`News words ready`,newsLoading:`Loading latest news words`,newsFresh:`Loaded from Google News RSS`,newsCached:`Using today's cached news words`,newsErrorShort:`News unavailable`,newsError:`Could not load country news words`,newsEmpty:`No frequent news words found`,reloadNews:`Reload news words`},canvas:{undo:`Undo`,redo:`Redo`,generate:`Generate`,regenerate:`Regenerate`,fullscreen:`Fullscreen`,zoom:`Zoom`,showGrid:`Show grid`,hideGrid:`Hide grid`,openMenuHint:`Open the menu to add words`,emptyTitle:`The workspace is empty`,emptyDesktopDescription:`Add text in the left panel or use the sample to build a word cloud.`,emptyMobileDescription:`Open the menu and add text to build a word cloud.`,generating:`Generating...`,assigningFontsProgress:`Assigning fonts`,loadingFontsProgress:`Loading fonts`,prepareProgress:`Preparing`,preparingOutlineProgress:`Building outlines`,fillProgress:`Filling shape`,shapeWordCountLabel:`Words in shape`,progressAssigningFonts:`Choosing valid glyph coverage`,progressLoadingFonts:`Fetching selected font files`,progressPreparing:`Mask, fonts, and glyphs`,progressPreparingOutline:`Converting words to outlines`,progressWords:`{{placed}} / {{target}} words`,progressPlaced:`{{placed}} words`,selectedWord:`Selected word`,selectWord:`Select word {{word}}`,editWord:`Edit word {{word}}`,wordColor:`Color`,wordFont:`Font`,wordSize:`Size`,wordRotation:`Rotation`,wordCurve:`Curve`,pinWord:`Pin position`,unpinWord:`Unpin position`,protectPinnedArea:`Protect the whole phrase area`,unprotectPinnedArea:`Remove phrase area protection`,pinConflict:`The position is pinned, but the word partially conflicts with the shape or another pinned word.`,deleteWord:`Delete word`,mainAccentTitle:`Add a focal point?`,mainAccentDescription:`“{{word}}” can become the visual focus. We’ll choose an expressive font and adapt its size, rotation or curve to the shape. Words will fill the space around it.`,mainAccentProcessing:`Choosing a font…`,mainAccentFontError:`Could not load an accent font. Please try again.`,mainAccentAction:`Make it the focus`,mainAccentDismiss:`Dismiss suggestion`,sparseFillTitle:`The shape still has open space`,sparseFillDescription:`Repeats are off, so there are not enough entries for a dense fill. AI can find new synonyms and short meaningful phrases.`,sparseFillAction:`Find synonyms with AI`,sparseFillProcessing:`AI is finding words…`,sparseFillDismiss:`Dismiss suggestion`,sparseFillNoNewWords:`AI found no new unique words or phrases. Try changing the source list.`},tooltips:{help:`Help`,text:{title:`Smart Import accepts plain text, CSV/TSV, Excel .xlsx, and public Google Sheets. Tables with word and frequency columns are imported directly.`,languageProcessing:`Segments text according to its language before counting words. It is enabled by default; turn it off to use basic tokenization.`,keepCase:`Keeps the first detected casing for each word. When off, words are normalized to lowercase.`,countFrequency:`When on, repeated terms increase word weight. When off, every imported word receives weight 1.`,removeStopWords:`Filters common function words for the selected or auto-detected text languages plus the custom stop-word list.`,detectDuplicates:`When on, identical words are merged. When off, the original word sequence is preserved.`,lemmatizeWords:`When enabled, Russian and English word forms are normalized before frequency counting, so cars, c
8ar, running, and runs can share their base groups.`,russianLemmatize:`Conservatively groups supported Russian forms; ambiguous words stay separate and original spans are retained.`,englishLemmatize:`Groups English inflections into their dictionary forms before frequency counting, while retaining the original text spans.`,preserveStyles:`When on, import changes only the data. When off, font, palette, and basic text settings reset to defaults.`,replaceWordsOnly:`When on, import replaces the word table directly without reprocessing raw text. When off, the imported source goes through the normal text processor.`,includePhrases:`When enabled, repeated two-word combinations are added as phrases. When disabled, only individual words are used.`,includeEmoji:`When enabled, emoji are extracted as separate tokens and rendered with Twemoji SVG assets.`},words:{title:`The words section keeps quick entry, deletion, and repeat controls. Open the manager for sorting, bulk changes, and per-word font settings.`,sidebar:`Use the sidebar for word list and repeat controls. Pinning is only available for the selected canvas instance.`,manager:`The manager supports sorting by every column, bulk actions, and per-word controls for count, size, repeat, and font.`},ai:{title:`The AI assistant expands the entered topic or translates it into selected languages.`},style:{font:`The font affects both visual character and the actual word placement inside shapes.`,palette:`The palette defines available word colors. Color mode controls how those colors are assigned.`,colorMode:`Sequential follows the palette, random shuffles colors, and by frequency emphasizes more important words.`,fontSize:`Sets the minimum and maximum size range. In shape fill, the engine still adapts sizes inside this range instead of using fixed values.`},layout:{title:`Layout settings control free-space search, allowed angles, spacing between words, and the layout word limit.`,spiral:`The spiral controls how free space is searched in regular clouds without a shape.`,rotation:`Orientation defines allowed angles. Free angles work best for dense shape filling.`,padding:`Controls the minimum spacing between placed words. Lower values pack tighter; higher values leave more air.`,maxWords:`Caps how many words participate in layout generation. Applies to both regular clouds and shape filling; higher values can improve coverage but increase generation time.`},shape:{title:`The shape defines a mask where words are placed by pixel contours without crossing the boundary. Popular shapes are shown inline, and the full catalog opens separately.`,background:`The background highlights the shape area behind words and is included in PNG, JPG, SVG, and PDF export.`},stopWords:{title:`Stop words remove common function words so the cloud is not dominated by prepositions and conjunctions.`,enable:`When enabled, common function words are filtered for the selected language or for every supported language detected in the imported text.`},export:{title:`Export saves the current cloud with the selected format, quality, and background.`,format:`PNG/JPG are best for images, SVG keeps vector text, and PDF is useful for print and documents.`,quality:`SQ exports raster formats at 2x, HQ at 4x. PDF uses JPEG compression to avoid oversized files without useful detail.`,background:`Background affects only the exported file, not the editor workspace.`}},ai:{title:`AI Assistant`,serverMode:`Server`,setupApi:`Set up OpenRouter API`,actions:{topic:`Expand topic`,phrases:`Key phrases`,style:`Suggest style`},actionPlaceholders:{topic:`Topic: birthday, space...`,translateOnly:`Word or phrase to translate...`,style:`Topic for style (optional)`},actionPhrasesNote:`Extracts key phrases from your imported text.`,processing:`AI is thinking...`,apiKeyTitle:`OpenRouter API Key`,apiKeyDescription:`AI features require a free OpenRouter key. The key is stored only in your browser.`,getKey:`Get key at openrouter.ai`,save:`Save`,clear:`Remove`,promptHints:{title:`Quick fill`,rotate:`Show other prompts`},settings:{open:`AI settings`,action:`AI action`,actionHints:{topic:`Generates a word cloud from the topic you type.`,phrases:`Pulls key words and phrases from your imported text.`,style:`Picks a palette, font and shape to match your topic or text.`},title:`Generation settings`,description:`Control languages, volume, tone, and phrase density before calling AI.`,summary:`{{mode}} · {{languages}} · {{count}} · {{tone}}`,languagesCount:`{{count}} languages`,translationCount:`{{count}} translations`,generationMode:`Mode`,generationModes:{expand:`Expand topic`,translateOnly:`Translations only`}
8,generationModeHints:{expand:`AI will add words, phrases, and variants around the source topic using the selected count.`,translateOnly:`AI will return exactly one translation of the source word or phrase for each selected language.`},languages:`Language or languages`,languageLimit:`up to 30`,languagesPlaceholder:`Russian, English, Spanish...
9Separate with commas or new lines.`,currentLanguage:`Current`,twoLanguages:`RU + EN`,languagePresets:{ten:`10 languages`,twenty:`20 languages`,thirty:`30 languages`},wordCount:`Minimum words`,wordCountHint:`Use any value from 1 to 80. In translations-only mode, the final count equals the selected language count.`,tone:`Tone`,phraseMode:`Phrases`,creativity:`Variety`,preserveProperNouns:`Keep names and brands`,balancedLanguages:`Balance languages evenly`,reset:`Reset`,done:`Done`,tones:{neutral:`Neutral`,festive:`Festive`,professional:`Professional`,playful:`Playful`,poetic:`Poetic`,minimal:`Minimal`},phraseModes:{mixed:`Mixed`,words:`Words`,phrases:`Short phrases`}}},footer:{free:`Free and no registration required`,description:`Create shaped word clouds from text, CSV, Excel, and Google Sheets.`,github:`GitHub`,live:`Live cloud`,templates:`Templates`,wordMap:`Word map`,chromeExtension:`Chrome extension`,privacy:`Privacy`}},Ga={templateCommunity:{about:`Acerca de la plantilla`,author:`Nombre público del autor`,noAuthor:`Autor no indicado`,authorProfile:`Plantillas públicas de este autor`,uses:`Usos`,usesNote:`Aperturas en el editor, como máximo una por visitante al día. No son descargas.`,favorite:`Guardar favorito`,saved:`Guardado`,loginHint:`Inicia sesión para guardar favoritos`,actionError:`No se pudo guardar. Inténtalo de nuevo.`,license:`Condiciones de uso`,unspecified:`No indicadas`,licenseUnknown:`No se indicó una licencia. Publicar no concede permiso para cualquier uso; consulta al titular de los derechos si es necesario.`,licenseScope:`La eligió el autor y solo cubre materiales cuyos derechos posee. Las fuentes y otros elementos pueden tener condiciones propias.`,licenseTerms:`Leer la licencia`,versions:`Historial de versiones`,versionsNote:`Publicaciones de la misma serie. Las versiones guardadas no se sobrescriben.`,versionHow:`Abre el editor, modifica la plantilla y selecciona «Nueva versión» al publicar.`,contrast:`Comprobar contraste`,contrastNote:`Referencia: 4,5:1 para texto normal; 3:1 para texto grande (24 px o unos 19 px en negrita). Solo se evalúan los colores: la escala y las superposiciones afectan la lectura.`,backdrop:`Fondo para transparencia`,white:`Blanco`,dark:`Oscuro`,shapeBackground:`Fondo de la forma`,notMeasured:`Color no compatible con el cálculo`,normalText:`Texto normal y grande`,largeText:`Solo texto grande`,lowContrast:`Contraste inferior a 3:1`,related:`Plantillas similares`,relatedNote:`Por etiquetas, forma e idioma entre publicaciones recientes.`,relatedError:`Las plantillas similares no están disponibles.`,publicationDetails:`Detalles de publicación`,description:`Descripción`,tags:`Etiquetas`,tagsHint:`Hasta 8 etiquetas separadas por comas, de 32 caracteres.`,useCases:`Ideal para`,authorHint:`Opcional. El nombre y el perfil serán públicos. Un nombre nuevo actualiza tu perfil en todas las publicaciones.`,authorLogin:`El nombre público requiere iniciar sesión y una publicación pública.`,licenseConsent:`Elige una licencia solo para materiales cuyos derechos posees. Lee las condiciones: puede ser irrevocable.`,publishVersion:`Nueva versión de «{{title}}»`,myFavorites:`Mis favoritos`,allTemplates:`Todas las plantillas`,cases:{education:`Educación`,gift:`Regalo`,presentation:`Presentación`,social:`Redes sociales`,research:`Investigación`,decor:`Decoración`}},app:{title:`shapewords`,subtitle:`Generador de nube de palabras`,settings:`Ajustes`,openSettings:`Abrir configuración`,closeSettings:`Cerrar configuración`,account:`Cuenta`,openAccount:`Abrir cuenta`,signIn:`Iniciar sesión`,templates:`Plantillas`,openTemplates:`Abrir plantillas listas para usar`,wordMap:`Mapa de palabras`,openWordMap:`Abrir mapa 3D de palabras`,live:`En vivo`,openLive:`Abrir salas en vivo`,chromeExtension:`Chrome`,openChromeExtension:`Abrir extensión de Chrome`,chromeExtensionBadgeAlt:`Extensión de Chrome`,dismissChromeExtension:`Ocultar sugerencia de extensión de Chrome`,language:`Idioma`},common:{loading:`Cargando...`,on:`Activado`,off:`Desactivado`},account:{title:`Cuenta`,subtitle:`El historial de generación, las plantillas y los estilos se guardan en su cuenta.`,signInTitle:`Inicia sesión para guardar tu trabajo`,signInSubtitle:`Utilice una cuenta para el historial de generación, las plantillas y los estilos personales.`,login:`Iniciar sesión`,register:`Registro`,name:`Nombre`,email:`Correo electrónico`,password:`Contraseña`,confirmPassword:`Confirmar Contraseña`,passwordHint:`Requisitos de contraseña`,passwordMismatch:`Las contraseñas no coinciden.`,passwordMinLength:`Al menos 8 caracteres`,passwordLetter:`Al menos una letra`,passwordNumber:`Al menos un numero`,socialTitle:`Iniciar sesión con un servicio`,socialSubtitle:`Usa Google, Yandex, Facebook o X para iniciar sesión sin una contraseña aparte.`,socialDivider:`o`,socialGoogle:`Google`,socialFacebook:`Facebook`,socialX:`X`,socialYandex:`Yandex`,noAccount:`Crear una cuenta`,hasAccount:`Ya tienes una cuenta`,history:`Historia`,templates:`Plantillas`,styles:`Estilos`,account:`Cuenta`,saveHistory:`Ahorrar`,saveTemplate:`Plantilla`,saveStyle:`Estilo`,saveCurrentHistory:`Guardar generación`,saveCurrentTemplate:`Guardar plantilla`,saveCurrentStyle:`Guardar estilo`,saveHistoryHint:`Guarda la configuración actual de texto, forma, estilo y diseño como un elemento del historial.`,saveTemplateHint:`Guarda el proyecto actual como una plantilla reutilizable para nuevas nubes de palabras.`,saveStyleHint:`Guarda solo configuraciones visuales: fuente, paleta, fondo, orientación y opciones de visualización.`,
9saveName:`Nombre`,cancel:`Cancelar`,save:`Ahorrar`,close:`Cerrar cuenta`,backToEditor:`Volver al editor`,open:`Abierto`,apply:`Aplicar`,delete:`Borrar`,emptyHistory:`Aún no hay generaciones salvadas.`,emptyTemplates:`Aún no hay plantillas.`,emptyStyles:`Aún no hay estilos.`,words:`palabras`,placed:`metido`,logout:`desconectar`,signedInAs:`Iniciado sesión como`,palette:`paleta`,libraryActions:`Guardar trabajo actual`,libraryHint:`El historial guarda el proyecto completo, una plantilla mantiene un proyecto reutilizable y un estilo almacena solo configuraciones visuales.`,oauthCancelled:`Se canceló el inicio de sesión con el servicio externo.`,oauthEmailRequired:`El proveedor no devolvió un correo electrónico. Usa otro método de inicio de sesión.`,oauthEmailUnverified:`El proveedor no confirmó el correo electrónico. Usa otro método de inicio de sesión.`,oauthProviderDisabled:`Este método de inicio de sesión aún no está configurado.`,oauthStateInvalid:`La sesión de inicio de sesión expiró. Inténtalo de nuevo.`,oauthFailed:`No se pudo completar el inicio de sesión con el servicio externo.`},templates:{metaTitle:`Plantillas públicas de nubes de palabras | shapewords`,metaDescription:`Explora plantillas publicadas por la comunidad de shapewords y abre cualquier diseño en el editor.`,badge:`Colección abierta`,title:`Plantillas públicas`,description:`Explora nubes de palabras publicadas por la comunidad. Abre cualquier obra como plantilla y continúa editándola.`,searchPlaceholder:`Buscar títulos y palabras...`,languageFilter:`Idioma de la plantilla`,allLanguages:`Todos los idiomas`,resultCount:`{{count}} publicaciones`,resetSearch:`Restablecer búsqueda`,loadError:`No se pudieron cargar las plantillas públicas`,loadMore:`Mostrar más`,emptyTitle:`No se encontró nada`,emptyDescription:`Prueba otra búsqueda, elige todos los idiomas o publica la primera nube de esta sección.`,noPreview:`Vista previa no disponible`,wordsCount:`{{count}} palabras`,open:`Abierto`,backToList:`Todas las plantillas`,notFoundTitle:`Plantilla no encontrada`,notFoundDescription:`Esta tarjeta de plantilla pública no existe. Vuelva al catálogo y elija una de las plantillas ya preparadas.`,includesTitle:`que hay dentro`,shape:`Forma`,palette:`Paleta`,words:`Palabras`,useTemplate:`Usar plantilla`,useHint:`La plantilla carga texto, palabras, formas y estilos en el espacio de trabajo.`},text:{title:`Texto`,smartImport:`Importación inteligente`,smartImportDescription:`Texto, CSV/TSV, Excel .xlsx, Google Sheets y publicaciones de X, Reddit, Hacker News, YouTube, Telegram y feeds RSS`,closeSmartImport:`Cerrar importación inteligente`,smartImportPlaceholder:`Pegue texto, CSV/TSV, o arrastre y suelte un archivo...`,placeholder:`Pegue el texto aquí...`,sample:`Pruebe una muestra`,voiceInput:`Voz`,voiceStart:`Iniciar entrada por voz`,voiceStop:`Detener entrada por voz`,voiceStopShort:`Detener`,voiceListening:`Escuchando el micrófono`,voiceUnsupported:`La entrada por voz no es compatible con este navegador`,voicePermissionDenied:`El acceso al micrófono fue bloqueado. Permítelo e inténtalo de nuevo.`,voiceNoSpeech:`No se detectó voz. Inténtalo de nuevo y habla un poco más cerca del micrófono.`,voiceNoMicrophone:`No se encontró ninguna entrada de micrófono en este dispositivo.`,voiceError:`No se pudo iniciar la entrada por voz`,emoji:`emojis`,emojiSearchPlaceholder:`Buscar emoji: risa, fuego, corazón...`,emojiSearchLoading:`Cargando emojis`,emojiSearchNoResults:`No se encontraron emojis`,addEmojiAria:`Agregar {{emoji}}`,dropHint:`Suelte el archivo .txt, .csv, .tsv o .xlsx`,clear:`Claro`,importFile:`Archivo`,importText:`Importar texto`,googleSheets:`Google Sheets`,googleSheetsPlaceholder:`Enlace de hoja o publicado CSV`,googleFileSharingHelp:`Cómo compartir un archivo de Google`,import:`Importar`,xImport:`X (Twitter)`,xImportPlaceholder:`Pega un enlace de una publicación de x.com`,xImportHint:`Solo publicaciones públicas. Pega uno o varios enlaces: importamos el texto de la publicación.`,redditImport:`Reddit`,redditImportPlaceholder:`Pega un enlace de una publicación o subreddit de Reddit`,redditImportHint:`Solo hilos y subreddits públicos. Importamos títulos y comentarios.`,hnImport:`Hacker News`,hnImportPlaceholder:`Pega un enlace de un elemento de Hacker News`,hnImportHint:`Importamos la historia y sus comentarios.`,youtubeImport:`YouTube`,youtubeImportPlaceholder:`Pega un enlace de un vídeo de YouTube`,youtubeImportHint:`Importamos el título, la descripción, las etiquetas y los comentarios destacados.`,telegramImport:`Telegram`,telegramImportPlaceholder:`Pega un enlace de canal público o @nombre`,telegramImportHint:`Solo canales públicos. Importamos las publicaciones recientes.`,rssImport:`RSS`,rssImportPlaceholder:`Pega la URL de cualquier feed RSS o Atom`,rssImportHint:`Cualquier blog o feed de noticias. Importamos títulos y resúmenes de las entradas.`,importOptions:`Reglas de importación`,keepCase:`mantener el c
9aso`,countFrequency:`Frecuencia de conteo`,removeStopWords:`Eliminar palabras vacías`,detectDuplicates:`Detectar duplicados`,lemmatizeWords:`Lematizar`,languageProcessing:`Procesamiento lingüístico`,languageProcessingStatus:`Procesamiento: {{language}}`,languageProcessingSection:`Procesamiento lingüístico`,processingLanguage:`Idioma del texto`,autoLanguage:`Detectar automáticamente`,chineseLanguage:`Chino`,chineseScript:`Sistema de escritura chino`,chineseScriptAuto:`Detectar automáticamente`,chineseSimplified:`Chino simplificado`,chineseTraditional:`Chino tradicional`,chineseMode:`Modo de procesamiento del chino`,chineseFast:`Rápido`,chinesePrecise:`Preciso`,keepSingleHan:`Conservar caracteres han individuales`,includeNumbers:`Incluir números`,normalizeChineseVariants:`Unificar formas tradicionales y simplificadas`,minTokenLength:`Longitud mínima del término`,chineseStopWordsProfile:`Palabras vacías`,chineseStopWordsCore:`Seguras`,chineseStopWordsExtended:`Ampliadas`,chinesePosFilter:`Categorías gramaticales`,chinesePosAll:`Todas`,chinesePosContent:`Contenido`,chinesePosNouns:`Sustantivos`,chineseKeywordRanking:`Peso de términos`,chineseKeywordSmart:`Inteligente`,chineseKeywordFrequency:`Frecuencia`,chineseKeywordRankingHint:`El modo inteligente combina frecuencia, TF-IDF, TextRank, posición y categoría gramatical; la frecuencia original se conserva en los metadatos.`,englishLanguage:`Inglés`,englishProcessingHint:`El texto en inglés se analiza localmente en este navegador con etiquetado gramatical y lematización.`,englishPosFilter:`Categorías gramaticales`,englishPosAll:`Todos los términos`,englishPosContent:`Palabras léxicas`,englishPosNouns:`Sustantivos`,englishLemmatize:`Lematizar palabras inglesas`,englishStopWordsProfile:`Palabras vacías`,englishStopWordsCore:`Básicas`,englishStopWordsExtended:`Ampliadas`,englishStopWordsHint:`La lista básica elimina palabras funcionales comunes; la ampliada también filtra muletillas frecuentes.`,russianLanguage:`Ruso`,russianLocale:`Variante de ruso`,russianMode:`Modo de procesamiento del ruso`,russianFast:`Rápido`,russianPrecise:`OpenCorpora`,russianPreciseHint:`La importación precisa carga localmente solo los fragmentos necesarios del diccionario y no adivina formas ambiguas.`,russianPosFilter:`Partes de la oración`,russianPosAll:`Todas`,russianPosContent:`Palabras léxicas`,russianPosNouns:`Sustantivos`,russianLemmatize:`Lematizar palabras rusas`,russianYoNormalization:`Normalización Ё/Е`,russianYoPreserve:`Mantener Ё y Е por separado`,russianYoFold:`Unir Ё con Е`,russianYoHint:`La unión mejora la agrupación de frecuencias; la grafía original se conserva cuando es posible.`,russianStopWordsProfile:`Palabras vacías`,russianStopWordsCore:`Básicas`,russianStopWordsExtended:`Ampliadas`,russianStopWordsHint:`La lista básica elimina solo palabras funcionales seguras; la ampliada filtra más palabras de relleno frecuentes.`,genericLanguageProcessingHint:`La tokenización local básica está activa para este idioma. Seleccione chino, ruso o inglés para configurar un procesador detallado.`,customDictionary:`Diccionario personalizado`,customDictionaryPlaceholder:`Un término por línea. Los términos más largos tienen prioridad.`,synonyms:`Sinónimos`,synonymsPlaceholder:`Un grupo por línea: término principal: sinónimo 1, sinónimo 2`,processingPrivacyLocal:`El procesamiento se realiza localmente en tu navegador.`,preciseProcessingHint:`El modo preciso mejora la segmentación de palabras chinas y puede tardar un poco más.`,preserveStyles:`Preservar estilos`,replaceWordsOnly:`Reemplazar solo palabras`,includeEmoji:`emojis`,customStopWordsPlaceholder:`Lista personalizada de palabras vacías: una palabra por línea, coma o ;`,importResult:`{{source}}: {{count}} palabras, {{rows}} filas, {{mode}} modo`,includePhrases:`Frases`,importMode:{text:`texto`,table:`mesa`},errors:{xlsUnsupported:`El archivo .xls heredado aún no es compatible. Guarde el archivo como .xlsx o CSV.`,googleSheetsFailed:`No se pudo cargar Google Sheets. Utilice un enlace público o publicado CSV.`,googleSheetsInvalidUrl:`No parece un enlace válido de Google Sheets ni un CSV publicado. Pegue el enlace completo de la hoja o una URL CSV pública HTTPS.`,googleFileAccessDenied:`El documento de Google no es público. En Google Docs o Google Drive, abra Compartir y configure Acceso general como Cualquier persona con el enlace.`,importFailed:`No se pudieron importar datos`,xImportFailed:`No se pudo cargar la publicación de X. Usa un enlace público.`,redditImportFailed:`No se pudo cargar este enlace de Reddit. Usa una publicación o subreddit público.`,hnImportFailed:`No se pudo cargar este elemento de Hacker News. Usa un enlace público.`,youtubeImportFailed:`No se pudo cargar este vídeo de YouTube. Puede no estar disponible o la importación no está configurada.`,telegramImportFailed:`No se pudo cargar este canal de Telegram. Usa un enlace de canal público.`,rssImportFailed:`No se pudo cargar este feed. Usa una URL de RSS o Atom válida.`}},words:{title:`Palabras`,word:`Palabra`,editWord:`Editar palabra`,delete:`Eliminar palabra`,clearList:`Borrar lista de palabras`,count:`Frecuencia`,size:`Tamaño`,sizeTitle:`Escala de palabras o emojis relativa a la frecuencia`,sizeWord:`Tamaño de {{word}}`,resetSize:`Restablecer tamaño`,resetSizeShort:`100`,empty:`Introduce texto a analizar`,total:`{{count}} palabras`,filteredTotal:`{{count}} de {{total}}
9`,searchPlaceholder:`Buscar palabra o emoji`,noMatches:`No hay coincidencias`,showing:`Mostrando {{shown}} de {{count}}`,emoji:`emojis`,repeatShort:`reps.`,repeatTitle:`Repita la palabra mientras completa`,repeatWord:`Repita {{word}} mientras llena`,enableRepeatWord:`Activar repetición de {{word}}`,disableRepeatWord:`Desactivar repetición de {{word}}`,managerTitle:`Gestor de palabras`,managerApply:`Aplicar`,managerDescription:`{{count}} elementos con ordenación, acciones masivas y ajustes por palabra.`,openManager:`Gestionar palabras`,selected:`Seleccionadas: {{count}}`,selectAll:`Seleccionar todas las palabras visibles`,kind:`Tipo`,frequencyValue:`Peso {{count}}`,bulkActions:`Acciones masivas`,bulkDescription:`Aplica un cambio a todas las palabras seleccionadas a la vez.`,bulkFont:`Fuente masiva`,fontAutoAll:`Auto para las seleccionadas`,repeatOn:`Repetición activada`,repeatOff:`Repetición desactivada`,repeatAll:`Repetir todo`,deleteSelected:`Eliminar seleccionadas`,wordFont:`Fuente de la palabra`,addWord:`Añadir palabra`,addPlaceholder:`Añadir otra…`,addPlaceholderEmpty:`Escribe una palabra y pulsa Enter`,emptyListTitle:`La lista de palabras está vacía`,emptyListDescription:`Añade palabras en el formulario de arriba: escribe una palabra y pulsa Enter.`,sourceTitle:`Texto de origen`,sourceDescription:`Pega o importa texto para convertirlo en palabras.`},style:{title:`Estilo`,font:`Fuente`,uploadFont:`Subir fuente`,customFonts:`Personalizado {{count}}`,customFontsBadge:`{{count}}`,fontLoading:`Cargando`,deleteCustomFont:`Eliminar fuente personalizada`,scriptFonts:`Fuentes de idioma`,autoFont:`Auto`,fontUpload:{title:`Sube una fuente personalizada`,description:`Agregue un archivo de fuente que pueda ser utilizado por el generador de nube de palabras.`,formatsTitle:`Formatos soportados`,formatsBody:`Se recomienda WOFF2. También se aceptan archivos WOFF, TTF y OTF de hasta 6 MB. Es posible que las colecciones, archivos, fuentes SVG y fuentes de color/variables de TTC no funcionen de manera confiable.`,licenseTitle:`Condiciones de uso`,licenseOwn:`Cargue únicamente fuentes que tenga derecho a utilizar.`,licenseAllowed:`Son adecuadas las fuentes gratuitas y de código abierto, como por ejemplo SIL OFL, Apache o licencias similares. Las fuentes comerciales son adecuadas sólo cuando su licencia permite el uso web/escritorio y la generación de imágenes.`,licenseRestricted:`No cargue fuentes cuya licencia prohíba la incrustación, el uso web, la creación de imágenes o el uso en servicios de generación.`,storageTitle:`Donde se almacena el archivo`,storageBody:`El archivo se almacena localmente en este navegador usando IndexedDB y no se envía al servidor durante la carga. Las exportaciones desde este navegador utilizarán la fuente, pero los enlaces públicos y otro navegador pueden recurrir si el mismo archivo no está disponible allí.`,warning:`Un archivo se trata como un estilo. Cargue archivos separados si necesita estilos Regular, Negrita o Cursiva.`,chooseFile:`Elija el archivo de fuente`},palette:`Paleta`,customPalette:`Costumbre`,customPaletteTitle:`paleta personalizada`,customPaletteHint:`Crea un conjunto de colores de palabras. Los cambios se aplican a la nube actual inmediatamente.`,addCustomColor:`agregar color`,removeCustomColor:`Quitar color`,resetCustomPalette:`Restablecer paleta`,customColorNumber:`Color {{number}}`,colorMode:`Modo de color`,sequential:`Secuencial`,random:`Aleatorio`,byFrequency:`Por frecuencia`,fontSize:`Rango de tamaño`,min:`mín.`,max:`máx.`,morePalettes:`Todas las paletas`,paletteDialogTitle:`Paleta de colores`,paletteDialogCount:`{{count}} paletas`,closePalettes:`Cerrar paletas`},layout:{title:`Disposición`,spiral:`Espiral`,archimedean:`Arquímedes`,rectangular:`Rectangular`,rotation:`Orientación`,horizontal:`Horizontal`,mixed:`Mezclado`,vertical:`Vertical`,orthogonal:`horizontales verticales`,crossing:`Cruzando Horizontal Vertical`,crossingVoids:`Cruzando vacíos`,dancing:`palabras bailando`,positiveSlope:`Diagonal ascendente`,negativeSlope:`Diagonal descendente`,random:`Aleatorio`,custom:`Costumbre`,moreOrientations:`Todas las orientaciones`,orientationDialogTitle:`orientación de la palabra`,orientationDialogCount:`{{count}} modos`,closeOrientations:`Cerrar orientaciones`,crossingPreview:`Cruce`,voidsPreview:`vacíos`,dancingPreview:`Baile`,wordsPreview:`Palabras`,positivePreview:`Ascendente`,negativePreview:`Descendente`,slopePreview:`Diagonal`,customAngles:`Anglos`,customAnglesPlaceholder:`0, -30, 30, 90`,angled:`Angular`,free:`ángulos libres`,padding:`Espaciado`,maxWords:`Límite de palabras`},shape:{title:`Forma`,popular:`Popular`,selected:`Seleccionado`,openCatalog:`Catalogar`,catalogTitle:`Catálogo de formas`,catalogCount:`{{count}} formas`,closeCatalog:`Cerrar catálogo de formas`,catalogCustomize:`Personalizar forma`,catalogColor:`Color de forma`,catalogInvert:`Invertir forma`,catalogInvertHint:`Rellenar el área alrededor de este contorno en lugar del c
9ontorno.`,catalogBack:`Atrás`,catalogEditFree:`Editar`,catalogApply:`Aplicar`,searchPlaceholder:`Buscar formas y etiquetas`,catalogEmpty:`No se encontraron formas`,deleteShape:`Eliminar forma "{{name}}"`,deleteShapeConfirm:`¿Eliminar la forma "{{name}}" de tus formas?`,customTitle:`Forma personalizada`,customDescription:`Dibuja un contorno en el constructor o importa una imagen.`,builderOpen:`Constructor`,builderTitle:`Constructor de formas`,builderDescription:`Construya un contorno de puntos o convierta letras y dígitos en una máscara vectorial.`,builderDrawMode:`Contorno`,builderTextMode:`Letras y dígitos`,builderControls:`como dibujar`,builderHintAdd:`Haga clic o toque la cuadrícula para agregar un nuevo punto.`,builderHintDrag:`Arrastre los nodos para remodelar el contorno. La forma se cierra automáticamente.`,builderHintSnap:`Un imán ligero apunta a la rejilla. Mantenga presionada la tecla Alt para evitar el ajuste.`,builderTextInput:`Personajes`,builderTextPlaceholder:`Un 2026`,builderTextFont:`Fuente`,builderTextFontSearch:`Fuente de búsqueda`,builderTextFontSearchClear:`Borrar búsqueda de fuentes`,builderTextFontSearchEmpty:`No se encontraron fuentes`,builderTextStyle:`Estilo`,builderTextInvert:`Invertir`,builderTextInvertHint:`Por defecto las letras están rellenas. Cuando se invierte, se llena el área que los rodea.`,builderTextLoading:`Preparando el esquema`,builderTextPreviewEmpty:`Ingrese letras o dígitos`,builderTextError:`No se pudo crear una forma de texto`,builderUndo:`Deshacer`,builderClear:`Claro`,builderReset:`Muestra`,builderApply:`Usar forma`,builderStats:`{{count}} puntos, área {{area}}`,builderShapeName:`forma vectorial`,builderEditedSuffix:`editado`,closeBuilder:`Cerrar constructor`,editShape:`Editar forma`,customUpload:`Subir`,customThreshold:`Umbral de máscara`,customReady:`La forma "{{name}}" está lista`,customError:`No se pudo crear una forma a partir de la imagen.`,customModes:{auto:`Auto`,alpha:`Alfa`,contrast:`Contraste`},categories:{all:`Todo`,basic:`Básico`,nature:`Naturaleza`,animals:`animales`,kids:`Niños`,numbers:`Números`,objects:`Objetos`,symbols:`Símbolos`,travel:`Viajar`,brands:`Marcas`,custom:`Costumbre`},mode:`Modo`,frequency:`Por frecuencia`,fill:`Rellenar forma`,background:`Fondo de forma`,backgroundNone:`Sin antecedentes`,backgroundWhite:`fondo claro`,backgroundSky:`Fondo del cielo`,backgroundMint:`Fondo de menta`,backgroundWarm:`Fondo cálido`,backgroundRose:`Fondo rosa`,backgroundCustom:`Elija el color de fondo de la forma`},stopWords:{title:`detener las palabras`,enable:`Filtrar palabras vacías`,language:`Idioma`,auto:`Auto`,ru:`ruso`,en:`Inglés`,es:`Español`,fr:`Francés`,ar:`Árabe`,zh:`Chino`},export:{title:`Exportar`,format:`Formato`,quality:`Calidad`,background:`Fondo`,transparent:`Transparente`,white:`Blanco`,dark:`Oscuro`,save:`Ahorrar`,download:`Descargar`,toggleOptions:`Opciones de exportación`,close:`Cerrar`,printReady:`Listo para imprimir PDF`,printReadyDescription:`Hoja fija, márgenes y marcas de impresión.`,page:`Página`,margin:`Margen`,bleed:`Sangrar`,safeZone:`Zona segura`,cropMarks:`Marcas de recorte`,downloading:`Descargando...`,watermark:`fuente: {{site}}`,hideWatermark:`Sin copyright del servicio`,hideWatermarkDescription:`Quitar la firma con la dirección del sitio de la exportación`},publish:{button:`Compartir`,creating:`Publicando...`,title:`Publicar nube`,description:`Crea un enlace a esta nube con su diseño, forma y estilo actuales.`,publicLifetime:`La plantilla pública se conserva indefinidamente y se clasifica en el idioma actual.`,privateLifetime:`El enlace privado funciona durante 90 días y no aparece en el catálogo.`,defaultTitle:`Mi nube de palabras`,nameLabel:`Título de la publicación`,namePlaceholder:`Por ejemplo, Mapa de ideas`,publicNotice:`El título, las palabras y la imagen serán visibles para todos en el catálogo público.`,privateToggle:`Mantener un enlace privado`,privateDescription:`No mostrar este trabajo en el catálogo público`,privateNotice:`La plantilla solo estará disponible para quienes tengan el enlace. El enlace dejará de funcionar después de 90 días.`,create:`Publicar plantilla`,createPrivate:`Crear enlace privado`,publicResult:`La plantilla se publicó en el catálogo y se conservará indefinidamente.`,privateResult:`El enlace privado estará activo durante 90 días. La plantilla no aparece en el catálogo.`,newPublication:`Nueva`,link:`Enlace`,copy:`Copiar`,copied:`Copiado`,open:`Abierto`,close:`Cerca`,native:`Compartir`,nativeTitle:`shapewords nube de palabras`,socialTitle:`Publicar`,socialOpen:`Publicar en {{name}}`,socialPreviewNote:`La imagen se muestra mediante Open Graph cuando la red obtiene la vista previa del enlace.`,qrAlt:`Código QR del enlace`,empty:`Genera una nube primero`,error:`No se pudo publicar la plantilla`,previewError:`No se pudo preparar la vista previa`},templatePage:{badge:`Plantilla pública`,description:`Explora las palabras, la forma, la paleta y la composición de esta plantilla publicada.`,back:`Catálogo de plantillas`,loading:`Cargando plantilla...`,words:`{{count}} palabras`,notFoundTitle:`Enlace no encontrado`,expiredTitle:`Este enlace ha caducado`,expiredDescription:`Este enlace antiguo ya no está activo. Elige otra plantilla del catálogo.`,loadError:`No se pudo cargar la plantilla`,applyError:`No se pudo abrir la plantilla en el editor`,copyError:`No se pudo copiar el enlace`,templateNumber:`Plantilla · {{id}}`,copyLink:`Copiar enlace`,copied:`Enlace copiado`,useTemplate:`Usar esta plantilla`,opening:`Abriendo...`,language:`Idioma`,shape:`Forma`,shapeCaption:`Contorno seleccionado de la nube`,font:`Tipografía`,orientation:`Orientación`,fontSize:`Escala tipográfica`,published:`Publicada`,details:`Detalles de la plantilla`,contents:`Contenido`,preview:`Vista previa`,usedWords:`Palabras utilizadas`,wordWeight:`Peso de la palabra`,colorScheme:`Gama de colores`,customPalette:`Paleta personalizada`,technicalDetails:`Detalles de composición`,spiral:`Espiral`,wordSpacing:`Espacio entre palabras`,colorMode:`Orden de colores`,wordLimit:`Límite de palabras`,placedWords:`Palabras colocad
9as`,canvasSize:`Lienzo`,viewMode:`Vista`,readyBadge:`Hazla tuya`,readyTitle:`Conserva la composición. Cambia la historia.`,readyDescription:`Abre la plantilla en el editor para sustituir palabras, ajustar la forma y los colores o exportar el resultado.`},wordMap:{metaTitle:`Mapa 3D interactivo de palabras del mundo | shapewords`,metaDescription:`Explora palabras frecuentes de las últimas noticias de Google News RSS por país en un globo 3D interactivo con caché diaria.`,title:`Mapa mundial de palabras`,search:`Buscar lugar`,searchPlaceholder:`Buscar país`,placePicker:`Selector de lugar`,country:`País`,results:`Resultados`,noResults:`No se encontraron lugares`,world:`Mundo`,toggleOrbit:`Activar o desactivar rotación del globo`,words:`Palabras`,empty:`Selecciona un país`,scale:{world:`mundo`,country:`país`},newsSource:`Google News RSS`,newsSelectCountry:`Busca y selecciona un país para cargar palabras de noticias`,newsReady:`Palabras de noticias listas`,newsLoading:`Cargando palabras frecuentes de noticias`,newsFresh:`Cargado desde Google News RSS`,newsCached:`Usando la caché diaria de noticias`,newsErrorShort:`Noticias no disponibles`,newsError:`No se pudieron cargar palabras de noticias del país`,newsEmpty:`No se encontraron palabras frecuentes`,reloadNews:`Recargar palabras de noticias`},canvas:{undo:`Deshacer`,redo:`Rehacer`,generate:`Generar`,regenerate:`Regenerado`,fullscreen:`Pantalla completa`,zoom:`Zoom`,showGrid:`Mostrar cuadrícula`,hideGrid:`Ocultar cuadrícula`,openMenuHint:`Abre el menú para agregar palabras.`,emptyTitle:`El espacio de trabajo está vacío.`,emptyDesktopDescription:`Agregue texto en el panel izquierdo o use el ejemplo para crear una nube de palabras.`,emptyMobileDescription:`Abra el menú y agregue texto para crear una nube de palabras.`,generating:`Generando...`,assigningFontsProgress:`Asignando fuentes`,loadingFontsProgress:`Cargando fuentes`,prepareProgress:`Preparante`,preparingOutlineProgress:`Creando contornos`,fillProgress:`Forma de relleno`,shapeWordCountLabel:`palabras en forma`,progressAssigningFonts:`Eligiendo glifos compatibles`,progressLoadingFonts:`Cargando archivos de fuente`,progressPreparing:`Máscara, fuentes y glifos`,progressPreparingOutline:`Convirtiendo palabras en contornos`,progressWords:`{{placed}} / {{target}} palabras`,progressPlaced:`{{placed}} palabras`,selectedWord:`palabra seleccionada`,selectWord:`Seleccione la palabra {{word}}`,editWord:`Editar palabra {{word}}`,wordColor:`Color`,wordFont:`Fuente`,wordSize:`Tamaño`,wordRotation:`Rotación`,wordCurve:`Curva`,pinWord:`Posición del pasador`,unpinWord:`Posición de liberación`,protectPinnedArea:`Proteger toda el área de la frase`,unprotectPinnedArea:`Quitar la protección del área de la frase`,pinConflict:`La posición está fijada, pero la palabra entra parcialmente en conflicto con la forma u otra palabra fijada.`,deleteWord:`Eliminar palabra`,mainAccentTitle:`¿Añadir un punto focal?`,mainAccentDescription:`«{{word}}» puede convertirse en el centro visual. Elegiremos una fuente expresiva y adaptaremos el tamaño, giro o curvatura a la forma. Las palabras rellenarán el espacio alrededor.`,mainAccentProcessing:`Eligiendo una fuente…`,mainAccentFontError:`No se pudo cargar una fuente para destacar. Inténtalo de nuevo.`,mainAccentAction:`Convertir en protagonista`,mainAccentDismiss:`Ocultar sugerencia`,sparseFillTitle:`Aún queda espacio en la forma`,sparseFillDescription:`Las repeticiones están desactivadas y no hay suficientes elementos para rellenarla. La IA puede buscar nuevos sinónimos y frases breves relacionadas.`,sparseFillAction:`Buscar sinónimos con IA`,sparseFillProcessing:`La IA está buscando palabras…`,sparseFillDismiss:`Ocultar sugerencia`,sparseFillNoNewWords:`La IA no encontró palabras ni frases nuevas y únicas. Prueba a cambiar la lista original.`},tooltips:{help:`Ayuda`,text:{title:`Smart Import acepta texto sin formato, CSV/TSV, Excel .xlsx y público Google Sheets. Las tablas con columnas de palabras y frecuencia se importan directamente.`,languageProcessing:`Segmenta el texto según su idioma antes de contar la fre
9cuencia. Está activado de forma predeterminada; desactívalo para usar la segmentación básica.`,keepCase:`Mantiene la primera mayúscula detectada para cada palabra. Cuando está desactivado, las palabras se normalizan a minúsculas.`,countFrequency:`Cuando está activado, los términos repetidos aumentan el peso de las palabras. Cuando está desactivado, cada palabra importada recibe un peso 1.`,removeStopWords:`Filtra palabras funcionales comunes para el idioma seleccionado o para todos los idiomas compatibles detectados en el texto, además de la lista personalizada de palabras irrelevantes.`,detectDuplicates:`Cuando está activado, se fusionan palabras idénticas. Cuando está desactivado, se conserva la secuencia de palabras original.`,lemmatizeWords:`Cuando está habilitado, las formas de las palabras en ruso e inglés se normalizan antes del conteo de frecuencia, por lo que autos, autos, carreras y carreras pueden compartir sus grupos base.`,russianLemmatize:`Agrupa de forma conservadora las formas rusas compatibles; las palabras ambiguas se mantienen separadas y se conservan los intervalos originales.`,englishLemmatize:`Agrupa las flexiones inglesas en sus formas de diccionario antes del conteo y conserva los intervalos originales del texto.`,preserveStyles:`Cuando está activado, la importación cambia solo los datos. Cuando está desactivado, la configuración de fuente, paleta y texto básico se restablece a los valores predeterminados.`,replaceWordsOnly:`Cuando está activado, la importación reemplaza la tabla de palabras directamente sin reprocesar el texto sin formato. Cuando está desactivado, la fuente importada pasa por el procesador de texto normal.`,includePhrases:`Cuando está habilitado, las combinaciones repetidas de dos palabras se agregan como frases. Cuando está deshabilitado, solo se utilizan palabras individuales.`,includeEmoji:`Cuando está habilitado, los emoji se extraen como tokens separados y se representan con recursos Twemoji SVG.`},words:{title:`La sección de palabras mantiene entrada rápida, eliminación y controles de repetición. Abre el gestor para ordenar, editar en masa y ajustar fuentes por palabra.`,sidebar:`Usa la barra lateral para gestionar la lista de palabras y la repetición. La fijación solo está disponible para la instancia seleccionada en el lienzo.`,manager:`El gestor permite ordenar por todas las columnas, acciones masivas y control por palabra de frecuencia, tamaño, repetición y fuente.`},ai:{title:`El asistente de IA amplía el tema introducido o lo traduce a los idiomas seleccionados.`},style:{font:`La fuente afecta tanto el carácter visual como la ubicación real de las palabras dentro de las formas.`,palette:`La paleta define los colores de palabras disponibles. El modo de color controla cómo se asignan esos colores.`,colorMode:`Secuencial sigue la paleta, aleatoriamente mezcla los colores y por frecuencia enfatiza las palabras más importantes.`,fontSize:`Define el rango mínimo y máximo de tamaño. Al rellenar una forma, el motor sigue adaptando los tamaños dentro de este rango en lugar de usar valores fijos.`},layout:{title:`La configuración de diseño controla la búsqueda de espacio libre, los ángulos permitidos, el espaciado entre palabras y el límite de palabras del layout.`,spiral:`La espiral controla cómo se busca el espacio libre en nubes regulares y sin forma.`,rotation:`La orientación define los ángulos permitidos. Los ángulos libres funcionan mejor para rellenos de formas densas.`,padding:`Controla la distancia mínima entre palabras colocadas. Los valores bajos compactan más; los altos dejan más aire.`,maxWords:`Limita cuántas palabras participan en la generación del layout. Se aplica tanto a las nubes normales como al relleno de formas; valores más altos pueden mejorar la cobertura, pero aumentan el tiempo de generación.`},shape:{title:`La forma define una máscara donde las palabras se colocan mediante contornos de píxeles sin cruzar el límite. Las formas populares se muestran en línea y el catálogo completo se abre por separado.`,background:`El fondo resalta el área de forma detrás de las palabras y se incluye en la exportación PNG, JPG, SVG y PDF.`},stopWords:{title:`Las palabras vacías eliminan las palabras funcionales comunes para que la nube no esté dominada por preposiciones y conjunciones.`,enable:`Cuando está habilitado, las palabras funcionales comunes se filtran para el idioma seleccionado o para todos los idiomas compatibles detectados en el texto importado.`},export:{title:`Exportar guarda la nube actual con el formato, la calidad y el fondo seleccionados.`,format:`PNG/JPG son mejores para imágenes, SVG mantiene texto vectorial y PDF es útil para 
9impresiones y documentos.`,quality:`SQ exporta formatos ráster a 2x, HQ a 4x. PDF utiliza compresión JPEG para evitar archivos de gran tamaño sin detalles útiles.`,background:`El fondo afecta sólo al archivo exportado, no al espacio de trabajo del editor.`}},ai:{title:`Asistente de IA`,serverMode:`Servidor`,setupApi:`Configurar la API OpenRouter`,actions:{topic:`Ampliar tema`,phrases:`Frases clave`,style:`Sugerir estilo`},actionPlaceholders:{topic:`Tema: cumpleaños, espacio...`,translateOnly:`Palabra o frase para traducir...`,style:`Tema para el estilo (opcional)`},actionPhrasesNote:`Extrae frases clave de tu texto importado.`,processing:`La IA está pensando...`,apiKeyTitle:`OpenRouter Clave API`,apiKeyDescription:`Las funciones de IA requieren una clave OpenRouter gratuita. La clave se almacena únicamente en su navegador.`,getKey:`Obtenga la clave en openrouter.ai`,save:`Ahorrar`,clear:`Eliminar`,promptHints:{title:`Inserción rápida`,rotate:`Mostrar otras sugerencias`},settings:{open:`Configuración de IA`,action:`Acción de IA`,actionHints:{topic:`Genera una nube de palabras a partir del tema que escribas.`,phrases:`Extrae palabras y frases clave de tu texto importado.`,style:`Elige paleta, fuente y forma según tu tema o texto.`},title:`Configuración de generación`,description:`Controle los idiomas, el volumen, el tono y la densidad de frases antes de llamar a AI.`,summary:`{{mode}} · {{languages}} · {{count}} · {{tone}}`,languagesCount:`{{count}} idiomas`,translationCount:`{{count}} traducciones`,generationMode:`Modo`,generationModes:{expand:`Ampliar tema`,translateOnly:`Sólo traducciones`},generationModeHints:{expand:`La IA agregará palabras, frases y variantes en torno al tema de origen utilizando el recuento seleccionado.`,translateOnly:`La IA devolverá exactamente una traducción de la palabra o frase de origen para cada idioma seleccionado.`},languages:`Idioma o idiomas`,languageLimit:`hasta 30`,languagesPlaceholder:`Ruso, inglés, español...
10Sepárelos con comas o líneas nuevas.`,currentLanguage:`Actual`,twoLanguages:`RU + EN`,languagePresets:{ten:`10 idiomas`,twenty:`20 idiomas`,thirty:`30 idiomas`},wordCount:`Palabras mínimas`,wordCountHint:`Utilice cualquier valor desde 1 hasta 80. En el modo de solo traducción, el recuento final es igual al recuento del idioma seleccionado.`,tone:`Tono`,phraseMode:`Frases`,creativity:`Variedad`,preserveProperNouns:`Mantener nombres y marcas`,balancedLanguages:`Equilibra los idiomas de manera uniforme`,reset:`Reiniciar`,done:`Hecho`,tones:{neutral:`Neutral`,festive:`Festivo`,professional:`Profesional`,playful:`Juguetón`,poetic:`Poético`,minimal:`Mínimo`},phraseModes:{mixed:`Mezclado`,words:`Palabras`,phrases:`Frases cortas`}}},footer:{free:`Gratis y sin necesidad de registrarse`,description:`Cree nubes de palabras con formas a partir de texto, CSV, Excel y Google Sheets.`,github:`GitHub`,live:`Nube viva`,templates:`Plantillas`,wordMap:`Mapa de palabras`,chromeExtension:`Extensión de Chrome`,privacy:`Privacidad`}},Ka={templateCommunity:{about:`À propos du modèle`,author:`Nom public de l’auteur`,noAuthor:`Auteur non renseigné`,authorProfile:`Modèles publics de cet auteur`,uses:`Utilisations`,usesNote:`Ouvertures dans l’éditeur, au plus une par visiteur et par jour. Ce ne sont pas des téléchargements.`,favorite:`Ajouter aux favoris`,saved:`En favori`,loginHint:`Connectez-vous pour enregistrer des favoris`,actionError:`Échec de l’enregistrement. Réessayez.`,license:`Conditions de réutilisation`,unspecified:`Non précisées`,licenseUnknown:`Aucune licence fournie. Publier n’autorise pas tous les usages ; contactez le titulaire des droits si nécessaire.`,licenseScope:`Choisie par l’auteur, elle ne couvre que les éléments dont il détient les droits. Les polices et éléments tiers peuvent avoir leurs propres conditions.`,licenseTerms:`Lire la licence`,versions:`Historique des versions`,versionsNote:`Publications distinctes d’une même série. Les versions enregistrées ne sont pas écrasées.`,versionHow:`Ouvrez l’éditeur, modifiez le modèle puis choisissez « Nouvelle version » à la publication.`,contrast:`Vérifier le contraste`,contrastNote:`Repères : 4,5:1 pour le texte normal, 3:1 pour le grand texte (24 px ou environ 19 px en gras). Seules les couleurs sont évaluées : l’échelle et les chevauchements influencent la lisibilité.`,backdrop:`Fond pour la transparence`,white:`Blanc`,dark:`Sombre`,shapeBackgroun
10d:`Fond de la forme`,notMeasured:`Couleur non prise en charge`,normalText:`Texte normal et grand`,largeText:`Grand texte uniquement`,lowContrast:`Contraste inférieur à 3:1`,related:`Modèles similaires`,relatedNote:`Par mots-clés, forme et langue parmi les publications récentes.`,relatedError:`Les modèles similaires sont indisponibles.`,publicationDetails:`Détails de publication`,description:`Description`,tags:`Mots-clés`,tagsHint:`Jusqu’à 8 mots-clés séparés par des virgules, de 32 caractères.`,useCases:`Adapté à`,authorHint:`Facultatif. Ce nom et ce profil seront publics. Un nouveau nom modifie votre profil dans toutes vos publications.`,authorLogin:`Le nom public nécessite une connexion et une publication publique.`,licenseConsent:`Ne choisissez une licence que pour les éléments dont vous détenez les droits. Lisez les conditions : elle peut être irrévocable.`,publishVersion:`Nouvelle version de « {{title}} »`,myFavorites:`Mes favoris`,allTemplates:`Tous les modèles`,cases:{education:`Éducation`,gift:`Cadeau`,presentation:`Présentation`,social:`Réseaux sociaux`,research:`Recherche`,decor:`Décoration`}},app:{title:`shapewords`,subtitle:`Générateur de nuages ​​de mots`,settings:`Paramètres`,openSettings:`Ouvrir les paramètres`,closeSettings:`Fermer les paramètres`,account:`Compte`,openAccount:`Ouvrir un compte`,signIn:`Se connecter`,templates:`Modèles`,openTemplates:`Ouvrir des modèles prêts à l'emploi`,wordMap:`Carte de mots`,openWordMap:`Ouvrir la carte 3D de mots`,live:`Live`,openLive:`Ouvrir les salles live`,chromeExtension:`Chrome`,openChromeExtension:`Ouvrir l'extension Chrome`,chromeExtensionBadgeAlt:`Extension Chrome`,dismissChromeExtension:`Masquer la suggestion d'extension Chrome`,language:`Langue`},common:{loading:`Chargement...`,on:`Activé`,off:`Désactivé`},account:{title:`Compte`,subtitle:`L'historique des générations, les modèles et les styles sont enregistrés sur votre compte.`,signInTitle:`Connectez-vous pour enregistrer votre travail`,signInSubtitle:`Utilisez un compte pour l'historique des générations, les modèles et les styles personnels.`,login:`Se connecter`,register:`Registre`,name:`Nom`,email:`E-mail`,password:`Mot de passe`,confirmPassword:`Confirmez le mot de passe`,passwordHint:`Exigences de mot de passe`,passwordMismatch:`Les mots de passe ne correspondent pas.`,passwordMinLength:`Au moins 8\xA0caractères`,passwordLetter:`Au moins une lettre`,passwordNumber:`Au moins un numéro`,socialTitle:`Se connecter avec un service`,socialSubtitle:`Utilisez Google, Yandex, Facebook ou X pour vous connecter sans mot de passe séparé.`,socialDivider:`ou`,socialGoogle:`Google`,socialFacebook:`Facebook`,socialX:`X`,socialYandex:`Yandex`,noAccount:`Créer un compte`,hasAccount:`Vous avez déjà un compte`,history:`Histoire`,templates:`Modèles`,styles:`Styles`,account:`Compte`,saveHistory:`Sauvegarder`,saveTemplate:`Modèle`,saveStyle:`Style`,saveCurrentHistory:`Sauvegarder la génération`,saveCurrentTemplate:`Enregistrer le modèle`,saveCurrentStyle:`Enregistrer le style`,saveHistoryHint:`Enregistre les paramètres actuels de texte, de forme, de style et de mise en page en tant qu’élément d’historique.`,saveTemplateHint:`Enregistre le projet actuel en tant que modèle réutilisable pour de nouveaux nuages ​​de mots.`,saveStyleHint:`Enregistre uniquement les paramètres visuels\xA0: options de police, de palette, d’arrière-plan, d’orientation et d’affichage.`,saveName:`Nom`,cancel:`Annuler`,save:`Sauvegarder`,close:`Fermer le compte`,backToEditor:`Retour à l'éditeur`,open:`Ouvrir`,apply:`Appliquer`,delete:`Supprimer`,emptyHistory:`Aucune génération sauvée pour l’instant.`,emptyTemplates:`Aucun modèle pour l'instant.`,emptyStyles:`Aucun style pour l'instant.`,words:`mots`,placed:`mis`,logout:`se déconnecter`,signedInAs:`Connecté en tant que`,palette:`palette`,libraryActions:`Enregistrer le travail en cours`,libraryHint:`L'historique conserve le projet complet, un modèle conserve un projet réutilisable et un style stocke uniquement les paramètres visuels.`,oauthCancelled:`La connexion via le service externe a été annulée.`,oauthEmailRequired:`Le fournisseur n'a pas renvoyé d'adresse e-mail. Utilisez une autre méthode de connexion.`,oauthEmailUnverified:`Le fournisseur n'a pas confirmé l'adresse e-mail. Utilisez une autre méthode de connexion.`,oauthProviderDisabled:`Cette méthode de connexion n'est pas encore configurée.`,oauthStateInvalid:`La session de connexion a expiré. Réessayez.`,oauthFailed:`Impossible de terminer la connexion via le service externe.`},templates:{metaTitle:`Modèles publics de nuages de mots | shapewords`,metaDescription:`Explorez les modèles publiés par la communauté shapewords et ouvrez chaque création dans l’éditeur.`,badge:`Collection ouverte`,title:`Modèles publics`,description:`Explorez les nuages de mots publiés par la communauté. Ouvrez une création comme modèle et continuez à la modifier.`,searchPlaceholder:`Rechercher des titres et des mots...`,languageFilter:`Langue du modèle`,allLanguages:`Toutes les langues`,resultCount:`{{count}} publications`,resetSearch:`Réinitialiser`,loadError:`Impossible de charger les modèles publics`,loadMore:`Afficher plus`,emptyTitle:`Aucun résultat`,emptyDescription:`Essayez une autre recherche, choisissez toutes les langues ou publiez le premier nuage de cette section.`,noPreview:`Aperçu indisponible`,wordsCount:`{{count}} mots`,open:`Ouvrir`,backToList:`Tous les modèles`,notFoundTitle:`Modèle introuvable`,notFoundDescription:`Ce modèle de carte public n'existe pas. Revenez au catalogue et 
10choisissez l'un des modèles prêts à l'emploi.`,includesTitle:`Qu'y a-t-il à l'intérieur`,shape:`Forme`,palette:`Palette`,words:`Mots`,useTemplate:`Utiliser un modèle`,useHint:`Le modèle charge du texte, des mots, des formes et des styles dans l'espace de travail.`},text:{title:`Texte`,smartImport:`Importation intelligente`,smartImportDescription:`Texte, CSV/TSV, Excel .xlsx, Google Sheets et publications de X, Reddit, Hacker News, YouTube, Telegram et flux RSS`,closeSmartImport:`Fermer l'importation intelligente`,smartImportPlaceholder:`Collez du texte, CSV/TSV, ou faites glisser et déposez un fichier...`,placeholder:`Collez le texte ici...`,sample:`Essayez un échantillon`,voiceInput:`Voix`,voiceStart:`Démarrer la saisie vocale`,voiceStop:`Arrêter la saisie vocale`,voiceStopShort:`Arrêter`,voiceListening:`Microphone en écoute`,voiceUnsupported:`La saisie vocale n'est pas prise en charge dans ce navigateur`,voicePermissionDenied:`L'accès au microphone a été bloqué. Autorisez-le puis réessayez.`,voiceNoSpeech:`Aucune voix détectée. Réessayez en parlant un peu plus près du microphone.`,voiceNoMicrophone:`Aucune entrée microphone n'a été trouvée sur cet appareil.`,voiceError:`Impossible de démarrer la saisie vocale`,emoji:`Émoji`,emojiSearchPlaceholder:`Rechercher emoji : rire, feu, cœur...`,emojiSearchLoading:`Chargement des emoji`,emojiSearchNoResults:`Aucun emoji trouvé`,addEmojiAria:`Ajouter {{emoji}}`,dropHint:`Supprimez le fichier .txt, .csv, .tsv ou .xlsx`,clear:`Clair`,importFile:`Déposer`,importText:`Importer du texte`,googleSheets:`Google Sheets`,googleSheetsPlaceholder:`Lien vers la feuille ou CSV publié`,googleFileSharingHelp:`Comment partager un fichier Google`,import:`Importer`,xImport:`X (Twitter)`,xImportPlaceholder:`Collez le lien d’un post x.com`,xImportHint:`Posts publics uniquement. Collez un ou plusieurs liens : nous importons le texte du post.`,redditImport:`Reddit`,redditImportPlaceholder:`Collez un lien de publication ou de subreddit Reddit`,redditImportHint:`Fils et subreddits publics uniquement. Nous importons les titres et les commentaires.`,hnImport:`Hacker News`,hnImportPlaceholder:`Collez un lien d’élément Hacker News`,hnImportHint:`Nous importons l’article et ses commentaires.`,youtubeImport:`YouTube`,youtubeImportPlaceholder:`Collez un lien de vidéo YouTube`,youtubeImportHint:`Nous importons le titre, la description, les tags et les meilleurs commentaires.`,telegramImport:`Telegram`,telegramImportPlaceholder:`Collez un lien de canal public ou @nom`,telegramImportHint:`Canaux publics uniquement. Nous importons les publications récentes.`,rssImport:`RSS`,rssImportPlaceholder:`Collez l’URL de n’importe quel flux RSS ou Atom`,rssImportHint:`N’importe quel blog ou flux d’actualités. Nous importons les titres et résumés des éléments.`,importOptions:`Règles d'importation`,keepCase:`Conserver l'étui`,countFrequency:`Fréquence de comptage`,removeStopWords:`Supprimer les mots vides`,detectDuplicates:`Détecter les doublons`,lemmatizeWords:`Lemmatiser`,languageProcessing:`Traitement linguistique`,languageProcessingStatus:`Traitement : {{language}}`,languageProcessingSection:`Traitement linguistique`,processingLanguage:`Langue du texte`,autoLanguage:`Détection automatique`,chineseLanguage:`Chinois`,chineseScript:`Système d’écriture chinois`,chineseScriptAuto:`Détection automatique`,chineseSimplified:`Chinois simplifié`,chineseTraditional:`Chinois traditionnel`,chineseMode:`Mode de traitement du chinois`,chineseFast:`Rapide`,chinesePrecise:`Précis`,keepSingleHan:`Conserver les caractères han isolés`,includeNumbers:`Inclure les nombres`,normalizeChineseVariants:`Fusionner les formes traditionnelles et simplifiées`,minTokenLength:`Longueur minimale des termes`,chineseStopWordsProfile:`Mots vides`,chineseStopWordsCore:`Sûrs`,chineseStopWordsExtended:`Étendus`,chinesePosFilter:`Catégories grammaticales`,chinesePosAll:`Toutes`,chinesePosContent:`Contenu`,chinesePosNouns:`Noms`,chineseKeywordRanking:`Pondération des termes`,chineseKeywordSmart:`Intelligente`,chineseKeywordFrequency:`Fréquence`,chineseKeywordRankingHint:`Le mode intelligent combine fréquence, TF-IDF, TextRank, position et catégorie grammaticale ; la fréquence brute reste disponible dans les métadonnées.`,englishLanguage:`Anglais`,englishProcessingHint:`Le texte anglais est analysé localement dans ce navigateur avec étiquetage grammatical et lemmatisation.`,englishPosFilter:`Parties du discours`,englishPosAll:`Tous les termes`,englishPosContent:`Mots pleins`,englishPosNouns:`Noms`,englishLemmatize:`Lemmatiser les mots anglais`,englishStopWordsProfile:`Mots vides`,englishStopWordsCore:`De base`,englishStopWordsExtended:`Étendus`,englishStopWordsHint:`La liste de base retire les mots-outils fréquents ; la liste étendue filtre aussi les mots de remplissage récurrents.`,russianLanguage:`Russe`,russianLocale:`Variante du russe`,russianMode:`Mode de traitement du russe`,russianFast:`Rapide`,russianPrecise:`OpenCorpora`,russianPreciseHint:`L’import précis charge localement seulement les fragments utiles du dictionnaire et ne devine jamais les formes ambiguës.`,russianPosFilter:`Parties du discours`,russianPosAll:`Toutes`,russianPosContent:`Mots pleins`,russianPosNouns:`Noms`,russianLemmatize:`Lemmatiser les mots russes`,russianYoNormalization:`Normalisation Ё/Е`,russianYoPreserve:`Conserver Ё et Е distincts`,russianYoFold:`Fusionner Ё avec Е`,russianYoHint:`La fusion améliore le regroupement des fréquences ; l’orthographe d’origine est conservée lorsque possible.`,russianStopWordsProfile:`Mots vides`,russianStopWordsCore:`De base`,russianStopWordsExtended:`Étendus`,russianStopWordsHint:`La liste de base retire seulement les mots-outils certains ; la liste étendue filtre davantage de mots de remplissage fréquents.`,genericLanguageProcessingHint:`La tokenisation locale de base est active pour cette langue. Sélectionnez le chinois, le russe ou l’anglais pour configurer un processeur détaillé.`,customDictionary:`Dictionnaire personnalisé`,customDictionaryPlaceholder:`Un terme par ligne. Les termes les plus longs sont prioritaires.`,synonyms:`Synonymes`,synonymsPlaceholder:`Un groupe par ligne : terme principal : synonyme 1, synonyme 2`,processingPrivacyLocal:`Le traitement s’effectue localement dans votre navigateur.`,preciseProcessingHint:`Le mode précis améliore le découpage des mots chinois et peut prendre un peu plus de temps.`,preserveStyles:`Préserver les styles`,replaceWordsOnly:`Remplacer uniquement les mots`,includeEmoji:`Émoji`,customStopWordsPlaceholder:`Liste de mots vides personnalisée\xA0: un mot par ligne, virgule ou\xA0;`,importResult:`{{source}}\xA0: {{count}} mots, {{rows}} lignes, mode {{mode}}`,includePhrases:`Phrases`,importMode:{text:`texte`,table:`tableau`}
10,errors:{xlsUnsupported:`Les anciens fichiers .xls ne sont pas encore pris en charge. Enregistrez le fichier sous .xlsx ou CSV.`,googleSheetsFailed:`Impossible de charger Google Sheets. Utilisez un lien public ou un CSV publié.`,googleSheetsInvalidUrl:`Ce lien ne semble pas être un lien Google Sheets valide ni un CSV publié. Collez le lien complet de la feuille ou une URL CSV publique en HTTPS.`,googleFileAccessDenied:`Le document Google n'est pas accessible publiquement. Dans Google Docs ou Google Drive, ouvrez Partager et réglez l'accès général sur Toute personne disposant du lien.`,importFailed:`Impossible d'importer les données`,xImportFailed:`Impossible de charger le post X. Utilisez un lien public.`,redditImportFailed:`Impossible de charger ce lien Reddit. Utilisez une publication ou un subreddit public.`,hnImportFailed:`Impossible de charger cet élément Hacker News. Utilisez un lien public.`,youtubeImportFailed:`Impossible de charger cette vidéo YouTube. Elle est peut-être indisponible ou l’import n’est pas configuré.`,telegramImportFailed:`Impossible de charger ce canal Telegram. Utilisez un lien de canal public.`,rssImportFailed:`Impossible de charger ce flux. Utilisez une URL RSS ou Atom valide.`}},words:{title:`Mots`,word:`Mot`,editWord:`Modifier le mot`,delete:`Supprimer le mot`,clearList:`Effacer la liste de mots`,count:`Fréquence`,size:`Taille`,sizeTitle:`Échelle de mots ou d'emojis par rapport à la fréquence`,sizeWord:`Taille de {{word}}`,resetSize:`Réinitialiser la taille`,resetSizeShort:`100`,empty:`Saisir le texte à analyser`,total:`{{count}} mots`,filteredTotal:`{{count}} sur {{total}}`,searchPlaceholder:`Rechercher un mot ou un emoji`,noMatches:`Aucune correspondance`,showing:`Affichage de {{shown}} sur {{count}}`,emoji:`émoticône`,repeatShort:`représentant.`,repeatTitle:`Répétez le mot en remplissant`,repeatWord:`Répétez {{word}} pendant le remplissage`,enableRepeatWord:`Activer la répétition de {{word}}`,disableRepeatWord:`Désactiver la répétition de {{word}}`,managerTitle:`Gestionnaire de mots`,managerApply:`Appliquer`,managerDescription:`{{count}} éléments avec tri, actions groupées et réglages par mot.`,openManager:`Gérer les mots`,selected:`Sélectionnés : {{count}}`,selectAll:`Sélectionner tous les mots visibles`,kind:`Type`,frequencyValue:`Poids {{count}}`,bulkActions:`Actions groupées`,bulkDescription:`Appliquez une modification à tous les mots sélectionnés en une fois.`,bulkFont:`Police groupée`,fontAutoAll:`Auto pour la sélection`,repeatOn:`Répétition activée`,repeatOff:`Répétition désactivée`,repeatAll:`Tout répéter`,deleteSelected:`Supprimer la sélection`,wordFont:`Police du mot`,addWord:`Ajouter un mot`,addPlaceholder:`Ajouter un autre…`,addPlaceholderEmpty:`Tapez un mot et appuyez sur Entrée`,emptyListTitle:`La liste de mots est vide`,emptyListDescription:`Ajoutez des mots dans le formulaire ci-dessus : tapez un mot puis appuyez sur Entrée.`,sourceTitle:`Texte source`,sourceDescription:`Collez ou importez du texte pour le transformer en mots.`},style:{title:`Style`,font:`Fonte`,uploadFont:`Télécharger la police`,customFonts:`Personnalisé {{count}}`,customFontsBadge:`{{count}}`,fontLoading:`Chargement`,deleteCustomFont:`Supprimer la police personnalisée`,scriptFonts:`Polices de langue`,autoFont:`Auto`,fontUpload:{title:`Téléchargez une police personnalisée`,description:`Ajoutez un fichier de police pouvant être utilisé par le générateur de nuages ​​de mots.`,formatsTitle:`Formats pris en charge`,formatsBody:`WOFF2 est recommandé. Les fichiers WOFF, TTF et OTF jusqu'à 6 Mo sont également acceptés. Les collections TTC, les archives, les polices SVG et les polices de couleurs/variables peuvent ne pas fonctionner de manière fiable.`,licenseTitle:`Conditions d'utilisation`,licenseOwn:`Téléchargez uniquement les polices que vous avez le droit d'utiliser.`,licenseAllowed:`Les polices gratuites et open source, par exemple SIL OFL, Apache ou des licences similaires, conviennent. Les polices commerciales ne conviennent que lorsque votre licence autorise une utilisation sur le Web/ordinateur de bureau et la génération d'images.`,licenseRestricted:`Ne téléchargez pas de polices dont la licence interdit l'intégration, l'utilisation sur le Web, la création d'images ou l'utilisation dans des services de génération.`,storageTitle:`Où le fichier est stocké`,storageBody:`Le fichier est stocké localement dans ce navigateur à l'aide de IndexedDB et n'est pas envoyé au serveur lors du téléchargement. Les exp
10ortations à partir de ce navigateur utiliseront la police, mais les liens publics et un autre navigateur peuvent revenir si le même fichier n'y est pas disponible.`,warning:`Un fichier est traité comme un seul style. Téléchargez des fichiers séparés si vous avez besoin de styles régulier, gras ou italique.`,chooseFile:`Choisir le fichier de police`},palette:`Palette`,customPalette:`Coutume`,customPaletteTitle:`Palette personnalisée`,customPaletteHint:`Créez un jeu de couleurs de mots. Les modifications sont immédiatement appliquées au cloud actuel.`,addCustomColor:`Ajouter de la couleur`,removeCustomColor:`Supprimer la couleur`,resetCustomPalette:`Réinitialiser la palette`,customColorNumber:`Couleur {{number}}`,colorMode:`Mode couleur`,sequential:`Séquentiel`,random:`Aléatoire`,byFrequency:`Par fréquence`,fontSize:`Plage de taille`,min:`Min.`,max:`Max.`,morePalettes:`Toutes les palettes`,paletteDialogTitle:`Palette de couleurs`,paletteDialogCount:`{{count}} palettes`,closePalettes:`Fermer les palettes`},layout:{title:`Mise en page`,spiral:`Spirale`,archimedean:`Archimédien`,rectangular:`Rectangulaire`,rotation:`Orientation`,horizontal:`Horizontal`,mixed:`Mixte`,vertical:`Verticale`,orthogonal:`Horizontale Verticale`,crossing:`Traversée horizontale verticale`,crossingVoids:`Traverser les vides`,dancing:`Mots dansants`,positiveSlope:`Diagonale montante`,negativeSlope:`Diagonale descendante`,random:`Aléatoire`,custom:`Coutume`,moreOrientations:`Toutes les orientations`,orientationDialogTitle:`Orientation des mots`,orientationDialogCount:`Modes {{count}}`,closeOrientations:`Orientations proches`,crossingPreview:`Passage`,voidsPreview:`Vides`,dancingPreview:`Dansant`,wordsPreview:`Mots`,positivePreview:`Montante`,negativePreview:`Descendante`,slopePreview:`Diagonale`,customAngles:`Angles`,customAnglesPlaceholder:`0, -30, 30, 90`,angled:`Incliné`,free:`Angles libres`,padding:`Espacement`,maxWords:`Limite de mots`},shape:{title:`Forme`,popular:`Populaire`,selected:`Choisi`,openCatalog:`Catalogue`,catalogTitle:`Catalogue de formes`,catalogCount:`{{count}} formes`,closeCatalog:`Fermer le catalogue de formes`,catalogCustomize:`Personnaliser la forme`,catalogColor:`Couleur de forme`,catalogInvert:`Inverser la forme`,catalogInvertHint:`Remplir la zone autour de ce contour au lieu du contour lui-même.`,catalogBack:`Retour`,catalogEditFree:`Modifier`,catalogApply:`Appliquer`,searchPlaceholder:`Rechercher des formes et des balises`,catalogEmpty:`Aucune forme trouvée`,deleteShape:`Supprimer la forme « {{name}} »`,deleteShapeConfirm:`Supprimer la forme « {{name}} » de vos formes ?`,customTitle:`Forme personnalisée`,customDescription:`Dessinez un contour dans le constructeur ou importez une image`,builderOpen:`Constructeur`,builderTitle:`Constructeur de forme`,builderDescription:`Créez un contour de point ou transformez des lettres et des chiffres en un masque vectoriel.`,builderDrawMode:`Contour`,builderTextMode:`Lettres et chiffres`,builderControls:`Comment dessiner`,builderHintAdd:`Cliquez ou appuyez sur la grille pour ajouter un nouveau point.`,builderHintDrag:`Faites glisser les nœuds pour remodeler le contour. La forme se ferme automatiquement.`,builderHintSnap:`Un aimant lumineux accroche les points sur la grille. Maintenez Alt pour contourner l’accrochage.`,builderTextInput:`Personnages`,builderTextPlaceholder:`Un 2026`,builderTextFont:`Fonte`,builderTextFontSearch:`Rechercher une police`,builderTextFontSearchClear:`Effacer la recherche de polices`,builderTextFontSearchEmpty:`Aucune police trouvée`,builderTextStyle:`Style`,builderTextInvert:`Inverser`,builderTextInvertHint:`Par défaut les lettres sont remplies. Lorsqu'ils sont inversés, la zone qui les entoure est remplie.`,builderTextLoading:`Préparation du plan`,builderTextPreviewEmpty:`Saisir des lettres ou des chiffres`,builderTextError:`Impossible de créer une forme de texte`,builderUndo:`Défaire`,builderClear:`Clair`,builderReset:`Échantillon`,builderApply:`Utiliser la forme`,builderStats:`{{count}} points, zone {{area}}`,builderShapeName:`Forme vectorielle`,builderEditedSuffix:`modifié`,closeBuilder:`Fermer le constructeur`,editShape:`Modifier la forme`,customUpload:`Télécharger`,customThreshold:`Seuil de masque`,customReady:`La forme "{{name}}" est prête`,customError:`Impossible de créer une forme à partir de l'image`,customModes:{auto:`Auto`,alpha:`Alpha`,contrast:`Contraste`},categories:{all:`Tous`,basic:`Basique`,nature:`Nature`,animals:`Animaux`,kids:`Enfants`,numbers:`Nombres`,objects:`Objets`,symbols:`Symboles`,travel:`Voyage`,brands:`Marques`,custom:`Coutume`},mode:`Mode`,frequency:`Par fréquence`,fill:`Remplir la forme`,background:`Fond de forme`,backgroundNone:`Aucun arrière-plan`,backgroundWhite:`Fond clair`,backgroundSky:`Fond de ciel`,backgroundMint:`Fond de menthe`,backgroundWarm:`Fond chaleureux`,backgroundRose:`Fond de rose
10s`,backgroundCustom:`Choisir la couleur d'arrière-plan de la forme`},stopWords:{title:`Mots vides`,enable:`Filtrer les mots vides`,language:`Langue`,auto:`Auto`,ru:`russe`,en:`Anglais`,es:`Espagnol`,fr:`Français`,ar:`Arabe`,zh:`Chinois`},export:{title:`Exporter`,format:`Format`,quality:`Qualité`,background:`Arrière-plan`,transparent:`Transparent`,white:`Blanc`,dark:`Sombre`,save:`Sauvegarder`,download:`Télécharger`,toggleOptions:`Options d'exportation`,close:`Fermer`,printReady:`Prêt à imprimer PDF`,printReadyDescription:`Feuille fixe, marges et marques d'impression`,page:`Page`,margin:`Marge`,bleed:`Saigner`,safeZone:`Zone de sécurité`,cropMarks:`Marques de coupe`,downloading:`Téléchargement...`,watermark:`source : {{site}}`,hideWatermark:`Sans copyright du service`,hideWatermarkDescription:`Retirer la signature du site des exports`},publish:{button:`Partager`,creating:`Publication...`,title:`Publier le nuage`,description:`Crée un lien vers ce nuage avec sa mise en page, sa forme et son style actuels.`,publicLifetime:`Le modèle public est conservé indéfiniment et classé dans la langue actuelle.`,privateLifetime:`Le lien privé fonctionne pendant 90 jours et n’apparaît pas dans le catalogue.`,defaultTitle:`Mon nuage de mots`,nameLabel:`Titre de la publication`,namePlaceholder:`Par exemple, Carte des idées`,publicNotice:`Le titre, les mots et l’image seront visibles par tous dans le catalogue public.`,privateToggle:`Conserver un lien privé`,privateDescription:`Ne pas afficher ce travail dans le catalogue public`,privateNotice:`Le modèle est accessible uniquement aux personnes qui possèdent le lien. Le lien cessera de fonctionner après 90 jours.`,create:`Publier le modèle`,createPrivate:`Créer un lien privé`,publicResult:`Le modèle est publié dans le catalogue et conservé indéfiniment.`,privateResult:`Le lien privé est actif pendant 90 jours. Le modèle n’apparaît pas dans le catalogue.`,newPublication:`Nouveau`,link:`Lien`,copy:`Copie`,copied:`Copié`,open:`Ouvrir`,close:`Fermer`,native:`Partager`,nativeTitle:`Nuage de mots shapewords`,socialTitle:`Publier`,socialOpen:`Publier sur {{name}}`,socialPreviewNote:`L’image est transmise via Open Graph lorsque le réseau récupère l’aperçu du lien.`,qrAlt:`Code QR du lien`,empty:`Générez d'abord un cloud`,error:`Impossible de publier le modèle`,previewError:`Impossible de préparer l’aperçu`},templatePage:{badge:`Modèle public`,description:`Explorez les mots, la forme, la palette et la composition de ce modèle publié.`,back:`Catalogue de modèles`,loading:`Chargement du modèle...`,words:`{{count}} mots`,notFoundTitle:`Lien introuvable`,expiredTitle:`Ce lien a expiré`,expiredDescription:`Cet ancien lien n’est plus actif. Choisissez un autre modèle dans le catalogue.`,loadError:`Impossible de charger le modèle`,applyError:`Impossible d’ouvrir le modèle dans l’éditeur`,copyError:`Impossible de copier le lien`,templateNumber:`Modèle · {{id}}`,copyLink:`Copier le lien`,copied:`Lien copié`,useTemplate:`Utiliser ce modèle`,opening:`Ouverture...`,language:`Langue`,shape:`Forme`,shapeCaption:`Contour sélectionné du nuage`,font:`Police`,orientation:`Orientation`,fontSize:`Échelle typographique`,published:`Publié`,details:`Détails du modèle`,contents:`Contenu`,preview:`Aperçu`,usedWords:`Mots utilisés`,wordWeight:`Poids du mot`,colorScheme:`Gamme de couleurs`,customPalette:`Palette personnalisée`,technicalDetails:`Détails de composition`,spiral:`Spirale`,wordSpacing:`Espacement des mots`,colorMode:`Ordre des couleurs`,wordLimit:`Limite de mots`,placedWords:`Mots placés`,canvasSize:`Canevas`,viewMode:`Vue`,readyBadge:`Personnalisez-le`,readyTitle:`Gardez la composition. Changez l’histoire.`,readyDescription:`Ouvrez le modèle dans l’éditeur pour remplacer les mots, ajuster la forme et les couleurs ou exporter le résultat.`},wordMap:{metaTitle:`Carte mondiale 3D interactive de mots | shapewords`,metaDescription:`Explorez les mots fréquents des derniers résultats Google News RSS par pays sur un globe 3D interactif avec cache quotidien.`,title:`Carte mondiale des mots`,search:`Rechercher un lieu`,searchPlaceholder:`Rechercher un pays`,placePicker:`Sélecteur de lieu`,country:`Pays`,results:`Résultats`,noResults:`Aucun lieu trouvé`,world:`Monde`,toggleOrbit:`Activer ou désactiver la rotation du globe`,words:`Mots`,empty:`Sélectionnez un pays`,scale:{world:`monde`,country:`pays`},newsSource:`Google News RSS`,newsSelectCountry:`Recherchez et sélectionnez un pays pour charger les mots des actualités`,newsReady:`Mots d’actualité prêts`,newsLoading:`Chargement des mots fréquents des actualités`,newsFresh:`Chargé depuis Google News RSS`,newsCached:`Cac
10he quotidien des actualités utilisé`,newsErrorShort:`Actualités indisponibles`,newsError:`Impossible de charger les mots d’actualité du pays`,newsEmpty:`Aucun mot fréquent trouvé`,reloadNews:`Recharger les mots d’actualité`},canvas:{undo:`Défaire`,redo:`Refaire`,generate:`Générer`,regenerate:`Régénérer`,fullscreen:`Plein écran`,zoom:`Zoom`,showGrid:`Afficher la grille`,hideGrid:`Masquer la grille`,openMenuHint:`Ouvrez le menu pour ajouter des mots`,emptyTitle:`L'espace de travail est vide`,emptyDesktopDescription:`Ajoutez du texte dans le panneau de gauche ou utilisez l'exemple pour créer un nuage de mots.`,emptyMobileDescription:`Ouvrez le menu et ajoutez du texte pour créer un nuage de mots.`,generating:`Générateur...`,assigningFontsProgress:`Attribution des polices`,loadingFontsProgress:`Chargement des polices`,prepareProgress:`Préparation`,preparingOutlineProgress:`Création des contours`,fillProgress:`Forme de remplissage`,shapeWordCountLabel:`Des mots en forme`,progressAssigningFonts:`Choix des glyphes compatibles`,progressLoadingFonts:`Chargement des fichiers de police`,progressPreparing:`Masque, polices et glyphes`,progressPreparingOutline:`Conversion des mots en contours`,progressWords:`{{placed}} / {{target}} mots`,progressPlaced:`{{placed}} mots`,selectedWord:`Mot sélectionné`,selectWord:`Sélectionnez le mot {{word}}`,editWord:`Modifier le mot {{word}}`,wordColor:`Couleur`,wordFont:`Fonte`,wordSize:`Taille`,wordRotation:`Rotation`,wordCurve:`Courbe`,pinWord:`Position des broches`,unpinWord:`Désépingler la position`,protectPinnedArea:`Protéger toute la zone de la phrase`,unprotectPinnedArea:`Retirer la protection de la phrase`,pinConflict:`La position est épinglée, mais le mot est partiellement en conflit avec la forme ou avec un autre mot épinglé.`,deleteWord:`Supprimer le mot`,mainAccentTitle:`Ajouter un point focal ?`,mainAccentDescription:`« {{word}} » peut devenir le centre visuel. Nous choisirons une police expressive et adapterons sa taille, sa rotation ou sa courbure à la forme. Les mots rempliront l’espace autour.`,mainAccentProcessing:`Choix de la police…`,mainAccentFontError:`Impossible de charger une police pour l’accent. Réessayez.`,mainAccentAction:`Mettre au premier plan`,mainAccentDismiss:`Masquer la suggestion`,sparseFillTitle:`Il reste de l’espace dans la forme`,sparseFillDescription:`Les répétitions sont désactivées et il manque des éléments pour un remplissage dense. L’IA peut trouver de nouveaux synonymes et de courtes expressions liées.`,sparseFillAction:`Trouver des synonymes avec l’IA`,sparseFillProcessing:`L’IA recherche des mots…`,sparseFillDismiss:`Masquer la suggestion`,sparseFillNoNewWords:`L’IA n’a trouvé aucun nouveau mot ni aucune nouvelle expression unique. Modifiez la liste source.`},tooltips:{help:`Aide`,text:{title:`Smart Import accepte le texte brut, CSV/TSV, Excel .xlsx et public Google Sheets. Les tableaux avec des colonnes de mots et de fréquences sont importés directement.`,languageProcessing:`Segmente le texte selon sa langue avant de compter les fréquences. Cette option est activée par défaut ; désactivez-la pour utiliser la segmentation de base.`,keepCase:`Conserve la première casse détectée pour chaque mot. Lorsqu'elle est désactivée, les mots sont normalisés en minuscules.`,countFrequency:`Lorsque cette option est activée, les termes répétés augmentent le poids du mot. Lorsqu'elle est désactivée, chaque mot importé reçoit un poids 1.`,removeStopWords:`Filtre les mots-outils courants pour la langue sélectionnée ou pour toutes les langues prises en charge détectées dans le texte, ainsi que la liste personnalisée.`,detectDuplicates:`Lorsque cette option est activée, les mots identiques sont fusionnés. Lorsqu'elle est désactivée, la séquence de mots d'origine est préservée.`,lemmatizeWords:`Lorsqu'elles sont activées, les formes de mots russes et anglais sont normalisées avant le comptage de fréquence, afin que les voitures, les voitures, les courses et les courses puissent partager leurs groupes de base.`,russianLemmatize:`Regroupe prudemment les formes russes prises en charge ; les mots ambigus restent séparés et les plages d’origine sont conservées.`,englishLemmatize:`Regroupe les flexions anglaises sous leurs formes de dictionnaire avant le comptage et 
10conserve les plages de texte d’origine.`,preserveStyles:`Lorsque cette option est activée, l'importation modifie uniquement les données. Lorsqu'elle est désactivée, les paramètres de police, de palette et de texte de base sont réinitialisés aux valeurs par défaut.`,replaceWordsOnly:`Lorsqu'elle est activée, l'importation remplace directement le tableau de mots sans retraiter le texte brut. Lorsqu'elle est désactivée, la source importée passe par le traitement de texte normal.`,includePhrases:`Lorsqu'elle est activée, les combinaisons répétées de deux mots sont ajoutées sous forme d'expressions. Lorsqu'il est désactivé, seuls des mots individuels sont utilisés.`,includeEmoji:`Lorsqu'ils sont activés, les emoji sont extraits sous forme de jetons séparés et rendus avec les actifs Twemoji SVG.`},words:{title:`La section des mots garde la saisie rapide, la suppression et les contrôles de répétition. Ouvrez le gestionnaire pour le tri, l’édition groupée et les polices par mot.`,sidebar:`Utilisez la barre latérale pour gérer la liste de mots et la répétition. L’épinglage est disponible seulement pour l’instance sélectionnée sur le canevas.`,manager:`Le gestionnaire prend en charge le tri sur toutes les colonnes, les actions groupées et le contrôle du poids, de la taille, de la répétition et de la police pour chaque mot.`},ai:{title:`L’assistant IA développe le sujet saisi ou le traduit dans les langues sélectionnées.`},style:{font:`La police affecte à la fois le caractère visuel et le placement réel des mots dans les formes.`,palette:`La palette définit les couleurs de mots disponibles. Le mode couleur contrôle la façon dont ces couleurs sont attribuées.`,colorMode:`Séquentiel suit la palette, mélange les couleurs de manière aléatoire et, par fréquence, met l'accent sur les mots les plus importants.`,fontSize:`Définit la plage de taille minimale et maximale. Lors du remplissage d’une forme, le moteur adapte toujours les tailles à l’intérieur de cette plage au lieu d’utiliser des valeurs fixes.`},layout:{title:`Les paramètres de mise en page contrôlent la recherche d’espace libre, les angles autorisés, l’espacement entre les mots et la limite de mots du layout.`,spiral:`La spirale contrôle la façon dont l'espace libre est recherché dans les nuages ​​​​réguliers sans forme.`,rotation:`L'orientation définit les angles autorisés. Les angles libres fonctionnent mieux pour le remplissage de formes denses.`,padding:`Contrôle l’espacement minimal entre les mots placés. Les valeurs faibles densifient la composition ; les valeurs élevées laissent plus d’air.`,maxWords:`Limite le nombre de mots participant à la génération de la mise en page. S’applique aux nuages classiques comme au remplissage de formes ; des valeurs plus élevées peuvent améliorer la couverture mais augmentent le temps de génération.`},shape:{title:`La forme définit un masque où les mots sont placés par des contours de pixels sans franchir la frontière. Les formes populaires sont affichées en ligne et le catalogue complet s'ouvre séparément.`,background:`L'arrière-plan met en évidence la zone de forme derrière les mots et est inclus dans l'exportation PNG, JPG, SVG et PDF.`},stopWords:{title:`Les mots vides suppriment les mots de fonction courants afin que le nuage ne soit pas dominé par les prépositions et les conjonctions.`,enable:`Lorsqu'elle est activée, la suppression s'applique à la langue sélectionnée ou à toutes les langues prises en charge détectées dans le texte importé.`},export:{title:`L'exportation enregistre le cloud actuel avec le format, la qualité et l'arrière-plan sélectionnés.`,format:`PNG/JPG sont les meilleurs pour les images, SVG conserve le texte vectoriel et PDF est utile pour l'impression et les documents.`,quality:`SQ exporte les formats raster à 2x, HQ à 4x. PDF utilise la compression JPEG pour éviter les fichiers surdimensionnés sans détails utiles.`,background:`L’arrière-plan affecte uniquement le fichier exporté, pas l’espace de travail de l’éditeur.`}},ai:{title:`Assistant IA`,serverMode:`Serveur`,setupApi:`Configurer l'API OpenRouter`,actions:{topic:`Développer le sujet`,phrases:`Phrases clés`,style:`
10Suggérer un style`},actionPlaceholders:{topic:`Sujet : anniversaire, espace...`,translateOnly:`Mot ou phrase à traduire...`,style:`Sujet pour le style (facultatif)`},actionPhrasesNote:`Extrait les phrases clés de votre texte importé.`,processing:`L'IA pense...`,apiKeyTitle:`Clé API OpenRouter`,apiKeyDescription:`Les fonctionnalités d'IA nécessitent une clé OpenRouter gratuite. La clé est stockée uniquement dans votre navigateur.`,getKey:`Obtenez la clé sur openrouter.ai`,save:`Sauvegarder`,clear:`Retirer`,promptHints:{title:`Remplissage rapide`,rotate:`Afficher d'autres suggestions`},settings:{open:`Paramètres de l'IA`,action:`Action IA`,actionHints:{topic:`Génère un nuage de mots à partir du sujet saisi.`,phrases:`Extrait les mots et phrases clés de votre texte importé.`,style:`Choisit palette, police et forme selon votre sujet ou texte.`},title:`Paramètres de génération`,description:`Contrôlez les langues, le volume, le ton et la densité des phrases avant d'appeler l'IA.`,summary:`{{mode}} · {{languages}} · {{count}} · {{tone}}`,languagesCount:`{{count}} langues`,translationCount:`{{count}} traductions`,generationMode:`Mode`,generationModes:{expand:`Développer le sujet`,translateOnly:`Traductions uniquement`},generationModeHints:{expand:`L'IA ajoutera des mots, des phrases et des variantes autour du sujet source en utilisant le nombre sélectionné.`,translateOnly:`L'IA renverra exactement une traduction du mot ou de l'expression source pour chaque langue sélectionnée.`},languages:`Langue ou langues`,languageLimit:`jusqu'à 30`,languagesPlaceholder:`Russe, anglais, espagnol...
11Séparez par des virgules ou des nouvelles lignes.`,currentLanguage:`Actuel`,twoLanguages:`RU + EN`,languagePresets:{ten:`10 langues`,twenty:`20 langues`,thirty:`30 langues`},wordCount:`Mots minimum`,wordCountHint:`Utilisez n’importe quelle valeur comprise entre 1 et 80. En mode traductions uniquement, le décompte final est égal au décompte de la langue sélectionnée.`,tone:`Tonifier`,phraseMode:`Phrases`,creativity:`Variété`,preserveProperNouns:`Conservez les noms et les marques`,balancedLanguages:`Équilibrer les langues de manière égale`,reset:`Réinitialiser`,done:`Fait`,tones:{neutral:`Neutre`,festive:`De fête`,professional:`Professionnel`,playful:`Espiègle`,poetic:`Poétique`,minimal:`Minimal`},phraseModes:{mixed:`Mixte`,words:`Mots`,phrases:`Phrases courtes`}}},footer:{free:`Gratuit et sans inscription`,description:`Créez des nuages ​​de mots façonnés à partir du texte, CSV, Excel et Google Sheets.`,github:`GitHub`,live:`Nuage en direct`,templates:`Modèles`,wordMap:`Carte de mots`,chromeExtension:`Extension Chrome`,privacy:`Confidentialité`}},qa={templateCommunity:{about:`О шаблоне`,author:`Публичное имя автора`,noAuthor:`Автор не указан`,authorProfile:`Публичные шаблоны автора`,uses:`Использований`,usesNote:`Открытия в редакторе: не более одного на посетителя в день. Это не число скачиваний.`,favorite:`В избранное`,saved:`В избранном`,loginHint:`Войдите, чтобы сохранить в избранное`,actionError:`Не удалось сохранить. Попробуйте ещё раз.`,license:`Условия использования`,unspecified:`Не указаны`,licenseUnknown:`Автор не указал лицензию. Публикация сама по себе не даёт разрешения на любое использование — при необходимости согласуйте его с правообладателем.`,licenseScope:`Лицензию выбрал автор. Она относится только к материалам, на которые у него есть права; у шрифтов и других сторонних элементов могут быть отдельные условия.`,licenseTerms:`Открыть условия лицензии`,versions:`История версий`,versionsNote:`Отдельные публикации одной серии. Сохранённые версии не перезаписываются.`,versionHow:`Откройте шаблон в редакторе, внесите изменения и при публикации выберите «Новая версия».`,contrast:`Проверка контраста`,contrastNote:`Ориентир: 4,5:1 для обычного текста, 3:1 для крупного (от 24 px или примерно 19 px жирным). Это проверка цветов, а не всего изображения: масштаб и перекрытия влияют на читаемость.`,backdrop:`Подложка для прозрачности`,white:`Белая`,dark:`Тёмная`,shapeBackgroun
11d:`Фон формы`,notMeasured:`Цвет не поддерживается для расчёта`,normalText:`Обычный и крупный текст`,largeText:`Только крупный текст`,lowContrast:`Контраст ниже 3:1`,related:`Похожие шаблоны`,relatedNote:`По тегам, форме и языку среди последних публикаций.`,relatedError:`Похожие шаблоны временно недоступны.`,publicationDetails:`Детали публикации`,description:`Описание`,tags:`Теги`,tagsHint:`До 8 тегов через запятую, по 32 символа.`,useCases:`Для чего подходит`,authorHint:`Необязательно. Это имя и профиль будут публичными. Новое имя обновит ваш профиль во всех публикациях.`,authorLogin:`Для публичного имени нужна авторизация и открытая публикация.`,licenseConsent:`Выбирайте лицензию только для материалов, на которые у вас есть права. Ознакомьтесь с условиями: открытая лицензия может быть безотзывной.`,publishVersion:`Новая версия шаблона «{{title}}»`,myFavorites:`Моё избранное`,allTemplates:`Все шаблоны`,cases:{education:`Обучение`,gift:`Подарок`,presentation:`Презентация`,social:`Соцсети`,research:`Исследование`,decor:`Декор`}},app:{title:`shapewords`,subtitle:`Генератор облака слов`,settings:`Настройки`,openSettings:`Открыть настройки`,closeSettings:`Закрыть настройки`,account:`Кабинет`,openAccount:`Открыть кабинет`,signIn:`Войти`,templates:`Шаблоны`,openTemplates:`Открыть готовые шаблоны`,wordMap:`Карта слов`,openWordMap:`Открыть 3D-карту слов`,live:`Live`,openLive:`Открыть live-комнаты`,chromeExtension:`Chrome`,openChromeExtension:`Открыть расширение Chrome`,chromeExtensionBadgeAlt:`Расширение Chrome`,dismissChromeExtension:`Скрыть предложение расширения Chrome`,language:`Язык`},common:{loading:`Загрузка...`,on:`Вкл`,off:`Выкл`},account:{title:`Кабинет`,subtitle:`История генераций, шаблоны и стили сохраняются в вашем аккаунте.`,signInTitle:`Войдите, чтобы сохранять работу`,signInSubtitle:`Аккаунт нужен для истории генераций, шаблонов и личных стилей.`,login:`Войти`,register:`Регистрация`,name:`Имя`,email:`Email`,password:`Пароль`,confirmPassword:`Повторите пароль`,passwordHint:`Требования к паролю`,passwordMismatch:`Пароли не совпадают.`,passwordMinLength:`Минимум 8 символов`,passwordLetter:`Хотя бы одна буква`,passwordNumber:`Хотя бы одна цифра`,socialTitle:`Вход через сервис`,socialSubtitle:`Используйте Google, Yandex, Facebook или X, чтобы войти без отдельного пароля.`,socialDivider:`или`,socialGoogle:`Google`,socialFacebook:`Facebook`,socialX:`X`,socialYandex:`Yandex`,noAccount:`Создать аккаунт`,hasAccount:`Уже есть аккаунт`,history:`История`,templates:`Шаблоны`,styles:`Стили`,account:`Аккаунт`,saveHistory:`Сохранить`,saveTemplate:`Шаблон`,saveStyle:`Стиль`,saveCurrentHistory:`Сохранить генерацию`,saveCurrentTemplate:`Сохранить шаблон`,saveCurrentStyle:`Сохранить стиль`,saveHistoryHint:`Сохранит текущий текст, форму, стиль и параметры заполнения как отдельную запись истории.`,saveTemplateHint:`Сохранит текущий проект как шаблон, чтобы быстро начинать новые облака с теми же настройками.`,saveStyleHint:`Сохранит только визуальные настройки: шрифт, палитру, фон, ориентацию и параметры отображения.`,saveName:`Название`,cancel:`Отмена`,save:`Сохранить`,close:`Закрыть кабинет`,backToEditor:`В редактор`,open:`Открыть`,apply:`Применить`,delete:`Удалить`,emptyHistory:`Пока нет сохраненных генераций.`,emptyTemplates:`Пока нет шаблонов.`,emptyStyles:`Пока нет стилей.`,words:`слов`,placed:`в форме`,logout:`Выйти`,signedInAs:`Вы вошли как`,palette:`палитра`,libraryActions:`Сохранить текущую работу`,libraryHint:`История хранит полный проект, шаблон — проект для повторного использования, стиль — только визуальные настройки.`,oauthCancelled:`Вход через внешний сервис был отменен.`,oauthEmailRequired:`Провайдер не передал email. Используйте другой способ входа.`,oauthEmailUnverified:`Провайдер не подтвердил email. Используйте другой способ входа.`,oauthProviderDisabled:`Этот способ входа пока не настроен.`,oauthStateInvalid:`СессиÑ
11 входа устарела. Попробуйте еще раз.`,oauthFailed:`Не удалось завершить вход через внешний сервис.`},templates:{metaTitle:`Публичные шаблоны облака слов | shapewords`,metaDescription:`Каталог облаков слов, опубликованных сообществом shapewords. Любой шаблон можно открыть и продолжить редактировать.`,badge:`Открытая коллекция`,title:`Публичные шаблоны`,description:`Здесь собраны облака слов, опубликованные пользователями shapewords. Откройте любую работу как шаблон, замените слова и продолжите редактирование.`,searchPlaceholder:`Поиск по названию и словам...`,languageFilter:`Язык шаблона`,allLanguages:`Все языки`,resultCount:`{{count}} публикаций`,resetSearch:`Сбросить поиск`,loadError:`Не удалось загрузить публичные шаблоны`,loadMore:`Показать ещё`,emptyTitle:`Ничего не найдено`,emptyDescription:`Попробуйте другой запрос, выберите все языки или опубликуйте первое облако в этой категории.`,noPreview:`Превью недоступно`,wordsCount:`{{count}} слов`},text:JSON.parse(`{"title":"Текст","smartImport":"Smart Import","smartImportDescription":"Текст, CSV/TSV, Excel .xlsx, Google Sheets и посты из X, Reddit, Hacker News, YouTube, Telegram и RSS-фидов","closeSmartImport":"Закрыть Smart Import","smartImportPlaceholder":"Вставьте текст, CSV/TSV или перетащите файл...","placeholder":"Вставьте текст сюда...","sample":"Попробовать пример","voiceInput":"Голос","voiceStart":"Начать голосовой ввод","voiceStop":"Остановить голосовой ввод","voiceStopShort":"Стоп","voiceListening":"Слушаем микрофон","voiceUnsupported":"Голосовой ввод не поддерживается в этом браузере","voicePermissionDenied":"Доступ к микрофону запрещен. Разрешите его и попробуйте снова.","voiceNoSpeech":"Речь не распознана. Попробуйте еще раз и говорите чуть ближе к микрофону.","voiceNoMicrophone":"Не найден источник звука с микрофона.","voiceError":"Не удалось запустить голосовой ввод","emoji":"Эмодзи","emojiSearchPlaceholder":"Поиск emoji: смех, огонь, сердце...","emojiSearchLoading":"Загружаем emoji","emojiSearchNoResults":"Emoji не найдены","addEmojiAria":"Добавить {{emoji}}","dropHint":"Перетащите .txt, .csv, .tsv или .xlsx файл","clear":"Очистить","importFile":"Файл","importText":"Импорт текста","googleSheets":"Google Sheets","googleSheetsPlaceholder":"Ссылка на таблицу или опубликованный CSV","googleFileSharingHelp":"Как настроить доступ в Google","import":"Импорт","xImport":"X (Twitter)","xImportPlaceholder":"Вставьте ссылку на пост из x.com","xImportHint":"Только публичные посты. Вставьте одну или несколько ссылок — импортируем текст постов.","redditImport":"Reddit","redditImportPlaceholder":"Вставьте ссылку на пост или сабреддит","redditImportHint":"Только публичные обсуждения и сабреддиты. Импортируем заголовки и комментарии.","hnImport":"Hacker News","hnImportPlaceholder":"Вставьте ссылку на обсуждение Hacker News","hnImportHint":"Импортируем историю и комментарии к ней.","youtubeImport":"YouTube","youtubeImportPlaceholder":"В
11ставьте ссылку на видео YouTube","youtubeImportHint":"Импортируем название, описание, теги и популярные комментарии.","telegramImport":"Telegram","telegramImportPlaceholder":"Ссылка на публичный канал или @имя","telegramImportHint":"Только публичные каналы. Импортируем недавние посты.","rssImport":"RSS","rssImportPlaceholder":"Вставьте ссылку на любой RSS или Atom фид","rssImportHint":"Любой блог или новостной фид. Импортируем заголовки и описания записей.","importOptions":"Правила импорта","keepCase":"Сохранять регистр","countFrequency":"Считать частоту","removeStopWords":"Убирать стоп-слова","detectDuplicates":"Объединять дубли","lemmatizeWords":"Лемматизация","languageProcessing":"Языковая обработка","languageProcessingStatus":"Обработка: {{language}}","languageProcessingSection":"Обработка языка","processingLanguage":"Язык текста","autoLanguage":"Определять автоматически","chineseLanguage":"Китайский","chineseScript":"Вариант китайского","chineseScriptAuto":"Определять автоматически","chineseSimplified":"Упрощённый китайский","chineseTraditional":"Традиционный китайский","chineseMode":"Режим обработки китайского","chineseFast":"Быстрый","chinesePrecise":"Точный","keepSingleHan":"Сохранять одиночные иероглифы","includeNumbers":"Включать числа","normalizeChineseVariants":"Объединять традиционные и упрощённые формы","minTokenLength":"Минимальная длина термина","chineseStopWordsProfile":"Стоп-слова","chineseStopWordsCore":"Безопасные","chineseStopWordsExtended":"Расширенные","chinesePosFilter":"Части речи","chinesePosAll":"Все","chinesePosContent":"Смысловые","chinesePosNouns":"Сущ.","chineseKeywordRanking":"Вес терминов","chineseKeywordSmart":"Умный","chineseKeywordFrequency":"Частота","chineseKeywordRankingHint":"Умный режим сочетает частоту, TF-IDF, TextRank, позицию и часть речи; исходная частота сохраняется в метаданных.","englishLanguage":"Английский","englishProcessingHint":"Английский текст обрабатывается локально в браузере с определением частей речи и начальных форм.","englishPosFilter":"Части речи","englishPosAll":"Все слова","englishPosContent":"Значимые","englishPosNouns":"Существительные","englishLemmatize":"Лемматизировать английские слова","englishStopWordsProfile":"Стоп-слова","englishStopWordsCore":"Базовые","englishStopWordsExtended":"Расширенные","englishStopWordsHint":"Базовый список убирает распространённые служебные слова; расширенный также отфильтровывает частые слова-паразиты.","russianLanguage":"Русский","russianLocale":"Вариант русского языка","russianMode":"Режим русского","russianFast":"Быстрый","russianPrecise":"OpenCorpora","russianPreciseHint":"Точный режим Smart Import локально загружает нужные фрагменты словаря. Неоднозначные формы не угадываются.","russianPosFilter":"Части речи","russianPosAll":"Все","russianPosContent":"Значимые","russianPosNouns":"Существительные","russianLemmatize":"Лемматизировать русские слова","russianYoNormalization":"Нормализация Ё/Е","russianYoPreserve":"Не объединять Ё и Е","russianYoFold":"Объединять Ё с Е","russianYoHint":"Объединение улучшает подсчёт частоты; исходное написание сохраняется, когда это возможно.","russianStopWordsProfile":"Стоп-слова","russianStopWordsCore":"Базовые","russianStopWordsExtended":"Расширенные","russianStopWordsHint":"Базовый список убирает только надёжные служебные слова; расширенный — больше частых слов-паразитов.","genericLanguageProcessingHint":"Для этого языка включена базовая локальная токенизация. Выберите китайский, русский или английский, чтобы настроить подробный процессор.","customDictionary":"Пользовательский словарь","customDictionaryPlaceholder":"Один термин в строке. Более длинные термины имеют приоритет.","synonyms":"Синонимы","synonymsPlaceholder":"Одна группа в строке: основной термин: синоним 1, синоним 2","processingPrivacyLocal":"Обработка выполняется локально в вашем браузере.","preciseProcessingHint":"Точный режим лучше определяет границы китайских слов и может работать немного дольше.","preserveStyles":"Сохранять стиль","replaceWordsOnly":"Заменять только слова","includeEmoji":"Эмодзи","customStopWordsPlaceholder":"Custom stop-word list: по одному слову в строке, через запятую или ;","importResult":"{{source}}: {{count}} слов, {{rows}} строк, режим {{mode}}","includePhrases":"Фразы","importMode":{"text":"текст","table":"таблица"},"errors":{"xlsUnsupported":"Старый .xls пока не поддерживается. Сохраните файл как .xlsx или CSV.","googleSheetsFailed":"Не удалось загрузить Google Sheets. Нужна публичная ссылка или опубликованный CSV.","googleSheetsInvalidUrl":"Это не похоже на корректную ссылку Google Sheets или опубликованный CSV. Вставьте полную ссылку на таблицу или публичный HTTPS CSV.","googleFileAccessDenied":"Доступ к Google-документу закрыт. В Google Docs или Google Drive откройте «Поделиться» и в «Общем доступе» выберите «Все, у кого есть ссылка».","
11importFailed":"Не удалось импортировать данные","xImportFailed":"Не удалось загрузить пост X. Используйте ссылку на публичный пост.","redditImportFailed":"Не удалось загрузить ссылку Reddit. Используйте публичный пост или сабреддит.","hnImportFailed":"Не удалось загрузить обсуждение Hacker News. Используйте ссылку на публичный пост.","youtubeImportFailed":"Не удалось загрузить видео YouTube. Возможно, оно недоступно или импорт не настроен.","telegramImportFailed":"Не удалось загрузить канал Telegram. Используйте ссылку на публичный канал.","rssImportFailed":"Не удалось загрузить фид. Используйте корректную ссылку RSS или Atom."}}`),words:{title:`Слова`,exportCsv:`Экспорт в CSV`,word:`Слово`,editWord:`Редактировать слово`,delete:`Удалить слово`,clearList:`Очистить список слов`,count:`Частота`,size:`Размер`,sizeTitle:`Масштаб слова или emoji относительно частоты`,sizeWord:`Размер {{word}}`,resetSize:`Сбросить размер`,resetSizeShort:`100`,empty:`Введите текст для анализа`,total:`{{count}} слов`,filteredTotal:`{{count}} из {{total}}`,searchPlaceholder:`Поиск слова или emoji`,noMatches:`Ничего не найдено`,showing:`Показано {{shown}} из {{count}}`,emoji:`emoji`,repeatShort:`повт.`,repeatTitle:`Повторять слово при заполнении`,repeatWord:`Повторять {{word}} при заполнении`,enableRepeatWord:`Включить повтор для {{word}}`,disableRepeatWord:`Выключить повтор для {{word}}`,managerTitle:`Менеджер слов`,managerApply:`Применить`,managerDescription:`{{count}} элементов с сортировкой, массовыми действиями и настройками на уровне слова.`,openManager:`Управлять словами`,selected:`Выбрано: {{count}}`,selectAll:`Выбрать все видимые слова`,kind:`Тип`,frequencyValue:`Вес {{count}}`,bulkActions:`Массовые действия`,bulkDescription:`Примените одно изменение сразу ко всем выбранным словам.`,bulkFont:`Шрифт для группы`,fontAutoAll:`Авто для выбранных`,repeatOn:`Повтор вкл.`,repeatOff:`Повтор выкл.`,repeatAll:`Повторять все`,deleteSelected:`Удалить выбранные`,wordFont:`Шрифт слова`,addWord:`Добавить слово`,addPlaceholder:`Добавить ещё…`,addPlaceholderEmpty:`Введите слово и нажмите Enter`,emptyListTitle:`Список слов пуст`,emptyListDescription:`Добавьте слова в форме выше: введите слово и нажмите Enter.`,sourceTitle:`Исходный текст`,sourceDescription:`Вставьте или импортируйте текст, чтобы превратить его в слова.`},style:{title:`Стиль`,font:`Шрифт`,uploadFont:`Загрузить шрифт`,customFonts:`Свои {{count}}`,customFontsBadge:`{{count}}`,fontLoading:`Загрузка`,deleteCustomFont:`Удалить свой шрифт`,scriptFonts:`Шрифты языков`,autoFont:`Авто`,fontUpload:{title:`Загрузка своего шрифта`,description:`Добавьте файл шрифта, который можно использовать в генераторе облака слов.`,formatsTitle:`Поддерживаемые форматы`,formatsBody:`Лучше всего использовать WOFF2. Также принимаются WOFF, TTF и OTF до 6 МБ. Коллекции TTC, архивы, SVG-шрифты и цветные/вариативные шрифты могут не поддерживаться корректно.`,licenseTitle:`Условия использования`,licenseOwn:`Загружайте только шрифты, на использование которых у вас есть права.`,licenseAllowed:`Подходят бесплатные и open-source шрифты, например с лицензиями SIL OFL, Apache или аналогичными, а также коммерческие шрифты, если ваша лицензия разрешает web/desktop-использование и генерацию изображений.`,licenseRestricted:`Не загружайте шрифты, лицензия которых запрещает встраивание, веб-использование, создание изображений или использование в сервисах генерации.`,storageTitle:`Где хранится файл`,storageBody:`Файл сохраняется локально в этом браузере через IndexedDB и не отправляется на сервер при загрузке. Экспорт из текущего браузера будет использовать этот шрифт, но публичные ссылки и другой браузер могут показать fallback, если там нет того же файла.`,warning:`Один файл распознается как один стиль. Если нужны Regular, Bold или Ital
11ic, загрузите соответствующие файлы отдельно.`,chooseFile:`Выбрать файл шрифта`},palette:`Палитра`,customPalette:`Своя`,customPaletteTitle:`Своя палитра`,customPaletteHint:`Соберите набор цветов для слов. Изменения сразу применяются к текущему облаку.`,addCustomColor:`Добавить цвет`,removeCustomColor:`Удалить цвет`,resetCustomPalette:`Сбросить палитру`,customColorNumber:`Цвет {{number}}`,colorMode:`Режим цвета`,sequential:`Последовательный`,random:`Случайный`,byFrequency:`По частоте`,fontSize:`Диапазон размера`,min:`Мин`,max:`Макс`,morePalettes:`Все палитры`,paletteDialogTitle:`Цветовая палитра`,paletteDialogCount:`{{count}} палитр`,closePalettes:`Закрыть палитры`},layout:{title:`Раскладка`,spiral:`Спираль`,archimedean:`Архимедова`,rectangular:`Прямоугольная`,rotation:`Ориентация`,horizontal:`Горизонтально`,mixed:`Смешанная`,vertical:`Вертикально`,orthogonal:`Горизонтально и вертикально`,crossing:`Перекрестно`,crossingVoids:`Перекрестно по пустотам`,dancing:`Танцующие слова`,positiveSlope:`Диагональ вверх`,negativeSlope:`Диагональ вниз`,random:`Случайно`,custom:`Свои`,moreOrientations:`Все ориентации`,orientationDialogTitle:`Ориентация слов`,orientationDialogCount:`{{count}} режимов`,closeOrientations:`Закрыть ориентации`,crossingPreview:`Перекрестно`,voidsPreview:`Пустоты`,dancingPreview:`Танцуют`,wordsPreview:`Слова`,positivePreview:`Вверх`,negativePreview:`Вниз`,slopePreview:`Диагональ`,customAngles:`Углы`,customAnglesPlaceholder:`0, -30, 30, 90`,angled:`Под углом`,free:`Свободно`,padding:`Интервал слов`,maxWords:`Лимит слов`},shape:{title:`Форма`,popular:`Популярные`,selected:`Выбрано`,openCatalog:`Каталог`,catalogTitle:`Каталог форм`,catalogCount:`{{count}} форм`,closeCatalog:`Закрыть каталог форм`,catalogCustomize:`Настройка формы`,catalogColor:`Цвет формы`,catalogInvert:`Инверсия формы`,catalogInvertHint:`Заполнять область вокруг контура, а не сам контур.`,catalogBack:`Назад`,catalogEditFree:`Редактировать`,catalogApply:`Применить`,searchPlaceholder:`Поиск по формам и тегам`,catalogEmpty:`Формы не найдены`,deleteShape:`Удалить форму «{{name}}»`,deleteShapeConfirm:`Удалить форму «{{name}}» из своих?`,customTitle:`Своя форма`,customDescription:`Нарисуйте контур в конструкторе или импортируйте изображение`,builderOpen:`Конструктор`,builderTitle:`Конструктор формы`,builderDescription:`Соберите контур из точек или превратите буквы и цифры в векторную маску.`,builderDrawMode:`Контур`,builderTextMode:`Буквы и цифры`,builderControls:`Как рисовать`,builderHintAdd:`Кликните или тапните по сетке, чтобы добавить новую точку.`,builderHintDrag:`Перетаскивайте узлы, чтобы изменить контур. Форма замыкается автоматически.`,builderHintSnap:`Легкий магнит притягивает точки к сетке. Alt отключает магнит.`,builderTextInput:`Символы`,builderTextPlaceholder:`A 2026`,builderTextFont:`Шрифт`,builderTextFontSearch:`Поиск шрифта`,builderTextFontSearchClear:`Очистить поиск шрифта`,builderTextFontSearchEmpty:`Шрифты не найдены`,builderTextStyle:`Начертание`,builderTextInvert:`Инверсия`,builderTextInvertHint:`По умолчанию заполняются сами буквы. При инверсии заполняется пространство вокруг них.`,builderTextLoading:`Готовим контур`,builderTextPreviewEmpty:`Введите буквы или цифры`,builderTextError:`Не удалось построить форму из текста`,builderUndo:`Назад`,builderClear:`Очистить`,builderReset:`Пример`,builderApply:`Использовать форму`,builderStats:`{{count}} точек, площадь {{area}}`,builderShapeName:`Векторная форма`,builderEditedSuffix:`редакция`,closeBuilder:`Закрыть конструктор`,editShape:`Редактировать форму`,customUpload:`Загрузить`,customThreshold:`Порог маски`,customReady:`Форма «{{name}}» готова`,customError:`Не удалось создать форму из изображения`,customModes:{auto:`Авто`,alpha:`Alpha`,contrast:`Контраст`},categories:{all:`Все`,basic:`Базовые`,nature:`Природа`,animals:`Животные`,kids:`Детские`,numbers:`Цифры`,objects:`Объекты`,symbols:`Символы`,travel:`Транспорт`,brands:`Бренды`,custom:`Свои`},mode:`Режим`,frequency:`По частоте`,fill:`Заполнить форму`,background:`Фон фигуры`,backgroundNone:`Без фона`,backgroundWhite:`Светлый фон`,backgroundSky:`Голубой фон`,backgroundMint:`Мятный фон`,backgroundWarm:`Тёплый фон`,backgroundRose:`Розовый фон`,backgroundCustom:`Выбрать цвет фона фигуры`},stopWords:{title:`Стоп-слова`,enable:`Фильтровать стоп-слова`,language:`Язык`,auto:`Авто`,ru:`Русский`,en:`Английский`,es:`Испанский`,fr:`Французский`,ar:`Арабский`,zh:`Китайский`},export:{title:`Экспорт`,format:`Формат`,quality:`Качество`,background:`Фон`,transparent:`Прозрачный`,white:`Белый`,dark:`Тёмный`,save:`Сохранить`,download:`Скачать`,toggleOptions:`Настройки экспорта`,close:`Закрыть`,printReady:`Print-ready PDF`,printReadyDescription:`Фиксированный лист, поля и метки печати`,page:`Лист`,margin:`Поля`,bleed:`Bleed`,safeZone:`Safe zone`,cropMarks:`Crop marks`,downloading:`Скачивание...`,watermark:`источник: {{site}}`,hideWatermark:`Без копирайта сервиса`,hideWatermarkDescription:`Убрать подпись с адресом сайта из экспорта`},publish:{button:`Поделиться`,creating:`Публикуем...`,title:`Публикация облака`,description:`Создаёт ссылку на облако с текущей раскладкой, формой и стилем.`,publicLifetime:`Публичный шаблон хранится бессрочно и привязан к языку текущего интерфейса.`,privateLifetime:`Приватная ссылка действует 90 дней и не появл
11яется в каталоге.`,defaultTitle:`Моё облако слов`,nameLabel:`Название публикации`,namePlaceholder:`Например, Карта идей проекта`,publicNotice:`Название, слова и изображение будут доступны всем посетителям публичного каталога.`,privateToggle:`Оставить приватную ссылку`,privateDescription:`Не показывать работу в публичном каталоге`,privateNotice:`Шаблон будет доступен только тем, у кого есть ссылка. Через 90 дней ссылка перестанет работать.`,create:`Опубликовать шаблон`,createPrivate:`Создать приватную ссылку`,publicResult:`Шаблон опубликован в каталоге и хранится бессрочно.`,privateResult:`Приватная ссылка создана на 90 дней. В каталоге шаблон не показывается.`,newPublication:`Новая`,link:`Ссылка`,copy:`Копировать`,copied:`Скопировано`,open:`Открыть`,close:`Закрыть`,native:`Отправить`,nativeTitle:`Облако слов shapewords`,socialTitle:`Поделиться публикацией`,socialOpen:`Поделиться в {{name}}`,socialPreviewNote:`Картинка подтянется через Open Graph, если соцсеть успеет скачать превью по ссылке.`,qrAlt:`QR-код ссылки`,empty:`Сначала сгенерируйте облако`,error:`Не удалось опубликовать шаблон`,previewError:`Не удалось подготовить превью публикации`},templatePage:{badge:`Публичный шаблон`,description:`Слова, форма, палитра и параметры раскладки опубликованного шаблона облака слов.`,back:`К каталогу`,loading:`Загрузка шаблона...`,notFoundTitle:`Шаблон не найден`,expiredTitle:`Шаблон больше недоступен`,expiredDescription:`Эта старая ссылка больше не активна. Выберите другой шаблон в каталоге.`,loadError:`Не удалось загрузить шаблон`,applyError:`Не удалось открыть шаблон в редакторе`,copyError:`Не удалось скопировать ссылку`,templateNumber:`Шаблон · {{id}}`,copyLink:`Скопировать ссылку`,copied:`Ссылка скопирована`,useTemplate:`Использовать шаблон`,opening:`Открываем...`,language:`Язык`,shape:`Форма`,shapeCaption:`Выбранный контур облака`,font:`Шрифт`,orientation:`Ориентация`,fontSize:`Размеры шрифта`,published:`Опубликован`,details:`Детали шаблона`,contents:`Содержание`,preview:`Превью`,usedWords:`Использованные слова`,wordWeight:`Вес слова`,colorScheme:`Цветовая гамма`,customPalette:`Своя палитра`,technicalDetails:`Параметры раскладки`,spiral:`Спираль`,wordSpacing:`Интервал слов`,colorMode:`Порядок цветов`,wordLimit:`Лимит слов`,placedWords:`Размещено слов`,canvasSize:`Холст`,viewMode:`Режим`,readyBadge:`Сделайте своим`,readyTitle:`Сохраните композицию. Измените историю.`,readyDescription:`Откройте шаблон в редакторе, чтобы заменить слова, настроить форму и цвета или экспортировать результат.`},view3d:{modeLabel:`Режим вида`,sphere:`Сфера`,cube:`Куб`,autoRotate:`Авто-вращение`,depth:`Глубина`,reset:`Сброс`,fullscreen:`Полный экран`,exportPng:`PNG`,empty:`Сгенерируйте облако слов, чтобы увидеть его в 3D.`,hint:`Перетащите — вращение · колесо — зум · наведите — детали`},wordMap:{metaTitle:`Интерактивная 3D-карта слов на глобусе | shapewords`,metaDescription:`Исследуйте частотные слова из последних Google News RSS по странам на интерактивном 3D-глобусе с дневным кешированием новостных кластеров по масштабу карты.`,title:`Карта слов мира`,search:`Поиск места`,searchPlaceholder:`Найти страну`,placePicker:`Выбор места`,country:`Страна`,results:`Результаты`,noResults:`Место не найдено`,world:`Мир`,toggleOrbit:`Включить или выключить вращение глобуса`,hidePanel:`Свернуть панель карты`,showPanel:`Показать панель карты`,words:`Слова`,empty:`Выберите страну`,scale:{world:`мир`,country:`страна`},newsSource:`Google News RSS`,newsSelectCountry:`Найдите и выберите страну, чтобы загрузить слова из новостей`,newsReady:`Слова из новостей готовы`,newsLoading:`Загружаю частотные слова из последних новостей`,newsFresh:`Загружено из Google News RSS`,newsCached:`Используется дневной кеш новостей`,newsErrorShort:`Новости недоступны`,newsError:`Не удалось загрузить слова из новостей страны`,newsEmpty:`Частотные слова в новостях не найдены`,reloadNews:`Перезагрузить слова из новостей`},canvas:{undo:`Назад`,redo:`Вперёд`,generate:`Сгенерировать`,regenerate:`Перегенерировать`,fullscreen:`На весь экран`,zoom:`Масштаб`,showGrid:`Показать сетку`,hideGrid:`Скрыть сетку`,openMenuHint:`Откройте меню, чтобы добавить слова`,emptyTitle:`Рабочая область пока пустая`,emptyDesktopDescription:`Добавьте текст в панели слева или используйте пример, чтобы собрать облако слов.`,emptyMobileDescription:`Откройте меню и добавьте текст, чтобы собрать облако слов.`,generating:`Генерация...`,assigningFontsProgress:`Назначение шрифтов`,loadingFontsProgress:`Загрузка шрифтов`,prepareProgress:`Подготовка`,preparingOutlineProgress:`Построение контуров`,fillProgress:`Заполнение фигуры`,shapeWordCountLabel:`Слов в фигуре`,progressAssigningFonts:`Подбор валидных глифов`,progressLoadingFonts:`Загрузка выбранных файлов шрифтов`,progressPreparing:`Маска, шрифты и глифы`,progressPreparingOutline:`Перевод слов в контуры`,progressWords:`{{placed}} / {{target}} слов`,progressPlaced:`{{placed}} слов`,selectedWord:`Выбранное слово`,selectWord:`Выбрать слово {{word}}`,editWord:`Редактировать слово {{word}}`,wordColor:`Цвет`,wordFont:`Шрифт`,wordSize:`Размер`,wordRotation:`Поворот`,wordCurve:`Изгиб`,pinWord:`Закрепить позицию`,unpinWord:`Снять фиксацию`,protectPinnedArea:`Создать охранную область фразы`,unprotectPinnedArea:`Убрать охранную область фразы`,pinConflict:`Позиция закреплена, но слово частично конфликтует с формой или другим закрепленным словом.`,deleteWord:`Удалить слово`,mainAccentTitle:`Добавить главный акцент?`,mainAccentDescription:`«{{word}}» может стать визуальным центром. Подберём выразительный шрифт, размер, поворот или изгиб по форме фигуры. Свободное место вокруг заполним словами.`,mainAccentProcessing:`Подбираем шрифт…`,mainAccentFontError:`Не удалось загрузить шрифт для акцента. Попробуйте ещё раз.`,mainAccentAction:`Выделить главным`,mainAccentDismiss:`Скрыть подсказку`,sparseFillTitle:`В фигуре осталось свободное место`,sparseFillDescription:`Повторы отключены, поэтому элементов не хватает для плотного заполнения. ИИ может подобрать новые синонимы и короткие смысловые фразы.`,
11sparseFillAction:`Найти синонимы с ИИ`,sparseFillProcessing:`ИИ подбирает слова…`,sparseFillDismiss:`Скрыть подсказку`,sparseFillNoNewWords:`ИИ не нашёл новых уникальных слов или фраз. Попробуйте изменить исходный список.`},tooltips:{help:`Подсказка`,text:{title:`Smart Import принимает обычный текст, CSV/TSV, Excel .xlsx и публичные Google Sheets. Таблицы с колонками слова и частоты импортируются напрямую.`,languageProcessing:`Разделяет текст на слова с учётом языка перед подсчётом частоты. Включено по умолчанию; отключите, чтобы использовать базовое разбиение.`,keepCase:`Если включено, первое найденное написание слова сохраняет регистр. Если выключено, слова нормализуются в нижний регистр.`,countFrequency:`Если включено, повторения увеличивают вес слова. Если выключено, каждое найденное слово получает вес 1.`,removeStopWords:`Удаляет служебные слова выбранного языка или всех поддерживаемых языков, найденных во входном тексте, плюс слова из пользовательского списка.`,detectDuplicates:`Если включено, одинаковые слова объединяются. Если выключено, сохраняется исходная последовательность слов.`,lemmatizeWords:`Если включено, словоформы русского и английского приводятся к общей основе перед подсчетом частоты: машины, машине и машиной попадут в одну группу.`,russianLemmatize:`Консервативно объединяет поддерживаемые словоформы; неоднозначные слова остаются отдельными, позиции источника сохраняются.`,englishLemmatize:`Приводит английские словоформы к словарным перед подсчётом частоты и сохраняет исходные позиции в тексте.`,preserveStyles:`Если включено, импорт меняет только данные. Если выключено, шрифт, палитра и базовые параметры текста сбрасываются к значениям по умолчанию.`,replaceWordsOnly:`Если включено, импорт сразу заменяет таблицу слов и не переанализирует сырой текст. Если выключено, импортированный источник проходит через обычный текстовый процессор.`,includePhrases:`Если включено, повторяющиеся пары слов попадают в облако как фразы. Если выключено, используются только отдельные слова.`,includeEmoji:`Если включено, emoji извлекаются из текста как отдельные токены и отображаются через Twemoji SVG-ассеты.`},words:{title:`Блок слов оставляет быстрый ввод, удаление и управление повтором. Для сортировки, массового редактирования и шрифтов на уровне слова откройте менеджер.`,sidebar:`Сайдбар управляет списком слов и повтором. Закрепление доступно только для выбранного экземпляра на канвасе.`,manager:`Менеджер поддерживает сортировку по всем столбцам, массовые действия и точечное управление частотой, размером, повтором и шрифтом слова.`},ai:{title:`AI помощник расширяет введенную тему или делает переводы на выбранные языки.`},style:{font:`Шрифт влияет и на визуальный стиль, и Ð
11½Ð° фактическое размещение слов внутри фигуры.`,palette:`Палитра задает набор цветов для слов. Режим цвета определяет, как эти цвета распределяются.`,colorMode:`Последовательный идет по палитре, случайный перемешивает цвета, по частоте выделяет более важные слова.`,fontSize:`Задает минимальный и максимальный диапазон размера. При заполнении фигуры движок все равно адаптирует размеры внутри этого диапазона, а не использует фиксированные значения.`},layout:{title:`Настройки раскладки управляют поиском свободного места, допустимыми углами, интервалом между словами и лимитом слов для раскладки.`,spiral:`Спираль определяет порядок поиска свободного места в обычном облаке без фигуры.`,rotation:`Ориентация задает набор допустимых углов. Для плотного заполнения фигур лучше использовать свободные углы.`,padding:`Управляет минимальным расстоянием между размещенными словами. Меньшие значения уплотняют раскладку, большие оставляют больше воздуха.`,maxWords:`Ограничивает, сколько слов участвует в генерации раскладки. Работает и для обычного облака, и для заполнения фигуры; большие значения могут улучшить покрытие, но увеличивают время генерации.`},shape:{title:`Фигура задает маску, внутри которой слова размещаются по пиксельным контурам без выхода за границы. Популярные формы доступны сразу, полный каталог открывается отдельно.`,background:`Фон подсвечивает область фигуры под словами и попадает в PNG, JPG, SVG и PDF экспорт.`},stopWords:{title:`Стоп-слова удаляют частые служебные слова, чтобы облако не заполнялось предлогами и союзами.`,enable:`Если включено, система автоматически отфильтрует частые служебные слова выбранного языка или всех поддерживаемых языков, которые участвуют в импортируемом тексте.`},export:{title:`Экспорт сохраняет текущее облако с выбранным форматом, качеством и фоном.`,format:`PNG/JPG подходят для изображений, SVG сохраняет векторный текст, PDF удобен для печати и документов.`,quality:`SQ экспортирует растровые форматы в 2x, HQ — в 4x. PDF сжимается как JPEG, чтобы файл не раздувался без пользы.`,background:`Фон влияет только на экспортированный файл, а не на редактор.`}},ai:{title:`AI помощник`,serverMode:`Сервер`,setupApi:`Настроить OpenRouter API`,actions:{topic:`Расширить тему`,phrases:`Ключевые фразы`,style:`Подобрать стиль`},actionPlaceholders:{topic:`Тема: день рождения, космос...`,translateOnly:`Слово или фраза для перевода...`,style:`Тема для стиля (необязательно)`},actionPhrasesNote:`Извлечёт ключевые фразы из импортированного текста.`,processing:`AI думает...`,apiKeyTitle:`API ключ OpenRouter`,apiKeyDescription:`Для AI-функций нужен бесплатный ключ OpenRouter. Ключ хранится только в вашем браузере.`,getKey:`Получить ключ на openrouter.ai`,save:`Сохранить`,clear:`Удалить`,promptHints:{title:`Быстрая подстановка`,rotate:`Показать другие подсказки`},settings:{open:`Настройки AI`,action:`Действие ИИ`,actionHints:{topic:`Сгенерирует облако слов по теме из поля ввода.`,phrases:`Выделит ключевые слова и фразы из импортированного текста.`,style:`Подберёт палитру, шрифт и форму под тему или текст.`},title:`Настройки генерации`,description:`Управляйте языками, объемом, тоном и плотностью фраз перед вызовом AI.`,summary:`{{mode}} · {{languages}} · {{count}} · {{tone}}`,languagesCount:`{{count}} языков`,translationCount:`{{count}} переводов`,generationMode:`Режим`,generationModes:{expand:`Расширять тему`,translateOnly:`Только переводы`},generationModeHints:{expand:`AI подберет слова, фразы и варианты вокруг исходной темы с учетом выбранного количества.`,translateOnly:`AI вернет только по одному переводу исходного слова или фразы на каждый выбранный язык.`},languages:`Язык или языки`,languageLimit:`до 30`,languagesPlaceholder:`Russian, English, Spanish...
12Можно через запятую или с новой строки.`,currentLanguage:`Текущий`,twoLanguages:`RU + EN`,languagePresets:{ten:`10 языков`,twenty:`20 языков`,thirty:`30 языков`},wordCount:`Минимум слов`,wordCountHint:`Можно поставить любое значение от 1 до 80. В режиме переводов итог равен количеству выбранных языков.`,tone:`ТоÐ
12½`,phraseMode:`Фразы`,creativity:`Разнообразие`,preserveProperNouns:`Сохранять имена и бренды`,balancedLanguages:`Ровно распределять языки`,reset:`Сбросить`,done:`Готово`,tones:{neutral:`Нейтрально`,festive:`Празднично`,professional:`Делово`,playful:`Игриво`,poetic:`Поэтично`,minimal:`Минимально`},phraseModes:{mixed:`Смешанно`,words:`Слова`,phrases:`Короткие фразы`}}},footer:{free:`Бесплатно и без регистрации`,description:`Создавайте облака слов по форме из текста, CSV, Excel и Google Sheets.`,github:`GitHub`,live:`Live облако`,templates:`Шаблоны`,wordMap:`Карта слов`,chromeExtension:`Расширение Chrome`,privacy:`Конфиденциальность`}};le.use(Ha).use(ae).init({resources:{en:{translation:Wa},ru:{translation:qa},ar:{translation:Ua},es:{translation:Ga},fr:{translation:Ka},zh:{translation:{templateCommunity:{about:`关于模板`,author:`作者公开名称`,noAuthor:`未注明作者`,authorProfile:`此作者的公开模板`,uses:`使用次数`,usesNote:`在编辑器中打开的次数,每位访客每天最多计一次,不代表下载次数。`,favorite:`收藏`,saved:`已收藏`,loginHint:`登录后即可收藏`,actionError:`保存失败,请重试。`,license:`使用条款`,unspecified:`未指定`,licenseUnknown:`作者未提供许可证。公开发布并不意味着允许任何用途;必要时请联系权利人。`,licenseScope:`由作者选择,仅适用于其拥有权利的内容。字体及其他第三方元素可能有单独的条款。`,licenseTerms:`查看许可条款`,versions:`版本历史`,versionsNote:`同一系列的独立发布。已保存的版本不会被覆盖。`,versionHow:`在编辑器中打开并修改,发布时选择“新版本”。`,contrast:`对比度检查`,contrastNote:`参考:普通文字 4.5:1,大字 3:1(24 px 或约 19 px 粗体)。仅检查颜色,不代表整体图像合格;缩放和重叠也会影响可读性。`,backdrop:`透明区域底色`,white:`白色`,dark:`深色`,shapeBackground:`形状背景`,notMeasured:`暂不支持计算此颜色`,normalText:`普通和大号文字`,largeText:`仅大号文字`,lowContrast:`对比度低于 3:1`,related:`相似模板`,relatedNote:`按标签、形状和语言从近期发布中匹配。`,relatedError:`暂时无法加载相似模板。`,publicationDetails:`发布详情`,description:`描述`,tags:`标签`,tagsHint:`最多 8 个标签,以逗号分隔,每个最多 32 个字符。`,useCases:`适用场景`,authorHint:`可选。名称和个人页将公开。修改名称会更新所有发布中的个人页名称。`,authorLogin:`公开名称需要登录并选择公开发布。`,licenseConsent:`仅为您拥有权利的内容选择许可证。请阅读条款:开放许可可能不可撤销。`,publishVersion:`发布“{{title}}”的新版本`,myFavorites:`我的收藏`,allTemplates:`全部模板`,cases:{education:`教育`,gift:`礼物`,presentation:`演示`,social:`社交媒体`,research:`研究`,decor:`装饰`}},app:{title:`shapewords`,subtitle:`词云生成器`,settings:`设置`,openSettings:`打开设置`,closeSettings:`关闭设置`,account:`帐户`,openAccount:`打开账户`,signIn:`登入`,templates:`模板`,openTemplates:`打开现成的模板`,wordMap:`词语地图`,openWordMap:`打开 3D 词语地图`,live:`实时`,openLive:`打开实时房间`,chromeExtension:`Chrome`,openChromeExtension:`打开 Chrome 扩展`,chromeExtensionBadgeAlt:`Chrome 扩展`,dismissChromeExtension:`隐藏 Chrome 扩展提示`,language:`语言`},common:{loading:`正在加载...`,on:`开`,off:`关`},account:{title:`帐户`,subtitle:`生成历史记录、模板和样式将保存到您的帐户中。`,signInTitle:`登录以保存您的工作`,signInSubtitle:`使用帐户来获取生成历史记录、模板和个人风格。`,login:`登入`,register:`登记`,name:`姓名`,email:`电子邮件`,password:`密码`,confirmPassword:`确认密码`,passwordHint:`密码要求`,passwordMismatch:`密码不匹配。`,passwordMinLength:`至少 8 个字符`,passwordLetter:`至少一个字母`,passwordNumber:`至少一个数字`,socialTitle:`使用服务登录`,socialSubtitle:`使用 Google、Yandex、Facebook 或 X 登录,无需单独密码。`,socialDivider:`或`,socialGoogle:`Google`,socialFacebook:`Facebook`,socialX:`X`,socialYandex:`Yandex`,noAccount:`创建账户`,hasAccount:`已有账户`,history:`历史`,templates:`模板`,styles:`风格`,account:`帐户`,saveHistory:`节省`,saveTemplate:`模板`,saveStyle:`风格`,saveCurrentHistory:`节省一代`,saveCurrentTemplate:`保存模板`,saveCurrentStyle:`保存样式`,saveHistoryHint:`将当前文本、形状、样式和布局设置保存为历
12史记录项目。`,saveTemplateHint:`将当前项目另存为新词云的可重用模板。`,saveStyleHint:`仅保存视觉设置:字体、调色板、背景、方向和显示选项。`,saveName:`姓名`,cancel:`取消`,save:`节省`,close:`关闭账户`,backToEditor:`返回编辑器`,open:`打开`,apply:`申请`,delete:`删除`,emptyHistory:`还没有拯救后代。`,emptyTemplates:`还没有模板。`,emptyStyles:`还没有样式。`,words:`字`,placed:`放置`,logout:`登出`,signedInAs:`登录身份`,palette:`调色板`,libraryActions:`保存当前工作`,libraryHint:`历史记录保留完整的项目,模板保留可重用的项目,样式仅存储视觉设置。`,oauthCancelled:`已取消通过外部服务登录。`,oauthEmailRequired:`提供方没有返回邮箱地址。请使用其他登录方式。`,oauthEmailUnverified:`提供方没有确认邮箱地址。请使用其他登录方式。`,oauthProviderDisabled:`此登录方式尚未配置。`,oauthStateInvalid:`登录会话已过期,请重试。`,oauthFailed:`无法完成通过外部服务登录。`},templates:{metaTitle:`公开词云模板 | shapewords`,metaDescription:`浏览 shapewords 社区发布的词云模板,并在编辑器中打开任意设计。`,badge:`开放作品集`,title:`公开模板`,description:`浏览社区发布的词云。将任意作品作为模板打开,替换文字并继续编辑。`,searchPlaceholder:`搜索标题和词语...`,languageFilter:`模板语言`,allLanguages:`所有语言`,resultCount:`{{count}} 个作品`,resetSearch:`重置搜索`,loadError:`无法加载公开模板`,loadMore:`显示更多`,emptyTitle:`未找到结果`,emptyDescription:`请尝试其他搜索、选择所有语言,或发布此分类中的第一个词云。`,noPreview:`预览不可用`,wordsCount:`{{count}} 个词`,open:`打开`,backToList:`所有模板`,notFoundTitle:`找不到模板`,notFoundDescription:`该公共模板卡不存在。返回目录并选择现成的模板之一。`,includesTitle:`里面有什么`,shape:`形状`,palette:`调色板`,words:`字`,useTemplate:`使用模板`,useHint:`该模板将文本、单词、形状和样式加载到工作区中。`},text:{title:`文本`,smartImport:`智能导入`,smartImportDescription:`文本、CSV/TSV、Excel .xlsx、Google Sheets,以及来自 X、Reddit、Hacker News、YouTube、Telegram 和 RSS 订阅源的帖子`,closeSmartImport:`关闭智能导入`,smartImportPlaceholder:`粘贴文本、CSV/TSV,或拖放文件...`,placeholder:`将文字粘贴到此处...`,sample:`尝试样品`,voiceInput:`语音`,voiceStart:`开始语音输入`,voiceStop:`停止语音输入`,voiceStopShort:`停止`,voiceListening:`正在监听麦克风`,voiceUnsupported:`此浏览器不支持语音输入`,voicePermissionDenied:`麦克风访问被阻止。请允许访问后重试。`,voiceNoSpeech:`未检测到语音。请重试,并靠近麦克风说话。`,voiceNoMicrophone:`此设备未检测到麦克风输入。`,voiceError:`无法启动语音输入`,emoji:`表情符号`,emojiSearchPlaceholder:`搜索表情符号:笑、火、心……`,emojiSearchLoading:`加载表情符号`,emojiSearchNoResults:`没有找到表情符号`,addEmojiAria:`添加 {{emoji}}`,dropHint:`删除 .txt、.csv、.tsv 或 .xlsx 文件`,clear:`清除`,importFile:`文件`,importText:`导入文本`,googleSheets:`Google Sheets`,googleSheetsPlaceholder:`表格链接或已发布的CSV`,googleFileSharingHelp:`如何共享 Google 文件`,import:`进口`,xImport:`X(Twitter)`,xImportPlaceholder:`粘贴 x.com 帖子链接`,xImportHint:`仅限公开帖子。粘贴一个或多个链接,我们会导入帖子文本。`,redditImport:`Reddit`,redditImportPlaceholder:`粘贴 Reddit 帖子或版块链接`,redditImportHint:`仅限公开主题和版块。我们会导入标题和评论。`,hnImport:`Hacker News`,hnImportPlaceholder:`粘贴 Hacker News 条目链接`,hnImportHint:`我们会导入文章及其评论。`,youtubeImport:`YouTube`,youtubeImportPlaceholder:`粘贴 YouTube 视频链接`,youtubeImportHint:`我们会导入标题、描述、标签和热门评论。`,telegramImport:`Telegram`,telegramImportPlaceholder:`粘贴公开频道链接或 @名称`,telegramImportHint:`仅限公开频道。我们会导入近期帖子ã€
12‚`,rssImport:`RSS`,rssImportPlaceholder:`粘贴任意 RSS 或 Atom 订阅源网址`,rssImportHint:`任意博客或新闻订阅源。我们会导入条目标题和摘要。`,importOptions:`导入规则`,keepCase:`保留箱子`,countFrequency:`计数频率`,removeStopWords:`删除停用词`,detectDuplicates:`检测重复项`,lemmatizeWords:`词形还原`,languageProcessing:`语言处理`,languageProcessingStatus:`处理:{{language}}`,languageProcessingSection:`语言处理`,processingLanguage:`文本语言`,autoLanguage:`自动检测`,chineseLanguage:`中文`,chineseScript:`中文书写体系`,chineseScriptAuto:`自动检测`,chineseSimplified:`简体中文`,chineseTraditional:`繁體中文`,chineseMode:`中文处理模式`,chineseFast:`快速`,chinesePrecise:`精确`,keepSingleHan:`保留单个汉字`,includeNumbers:`包含数字`,normalizeChineseVariants:`合并繁体与简体形式`,minTokenLength:`最小词语长度`,chineseStopWordsProfile:`停用词`,chineseStopWordsCore:`安全`,chineseStopWordsExtended:`扩展`,chinesePosFilter:`词性筛选`,chinesePosAll:`全部`,chinesePosContent:`实词`,chinesePosNouns:`名词`,chineseKeywordRanking:`词语权重`,chineseKeywordSmart:`智能`,chineseKeywordFrequency:`词频`,chineseKeywordRankingHint:`智能权重综合词频、TF-IDF、TextRank、位置与词性;原始词频仍保留在元数据中。`,englishLanguage:`英语`,englishProcessingHint:`英语文本会在此浏览器本地进行词性标注和词形还原。`,englishPosFilter:`词性筛选`,englishPosAll:`所有词语`,englishPosContent:`实词`,englishPosNouns:`名词`,englishLemmatize:`英语词形还原`,englishStopWordsProfile:`停用词`,englishStopWordsCore:`基础`,englishStopWordsExtended:`扩展`,englishStopWordsHint:`基础列表会移除常见功能词;扩展列表还会过滤高频填充词。`,russianLanguage:`俄语`,russianLocale:`俄语变体`,russianMode:`俄语处理模式`,russianFast:`快速`,russianPrecise:`OpenCorpora`,russianPreciseHint:`精确导入仅在本地加载需要的词典片段;不会猜测有歧义的词形。`,russianPosFilter:`词性`,russianPosAll:`全部`,russianPosContent:`实词`,russianPosNouns:`名词`,russianLemmatize:`俄语词形还原`,russianYoNormalization:`Ё/Е 归一化`,russianYoPreserve:`保留 Ё 和 Е 的差异`,russianYoFold:`将 Ё 与 Е 合并`,russianYoHint:`合并可改善词频归类;会尽可能保留原始拼写。`,russianStopWordsProfile:`停用词`,russianStopWordsCore:`基础`,russianStopWordsExtended:`扩展`,russianStopWordsHint:`基础列表仅移除高置信度虚词;扩展列表会过滤更多常见填充词。`,genericLanguageProcessingHint:`该语言使用基础本地分词。请选择中文、俄语或英语以配置详细处理器。`,customDictionary:`自定义词典`,customDictionaryPlaceholder:`每行一个词。较长的词优先匹配。`,synonyms:`同义词`,synonymsPlaceholder:`每行一组:主词: 同义词1, 同义词2`,processingPrivacyLocal:`所有处理均在您的浏览器本地完成。`,preciseProcessingHint:`精确模式可更准确地识别中文词语边界,但可能需要稍长时间。`,preserveStyles:`保留样式`,replaceWordsOnly:`仅替换单词`,includeEmoji:`表情符号`,customStopWordsPlaceholder:`自定义停用词列表:每行一个单词、逗号或 ;`,importResult:`{{source}}:{{count}} 个字,{{rows}} 行,{{mode}} 模式`,includePhrases:`短语`,importMode:{text:`文本`,table:`桌子`},errors:{xlsUnsupported:`尚不支持旧版 .xls。将文件另存为 .xlsx 或 CSV。`,googleSheetsFailed:`无法加载 Google Sheets。使用公共链接或已发布的 CSV。`,googleSheetsInvalidUrl:`这不是有效的 Google Sheets 或已发布 CSV 链接。请粘贴完整的表格链接或公开的 HTTPS CSV URL。`,googleFileAccessDenied:`Google 文档未公开。请在 Google Docs 或 Google Drive 中打开共享,并将常规访问权限设为知道链接的任何人。`,importFailed:`无法导入数据`,xImportFailed:`无法加载 X 帖子。请使用公开帖子链接。`,redditImportFailed:`无法加载此 Reddit 链接。请使用公开的帖子或版块。`,hnImportFailed:`无法加载此 Hacker News 条目。请使用公开链接。`,youtubeImportFailed:`无法加载此 YouTube 视频。它可能不可用,或导入未配置。`,telegramImportFailed:`无法加载此 Telegram 频道。请使用公开频道链接。`,rssImportFailed:`无法加载此订阅源。请使用有效的 RSS æ
12ˆ– Atom 网址。`}},words:{title:`字`,word:`单词`,editWord:`编辑单词`,delete:`删除单词`,clearList:`清空词语列表`,count:`频率`,size:`尺寸`,sizeTitle:`与频率相关的单词或表情符号比例`,sizeWord:`{{word}} 的大小`,resetSize:`重置尺寸`,resetSizeShort:`100`,empty:`输入文本进行分析`,total:`{{count}} 字`,filteredTotal:`{{total}} 的 {{count}}`,searchPlaceholder:`搜索单词或表情符号`,noMatches:`没有匹配项`,showing:`显示 {{shown}}(共 {{count}})`,emoji:`表情符号`,repeatShort:`代表。`,repeatTitle:`填写时重复单词`,repeatWord:`填充时重复 {{word}}`,enableRepeatWord:`启用 {{word}} 的重复`,disableRepeatWord:`禁用 {{word}} 的重复`,managerTitle:`词语管理器`,managerApply:`应用`,managerDescription:`{{count}} 个条目,支持排序、批量操作和逐词设置。`,openManager:`管理词语`,selected:`已选:{{count}}`,selectAll:`选择所有可见词语`,kind:`类型`,frequencyValue:`权重 {{count}}`,bulkActions:`批量操作`,bulkDescription:`一次把同一个修改应用到所有已选词语。`,bulkFont:`批量字体`,fontAutoAll:`所选自动`,repeatOn:`开启重复`,repeatOff:`关闭重复`,repeatAll:`全部重复`,deleteSelected:`删除所选`,wordFont:`词语字体`,addWord:`添加词语`,addPlaceholder:`继续添加…`,addPlaceholderEmpty:`输入词语并按回车`,emptyListTitle:`词语列表为空`,emptyListDescription:`请在上方表单添加词语:输入词语并按回车。`,sourceTitle:`源文本`,sourceDescription:`粘贴或导入文本,将其转换为词语。`},style:{title:`风格`,font:`字体`,uploadFont:`上传字体`,customFonts:`自定义 {{count}}`,customFontsBadge:`{{count}}`,fontLoading:`加载中`,deleteCustomFont:`删除自定义字体`,scriptFonts:`语言字体`,autoFont:`汽车`,fontUpload:{title:`上传自定义字体`,description:`添加词云生成器可以使用的字体文件。`,formatsTitle:`支持的格式`,formatsBody:`推荐使用 WOFF2。还接受最大 6 MB 的 WOFF、TTF 和 OTF 文件。 TTC 集合、档案、SVG 字体和颜色/可变字体可能无法可靠工作。`,licenseTitle:`使用条件`,licenseOwn:`仅上传您有权使用的字体。`,licenseAllowed:`免费和开源字体,例如 SIL OFL、Apache 或类似许可证,都是合适的。仅当您的许可证允许网络/桌面使用和图像生成时,商业字体才适用。`,licenseRestricted:`请勿上传许可证禁止嵌入、Web 使用、图像创建或在生成服务中使用的字体。`,storageTitle:`文件存储位置`,storageBody:`该文件使用 IndexedDB 本地存储在该浏览器中,并且在上传期间不会发送到服务器。从该浏览器导出的文件将使用该字体,但如果公共链接和其他浏览器中没有相同的文件,则可能会回退。`,warning:`一个文件被视为一种样式。如果您需要常规、粗体或斜体样式,请上传单独的文件。`,chooseFile:`选择字体文件`},palette:`调色板`,customPalette:`风俗`,customPaletteTitle:`自定义调色板`,customPaletteHint:`构建单词颜色集。更改会立即应用于当前的云。`,addCustomColor:`添加颜色`,removeCustomColor:`去除颜色`,resetCustomPalette:`重置调色板`,customColorNumber:`颜色 {{number}}`,colorMode:`色彩模式`,sequential:`顺序`,random:`随机的`,byFrequency:`按频率`,fontSize:`尺寸范围`,min:`最小`,max:`最大限度`,morePalettes:`所有调色板`,paletteDialogTitle:`调色板`,paletteDialogCount:`{{count}} 个调色板`,closePalettes:`关闭调色板`},layout:{title:`布局`,spiral:`螺旋`,archimedean:`阿基米德`,rectangular:`矩形的`,rotation:`方向`,horizontal:`水平的`,mixed:`混合`,vertical:`垂直的`,orthogonal:`æ°´å¹³ 垂直`,crossing:`横穿 垂直`,crossingVoids:`穿越虚空`,dancing:`舞动的话语`,positiveSlope:`向上斜线`,negativeSlope:`向下斜线`,random:`随机的`,custom:`风俗`,moreOrientations:`所有方向`,orientationDialogTitle:`文字方向`,orientationDialogCount:`{{count}} 模式`,closeOrientations:`接近方向`,crossingPreview:`穿越`,voidsPreview:`空隙`,dancingPreview:`跳舞`,wordsPreview:`字`,positivePreview:`向上`,negativePreview:`向下`,slopePreview:`斜线`,customAngles:`角度`,customAnglesPlaceholder:`0、-30、30、90`,angled:`有角度的`,free:`自由角度`,padding:`词间距`,maxWords:`词数上限`},shape:{title:`形状`,popular:`受欢迎的`,selected:`已选择`,openCatalog:`目录`,catalogTitle:`形状目录`,catalogCount:`{{count}} 形状`,closeCatalog:`关闭形状目录`,catalogCustomize:`自定义形状`,catalogColor:`形状颜色`,catalogInvert:`反转形状`,catalogInvertHint:`填充此轮廓周围的区域,而不是轮廓本身。`,catalogBack:`返回`,catalogEditFree:`编辑`,catalogApply:`应用`,searchPlaceholder:`搜索形状和标签`,catalogEmpty:`未找到形状`,deleteShape:`删除形状“{{name}}”`,deleteShapeConfirm:`从你的形状中删除“{{name}}”?`,customTitle:`定制形状`,customDescription:`在构建器中绘制轮廓或导入图像`,builderOpen:`建设者`,builderTitle:`形状生成器`,builderDescription:`构建点轮廓或将字母和数字转换为矢量蒙版。`,builderDrawMode:`轮廓`,builderTextMode:`字母和数字`,builderControls:`如何画画`,builderHintAdd:`单击或点击网格以添加新点。`,builderHintDrag:`拖动节点以重塑轮廓。形状自动闭合。`,builderHintSnap:`轻磁铁将点吸附到网格上。按住 Alt 可绕过捕捉。`,builderTextInput:`人物`,builderTextPlaceholder:`2026`,builderTextFont:`字体`,builderTextFontSearch:`搜索字体`,builderTextFontSearchClear:`清除字体搜索`,builderTextFontSearchEmpty:`没有找到字体`,builderTextStyle:`风格`,builderTextInvert:`倒置`,builderTextInvertHint:`默认情况下,字母已填充。倒置时,它们周围的区域被填充。`,builderTextLoading:`准备大纲`,builderTextPreviewEmpty:`输入字母或数字`,builderTextError:`无法构建文本形状`,builderUndo:`撤消`,builderClear:`清除`,builderReset:`样本`,builderApply:`使用形状`,builderStats:`{{count}} 点,面积 {{area}}`,builderShapeName:`矢量形状`,builderEditedSuffix:`已编辑`,closeBuilder:`关闭生成器`,editShape:`编辑形状`,customUpload:`上传`,customThreshold:`掩模阈值`,customReady:`形状“{{name}}
12”已准备就绪`,customError:`无法从图像创建形状`,customModes:{auto:`汽车`,alpha:`阿尔法`,contrast:`对比`},categories:{all:`全部`,basic:`基本的`,nature:`自然`,animals:`动物`,kids:`儿童`,numbers:`数字`,objects:`对象`,symbols:`符号`,travel:`旅行`,brands:`品牌`,custom:`风俗`},mode:`模式`,frequency:`按频率`,fill:`填充形状`,background:`形状背景`,backgroundNone:`无背景`,backgroundWhite:`浅色背景`,backgroundSky:`天空背景`,backgroundMint:`薄荷背景`,backgroundWarm:`温暖的背景`,backgroundRose:`玫瑰背景`,backgroundCustom:`选择形状背景颜色`},stopWords:{title:`停用词`,enable:`过滤停用词`,language:`语言`,auto:`自动`,ru:`俄语`,en:`英语`,es:`西班牙语`,fr:`法语`,ar:`阿拉伯语`,zh:`中文`},export:{title:`出口`,format:`格式`,quality:`质量`,background:`背景`,transparent:`透明的`,white:`白色的`,dark:`黑暗的`,save:`节省`,download:`下载`,toggleOptions:`导出选项`,close:`关闭`,printReady:`可打印 PDF`,printReadyDescription:`固定纸张、边距和打印标记`,page:`页`,margin:`利润`,bleed:`流血`,safeZone:`安全区`,cropMarks:`裁剪标记`,downloading:`正在下载...`,watermark:`来源:{{site}}`,hideWatermark:`不含服务版权`,hideWatermarkDescription:`从导出文件中移除站点署名`},publish:{button:`分享`,creating:`正在发布...`,title:`发布词云`,description:`创建保留当前布局、形状和样式的词云链接。`,publicLifetime:`公开模板将永久保存,并归入当前界面语言。`,privateLifetime:`私密链接有效期为 90 天,且不会出现在目录中。`,defaultTitle:`我的词云`,nameLabel:`发布标题`,namePlaceholder:`例如:项目创意图`,publicNotice:`标题、词语和图片将对公开目录中的所有访客可见。`,privateToggle:`保留私密链接`,privateDescription:`不在公开目录中展示此作品`,privateNotice:`只有获得链接的人才能访问模板。链接将在 90 天后失效。`,create:`发布模板`,createPrivate:`创建私密链接`,publicResult:`模板已发布到目录并将永久保存。`,privateResult:`私密链接有效期为 90 天,模板不会出现在目录中。`,newPublication:`新建`,link:`关联`,copy:`复制`,copied:`已复制`,open:`打开`,close:`关闭`,native:`分享`,nativeTitle:`shapewords 词云`,socialTitle:`发布`,socialOpen:`发布到 {{name}}`,socialPreviewNote:`当社交网络抓取链接预览时,图片会通过 Open Graph 显示。`,qrAlt:`链接二维码`,empty:`先生成云`,error:`无法发布模板`,previewError:`无法生成发布预览`},templatePage:{badge:`公开模板`,description:`查看这个公开词云模板使用的词语、形状、配色和布局。`,back:`模板目录`,loading:`正在加载模板...`,words:`{{count}} 字`,notFoundTitle:`找不到链接`,expiredTitle:`此链接已过期`,expiredDescription:`此旧链接已失效。请从目录中选择其他模板。`,loadError:`无法加载模板`,applyError:`无法在编辑器中打开模板`,copyError:`无法复制链接`,templateNumber:`模板 · {{id}}`,copyLink:`复制链接`,copied:`链接已复制`,useTemplate:`使用此模板`,opening:`正在打开...`,language:`语言`,shape:`形状`,shapeCaption:`已选词云轮廓`,font:`字体`,orientation:`方向`,fontSize:`字号范围`,published:`发布日期`,details:`模板详情`,contents:`内容`,preview:`预览`,usedWords:`使用的词语`,wordWeight:`词语权重`,colorScheme:`配色方案`,customPalette:`自定义调色板`,technicalDetails:`布局详情`,spiral:`螺旋线`,wordSpacing:`词语间距`,colorMode:`颜色顺序`,wordLimit:`词语上限`,placedWords:`已放置词语`,canvasSize:`画布`,viewMode:`视图`,readyBadge:`打造你的版本`,readyTitle:`保留构图,改写内容。`,readyDescription:`在编辑器中打开模板,即可替换词语、调整形状与颜色,或导出结果。`},wordMap:{metaTitle:`交互式 3D 世界词语地图 | shapewords`,metaDescription:`在交互式 3D 地球上按国家探索 Google News RSS 最新结果中的高频词,并按天缓存新闻词簇。`,title:`世界词语地图`,search:`搜索地点`,searchPlaceholder:`搜索国家`,placePicker:`地点选择`,country:`国
12å®¶`,results:`结果`,noResults:`未找到地点`,world:`世界`,toggleOrbit:`开启或关闭地球旋转`,words:`词语`,empty:`选择国家`,scale:{world:`世界`,country:`国家`},newsSource:`Google News RSS`,newsSelectCountry:`搜索并选择国家以加载新闻词语`,newsReady:`新闻词语已就绪`,newsLoading:`正在加载新闻高频词`,newsFresh:`已从 Google News RSS 加载`,newsCached:`正在使用今日新闻缓存`,newsErrorShort:`新闻不可用`,newsError:`无法加载国家新闻词语`,newsEmpty:`未找到高频新闻词`,reloadNews:`重新加载新闻词语`},canvas:{undo:`撤消`,redo:`重做`,generate:`生成`,regenerate:`再生`,fullscreen:`全屏`,zoom:`飞涨`,showGrid:`显示网格`,hideGrid:`隐藏网格`,openMenuHint:`打开菜单添加单词`,emptyTitle:`工作区是空的`,emptyDesktopDescription:`在左侧面板中添加文本或使用示例构建词云。`,emptyMobileDescription:`打开菜单并添加文本以构建词云。`,generating:`生成...`,assigningFontsProgress:`分配字体`,loadingFontsProgress:`加载字体`,prepareProgress:`准备中`,preparingOutlineProgress:`生成轮廓`,fillProgress:`填充形状`,shapeWordCountLabel:`字形`,progressAssigningFonts:`选择可用字形覆盖`,progressLoadingFonts:`加载所选字体文件`,progressPreparing:`掩码、字体和字形`,progressPreparingOutline:`将文字转换为轮廓`,progressWords:`{{placed}} / {{target}} 字`,progressPlaced:`{{placed}} 字`,selectedWord:`所选单词`,selectWord:`选择单词 {{word}}`,editWord:`编辑单词 {{word}}`,wordColor:`颜色`,wordFont:`字体`,wordSize:`尺寸`,wordRotation:`旋转`,wordCurve:`曲线`,pinWord:`引脚位置`,unpinWord:`取消固定位置`,protectPinnedArea:`保护整条短语区域`,unprotectPinnedArea:`取消短语区域保护`,pinConflict:`位置已固定,但单词与形状或另一个固定单词部分冲突。`,deleteWord:`删除单词`,mainAccentTitle:`添加一个视觉重点?`,mainAccentDescription:`“{{word}}”可以成为视觉中心。我们会选择有特色的字体,并根据形状调整大小、旋转或弯曲。周围的空白将由其他词语填充。`,mainAccentProcessing:`正在选择字体…`,mainAccentFontError:`无法加载强调字体,请重试。`,mainAccentAction:`设为主要重点`,mainAccentDismiss:`隐藏建议`,sparseFillTitle:`形状中仍有较多空白`,sparseFillDescription:`当前已关闭重复,因此内容不足以密集填充。AI 可以查找新的同义词和简短的相关短语。`,sparseFillAction:`用 AI 查找同义词`,sparseFillProcessing:`AI 正在查找词语…`,sparseFillDismiss:`关闭建议`,sparseFillNoNewWords:`AI 没有找到新的唯一词语或短语。请尝试修改原始词表。`},tooltips:{help:`帮助`,text:{title:`智能导入接受纯文本、CSV/TSV、Excel .xlsx 和公共 Google Sheets。直接导入包含单词和频率列的表格。`,languageProcessing:`根据文本语言分词后再统计词频。默认开启;关闭后将使用基础分词方式。`,keepCase:`保留每个单词第一个检测到的大小写。关闭时,单词将标准化为小写。`,countFrequency:`启用后,重复的术语会增加单词权重。关闭时,每个导入的单词都会收到权重 1。`,removeStopWords:`过滤所选语言或输入文本中自动识别出的所有受支持语言的常用功能词,并叠加自å
12®šä¹‰åœç”¨è¯åˆ—表。`,detectDuplicates:`启用后,相同的单词将被合并。关闭时,将保留原始单词序列。`,lemmatizeWords:`启用后,俄语和英语单词形式会在频率计数之前标准化,因此 cars、car、running 和 running 可以共享其基本组。`,russianLemmatize:`谨慎归并受支持的俄语词形;歧义词保持分开,并保留原始范围。`,englishLemmatize:`在统计词频前将英语词形归并为词典形式,并保留原始文本范围。`,preserveStyles:`启用后,导入仅更改数据。关闭后,字体、调色板和基本文本设置将重置为默认值。`,replaceWordsOnly:`启用后,导入会直接替换单词表,而无需重新处理原始文本。关闭时,导入的源文件将通过普通文本处理器。`,includePhrases:`启用后,重复的两个单词组合将添加为短语。禁用时,仅使用单个单词。`,includeEmoji:`启用后,表情符号将作为单独的令牌提取并使用 Twemoji SVG 资产进行渲染。`},words:{title:`词语区域保留快速输入、删除和重复控制。要排序、批量编辑和设置单词字体,请打开管理器。`,sidebar:`侧边栏用于管理词语列表和重复。固定只适用于画布上选中的实例。`,manager:`管理器支持所有列排序、批量操作,以及对频率、大小、重复和字体的逐词控制。`},ai:{title:`AI 助手会扩展输入的主题,或将其翻译成所选语言。`},style:{font:`字体会影响视觉特征和形状内的实际单词位置。`,palette:`调色板定义可用的文字颜色。颜色模式控制如何分配这些颜色。`,colorMode:`顺序遵循调色板,随机调整颜色,并按频率强调更重要的单词。`,fontSize:`设置最小和最大尺寸范围。填充形状时,引擎仍会在这个范围内自适应调整大小,而不是使用固定值。`},layout:{title:`布局设置控制空白区域搜索、允许角度、词与词之间的间距,以及参与布局的词数上限。`,spiral:`螺旋控制如何在没有形状的规则云中搜索自由空间。`,rotation:`方向定义允许的角度。自由角度最适合密集形状填充。`,padding:`控制已放置单词之间的最小间距。值越小越紧密,值越大留白越多。`,maxWords:`限制参与布局生成的单词数量。普通词云和形状填充都会应用这个限制;更高的值可能改善覆盖率,但会增加生成时间。`},shape:{title:`该形状定义了一个掩模,其中单词通过像素轮廓放置,而不跨越边界。流行的形状内嵌显示,完整的目录单独打开。`,background:`背景突出显示单词后面的形状区域,并包含在 PNG、JPG、SVG 和 PDF 导出中。`},stopWords:{title:`停用词删除了常见的虚词,因此云不会被介词和连词所主导。`,enable:`启用后,会对所选语言或导入文本中检测到的所有受支持语言自动过滤常用功能词。`},export:{title:`导出以选定的格式、质量和背景保存当前云。`,format:`PNG/JPG 最适合图像,SVG 保留矢量文本,PDF 对于打印和文档很有用。`,quality:`SQ 以 2x 导出栅格格式,HQ 以 4x 导出。 PDF 使用 JPEG 压缩来避免文件过大而没有有用的细节。`,background:`背景仅影响导出的文件,而不影响编辑器工作区。`}},ai:{title:`人工智能助手`,serverMode:`服务器`,setupApi:`设置 OpenRouter API`,actions:{topic:`扩展主题`,phrases:`关键短语`,style:`推荐风格`},actionPlaceholders:{topic:`主题:生日、太空...`,translateOnly:`要翻译的单词或短语...`,style:`用于风格的主题(可选)`},actionPhrasesNote:`从导入的文本中提取关键短语。`,processing:`AI正在思考...`,apiKeyTitle:`OpenRouter API 密钥`,apiKeyDescription:`AI 功能需要免费的 OpenRouter 密钥。密钥仅存储在您的浏览器中。`,getKey:`在 openrouter.ai 获取密钥`,save:`节省`,clear:`消除`,promptHints:{title:`快速填入`,rotate:`显示其他提示`},settings:{open:`人工智能设置`,action:`AI 操作`,actionHints:{topic:`根据输入的主题生成词云。`,phrases:`从导入的文本中提取关键词和短语。`,style:`根据主题或文本选择配色、字体和形状。`},title:`生成设置`,description:`在呼叫 AI 之前控制语言、音量、语气和短语密度。`,summary:`{{mode}} · {{languages}} · {{count}} · {{tone}}`,languagesCount:`{{count}} 语言`,translationCount:`{{count}} 翻译`,generationMode:`模式`,generationModes:{expand:`展开主题`,translateOnly:`仅翻译`},generationModeHints:{expand:`AI 将使用选定的计数围绕源主题添加单词、短语和变体。`,translateOnly:`人工智能将为每种选定的语言准确返回源单词或短语的一个翻译。`},languages:`一种或多种语言`,languageLimit:`最多 30`,languagesPlaceholder:`俄语、英语、西班牙语...
13用逗号或换行符分隔。`,currentLanguage:`当前的`,twoLanguages:`俄语+英语`,languagePresets:{ten:`10 语言`,twenty:`20 语言`,thirty:`30 语言`},wordCount:`最少字数`,wordCountHint:`使用 1 到 80 之间的任何值。在仅翻译模式下,最终计数等于所选语言计数。`,tone:`语气`,phraseMode:`ç
13Ÿ­è¯­`,creativity:`种类`,preserveProperNouns:`保留名称和品牌`,balancedLanguages:`均匀平衡语言`,reset:`重置`,done:`完毕`,tones:{neutral:`中性的`,festive:`节日的`,professional:`专业的`,playful:`俏皮`,poetic:`诗意的`,minimal:`最小`},phraseModes:{mixed:`混合`,words:`字`,phrases:`短语`}}},footer:{free:`免费且无需注册`,description:`从文本、CSV、Excel 和 Google Sheets 创建形状文字云。`,github:`GitHub`,live:`直播云`,templates:`模板`,wordMap:`词语地图`,chromeExtension:`Chrome 扩展`,privacy:`隐私`}}}},supportedLngs:b,fallbackLng:`en`,load:`languageOnly`,nonExplicitSupportedLngs:!0,returnNull:!1,interpolation:{escapeValue:!1},detection:{order:[`path`,`localStorage`,`cookie`,`navigator`],lookupFromPathIndex:0,lookupLocalStorage:T,lookupCookie:S,caches:[`localStorage`,`cookie`]}});var Ja=`sw_words`,Ya=12e3,Xa=180,Za=64,Qa=1e3,$a=`https://telegram.org/js/telegram-web-app.js`,eo=[`tgWebAppData`,`telegram_init_data`,`initData`],to=null;async function no(){let e=window;return e.Telegram?.WebApp?.initData?!0:(to||=(to=new Promise(t=>{let n=!1,r=setTimeout(()=>{n=!0,t(!!e.Telegram?.WebApp?.initData)},2500),i=e=>{n||(n=!0,clearTimeout(r),t(e))},a=document.querySelector(`script[src="${$a}"]`);if(a){if(a.dataset?.telegramLoaded===`1`){i(!!e.Telegram?.WebApp?.initData);return}a.addEventListener(`load`,()=>{i(!!e.Telegram?.WebApp?.initData)},{once:!0}),a.addEventListener(`error`,()=>{i(!1)},{once:!0});return}let o=document.createElement(`script`);o.src=$a,o.async=!0,o.dataset.telegramLoaded=`0`,o.addEventListener(`load`,()=>{o.dataset.telegramLoaded=`1`,i(!!e.Telegram?.WebApp?.initData)},{once:!0}),o.addEventListener(`error`,()=>{i(!1)},{once:!0}),document.head.appendChild(o)}),to.finally(()=>{setTimeout(()=>{to=null},25)})),to)}function ro(){let e=new URLSearchParams(window.location.search);if(!eo.some(t=>e.has(t)))return!1;eo.forEach(t=>e.delete(t));let t=e.toString();return window.history.replaceState(null,``,`${window.location.pathname}${t?`?${t}`:``}${window.location.hash||``}`),!0}function io(){let e=new URLSearchParams(window.location.search);for(let t of eo){let n=e.get(t);if(n)return n}return``}function ao(){return window.Telegram?.WebApp?.initData||io()}function oo(e){let t=null;return()=>(t??=e().catch(e=>{throw t=null,e}),t)}var so=oo(()=>G(()=>j(()=>import(`./AccountLibraryDialog-DxC9TpNE.js`),__vite__mapDeps([9,1,2,5,6])))),co=oo(()=>G(()=>j(()=>import(`./PrivacyPolicyPage-BaNPcC5l.js`),__vite__mapDeps([10,1,2])))),lo=oo(()=>G(()=>j(()=>import(`./PublicTemplatesPage-DgCInNac.js`),__vite__mapDeps([11,1,2,6])))),uo=oo(()=>G(()=>j(()=>import(`./PublicTemplateDetailPage-BxgLV_SP.js`),__vite__mapDeps([12,1,2,6])))),fo=oo(()=>G(()=>j(()=>import(`./LiveRoomsPage-Dz4utdRV.js`),__vite__mapDeps([13,1,2,5,14,15,6])))),po=oo(()=>G(()=>j(()=>import(`./LiveLandingPage-CANkOPW4.js`),__vite__mapDeps([16,1,2,5,6])))),mo=oo(()=>G(()=>j(()=>import(`./LiveJoinPage-CHsKrdlE.js`),__vite__mapDeps([17,1,2,5,14,15])
13))),ho=oo(()=>G(()=>j(()=>import(`./LiveViewerPage-CznMncFD.js`),__vite__mapDeps([18,1,2,5,14,15,19,20,6])))),go=oo(()=>G(()=>j(()=>import(`./LiveWorkspacePage-v8yZ8h34.js`),__vite__mapDeps([21,1,2,5,14,15,19,20,6])))),_o=oo(()=>G(()=>j(()=>import(`./WordCloud3DStage-DI4JUT7N.js`),__vite__mapDeps([22,1,2])))),vo=oo(()=>G(()=>j(()=>import(`./WorldWordMapPage-D74TEcax.js`),__vite__mapDeps([23,1,2,6])))),yo=oo(()=>G(()=>j(()=>import(`./AdminPage-CM21EdDR.js`),__vite__mapDeps([24,1,2,5,6])))),bo=oo(()=>G(()=>j(()=>import(`./renderAutomation-DSK-dnlg.js`),__vite__mapDeps([25,1,2])))),xo=oo(()=>G(()=>j(()=>import(`./liveApi-CL7OMpE0.js`),__vite__mapDeps([26,15,2,1])))),So=oo(()=>G(()=>j(()=>import(`./liveWorkspace-vYxRq0id.js`),__vite__mapDeps([27,1,2,6]))));function $(e){e().catch(()=>void 0)}function Co(e,t,n,r){let i=Number(e);return Number.isFinite(i)?Math.max(n,Math.min(r,Math.round(i))):t}function wo(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=t.padEnd(Math.ceil(t.length/4)*4,`=`),r=window.atob(n),i=Uint8Array.from(r,e=>e.charCodeAt(0));return JSON.parse(new TextDecoder().decode(i))}function To(e){return e===`horizontal`}function Eo(e){if(!Array.isArray(e))return;let t=Array.from(new Set(e.map(e=>Number(e)).filter(e=>Number.isFinite(e)&&Math.abs(e)<=180).map(e=>Math.round(e))));return t.length>0&&t.length<=24?t:void 0}function Do(e){if(!e||e.length>Ya)return null;try{let t=wo(e),n=Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.words)?t.words:[],r=new Map;for(let e of n.slice(0,Xa*2)){if(!e||typeof e!=`object`)continue;let t=e,n=String(t.text??t.t??``).replace(/\s+/g,` `).trim().slice(0,Za);if(!n||!/[\p{L}\p{N}]/u.test(n))continue;let i=Co(t.value??t.v,1,1,Qa),a=t.repeat??t.r,o=n.toLocaleLowerCase(),s=r.get(o);s?r.set(o,{...s,value:Math.min(Qa,s.value+i),repeat:s.repeat!==!1&&a!==!1}):r.set(o,{text:n,value:i,kind:`word`,repeat:a!==!1})}let i=Array.from(r.values()).sort((e,t)=>t.value-e.value).slice(0,Xa);if(i.length===0)return null;let a=t&&typeof t==`object`?t:null,o=a?.layout&&typeof a.layout==`object`?a.layout:null;return{sourceText:typeof a?.sourceText==`string`?a.sourceText.slice(0,1e4):i.map(e=>e.text).join(`
14`),words:i,rotationPreset:To(a?.rotationPreset??o?.rotationPreset)?`horizontal`:void 0,rotations:Eo(a?.rotations??o?.rotations)}}catch{return null}}function Oo(e){e.page===`templates`?$(lo):e.page===`publishedTemplate`?$(uo):e.page===`privacy`?$(co):e.page===`liveLanding`?$(po):e.page===`liveRooms`?$(fo):e.page===`liveJoin`?$(mo):e.page===`liveView`?$(ho):e.page===`liveWorkspace`?$(go):e.page===`wordMap`?$(vo):e.page===`stat`&&$(yo)}var ko=(0,K.lazy)(()=>so().then(e=>({default:e.AccountLibraryDialog}))),Ao=(0,K.lazy)(()=>co().then(e=>({default:e.PrivacyPolicyPage}))),jo=(0,K.lazy)(()=>lo().then(e=>({default:e.PublicTemplatesPage}))),Mo=(0,K.lazy)(()=>uo().then(e=>({default:e.PublicTemplateDetailPage}))),No=(0,K.lazy)(()=>fo().then(e=>({default:e.LiveRoomsPage}))),Po=(0,K.lazy)(()=>po().then(e=>({default:e.LiveLandingPage}))),Fo=(0,K.lazy)(()=>mo().then(e=>({default:e.LiveJoinPage}))),Io=(0,K.lazy)(()=>ho().then(e=>({default:e.LiveViewerPage}))),Lo=(0,K.lazy)(()=>go().then(e=>({default:e.LiveWorkspacePage}))),Ro=(0,K.lazy)(()=>_o()),zo=(0,K.lazy)(()=>vo().then(e=>({default:e.WorldWordMapPage}))),Bo=(0,K.lazy)(()=>yo().then(e=>({default:e.AdminPage})));function Vo(){let{t:e}=F();return(0,q.jsxs)(`div`,{className:`flex min-h-0 flex-1 items-center justify-center bg-slate-50 text-sm text-slate-500 dark:bg-slate-950 dark:text-slate-400`,children:[(0,q.jsx)(`span`,{className:`mr-2 size-4 animate-spin rounded-full border-2 border-slate-300 border-t-primary dark:border-slate-700 dark:border-t-primary`}),e(`common.loading`)]})}function Ho(){let{t:e}=F();return(0,q.jsx)(`div`,{className:`fixed inset-0 z-50 grid place-items-center bg-slate-950/28 p-4 backdrop-blur-[2px]`,role:`status`,"aria-live":`polite`,children:(0,q.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg border border-slate-200 bg-white px-4 py-3 text-sm font-medium text-slate-700 shadow-xl shadow-slate-950/12 dark:border-slate-800 dark:bg-slate-950 dar
14k:text-slate-200`,children:[(0,q.jsx)(`span`,{className:`size-4 animate-spin rounded-full border-2 border-slate-300 border-t-primary dark:border-slate-700 dark:border-t-primary`}),e(`common.loading`)]})})}var Uo=(0,K.memo)(function(){return sa(),null});function Wo({enabled:e,locale:t}){let n=(0,K.useRef)(!1);return(0,K.useEffect)(()=>{if(!e||n.current)return;let r=window.setTimeout(()=>{if(n.current||_a())return;let e=k.getState();if(e.rawText.trim().length>0||e.words.length>0||e.layoutWords.length>0||e.importedWords!==null)return;let r=ga(t),i=r.words.map(e=>({...e}));n.current=!0,k.setState({rawText:r.sourceText,importedWords:i,words:i,pinnedWordKeys:[],fontFamily:`Montserrat`,fontStyleId:`regular`,fontAssignmentMode:`auto`,paletteIndex:0,colorMode:`random`,minFontSize:18,maxFontSize:96,layoutWords:[],layoutProgress:null,layoutQuality:null,isGenerating:!1,preservedLayoutSignature:null,preservedColorSignature:null,pinnedLayoutRevision:0,renderMode:`2d`}),va()},0);return()=>window.clearTimeout(r)},[e,t]),null}var Go={en:{title:`Free word cloud generator online | shapewords`,description:`shapewords is a free online word cloud generator. Create word clouds from text, CSV, Excel, and Google Sheets, fill shapes with words, and export PNG, JPG, SVG, or PDF.`},ru:{title:`Генератор облака слов онлайн — создать word cloud бесплатно | shapewords`,description:`shapewords — бесплатный генератор облака слов онлайн. Создавайте word cloud из текста, CSV, Excel и Google Sheets, заполняйте фигуры словами и экспортируйте PNG, JPG, SVG или PDF.`},ar:{title:`منشئ سحابة الكلمات المجاني عبر الإنترنت | shapewords`,description:`shapewords هو منشئ سحابة كلمات مجاني عبر الإنترنت. أنشئ سحب كلمات من النصوص وCSV وExcel وGoogle Sheets، واملأ الأشكال بالكلمات، ثم صدّرها إلى PNG أو JPG أو SVG أو PDF.`},es:{title:`Generador de nubes de palabras gratis online | shapewords`,description:`shapewords es un generador de nubes de palabras gratis online. Crea nubes de palabras desde texto, CSV, Excel y Google Sheets, rellena formas con palabras y exporta en PNG, JPG, SVG o PDF.`},fr:{title:`Générateur de nuages de mots gratuit en ligne | shapewords`,description:`shapewords est un générateur de nuages de mots gratuit en ligne. Créez des nuages de mots à partir de texte, CSV, Excel et Google Sheets, remplissez des formes avec des mots et exportez en PNG, JPG, SVG ou PDF.`},zh:{title:`免费在线词云生成器 | shapewords`,description:`shapewords 是一款免费的在线词云生成器。可从文本、CSV、Excel 和 Google Sheets 创建词云,将单词填充到形状中,并导出为 PNG、JPG、SVG 或 PDF。`}},Ko={en:{title:`Interactive 3D word map of the world | shapewords`,description:`Explore frequent words from the latest Google News RSS results for countries on an interactive 3D globe with daily cached word clusters by map scale.`},ru:{title:`Интерактивная 3D-карта слов на глобусе | shapewords`,description:`Исследуйте частотные слова из последних Google News RSS по странам на интерактивном 3D-глобусе с дневным кешированием кластеров по масштабу.`},ar:{title:`خريطة كلمات ثلاثية الأبعاد تفاعلية للعالم | shapewords`,description:`استكشف الكلمات الأكثر تكرارًا من آخر نتائج Google News RSS للبلدان على كرة أرضية ثلاثية الأبعاد مع تخزين يومي مؤقت.`},es:{title:`Mapa 3D interactivo de palabras del mundo | shapewords`,description:`Explora palabras frecuentes de las últimas noticias de Google News RSS por país en un globo 3D interactivo con caché diaria.`},fr:{title:`Carte mondiale 3D interactive de mots | shapewords`,description:`Explorez les mots fréquents des derniers résultats Google News RSS par pays sur un globe 3D interactif avec cache quotidien.`},zh:{title:`交互式 3D 世界词语地图 | shapewords`,description:`在交互式 3D 地球上按国家探索 Google News RSS 最新结果中的高频词,并按天缓存新闻词簇。`}};function qo(e,t){let n=e.replace(/\/{2,}
14/g,`/`),r=n.split(`/`).filter(Boolean),i=r[0]?.toLowerCase(),a=i&&ce(i)?i:null;if(!a){if(n===`/stat`||n===`/stat/`||n===`/admin`||n===`/admin/`)return{locale:t,page:`stat`,canonicalPath:`/stat`};let e=n.match(/^\/templates(?:\/([^/]+))?\/?$/);if(e){let n=e[1];return{locale:t,page:n?`publishedTemplate`:`templates`,shareId:n,canonicalPath:`/${t}/templates${n?`/${n}`:``}`}}if(n===`/privacy`||n===`/privacy/`)return{locale:t,page:`privacy`,canonicalPath:`/${t}/privacy`};if(n===`/live-word-cloud`||n===`/live-word-cloud/`)return{locale:t,page:`liveLanding`,canonicalPath:`/${t}/live-word-cloud`};if(n===`/live-word-cloud/rooms`||n===`/live-word-cloud/rooms/`)return{locale:t,page:`liveRooms`,canonicalPath:`/${t}/live-word-cloud/rooms`};if(n===`/word-map`||n===`/word-map/`)return{locale:t,page:`wordMap`,canonicalPath:`/${t}/word-map`};let r=n.match(/^\/live\/([A-Za-z0-9_-]{6,64})\/(join|view|workspace)\/?$/);if(r){let e=r[1],n=r[2];return{locale:t,page:n===`join`?`liveJoin`:n===`view`?`liveView`:`liveWorkspace`,liveId:e,canonicalPath:`/${t}/live/${e}/${n}`}}return{locale:t,page:`editor`,canonicalPath:`/${t}/`}}let o=r.slice(1).join(`/`),s=o.match(/^templates(?:\/([^/]+))?\/?$/),c=o.match(/^share\/([A-Za-z0-9_-]{6,64})\/?$/),l=o.match(/^live-word-cloud\/?$/),u=o.match(/^live-word-cloud\/rooms\/?$/),d=o.match(/^word-map\/?$/),f=o.match(/^(?:stat|admin)\/?$/),p=o.match(/^live\/([A-Za-z0-9_-]{6,64})\/(join|view|workspace)\/?$/),m=o.match(/^privacy\/?$/);if(s){let e=s[1];return{locale:a,page:e?`publishedTemplate`:`templates`,shareId:e,canonicalPath:`/${a}/templates${e?`/${e}`:``}`}}if(m)return{locale:a,page:`privacy`,canonicalPath:`/${a}/privacy`};if(c){let e=c[1];return{locale:a,page:`publishedTemplate`,shareId:e,canonicalPath:`/${a}/templates/${e}`}}if(l)return{locale:a,page:`liveLanding`,canonicalPath:`/${a}/live-word-cloud`};if(u)return{locale:a,page:`liveRooms`,canonicalPath:`/${a}/live-word-cloud/rooms`};if(d)return{locale:a,page:`wordMap`,canonicalPath:`/${a}/word-map`};if(f)return{locale:a,page:`stat`,canonicalPath:`/stat`};if(p){let e=p[1],t=p[2];return{locale:a,page:t===`join`?`liveJoin`:t===`view`?`liveView`:`liveWorkspace`,liveId:e,canonicalPath:`/${a}/live/${e}/${t}`}}return{locale:a,page:`editor`,canonicalPath:`/${a}/`}}function Jo(e,t){return e.page===`templates`?`/${t}/templates`:e.page===`privacy`?`/${t}/privacy`:e.page===`publishedTemplate`?`/${t}/templates/${e.shareId}`:e.page===`liveLanding`?`/${t}/live-word-cloud`:e.page===`liveRooms`?`/${t}/live-word-cloud/rooms`:e.page===`wordMap`?`/${t}/word-map`:e.page===`liveJoin`?`/${t}/live/${e.liveId}/join`:e.page===`liveView`?`/${t}/live/${e.liveId}/view`:e.page===`liveWorkspace`?`/${t}/live/${e.liveId}/workspace`:e.page===`stat`?`/stat`:`/${t}/`}function Yo(e){if(e.page===`editor`)return Go[e.locale];if(e.page===`wordMap`)return Ko[e.locale];let t=Go[e.locale];return{title:`${{templates:`Templates`,publishedTemplate:`Public template`,privacy:`Privacy`,liveLanding:`Live word cloud`,liveRooms:`Live rooms`,liveJoin:`Live room`,liveView:`Live room`,liveWorkspace:`Live workspace`,wordMap:`3D word map`,stat:`Stats`}[e.page]} | shapewords`,description:t.description}}function Xo(e,t){switch(e){case`oauth_cancelled`:return t(`account.oauthCancelled`);case`oauth_email_required`:return t(`account.oauthEmailRequired`);case`oauth_email_unverified`:return t(`account.oauthEmailUnverified`);case`oauth_provider_disabled`:return t(`account.oauthProviderDisabled`);case`oauth_state_invalid`:return t(`account.oauthStateInvalid`);default:return t(`account.oauthFailed`)}}function Zo(){let{i18n:e,t}=F(),n=k(e=>e.darkMode),a=k(e=>e.renderMode),o=i(e=>e.user),s=i(e=>e.isAuthLoaded),c=i(e=>e.loadSession),l=i(e=>e.signInWithTelegramMiniApp),u=i(e=>e.isLibraryOpen),d=i(e=>e.setLibraryOpen),f=i(e=>e.setActiveTab),p=i(e=>e.setError),[m,h]=(0,K.useState)(!1),[g,_]=(0,K.useState)(()=>y()),v=g,[b,x]=(0,K.useState)(()=>{let e=qo(window.location.pathname,v);return e.page===`liveWorkspace`?e.liveId??null:null}),S=(0,K.useRef)(null),C=(0,K.useRef)(!1),[w,T]=(0,K.useState)(()=>{let e=window.location.pathname,t=qo(e,v);return e===t.canonicalPath?e:(window.history.replaceState(null,``,t.canonicalPath),t.canonicalPath)}),E=qo(w,g),D=new URLSearchParams(window.location.search).get(`render`)===`1`,O=E.page===`liveWorkspace`?E.liveId??null:b,j=D||E.page===`editor`,M=(0,K.useMemo)(()=>Yo(E),[E]),N=(0,K.useCallback)((e,t=!1)=>{e!==window.location.pathname&&(Oo(qo(e,g)),t?window.history.replaceState(null,``,e):window.history.pushState(null,``,e),T(window.location.pathname))},[g]);(0,K.useEffect)(()=>{c()},[c]),(0,K.useEffect)(()=>{!s||C.current||o||(async()=>
14{if(!ao()&&(!/Telegram/i.test(window.navigator.userAgent)||!await no()))return;let e=ao();if(e){C.current=!0;try{await l(e),ro()}catch{}}})()},[s,o,l]),(0,K.useEffect)(()=>{if(E.page!==`editor`)return;let e=new URLSearchParams(window.location.search),t=e.get(Ja);if(!t||S.current===t)return;S.current=t;let n=Do(t);e.delete(Ja);let i=e.toString();if(window.history.replaceState(null,``,`${window.location.pathname}${i?`?${i}`:``}`),!n)return;let a=k.getState();a.setImportedWords(n.words,n.sourceText),a.setShapeType(`cloud`),n.rotationPreset?a.setRotationPreset(n.rotationPreset):n.rotations&&a.setCustomRotationInput(n.rotations.join(`, `)),a.requestGeneration(),r(`input.imported`,{source:`Chrome Extension`,words:n.words.length,rows:n.words.length,mode:`url_words`,replaceWordsOnly:!0,preserveStyles:!0})},[E.page]),(0,K.useEffect)(()=>{let e=window,t=()=>{$(so),$(fo)};if(typeof e.requestIdleCallback==`function`){let n=e.requestIdleCallback(t,{timeout:2500});return()=>e.cancelIdleCallback?.(n)}let n=window.setTimeout(t,1200);return()=>window.clearTimeout(n)},[]),(0,K.useEffect)(()=>{let e=new URLSearchParams(window.location.search),n=e.get(`account`)===`1`,r=e.get(`auth_error`);if(!n&&!r)return;r&&p(Xo(r,t)),f(`account`),d(!0),e.delete(`account`),e.delete(`auth_error`),e.delete(`auth_provider`);let i=e.toString();window.history.replaceState(null,``,`${window.location.pathname}${i?`?${i}`:``}`)},[p,f,d,t]),(0,K.useEffect)(()=>{let e=()=>{let e=window.location.pathname,t=qo(e,g);e!==t.canonicalPath&&window.history.replaceState(null,``,t.canonicalPath),T(window.location.pathname)};return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},[g]),(0,K.useEffect)(()=>{e.language!==E.locale&&e.changeLanguage(E.locale)},[e,E.locale]),(0,K.useEffect)(()=>{document.documentElement.classList.toggle(`dark`,n)},[n]),(0,K.useEffect)(()=>{document.documentElement.lang=E.locale,document.documentElement.dir=e.dir(E.locale)},[e,E.locale]),(0,K.useEffect)(()=>{document.title=M.title;let e=document.querySelector(`meta[name="description"]`);e&&(e.content=M.description)},[M]),(0,K.useEffect)(()=>{if(!D)return;let e=!1;return bo().then(({installRenderAutomation:t})=>{e||t()}).catch(e=>{console.error(`Render automation failed to load`,e)}),()=>{e=!0}},[D]),(0,K.useEffect)(()=>{if(!o||!O||E.page!==`editor`)return;let e=!1,t=null;return(async()=>{let[{getLiveSession:n,openLiveEvents:r},{applyLiveDetailsToWorkspace:i}]=await Promise.all([xo(),So()]);if(e)return;let a=()=>{n(O).then(t=>{e||i(t)}).catch(()=>void 0)};a(),t=r(O,`owner`,a)})().catch(()=>void 0),()=>{e=!0,t?.close()}},[E.page,O,o]);let ee=(0,K.useCallback)(e=>{A(e),_(e),N(Jo(E,e))},[N,E]),te=(0,K.useCallback)(()=>h(!0),[]),P=(0,K.useCallback)(()=>h(!1),[]),I=(0,K.useCallback)(e=>{e&&x(e),$(fo),N(`/${E.locale}/live-word-cloud/rooms`)},[N,E.locale]),ne=(0,K.useCallback)(()=>{$(so),d(!0)},[d]),L=(0,K.useCallback)(()=>N(`/${E.locale}/`),[N,E.locale]);return D?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Uo,{}),(0,q.jsx)(`main`,{className:`flex h-screen min-h-0 min-w-0 overflow-hidden bg-white p-0 dark:bg-slate-950`,children:(0,q.jsx)($i,{presentationMode:!0})})]}):E.page===`liveJoin`&&E.liveId?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(Fo,{locale:E.locale,sessionId:E.liveId,onNavigate:N},E.liveId)}):E.page===`liveView`&&E.liveId?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(Io,{locale:E.locale,sessionId:E.liveId,onNavigate:N},E.liveId)}):E.page===`liveWorkspace`&&E.liveId?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(Lo,{locale:E.locale,sessionId:E.liveId,onNavigate:N,onOpenConsole:()=>I(E.liveId)},E.liveId)}),u&&(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Ho,{}),children:(0,q.jsx)(ko,{onOpenEditor:L})})]}):E.page===`stat`?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(Bo,{locale:E.locale,onNavigate:N})}):(0,q.jsxs)(q.Fragment,{children:[j?(0,q.jsx)(Uo,{}):null,(0,q.jsx)(Wo,{enabled:E.page===`editor`&&!D,locale:E.locale}),(0,q.jsx)(fn,{locale:E.locale,onOpenSidebar:te,onOpenAccount:ne,onPreloadLive:()=>$(po),onPreloadAccount:()=>$(so),onNavigate:N,onSwitchLocale:ee}),E.page===`templates`?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(jo,{locale:E.locale,onNavigate:N})}):E.page===`liveLanding`?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(Po,{locale:E.locale,onNavigate:N})}):E.page===`liveRooms`?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(No,{locale:E.locale,activeLiveRoomId:O,onActiveLiveRoomChange:x,onNavigate:N})}):E.page===`wordMap`?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(zo,{locale:E.locale,onNavigate:N})}
14):E.page===`privacy`?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(Ao,{locale:E.locale,onNavigate:N})}):E.page===`publishedTemplate`&&E.shareId?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Vo,{}),children:(0,q.jsx)(Mo,{locale:E.locale,templateId:E.shareId,onNavigate:N},E.shareId)}):(0,q.jsxs)(`div`,{className:`relative min-h-0 flex-1 overflow-hidden lg:grid lg:grid-cols-[340px_minmax(0,1fr)]`,children:[(0,q.jsx)(Or,{isOpen:m,onClose:P}),(0,q.jsx)(`main`,{className:`flex h-full min-h-0 min-w-0 flex-col overflow-hidden p-2 sm:p-3 lg:p-4`,children:a===`3d`?(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(`div`,{className:`min-h-0 flex-1`}),children:(0,q.jsx)(Ro,{})}):(0,q.jsx)($i,{onOpenSidebar:te})})]}),u&&(0,q.jsx)(K.Suspense,{fallback:(0,q.jsx)(Ho,{}),children:(0,q.jsx)(ko,{onOpenEditor:L})}),(0,q.jsx)(jr,{locale:E.locale,onNavigate:N,onPreloadLiveLanding:()=>$(po)})]})}function Qo(){`serviceWorker`in navigator&&window.addEventListener(`load`,()=>{navigator.serviceWorker.register(`/sw.js`).catch(e=>{})})}Et(),Qo(),(0,Vt.createRoot)(document.getElementById(`root`)).render((0,q.jsx)(K.StrictMode,{children:(0,q.jsx)(Zo,{})})),At();export{en as t};

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.