@docvyu/sdk 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -193
- package/dist/cdn/docvyu.js +2912 -0
- package/dist/cdn/docvyu.min.js +10 -4
- package/dist/cjs/DocvyuEditor-CwMF2qhs.js +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/react/index.js +1 -1
- package/dist/esm/DocvyuEditor-CCAFPhSl.js +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/react/index.js +1 -1
- package/dist/types/app/styles.d.ts +1 -1
- package/dist/types/core/DocvyuEditor.d.ts +7 -0
- package/dist/types/i18n/types.d.ts +3 -0
- package/dist/types/index.d.ts +19 -5
- package/dist/types/react/index.d.ts +2 -1
- package/package.json +1 -1
- package/dist/cjs/DocvyuEditor-Bh9EkDQb.js +0 -1
- package/dist/esm/DocvyuEditor-DlUB7weZ.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={loadDocument:!0,saveDocument:!0,editText:!0,formatting:!0,lists:!0,pageSettings:!0,zoom:!0,showWatermark:!0,maxDocumentSize:5242880,maxDocsPerMonth:10,grayLabel:!1,prioritySupport:!1},t={starter:e,professional:{loadDocument:!0,saveDocument:!0,editText:!0,formatting:!0,lists:!0,pageSettings:!0,zoom:!0,showWatermark:!1,maxDocumentSize:0,maxDocsPerMonth:10,grayLabel:!1,prioritySupport:!0},enterprise:{loadDocument:!0,saveDocument:!0,editText:!0,formatting:!0,lists:!0,pageSettings:!0,zoom:!0,showWatermark:!1,maxDocumentSize:0,maxDocsPerMonth:0,grayLabel:!0,prioritySupport:!0}},i=function(){try{if("undefined"!=typeof process&&process.env){const e=process.env.VITE_DOCVYU_LICENSE_SERVER||process.env.NEXT_PUBLIC_DOCVYU_LICENSE_SERVER;if(e&&"undefined"!==e)return e}}catch{}try{if(void 0!==import.meta&&import.meta.env){const e=import.meta.env.VITE_DOCVYU_LICENSE_SERVER;if(e&&"undefined"!==e)return e}}catch{}return"https://docvyu-license.luis-tapia-a.workers.dev/v1/license"}(),a="docvyu_license_cache";class o{constructor(e={}){this.status=null,this.fingerprint=null,this.serverUsageCount=0,this.config={apiKey:e.apiKey,licenseServerUrl:e.licenseServerUrl||i,offlineMode:e.offlineMode??!1}}async initialize(){return this.fingerprint=await this.generateFingerprint(),this.config.apiKey?this.initializeWithApiKey():this.initializeStarterTier()}async initializeWithApiKey(){const e=this.getCachedLicense();if(e&&e.apiKey===this.config.apiKey){const t=Date.now();if(e.expiresAt>t)return this.status=e.status,this.status}try{return this.status=await this.validateWithServer(),this.cacheLicense(this.status),this.status}catch(t){return this.config.offlineMode&&e?(this.status=e.status,this.status):this.initializeStarterTier()}}async initializeStarterTier(){try{const t=await this.getServerUsage();this.serverUsageCount=t.used;const i=Math.max(0,t.limit-t.used);return this.status={isValid:i>0,tier:"starter",remainingUses:i,unlimited:!1,features:e,expiresAt:null,error:i<=0?"Monthly document limit exceeded. Please upgrade to continue.":void 0},this.status}catch(t){return this.status={isValid:!1,tier:"starter",remainingUses:0,unlimited:!1,features:e,expiresAt:null,error:"Could not verify usage. Please check your internet connection."},this.status}}getStatus(){return this.status?this.status:{isValid:!1,tier:"starter",remainingUses:0,unlimited:!1,features:e,expiresAt:null,error:"License not initialized"}}hasFeature(e){return!!this.getStatus().features[e]}async recordUsage(){if(this.status?.unlimited)return 1/0;try{const e=await this.recordServerUsage();return this.serverUsageCount=e.used,this.status&&(this.status.remainingUses=e.remaining,e.remaining<=0&&(this.status.isValid=!1,this.status.error="Monthly document limit exceeded. Please upgrade to continue.")),e.remaining}catch(e){return this.status&&(this.status.remainingUses=0,this.status.isValid=!1,this.status.error="Could not verify usage. Please check your internet connection."),0}}getRemainingUses(){return this.status?.unlimited?1/0:this.status?.remainingUses??0}isUsageLimitExceeded(){return!this.status?.unlimited&&this.getRemainingUses()<=0}async getServerUsage(){const e=await fetch(`${this.config.licenseServerUrl}/usage`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fingerprint:this.fingerprint,action:"get"})});if(!e.ok)throw new Error(`Failed to get usage: ${e.status}`);return e.json()}async recordServerUsage(){const e=await fetch(`${this.config.licenseServerUrl}/usage`,{method:"POST",headers:{"Content-Type":"application/json",...this.config.apiKey?{Authorization:`Bearer ${this.config.apiKey}`}:{}},body:JSON.stringify({fingerprint:this.fingerprint,action:"record",apiKey:this.config.apiKey})});if(!e.ok)throw new Error(`Failed to record usage: ${e.status}`);return e.json()}async validateWithServer(){const i=await fetch(`${this.config.licenseServerUrl}/validate`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({apiKey:this.config.apiKey,fingerprint:this.fingerprint,timestamp:Date.now()})});if(!i.ok){if(401===i.status||403===i.status)return{isValid:!1,tier:"starter",remainingUses:0,unlimited:!1,features:e,expiresAt:null,error:"Invalid API key"};throw new Error(`License validation failed: ${i.status}`)}const a=await i.json();return{isValid:a.valid,tier:a.tier||"starter",remainingUses:a.remainingUses??1/0,unlimited:a.unlimited??!1,features:t[a.tier]||e,expiresAt:a.expiresAt?new Date(a.expiresAt):null}}getCachedLicense(){if("undefined"==typeof localStorage)return null;try{const e=localStorage.getItem(a);return e?JSON.parse(e):null}catch{return null}}cacheLicense(e){if("undefined"==typeof localStorage)return;if(!this.config.apiKey)return;const t={status:e,apiKey:this.config.apiKey,cachedAt:Date.now(),expiresAt:Date.now()+864e5};try{localStorage.setItem(a,JSON.stringify(t))}catch{}}async generateFingerprint(){const e=[];"undefined"!=typeof navigator&&(e.push(navigator.userAgent),e.push(navigator.language),e.push(String(navigator.hardwareConcurrency||"")),e.push(navigator.platform||"")),"undefined"!=typeof screen&&(e.push(`${screen.width}x${screen.height}`),e.push(String(screen.colorDepth)));try{e.push(Intl.DateTimeFormat().resolvedOptions().timeZone)}catch{}try{const t=document.createElement("canvas"),i=t.getContext("2d");i&&(i.textBaseline="top",i.font="14px Arial",i.fillText("DocVyu",0,0),e.push(t.toDataURL()))}catch{}const t=e.join("|");return this.hashString(t)}async hashString(e){if("undefined"!=typeof crypto&&crypto.subtle){const t=(new TextEncoder).encode(e),i=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(i)).map(e=>e.toString(16).padStart(2,"0")).join("")}let t=0;for(let i=0;i<e.length;i++)t=(t<<5)-t+e.charCodeAt(i),t&=t;return Math.abs(t).toString(16)}}const r={en:{general:{loading:"Loading...",error:"Error",success:"Success",cancel:"Cancel",confirm:"Confirm",save:"Save",close:"Close",retry:"Retry",poweredBy:"Powered by"},editor:{title:"DocVyu Editor",untitledDocument:"Untitled Document",loadingEditor:"Loading editor...",initializingEditor:"Initializing editor...",documentLoaded:"Document loaded successfully",documentSaved:"Document saved successfully",noDocumentLoaded:"No document loaded"},toolbar:{file:"File",edit:"Edit",view:"View",format:"Format",help:"Help",newDocument:"New Document",openDocument:"Open Document",saveDocument:"Save Document",downloadDocument:"Download Document",undo:"Undo",redo:"Redo",cut:"Cut",copy:"Copy",paste:"Paste",selectAll:"Select All",home:"Home",insert:"Insert",layout:"Layout",clipboard:"Clipboard",font:"Font",paragraph:"Paragraph",editing:"Editing",find:"Find",replace:"Replace",size:"Size",numberingFormat:"Numbering Format"},formatting:{bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",fontSize:"Font Size",fontFamily:"Font Family",fontColor:"Font Color",backgroundColor:"Background Color",alignment:"Alignment",alignLeft:"Align Left",alignCenter:"Align Center",alignRight:"Align Right",alignJustify:"Justify",bulletList:"Bullet List",numberedList:"Numbered List",increaseIndent:"Increase Indent",decreaseIndent:"Decrease Indent",lineSpacing:"Line Spacing",paragraphSpacing:"Paragraph Spacing"},pageSettings:{title:"Page Settings",pageSize:"Page Size",margins:"Margins",marginTop:"Top",marginBottom:"Bottom",marginLeft:"Left",marginRight:"Right",orientation:"Orientation",portrait:"Portrait",landscape:"Landscape",customSize:"Custom Size",letter:"Letter",legal:"Legal",a4:"A4",a5:"A5",b5:"B5"},zoom:{zoomIn:"Zoom In",zoomOut:"Zoom Out",zoomLevel:"Zoom Level",fitToPage:"Fit to Page",fitToWidth:"Fit to Width"},ruler:{centimeters:"Centimeters",inches:"Inches",toggleUnit:"Toggle Unit"},license:{freeTier:"Free",starterTier:"Starter",professionalTier:"Professional",enterpriseTier:"Enterprise",documentsRemaining:"{count} documents remaining this month",unlimitedDocuments:"Unlimited documents",upgradeNow:"Upgrade Now",licenseValid:"License is valid",licenseExpired:"License has expired",licenseInvalid:"Invalid license",invalidLicense:"Invalid or expired license. Please check your API key.",notValidated:"License not validated. Please ensure you are connected to the internet.",usageLimitExceeded:"Usage Limit Exceeded",usageLimitExceededMessage:"You have reached your monthly document limit. Please upgrade your plan to continue.",checkingLicense:"Checking license..."},watermark:{poweredBy:"Powered by DocVyu"},errors:{editorNotInitialized:"Editor not initialized. Please call initialize() first.",documentLoadFailed:"Failed to load document",documentSaveFailed:"Failed to save document",featureNotAvailable:"This feature is not available in your current plan. Please upgrade to access it.",documentTooLarge:"Document size exceeds the limit for your plan",networkError:"Network error. Please check your connection.",invalidApiKey:"Invalid API key",licenseFetchFailed:"Failed to fetch license information",wasmLoadFailed:"Failed to load WebAssembly module",canvasNotFound:"Canvas element not found"},accessibility:{editorLabel:"Document Editor",toolbarLabel:"Editor Toolbar",formattingToolbar:"Formatting Toolbar",pageNavigation:"Page Navigation",currentPage:"Page {current}",totalPages:"of {total}"},statusBar:{ready:"Ready",pageOf:"Page {current} of {total}",words:"{count} words",selectLanguage:"Select language"}},es:{general:{loading:"Cargando...",error:"Error",success:"Éxito",cancel:"Cancelar",confirm:"Confirmar",save:"Guardar",close:"Cerrar",retry:"Reintentar",poweredBy:"Desarrollado por"},editor:{title:"Editor DocVyu",untitledDocument:"Documento sin título",loadingEditor:"Cargando editor...",initializingEditor:"Inicializando editor...",documentLoaded:"Documento cargado exitosamente",documentSaved:"Documento guardado exitosamente",noDocumentLoaded:"No hay documento cargado"},toolbar:{file:"Archivo",edit:"Editar",view:"Ver",format:"Formato",help:"Ayuda",newDocument:"Nuevo Documento",openDocument:"Abrir Documento",saveDocument:"Guardar Documento",downloadDocument:"Descargar Documento",undo:"Deshacer",redo:"Rehacer",cut:"Cortar",copy:"Copiar",paste:"Pegar",selectAll:"Seleccionar Todo",home:"Inicio",insert:"Insertar",layout:"Diseño",clipboard:"Portapapeles",font:"Fuente",paragraph:"Párrafo",editing:"Edición",find:"Buscar",replace:"Reemplazar",size:"Tamaño",numberingFormat:"Formato de Numeración"},formatting:{bold:"Negrita",italic:"Cursiva",underline:"Subrayado",strikethrough:"Tachado",fontSize:"Tamaño de Fuente",fontFamily:"Familia de Fuente",fontColor:"Color de Fuente",backgroundColor:"Color de Fondo",alignment:"Alineación",alignLeft:"Alinear a la Izquierda",alignCenter:"Centrar",alignRight:"Alinear a la Derecha",alignJustify:"Justificar",bulletList:"Lista con Viñetas",numberedList:"Lista Numerada",increaseIndent:"Aumentar Sangría",decreaseIndent:"Disminuir Sangría",lineSpacing:"Interlineado",paragraphSpacing:"Espaciado de Párrafo"},pageSettings:{title:"Configuración de Página",pageSize:"Tamaño de Página",margins:"Márgenes",marginTop:"Superior",marginBottom:"Inferior",marginLeft:"Izquierdo",marginRight:"Derecho",orientation:"Orientación",portrait:"Vertical",landscape:"Horizontal",customSize:"Tamaño Personalizado",letter:"Carta",legal:"Legal",a4:"A4",a5:"A5",b5:"B5"},zoom:{zoomIn:"Acercar",zoomOut:"Alejar",zoomLevel:"Nivel de Zoom",fitToPage:"Ajustar a Página",fitToWidth:"Ajustar al Ancho"},ruler:{centimeters:"Centímetros",inches:"Pulgadas",toggleUnit:"Cambiar Unidad"},license:{freeTier:"Gratuito",starterTier:"Inicial",professionalTier:"Profesional",enterpriseTier:"Empresarial",documentsRemaining:"{count} documentos restantes este mes",unlimitedDocuments:"Documentos ilimitados",upgradeNow:"Actualizar Ahora",licenseValid:"La licencia es válida",licenseExpired:"La licencia ha expirado",licenseInvalid:"Licencia inválida",invalidLicense:"Licencia inválida o expirada. Por favor verifica tu clave API.",notValidated:"Licencia no validada. Por favor asegúrate de estar conectado a internet.",usageLimitExceeded:"Límite de Uso Excedido",usageLimitExceededMessage:"Has alcanzado tu límite mensual de documentos. Por favor actualiza tu plan para continuar.",checkingLicense:"Verificando licencia..."},watermark:{poweredBy:"Desarrollado con DocVyu"},errors:{editorNotInitialized:"Editor no inicializado. Por favor llama a initialize() primero.",documentLoadFailed:"Error al cargar el documento",documentSaveFailed:"Error al guardar el documento",featureNotAvailable:"Esta función no está disponible en tu plan actual. Por favor actualiza para acceder.",documentTooLarge:"El tamaño del documento excede el límite de tu plan",networkError:"Error de red. Por favor verifica tu conexión.",invalidApiKey:"Clave API inválida",licenseFetchFailed:"Error al obtener información de la licencia",wasmLoadFailed:"Error al cargar el módulo WebAssembly",canvasNotFound:"Elemento canvas no encontrado"},accessibility:{editorLabel:"Editor de Documentos",toolbarLabel:"Barra de Herramientas del Editor",formattingToolbar:"Barra de Formato",pageNavigation:"Navegación de Páginas",currentPage:"Página {current}",totalPages:"de {total}"},statusBar:{ready:"Listo",pageOf:"Página {current} de {total}",words:"{count} palabras",selectLanguage:"Seleccionar idioma"}},pt:{general:{loading:"Carregando...",error:"Erro",success:"Sucesso",cancel:"Cancelar",confirm:"Confirmar",save:"Salvar",close:"Fechar",retry:"Tentar novamente",poweredBy:"Desenvolvido por"},editor:{title:"Editor DocVyu",untitledDocument:"Documento sem título",loadingEditor:"Carregando editor...",initializingEditor:"Inicializando editor...",documentLoaded:"Documento carregado com sucesso",documentSaved:"Documento salvo com sucesso",noDocumentLoaded:"Nenhum documento carregado"},toolbar:{file:"Arquivo",edit:"Editar",view:"Visualizar",format:"Formatar",help:"Ajuda",newDocument:"Novo Documento",openDocument:"Abrir Documento",saveDocument:"Salvar Documento",downloadDocument:"Baixar Documento",undo:"Desfazer",redo:"Refazer",cut:"Recortar",copy:"Copiar",paste:"Colar",selectAll:"Selecionar Tudo",home:"Início",insert:"Inserir",layout:"Layout",clipboard:"Área de Transferência",font:"Fonte",paragraph:"Parágrafo",editing:"Edição",find:"Localizar",replace:"Substituir",size:"Tamanho",numberingFormat:"Formato de Numeração"},formatting:{bold:"Negrito",italic:"Itálico",underline:"Sublinhado",strikethrough:"Riscado",fontSize:"Tamanho da Fonte",fontFamily:"Família da Fonte",fontColor:"Cor da Fonte",backgroundColor:"Cor de Fundo",alignment:"Alinhamento",alignLeft:"Alinhar à Esquerda",alignCenter:"Centralizar",alignRight:"Alinhar à Direita",alignJustify:"Justificar",bulletList:"Lista com Marcadores",numberedList:"Lista Numerada",increaseIndent:"Aumentar Recuo",decreaseIndent:"Diminuir Recuo",lineSpacing:"Espaçamento entre Linhas",paragraphSpacing:"Espaçamento de Parágrafo"},pageSettings:{title:"Configurações de Página",pageSize:"Tamanho da Página",margins:"Margens",marginTop:"Superior",marginBottom:"Inferior",marginLeft:"Esquerda",marginRight:"Direita",orientation:"Orientação",portrait:"Retrato",landscape:"Paisagem",customSize:"Tamanho Personalizado",letter:"Carta",legal:"Ofício",a4:"A4",a5:"A5",b5:"B5"},zoom:{zoomIn:"Aumentar Zoom",zoomOut:"Diminuir Zoom",zoomLevel:"Nível de Zoom",fitToPage:"Ajustar à Página",fitToWidth:"Ajustar à Largura"},ruler:{centimeters:"Centímetros",inches:"Polegadas",toggleUnit:"Alternar Unidade"},license:{freeTier:"Gratuito",starterTier:"Inicial",professionalTier:"Profissional",enterpriseTier:"Empresarial",documentsRemaining:"{count} documentos restantes este mês",unlimitedDocuments:"Documentos ilimitados",upgradeNow:"Atualizar Agora",licenseValid:"Licença válida",licenseExpired:"Licença expirada",licenseInvalid:"Licença inválida",invalidLicense:"Licença inválida ou expirada. Por favor, verifique sua chave API.",notValidated:"Licença não validada. Por favor, verifique sua conexão com a internet.",usageLimitExceeded:"Limite de Uso Excedido",usageLimitExceededMessage:"Você atingiu seu limite mensal de documentos. Por favor, atualize seu plano para continuar.",checkingLicense:"Verificando licença..."},watermark:{poweredBy:"Desenvolvido com DocVyu"},errors:{editorNotInitialized:"Editor não inicializado. Por favor, chame initialize() primeiro.",documentLoadFailed:"Falha ao carregar o documento",documentSaveFailed:"Falha ao salvar o documento",featureNotAvailable:"Este recurso não está disponível no seu plano atual. Por favor, atualize para acessar.",documentTooLarge:"O tamanho do documento excede o limite do seu plano",networkError:"Erro de rede. Por favor, verifique sua conexão.",invalidApiKey:"Chave API inválida",licenseFetchFailed:"Falha ao obter informações da licença",wasmLoadFailed:"Falha ao carregar o módulo WebAssembly",canvasNotFound:"Elemento canvas não encontrado"},accessibility:{editorLabel:"Editor de Documentos",toolbarLabel:"Barra de Ferramentas do Editor",formattingToolbar:"Barra de Formatação",pageNavigation:"Navegação de Páginas",currentPage:"Página {current}",totalPages:"de {total}"},statusBar:{ready:"Pronto",pageOf:"Página {current} de {total}",words:"{count} palavras",selectLanguage:"Selecionar idioma"}}},n={locale:"en",fallbackLocale:"en",customTranslations:{}};class s{constructor(e={}){this.listeners=new Set,this.config={...n,...e},this.currentTranslations=this.buildTranslations()}static getInstance(e){return s.instance?e&&s.instance.configure(e):s.instance=new s(e),s.instance}static reset(){s.instance=null}configure(e){this.config={...this.config,...e},this.currentTranslations=this.buildTranslations(),this.notifyListeners()}getLocale(){return this.config.locale}setLocale(e){this.config.locale!==e&&(this.config.locale=e,this.currentTranslations=this.buildTranslations(),this.notifyListeners())}getAvailableLocales(){return Object.keys(r)}getTranslations(){return this.currentTranslations}t(e,t){const i=this.getNestedValue(this.currentTranslations,e);if(void 0===i){const i=this.getNestedValue(r[this.config.fallbackLocale],e);return void 0===i?e:this.interpolate(i,t)}return this.interpolate(i,t)}onLocaleChange(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}detectAndSetLocale(){const e=this.detectBrowserLocale();return e?(this.setLocale(e),e):this.config.locale}detectBrowserLocale(){if("undefined"==typeof navigator)return null;const e=navigator.languages||[navigator.language];for(const t of e){const e=t.split("-")[0].toLowerCase();if(this.getAvailableLocales().includes(e))return e}return null}buildTranslations(){const e=r[this.config.locale]||r[this.config.fallbackLocale],t=this.config.customTranslations?.[this.config.locale];return t?this.deepMerge(e,t):e}getNestedValue(e,t){const i=t.split(".");let a=e;for(const e of i){if(null==a)return;a=a[e]}return"string"==typeof a?a:void 0}interpolate(e,t){return t?e.replace(/\{(\w+)\}/g,(e,i)=>{const a=t[i];return void 0!==a?String(a):`{${i}}`}):e}deepMerge(e,t){const i={...e};for(const a in t)if(Object.prototype.hasOwnProperty.call(t,a)){const o=t[a],r=e[a];null===o||"object"!=typeof o||Array.isArray(o)||null===r||"object"!=typeof r||Array.isArray(r)?void 0!==o&&(i[a]=o):i[a]=this.deepMerge(r,o)}return i}notifyListeners(){for(const e of this.listeners)e(this.config.locale)}}function l(e){return s.getInstance(e)}function c(e,t){return s.getInstance().t(e,t)}function d(e){s.getInstance().setLocale(e)}function u(){return s.getInstance().getAvailableLocales()}function h(e){return s.getInstance().onLocaleChange(e)}s.instance=null;class m{constructor(e){this.wasmEditor=null,this.isInitialized=!1,this.licenseValidated=!1,this.cursorBlinkInterval=null,this.cursorVisible=!0,this.localeUnsubscribe=null,this.config=e,this.licenseManager=new o({apiKey:e.apiKey,licenseServerUrl:e.licenseServerUrl,offlineMode:e.offlineMode});const t=l({locale:e.locale||"en",customTranslations:e.customTranslations});if(e.autoDetectLocale&&t.detectAndSetLocale(),e.onLocaleChange&&(this.localeUnsubscribe=t.onLocaleChange(e.onLocaleChange)),"string"==typeof e.canvas){const t=document.getElementById(e.canvas);if(!(t&&t instanceof HTMLCanvasElement))throw new Error(c("errors.canvasNotFound"));this.canvas=t,this.canvasId=e.canvas}else this.canvas=e.canvas,this.canvas.id||(this.canvas.id=`docvyu-canvas-${Date.now()}`),this.canvasId=this.canvas.id}async initialize(e,t){const i=await this.licenseManager.initialize();this.licenseValidated=!0;const a={valid:i.isValid,tier:i.tier,remaining:i.remainingUses,watermark:i.features.showWatermark,error:i.error};if(this.config.onLicenseChange&&this.config.onLicenseChange(a),this.licenseManager.isUsageLimitExceeded())throw this.config.onUsageLimitExceeded&&this.config.onUsageLimitExceeded(),new Error(c("license.usageLimitExceededMessage"));if(!i.isValid)throw new Error(i.error||c("license.invalidLicense"));return await e(),this.wasmEditor=new t(this.canvasId),this.isInitialized=!0,this.config.zoom&&this.wasmEditor.set_zoom(this.config.zoom),"inches"===this.config.rulerUnit&&this.wasmEditor.set_ruler_unit(1),this.startCursorBlink(),a}async loadDocument(e){this.ensureInitialized(),this.ensureFeature("loadDocument");const t=e instanceof ArrayBuffer?new Uint8Array(e):e;if(this.licenseManager.isUsageLimitExceeded())throw this.config.onUsageLimitExceeded&&this.config.onUsageLimitExceeded(),new Error(c("license.usageLimitExceededMessage"));const i=this.licenseManager.getStatus().features.maxDocumentSize;if(i>0&&t.length>i)throw new Error(c("errors.documentTooLarge"));await this.licenseManager.recordUsage(),this.config.onLicenseChange&&this.config.onLicenseChange(this.getLicenseInfo()),this.wasmEditor.load_docx_and_render(t),this.config.onLoad&&this.config.onLoad()}saveDocument(){this.ensureInitialized(),this.ensureFeature("saveDocument");const e=this.wasmEditor.save_document();return this.config.onSave&&this.config.onSave(e),e}downloadDocument(e="document.docx"){const t=this.saveDocument(),i=new Blob([new Uint8Array(t)],{type:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}),a=URL.createObjectURL(i),o=document.createElement("a");o.href=a,o.download=e,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(a)}setBold(e){this.ensureInitialized(),this.ensureFeature("formatting"),this.wasmEditor.set_bold(e),this.notifySelectionChange()}setItalic(e){this.ensureInitialized(),this.ensureFeature("formatting"),this.wasmEditor.set_italic(e),this.notifySelectionChange()}setUnderline(e){this.ensureInitialized(),this.ensureFeature("formatting"),this.wasmEditor.set_underline(e),this.notifySelectionChange()}setFontSize(e){this.ensureInitialized(),this.ensureFeature("formatting"),this.wasmEditor.set_font_size(e),this.notifySelectionChange()}resetFontSize(){this.ensureInitialized(),this.wasmEditor.reset_font_size(),this.notifySelectionChange()}setFontFamily(e){this.ensureInitialized(),this.ensureFeature("formatting"),this.wasmEditor.set_font_family(e),this.notifySelectionChange()}resetFontFamily(){this.ensureInitialized(),this.wasmEditor.reset_font_family(),this.notifySelectionChange()}setFontColor(e){this.ensureInitialized(),this.ensureFeature("formatting"),this.wasmEditor.set_font_color(e),this.notifySelectionChange()}resetFontColor(){this.ensureInitialized(),this.wasmEditor.reset_font_color(),this.notifySelectionChange()}setAlignment(e){this.ensureInitialized(),this.ensureFeature("formatting"),this.wasmEditor.set_paragraph_alignment(e),this.notifySelectionChange()}setBulletList(e){this.ensureInitialized(),this.ensureFeature("lists"),this.wasmEditor.set_bullet_list(e),this.notifySelectionChange()}setNumberedList(e){this.ensureInitialized(),this.ensureFeature("lists"),this.wasmEditor.set_numbered_list(e),this.notifySelectionChange()}setNumberedListFormat(e){this.ensureInitialized(),this.ensureFeature("lists"),this.wasmEditor.set_numbered_list_format(e),this.notifySelectionChange()}removeNumbering(){this.ensureInitialized(),this.wasmEditor.remove_numbering(),this.notifySelectionChange()}setMargins(e){this.ensureInitialized(),this.ensureFeature("pageSettings"),this.wasmEditor.set_page_margins(e.left,e.right,e.top,e.bottom)}setPageSize(e){this.ensureInitialized(),this.ensureFeature("pageSettings"),"custom"!==e&&this.wasmEditor.set_page_size(e)}getPageSize(){return this.ensureInitialized(),this.wasmEditor.get_page_size()}setZoom(e){this.ensureInitialized(),this.ensureFeature("zoom"),this.wasmEditor.set_zoom(e)}getZoom(){return this.ensureInitialized(),this.wasmEditor.get_zoom()}zoomIn(){this.ensureInitialized(),this.ensureFeature("zoom"),this.wasmEditor.zoom_in()}zoomOut(){this.ensureInitialized(),this.ensureFeature("zoom"),this.wasmEditor.zoom_out()}setRulerUnit(e){this.ensureInitialized(),this.wasmEditor.set_ruler_unit("inches"===e?1:0)}getRulerUnit(){return this.ensureInitialized(),1===this.wasmEditor.get_ruler_unit()?"inches":"centimeters"}toggleRulerUnit(){this.ensureInitialized(),this.wasmEditor.toggle_ruler_unit()}selectWord(){this.ensureInitialized(),this.wasmEditor.select_word(),this.notifySelectionChange()}selectParagraph(){this.ensureInitialized(),this.wasmEditor.select_paragraph(),this.notifySelectionChange()}selectAll(){this.ensureInitialized(),this.wasmEditor.select_document(),this.notifySelectionChange()}getSelectionState(){this.ensureInitialized();const e=this.wasmEditor.selection_style_state();return{bold:e.bold_all(),italic:e.italic_all(),underline:e.underline_all(),fontSize:e.font_size(),fontFamily:e.font_family(),fontColor:e.font_color(),alignment:e.paragraph_alignment(),hasBulletList:this.wasmEditor.has_bullet_list(),hasNumberedList:this.wasmEditor.has_numbered_list(),numberingFormatId:this.wasmEditor.get_numbering_format_id()}}handleMouseClick(e,t){this.ensureInitialized(),this.wasmEditor.on_mouse_click(e,t),this.resetCursorBlink(),this.notifySelectionChange()}handleMouseDrag(e,t){this.ensureInitialized(),this.wasmEditor.on_mouse_drag(e,t),this.notifySelectionChange()}handleKeyDown(e){this.ensureInitialized(),this.ensureFeature("editText"),this.wasmEditor.on_key_down(e),this.resetCursorBlink(),this.notifySelectionChange()}getLicenseInfo(){const e=this.licenseManager.getStatus();return{valid:e.isValid,tier:e.tier,remaining:e.remainingUses,watermark:e.features.showWatermark,error:e.error}}shouldShowWatermark(){return this.licenseManager.getStatus().features.showWatermark}getWatermarkText(){return c("watermark.poweredBy")}setLocale(e){d(e)}getLocale(){return s.getInstance().getLocale()}translate(e,t){return c(e,t)}destroy(){this.stopCursorBlink(),this.localeUnsubscribe&&(this.localeUnsubscribe(),this.localeUnsubscribe=null),this.wasmEditor&&(this.wasmEditor.free(),this.wasmEditor=null),this.isInitialized=!1}ensureInitialized(){if(!this.licenseValidated)throw new Error(c("license.notValidated"));if(!this.isInitialized||!this.wasmEditor)throw new Error(c("errors.editorNotInitialized"))}ensureLicenseValid(){if(!this.licenseValidated)throw new Error(c("license.notValidated"));const e=this.licenseManager.getStatus();if(!e.isValid)throw new Error(e.error||c("license.invalidLicense"))}ensureFeature(e){if(!this.licenseManager.hasFeature(e))throw new Error(c("errors.featureNotAvailable"))}notifySelectionChange(){this.config.onSelectionChange&&this.isInitialized&&this.config.onSelectionChange(this.getSelectionState())}startCursorBlink(){this.stopCursorBlink(),this.cursorVisible=!0,this.cursorBlinkInterval=window.setInterval(()=>{this.cursorVisible=!this.cursorVisible,this.wasmEditor&&this.wasmEditor.set_cursor_visible(this.cursorVisible)},530)}stopCursorBlink(){null!==this.cursorBlinkInterval&&(clearInterval(this.cursorBlinkInterval),this.cursorBlinkInterval=null)}resetCursorBlink(){this.cursorVisible=!0,this.wasmEditor&&this.wasmEditor.set_cursor_visible(!0),this.startCursorBlink()}}function g(e){return new m(e)}export{m as D,o as L,g as c,u as g,l as i,h as o,d as s,c as t};
|
package/dist/esm/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{L as n,t,i,c as r,s}from"./DocvyuEditor-DlUB7weZ.js";export{D as DocvyuEditor,d as detectLocale,e as en,f as es,b as getAvailableLocales,g as getI18n,a as getLocale,o as onLocaleChange,p as pt}from"./DocvyuEditor-DlUB7weZ.js";let c=null;async function l(t={}){c=new n(t);const o=await c.initialize();return{valid:o.isValid,tier:o.tier,remaining:o.remainingUses,watermark:o.features.showWatermark,error:o.error}}function u(){return c?.getRemainingUses()??10}function v(n){return`\n \x3c!-- Title Bar --\x3e\n <div class="docvyu-title-bar">\n <div class="docvyu-logo">\n <img src="" alt="DocVyu Logo" class="docvyu-logo-img" />\n <span>DocVyu</span>\n </div>\n <div class="docvyu-title-bar-actions">\n <button class="docvyu-title-btn" data-action="open" title="${t("toolbar.openDocument")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" />\n </svg>\n </button>\n <button class="docvyu-title-btn" data-action="save" title="${t("toolbar.saveDocument")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" />\n <polyline points="17 21 17 13 7 13 7 21" />\n <polyline points="7 3 7 8 15 8" />\n </svg>\n </button>\n </div>\n <div class="docvyu-document-name" data-element="document-name">${t("editor.untitledDocument")}</div>\n <div style="width: 100px;"></div>\n </div>\n\n \x3c!-- Menu Bar --\x3e\n <div class="docvyu-menu-bar">\n <div class="docvyu-menu-item" data-menu="file">${t("toolbar.file")}</div>\n <div class="docvyu-menu-item" data-menu="edit">${t("toolbar.edit")}</div>\n <div class="docvyu-menu-item" data-menu="view">${t("toolbar.view")}</div>\n <div class="docvyu-menu-item" data-menu="insert">${t("toolbar.insert")}</div>\n <div class="docvyu-menu-item" data-menu="format">${t("toolbar.format")}</div>\n </div>\n\n \x3c!-- Ribbon --\x3e\n <div class="docvyu-ribbon">\n <div class="docvyu-ribbon-tabs">\n <button class="docvyu-ribbon-tab active" data-tab="home">${t("toolbar.home")}</button>\n <button class="docvyu-ribbon-tab" data-tab="insert">${t("toolbar.insert")}</button>\n <button class="docvyu-ribbon-tab" data-tab="layout">${t("toolbar.layout")}</button>\n <button class="docvyu-ribbon-tab" data-tab="view">${t("toolbar.view")}</button>\n </div>\n\n \x3c!-- Home Tab --\x3e\n <div class="docvyu-ribbon-content" data-tab-content="home">\n \x3c!-- Clipboard Group --\x3e\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content">\n <button class="docvyu-ribbon-btn" data-action="paste" title="${t("toolbar.paste")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n <path d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2" />\n <rect x="9" y="3" width="6" height="4" rx="1" />\n </svg>\n <span>${t("toolbar.paste")}</span>\n </button>\n <div class="docvyu-ribbon-btn-column">\n <button class="docvyu-ribbon-btn-small" data-action="cut" title="${t("toolbar.cut")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <circle cx="6" cy="6" r="3" />\n <circle cx="6" cy="18" r="3" />\n <line x1="20" y1="4" x2="8.12" y2="15.88" />\n <line x1="14.47" y1="14.48" x2="20" y2="20" />\n <line x1="8.12" y1="8.12" x2="12" y2="12" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="copy" title="${t("toolbar.copy")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <rect x="9" y="9" width="13" height="13" rx="2" />\n <path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1" />\n </svg>\n </button>\n </div>\n </div>\n <div class="docvyu-ribbon-group-label">${t("toolbar.clipboard")}</div>\n </div>\n\n \x3c!-- Font Group --\x3e\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content" style="flex-direction: column; gap: 4px;">\n <div class="docvyu-ribbon-btn-row">\n <select class="docvyu-ribbon-select" data-control="font-family" title="${t("formatting.fontFamily")}">\n <option value="">${t("formatting.fontFamily")}</option>\n <option value="Arial">Arial</option>\n <option value="Times New Roman">Times New Roman</option>\n <option value="Calibri">Calibri</option>\n <option value="Cambria">Cambria</option>\n <option value="Georgia">Georgia</option>\n <option value="Verdana">Verdana</option>\n <option value="Courier New">Courier New</option>\n <option value="Tahoma">Tahoma</option>\n </select>\n <select class="docvyu-ribbon-select docvyu-font-size-select" data-control="font-size" title="${t("formatting.fontSize")}">\n <option value="">--</option>\n <option value="8">8</option>\n <option value="9">9</option>\n <option value="10">10</option>\n <option value="11">11</option>\n <option value="12">12</option>\n <option value="14">14</option>\n <option value="16">16</option>\n <option value="18">18</option>\n <option value="20">20</option>\n <option value="22">22</option>\n <option value="24">24</option>\n <option value="26">26</option>\n <option value="28">28</option>\n <option value="36">36</option>\n <option value="48">48</option>\n <option value="72">72</option>\n </select>\n </div>\n <div class="docvyu-ribbon-btn-row">\n <button class="docvyu-ribbon-btn-small" data-action="bold" title="${t("formatting.bold")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M6 4h8a4 4 0 014 4 4 4 0 01-4 4H6z" />\n <path d="M6 12h9a4 4 0 014 4 4 4 0 01-4 4H6z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="italic" title="${t("formatting.italic")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M10 4h4l-2 16h-4l2-16z" transform="skewX(-12) translate(4, 0)" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="underline" title="${t("formatting.underline")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M6 3v7a6 6 0 006 6 6 6 0 006-6V3" />\n <line x1="4" y1="21" x2="20" y2="21" stroke="currentColor" stroke-width="2" />\n </svg>\n </button>\n <div class="docvyu-color-picker-wrapper">\n <button class="docvyu-ribbon-color-btn" data-action="font-color" title="${t("formatting.fontColor")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M11 2L5.5 16h2.25l1.12-3h6.25l1.12 3h2.25L13 2h-2zm-1.38 9L12 4.67 14.38 11H9.62z" />\n </svg>\n <div class="docvyu-color-indicator" data-element="color-indicator"></div>\n </button>\n <input type="color" class="docvyu-hidden-color-input" data-control="font-color-input" value="#000000" />\n </div>\n </div>\n </div>\n <div class="docvyu-ribbon-group-label">${t("toolbar.font")}</div>\n </div>\n\n \x3c!-- Paragraph Group --\x3e\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content" style="flex-direction: column; gap: 4px;">\n <div class="docvyu-ribbon-btn-row">\n <button class="docvyu-ribbon-btn-small" data-action="align-left" title="${t("formatting.alignLeft")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M3 3h18v2H3zm0 4h12v2H3zm0 4h18v2H3zm0 4h12v2H3zm0 4h18v2H3z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="align-center" title="${t("formatting.alignCenter")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M3 3h18v2H3zm3 4h12v2H6zm-3 4h18v2H3zm3 4h12v2H6zm-3 4h18v2H3z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="align-right" title="${t("formatting.alignRight")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M3 3h18v2H3zm6 4h12v2H9zm-6 4h18v2H3zm6 4h12v2H9zm-6 4h18v2H3z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="align-justify" title="${t("formatting.alignJustify")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M3 3h18v2H3zm0 4h18v2H3zm0 4h18v2H3zm0 4h18v2H3zm0 4h18v2H3z" />\n </svg>\n </button>\n </div>\n <div class="docvyu-ribbon-btn-row">\n <button class="docvyu-ribbon-btn-small" data-action="indent-decrease" title="${t("formatting.decreaseIndent")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M11 3h10v2H11zm0 4h10v2H11zm0 4h10v2H11zm0 4h10v2H11zm0 4h10v2H11z" />\n <path d="M3 12l4-4v8z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="indent-increase" title="${t("formatting.increaseIndent")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M11 3h10v2H11zm0 4h10v2H11zm0 4h10v2H11zm0 4h10v2H11zm0 4h10v2H11z" />\n <path d="M7 12l-4-4v8z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="bullet-list" title="${t("formatting.bulletList")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <circle cx="4" cy="6" r="2" />\n <circle cx="4" cy="12" r="2" />\n <circle cx="4" cy="18" r="2" />\n <path d="M9 5h12v2H9zm0 6h12v2H9zm0 6h12v2H9z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="numbered-list" title="${t("formatting.numberedList")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M2 5h2v1H3v1h1v1H2V6.5L3.5 5H2zm0 6h2.5v1H2v1h2.5v1H2v1h3v-5H2zm0 7h2v1H2v1h2v1H2v1h3v-1H3v-1h2v-1H3v-1h2v-1H2z" />\n <path d="M9 5h12v2H9zm0 6h12v2H9zm0 6h12v2H9z" />\n </svg>\n </button>\n </div>\n </div>\n <div class="docvyu-ribbon-group-label">${t("toolbar.paragraph")}</div>\n </div>\n\n \x3c!-- Editing Group --\x3e\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content">\n <button class="docvyu-ribbon-btn" data-action="find" title="${t("toolbar.find")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <circle cx="11" cy="11" r="8" />\n <path d="M21 21l-4.35-4.35" />\n </svg>\n <span>${t("toolbar.find")}</span>\n </button>\n <button class="docvyu-ribbon-btn" data-action="replace" title="${t("toolbar.replace")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <path d="M17 1l4 4-4 4" />\n <path d="M3 11V9a4 4 0 014-4h14" />\n <path d="M7 23l-4-4 4-4" />\n <path d="M21 13v2a4 4 0 01-4 4H3" />\n </svg>\n <span>${t("toolbar.replace")}</span>\n </button>\n </div>\n <div class="docvyu-ribbon-group-label">${t("toolbar.editing")}</div>\n </div>\n </div>\n\n \x3c!-- Layout Tab --\x3e\n <div class="docvyu-ribbon-content" data-tab-content="layout" style="display: none;">\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content">\n <div style="position: relative;">\n <button class="docvyu-ribbon-btn" data-action="margins" title="${t("pageSettings.margins")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n <rect x="3" y="3" width="18" height="18" rx="1" />\n <rect x="6" y="6" width="12" height="12" rx="0.5" stroke-dasharray="2 2" />\n </svg>\n <span>${t("pageSettings.margins")}</span>\n </button>\n <div class="docvyu-margins-popover" data-popover="margins">\n <h4>${t("pageSettings.margins")} (px)</h4>\n <div class="docvyu-margin-input-group">\n <div class="docvyu-margin-input-item">\n <label>${t("pageSettings.marginTop")}</label>\n <input type="number" data-control="margin-top" value="60" min="0" />\n </div>\n <div class="docvyu-margin-input-item">\n <label>${t("pageSettings.marginBottom")}</label>\n <input type="number" data-control="margin-bottom" value="60" min="0" />\n </div>\n <div class="docvyu-margin-input-item">\n <label>${t("pageSettings.marginLeft")}</label>\n <input type="number" data-control="margin-left" value="60" min="0" />\n </div>\n <div class="docvyu-margin-input-item">\n <label>${t("pageSettings.marginRight")}</label>\n <input type="number" data-control="margin-right" value="60" min="0" />\n </div>\n </div>\n <button class="docvyu-apply-btn" data-action="apply-margins">${t("general.confirm")}</button>\n </div>\n </div>\n <div style="position: relative;">\n <button class="docvyu-ribbon-btn" data-action="page-size" title="${t("toolbar.size")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n <rect x="4" y="2" width="16" height="20" rx="1" />\n <path d="M8 7h8M8 11h8M8 15h5" />\n </svg>\n <span>${t("toolbar.size")}</span>\n </button>\n <div class="docvyu-page-size-popover" data-popover="page-size">\n <h4>${t("pageSettings.pageSize")}</h4>\n <div class="docvyu-page-size-options">\n <button class="docvyu-page-size-option" data-size="letter">\n <span class="docvyu-size-name">${t("pageSettings.letter")}</span>\n <span class="docvyu-size-dims">21.59 × 27.94 cm</span>\n </button>\n <button class="docvyu-page-size-option" data-size="legal">\n <span class="docvyu-size-name">${t("pageSettings.legal")}</span>\n <span class="docvyu-size-dims">21.59 × 35.56 cm</span>\n </button>\n <button class="docvyu-page-size-option" data-size="a4">\n <span class="docvyu-size-name">A4</span>\n <span class="docvyu-size-dims">21 × 29.7 cm</span>\n </button>\n <button class="docvyu-page-size-option" data-size="a5">\n <span class="docvyu-size-name">A5</span>\n <span class="docvyu-size-dims">14.8 × 21 cm</span>\n </button>\n <button class="docvyu-page-size-option" data-size="b5">\n <span class="docvyu-size-name">B5</span>\n <span class="docvyu-size-dims">17.6 × 25 cm</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class="docvyu-ribbon-group-label">${t("pageSettings.title")}</div>\n </div>\n </div>\n </div>\n\n \x3c!-- Document Area --\x3e\n <div class="docvyu-document-area">\n <div class="docvyu-canvas-wrapper">\n <canvas data-element="canvas" width="930" height="1180"></canvas>\n </div>\n </div>\n\n \x3c!-- Status Bar --\x3e\n <div class="docvyu-status-bar">\n <div class="docvyu-status-item" data-element="status">${t("general.loading")}</div>\n <div class="docvyu-status-item" data-element="page-count"></div>\n <div class="docvyu-status-item" data-element="word-count"></div>\n <div class="docvyu-status-spacer"></div>\n <div class="docvyu-license-info" data-element="license-info"></div>\n <div class="docvyu-language-selector">\n <select data-control="language" title="Language">\n <option value="en">🇺🇸 English</option>\n <option value="es">🇪🇸 Español</option>\n <option value="pt">🇧🇷 Português</option>\n </select>\n </div>\n <button class="docvyu-ruler-unit-btn" data-action="toggle-ruler-unit">\n <span data-element="ruler-unit">cm</span>\n </button>\n <div class="docvyu-zoom-controls">\n <button class="docvyu-zoom-btn" data-action="zoom-out" title="Zoom out">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <line x1="5" y1="12" x2="19" y2="12" />\n </svg>\n </button>\n <span data-element="zoom-level">100%</span>\n <button class="docvyu-zoom-btn" data-action="zoom-in" title="Zoom in">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <line x1="12" y1="5" x2="12" y2="19" />\n <line x1="5" y1="12" x2="19" y2="12" />\n </svg>\n </button>\n </div>\n </div>\n\n \x3c!-- Hidden File Input --\x3e\n <input type="file" class="docvyu-hidden-file-input" data-element="file-input" accept=".docx" />\n `}const h="\n/* DocVyu SDK - Complete Editor Styles */\n\n:root {\n --docvyu-ribbon-bg: #f3f3f3;\n --docvyu-ribbon-border: #d1d1d1;\n --docvyu-ribbon-tab-active: #ffffff;\n --docvyu-ribbon-tab-hover: #e5e5e5;\n --docvyu-button-hover: #c7e0f4;\n --docvyu-button-active: #a3d3ff;\n --docvyu-accent-color: #0078d4;\n --docvyu-text-primary: #1a1a1a;\n --docvyu-text-secondary: #616161;\n --docvyu-canvas-bg: #e0e0e0;\n --docvyu-page-shadow: rgba(0, 0, 0, 0.15);\n --docvyu-divider-color: #c8c8c8;\n --docvyu-status-bar-bg: #f0f0f0;\n}\n\n.docvyu-container {\n font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, sans-serif;\n font-size: 12px;\n color: var(--docvyu-text-primary);\n background: var(--docvyu-canvas-bg);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.docvyu-container * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n/* ===== Title Bar ===== */\n.docvyu-title-bar {\n background: var(--docvyu-accent-color);\n color: white;\n height: 32px;\n display: flex;\n align-items: center;\n padding: 0 12px;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.docvyu-logo {\n font-weight: 600;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.docvyu-logo-img {\n width: 20px;\n height: 20px;\n object-fit: contain;\n}\n\n.docvyu-logo svg {\n width: 18px;\n height: 18px;\n}\n\n.docvyu-title-bar-actions {\n display: flex;\n gap: 4px;\n}\n\n.docvyu-title-btn {\n background: transparent;\n border: none;\n color: white;\n width: 28px;\n height: 24px;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.15s;\n}\n\n.docvyu-title-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n.docvyu-title-btn:active {\n background: rgba(255, 255, 255, 0.3);\n}\n\n.docvyu-title-btn svg {\n width: 16px;\n height: 16px;\n}\n\n.docvyu-document-name {\n flex: 1;\n text-align: center;\n font-size: 12px;\n opacity: 0.95;\n}\n\n/* ===== Menu Bar ===== */\n.docvyu-menu-bar {\n background: var(--docvyu-ribbon-bg);\n border-bottom: 1px solid var(--docvyu-ribbon-border);\n height: 28px;\n display: flex;\n align-items: center;\n padding: 0 8px;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.docvyu-menu-item {\n padding: 4px 10px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 12px;\n color: var(--docvyu-text-primary);\n transition: background 0.1s;\n}\n\n.docvyu-menu-item:hover {\n background: var(--docvyu-ribbon-tab-hover);\n}\n\n/* ===== Ribbon ===== */\n.docvyu-ribbon {\n background: var(--docvyu-ribbon-bg);\n border-bottom: 1px solid var(--docvyu-ribbon-border);\n flex-shrink: 0;\n}\n\n.docvyu-ribbon-tabs {\n display: flex;\n border-bottom: 1px solid var(--docvyu-ribbon-border);\n padding: 0 8px;\n}\n\n.docvyu-ribbon-tab {\n padding: 6px 16px;\n font-size: 12px;\n cursor: pointer;\n border: none;\n background: none;\n color: var(--docvyu-text-primary);\n border-bottom: 2px solid transparent;\n transition: all 0.15s;\n}\n\n.docvyu-ribbon-tab:hover {\n background: var(--docvyu-ribbon-tab-hover);\n}\n\n.docvyu-ribbon-tab.active {\n background: var(--docvyu-ribbon-tab-active);\n border-bottom-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-content {\n display: flex;\n padding: 8px 12px;\n gap: 16px;\n background: white;\n min-height: 90px;\n}\n\n/* ===== Ribbon Groups ===== */\n.docvyu-ribbon-group {\n display: flex;\n flex-direction: column;\n border-right: 1px solid var(--docvyu-divider-color);\n padding-right: 16px;\n}\n\n.docvyu-ribbon-group:last-child {\n border-right: none;\n}\n\n.docvyu-ribbon-group-content {\n display: flex;\n gap: 4px;\n flex: 1;\n align-items: flex-start;\n}\n\n.docvyu-ribbon-group-label {\n font-size: 10px;\n color: var(--docvyu-text-secondary);\n text-align: center;\n padding-top: 4px;\n text-transform: capitalize;\n}\n\n/* ===== Ribbon Buttons ===== */\n.docvyu-ribbon-btn {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4px 8px;\n min-width: 44px;\n height: 66px;\n border: 1px solid transparent;\n background: none;\n border-radius: 3px;\n cursor: pointer;\n gap: 4px;\n transition: all 0.1s;\n}\n\n.docvyu-ribbon-btn:hover {\n background: var(--docvyu-button-hover);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-btn.active {\n background: var(--docvyu-button-active);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-btn svg {\n width: 32px;\n height: 32px;\n color: var(--docvyu-text-primary);\n}\n\n.docvyu-ribbon-btn span {\n font-size: 10px;\n color: var(--docvyu-text-primary);\n}\n\n/* Small buttons in a row */\n.docvyu-ribbon-btn-small {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid transparent;\n background: none;\n border-radius: 3px;\n cursor: pointer;\n transition: all 0.1s;\n}\n\n.docvyu-ribbon-btn-small:hover {\n background: var(--docvyu-button-hover);\n border-color: #b3d7f3;\n}\n\n.docvyu-ribbon-btn-small.active {\n background: var(--docvyu-button-active);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-btn-small svg {\n width: 16px;\n height: 16px;\n color: var(--docvyu-text-primary);\n}\n\n/* Button rows */\n.docvyu-ribbon-btn-row {\n display: flex;\n gap: 2px;\n}\n\n.docvyu-ribbon-btn-column {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n/* ===== Dropdowns/Selects ===== */\n.docvyu-ribbon-select {\n height: 26px;\n padding: 0 8px;\n border: 1px solid var(--docvyu-divider-color);\n border-radius: 3px;\n font-size: 12px;\n background: white;\n cursor: pointer;\n min-width: 100px;\n}\n\n.docvyu-ribbon-select:hover {\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-select:focus {\n outline: none;\n border-color: var(--docvyu-accent-color);\n box-shadow: 0 0 0 1px var(--docvyu-accent-color);\n}\n\n.docvyu-font-size-select {\n min-width: 55px;\n}\n\n/* Color picker */\n.docvyu-color-picker-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.docvyu-ribbon-color-btn {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid transparent;\n background: none;\n border-radius: 3px;\n cursor: pointer;\n padding: 2px;\n}\n\n.docvyu-ribbon-color-btn:hover {\n background: var(--docvyu-button-hover);\n border-color: #b3d7f3;\n}\n\n.docvyu-ribbon-color-btn svg {\n width: 14px;\n height: 14px;\n}\n\n.docvyu-color-indicator {\n width: 14px;\n height: 3px;\n background: currentColor;\n margin-top: 1px;\n}\n\n.docvyu-hidden-color-input {\n position: absolute;\n width: 0;\n height: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n/* ===== Document Area ===== */\n.docvyu-document-area {\n flex: 1;\n overflow: auto;\n background: var(--docvyu-canvas-bg);\n display: flex;\n justify-content: center;\n padding: 20px;\n}\n\n.docvyu-canvas-wrapper {\n box-shadow: 0 2px 8px var(--docvyu-page-shadow);\n}\n\n.docvyu-container canvas {\n display: block;\n background: white;\n cursor: text;\n}\n\n/* ===== Status Bar ===== */\n.docvyu-status-bar {\n background: var(--docvyu-status-bar-bg);\n border-top: 1px solid var(--docvyu-ribbon-border);\n height: 24px;\n display: flex;\n align-items: center;\n padding: 0 12px;\n font-size: 11px;\n color: var(--docvyu-text-secondary);\n flex-shrink: 0;\n gap: 20px;\n}\n\n.docvyu-status-item {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.docvyu-status-spacer {\n flex: 1;\n}\n\n.docvyu-zoom-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.docvyu-zoom-btn {\n width: 20px;\n height: 20px;\n border: none;\n background: none;\n cursor: pointer;\n border-radius: 3px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.docvyu-zoom-btn:hover {\n background: var(--docvyu-ribbon-tab-hover);\n}\n\n.docvyu-zoom-btn svg {\n width: 14px;\n height: 14px;\n}\n\n/* ===== Ruler Unit Button ===== */\n.docvyu-ruler-unit-btn {\n padding: 2px 8px;\n border: 1px solid var(--docvyu-divider-color);\n background: var(--docvyu-ribbon-bg);\n cursor: pointer;\n border-radius: 3px;\n font-size: 11px;\n color: var(--docvyu-text-primary);\n margin-right: 12px;\n min-width: 36px;\n text-align: center;\n}\n\n.docvyu-ruler-unit-btn:hover {\n background: var(--docvyu-ribbon-tab-hover);\n border-color: var(--docvyu-accent-color);\n}\n\n/* ===== Language Selector ===== */\n.docvyu-language-selector {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n.docvyu-language-selector select {\n padding: 2px 6px;\n border: 1px solid var(--docvyu-divider-color);\n background: var(--docvyu-ribbon-bg);\n cursor: pointer;\n border-radius: 3px;\n font-size: 11px;\n color: var(--docvyu-text-primary);\n min-width: 100px;\n appearance: none;\n -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23616161' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 4px center;\n padding-right: 20px;\n}\n\n.docvyu-language-selector select:hover {\n background-color: var(--docvyu-ribbon-tab-hover);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-language-selector select:focus {\n outline: none;\n border-color: var(--docvyu-accent-color);\n box-shadow: 0 0 0 2px rgba(0, 120, 212, 0.2);\n}\n\n/* ===== File Actions (hidden input) ===== */\n.docvyu-hidden-file-input {\n display: none;\n}\n\n/* ===== Margins Popover ===== */\n.docvyu-margins-popover {\n display: none;\n position: absolute;\n top: 100%;\n left: 0;\n background: white;\n border: 1px solid var(--docvyu-ribbon-border);\n border-radius: 4px;\n padding: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 200px;\n}\n\n.docvyu-margins-popover.open {\n display: block;\n}\n\n.docvyu-margins-popover h4 {\n font-size: 12px;\n font-weight: 600;\n margin-bottom: 10px;\n color: var(--docvyu-text-primary);\n}\n\n.docvyu-margin-input-group {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.docvyu-margin-input-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.docvyu-margin-input-item label {\n font-size: 10px;\n color: var(--docvyu-text-secondary);\n}\n\n.docvyu-margin-input-item input {\n width: 100%;\n height: 26px;\n padding: 0 8px;\n border: 1px solid var(--docvyu-divider-color);\n border-radius: 3px;\n font-size: 12px;\n}\n\n.docvyu-margin-input-item input:focus {\n outline: none;\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-apply-btn {\n width: 100%;\n padding: 6px 12px;\n background: var(--docvyu-accent-color);\n color: white;\n border: none;\n border-radius: 3px;\n cursor: pointer;\n font-size: 12px;\n}\n\n.docvyu-apply-btn:hover {\n background: #106ebe;\n}\n\n/* ===== Page Size Popover ===== */\n.docvyu-page-size-popover {\n display: none;\n position: absolute;\n top: 100%;\n left: 0;\n background: white;\n border: 1px solid var(--docvyu-ribbon-border);\n border-radius: 4px;\n padding: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 180px;\n}\n\n.docvyu-page-size-popover.open {\n display: block;\n}\n\n.docvyu-page-size-popover h4 {\n font-size: 12px;\n font-weight: 600;\n margin-bottom: 10px;\n color: var(--docvyu-text-primary);\n}\n\n.docvyu-page-size-options {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.docvyu-page-size-option {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 8px 10px;\n border: 1px solid transparent;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n text-align: left;\n width: 100%;\n}\n\n.docvyu-page-size-option:hover {\n background: var(--docvyu-button-hover);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-page-size-option.active {\n background: var(--docvyu-button-active);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-size-name {\n font-size: 12px;\n font-weight: 500;\n color: var(--docvyu-text-primary);\n}\n\n.docvyu-size-dims {\n font-size: 10px;\n color: var(--docvyu-text-secondary);\n margin-top: 2px;\n}\n\n/* ===== Cursor Blink Animation ===== */\n@keyframes docvyu-cursor-blink {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n}\n\n.docvyu-cursor-blink {\n animation: docvyu-cursor-blink 1s step-end infinite;\n}\n\n/* ===== Responsive ===== */\n@media (max-width: 900px) {\n .docvyu-ribbon-group-label {\n display: none;\n }\n\n .docvyu-ribbon-btn {\n min-width: 36px;\n padding: 4px;\n }\n\n .docvyu-ribbon-btn span {\n display: none;\n }\n}\n\n/* ===== License Info ===== */\n.docvyu-license-info {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n margin-right: 12px;\n}\n\n.docvyu-license-tier {\n padding: 2px 8px;\n border-radius: 4px;\n font-weight: 600;\n text-transform: uppercase;\n font-size: 10px;\n}\n\n.docvyu-license-tier.starter {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n}\n\n.docvyu-license-tier.professional {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n}\n\n.docvyu-license-tier.enterprise {\n background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);\n color: white;\n}\n\n.docvyu-remaining {\n color: var(--docvyu-text-secondary);\n}\n\n.docvyu-watermark-notice {\n color: #e67700;\n font-size: 10px;\n}\n";function y(){const n="docvyu-editor-styles";if(document.getElementById(n))return;const t=document.createElement("style");t.id=n,t.textContent=h,document.head.appendChild(t)}class m{constructor(n){if(this.editor=null,this.currentFileName="",this.licenseInfo=null,this.elements={canvas:null,status:null,documentName:null,licenseInfoDiv:null,languageSelect:null,fontFamilySelect:null,fontSizeSelect:null,fontColorInput:null,colorIndicator:null,fileInput:null,zoomLevel:null,rulerUnit:null,pageCount:null,wordCount:null,marginsPopover:null,pageSizePopover:null},this.isMouseDown=!1,this.multiClickCount=0,this.multiClickResetId=null,this.MULTI_CLICK_RESET_MS=350,this.config={locale:"en",appTitle:"DocVyu",...n},"string"==typeof n.container){const t=document.querySelector(n.container);if(!t)throw new Error(`Container not found: ${n.container}`);this.container=t}else this.container=n.container;this.currentFileName=t("editor.untitledDocument")}async init(n,o){if(y(),i({locale:this.config.locale}),this.licenseInfo=await l({apiKey:this.config.licenseKey}),this.container.innerHTML="",this.container.classList.add("docvyu-container"),this.container.innerHTML=v(),this.cacheElements(),this.config.logoUrl){const n=this.container.querySelector(".docvyu-logo-img");n&&(n.src=this.config.logoUrl)}if(this.config.appTitle){const n=this.container.querySelector(".docvyu-logo span");n&&(n.textContent=this.config.appTitle)}this.editor=r({canvas:this.elements.canvas,locale:this.config.locale,onSelectionChange:n=>{this.syncToolbarState(),this.config.onSelectionChange?.(n)},onLicenseChange:n=>{this.licenseInfo=n,this.updateLicenseDisplay(n),this.config.onLicenseChange?.(n)}});const e=await this.editor.initialize(n,o);this.updateLicenseDisplay(e),this.attachEventListeners(),this.updateUITranslations(),this.elements.status&&(this.elements.status.textContent=t("statusBar.ready"))}cacheElements(){const n=n=>this.container.querySelector(n);this.elements={canvas:n('[data-element="canvas"]'),status:n('[data-element="status"]'),documentName:n('[data-element="document-name"]'),licenseInfoDiv:n('[data-element="license-info"]'),languageSelect:n('[data-control="language"]'),fontFamilySelect:n('[data-control="font-family"]'),fontSizeSelect:n('[data-control="font-size"]'),fontColorInput:n('[data-control="font-color-input"]'),colorIndicator:n('[data-element="color-indicator"]'),fileInput:n('[data-element="file-input"]'),zoomLevel:n('[data-element="zoom-level"]'),rulerUnit:n('[data-element="ruler-unit"]'),pageCount:n('[data-element="page-count"]'),wordCount:n('[data-element="word-count"]'),marginsPopover:n('[data-popover="margins"]'),pageSizePopover:n('[data-popover="page-size"]')}}attachEventListeners(){const n=this.elements.canvas;n&&(n.addEventListener("mousedown",this.handleMouseDown.bind(this)),n.addEventListener("mousemove",this.handleMouseMove.bind(this)),window.addEventListener("mouseup",this.handleMouseUp.bind(this)),window.addEventListener("keydown",this.handleKeyDown.bind(this)),this.container.querySelectorAll(".docvyu-ribbon-tab").forEach(n=>{n.addEventListener("click",()=>this.handleTabClick(n))}),this.container.querySelectorAll("[data-action]").forEach(n=>{n.addEventListener("click",t=>this.handleAction(n,t))}),this.container.querySelectorAll("[data-control]").forEach(n=>{n.addEventListener("change",()=>this.handleControlChange(n)),n.addEventListener("input",()=>this.handleControlInput(n))}),this.elements.fileInput&&this.elements.fileInput.addEventListener("change",()=>this.handleFileSelect()),document.addEventListener("click",n=>this.handleDocumentClick(n)))}handleMouseDown(n){if(0!==n.button||!this.editor||!this.elements.canvas)return;const t=this.registerClick(),o=this.elements.canvas.getBoundingClientRect(),i=n.clientX-o.left,e=n.clientY-o.top;this.editor.handleMouseClick(i,e),this.isMouseDown=!0,2===t?this.editor.selectWord():3===t?this.editor.selectParagraph():t>=4&&(this.editor.selectAll(),this.resetMultiClick()),this.syncToolbarState()}handleMouseMove(n){if(!this.isMouseDown||!this.editor||!this.elements.canvas)return;const t=this.elements.canvas.getBoundingClientRect(),o=n.clientX-t.left,i=n.clientY-t.top;this.editor.handleMouseDrag(o,i),this.syncToolbarState()}handleMouseUp(){this.isMouseDown=!1,this.syncToolbarState()}handleKeyDown(n){if(!this.editor)return;if(n.ctrlKey||n.metaKey)switch(n.key.toLowerCase()){case"b":return n.preventDefault(),void this.toggleStyle("bold");case"i":return n.preventDefault(),void this.toggleStyle("italic");case"u":return n.preventDefault(),void this.toggleStyle("underline");case"s":return n.preventDefault(),void this.saveDocument();case"o":return n.preventDefault(),void this.elements.fileInput?.click()}const t=new Set(["Backspace","Delete","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown"]);(1===n.key.length||t.has(n.key))&&(n.preventDefault(),this.editor.handleKeyDown(n.key),this.syncToolbarState())}handleTabClick(n){const t=n.dataset.tab;this.container.querySelectorAll(".docvyu-ribbon-tab").forEach(t=>{t.classList.toggle("active",t===n)}),this.container.querySelectorAll(".docvyu-ribbon-content").forEach(n=>{const o=n.dataset.tabContent;n.style.display=o===t?"flex":"none"})}handleAction(n,t){if(!this.editor)return;const o=n.dataset.action;if(o)try{switch(o){case"open":this.elements.fileInput?.click();break;case"save":this.saveDocument();break;case"cut":document.execCommand("cut");break;case"copy":document.execCommand("copy");break;case"paste":document.execCommand("paste");break;case"bold":this.toggleStyle("bold");break;case"italic":this.toggleStyle("italic");break;case"underline":this.toggleStyle("underline");break;case"font-color":this.elements.fontColorInput?.click();break;case"align-left":this.editor.setAlignment("left"),this.syncToolbarState();break;case"align-center":this.editor.setAlignment("center"),this.syncToolbarState();break;case"align-right":this.editor.setAlignment("right"),this.syncToolbarState();break;case"align-justify":this.editor.setAlignment("justify"),this.syncToolbarState();break;case"indent-decrease":case"indent-increase":case"find":case"replace":break;case"bullet-list":const n=this.editor.getSelectionState().hasBulletList;this.editor.setBulletList(!n),this.syncToolbarState();break;case"numbered-list":const o=this.editor.getSelectionState().hasNumberedList;this.editor.setNumberedList(!o),this.syncToolbarState();break;case"margins":t.stopPropagation(),this.togglePopover("margins");break;case"apply-margins":this.applyMargins();break;case"page-size":t.stopPropagation(),this.togglePopover("page-size");break;case"zoom-in":this.editor.zoomIn(),this.updateZoomLevel();break;case"zoom-out":this.editor.zoomOut(),this.updateZoomLevel();break;case"toggle-ruler-unit":this.editor.toggleRulerUnit(),this.updateRulerUnit()}}catch(n){}}handleControlChange(n){if(!this.editor)return;const t=n.dataset.control;if(t)try{switch(t){case"font-family":const t=n.value;t?this.editor.setFontFamily(t):this.editor.resetFontFamily(),this.syncToolbarState();break;case"font-size":const o=n.value;if(o){const n=parseFloat(o);isNaN(n)||this.editor.setFontSize(n)}else this.editor.resetFontSize();this.syncToolbarState();break;case"language":const i=n.value;s(i),this.updateUITranslations()}}catch(n){}}handleControlInput(n){if(!this.editor)return;const t=n.dataset.control;if(t)try{if("font-color-input"===t){const t=n.value;t&&(this.editor.setFontColor(t),this.elements.colorIndicator&&(this.elements.colorIndicator.style.backgroundColor=t)),this.syncToolbarState()}}catch(n){}}handlePageSizeClick(n){if(this.editor)try{this.editor.setPageSize(n),this.updatePageSizeSelection(),this.closeAllPopovers()}catch(n){}}handleDocumentClick(n){const t=n.target;this.elements.marginsPopover?.classList.contains("open")&&(this.elements.marginsPopover.contains(t)||t.closest('[data-action="margins"]')||this.elements.marginsPopover.classList.remove("open")),this.elements.pageSizePopover?.classList.contains("open")&&(this.elements.pageSizePopover.contains(t)||t.closest('[data-action="page-size"]')||this.elements.pageSizePopover.classList.remove("open"))}async handleFileSelect(){if(!this.editor||!this.elements.fileInput)return;const n=this.elements.fileInput.files?.[0];if(n){this.elements.status&&(this.elements.status.textContent=t("general.loading"));try{const o=await n.arrayBuffer(),i=new Uint8Array(o);await this.editor.loadDocument(i),this.currentFileName=n.name.replace(/\.docx$/i,"")||t("editor.untitledDocument"),this.elements.documentName&&(this.elements.documentName.textContent=this.currentFileName),this.elements.status&&(this.elements.status.textContent=t("statusBar.ready")),this.syncToolbarState()}catch(n){this.elements.status&&(this.elements.status.textContent=`${t("general.error")}: ${n}`)}}}toggleStyle(n){if(this.editor)try{const t=this.editor.getSelectionState();switch(n){case"bold":this.editor.setBold(!t.bold);break;case"italic":this.editor.setItalic(!t.italic);break;case"underline":this.editor.setUnderline(!t.underline)}this.syncToolbarState()}catch(n){}}togglePopover(n){this.closeAllPopovers();const t="margins"===n?this.elements.marginsPopover:this.elements.pageSizePopover;t?.classList.toggle("open"),"page-size"===n&&this.updatePageSizeSelection()}closeAllPopovers(){this.elements.marginsPopover?.classList.remove("open"),this.elements.pageSizePopover?.classList.remove("open")}applyMargins(){if(!this.editor)return;const n=(n,t)=>{const o=this.container.querySelector(n),i=parseFloat(o?.value||"");return isFinite(i)?i:t};try{this.editor.setMargins({top:n('[data-control="margin-top"]',60),bottom:n('[data-control="margin-bottom"]',60),left:n('[data-control="margin-left"]',60),right:n('[data-control="margin-right"]',60)}),this.closeAllPopovers()}catch(n){}}updatePageSizeSelection(){if(!this.editor)return;const n=this.editor.getPageSize();this.container.querySelectorAll(".docvyu-page-size-option").forEach(t=>{const o=t.dataset.size;t.classList.toggle("active",o===n)})}syncToolbarState(){if(this.editor)try{const n=this.editor.getSelectionState();if(this.setButtonActive('[data-action="bold"]',n.bold),this.setButtonActive('[data-action="italic"]',n.italic),this.setButtonActive('[data-action="underline"]',n.underline),this.elements.fontSizeSelect&&void 0!==n.fontSize&&!isNaN(n.fontSize)){const t=Math.round(n.fontSize),o=Array.from(this.elements.fontSizeSelect.options).find(n=>n.value===t.toString());this.elements.fontSizeSelect.value=o?o.value:""}if(this.elements.fontFamilySelect&&n.fontFamily){const t=Array.from(this.elements.fontFamilySelect.options).find(t=>t.value.toLowerCase()===n.fontFamily.toLowerCase());this.elements.fontFamilySelect.value=t?t.value:""}this.elements.fontColorInput&&n.fontColor&&(this.elements.fontColorInput.value=n.fontColor,this.elements.colorIndicator&&(this.elements.colorIndicator.style.backgroundColor=n.fontColor)),["left","center","right","justify"].forEach(t=>{this.setButtonActive(`[data-action="align-${t}"]`,n.alignment===t)}),this.setButtonActive('[data-action="bullet-list"]',n.hasBulletList),this.setButtonActive('[data-action="numbered-list"]',n.hasNumberedList)}catch(n){}}setButtonActive(n,t){const o=this.container.querySelector(n);o&&o.classList.toggle("active",t)}updateZoomLevel(){if(!this.editor||!this.elements.zoomLevel)return;const n=this.editor.getZoom();this.elements.zoomLevel.textContent=`${Math.round(100*n)}%`}updateRulerUnit(){if(!this.editor||!this.elements.rulerUnit)return;const n=this.editor.getRulerUnit();this.elements.rulerUnit.textContent="centimeters"===n?"cm":"in"}updateLicenseDisplay(n){if(!this.elements.licenseInfoDiv)return;const o={free:t("license.freeTier"),starter:t("license.starterTier"),professional:t("license.professionalTier"),enterprise:t("license.enterpriseTier")}[n.tier]||n.tier,i=n.remaining!==1/0?t("license.documentsRemaining",{count:String(n.remaining)}):"",e=n.watermark?t("watermark.poweredBy"):"";this.elements.licenseInfoDiv.innerHTML=`\n <span class="docvyu-license-tier ${n.tier}">${o}</span>\n ${i?`<span class="docvyu-remaining">${i}</span>`:""}\n ${e?`<span class="docvyu-watermark-notice">${e}</span>`:""}\n `}updateUITranslations(){if(this.elements.documentName){const n=this.elements.documentName.textContent?.trim();["Sin título","Untitled Document","Documento sem título"].includes(n||"")&&(this.elements.documentName.textContent=t("editor.untitledDocument"))}if(this.elements.status){const n=this.elements.status.textContent?.trim();["Listo","Ready","Pronto","Cargando..."].includes(n||"")&&(this.elements.status.textContent=t("statusBar.ready"))}const n={file:t("toolbar.file"),edit:t("toolbar.edit"),view:t("toolbar.view"),insert:t("toolbar.insert"),format:t("toolbar.format")};this.container.querySelectorAll(".docvyu-menu-item").forEach(t=>{const o=t.dataset.menu;o&&n[o]&&(t.textContent=n[o])});const o={home:t("toolbar.home"),insert:t("toolbar.insert"),layout:t("toolbar.layout"),view:t("toolbar.view")};this.container.querySelectorAll(".docvyu-ribbon-tab").forEach(n=>{const t=n.dataset.tab;t&&o[t]&&(n.textContent=o[t])}),this.licenseInfo&&this.updateLicenseDisplay(this.licenseInfo)}registerClick(){return this.multiClickCount+=1,this.scheduleMultiClickReset(),this.multiClickCount}scheduleMultiClickReset(){null!==this.multiClickResetId&&window.clearTimeout(this.multiClickResetId),this.multiClickResetId=window.setTimeout(()=>{this.multiClickCount=0,this.multiClickResetId=null},this.MULTI_CLICK_RESET_MS)}resetMultiClick(){this.multiClickCount=0,null!==this.multiClickResetId&&(window.clearTimeout(this.multiClickResetId),this.multiClickResetId=null)}async loadDocument(n){if(!this.editor)throw new Error("Editor not initialized");await this.editor.loadDocument(n),this.syncToolbarState()}saveDocument(n){if(!this.editor)throw new Error("Editor not initialized");const o=n||`${this.currentFileName}-edited.docx`;this.editor.downloadDocument(o),this.elements.status&&(this.elements.status.textContent=t("general.success"),setTimeout(()=>{this.elements.status&&(this.elements.status.textContent=t("statusBar.ready"))},2e3))}getEditor(){return this.editor}getLicenseInfo(){return this.licenseInfo}setLocale(n){this.config.locale=n,s(n),this.updateUITranslations(),this.elements.languageSelect&&(this.elements.languageSelect.value=n)}destroy(){window.removeEventListener("mouseup",this.handleMouseUp.bind(this)),window.removeEventListener("keydown",this.handleKeyDown.bind(this)),null!==this.multiClickResetId&&window.clearTimeout(this.multiClickResetId),this.container.innerHTML="",this.container.classList.remove("docvyu-container"),this.editor=null}}const x="1.0.0";export{m as DocvyuApp,x as VERSION,r as createEditor,m as default,h as editorStyles,v as generateEditorTemplate,u as getRemainingUses,i as initI18n,l as initLicense,y as injectStyles,s as setLocale,t};
|
|
1
|
+
import{L as n,t,i as o,c as e,s as i}from"./DocvyuEditor-CCAFPhSl.js";let a=null;class r{constructor(n){if(this.editor=null,this.currentFileName="",this.licenseInfo=null,this.elements={canvas:null,status:null,documentName:null,licenseInfoDiv:null,languageSelect:null,fontFamilySelect:null,fontSizeSelect:null,fontColorInput:null,colorIndicator:null,fileInput:null,zoomLevel:null,rulerUnit:null,pageCount:null,wordCount:null,marginsPopover:null,pageSizePopover:null},this.isMouseDown=!1,this.multiClickCount=0,this.multiClickResetId=null,this.MULTI_CLICK_RESET_MS=350,this.config={locale:"en",appTitle:"DocVyu",...n},"string"==typeof n.container){const t=document.querySelector(n.container);if(!t)throw new Error(`Container not found: ${n.container}`);this.container=t}else this.container=n.container;this.currentFileName=t("editor.untitledDocument")}async init(i,r){if(function(){const n="docvyu-editor-styles";if(document.getElementById(n))return;const t=document.createElement("style");t.id=n,t.textContent="\n/* DocVyu SDK - Complete Editor Styles */\n\n:root {\n --docvyu-ribbon-bg: #f3f3f3;\n --docvyu-ribbon-border: #d1d1d1;\n --docvyu-ribbon-tab-active: #ffffff;\n --docvyu-ribbon-tab-hover: #e5e5e5;\n --docvyu-button-hover: #c7e0f4;\n --docvyu-button-active: #a3d3ff;\n --docvyu-accent-color: #0078d4;\n --docvyu-text-primary: #1a1a1a;\n --docvyu-text-secondary: #616161;\n --docvyu-canvas-bg: #e0e0e0;\n --docvyu-page-shadow: rgba(0, 0, 0, 0.15);\n --docvyu-divider-color: #c8c8c8;\n --docvyu-status-bar-bg: #f0f0f0;\n}\n\n.docvyu-container {\n font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, sans-serif;\n font-size: 12px;\n color: var(--docvyu-text-primary);\n background: var(--docvyu-canvas-bg);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.docvyu-container * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n/* ===== Title Bar ===== */\n.docvyu-title-bar {\n background: var(--docvyu-accent-color);\n color: white;\n height: 32px;\n display: flex;\n align-items: center;\n padding: 0 12px;\n gap: 12px;\n flex-shrink: 0;\n}\n\n.docvyu-logo {\n font-weight: 600;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.docvyu-logo-img {\n width: 20px;\n height: 20px;\n object-fit: contain;\n}\n\n.docvyu-logo svg {\n width: 18px;\n height: 18px;\n}\n\n.docvyu-title-bar-actions {\n display: flex;\n gap: 4px;\n}\n\n.docvyu-title-btn {\n background: transparent;\n border: none;\n color: white;\n width: 28px;\n height: 24px;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.15s;\n}\n\n.docvyu-title-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n.docvyu-title-btn:active {\n background: rgba(255, 255, 255, 0.3);\n}\n\n.docvyu-title-btn svg {\n width: 16px;\n height: 16px;\n}\n\n.docvyu-document-name {\n flex: 1;\n text-align: center;\n font-size: 12px;\n opacity: 0.95;\n}\n\n/* ===== Menu Bar ===== */\n.docvyu-menu-bar {\n background: var(--docvyu-ribbon-bg);\n border-bottom: 1px solid var(--docvyu-ribbon-border);\n height: 28px;\n display: flex;\n align-items: center;\n padding: 0 8px;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.docvyu-menu-item {\n padding: 4px 10px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 12px;\n color: var(--docvyu-text-primary);\n transition: background 0.1s;\n}\n\n.docvyu-menu-item:hover {\n background: var(--docvyu-ribbon-tab-hover);\n}\n\n/* ===== Ribbon ===== */\n.docvyu-ribbon {\n background: var(--docvyu-ribbon-bg);\n border-bottom: 1px solid var(--docvyu-ribbon-border);\n flex-shrink: 0;\n}\n\n.docvyu-ribbon-tabs {\n display: flex;\n border-bottom: 1px solid var(--docvyu-ribbon-border);\n padding: 0 8px;\n}\n\n.docvyu-ribbon-tab {\n padding: 6px 16px;\n font-size: 12px;\n cursor: pointer;\n border: none;\n background: none;\n color: var(--docvyu-text-primary);\n border-bottom: 2px solid transparent;\n transition: all 0.15s;\n}\n\n.docvyu-ribbon-tab:hover {\n background: var(--docvyu-ribbon-tab-hover);\n}\n\n.docvyu-ribbon-tab.active {\n background: var(--docvyu-ribbon-tab-active);\n border-bottom-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-content {\n display: flex;\n padding: 8px 12px;\n gap: 16px;\n background: white;\n min-height: 90px;\n}\n\n/* ===== Ribbon Groups ===== */\n.docvyu-ribbon-group {\n display: flex;\n flex-direction: column;\n border-right: 1px solid var(--docvyu-divider-color);\n padding-right: 16px;\n}\n\n.docvyu-ribbon-group:last-child {\n border-right: none;\n}\n\n.docvyu-ribbon-group-content {\n display: flex;\n gap: 4px;\n flex: 1;\n align-items: flex-start;\n}\n\n.docvyu-ribbon-group-label {\n font-size: 10px;\n color: var(--docvyu-text-secondary);\n text-align: center;\n padding-top: 4px;\n text-transform: capitalize;\n}\n\n/* ===== Ribbon Buttons ===== */\n.docvyu-ribbon-btn {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4px 8px;\n min-width: 44px;\n height: 66px;\n border: 1px solid transparent;\n background: none;\n border-radius: 3px;\n cursor: pointer;\n gap: 4px;\n transition: all 0.1s;\n}\n\n.docvyu-ribbon-btn:hover {\n background: var(--docvyu-button-hover);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-btn.active {\n background: var(--docvyu-button-active);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-btn svg {\n width: 32px;\n height: 32px;\n color: var(--docvyu-text-primary);\n}\n\n.docvyu-ribbon-btn span {\n font-size: 10px;\n color: var(--docvyu-text-primary);\n}\n\n/* Small buttons in a row */\n.docvyu-ribbon-btn-small {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid transparent;\n background: none;\n border-radius: 3px;\n cursor: pointer;\n transition: all 0.1s;\n}\n\n.docvyu-ribbon-btn-small:hover {\n background: var(--docvyu-button-hover);\n border-color: #b3d7f3;\n}\n\n.docvyu-ribbon-btn-small.active {\n background: var(--docvyu-button-active);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-btn-small svg {\n width: 16px;\n height: 16px;\n color: var(--docvyu-text-primary);\n}\n\n/* Button rows */\n.docvyu-ribbon-btn-row {\n display: flex;\n gap: 2px;\n}\n\n.docvyu-ribbon-btn-column {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n/* ===== Dropdowns/Selects ===== */\n.docvyu-ribbon-select {\n height: 26px;\n padding: 0 8px;\n border: 1px solid var(--docvyu-divider-color);\n border-radius: 3px;\n font-size: 12px;\n background: white;\n cursor: pointer;\n min-width: 100px;\n}\n\n.docvyu-ribbon-select:hover {\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-ribbon-select:focus {\n outline: none;\n border-color: var(--docvyu-accent-color);\n box-shadow: 0 0 0 1px var(--docvyu-accent-color);\n}\n\n.docvyu-font-size-select {\n min-width: 55px;\n}\n\n/* Color picker */\n.docvyu-color-picker-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.docvyu-ribbon-color-btn {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid transparent;\n background: none;\n border-radius: 3px;\n cursor: pointer;\n padding: 2px;\n}\n\n.docvyu-ribbon-color-btn:hover {\n background: var(--docvyu-button-hover);\n border-color: #b3d7f3;\n}\n\n.docvyu-ribbon-color-btn svg {\n width: 14px;\n height: 14px;\n}\n\n.docvyu-color-indicator {\n width: 14px;\n height: 3px;\n background: currentColor;\n margin-top: 1px;\n}\n\n.docvyu-hidden-color-input {\n position: absolute;\n width: 0;\n height: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n/* ===== Document Area ===== */\n.docvyu-document-area {\n flex: 1;\n overflow: auto;\n background: var(--docvyu-canvas-bg);\n display: flex;\n justify-content: center;\n padding: 20px;\n}\n\n.docvyu-canvas-wrapper {\n box-shadow: 0 2px 8px var(--docvyu-page-shadow);\n}\n\n.docvyu-container canvas {\n display: block;\n background: white;\n cursor: text;\n}\n\n/* ===== Status Bar ===== */\n.docvyu-status-bar {\n background: var(--docvyu-status-bar-bg);\n border-top: 1px solid var(--docvyu-ribbon-border);\n height: 24px;\n display: flex;\n align-items: center;\n padding: 0 12px;\n font-size: 11px;\n color: var(--docvyu-text-secondary);\n flex-shrink: 0;\n gap: 20px;\n}\n\n.docvyu-status-item {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.docvyu-status-spacer {\n flex: 1;\n}\n\n/* ===== Branding ===== */\n.docvyu-branding {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 12px;\n color: var(--docvyu-text-secondary);\n font-size: 10px;\n border-left: 1px solid var(--docvyu-divider-color);\n margin-right: 8px;\n}\n\n.docvyu-branding-logo {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n\n.docvyu-branding strong {\n color: var(--docvyu-accent-color);\n font-weight: 600;\n}\n\n.docvyu-zoom-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.docvyu-zoom-btn {\n width: 20px;\n height: 20px;\n border: none;\n background: none;\n cursor: pointer;\n border-radius: 3px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.docvyu-zoom-btn:hover {\n background: var(--docvyu-ribbon-tab-hover);\n}\n\n.docvyu-zoom-btn svg {\n width: 14px;\n height: 14px;\n}\n\n/* ===== Ruler Unit Button ===== */\n.docvyu-ruler-unit-btn {\n padding: 2px 8px;\n border: 1px solid var(--docvyu-divider-color);\n background: var(--docvyu-ribbon-bg);\n cursor: pointer;\n border-radius: 3px;\n font-size: 11px;\n color: var(--docvyu-text-primary);\n margin-right: 12px;\n min-width: 36px;\n text-align: center;\n}\n\n.docvyu-ruler-unit-btn:hover {\n background: var(--docvyu-ribbon-tab-hover);\n border-color: var(--docvyu-accent-color);\n}\n\n/* ===== Language Selector ===== */\n.docvyu-language-selector {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n.docvyu-language-selector select {\n padding: 2px 6px;\n border: 1px solid var(--docvyu-divider-color);\n background: var(--docvyu-ribbon-bg);\n cursor: pointer;\n border-radius: 3px;\n font-size: 11px;\n color: var(--docvyu-text-primary);\n min-width: 100px;\n appearance: none;\n -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23616161' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 4px center;\n padding-right: 20px;\n}\n\n.docvyu-language-selector select:hover {\n background-color: var(--docvyu-ribbon-tab-hover);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-language-selector select:focus {\n outline: none;\n border-color: var(--docvyu-accent-color);\n box-shadow: 0 0 0 2px rgba(0, 120, 212, 0.2);\n}\n\n/* ===== File Actions (hidden input) ===== */\n.docvyu-hidden-file-input {\n display: none;\n}\n\n/* ===== Margins Popover ===== */\n.docvyu-margins-popover {\n display: none;\n position: absolute;\n top: 100%;\n left: 0;\n background: white;\n border: 1px solid var(--docvyu-ribbon-border);\n border-radius: 4px;\n padding: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 200px;\n}\n\n.docvyu-margins-popover.open {\n display: block;\n}\n\n.docvyu-margins-popover h4 {\n font-size: 12px;\n font-weight: 600;\n margin-bottom: 10px;\n color: var(--docvyu-text-primary);\n}\n\n.docvyu-margin-input-group {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.docvyu-margin-input-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.docvyu-margin-input-item label {\n font-size: 10px;\n color: var(--docvyu-text-secondary);\n}\n\n.docvyu-margin-input-item input {\n width: 100%;\n height: 26px;\n padding: 0 8px;\n border: 1px solid var(--docvyu-divider-color);\n border-radius: 3px;\n font-size: 12px;\n}\n\n.docvyu-margin-input-item input:focus {\n outline: none;\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-apply-btn {\n width: 100%;\n padding: 6px 12px;\n background: var(--docvyu-accent-color);\n color: white;\n border: none;\n border-radius: 3px;\n cursor: pointer;\n font-size: 12px;\n}\n\n.docvyu-apply-btn:hover {\n background: #106ebe;\n}\n\n/* ===== Page Size Popover ===== */\n.docvyu-page-size-popover {\n display: none;\n position: absolute;\n top: 100%;\n left: 0;\n background: white;\n border: 1px solid var(--docvyu-ribbon-border);\n border-radius: 4px;\n padding: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 180px;\n}\n\n.docvyu-page-size-popover.open {\n display: block;\n}\n\n.docvyu-page-size-popover h4 {\n font-size: 12px;\n font-weight: 600;\n margin-bottom: 10px;\n color: var(--docvyu-text-primary);\n}\n\n.docvyu-page-size-options {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.docvyu-page-size-option {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 8px 10px;\n border: 1px solid transparent;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n text-align: left;\n width: 100%;\n}\n\n.docvyu-page-size-option:hover {\n background: var(--docvyu-button-hover);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-page-size-option.active {\n background: var(--docvyu-button-active);\n border-color: var(--docvyu-accent-color);\n}\n\n.docvyu-size-name {\n font-size: 12px;\n font-weight: 500;\n color: var(--docvyu-text-primary);\n}\n\n.docvyu-size-dims {\n font-size: 10px;\n color: var(--docvyu-text-secondary);\n margin-top: 2px;\n}\n\n/* ===== Numbering Dropdown ===== */\n.docvyu-dropdown-wrapper {\n position: relative;\n display: flex;\n align-items: stretch;\n}\n\n.docvyu-dropdown-arrow {\n width: 14px;\n height: 100%;\n padding: 0;\n border: none;\n background: transparent;\n color: var(--docvyu-text-secondary);\n cursor: pointer;\n font-size: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 0 3px 3px 0;\n margin-left: -1px;\n}\n\n.docvyu-dropdown-arrow:hover {\n background: var(--docvyu-button-hover);\n}\n\n.docvyu-numbering-popover {\n display: none;\n position: absolute;\n top: 100%;\n left: 0;\n background: white;\n border: 1px solid var(--docvyu-ribbon-border);\n border-radius: 4px;\n padding: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 120px;\n}\n\n.docvyu-numbering-popover.open {\n display: block;\n}\n\n.docvyu-numbering-option {\n padding: 6px 10px;\n font-size: 12px;\n cursor: pointer;\n border-radius: 3px;\n color: var(--docvyu-text-primary);\n white-space: nowrap;\n}\n\n.docvyu-numbering-option:hover {\n background: var(--docvyu-button-hover);\n}\n\n.docvyu-numbering-option.active {\n background: var(--docvyu-button-active);\n}\n\n/* ===== Cursor Blink Animation ===== */\n@keyframes docvyu-cursor-blink {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n}\n\n.docvyu-cursor-blink {\n animation: docvyu-cursor-blink 1s step-end infinite;\n}\n\n/* ===== Responsive ===== */\n@media (max-width: 900px) {\n .docvyu-ribbon-group-label {\n display: none;\n }\n\n .docvyu-ribbon-btn {\n min-width: 36px;\n padding: 4px;\n }\n\n .docvyu-ribbon-btn span {\n display: none;\n }\n}\n\n/* ===== License Info ===== */\n.docvyu-license-info {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n margin-right: 12px;\n}\n\n.docvyu-license-tier {\n padding: 2px 8px;\n border-radius: 4px;\n font-weight: 600;\n text-transform: uppercase;\n font-size: 10px;\n}\n\n.docvyu-license-tier.starter {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n}\n\n.docvyu-license-tier.professional {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n}\n\n.docvyu-license-tier.enterprise {\n background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);\n color: white;\n}\n\n.docvyu-remaining {\n color: var(--docvyu-text-secondary);\n}\n\n.docvyu-watermark-notice {\n color: #e67700;\n font-size: 10px;\n}\n",document.head.appendChild(t)}(),o({locale:this.config.locale}),this.licenseInfo=await async function(t={}){a=new n(t);const o=await a.initialize();return{valid:o.isValid,tier:o.tier,remaining:o.remainingUses,watermark:o.features.showWatermark,error:o.error}}({apiKey:this.config.licenseKey}),this.container.innerHTML="",this.container.classList.add("docvyu-container"),this.container.innerHTML=`\n \x3c!-- Title Bar --\x3e\n <div class="docvyu-title-bar">\n <div class="docvyu-logo">\n <img src="" alt="DocVyu Logo" class="docvyu-logo-img" />\n <span>DocVyu</span>\n </div>\n <div class="docvyu-title-bar-actions">\n <button class="docvyu-title-btn" data-action="open" title="${t("toolbar.openDocument")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" />\n </svg>\n </button>\n <button class="docvyu-title-btn" data-action="save" title="${t("toolbar.saveDocument")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" />\n <polyline points="17 21 17 13 7 13 7 21" />\n <polyline points="7 3 7 8 15 8" />\n </svg>\n </button>\n </div>\n <div class="docvyu-document-name" data-element="document-name">${t("editor.untitledDocument")}</div>\n <div style="width: 100px;"></div>\n </div>\n\n \x3c!-- Menu Bar --\x3e\n <div class="docvyu-menu-bar">\n <div class="docvyu-menu-item" data-menu="file">${t("toolbar.file")}</div>\n <div class="docvyu-menu-item" data-menu="edit">${t("toolbar.edit")}</div>\n <div class="docvyu-menu-item" data-menu="view">${t("toolbar.view")}</div>\n <div class="docvyu-menu-item" data-menu="insert">${t("toolbar.insert")}</div>\n <div class="docvyu-menu-item" data-menu="format">${t("toolbar.format")}</div>\n </div>\n\n \x3c!-- Ribbon --\x3e\n <div class="docvyu-ribbon">\n <div class="docvyu-ribbon-tabs">\n <button class="docvyu-ribbon-tab active" data-tab="home">${t("toolbar.home")}</button>\n <button class="docvyu-ribbon-tab" data-tab="insert">${t("toolbar.insert")}</button>\n <button class="docvyu-ribbon-tab" data-tab="layout">${t("toolbar.layout")}</button>\n <button class="docvyu-ribbon-tab" data-tab="view">${t("toolbar.view")}</button>\n </div>\n\n \x3c!-- Home Tab --\x3e\n <div class="docvyu-ribbon-content" data-tab-content="home">\n \x3c!-- Clipboard Group --\x3e\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content">\n <button class="docvyu-ribbon-btn" data-action="paste" title="${t("toolbar.paste")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n <path d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2" />\n <rect x="9" y="3" width="6" height="4" rx="1" />\n </svg>\n <span>${t("toolbar.paste")}</span>\n </button>\n <div class="docvyu-ribbon-btn-column">\n <button class="docvyu-ribbon-btn-small" data-action="cut" title="${t("toolbar.cut")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <circle cx="6" cy="6" r="3" />\n <circle cx="6" cy="18" r="3" />\n <line x1="20" y1="4" x2="8.12" y2="15.88" />\n <line x1="14.47" y1="14.48" x2="20" y2="20" />\n <line x1="8.12" y1="8.12" x2="12" y2="12" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="copy" title="${t("toolbar.copy")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <rect x="9" y="9" width="13" height="13" rx="2" />\n <path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1" />\n </svg>\n </button>\n </div>\n </div>\n <div class="docvyu-ribbon-group-label">${t("toolbar.clipboard")}</div>\n </div>\n\n \x3c!-- Font Group --\x3e\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content" style="flex-direction: column; gap: 4px;">\n <div class="docvyu-ribbon-btn-row">\n <select class="docvyu-ribbon-select" data-control="font-family" title="${t("formatting.fontFamily")}">\n <option value="">${t("formatting.fontFamily")}</option>\n <option value="Arial">Arial</option>\n <option value="Times New Roman">Times New Roman</option>\n <option value="Calibri">Calibri</option>\n <option value="Cambria">Cambria</option>\n <option value="Georgia">Georgia</option>\n <option value="Verdana">Verdana</option>\n <option value="Courier New">Courier New</option>\n <option value="Tahoma">Tahoma</option>\n </select>\n <select class="docvyu-ribbon-select docvyu-font-size-select" data-control="font-size" title="${t("formatting.fontSize")}">\n <option value="">--</option>\n <option value="8">8</option>\n <option value="9">9</option>\n <option value="10">10</option>\n <option value="11">11</option>\n <option value="12">12</option>\n <option value="14">14</option>\n <option value="16">16</option>\n <option value="18">18</option>\n <option value="20">20</option>\n <option value="22">22</option>\n <option value="24">24</option>\n <option value="26">26</option>\n <option value="28">28</option>\n <option value="36">36</option>\n <option value="48">48</option>\n <option value="72">72</option>\n </select>\n </div>\n <div class="docvyu-ribbon-btn-row">\n <button class="docvyu-ribbon-btn-small" data-action="bold" title="${t("formatting.bold")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M6 4h8a4 4 0 014 4 4 4 0 01-4 4H6z" />\n <path d="M6 12h9a4 4 0 014 4 4 4 0 01-4 4H6z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="italic" title="${t("formatting.italic")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M10 4h4l-2 16h-4l2-16z" transform="skewX(-12) translate(4, 0)" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="underline" title="${t("formatting.underline")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M6 3v7a6 6 0 006 6 6 6 0 006-6V3" />\n <line x1="4" y1="21" x2="20" y2="21" stroke="currentColor" stroke-width="2" />\n </svg>\n </button>\n <div class="docvyu-color-picker-wrapper">\n <button class="docvyu-ribbon-color-btn" data-action="font-color" title="${t("formatting.fontColor")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M11 2L5.5 16h2.25l1.12-3h6.25l1.12 3h2.25L13 2h-2zm-1.38 9L12 4.67 14.38 11H9.62z" />\n </svg>\n <div class="docvyu-color-indicator" data-element="color-indicator"></div>\n </button>\n <input type="color" class="docvyu-hidden-color-input" data-control="font-color-input" value="#000000" />\n </div>\n </div>\n </div>\n <div class="docvyu-ribbon-group-label">${t("toolbar.font")}</div>\n </div>\n\n \x3c!-- Paragraph Group --\x3e\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content" style="flex-direction: column; gap: 4px;">\n <div class="docvyu-ribbon-btn-row">\n <button class="docvyu-ribbon-btn-small" data-action="align-left" title="${t("formatting.alignLeft")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M3 3h18v2H3zm0 4h12v2H3zm0 4h18v2H3zm0 4h12v2H3zm0 4h18v2H3z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="align-center" title="${t("formatting.alignCenter")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M3 3h18v2H3zm3 4h12v2H6zm-3 4h18v2H3zm3 4h12v2H6zm-3 4h18v2H3z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="align-right" title="${t("formatting.alignRight")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M3 3h18v2H3zm6 4h12v2H9zm-6 4h18v2H3zm6 4h12v2H9zm-6 4h18v2H3z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="align-justify" title="${t("formatting.alignJustify")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M3 3h18v2H3zm0 4h18v2H3zm0 4h18v2H3zm0 4h18v2H3zm0 4h18v2H3z" />\n </svg>\n </button>\n </div>\n <div class="docvyu-ribbon-btn-row">\n <button class="docvyu-ribbon-btn-small" data-action="indent-decrease" title="${t("formatting.decreaseIndent")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M11 3h10v2H11zm0 4h10v2H11zm0 4h10v2H11zm0 4h10v2H11zm0 4h10v2H11z" />\n <path d="M3 12l4-4v8z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="indent-increase" title="${t("formatting.increaseIndent")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M11 3h10v2H11zm0 4h10v2H11zm0 4h10v2H11zm0 4h10v2H11zm0 4h10v2H11z" />\n <path d="M7 12l-4-4v8z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="bullet-list" title="${t("formatting.bulletList")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <circle cx="4" cy="6" r="2" />\n <circle cx="4" cy="12" r="2" />\n <circle cx="4" cy="18" r="2" />\n <path d="M9 5h12v2H9zm0 6h12v2H9zm0 6h12v2H9z" />\n </svg>\n </button>\n <button class="docvyu-ribbon-btn-small" data-action="numbered-list" title="${t("formatting.numberedList")}">\n <svg viewBox="0 0 24 24" fill="currentColor">\n <path d="M2 5h2v1H3v1h1v1H2V6.5L3.5 5H2zm0 6h2.5v1H2v1h2.5v1H2v1h3v-5H2zm0 7h2v1H2v1h2v1H2v1h3v-1H3v-1h2v-1H3v-1h2v-1H2z" />\n <path d="M9 5h12v2H9zm0 6h12v2H9zm0 6h12v2H9z" />\n </svg>\n </button>\n </div>\n </div>\n <div class="docvyu-ribbon-group-label">${t("toolbar.paragraph")}</div>\n </div>\n\n \x3c!-- Editing Group --\x3e\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content">\n <button class="docvyu-ribbon-btn" data-action="find" title="${t("toolbar.find")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <circle cx="11" cy="11" r="8" />\n <path d="M21 21l-4.35-4.35" />\n </svg>\n <span>${t("toolbar.find")}</span>\n </button>\n <button class="docvyu-ribbon-btn" data-action="replace" title="${t("toolbar.replace")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <path d="M17 1l4 4-4 4" />\n <path d="M3 11V9a4 4 0 014-4h14" />\n <path d="M7 23l-4-4 4-4" />\n <path d="M21 13v2a4 4 0 01-4 4H3" />\n </svg>\n <span>${t("toolbar.replace")}</span>\n </button>\n </div>\n <div class="docvyu-ribbon-group-label">${t("toolbar.editing")}</div>\n </div>\n </div>\n\n \x3c!-- Layout Tab --\x3e\n <div class="docvyu-ribbon-content" data-tab-content="layout" style="display: none;">\n <div class="docvyu-ribbon-group">\n <div class="docvyu-ribbon-group-content">\n <div style="position: relative;">\n <button class="docvyu-ribbon-btn" data-action="margins" title="${t("pageSettings.margins")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n <rect x="3" y="3" width="18" height="18" rx="1" />\n <rect x="6" y="6" width="12" height="12" rx="0.5" stroke-dasharray="2 2" />\n </svg>\n <span>${t("pageSettings.margins")}</span>\n </button>\n <div class="docvyu-margins-popover" data-popover="margins">\n <h4>${t("pageSettings.margins")} (px)</h4>\n <div class="docvyu-margin-input-group">\n <div class="docvyu-margin-input-item">\n <label>${t("pageSettings.marginTop")}</label>\n <input type="number" data-control="margin-top" value="60" min="0" />\n </div>\n <div class="docvyu-margin-input-item">\n <label>${t("pageSettings.marginBottom")}</label>\n <input type="number" data-control="margin-bottom" value="60" min="0" />\n </div>\n <div class="docvyu-margin-input-item">\n <label>${t("pageSettings.marginLeft")}</label>\n <input type="number" data-control="margin-left" value="60" min="0" />\n </div>\n <div class="docvyu-margin-input-item">\n <label>${t("pageSettings.marginRight")}</label>\n <input type="number" data-control="margin-right" value="60" min="0" />\n </div>\n </div>\n <button class="docvyu-apply-btn" data-action="apply-margins">${t("general.confirm")}</button>\n </div>\n </div>\n <div style="position: relative;">\n <button class="docvyu-ribbon-btn" data-action="page-size" title="${t("toolbar.size")}">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n <rect x="4" y="2" width="16" height="20" rx="1" />\n <path d="M8 7h8M8 11h8M8 15h5" />\n </svg>\n <span>${t("toolbar.size")}</span>\n </button>\n <div class="docvyu-page-size-popover" data-popover="page-size">\n <h4>${t("pageSettings.pageSize")}</h4>\n <div class="docvyu-page-size-options">\n <button class="docvyu-page-size-option" data-size="letter">\n <span class="docvyu-size-name">${t("pageSettings.letter")}</span>\n <span class="docvyu-size-dims">21.59 × 27.94 cm</span>\n </button>\n <button class="docvyu-page-size-option" data-size="legal">\n <span class="docvyu-size-name">${t("pageSettings.legal")}</span>\n <span class="docvyu-size-dims">21.59 × 35.56 cm</span>\n </button>\n <button class="docvyu-page-size-option" data-size="a4">\n <span class="docvyu-size-name">A4</span>\n <span class="docvyu-size-dims">21 × 29.7 cm</span>\n </button>\n <button class="docvyu-page-size-option" data-size="a5">\n <span class="docvyu-size-name">A5</span>\n <span class="docvyu-size-dims">14.8 × 21 cm</span>\n </button>\n <button class="docvyu-page-size-option" data-size="b5">\n <span class="docvyu-size-name">B5</span>\n <span class="docvyu-size-dims">17.6 × 25 cm</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class="docvyu-ribbon-group-label">${t("pageSettings.title")}</div>\n </div>\n </div>\n </div>\n\n \x3c!-- Document Area --\x3e\n <div class="docvyu-document-area">\n <div class="docvyu-canvas-wrapper">\n <canvas data-element="canvas" width="930" height="1180"></canvas>\n </div>\n </div>\n\n \x3c!-- Status Bar --\x3e\n <div class="docvyu-status-bar">\n <div class="docvyu-status-item" data-element="status">${t("general.loading")}</div>\n <div class="docvyu-status-item" data-element="page-count"></div>\n <div class="docvyu-status-item" data-element="word-count"></div>\n <div class="docvyu-status-spacer"></div>\n <div class="docvyu-license-info" data-element="license-info"></div>\n <div class="docvyu-language-selector">\n <select data-control="language" title="Language">\n <option value="en">🇺🇸 English</option>\n <option value="es">🇪🇸 Español</option>\n <option value="pt">🇧🇷 Português</option>\n </select>\n </div>\n <button class="docvyu-ruler-unit-btn" data-action="toggle-ruler-unit">\n <span data-element="ruler-unit">cm</span>\n </button>\n <div class="docvyu-branding">\n <svg\n class="docvyu-branding-logo"\n width="256"\n height="256"\n viewBox="0 0 128 128"\n xmlns="http://www.w3.org/2000/svg"\n role="img"\n aria-label="Minimalist purple documents icon inside a refined gradient hexagon outline with cut-out text lines"\n >\n <defs>\n \x3c!-- Sombra suave con tinte púrpura --\x3e\n <filter id="softShadow" x="-20%" y="-20%" width="140%" height="140%">\n <feDropShadow\n dx="0"\n dy="3"\n stdDeviation="5"\n flood-color="#4c1d95"\n flood-opacity="0.28"\n />\n </filter>\n\n \x3c!-- Gradiente para el borde del hexágono (púrpura sofisticado) --\x3e\n <linearGradient id="hexStrokeGradient" x1="0" y1="0" x2="1" y2="1">\n <stop offset="0%" stop-color="#fdf4ff" />\n <stop offset="40%" stop-color="#c4b5fd" />\n <stop offset="100%" stop-color="#7c3aed" />\n </linearGradient>\n\n \x3c!-- Gradiente para los documentos (púrpura suave) --\x3e\n <linearGradient id="docPurpleGradient" x1="0" y1="0" x2="0" y2="1">\n <stop offset="0%" stop-color="#c4b5fd" />\n <stop offset="100%" stop-color="#7c3aed" />\n </linearGradient>\n\n \x3c!-- MÁSCARA: recortes de líneas en el documento posterior --\x3e\n <mask id="backDocMask" maskUnits="userSpaceOnUse">\n \x3c!-- Documento completo visible --\x3e\n <rect\n x="47.5"\n y="47"\n width="32"\n height="40"\n rx="3.5"\n ry="3.5"\n fill="white"\n />\n \x3c!-- Líneas recortadas (transparentes), alineadas con la hoja frontal --\x3e\n <rect x="58.5" y="53" width="16" height="2" fill="black" />\n <rect x="58.5" y="59" width="14" height="2" fill="black" />\n <rect x="58.5" y="65" width="18" height="2" fill="black" />\n </mask>\n\n \x3c!-- MÁSCARA: recortes de líneas en el documento frontal --\x3e\n <mask id="frontDocMask" maskUnits="userSpaceOnUse">\n \x3c!-- Documento frontal con esquina doblada (área visible) --\x3e\n <path\n d="M52.5 45\n A4 4 0 0 1 56.5 41\n H72.5\n L80.5 49\n V77\n A4 4 0 0 1 76.5 81\n H56.5\n A4 4 0 0 1 52.5 77\n Z"\n fill="white"\n />\n \x3c!-- Esquina doblada incluida en el área visible --\x3e\n <path\n d="M72.5 41\n V49\n H80.5\n Z"\n fill="white"\n />\n \x3c!-- Líneas de texto recortadas (transparentes) --\x3e\n <rect x="58.5" y="53" width="16" height="2" fill="black" />\n <rect x="58.5" y="59" width="14" height="2" fill="black" />\n <rect x="58.5" y="65" width="18" height="2" fill="black" />\n </mask>\n </defs>\n\n \x3c!-- Fondo transparente --\x3e\n <rect x="0" y="0" width="128" height="128" fill="none" />\n\n \x3c!-- Hexágono SOLO con borde (interior transparente) --\x3e\n <g filter="url(#softShadow)">\n <path\n d="M24 64\n L44 29.36\n L84 29.36\n L104 64\n L84 98.64\n L44 98.64\n Z"\n fill="none"\n stroke="url(#hexStrokeGradient)"\n stroke-width="3"\n stroke-linejoin="round"\n />\n </g>\n\n \x3c!-- Documento posterior morado con líneas recortadas --\x3e\n <rect\n x="47.5"\n y="47"\n width="32"\n height="40"\n rx="3.5"\n ry="3.5"\n fill="url(#docPurpleGradient)"\n mask="url(#backDocMask)"\n />\n\n \x3c!-- Documento frontal morado con esquina doblada y líneas recortadas --\x3e\n <g mask="url(#frontDocMask)">\n \x3c!-- Cuerpo del documento --\x3e\n <path\n d="M52.5 45\n A4 4 0 0 1 56.5 41\n H72.5\n L80.5 49\n V77\n A4 4 0 0 1 76.5 81\n H56.5\n A4 4 0 0 1 52.5 77\n Z"\n fill="url(#docPurpleGradient)"\n />\n \x3c!-- Esquina doblada en un púrpura muy claro --\x3e\n <path\n d="M72.5 41\n V49\n H80.5\n Z"\n fill="#f5f3ff"\n />\n </g>\n </svg>\n\n // <img class="docvyu-branding-logo" src="data:image/png;base64,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" alt="Docvyu" />\n <span>${t("general.poweredBy")} <strong>Docvyu</strong></span>\n </div>\n <div class="docvyu-zoom-controls">\n <button class="docvyu-zoom-btn" data-action="zoom-out" title="Zoom out">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <line x1="5" y1="12" x2="19" y2="12" />\n </svg>\n </button>\n <span data-element="zoom-level">100%</span>\n <button class="docvyu-zoom-btn" data-action="zoom-in" title="Zoom in">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n <line x1="12" y1="5" x2="12" y2="19" />\n <line x1="5" y1="12" x2="19" y2="12" />\n </svg>\n </button>\n </div>\n </div>\n\n \x3c!-- Hidden File Input --\x3e\n <input type="file" class="docvyu-hidden-file-input" data-element="file-input" accept=".docx" />\n `,this.cacheElements(),this.config.logoUrl){const n=this.container.querySelector(".docvyu-logo-img");n&&(n.src=this.config.logoUrl)}if(this.config.appTitle){const n=this.container.querySelector(".docvyu-logo span");n&&(n.textContent=this.config.appTitle)}this.editor=e({canvas:this.elements.canvas,locale:this.config.locale,onSelectionChange:n=>{this.syncToolbarState(),this.config.onSelectionChange?.(n)},onLicenseChange:n=>{this.licenseInfo=n,this.updateLicenseDisplay(n),this.config.onLicenseChange?.(n)}});const s=await this.editor.initialize(i,r);this.updateLicenseDisplay(s),this.attachEventListeners(),this.updateUITranslations(),this.elements.status&&(this.elements.status.textContent=t("statusBar.ready"))}cacheElements(){const n=n=>this.container.querySelector(n);this.elements={canvas:n('[data-element="canvas"]'),status:n('[data-element="status"]'),documentName:n('[data-element="document-name"]'),licenseInfoDiv:n('[data-element="license-info"]'),languageSelect:n('[data-control="language"]'),fontFamilySelect:n('[data-control="font-family"]'),fontSizeSelect:n('[data-control="font-size"]'),fontColorInput:n('[data-control="font-color-input"]'),colorIndicator:n('[data-element="color-indicator"]'),fileInput:n('[data-element="file-input"]'),zoomLevel:n('[data-element="zoom-level"]'),rulerUnit:n('[data-element="ruler-unit"]'),pageCount:n('[data-element="page-count"]'),wordCount:n('[data-element="word-count"]'),marginsPopover:n('[data-popover="margins"]'),pageSizePopover:n('[data-popover="page-size"]')}}attachEventListeners(){const n=this.elements.canvas;n&&(n.addEventListener("mousedown",this.handleMouseDown.bind(this)),n.addEventListener("mousemove",this.handleMouseMove.bind(this)),window.addEventListener("mouseup",this.handleMouseUp.bind(this)),window.addEventListener("keydown",this.handleKeyDown.bind(this)),this.container.querySelectorAll(".docvyu-ribbon-tab").forEach(n=>{n.addEventListener("click",()=>this.handleTabClick(n))}),this.container.querySelectorAll("[data-action]").forEach(n=>{n.addEventListener("click",t=>this.handleAction(n,t))}),this.container.querySelectorAll("[data-control]").forEach(n=>{n.addEventListener("change",()=>this.handleControlChange(n)),n.addEventListener("input",()=>this.handleControlInput(n))}),this.elements.fileInput&&this.elements.fileInput.addEventListener("change",()=>this.handleFileSelect()),document.addEventListener("click",n=>this.handleDocumentClick(n)))}handleMouseDown(n){if(0!==n.button||!this.editor||!this.elements.canvas)return;const t=this.registerClick(),o=this.elements.canvas.getBoundingClientRect(),e=n.clientX-o.left,i=n.clientY-o.top;this.editor.handleMouseClick(e,i),this.isMouseDown=!0,2===t?this.editor.selectWord():3===t?this.editor.selectParagraph():t>=4&&(this.editor.selectAll(),this.resetMultiClick()),this.syncToolbarState()}handleMouseMove(n){if(!this.isMouseDown||!this.editor||!this.elements.canvas)return;const t=this.elements.canvas.getBoundingClientRect(),o=n.clientX-t.left,e=n.clientY-t.top;this.editor.handleMouseDrag(o,e),this.syncToolbarState()}handleMouseUp(){this.isMouseDown=!1,this.syncToolbarState()}handleKeyDown(n){if(!this.editor)return;if(n.ctrlKey||n.metaKey)switch(n.key.toLowerCase()){case"b":return n.preventDefault(),void this.toggleStyle("bold");case"i":return n.preventDefault(),void this.toggleStyle("italic");case"u":return n.preventDefault(),void this.toggleStyle("underline");case"s":return n.preventDefault(),void this.saveDocument();case"o":return n.preventDefault(),void this.elements.fileInput?.click()}const t=new Set(["Backspace","Delete","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown"]);(1===n.key.length||t.has(n.key))&&(n.preventDefault(),this.editor.handleKeyDown(n.key),this.syncToolbarState())}handleTabClick(n){const t=n.dataset.tab;this.container.querySelectorAll(".docvyu-ribbon-tab").forEach(t=>{t.classList.toggle("active",t===n)}),this.container.querySelectorAll(".docvyu-ribbon-content").forEach(n=>{const o=n.dataset.tabContent;n.style.display=o===t?"flex":"none"})}handleAction(n,t){if(!this.editor)return;const o=n.dataset.action;if(o)try{switch(o){case"open":this.elements.fileInput?.click();break;case"save":this.saveDocument();break;case"cut":document.execCommand("cut");break;case"copy":document.execCommand("copy");break;case"paste":document.execCommand("paste");break;case"bold":this.toggleStyle("bold");break;case"italic":this.toggleStyle("italic");break;case"underline":this.toggleStyle("underline");break;case"font-color":this.elements.fontColorInput?.click();break;case"align-left":this.editor.setAlignment("left"),this.syncToolbarState();break;case"align-center":this.editor.setAlignment("center"),this.syncToolbarState();break;case"align-right":this.editor.setAlignment("right"),this.syncToolbarState();break;case"align-justify":this.editor.setAlignment("justify"),this.syncToolbarState();break;case"indent-decrease":case"indent-increase":case"find":case"replace":break;case"bullet-list":const n=this.editor.getSelectionState().hasBulletList;this.editor.setBulletList(!n),this.syncToolbarState();break;case"numbered-list":const o=this.editor.getSelectionState().hasNumberedList;this.editor.setNumberedList(!o),this.syncToolbarState();break;case"margins":t.stopPropagation(),this.togglePopover("margins");break;case"apply-margins":this.applyMargins();break;case"page-size":t.stopPropagation(),this.togglePopover("page-size");break;case"zoom-in":this.editor.zoomIn(),this.updateZoomLevel();break;case"zoom-out":this.editor.zoomOut(),this.updateZoomLevel();break;case"toggle-ruler-unit":this.editor.toggleRulerUnit(),this.updateRulerUnit()}}catch(n){}}handleControlChange(n){if(!this.editor)return;const t=n.dataset.control;if(t)try{switch(t){case"font-family":const t=n.value;t?this.editor.setFontFamily(t):this.editor.resetFontFamily(),this.syncToolbarState();break;case"font-size":const o=n.value;if(o){const n=parseFloat(o);isNaN(n)||this.editor.setFontSize(n)}else this.editor.resetFontSize();this.syncToolbarState();break;case"language":const e=n.value;i(e),this.updateUITranslations()}}catch(n){}}handleControlInput(n){if(!this.editor)return;const t=n.dataset.control;if(t)try{if("font-color-input"===t){const t=n.value;t&&(this.editor.setFontColor(t),this.elements.colorIndicator&&(this.elements.colorIndicator.style.backgroundColor=t)),this.syncToolbarState()}}catch(n){}}handlePageSizeClick(n){if(this.editor)try{this.editor.setPageSize(n),this.updatePageSizeSelection(),this.closeAllPopovers()}catch(n){}}handleDocumentClick(n){const t=n.target;this.elements.marginsPopover?.classList.contains("open")&&(this.elements.marginsPopover.contains(t)||t.closest('[data-action="margins"]')||this.elements.marginsPopover.classList.remove("open")),this.elements.pageSizePopover?.classList.contains("open")&&(this.elements.pageSizePopover.contains(t)||t.closest('[data-action="page-size"]')||this.elements.pageSizePopover.classList.remove("open"))}async handleFileSelect(){if(!this.editor||!this.elements.fileInput)return;const n=this.elements.fileInput.files?.[0];if(n){this.elements.status&&(this.elements.status.textContent=t("general.loading"));try{const o=await n.arrayBuffer(),e=new Uint8Array(o);await this.editor.loadDocument(e),this.currentFileName=n.name.replace(/\.docx$/i,"")||t("editor.untitledDocument"),this.elements.documentName&&(this.elements.documentName.textContent=this.currentFileName),this.elements.status&&(this.elements.status.textContent=t("statusBar.ready")),this.syncToolbarState()}catch(n){this.elements.status&&(this.elements.status.textContent=`${t("general.error")}: ${n}`)}}}toggleStyle(n){if(this.editor)try{const t=this.editor.getSelectionState();switch(n){case"bold":this.editor.setBold(!t.bold);break;case"italic":this.editor.setItalic(!t.italic);break;case"underline":this.editor.setUnderline(!t.underline)}this.syncToolbarState()}catch(n){}}togglePopover(n){this.closeAllPopovers();const t="margins"===n?this.elements.marginsPopover:this.elements.pageSizePopover;t?.classList.toggle("open"),"page-size"===n&&this.updatePageSizeSelection()}closeAllPopovers(){this.elements.marginsPopover?.classList.remove("open"),this.elements.pageSizePopover?.classList.remove("open")}applyMargins(){if(!this.editor)return;const n=(n,t)=>{const o=this.container.querySelector(n),e=parseFloat(o?.value||"");return isFinite(e)?e:t};try{this.editor.setMargins({top:n('[data-control="margin-top"]',60),bottom:n('[data-control="margin-bottom"]',60),left:n('[data-control="margin-left"]',60),right:n('[data-control="margin-right"]',60)}),this.closeAllPopovers()}catch(n){}}updatePageSizeSelection(){if(!this.editor)return;const n=this.editor.getPageSize();this.container.querySelectorAll(".docvyu-page-size-option").forEach(t=>{const o=t.dataset.size;t.classList.toggle("active",o===n)})}syncToolbarState(){if(this.editor)try{const n=this.editor.getSelectionState();if(this.setButtonActive('[data-action="bold"]',n.bold),this.setButtonActive('[data-action="italic"]',n.italic),this.setButtonActive('[data-action="underline"]',n.underline),this.elements.fontSizeSelect&&void 0!==n.fontSize&&!isNaN(n.fontSize)){const t=Math.round(n.fontSize),o=Array.from(this.elements.fontSizeSelect.options).find(n=>n.value===t.toString());this.elements.fontSizeSelect.value=o?o.value:""}if(this.elements.fontFamilySelect&&n.fontFamily){const t=Array.from(this.elements.fontFamilySelect.options).find(t=>t.value.toLowerCase()===n.fontFamily.toLowerCase());this.elements.fontFamilySelect.value=t?t.value:""}this.elements.fontColorInput&&n.fontColor&&(this.elements.fontColorInput.value=n.fontColor,this.elements.colorIndicator&&(this.elements.colorIndicator.style.backgroundColor=n.fontColor)),["left","center","right","justify"].forEach(t=>{this.setButtonActive(`[data-action="align-${t}"]`,n.alignment===t)}),this.setButtonActive('[data-action="bullet-list"]',n.hasBulletList),this.setButtonActive('[data-action="numbered-list"]',n.hasNumberedList)}catch(n){}}setButtonActive(n,t){const o=this.container.querySelector(n);o&&o.classList.toggle("active",t)}updateZoomLevel(){if(!this.editor||!this.elements.zoomLevel)return;const n=this.editor.getZoom();this.elements.zoomLevel.textContent=`${Math.round(100*n)}%`}updateRulerUnit(){if(!this.editor||!this.elements.rulerUnit)return;const n=this.editor.getRulerUnit();this.elements.rulerUnit.textContent="centimeters"===n?"cm":"in"}updateLicenseDisplay(n){if(!this.elements.licenseInfoDiv)return;const o={free:t("license.freeTier"),starter:t("license.starterTier"),professional:t("license.professionalTier"),enterprise:t("license.enterpriseTier")}[n.tier]||n.tier,e=n.remaining!==1/0?t("license.documentsRemaining",{count:String(n.remaining)}):"",i=n.watermark?t("watermark.poweredBy"):"";this.elements.licenseInfoDiv.innerHTML=`\n <span class="docvyu-license-tier ${n.tier}">${o}</span>\n ${e?`<span class="docvyu-remaining">${e}</span>`:""}\n ${i?`<span class="docvyu-watermark-notice">${i}</span>`:""}\n `}updateUITranslations(){if(this.elements.documentName){const n=this.elements.documentName.textContent?.trim();["Sin título","Untitled Document","Documento sem título"].includes(n||"")&&(this.elements.documentName.textContent=t("editor.untitledDocument"))}if(this.elements.status){const n=this.elements.status.textContent?.trim();["Listo","Ready","Pronto","Cargando..."].includes(n||"")&&(this.elements.status.textContent=t("statusBar.ready"))}const n={file:t("toolbar.file"),edit:t("toolbar.edit"),view:t("toolbar.view"),insert:t("toolbar.insert"),format:t("toolbar.format")};this.container.querySelectorAll(".docvyu-menu-item").forEach(t=>{const o=t.dataset.menu;o&&n[o]&&(t.textContent=n[o])});const o={home:t("toolbar.home"),insert:t("toolbar.insert"),layout:t("toolbar.layout"),view:t("toolbar.view")};this.container.querySelectorAll(".docvyu-ribbon-tab").forEach(n=>{const t=n.dataset.tab;t&&o[t]&&(n.textContent=o[t])}),this.licenseInfo&&this.updateLicenseDisplay(this.licenseInfo)}registerClick(){return this.multiClickCount+=1,this.scheduleMultiClickReset(),this.multiClickCount}scheduleMultiClickReset(){null!==this.multiClickResetId&&window.clearTimeout(this.multiClickResetId),this.multiClickResetId=window.setTimeout(()=>{this.multiClickCount=0,this.multiClickResetId=null},this.MULTI_CLICK_RESET_MS)}resetMultiClick(){this.multiClickCount=0,null!==this.multiClickResetId&&(window.clearTimeout(this.multiClickResetId),this.multiClickResetId=null)}async loadDocument(n){if(!this.editor)throw new Error("Editor not initialized");await this.editor.loadDocument(n),this.syncToolbarState()}saveDocument(n){if(!this.editor)throw new Error("Editor not initialized");const o=n||`${this.currentFileName}-edited.docx`;this.editor.downloadDocument(o),this.elements.status&&(this.elements.status.textContent=t("general.success"),setTimeout(()=>{this.elements.status&&(this.elements.status.textContent=t("statusBar.ready"))},2e3))}getEditor(){return this.editor}getLicenseInfo(){return this.licenseInfo}setLocale(n){this.config.locale=n,i(n),this.updateUITranslations(),this.elements.languageSelect&&(this.elements.languageSelect.value=n)}destroy(){window.removeEventListener("mouseup",this.handleMouseUp.bind(this)),window.removeEventListener("keydown",this.handleKeyDown.bind(this)),null!==this.multiClickResetId&&window.clearTimeout(this.multiClickResetId),this.container.innerHTML="",this.container.classList.remove("docvyu-container"),this.editor=null}}const s="1.0.0";export{r as DocvyuApp,s as VERSION,r as default};
|
package/dist/esm/react/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as e,jsxs as o}from"react/jsx-runtime";import{createContext as t,forwardRef as n,useRef as r,useState as a,useEffect as s,useCallback as l,useImperativeHandle as i,useContext as c}from"react";import{o as u,s as d,t as m,D as g,
|
|
1
|
+
import{jsx as e,jsxs as o}from"react/jsx-runtime";import{createContext as t,forwardRef as n,useRef as r,useState as a,useEffect as s,useCallback as l,useImperativeHandle as i,useContext as c}from"react";import{o as u,s as d,t as m,D as g,g as f}from"../DocvyuEditor-CCAFPhSl.js";const v=t({editor:null,isReady:!1,licenseInfo:null,selectionState:null,locale:"en",setLocale:()=>{},t:e=>e});function w(){const e=c(v);if(!e)throw new Error("useDocvyu must be used within a DocvyuEditorProvider");return e}const L=n(function(t,n){const{apiKey:c,licenseServerUrl:f,offlineMode:w,zoom:L,rulerUnit:y,locale:h,autoDetectLocale:S,customTranslations:b,onLocaleChange:D,className:p,style:E,onReady:z,onLoad:C,onSave:U,onSelectionChange:N,onLicenseChange:k,onUsageLimitExceeded:A,onError:F,wasmInit:I,EditorClass:M}=t,B=r(null),x=r(null),[R,P]=a(!1),[j,K]=a(null),[T,O]=a(null),[Z,$]=a(h||"en");s(()=>u(e=>{$(e),D?.(e)}),[D]);const q=l(e=>{d(e),$(e)},[]);s(()=>{if(B.current&&!x.current)return(async()=>{try{const e=new g({canvas:B.current,apiKey:c,licenseServerUrl:f,offlineMode:w,zoom:L,rulerUnit:y,locale:h,autoDetectLocale:S,customTranslations:b,onLocaleChange:D,onLoad:C,onSave:U,onSelectionChange:e=>{O(e),N?.(e)},onLicenseChange:e=>{K(e),k?.(e)},onUsageLimitExceeded:A}),o=await e.initialize(I,M);x.current=e,K(o),P(!0),z?.(e)}catch(e){F?.(e)}})(),()=>{x.current?.destroy(),x.current=null,P(!1)}},[]);const G=l(e=>{if(!x.current||!B.current)return;const o=B.current.getBoundingClientRect();x.current.handleMouseClick(e.clientX-o.left,e.clientY-o.top)},[]),H=l(e=>{if(!x.current||!B.current||1!==e.buttons)return;const o=B.current.getBoundingClientRect();x.current.handleMouseDrag(e.clientX-o.left,e.clientY-o.top)},[]);return s(()=>{const e=e=>{if(!x.current)return;if(e.ctrlKey||e.metaKey)switch(e.key.toLowerCase()){case"b":e.preventDefault();const o=x.current.getSelectionState();return void x.current.setBold(!o.bold);case"i":e.preventDefault();const t=x.current.getSelectionState();return void x.current.setItalic(!t.italic);case"u":e.preventDefault();const n=x.current.getSelectionState();return void x.current.setUnderline(!n.underline);case"s":return e.preventDefault(),void x.current.downloadDocument()}const o=new Set(["Backspace","Delete","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown"]);(1===e.key.length||o.has(e.key))&&(e.preventDefault(),x.current.handleKeyDown(e.key))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),i(n,()=>({editor:x.current,loadDocument:e=>{x.current?.loadDocument(e)},saveDocument:()=>x.current?.saveDocument()??null,downloadDocument:e=>{x.current?.downloadDocument(e)},setLocale:q,getLocale:()=>Z}),[R,Z,q]),e(v.Provider,{value:{editor:x.current,isReady:R,licenseInfo:j,selectionState:T,locale:Z,setLocale:q,t:m},children:o("div",{className:`docvyu-container ${p||""}`,style:E,children:[e("canvas",{ref:B,onMouseDown:G,onMouseMove:H,style:{display:"block"},"aria-label":m("accessibility.editorLabel")}),j?.watermark&&e("div",{className:"docvyu-watermark",children:m("watermark.poweredBy")})]})})});function y(){const{editor:e,selectionState:o}=w(),t=l(()=>{e&&o&&e.setBold(!o.bold)},[e,o]),n=l(()=>{e&&o&&e.setItalic(!o.italic)},[e,o]),r=l(()=>{e&&o&&e.setUnderline(!o.underline)},[e,o]),a=l(o=>{e?.setFontSize(o)},[e]),s=l(o=>{e?.setFontFamily(o)},[e]),i=l(o=>{e?.setFontColor(o)},[e]),c=l(o=>{e?.setAlignment(o)},[e]);return{state:o,toggleBold:t,toggleItalic:n,toggleUnderline:r,setFontSize:a,setFontFamily:s,setFontColor:i,setAlignment:c}}function h(){const{editor:e,selectionState:o}=w(),t=l(()=>{e&&o&&e.setBulletList(!o.hasBulletList)},[e,o]),n=l(()=>{e&&o&&e.setNumberedList(!o.hasNumberedList)},[e,o]),r=l(o=>{e?.setNumberedListFormat(o)},[e]),a=l(()=>{e?.removeNumbering()},[e]);return{hasBulletList:o?.hasBulletList??!1,hasNumberedList:o?.hasNumberedList??!1,numberingFormatId:o?.numberingFormatId,toggleBulletList:t,toggleNumberedList:n,setNumberingFormat:r,removeNumbering:a}}function S(){const{editor:e}=w();return{setMargins:l(o=>{e?.setMargins(o)},[e]),setPageSize:l(o=>{e?.setPageSize(o)},[e]),getPageSize:l(()=>e?.getPageSize()??"letter",[e])}}function b(){const{editor:e}=w(),[o,t]=a(1),n=l(o=>{e?.setZoom(o),t(o)},[e]),r=l(()=>{e?.zoomIn(),t(e?.getZoom()??1)},[e]),i=l(()=>{e?.zoomOut(),t(e?.getZoom()??1)},[e]);return s(()=>{e&&t(e.getZoom())},[e]),{zoom:o,setZoom:n,zoomIn:r,zoomOut:i}}function D(){const{locale:e,setLocale:o,t:t}=w(),[n]=a(f());return{locale:e,setLocale:o,t:t,availableLocales:n,isLocaleAvailable:e=>n.includes(e)}}export{L as DocvyuEditor,L as DocvyuEditorComponent,L as default,w as useDocvyu,D as useDocvyuI18n,y as useEditorFormatting,h as useEditorLists,S as useEditorPageSettings,b as useEditorZoom};
|