{"id":5531,"date":"2026-09-22T15:10:21","date_gmt":"2026-09-22T06:10:21","guid":{"rendered":"https:\/\/ubun2m.com\/?p=5531"},"modified":"2026-09-22T15:12:30","modified_gmt":"2026-09-22T06:12:30","slug":"%e3%83%95%e3%83%a9%e3%83%b3%e3%82%b9%e8%aa%9e","status":"publish","type":"post","link":"https:\/\/ubun2m.com\/?p=5531","title":{"rendered":"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2"},"content":{"rendered":"\n<!-- Cursive Studio 2.0 \u2014 WordPress\u300c\u30ab\u30b9\u30bf\u30e0HTML\u300d\u306b\u3001\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u5168\u4f53\u3092\u8cbc\u308a\u4ed8\u3051\u307e\u3059\u3002 -->\n<cursive-studio storage-key=\"main\" font-url=\"\/wp-content\/uploads\/2024\/01\/graphecrit.otf\">\u7b46\u8a18\u4f53\u30c4\u30fc\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002JavaScript\u304c\u524a\u9664\u3055\u308c\u308b\u5834\u5408\u306f\u540c\u68b1\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u7248\u3092\u5229\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/cursive-studio>\n<script>\/* Cursive Studio 2.0.0 \u2014 shared, dependency-free layout utilities. *\/\n(function (root, factory) {\n  'use strict';\n  const api = factory();\n  if (typeof module === 'object' && module.exports) module.exports = api;\n  else root.CursiveStudioCore = api;\n})(typeof globalThis !== 'undefined' ? globalThis : this, function () {\n  'use strict';\n  const DEFAULT_FONT = '\/wp-content\/uploads\/2024\/01\/graphecrit.otf';\n  const DEFAULTS = Object.freeze({\n    text: \"Bonjour, comment \u00e7a va ?\\nJ\u2019esp\u00e8re que vous passez une bonne journ\u00e9e.\",\n    title: '', paper: 'auto', width: 800, margin: 40,\n    fontSize: 64, lineHeight: 64, baseline: 0, align: 'left',\n    grid: 'french', ink: '#344e9c', paperColor: '#fffdf8', gridColor: '#a4a9c5',\n    opacity: 100, guideOpacity: 48, transparent: false, marginLine: true,\n    mode: 'normal', traceOpacity: 25, traceRows: 1, blankRows: 1,\n    nameDate: false, pageNumbers: false, dpi: 150, filename: 'cursive-note',\n    fontMode: 'url', fontUrl: DEFAULT_FONT, autosave: false\n  });\n  const MAX_TEXT = 12000, MAX_PAGES = 100;\n  const RANGES = {\n    width:[400,1200], margin:[16,120], fontSize:[20,160], lineHeight:[28,220], baseline:[-40,40],\n    opacity:[10,100], guideOpacity:[5,100], traceOpacity:[5,70], traceRows:[0,3], blankRows:[0,4]\n  };\n  const ENUMS = {\n    paper:['auto','a4','a4landscape','letter'], align:['left','center','right'],\n    grid:['french','english','ruled','square','dots','none'],\n    mode:['normal','trace','practice'], fontMode:['url','local','system']\n  };\n  const PRESETS = Object.freeze({\n    notebook:{paper:'auto',width:800,margin:40,fontSize:64,lineHeight:64,baseline:0,grid:'french',mode:'normal',align:'left',transparent:false,paperColor:'#fffdf8',ink:'#344e9c',opacity:100,marginLine:true,nameDate:false,pageNumbers:false},\n    practice:{paper:'a4',margin:48,fontSize:56,lineHeight:64,baseline:0,grid:'french',mode:'practice',traceRows:1,blankRows:1,traceOpacity:25,align:'left',transparent:false,paperColor:'#ffffff',ink:'#344e9c',opacity:100,marginLine:true,nameDate:true,pageNumbers:true},\n    worksheet:{paper:'a4',margin:48,fontSize:48,lineHeight:60,baseline:0,grid:'ruled',mode:'normal',align:'left',transparent:false,paperColor:'#ffffff',ink:'#263137',opacity:100,marginLine:false,nameDate:true,pageNumbers:true},\n    lettering:{paper:'auto',width:960,margin:64,fontSize:96,lineHeight:112,baseline:0,grid:'none',mode:'normal',align:'center',transparent:true,paperColor:'#ffffff',ink:'#223d36',opacity:100,marginLine:false,nameDate:false,pageNumbers:false}\n  });\n  const clamp = (n, a, b) => Math.max(a, Math.min(b, n));\n  function sanitize(raw) {\n    const s = {...DEFAULTS};\n    if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return s;\n    for (const key of Object.keys(s)) {\n      if (!Object.prototype.hasOwnProperty.call(raw, key)) continue;\n      const v = raw[key];\n      if (RANGES[key]) { const n = Number(v); s[key] = Number.isFinite(n) ? Math.round(clamp(n,...RANGES[key])) : DEFAULTS[key]; }\n      else if (ENUMS[key]) { if (ENUMS[key].includes(v)) s[key] = v; }\n      else if (['ink','paperColor','gridColor'].includes(key)) { if (typeof v==='string' && \/^#[0-9a-f]{6}$\/i.test(v)) s[key]=v; }\n      else if (typeof s[key]==='boolean') s[key]=v===true;\n      else if (key==='dpi') { if ([96,150,300].includes(Number(v))) s[key]=Number(v); }\n      else if (typeof v==='string') { s[key]=v.slice(0,key==='text'?MAX_TEXT:key==='fontUrl'?2048:key==='title'?100:100); }\n    }\n    return s;\n  }\n  const segmenter = typeof Intl !== 'undefined' && Intl.Segmenter ? new Intl.Segmenter('fr',{granularity:'grapheme'}) : null;\n  function graphemes(text) {\n    if (segmenter) return Array.from(segmenter.segment(text),x=>x.segment);\n    const out=[];\n    for (const ch of Array.from(text)) {\n      const last=out[out.length-1];\n      if (out.length && (\/\\p{Mark}|[\\uFE0E\\uFE0F\\u200D]\/u.test(ch) || last.endsWith('\\u200D') || \/[\\u{1F3FB}-\\u{1F3FF}]\/u.test(ch))) out[out.length-1]+=ch;\n      else if (out.length && \/^[\\u{1F1E6}-\\u{1F1FF}]$\/u.test(ch) && \/^[\\u{1F1E6}-\\u{1F1FF}]$\/u.test(last)) out[out.length-1]+=ch;\n      else out.push(ch);\n    }\n    return out;\n  }\n  \/** Preserve hard breaks and spaces; split oversized tokens only on grapheme boundaries. *\/\n  function wrapText(text, maxWidth, measure) {\n    if (!Number.isFinite(maxWidth) || maxWidth<=0) throw new Error('\u6587\u5b57\u3092\u914d\u7f6e\u3059\u308b\u5e45\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u4f59\u767d\u3092\u5c0f\u3055\u304f\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n    const lines=[];\n    const normalized=String(text).replace(\/\\r\\n?\/g,'\\n').replace(\/\\t\/g,'    ');\n    for (const paragraph of normalized.split('\\n')) {\n      let line='';\n      const tokens=paragraph.match(\/[ ]+|[^ ]+\/gu)||[];\n      for (const token of tokens) {\n        if (measure(line+token)<=maxWidth+0.01) {line+=token; continue;}\n        if (line) {lines.push(line); line='';}\n        if (measure(token)<=maxWidth+0.01) {line=token; continue;}\n        const chars=graphemes(token);\n        let i=0;\n        while (i<chars.length) {\n          let lo=1, hi=chars.length-i, fits=0;\n          while(lo<=hi) {const m=(lo+hi)>>1; if(measure(chars.slice(i,i+m).join(''))<=maxWidth+0.01){fits=m;lo=m+1;}else hi=m-1;}\n          if (!fits) throw new Error('1\u6587\u5b57\u304c\u7528\u7d19\u5e45\u3092\u8d85\u3048\u3066\u3044\u307e\u3059\u3002\u6587\u5b57\u3092\u5c0f\u3055\u304f\u3059\u308b\u304b\u3001\u4f59\u767d\u3092\u6e1b\u3089\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n          const part=chars.slice(i,i+fits).join(''); i+=fits;\n          if(i<chars.length) lines.push(part); else line=part;\n        }\n      }\n      lines.push(line);\n    }\n    return lines.length?lines:[''];\n  }\n  function pageSize(s) {\n    const mm=96\/25.4;\n    if(s.paper==='a4') return {width:210*mm,height:297*mm};\n    if(s.paper==='a4landscape') return {width:297*mm,height:210*mm};\n    if(s.paper==='letter') return {width:816,height:1056};\n    return {width:s.width,height:1400};\n  }\n  function makeRows(lines,s) {\n    const rows=[];\n    for(const [group,text] of lines.entries()) {\n      if (s.mode==='practice' && text.trim()) {\n        rows.push({text,group,kind:'model',alpha:s.opacity\/100});\n        for(let i=0;i<s.traceRows;i++) rows.push({text,group,kind:'trace',alpha:s.traceOpacity\/100});\n        for(let i=0;i<s.blankRows;i++) rows.push({text:'',group,kind:'blank',alpha:1});\n      } else rows.push({text,group,kind:s.mode==='trace'?'trace':'model',alpha:s.mode==='trace'?s.traceOpacity\/100:s.opacity\/100});\n    }\n    return rows;\n  }\n  function paginateRows(rows,capacity,keepTogether) {\n    if(capacity<1)throw new Error('\u7528\u7d19\u306b\u884c\u304c\u53ce\u307e\u308a\u307e\u305b\u3093\u3002');\n    const pages=[];let current=[];\n    const flush=()=>{if(current.length){pages.push(current);current=[];}};\n    for(let i=0;i<rows.length;) {\n      let end=i+1;\n      if(keepTogether)while(end<rows.length&&rows[end].group===rows[i].group)end++;\n      const group=rows.slice(i,end);i=end;\n      if(group.length<=capacity&&current.length+group.length>capacity)flush();\n      if(group.length>capacity&&current.length)flush();\n      for(const row of group){if(current.length===capacity)flush();current.push(row);}\n    }\n    flush();return pages;\n  }\n  function setFont(ctx,s,family) {\n    ctx.font=`${s.fontSize}px ${family}`;\n    ctx.textBaseline='alphabetic'; ctx.textAlign='left'; ctx.direction='ltr';\n    if('fontKerning' in ctx) ctx.fontKerning='normal';\n    if('letterSpacing' in ctx) ctx.letterSpacing='0px';\n    if('wordSpacing' in ctx) ctx.wordSpacing='0px';\n  }\n  function inkWidth(m) {return Math.max(m.width,m.actualBoundingBoxRight||0)+Math.max(0,m.actualBoundingBoxLeft||0);}\n  \/** All geometry is in 96-DPI CSS pixels, independent of the preview zoom. *\/\n  function layout(ctx,settings,family) {\n    const s=sanitize(settings), size=pageSize(s), contentWidth=size.width-s.margin*2;\n    setFont(ctx,s,family);\n    const cache=new Map();\n    const metric=text=>{if(!cache.has(text)) cache.set(text,ctx.measureText(text));return cache.get(text);};\n    const lines=wrapText(s.text,contentWidth,t=>inkWidth(metric(t)));\n    let ascent=0,descent=0;\n    for(const t of ['\u00c0\u00c9\u00ca\u00c7\u00d4\u00d9gjpqyf',...lines]) {const m=metric(t);ascent=Math.max(ascent,m.actualBoundingBoxAscent||0);descent=Math.max(descent,m.actualBoundingBoxDescent||0);}\n    ascent=ascent||s.fontSize*.8; descent=descent||s.fontSize*.2;\n    const step=Math.max(s.lineHeight,Math.ceil(ascent+descent+5));\n    const stackedHeader=contentWidth<420;\n    const headerHeight=(s.title?30:0)+(s.nameDate?(stackedHeader?46:26):0), footerHeight=s.pageNumbers?24:0;\n    const top=s.margin+headerHeight;\n    const firstBaseline=top+Math.max(step*.75,ascent+Math.max(0,-s.baseline));\n    const bottomReserve=s.margin+footerHeight+descent+Math.max(0,s.baseline);\n    const capacity=Math.floor((size.height-bottomReserve-firstBaseline)\/step)+1;\n    if(capacity<1) throw new Error('\u6587\u5b57\u3068\u4f59\u767d\u304c\u7528\u7d19\u306b\u53ce\u307e\u308a\u307e\u305b\u3093\u3002\u6587\u5b57\u30b5\u30a4\u30ba\u30fb\u884c\u9593\u30fb\u4f59\u767d\u3092\u5c0f\u3055\u304f\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n    const rows=makeRows(lines,s);\n    const pageRows=paginateRows(rows,capacity,s.mode==='practice');\n    if(pageRows.length>MAX_PAGES) throw new Error(`\u4e0a\u9650\u306e${MAX_PAGES}\u30da\u30fc\u30b8\u3092\u8d85\u3048\u307e\u3057\u305f\u3002\u6587\u7ae0\u30fb\u7df4\u7fd2\u884c\u6570\u3092\u6e1b\u3089\u3057\u3066\u304f\u3060\u3055\u3044\u3002`);\n    const pages=[];\n    for(const part of pageRows) {\n      const height=s.paper==='auto'?Math.min(size.height,Math.ceil(firstBaseline+(part.length-1)*step+bottomReserve)):size.height;\n      pages.push({width:size.width,height,rows:part.map((r,i)=>{\n        const m=metric(r.text); const w=inkWidth(m), bearing=Math.max(0,m.actualBoundingBoxLeft||0);\n        let x=s.margin+bearing;\n        if(s.align==='center') x+=(contentWidth-w)\/2;\n        if(s.align==='right') x+=contentWidth-w;\n        return {...r,x,y:firstBaseline+i*step+s.baseline,guideY:firstBaseline+i*step};\n      })});\n    }\n    return {settings:s,family,pages,lines,rows,step,firstBaseline,top,footerHeight,ascent,descent,stackedHeader,adjustedStep:step>s.lineHeight,splitPractice:s.mode==='practice'&&1+s.traceRows+s.blankRows>capacity};\n  }\n  \/** Preview, PNG and print all call this function. It never parses user text as HTML. *\/\n  function render(ctx,doc,pageIndex,{print=false}={}) {\n    const s=doc.settings,p=doc.pages[pageIndex];\n    ctx.save();\n    if(print||!s.transparent) {ctx.fillStyle=print&&s.transparent?'#ffffff':s.paperColor;ctx.fillRect(0,0,p.width,p.height);}\n    const left=s.margin\/2,right=p.width-s.margin\/2,top=doc.top-5,bottom=p.height-s.margin\/2-doc.footerHeight;\n    const guide=(x1,y1,x2,y2,alpha,width,dash=[])=>{\n      ctx.globalAlpha=alpha*s.guideOpacity\/100;ctx.strokeStyle=s.gridColor;ctx.lineWidth=width;ctx.setLineDash(dash);\n      ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke();\n    };\n    ctx.save();ctx.beginPath();ctx.rect(left,Math.max(0,top),right-left,Math.max(0,bottom-top));ctx.clip();\n    const g=doc.step\/4;\n    if(s.grid==='french') {\n      for(let y=doc.firstBaseline-Math.ceil((doc.firstBaseline-top)\/g)*g;y<=bottom;y+=g) guide(left,y,right,y,.55,.65);\n      for(let x=s.margin;x<=right;x+=doc.step) guide(x,top,x,bottom,.45,.65);\n    } else if(s.grid==='square') {\n      for(let y=doc.firstBaseline-Math.ceil((doc.firstBaseline-top)\/(doc.step\/2))*(doc.step\/2);y<=bottom;y+=doc.step\/2)guide(left,y,right,y,.7,.7);\n      for(let x=s.margin;x<=right;x+=doc.step\/2)guide(x,top,x,bottom,.7,.7);\n    } else if(s.grid==='dots') {\n      ctx.fillStyle=s.gridColor;ctx.globalAlpha=s.guideOpacity\/100;\n      const d=Math.max(14,g);\n      for(let y=top+d;y<=bottom;y+=d)for(let x=s.margin;x<=right;x+=d){ctx.beginPath();ctx.arc(x,y,.85,0,Math.PI*2);ctx.fill();}\n    }\n    if(['french','ruled','english'].includes(s.grid)) {\n      for(let y=doc.firstBaseline-Math.ceil((doc.firstBaseline-top)\/doc.step)*doc.step;y<=bottom;y+=doc.step) {\n        guide(left,y,right,y,1,1.1);\n        if(s.grid==='english') {guide(left,y-doc.step*.5,right,y-doc.step*.5,.75,.8,[4,4]);guide(left,y-doc.step*.75,right,y-doc.step*.75,.5,.7);guide(left,y+doc.step*.25,right,y+doc.step*.25,.5,.7);}\n      }\n    }\n    if(s.marginLine&&s.grid!=='none') {ctx.strokeStyle='#c98189';ctx.globalAlpha=s.guideOpacity\/100;ctx.lineWidth=1;ctx.setLineDash([]);ctx.beginPath();ctx.moveTo(s.margin-10,top);ctx.lineTo(s.margin-10,bottom);ctx.stroke();}\n    ctx.restore();ctx.globalAlpha=1;\n    const uiFont='\"Hiragino Kaku Gothic ProN\",\"Yu Gothic\",Arial,sans-serif';\n    let headerY=s.margin+15;ctx.fillStyle='#48525b';ctx.font=`600 17px ${uiFont}`;\n    if(s.title) {ctx.fillText(s.title,s.margin,headerY,p.width-2*s.margin);headerY+=30;}\n    if(s.nameDate) {ctx.font=`12px ${uiFont}`;ctx.fillStyle='#6d7479';const available=p.width-2*s.margin;ctx.fillText('Name  ____________________',s.margin,headerY,Math.min(available,230));ctx.fillText('Date  ______________',doc.stackedHeader?s.margin:p.width-s.margin-170,headerY+(doc.stackedHeader?20:0),Math.min(available,170));}\n    setFont(ctx,s,doc.family);ctx.fillStyle=s.ink;\n    for(const row of p.rows) {if(!row.text)continue;ctx.globalAlpha=row.alpha;ctx.fillText(row.text,row.x,row.y);}\n    ctx.globalAlpha=1;\n    if(s.pageNumbers) {ctx.font=`11px ${uiFont}`;ctx.textAlign='center';ctx.fillStyle='#7b8186';ctx.fillText(`${pageIndex+1} \/ ${doc.pages.length}`,p.width\/2,p.height-s.margin\/2);}\n    ctx.restore();\n  }\n  function rasterSize(width,height,dpi) {\n    const scale=dpi\/96,w=Math.round(width*scale),h=Math.round(height*scale);\n    if(w>4096||h>4096||w*h>12000000) throw new Error('\u753b\u50cf\u304c\u5927\u304d\u3059\u304e\u307e\u3059\u3002\u89e3\u50cf\u5ea6\u3092150 dpi\u306b\u4e0b\u3052\u308b\u304b\u3001A4\u7528\u7d19\u306b\u5207\u308a\u66ff\u3048\u3066\u304f\u3060\u3055\u3044\u3002');\n    return {width:w,height:h,scale};\n  }\n  const crcTable=new Uint32Array(256);\n  for(let n=0;n<256;n++){let c=n;for(let k=0;k<8;k++)c=c&1?0xedb88320^(c>>>1):c>>>1;crcTable[n]=c>>>0;}\n  function crc32(bytes) {let c=0xffffffff;for(const b of bytes)c=crcTable[(c^b)&255]^(c>>>8);return(c^0xffffffff)>>>0;}\n  function concat(arrays) {const result=new Uint8Array(arrays.reduce((n,a)=>n+a.length,0));let pos=0;for(const a of arrays){result.set(a,pos);pos+=a.length;}return result;}\n  function pngDpi(bytes,dpi) {\n    if(bytes.length<33||bytes[0]!==137||bytes[1]!==80)throw new Error('PNG\u753b\u50cf\u306e\u751f\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002');\n    const chunk=new Uint8Array(21),view=new DataView(chunk.buffer);view.setUint32(0,9);chunk.set([112,72,89,115],4);\n    const ppm=Math.round(dpi\/0.0254);view.setUint32(8,ppm);view.setUint32(12,ppm);chunk[16]=1;view.setUint32(17,crc32(chunk.subarray(4,17)));\n    const parts=[bytes.subarray(0,8)];let off=8,inserted=false;\n    while(off+12<=bytes.length){const len=new DataView(bytes.buffer,bytes.byteOffset+off,4).getUint32(0),end=off+len+12;if(end>bytes.length)throw new Error('PNG\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3059\u3002');const type=String.fromCharCode(...bytes.subarray(off+4,off+8));if(type!=='pHYs')parts.push(bytes.subarray(off,end));if(type==='IHDR'&&!inserted){parts.push(chunk);inserted=true;}off=end;}\n    return concat(parts);\n  }\n  \/** Small ZIP writer using STORE. PNG is already compressed; no CDN is needed. *\/\n  function zip(files) {\n    const encoder=new TextEncoder(),locals=[],central=[];let offset=0,centralBytes=0;\n    const now=new Date(),date=((Math.max(1980,now.getFullYear())-1980)<<9)|((now.getMonth()+1)<<5)|now.getDate(),time=(now.getHours()<<11)|(now.getMinutes()<<5)|(now.getSeconds()>>1);\n    for(const file of files) {\n      const name=encoder.encode(file.name),data=file.data,crc=crc32(data),local=new Uint8Array(30+name.length),lv=new DataView(local.buffer);\n      lv.setUint32(0,0x04034b50,true);lv.setUint16(4,20,true);lv.setUint16(6,0x800,true);lv.setUint16(10,time,true);lv.setUint16(12,date,true);lv.setUint32(14,crc,true);lv.setUint32(18,data.length,true);lv.setUint32(22,data.length,true);lv.setUint16(26,name.length,true);local.set(name,30);locals.push(local,data);\n      const c=new Uint8Array(46+name.length),cv=new DataView(c.buffer);cv.setUint32(0,0x02014b50,true);cv.setUint16(4,20,true);cv.setUint16(6,20,true);cv.setUint16(8,0x800,true);cv.setUint16(12,time,true);cv.setUint16(14,date,true);cv.setUint32(16,crc,true);cv.setUint32(20,data.length,true);cv.setUint32(24,data.length,true);cv.setUint16(28,name.length,true);cv.setUint32(42,offset,true);c.set(name,46);central.push(c);centralBytes+=c.length;offset+=local.length+data.length;\n    }\n    const end=new Uint8Array(22),ev=new DataView(end.buffer);ev.setUint32(0,0x06054b50,true);ev.setUint16(8,files.length,true);ev.setUint16(10,files.length,true);ev.setUint32(12,centralBytes,true);ev.setUint32(16,offset,true);\n    return new Blob([...locals,...central,end],{type:'application\/zip'});\n  }\n  function filename(s) {let name=String(s||'cursive-note').replace(\/[<>:\"\/\\\\|?*\\x00-\\x1f]\/g,'-').replace(\/^\\.+|[. ]+$\/g,'').slice(0,80)||'cursive-note';return \/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$\/i.test(name)?'note-'+name:name;}\n  function project(s) {return {app:'cursive-studio',version:1,settings:sanitize(s)};}\n  function readProject(json) {\n    if(typeof json!=='string'||json.length>200000)throw new Error('\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u304c\u5927\u304d\u3059\u304e\u307e\u3059\u3002');\n    let data;try{data=JSON.parse(json);}catch{throw new Error('\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306eJSON\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002');}\n    if(data?.app!=='cursive-studio'||data?.version!==1||!data.settings||typeof data.settings!=='object'||Array.isArray(data.settings))throw new Error('\u5bfe\u5fdc\u3057\u3066\u3044\u306a\u3044\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u5f62\u5f0f\u30fb\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u3059\u3002');\n    if(typeof data.settings.text==='string'&&data.settings.text.length>MAX_TEXT)throw new Error(`\u672c\u6587\u306e\u4e0a\u9650\u306f${MAX_TEXT}\u6587\u5b57\u3067\u3059\u3002`);\n    return sanitize(data.settings);\n  }\n  return {DEFAULTS,DEFAULT_FONT,PRESETS,MAX_TEXT,MAX_PAGES,sanitize,graphemes,wrapText,pageSize,makeRows,paginateRows,setFont,inkWidth,layout,render,rasterSize,crc32,pngDpi,zip,filename,project,readProject};\n});\n\n\/* Cursive Studio 2.0.0 \u2014 custom-element controller. No external libraries. *\/\n(function () {\n  'use strict';\n  if (!window.customElements || customElements.get('cursive-studio')) return;\n  const C = window.CursiveStudioCore;\n  const UI_CSS = \":host{all:initial;display:block;box-sizing:border-box;width:100%;max-width:1440px;margin:0 auto;color-scheme:light;direction:ltr;text-align:left;font:14px\/1.6 -apple-system,BlinkMacSystemFont,\\\"Segoe UI\\\",\\\"Hiragino Kaku Gothic ProN\\\",\\\"Yu Gothic\\\",Meiryo,sans-serif;color:#273b36}\\n*,*::before,*::after{box-sizing:border-box} [hidden]{display:none!important}\\n.app{--ink:#203d35;--muted:#65726d;--line:#dfe5df;--accent:#27634f;--soft:#f3f6f1;--paper:#fff;max-width:100%;background:#f6f7f3;border:1px solid var(--line);border-radius:22px;overflow:hidden}\\nbutton,input,select,textarea{font:inherit;color:inherit;letter-spacing:normal}button,a,input,select,textarea,summary{-webkit-tap-highlight-color:transparent}button{cursor:pointer;touch-action:manipulation}button:disabled{cursor:not-allowed;opacity:.45}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:3px solid #569a80;outline-offset:3px}\\nbutton{min-height:40px;border:1px solid var(--line);background:white;border-radius:9px;padding:8px 13px;font-size:13px;font-weight:600;line-height:1.4}button:hover:not(:disabled){border-color:#9bb7a6;background:#f3f7f3}button.primary{background:var(--accent);color:#fff;border-color:var(--accent)}button.primary:hover:not(:disabled){background:#1d4f3e;border-color:#1d4f3e}button.quiet{background:transparent;border-color:transparent;color:var(--muted)}button.small{min-height:34px;padding:5px 9px;font-size:12px}button.icon{min-width:38px;padding:7px}\\na{color:var(--accent);text-decoration:underline}svg{width:18px;height:18px;flex-shrink:0;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}\\n.header{padding:25px 28px 21px;background:#fff;display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid var(--line)}.brand{display:flex;align-items:center;gap:13px}.brand-mark{width:44px;height:44px;border-radius:13px;display:grid;place-items:center;background:#e9f0e9;color:var(--accent)}.brand-mark svg{width:25px;height:25px}.eyebrow{color:var(--muted);font-size:10px;font-weight:700;letter-spacing:.14em;line-height:1.5;margin-bottom:2px}h2{font-size:25px;letter-spacing:-.04em;line-height:1.25;font-weight:650;margin:0}p{margin:0}.subhead{font-size:12px;color:var(--muted);margin-top:5px}.font-badge{display:flex;align-items:center;gap:7px;white-space:nowrap;font-size:11px;font-weight:600;color:var(--muted);padding:6px 10px;background:#f5f6f2;border-radius:20px}.dot{width:7px;height:7px;display:inline-block;border-radius:50%;background:#b59d70}.font-badge[data-state=ready] .dot{background:#4f8c66}.font-badge[data-state=error] .dot{background:#c0804c}\\n.presets-wrap{padding:20px 24px 0}.section-label{font-size:11px;font-weight:700;color:var(--muted);margin:0 0 8px;letter-spacing:.06em}.presets{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:9px}.preset{display:flex;align-items:center;gap:10px;padding:12px 14px;text-align:left;border-radius:12px;background:#fff;min-width:0}.preset span{min-width:0}.preset strong{display:block;font-size:13px}.preset small{font-size:10px;font-weight:400;color:var(--muted);display:block;margin-top:2px}.preset svg{width:22px;height:22px;color:var(--accent)}.preset[aria-pressed=true]{border-color:#8eb09b;box-shadow:0 0 0 1px #8eb09b;background:#f0f5ec}\\n.mobile-tabs{display:none}.workspace{display:grid;grid-template-columns:345px minmax(0,1fr);gap:20px;padding:20px 24px 24px;align-items:start}.editor{min-width:0;max-height:900px;overflow:auto;scrollbar-width:thin;border:1px solid var(--line);background:#fff;border-radius:14px}.fields{border:0;padding:0;margin:0;min-width:0}.section{padding:18px;border-bottom:1px solid var(--line)}.section:last-child{border-bottom:0}.label-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}.label-row label,.label-row strong{font-weight:700;font-size:13px}.counter{font-size:10px;color:var(--muted);white-space:nowrap;font-variant-numeric:tabular-nums}textarea,input[type=text],input[type=url],input[type=number],select{width:100%;border:1px solid #d7dfd7;border-radius:8px;background:#fff;padding:9px 11px;box-shadow:none;line-height:1.5;min-height:40px}textarea{font-size:16px;line-height:1.7;resize:vertical;min-height:130px;max-height:440px;display:block;background:#fcfdfa}.helper{font-size:11px;color:var(--muted);line-height:1.65;margin-top:7px;overflow-wrap:anywhere}.helper.warn{color:#966427}.input-actions{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:5px;margin-top:7px}.accent-row{display:flex;gap:4px;flex-wrap:wrap;margin-top:12px}.accent{min-width:28px;min-height:28px;font-size:13px;padding:2px 6px;font-family:Georgia,serif;background:#f7f8f4}.example-row{display:flex;gap:6px;margin-top:11px}.example-row select{font-size:12px;min-width:0;flex:1;min-height:34px;padding:6px 8px}.example-row button{flex:none}\\ndetails{border-bottom:1px solid var(--line)}details:last-child{border-bottom:0}summary{cursor:pointer;list-style:none;display:flex;align-items:center;justify-content:space-between;gap:12px;font-weight:700;padding:15px 18px;font-size:13px;touch-action:manipulation}summary::-webkit-details-marker{display:none}summary::after{content:'+';font-size:18px;color:#7e8c80;font-weight:400}details[open]>summary::after{content:'\u2212'}details[open]>summary{padding-bottom:6px}.detail-body{padding:8px 18px 18px}.field{display:block;margin-bottom:13px}.field:last-child{margin-bottom:0}.field>span,.field-label{display:block;font-size:12px;font-weight:600;margin-bottom:5px}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:12px;min-width:0}.two-col>.field{min-width:0}.field>.range-head{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:6px;font-size:12px;font-weight:600}.range-head output{font-size:11px;color:var(--muted);font-weight:500;font-variant-numeric:tabular-nums}input[type=range]{appearance:auto;width:100%;accent-color:var(--accent);margin:0;min-height:24px;display:block;cursor:pointer}input[type=checkbox]{width:17px;height:17px;accent-color:var(--accent);flex-shrink:0;margin:2px 0 0}.check{display:flex;gap:8px;align-items:flex-start;font-size:12px;cursor:pointer;margin:10px 0}.color-field{display:flex;align-items:center;justify-content:space-between;gap:6px;border:1px solid var(--line);border-radius:8px;padding:5px 8px;font-size:11px}.color-field input{width:36px;height:30px;border:0;padding:0;background:none;cursor:pointer}.url-row{display:flex;gap:6px;margin-top:8px}.url-row input{min-width:0;font-size:11px;padding:8px}.url-row button{flex:none;padding:7px 10px;font-size:11px}.font-message{font-size:11px;line-height:1.6;margin-top:7px;color:var(--muted);overflow-wrap:anywhere}.font-message[data-state=error]{color:#966027}.file-label{display:block;border:1px dashed #a8b9a9;border-radius:8px;padding:10px;font-size:12px;cursor:pointer;background:#f6f9f3;margin-top:8px}.file-label input{max-width:100%;display:block;font-size:10px;margin-top:6px}.settings-actions{display:flex;gap:7px;flex-wrap:wrap}.privacy{font-size:10px;line-height:1.7;color:var(--muted);padding:12px 18px;background:#fafbf8}\\n.preview-column{min-width:0;position:sticky;top:16px}.preview-card{border:1px solid var(--line);background:#e9ece5;border-radius:14px;overflow:hidden}.preview-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:10px 14px;background:#fff;border-bottom:1px solid var(--line)}.preview-title{font-size:12px;font-weight:700;display:flex;align-items:center;gap:8px}.live-tag{font-size:9px;font-weight:600;letter-spacing:.06em;color:#518163;padding:2px 6px;border:1px solid #d3e6d1;border-radius:5px}.zoom{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muted)}.zoom select{width:auto;min-height:30px;font-size:11px;padding:4px 7px}.paper-viewport{overflow:auto;padding:28px 24px;min-height:280px;max-height:65vh;display:block;scrollbar-width:thin}.paper{width:100%;margin:0 auto;box-shadow:0 8px 22px #34442a15,0 1px 3px #26351e15;background:#fff;line-height:0}.paper.checker{background-color:#fff;background-image:linear-gradient(45deg,#edf0e9 25%,transparent 25%),linear-gradient(-45deg,#edf0e9 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#edf0e9 75%),linear-gradient(-45deg,transparent 75%,#edf0e9 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0}canvas{display:block;max-width:none;width:100%;height:auto}.preview-footer{display:flex;justify-content:space-between;gap:8px;align-items:center;padding:8px 12px;background:#f6f7f3;border-top:1px solid var(--line);font-size:10px;color:var(--muted)}.pager{display:flex;align-items:center;gap:5px;white-space:nowrap}.pager button{min-height:27px;min-width:28px;padding:3px 7px;font-size:14px}.pager span{min-width:48px;text-align:center;font-variant-numeric:tabular-nums}.geometry{overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.preview-warning{margin-top:10px;background:#fff8ec;border:1px solid #eadcc3;border-radius:9px;padding:10px 12px;color:#86602d;font-size:11px;line-height:1.65}.preview-error{background:#fff0ee;border-color:#e6c3b9;color:#983e2d}.export-card{padding:16px;border:1px solid var(--line);border-radius:12px;background:#fff;margin-top:14px}.export-header{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:10px}.export-header strong{font-size:12px}.export-header select{font-size:11px;width:auto;min-height:32px;padding:4px 8px}.export-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px}.export-actions button{display:flex;align-items:center;justify-content:center;gap:7px;min-height:44px}.export-actions .primary{grid-column:1\/-1}.export-bottom{display:flex;gap:8px;align-items:center;margin-top:10px;font-size:11px;color:var(--muted)}.export-bottom input{min-height:30px;font-size:11px;flex:1;min-width:0;padding:4px 8px}.result-status{font-size:11px;line-height:1.6;color:var(--muted);margin-top:10px;min-height:18px}.result-status[data-error=true]{color:#983e2d}.brand-note{font-size:10px;color:#879087;text-align:center;padding:12px 4px 0}.mobile-preview-button{display:none}\\n.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);max-width:min(90vw,500px);background:#223d35;color:#fff;border-radius:12px;padding:11px 18px;font-size:12px;box-shadow:0 8px 30px #0002;z-index:2147483600;text-align:center;pointer-events:none}.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}\\ndialog{background:#fff;color:#273b36;border:1px solid #dbe3d9;border-radius:18px;padding:0;width:min(94vw,660px);max-height:90vh;box-shadow:0 25px 90px #1220153b;overflow:auto}dialog::backdrop{background:#182e2355;backdrop-filter:blur(2px)}.dialog-head{padding:18px 20px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:12px}.dialog-head h3{margin:0;font-size:16px}.dialog-body{padding:20px}.export-image-frame{padding:16px;max-height:45vh;overflow:auto;background:#edf0e9;border-radius:9px;margin:12px 0}.export-image-frame img{display:block;max-width:100%;height:auto;margin:auto;box-shadow:0 2px 10px #0001}.dialog-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.download-link{display:inline-flex;align-items:center;justify-content:center;text-decoration:none;border-radius:9px;min-height:44px;background:#27634f;color:#fff;padding:9px 18px;font-weight:700;font-size:13px}.dialog-actions .open-link{font-size:12px;padding:9px 4px}.dialog-meta{font-size:12px;color:var(--muted)}.busy-mark::before{content:'';display:inline-block;width:10px;height:10px;margin-right:7px;border:2px solid #b7ccbd;border-top-color:#27634f;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\\n.app.compact .header{padding:18px 16px}.app.compact h2{font-size:22px}.app.compact .font-badge{padding:6px}.app.compact .font-badge .badge-prefix{display:none}.app.compact .presets-wrap{padding:16px 14px 0}.app.compact .presets{grid-template-columns:repeat(2,minmax(0,1fr))}.app.compact .preset{padding:10px;gap:8px}.app.compact .preset small{font-size:10px}.app.compact .workspace{display:block;padding:12px 14px 16px}.app.compact .editor{max-height:none;overflow:visible}.app.compact .preview-column{position:static}.app.compact .paper-viewport{padding:18px 12px;max-height:65vh;min-height:220px}.app.compact .preview-toolbar{padding:10px;gap:6px}.app.compact .mobile-tabs{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:4px;margin:16px 14px 0;background:#e7ece3;border-radius:10px}.app.compact .mobile-tabs button{border:0;background:transparent;min-height:36px;color:#6b786e}.app.compact .mobile-tabs button[aria-selected=true]{background:white;box-shadow:0 1px 4px #0000000d;color:var(--ink)}.app.compact[data-panel=edit] .preview-column{display:none}.app.compact[data-panel=preview] .editor{display:none}.app.compact .mobile-preview-button{display:block;width:calc(100% - 36px);margin:16px 18px}.app.compact .brand-note{font-size:9px}.app.compact .subhead{max-width:210px;font-size:11px}.app.narrow .font-badge{display:none}.app.narrow .header{padding:16px 14px}.app.narrow .presets-wrap{padding:12px 10px 0}.app.narrow .workspace{padding:10px}.app.narrow .preset svg{display:none}.app.narrow .preset{padding:9px}.app.narrow .preview-toolbar{align-items:flex-start}.app.narrow .preview-title{font-size:11px}.app.narrow .live-tag{display:none}\\n@media(prefers-reduced-motion:reduce){*{animation:none!important;scroll-behavior:auto!important}}\\n@media print{.app{display:none}}\\n\";\n  const UI_HTML = \"<div class=\\\"app\\\" data-panel=\\\"edit\\\" lang=\\\"ja\\\">\\n  <header class=\\\"header\\\">\\n    <div class=\\\"brand\\\"><div class=\\\"brand-mark\\\" aria-hidden=\\\"true\\\"><svg viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 20H4v-8L16 3l5 5-9 12Z\\\"\/><path d=\\\"m4 20 8-8m4-9 5 5\\\"\/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"1.8\\\"\/><\/svg><\/div><div><div class=\\\"eyebrow\\\">WRITE \u00b7 PRACTICE \u00b7 CREATE<\/div><h2>Cursive Studio<\/h2><p class=\\\"subhead\\\">\u7b46\u8a18\u4f53\u3092\u3001\u5b66\u3073\u306b\u3082\u3001\u30c7\u30b6\u30a4\u30f3\u306b\u3082\u3002<\/p><\/div><\/div>\\n    <div id=\\\"fontBadge\\\" class=\\\"font-badge\\\" data-state=\\\"loading\\\" role=\\\"status\\\"><span class=\\\"dot\\\"><\/span><span class=\\\"badge-prefix\\\">FONT<\/span><span id=\\\"fontBadgeText\\\">\u8aad\u307f\u8fbc\u307f\u4e2d<\/span><\/div>\\n  <\/header>\\n  <div class=\\\"presets-wrap\\\"><p class=\\\"section-label\\\">\u7528\u9014\u304b\u3089\u30b9\u30bf\u30fc\u30c8<\/p><nav class=\\\"presets\\\" aria-label=\\\"\u7528\u9014\u30d7\u30ea\u30bb\u30c3\u30c8\\\">\\n    <button type=\\\"button\\\" class=\\\"preset\\\" data-preset=\\\"notebook\\\" aria-pressed=\\\"true\\\"><svg viewBox=\\\"0 0 24 24\\\"><rect x=\\\"5\\\" y=\\\"3\\\" width=\\\"15\\\" height=\\\"18\\\" rx=\\\"2\\\"\/><path d=\\\"M9 3v18M3 7h4M3 12h4M3 17h4M12 8h5M12 12h5\\\"\/><\/svg><span><strong>\u30ce\u30fc\u30c8<\/strong><small>\u30d5\u30e9\u30f3\u30b9\u5f0f\u306e4\u5206\u5272\u7f6b\u7dda<\/small><\/span><\/button>\\n    <button type=\\\"button\\\" class=\\\"preset\\\" data-preset=\\\"practice\\\" aria-pressed=\\\"false\\\"><svg viewBox=\\\"0 0 24 24\\\"><path d=\\\"m14 4 6 6M4 20l4-1L20 7l-3-3L5 16l-1 4Z\\\"\/><path d=\\\"M11 20h2m3 0h2m3 0h1\\\"\/><\/svg><span><strong>\u306a\u305e\u308a\u66f8\u304d<\/strong><small>\u304a\u624b\u672c\u30fb\u8584\u5b57\u30fb\u7df4\u7fd2\u884c<\/small><\/span><\/button>\\n    <button type=\\\"button\\\" class=\\\"preset\\\" data-preset=\\\"worksheet\\\" aria-pressed=\\\"false\\\"><svg viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6 3h9l4 4v14H6V3Zm9 0v5h4M9 12h7M9 16h7\\\"\/><\/svg><span><strong>\u6559\u6750\u5370\u5237<\/strong><small>A4\u7528\u7d19\u30fb\u540d\u524d\uff0f\u65e5\u4ed8\u6b04<\/small><\/span><\/button>\\n    <button type=\\\"button\\\" class=\\\"preset\\\" data-preset=\\\"lettering\\\" aria-pressed=\\\"false\\\"><svg viewBox=\\\"0 0 24 24\\\"><path d=\\\"m5 19 7-15 7 15M8 13h8M3 21h18\\\"\/><\/svg><span><strong>\u6587\u5b57\u753b\u50cf<\/strong><small>\u80cc\u666f\u900f\u904e\u30fb\u30ab\u30fc\u30c9\u30fb\u7d20\u6750<\/small><\/span><\/button>\\n  <\/nav><\/div>\\n  <div class=\\\"mobile-tabs\\\" role=\\\"tablist\\\" aria-label=\\\"\u4f5c\u696d\u30d1\u30cd\u30eb\\\"><button id=\\\"editTab\\\" type=\\\"button\\\" role=\\\"tab\\\" data-panel=\\\"edit\\\" aria-selected=\\\"true\\\" aria-controls=\\\"editPanel\\\">1. \u7de8\u96c6\u3059\u308b<\/button><button id=\\\"previewTab\\\" type=\\\"button\\\" role=\\\"tab\\\" data-panel=\\\"preview\\\" aria-selected=\\\"false\\\" aria-controls=\\\"previewPanel\\\" tabindex=\\\"-1\\\">2. \u30d7\u30ec\u30d3\u30e5\u30fc\u30fb\u4fdd\u5b58<\/button><\/div>\\n  <div class=\\\"workspace\\\">\\n    <aside class=\\\"editor\\\" id=\\\"editPanel\\\" aria-label=\\\"\u6587\u5b57\u3068\u7528\u7d19\u306e\u8a2d\u5b9a\\\">\\n      <fieldset class=\\\"fields\\\" id=\\\"fields\\\"><legend class=\\\"sr-only\\\">\u4f5c\u6210\u8a2d\u5b9a<\/legend>\\n        <section class=\\\"section\\\">\\n          <div class=\\\"label-row\\\"><label for=\\\"text\\\">\u30c6\u30ad\u30b9\u30c8<\/label><span id=\\\"counter\\\" class=\\\"counter\\\">0\u6587\u5b57<\/span><\/div>\\n          <textarea id=\\\"text\\\" data-setting=\\\"text\\\" rows=\\\"5\\\" maxlength=\\\"12000\\\" lang=\\\"fr\\\" spellcheck=\\\"false\\\" placeholder=\\\"\u30d5\u30e9\u30f3\u30b9\u8a9e\u30fb\u82f1\u8a9e\u306a\u3069\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\\\" aria-describedby=\\\"textHint\\\"><\/textarea>\\n          <div class=\\\"input-actions\\\"><button type=\\\"button\\\" class=\\\"quiet small\\\" data-action=\\\"copy-text\\\">\u539f\u6587\u30b3\u30d4\u30fc<\/button><div><button id=\\\"undoText\\\" type=\\\"button\\\" class=\\\"quiet small\\\" data-action=\\\"undo-text\\\" disabled>\u5143\u306b\u623b\u3059<\/button><button type=\\\"button\\\" class=\\\"quiet small\\\" data-action=\\\"clear-text\\\">\u6d88\u53bb<\/button><\/div><\/div>\\n          <div class=\\\"accent-row\\\" aria-label=\\\"\u7279\u6b8a\u6587\u5b57\u3092\u633f\u5165\\\"><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\"\u00e9\\\">\u00e9<\/button><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\"\u00e8\\\">\u00e8<\/button><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\"\u00ea\\\">\u00ea<\/button><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\"\u00e0\\\">\u00e0<\/button><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\"\u00e2\\\">\u00e2<\/button><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\"\u00e7\\\">\u00e7<\/button><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\"\u00f9\\\">\u00f9<\/button><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\"\u0153\\\">\u0153<\/button><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\"\u00ab \\\">\u00ab<\/button><button type=\\\"button\\\" class=\\\"accent\\\" data-char=\\\" \u00bb\\\">\u00bb<\/button><\/div>\\n          <div class=\\\"example-row\\\"><label for=\\\"example\\\" class=\\\"sr-only\\\">\u4f8b\u6587\u306e\u7a2e\u985e<\/label><select id=\\\"example\\\"><option value=\\\"greeting\\\">\u30d5\u30e9\u30f3\u30b9\u8a9e\u306e\u3042\u3044\u3055\u3064<\/option><option value=\\\"alphabet\\\">\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8<\/option><option value=\\\"accents\\\">\u30a2\u30af\u30bb\u30f3\u30c8\u4ed8\u304d\u6587\u5b57<\/option><option value=\\\"english\\\">\u82f1\u8a9e\u306e\u7df4\u7fd2\u6587<\/option><option value=\\\"names\\\">\u540d\u524d\u30fb\u77ed\u3044\u30e1\u30c3\u30bb\u30fc\u30b8<\/option><\/select><button type=\\\"button\\\" class=\\\"small\\\" data-action=\\\"example\\\">\u4f8b\u6587\u3092\u5165\u308c\u308b<\/button><\/div>\\n          <p class=\\\"helper\\\" id=\\\"textHint\\\">\u6539\u884c\u30fb\u7a7a\u884c\u3092\u53cd\u6620\u3002\u9577\u3044\u6587\u306f\u7528\u7d19\u5e45\u306b\u5408\u308f\u305b\u3066\u6298\u308a\u8fd4\u3057\u307e\u3059\u3002<\/p>\\n        <\/section>\\n        <section class=\\\"section\\\">\\n          <label class=\\\"field\\\"><span>\u4f7f\u7528\u3059\u308b\u30d5\u30a9\u30f3\u30c8<\/span><select id=\\\"fontMode\\\" data-setting=\\\"fontMode\\\"><option value=\\\"url\\\">Graphecrit \/ \u6307\u5b9aURL<\/option><option value=\\\"local\\\">\u624b\u5143\u306e\u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30a4\u30eb<\/option><option value=\\\"system\\\">\u7aef\u672b\u306e\u7b46\u8a18\u4f53\uff08\u7c21\u6613\uff09<\/option><\/select><\/label>\\n          <div id=\\\"urlControls\\\"><div class=\\\"url-row\\\"><label class=\\\"sr-only\\\" for=\\\"fontUrl\\\">\u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30a4\u30ebURL<\/label><input id=\\\"fontUrl\\\" type=\\\"text\\\" data-setting=\\\"fontUrl\\\" maxlength=\\\"2048\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" placeholder=\\\"\/wp-content\/uploads\/\u2026\/graphecrit.otf\\\"><button type=\\\"button\\\" data-action=\\\"load-font\\\">\u8aad\u307f\u8fbc\u3080<\/button><\/div><\/div>\\n          <div id=\\\"localControls\\\" hidden><label class=\\\"file-label\\\">\u30d5\u30a9\u30f3\u30c8\u3092\u9078\u629e\uff08OTF \/ TTF \/ WOFF \/ WOFF2\uff09<input id=\\\"fontFile\\\" type=\\\"file\\\" accept=\\\".otf,.ttf,.woff,.woff2\\\"><\/label><p class=\\\"helper\\\">\u30d5\u30a1\u30a4\u30eb\u306f\u9001\u4fe1\u3057\u307e\u305b\u3093\u3002\u30da\u30fc\u30b8\u3092\u958b\u304d\u76f4\u3059\u3068\u518d\u9078\u629e\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p><\/div>\\n          <p id=\\\"fontMessage\\\" class=\\\"font-message\\\" data-state=\\\"loading\\\" role=\\\"status\\\">\u30d5\u30a9\u30f3\u30c8\u3092\u78ba\u8a8d\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\\n        <\/section>\\n        <details open><summary>\u7528\u7d19\u30fb\u7f6b\u7dda<\/summary><div class=\\\"detail-body\\\">\\n          <label class=\\\"field\\\"><span>\u7528\u7d19\u30b5\u30a4\u30ba<\/span><select id=\\\"paper\\\" data-setting=\\\"paper\\\"><option value=\\\"auto\\\">\u753b\u50cf\u7528\uff1a\u9ad8\u3055\u3092\u81ea\u52d5\u8abf\u6574<\/option><option value=\\\"a4\\\">A4 \u7e26<\/option><option value=\\\"a4landscape\\\">A4 \u6a2a<\/option><option value=\\\"letter\\\">US Letter \u7e26<\/option><\/select><\/label>\\n          <label class=\\\"field\\\" id=\\\"widthField\\\"><span class=\\\"range-head\\\"><span>\u753b\u50cf\u306e\u6a2a\u5e45<\/span><output data-output=\\\"width\\\"><\/output><\/span><input id=\\\"width\\\" type=\\\"range\\\" data-setting=\\\"width\\\" min=\\\"400\\\" max=\\\"1200\\\" step=\\\"20\\\"><\/label>\\n          <div class=\\\"two-col\\\"><label class=\\\"field\\\"><span>\u7f6b\u7dda\u306e\u7a2e\u985e<\/span><select id=\\\"grid\\\" data-setting=\\\"grid\\\"><option value=\\\"french\\\">\u30d5\u30e9\u30f3\u30b9\u5f0f4\u5206\u5272<\/option><option value=\\\"english\\\">\u82f1\u8a9e\u7df4\u7fd2\u7f6b<\/option><option value=\\\"ruled\\\">\u6a2a\u7f6b\u7dda<\/option><option value=\\\"square\\\">\u65b9\u773c<\/option><option value=\\\"dots\\\">\u30c9\u30c3\u30c8<\/option><option value=\\\"none\\\">\u306a\u3057<\/option><\/select><\/label><label class=\\\"field\\\"><span>\u6587\u5b57\u306e\u914d\u7f6e<\/span><select id=\\\"align\\\" data-setting=\\\"align\\\"><option value=\\\"left\\\">\u5de6\u63c3\u3048<\/option><option value=\\\"center\\\">\u4e2d\u592e\u63c3\u3048<\/option><option value=\\\"right\\\">\u53f3\u63c3\u3048<\/option><\/select><\/label><\/div>\\n          <label class=\\\"field\\\"><span class=\\\"range-head\\\"><span>\u4f59\u767d<\/span><output data-output=\\\"margin\\\"><\/output><\/span><input id=\\\"margin\\\" type=\\\"range\\\" data-setting=\\\"margin\\\" min=\\\"16\\\" max=\\\"120\\\" step=\\\"2\\\"><\/label>\\n          <div class=\\\"two-col\\\"><label class=\\\"color-field\\\"><span>\u7528\u7d19<\/span><input id=\\\"paperColor\\\" type=\\\"color\\\" data-setting=\\\"paperColor\\\" aria-label=\\\"\u7528\u7d19\u306e\u8272\\\"><\/label><label class=\\\"color-field\\\"><span>\u7f6b\u7dda<\/span><input id=\\\"gridColor\\\" type=\\\"color\\\" data-setting=\\\"gridColor\\\" aria-label=\\\"\u7f6b\u7dda\u306e\u8272\\\"><\/label><\/div>\\n          <label class=\\\"check\\\"><input id=\\\"transparent\\\" type=\\\"checkbox\\\" data-setting=\\\"transparent\\\"><span>\u80cc\u666f\u3092\u900f\u904e\u3059\u308b\uff08PNG\uff09<\/span><\/label>\\n          <label class=\\\"check\\\"><input id=\\\"marginLine\\\" type=\\\"checkbox\\\" data-setting=\\\"marginLine\\\"><span>\u5de6\u5074\u306e\u30de\u30fc\u30b8\u30f3\u7dda\u3092\u8868\u793a<\/span><\/label>\\n          <label class=\\\"field\\\"><span class=\\\"range-head\\\"><span>\u7f6b\u7dda\u306e\u6fc3\u3055<\/span><output data-output=\\\"guideOpacity\\\"><\/output><\/span><input id=\\\"guideOpacity\\\" type=\\\"range\\\" data-setting=\\\"guideOpacity\\\" min=\\\"5\\\" max=\\\"100\\\"><\/label>\\n          <p class=\\\"helper\\\">\u900f\u904e\u6642\u3082\u7f6b\u7dda\u306f\u6b8b\u308a\u307e\u3059\u3002\u6587\u5b57\u3060\u3051\u306b\u3059\u308b\u5834\u5408\u306f\u300c\u7f6b\u7dda\u306a\u3057\u300d\u3092\u9078\u3093\u3067\u304f\u3060\u3055\u3044\u3002<\/p>\\n        <\/div><\/details>\\n        <details><summary>\u6587\u5b57\u306e\u898b\u305f\u76ee\u30fb\u7e26\u4f4d\u7f6e<\/summary><div class=\\\"detail-body\\\">\\n          <label class=\\\"field\\\"><span class=\\\"range-head\\\"><span>\u6587\u5b57\u30b5\u30a4\u30ba<\/span><output data-output=\\\"fontSize\\\"><\/output><\/span><input id=\\\"fontSize\\\" type=\\\"range\\\" data-setting=\\\"fontSize\\\" min=\\\"20\\\" max=\\\"160\\\" step=\\\"2\\\"><\/label>\\n          <label class=\\\"field\\\"><span class=\\\"range-head\\\"><span>\u884c\u306e\u9593\u9694<\/span><output data-output=\\\"lineHeight\\\"><\/output><\/span><input id=\\\"lineHeight\\\" type=\\\"range\\\" data-setting=\\\"lineHeight\\\" min=\\\"28\\\" max=\\\"220\\\" step=\\\"2\\\"><\/label>\\n          <label class=\\\"field\\\"><span class=\\\"range-head\\\"><span>\u7f6b\u7dda\u306b\u5bfe\u3059\u308b\u4e0a\u4e0b\u8abf\u6574<\/span><output data-output=\\\"baseline\\\"><\/output><\/span><input id=\\\"baseline\\\" type=\\\"range\\\" data-setting=\\\"baseline\\\" min=\\\"-40\\\" max=\\\"40\\\" step=\\\"1\\\"><\/label>\\n          <p class=\\\"helper\\\">\u30de\u30a4\u30ca\u30b9\u3067\u4e0a\u3078\u3001\u30d7\u30e9\u30b9\u3067\u4e0b\u3078\u3002\u8868\u793a\u30fbPNG\u30fb\u5370\u5237\u3059\u3079\u3066\u306b\u540c\u3058\u8abf\u6574\u3092\u9069\u7528\u3057\u307e\u3059\u3002<\/p>\\n          <label class=\\\"color-field\\\" style=\\\"margin-top:12px\\\"><span>\u6587\u5b57\u8272<\/span><input id=\\\"ink\\\" type=\\\"color\\\" data-setting=\\\"ink\\\" aria-label=\\\"\u6587\u5b57\u8272\\\"><\/label>\\n          <label class=\\\"field\\\" style=\\\"margin-top:12px\\\"><span class=\\\"range-head\\\"><span>\u901a\u5e38\u6587\u5b57\u306e\u6fc3\u3055<\/span><output data-output=\\\"opacity\\\"><\/output><\/span><input id=\\\"opacity\\\" type=\\\"range\\\" data-setting=\\\"opacity\\\" min=\\\"10\\\" max=\\\"100\\\"><\/label>\\n          <p class=\\\"helper\\\">\u6587\u5b57\u306e\u3064\u306a\u304c\u308a\u3092\u4fdd\u3064\u305f\u3081\u3001\u5b57\u9593\u306f\u30d5\u30a9\u30f3\u30c8\u672c\u6765\u306e\u8a2d\u5b9a\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\\n        <\/div><\/details>\\n        <details><summary>\u306a\u305e\u308a\u66f8\u304d\u30fb\u7df4\u7fd2\u884c<\/summary><div class=\\\"detail-body\\\">\\n          <label class=\\\"field\\\"><span>\u8868\u793a\u30e2\u30fc\u30c9<\/span><select id=\\\"mode\\\" data-setting=\\\"mode\\\"><option value=\\\"normal\\\">\u901a\u5e38\u306e\u304a\u624b\u672c<\/option><option value=\\\"trace\\\">\u3059\u3079\u3066\u8584\u5b57\u3067\u306a\u305e\u308a\u66f8\u304d<\/option><option value=\\\"practice\\\">\u304a\u624b\u672c \u2192 \u8584\u5b57 \u2192 \u7a7a\u767d\u884c<\/option><\/select><\/label>\\n          <label class=\\\"field\\\"><span class=\\\"range-head\\\"><span>\u306a\u305e\u308a\u6587\u5b57\u306e\u6fc3\u3055<\/span><output data-output=\\\"traceOpacity\\\"><\/output><\/span><input id=\\\"traceOpacity\\\" type=\\\"range\\\" data-setting=\\\"traceOpacity\\\" min=\\\"5\\\" max=\\\"70\\\"><\/label>\\n          <div id=\\\"practiceControls\\\" class=\\\"two-col\\\"><label class=\\\"field\\\"><span>\u8584\u5b57\u306e\u7e70\u308a\u8fd4\u3057<\/span><select id=\\\"traceRows\\\" data-setting=\\\"traceRows\\\"><option value=\\\"0\\\">\u306a\u3057<\/option><option value=\\\"1\\\">1\u884c<\/option><option value=\\\"2\\\">2\u884c<\/option><option value=\\\"3\\\">3\u884c<\/option><\/select><\/label><label class=\\\"field\\\"><span>\u7a7a\u767d\u306e\u7df4\u7fd2\u884c<\/span><select id=\\\"blankRows\\\" data-setting=\\\"blankRows\\\"><option value=\\\"0\\\">\u306a\u3057<\/option><option value=\\\"1\\\">1\u884c<\/option><option value=\\\"2\\\">2\u884c<\/option><option value=\\\"3\\\">3\u884c<\/option><option value=\\\"4\\\">4\u884c<\/option><\/select><\/label><\/div>\\n          <p class=\\\"helper\\\">\u6298\u308a\u8fd4\u3057\u5f8c\u306e\u5404\u884c\u306e\u4e0b\u306b\u7df4\u7fd2\u884c\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u7b46\u9806\u8868\u793a\u30fb\u70b9\u7dda\u6587\u5b57\u3078\u306e\u5909\u63db\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002<\/p>\\n        <\/div><\/details>\\n        <details><summary>\u6559\u6750\u306e\u898b\u51fa\u3057\u30fb\u30da\u30fc\u30b8\u756a\u53f7<\/summary><div class=\\\"detail-body\\\">\\n          <label class=\\\"field\\\"><span>\u30bf\u30a4\u30c8\u30eb\uff08\u4efb\u610f\uff09<\/span><input id=\\\"title\\\" data-setting=\\\"title\\\" type=\\\"text\\\" maxlength=\\\"100\\\" placeholder=\\\"\u4f8b\uff1a\u30d5\u30e9\u30f3\u30b9\u8a9e \u7b46\u8a18\u4f53\u306e\u7df4\u7fd2\\\"><\/label>\\n          <label class=\\\"check\\\"><input id=\\\"nameDate\\\" data-setting=\\\"nameDate\\\" type=\\\"checkbox\\\"><span>\u540d\u524d\u30fb\u65e5\u4ed8\u306e\u8a18\u5165\u6b04<\/span><\/label>\\n          <label class=\\\"check\\\"><input id=\\\"pageNumbers\\\" data-setting=\\\"pageNumbers\\\" type=\\\"checkbox\\\"><span>\u30da\u30fc\u30b8\u756a\u53f7<\/span><\/label>\\n        <\/div><\/details>\\n        <details><summary>\u4fdd\u5b58\u30fb\u8a2d\u5b9a\u306e\u6301\u3061\u904b\u3073<\/summary><div class=\\\"detail-body\\\">\\n          <label class=\\\"check\\\"><input id=\\\"autosave\\\" data-setting=\\\"autosave\\\" type=\\\"checkbox\\\"><span>\u672c\u6587\u3068\u8a2d\u5b9a\u3092\u3053\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u306b\u81ea\u52d5\u4fdd\u5b58<\/span><\/label>\\n          <p class=\\\"helper\\\">\u5171\u6709\u7aef\u672b\u3067\u306f\u30aa\u30d5\u3092\u63a8\u5968\u3002\u30aa\u30d5\u306b\u3059\u308b\u3068\u3001\u3053\u306e\u30c4\u30fc\u30eb\u306e\u4fdd\u5b58\u6e08\u307f\u30c7\u30fc\u30bf\u3082\u524a\u9664\u3057\u307e\u3059\u3002<\/p>\\n          <div class=\\\"settings-actions\\\" style=\\\"margin-top:12px\\\"><button class=\\\"small\\\" type=\\\"button\\\" data-action=\\\"save-project\\\">\u8a2d\u5b9a\u30fb\u672c\u6587\u3092\u66f8\u304d\u51fa\u3059<\/button><button class=\\\"small\\\" type=\\\"button\\\" data-action=\\\"import-project\\\">\u8a2d\u5b9a\u3092\u8aad\u307f\u8fbc\u3080<\/button><\/div><input id=\\\"projectFile\\\" type=\\\"file\\\" accept=\\\".json,application\/json\\\" hidden>\\n          <div class=\\\"settings-actions\\\" style=\\\"margin-top:10px\\\"><button class=\\\"quiet small\\\" type=\\\"button\\\" data-action=\\\"reset-style\\\">\u898b\u305f\u76ee\u3092\u521d\u671f\u5316<\/button><\/div>\\n          <p class=\\\"helper\\\">JSON\u306b\u672c\u6587\u304c\u542b\u307e\u308c\u307e\u3059\u3002\u8aad\u307f\u8fbc\u307f\u6642\u306f\u73fe\u5728\u306e\u672c\u6587\u3068\u8a2d\u5b9a\u304c\u7f6e\u304d\u63db\u308f\u308a\u307e\u3059\u3002\u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30a4\u30eb\u306f\u542b\u307f\u307e\u305b\u3093\u3002<\/p>\\n        <\/div><\/details>\\n        <button type=\\\"button\\\" class=\\\"primary mobile-preview-button\\\" data-action=\\\"show-preview\\\">\u30d7\u30ec\u30d3\u30e5\u30fc\u30fb\u4fdd\u5b58\u3078 \u2192<\/button>\\n      <\/fieldset>\\n      <p class=\\\"privacy\\\">\u672c\u30c4\u30fc\u30eb\u306f\u5165\u529b\u5185\u5bb9\u3092\u9001\u4fe1\u3057\u307e\u305b\u3093\u3002\u6307\u5b9aURL\u306e\u30d5\u30a9\u30f3\u30c8\u53d6\u5f97\u6642\u306e\u307f\u901a\u4fe1\u3057\u307e\u3059\u3002\u6b27\u6587\u7b46\u8a18\u4f53\u7528\u306e\u305f\u3081\u3001\u65e5\u672c\u8a9e\u306a\u3069\u306f\u5bfe\u5fdc\u3059\u308b\u4ee3\u66ff\u30d5\u30a9\u30f3\u30c8\u3067\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\\n    <\/aside>\\n    <section class=\\\"preview-column\\\" id=\\\"previewPanel\\\" aria-label=\\\"\u30d7\u30ec\u30d3\u30e5\u30fc\u3068\u66f8\u304d\u51fa\u3057\\\">\\n      <div class=\\\"preview-card\\\">\\n        <div class=\\\"preview-toolbar\\\"><div class=\\\"preview-title\\\">\u4ed5\u4e0a\u304c\u308a\u30d7\u30ec\u30d3\u30e5\u30fc <span class=\\\"live-tag\\\">LIVE<\/span><\/div><label class=\\\"zoom\\\" for=\\\"zoom\\\">\u8868\u793a\u500d\u7387 <select id=\\\"zoom\\\"><option value=\\\"fit\\\">\u753b\u9762\u306b\u5408\u308f\u305b\u308b<\/option><option value=\\\"0.75\\\">75%<\/option><option value=\\\"1\\\">100%<\/option><option value=\\\"1.5\\\">150%<\/option><\/select><\/label><\/div>\\n        <div class=\\\"paper-viewport\\\" id=\\\"viewport\\\"><div class=\\\"paper\\\" id=\\\"paperFrame\\\"><canvas id=\\\"preview\\\" role=\\\"img\\\" aria-label=\\\"\u7b46\u8a18\u4f53\u306e\u30d7\u30ec\u30d3\u30e5\u30fc\\\"><\/canvas><\/div><\/div>\\n        <div class=\\\"preview-footer\\\"><span id=\\\"geometry\\\" class=\\\"geometry\\\">\u6e96\u5099\u4e2d<\/span><div class=\\\"pager\\\"><button type=\\\"button\\\" id=\\\"prevPage\\\" data-action=\\\"prev\\\" aria-label=\\\"\u524d\u306e\u30da\u30fc\u30b8\\\">\u2039<\/button><span id=\\\"pageLabel\\\" aria-live=\\\"polite\\\">1 \/ 1<\/span><button type=\\\"button\\\" id=\\\"nextPage\\\" data-action=\\\"next\\\" aria-label=\\\"\u6b21\u306e\u30da\u30fc\u30b8\\\">\u203a<\/button><\/div><\/div>\\n      <\/div>\\n      <p id=\\\"layoutWarning\\\" class=\\\"preview-warning\\\" hidden><\/p>\\n      <p id=\\\"layoutError\\\" class=\\\"preview-warning preview-error\\\" role=\\\"alert\\\" hidden><\/p>\\n      <div class=\\\"export-card\\\">\\n        <div class=\\\"export-header\\\"><strong>\u753b\u50cf\u30fb\u5370\u5237<\/strong><label for=\\\"dpi\\\" class=\\\"sr-only\\\">PNG\u51fa\u529b\u89e3\u50cf\u5ea6<\/label><select id=\\\"dpi\\\" data-setting=\\\"dpi\\\"><option value=\\\"96\\\">96 dpi \u00b7 \u8efd\u91cf<\/option><option value=\\\"150\\\">150 dpi \u00b7 \u6a19\u6e96<\/option><option value=\\\"300\\\">300 dpi \u00b7 \u9ad8\u7cbe\u7d30<\/option><\/select><\/div>\\n        <div class=\\\"export-actions\\\"><button type=\\\"button\\\" class=\\\"primary\\\" id=\\\"exportPng\\\" data-export data-action=\\\"png\\\" disabled><svg viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 3v12m-4-4 4 4 4-4M4 16v5h16v-5\\\"\/><\/svg>\u3053\u306e\u30da\u30fc\u30b8\u3092PNG\u306b<\/button><button type=\\\"button\\\" id=\\\"exportZip\\\" data-export data-action=\\\"zip\\\" disabled>\u5168\u30da\u30fc\u30b8\u3092ZIP\u306b<\/button><button type=\\\"button\\\" id=\\\"exportPrint\\\" data-export data-action=\\\"print\\\" disabled><svg viewBox=\\\"0 0 24 24\\\"><path d=\\\"M7 8V3h10v5M7 17H4V9h16v8h-3M7 14h10v7H7Z\\\"\/><\/svg>\u5370\u5237 \/ PDF<\/button><\/div>\\n        <label class=\\\"export-bottom\\\" for=\\\"filename\\\">\u30d5\u30a1\u30a4\u30eb\u540d<input id=\\\"filename\\\" data-setting=\\\"filename\\\" type=\\\"text\\\" maxlength=\\\"80\\\" placeholder=\\\"cursive-note\\\"><\/label>\\n        <p id=\\\"exportHint\\\" class=\\\"helper\\\">\u8868\u793a\u500d\u7387\u306b\u95a2\u4fc2\u306a\u304f\u3001\u9078\u3093\u3060\u89e3\u50cf\u5ea6\u3067\u66f8\u304d\u51fa\u3057\u307e\u3059\u3002<\/p>\\n        <p id=\\\"resultStatus\\\" class=\\\"result-status\\\" aria-live=\\\"polite\\\"><\/p>\\n      <\/div>\\n      <p class=\\\"brand-note\\\">Cursive Studio 2.0 \u00b7 \u3042\u306a\u305f\u306e\u8a00\u8449\u3092\u3001\u3042\u306a\u305f\u306e\u304b\u305f\u3061\u3067\u3002<\/p>\\n    <\/section>\\n  <\/div>\\n  <div id=\\\"toast\\\" class=\\\"toast\\\" role=\\\"status\\\" hidden><\/div>\\n  <dialog id=\\\"exportDialog\\\" aria-labelledby=\\\"exportDialogTitle\\\"><div class=\\\"dialog-head\\\"><h3 id=\\\"exportDialogTitle\\\">\u66f8\u304d\u51fa\u3057\u304c\u3067\u304d\u307e\u3057\u305f<\/h3><button class=\\\"quiet icon\\\" type=\\\"button\\\" data-action=\\\"close-dialog\\\" aria-label=\\\"\u9589\u3058\u308b\\\">\u2715<\/button><\/div><div class=\\\"dialog-body\\\"><p id=\\\"dialogMeta\\\" class=\\\"dialog-meta\\\"><\/p><div id=\\\"exportImageFrame\\\" class=\\\"export-image-frame\\\"><img id=\\\"exportImage\\\" alt=\\\"\u66f8\u304d\u51fa\u3057\u305f\u7b46\u8a18\u4f53\u753b\u50cf\\\"><\/div><div class=\\\"dialog-actions\\\"><a id=\\\"downloadLink\\\" class=\\\"download-link\\\" href=\\\"#\\\" download>\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58<\/a><button id=\\\"shareButton\\\" type=\\\"button\\\" data-action=\\\"share\\\" hidden>\u5171\u6709\u30fb\u5199\u771f\u306b\u4fdd\u5b58<\/button><a id=\\\"openLink\\\" class=\\\"open-link\\\" href=\\\"#\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">\u753b\u50cf\u3092\u958b\u304f<\/a><\/div><p id=\\\"dialogHint\\\" class=\\\"helper\\\">\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u3067\u4fdd\u5b58\u3067\u304d\u306a\u3044\u5834\u5408\u306f\u300c\u753b\u50cf\u3092\u958b\u304f\u300d\u304b\u3089\u753b\u50cf\u3092\u9577\u62bc\u3057\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p><\/div><\/dialog>\\n<\/div>\\n\";\n  const SAMPLES = {\n    greeting:\"Bonjour, comment \u00e7a va ?\\nJ\u2019esp\u00e8re que vous passez une bonne journ\u00e9e.\",\n    alphabet:'abcdefghijklmnopqrstuvwxyz\\nABCDEFGHIJKLMNOPQRSTUVWXYZ\\n0123456789',\n    accents:'\u00e0 \u00e2 \u00e6 \u00e7 \u00e9 \u00e8 \u00ea \u00eb \u00ee \u00ef \u00f4 \u0153 \u00f9 \u00fb \u00fc \u00ff\\n\u00c0 \u00c2 \u00c7 \u00c9 \u00c8 \u00ca \u00cb \u00ce \u00cf \u00d4 \u0152 \u00d9 \u00db \u00dc\\nL\u2019\u00e9t\u00e9 \u00e0 Paris, une tr\u00e8s belle journ\u00e9e.',\n    english:'The quick brown fox jumps over the lazy dog.\\nPractice a little, every day.',\n    names:'Bonjour, Marie !\\nMerci beaucoup.\\nAvec toute mon amiti\u00e9.'\n  };\n  const SYSTEM_FONT='\"Segoe Script\",\"Bradley Hand\",\"Brush Script MT\",cursive';\n  const tick=()=>new Promise(resolve=>setTimeout(resolve,0));\n  let instanceCount=0;\n  class CursiveStudio extends HTMLElement {\n    constructor() {\n      super();this.attachShadow({mode:'open'});this.instanceId=++instanceCount;\n      this.state=C.sanitize({});this.fontFamily=SYSTEM_FONT;this.fontState='loading';this.fontToken=0;\n      this.pageIndex=0;this.busy=false;this.doc=null;this.face=null;this.lastText=null;this.localData=null;\n      this.resultUrl=null;this.resultBlob=null;this.resultName='';this.initialized=false;\n      this.measureCanvas=document.createElement('canvas');this.measureCtx=this.measureCanvas.getContext('2d');\n    }\n    connectedCallback() {\n      if(this.initialized){window.addEventListener('pagehide',this.onPageHide);this.resizeObserver?.observe(this);this.loadFont();return;}\n      this.initialized=true;\n      const style=document.createElement('style');style.textContent=UI_CSS;\n      const template=document.createElement('template');template.innerHTML=UI_HTML; \/\/ Trusted static markup only.\n      this.shadowRoot.append(style,template.content.cloneNode(true));\n      this.r={};for(const el of this.shadowRoot.querySelectorAll('[id]'))this.r[el.id]=el;\n      this.app=this.shadowRoot.querySelector('.app');\n      const suppliedFont=this.getAttribute('font-url')||C.DEFAULT_FONT;\n      this.state=C.sanitize({fontUrl:suppliedFont});\n      this.storageKey='cursive-studio:v2:'+location.pathname+':'+(this.getAttribute('storage-key')||this.id||String(this.instanceId));\n      try{const stored=localStorage.getItem(this.storageKey);if(stored){const restored=C.readProject(stored);if(restored.autosave)this.state=restored;}}catch{ \/* Unavailable storage never blocks editing. *\/ }\n      this.shadowRoot.addEventListener('input',e=>this.handleInput(e));\n      this.shadowRoot.addEventListener('change',e=>this.handleChange(e));\n      this.shadowRoot.addEventListener('compositionstart',()=>{this.composing=true;});\n      this.shadowRoot.addEventListener('compositionend',()=>{this.composing=false;this.scheduleRender();});\n      this.shadowRoot.addEventListener('click',e=>{\n        const button=e.target.closest('button');if(!button||button.disabled)return;\n        if(button.dataset.preset){this.applyPreset(button.dataset.preset);return;}\n        if(button.dataset.char){this.insertCharacter(button.dataset.char);return;}\n        if(button.dataset.panel){this.showPanel(button.dataset.panel);return;}\n        if(button.dataset.action)Promise.resolve(this.action(button.dataset.action)).catch(err=>this.showError(err));\n      });\n      this.shadowRoot.querySelector('.mobile-tabs').addEventListener('keydown',e=>{\n        if(e.key==='ArrowLeft'||e.key==='ArrowRight'){e.preventDefault();const panel=this.app.dataset.panel==='edit'?'preview':'edit';this.showPanel(panel);this.r[panel+'Tab'].focus();}\n      });\n      this.r.exportDialog.addEventListener('click',e=>{if(e.target===this.r.exportDialog){const rect=this.r.exportDialog.getBoundingClientRect();if(e.clientX<rect.left||e.clientX>rect.right||e.clientY<rect.top||e.clientY>rect.bottom)this.r.exportDialog.close();}});\n      this.onPageHide=()=>this.saveLocal();window.addEventListener('pagehide',this.onPageHide);\n      this.resizeObserver=new ResizeObserver(()=>{\n        const width=this.getBoundingClientRect().width;\n        this.app.classList.toggle('compact',width<900);this.app.classList.toggle('narrow',width<390);\n        cancelAnimationFrame(this.resizeFrame);this.resizeFrame=requestAnimationFrame(()=>this.renderPreview());\n      });\n      this.resizeObserver.observe(this);\n      this.fillUI();this.renderNow();this.loadFont();\n    }\n    disconnectedCallback() {\n      this.saveLocal();this.resizeObserver?.disconnect();clearTimeout(this.renderTimer);clearTimeout(this.saveTimer);clearTimeout(this.toastTimer);\n      cancelAnimationFrame(this.resizeFrame);window.removeEventListener('pagehide',this.onPageHide);\n      if(this.resultUrl){URL.revokeObjectURL(this.resultUrl);this.resultUrl=null;}\n      this.fontToken++;if(this.face){document.fonts.delete(this.face);this.face=null;}\n    }\n    getState(){return C.sanitize(this.state);}\n    setState(settings){this.state=C.sanitize({...this.state,...settings});this.pageIndex=0;this.fillUI();this.clearPreset();this.renderNow();this.loadFont();this.scheduleSave();}\n    fillUI() {\n      for(const el of this.shadowRoot.querySelectorAll('[data-setting]')){const v=this.state[el.dataset.setting];if(el.type==='checkbox')el.checked=!!v;else el.value=String(v);}\n      this.updateControls();\n    }\n    updateControls() {\n      for(const el of this.shadowRoot.querySelectorAll('[data-output]')) {\n        const key=el.dataset.output;let value=this.state[key];\n        if(['opacity','guideOpacity','traceOpacity'].includes(key))value+=' %';\n        else if(key==='baseline')value=(value>0?'+':'')+value+' px';else value+=' px';\n        el.textContent=value;\n      }\n      this.r.widthField.hidden=this.state.paper!=='auto';\n      this.r.practiceControls.hidden=this.state.mode!=='practice';\n      this.r.urlControls.hidden=this.state.fontMode!=='url';this.r.localControls.hidden=this.state.fontMode!=='local';\n      this.r.paperColor.disabled=this.state.transparent;\n      this.r.counter.textContent=C.graphemes(this.state.text).length.toLocaleString('ja-JP')+'\u6587\u5b57 \/ \u6700\u592712,000';\n      this.r.undoText.disabled=this.lastText===null;\n    }\n    handleInput(e) {\n      const el=e.target,key=el.dataset.setting;if(!key||this.busy)return;\n      const val=el.type==='checkbox'?el.checked:el.value;\n      this.state=C.sanitize({...this.state,[key]:val});\n      if(key==='fontUrl'){this.invalidateFont('URL\u3092\u5909\u66f4\u3057\u307e\u3057\u305f\u3002\u300c\u8aad\u307f\u8fbc\u3080\u300d\u3092\u62bc\u3057\u3066\u304f\u3060\u3055\u3044\u3002');}\n      if(!['text','filename','title','fontMode','fontUrl','autosave','dpi'].includes(key))this.clearPreset();\n      this.updateControls();\n      if(key==='autosave'){if(!this.state.autosave)this.clearLocal();else this.saveLocal();}\n      else this.scheduleSave();\n      if(key!=='fontMode'&&!this.composing)this.scheduleRender();\n    }\n    handleChange(e) {\n      const el=e.target;\n      if(el.id==='zoom'){this.renderPreview();return;}\n      if(el.id==='fontFile'){this.chooseLocalFont(el.files?.[0]);return;}\n      if(el.id==='projectFile'){this.importFile(el.files?.[0]);el.value='';return;}\n      if(el.dataset.setting==='fontMode'){this.state=C.sanitize({...this.state,fontMode:el.value});this.fillUI();this.loadFont();this.scheduleSave();}\n    }\n    scheduleRender(){clearTimeout(this.renderTimer);this.renderTimer=setTimeout(()=>this.renderNow(),100);}\n    renderNow() {\n      clearTimeout(this.renderTimer);if(!this.r.preview)return false;\n      try {\n        this.doc=C.layout(this.measureCtx,this.state,this.fontFamily);this.pageIndex=Math.min(this.pageIndex,this.doc.pages.length-1);\n        this.r.layoutError.hidden=true;this.r.paperFrame.hidden=false;\n        const warnings=[];\n        if(this.fontState!=='ready')warnings.push('\u73fe\u5728\u306f\u4ee3\u66ff\u30d5\u30a9\u30f3\u30c8\u306b\u3088\u308b\u4eee\u8868\u793a\u3067\u3059\u3002\u6307\u5b9a\u30d5\u30a9\u30f3\u30c8\u306e\u8aad\u307f\u8fbc\u307f\u5b8c\u4e86\u307e\u3067\u753b\u50cf\u4fdd\u5b58\u30fb\u5370\u5237\u306f\u3067\u304d\u307e\u305b\u3093\u3002');\n        if(this.doc.splitPractice)warnings.push('1\u7d44\u306e\u7df4\u7fd2\u884c\u304c1\u30da\u30fc\u30b8\u306b\u53ce\u307e\u3089\u306a\u3044\u305f\u3081\u3001\u7d44\u306e\u9014\u4e2d\u3067\u6539\u30da\u30fc\u30b8\u3057\u307e\u3059\u3002\u884c\u9593\u3084\u7df4\u7fd2\u884c\u6570\u3092\u6e1b\u3089\u3059\u3068\u6539\u5584\u3067\u304d\u307e\u3059\u3002');\n        if(this.doc.adjustedStep)warnings.push(`\u6587\u5b57\u540c\u58eb\u306e\u91cd\u306a\u308a\u3092\u907f\u3051\u308b\u305f\u3081\u3001\u5b9f\u969b\u306e\u884c\u9593\u3092 ${this.doc.step} px \u306b\u5e83\u3052\u3066\u3044\u307e\u3059\u3002`);\n        if(this.state.paper==='auto'&&this.doc.pages.length>1)warnings.push('\u9577\u3044\u753b\u50cf\u306b\u3088\u308b\u30e1\u30e2\u30ea\u30fc\u8ca0\u8377\u3092\u907f\u3051\u308b\u305f\u3081\u3001\u8907\u6570\u30da\u30fc\u30b8\u306b\u5206\u5272\u3057\u3066\u3044\u307e\u3059\u3002');\n        if(\/[\\u3040-\\u30ff\\u3400-\\u9fff\\uac00-\\ud7af]\/.test(this.state.text))warnings.push('\u6b27\u6587\u30d5\u30a9\u30f3\u30c8\u306b\u542b\u307e\u308c\u306a\u3044\u65e5\u672c\u8a9e\u306a\u3069\u306f\u4ee3\u66ff\u30d5\u30a9\u30f3\u30c8\u3067\u8868\u793a\u3055\u308c\u307e\u3059\u3002\u7b46\u8a18\u4f53\u3078\u306e\u5909\u63db\u306f\u3055\u308c\u307e\u305b\u3093\u3002');\n        this.r.layoutWarning.hidden=!warnings.length;this.r.layoutWarning.textContent=warnings.join(' ');\n        this.renderPreview();this.updateExportControls();\n        this.dispatchEvent(new CustomEvent('cursive-change',{detail:{pages:this.doc.pages.length},bubbles:true}));\n        return true;\n      }catch(err){this.doc=null;this.r.layoutError.textContent=err.message;this.r.layoutError.hidden=false;this.r.layoutWarning.hidden=true;const cv=this.r.preview;cv.width=1;cv.height=1;this.r.geometry.textContent='\u8a2d\u5b9a\u3092\u8abf\u6574\u3057\u3066\u304f\u3060\u3055\u3044';this.r.paperFrame.hidden=true;this.r.prevPage.disabled=true;this.r.nextPage.disabled=true;this.r.pageLabel.textContent='\u2014';this.updateExportControls();return false;}\n    }\n    renderPreview() {\n      if(!this.doc||!this.r.viewport||this.r.viewport.clientWidth===0)return;\n      const p=this.doc.pages[this.pageIndex],zoom=this.r.zoom.value;\n      const available=Math.max(120,this.r.viewport.clientWidth-(this.app.classList.contains('compact')?26:50));\n      const ratio=zoom==='fit'?Math.min(1,available\/p.width):Number(zoom);\n      const displayWidth=Math.round(p.width*ratio),dpr=window.devicePixelRatio||1;\n      const scale=Math.max(.5,Math.min(2,ratio*dpr,Math.sqrt(4000000\/(p.width*p.height))));\n      const canvas=this.r.preview;canvas.width=Math.ceil(p.width*scale);canvas.height=Math.ceil(p.height*scale);\n      this.r.paperFrame.style.width=displayWidth+'px';this.r.paperFrame.classList.toggle('checker',this.state.transparent);\n      const ctx=canvas.getContext('2d');if(!ctx)return;\n      ctx.setTransform(scale,0,0,scale,0,0);C.render(ctx,this.doc,this.pageIndex);\n      canvas.setAttribute('aria-label',`\u7b46\u8a18\u4f53 ${this.pageIndex+1}\/${this.doc.pages.length}\u30da\u30fc\u30b8\u3002`+p.rows.filter(r=>r.text).map(r=>r.text).join('\\n').slice(0,1500));\n      this.r.geometry.textContent=`${Math.round(p.width)} \u00d7 ${Math.round(p.height)} px \u00b7 ${this.state.paper==='auto'?'\u81ea\u52d5\u30b5\u30a4\u30ba':this.state.paper==='a4landscape'?'A4 \u6a2a':this.state.paper==='letter'?'US Letter':'A4 \u7e26'}`;\n      this.r.pageLabel.textContent=`${this.pageIndex+1} \/ ${this.doc.pages.length}`;\n      this.r.prevPage.disabled=this.busy||this.pageIndex===0;this.r.nextPage.disabled=this.busy||this.pageIndex>=this.doc.pages.length-1;\n    }\n    updateExportControls() {\n      const ready=this.fontState==='ready'&&!!this.doc&&!this.busy;\n      this.r.exportPrint.disabled=!ready;let imageReady=ready;\n      if(this.doc){const p=this.doc.pages[this.pageIndex];try{const dim=C.rasterSize(p.width,p.height,this.state.dpi);this.r.exportHint.textContent=`PNG\uff1a${dim.width.toLocaleString()} \u00d7 ${dim.height.toLocaleString()} px\u3002${this.state.paper==='auto'?'\u5370\u5237\u6642\u306fA4\u7e26\u306b\u518d\u914d\u7f6e\u3057\u307e\u3059\u3002':'\u5370\u5237\u3082\u9078\u629e\u3057\u305f\u7528\u7d19\u30b5\u30a4\u30ba\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002'}`;}catch(err){imageReady=false;this.r.exportHint.textContent=err.message;}}\n      this.r.exportPng.disabled=!imageReady;this.r.exportZip.disabled=!imageReady;\n    }\n    fontStatus(state,message,badge) {\n      this.fontState=state;this.r.fontMessage.dataset.state=state;this.r.fontMessage.textContent=message;\n      this.r.fontBadge.dataset.state=state;this.r.fontBadgeText.textContent=badge||(state==='ready'?'\u8aad\u307f\u8fbc\u307f\u6e08\u307f':state==='loading'?'\u8aad\u307f\u8fbc\u307f\u4e2d':'\u8981\u8a2d\u5b9a');\n      this.updateExportControls();\n    }\n    invalidateFont(message) {\n      this.fontToken++;if(this.face){document.fonts.delete(this.face);this.face=null;}this.fontFamily=SYSTEM_FONT;\n      this.fontStatus('unloaded',message,'\u672a\u8aad\u307f\u8fbc\u307f');\n    }\n    async loadFont() {\n      const token=++this.fontToken;\n      if(this.face){document.fonts.delete(this.face);this.face=null;}\n      this.fontFamily=SYSTEM_FONT;\n      if(this.state.fontMode==='system'){this.fontStatus('ready','\u7aef\u672b\u306e\u30d5\u30a9\u30f3\u30c8\u3092\u4f7f\u7528\u4e2d\u3002Graphecrit\u3068\u306f\u5b57\u5f62\u304c\u7570\u306a\u308a\u3001\u7aef\u672b\u306b\u3088\u3063\u3066\u898b\u305f\u76ee\u3082\u5909\u308f\u308a\u307e\u3059\u3002','\u7aef\u672b\u30d5\u30a9\u30f3\u30c8');this.renderNow();return;}\n      if(!window.FontFace||!document.fonts){this.fontStatus('error','\u3053\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u306f\u30d5\u30a9\u30f3\u30c8\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u305b\u3093\u3002\u65b0\u3057\u3044\u30d6\u30e9\u30a6\u30b6\u30fc\u3067\u958b\u3044\u3066\u304f\u3060\u3055\u3044\u3002');this.renderNow();return;}\n      if(this.state.fontMode==='local'&&!this.localData){this.fontStatus('unloaded','\u624b\u5143\u306e\u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002','\u30d5\u30a1\u30a4\u30eb\u672a\u9078\u629e');this.renderNow();return;}\n      this.fontStatus('loading','\u30d5\u30a9\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002');this.renderNow();\n      let timer;\n      try {\n        let source;\n        if(this.state.fontMode==='local')source=this.localData;\n        else {\n          if(!this.state.fontUrl.trim())throw new Error('\u30d5\u30a9\u30f3\u30c8URL\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n          const url=new URL(this.state.fontUrl.trim(),document.baseURI);\n          if(!['https:','http:'].includes(url.protocol))throw new Error('\u30ed\u30fc\u30ab\u30ebHTML\u3067\u306f\u300c\u624b\u5143\u306e\u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30a4\u30eb\u300d\u3092\u9078\u3076\u304b\u3001https:\/\/ \u304b\u3089\u59cb\u307e\u308b\u5b8c\u5168\u306aURL\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n          if(url.username||url.password)throw new Error('\u8a8d\u8a3c\u60c5\u5831\u3092\u542b\u307e\u306a\u3044\u30d5\u30a9\u30f3\u30c8URL\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n          if(location.protocol==='https:'&&url.protocol==='http:')throw new Error('HTTPS\u306e\u30da\u30fc\u30b8\u3067\u306f\u3001\u30d5\u30a9\u30f3\u30c8\u3082HTTPS\u3067\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n          source=`url(${JSON.stringify(url.href)})`;\n        }\n        const family=`CSFont-${this.instanceId}-${token}`,face=new FontFace(family,source,{style:'normal',weight:'400'});\n        await Promise.race([face.load(),new Promise((_,reject)=>{timer=setTimeout(()=>reject(new Error('\u8aad\u307f\u8fbc\u307f\u304c\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u307e\u3057\u305f\u3002URL\u3084\u901a\u4fe1\u74b0\u5883\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002')),15000);})]);\n        clearTimeout(timer);if(token!==this.fontToken||!this.isConnected)return;\n        document.fonts.add(face);this.face=face;this.fontFamily=`\"${family}\"`;\n        this.fontStatus('ready',this.state.fontMode==='local'?`${this.localFontName} \u3092\u4f7f\u7528\u4e2d\u3002\u3053\u306e\u30da\u30fc\u30b8\u3092\u958b\u3044\u3066\u3044\u308b\u9593\u3060\u3051\u4fdd\u6301\u3057\u307e\u3059\u3002`:'\u6307\u5b9a\u30d5\u30a9\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u307f\u307e\u3057\u305f\u3002\u753b\u50cf\u4fdd\u5b58\u30fb\u5370\u5237\u304c\u3067\u304d\u307e\u3059\u3002',this.state.fontMode==='local'?'\u30ed\u30fc\u30ab\u30eb\u30d5\u30a9\u30f3\u30c8':'\u8aad\u307f\u8fbc\u307f\u6e08\u307f');\n      }catch(err){if(token!==this.fontToken||!this.isConnected)return;const details=err.name==='NetworkError'?'URL\u30fb\u30d5\u30a1\u30a4\u30eb\u306e\u5b58\u5728\u30fb\u4ed6\u30b5\u30a4\u30c8\u914d\u4fe1\u6642\u306eCORS\u8a2d\u5b9a\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002':err.message;this.fontStatus('error','\u30d5\u30a9\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3002'+details);}\n      finally{clearTimeout(timer);if(token===this.fontToken&&this.isConnected)this.renderNow();}\n    }\n    async chooseLocalFont(file) {\n      if(!file)return;const token=this.localFileToken=(this.localFileToken||0)+1;\n      this.localData=null;this.invalidateFont('\u30d5\u30a1\u30a4\u30eb\u3092\u78ba\u8a8d\u3057\u3066\u3044\u307e\u3059\u3002');this.renderNow();\n      try{\n        if(file.size>10*1024*1024)throw new Error('\u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30a4\u30eb\u306f10 MB\u4ee5\u4e0b\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n        if(!\/\\.(otf|ttf|woff2?)$\/i.test(file.name))throw new Error('OTF\u30fbTTF\u30fbWOFF\u30fbWOFF2\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n        const data=await file.arrayBuffer();if(token!==this.localFileToken)return;\n        this.localData=data;this.localFontName=file.name;\n        if(this.state.fontMode==='local')await this.loadFont();\n      }catch(err){this.fontStatus('error',err.message,'\u8aad\u307f\u8fbc\u307f\u5931\u6557');this.renderNow();}\n    }\n    clearPreset(){for(const btn of this.shadowRoot.querySelectorAll('[data-preset]'))btn.setAttribute('aria-pressed','false');}\n    applyPreset(key) {\n      if(this.busy||!C.PRESETS[key])return;\n      this.state=C.sanitize({...this.state,...C.PRESETS[key]});this.pageIndex=0;this.fillUI();this.clearPreset();\n      this.shadowRoot.querySelector(`[data-preset=\"${key}\"]`).setAttribute('aria-pressed','true');\n      this.renderNow();this.scheduleSave();this.toast('\u898b\u305f\u76ee\u3092\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002\u5165\u529b\u3057\u305f\u6587\u7ae0\u306f\u305d\u306e\u307e\u307e\u3067\u3059\u3002');\n    }\n    insertCharacter(char) {\n      const el=this.r.text;if(el.value.length+char.length>C.MAX_TEXT){this.toast('\u5165\u529b\u3067\u304d\u308b\u6587\u5b57\u6570\u306e\u4e0a\u9650\u3067\u3059\u3002');return;}\n      this.lastText=this.state.text;el.setRangeText(char,el.selectionStart,el.selectionEnd,'end');this.state.text=el.value;\n      el.focus();this.updateControls();this.renderNow();this.scheduleSave();\n    }\n    replaceText(text) {this.lastText=this.state.text;this.state.text=text;this.r.text.value=text;this.pageIndex=0;this.updateControls();this.renderNow();this.scheduleSave();}\n    showPanel(panel) {\n      this.app.dataset.panel=panel;\n      for(const name of ['edit','preview']){const el=this.r[name+'Tab'];el.setAttribute('aria-selected',String(name===panel));el.tabIndex=name===panel?0:-1;}\n      requestAnimationFrame(()=>this.renderPreview());\n      if(this.app.classList.contains('compact'))this.shadowRoot.querySelector('.mobile-tabs').scrollIntoView({block:'nearest',behavior:'auto'});\n    }\n    scheduleSave(){clearTimeout(this.saveTimer);this.saveTimer=setTimeout(()=>this.saveLocal(),350);}\n    saveLocal(){if(!this.initialized||!this.state.autosave)return;try{localStorage.setItem(this.storageKey,JSON.stringify(C.project(this.state)));}catch{if(!this.storageWarned){this.storageWarned=true;this.toast('\u3053\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u3067\u306f\u81ea\u52d5\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3002\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304d\u51fa\u3057\u3066\u304f\u3060\u3055\u3044\u3002');}}}\n    clearLocal(){clearTimeout(this.saveTimer);try{localStorage.removeItem(this.storageKey);this.toast('\u3053\u306e\u30c4\u30fc\u30eb\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u5185\u306e\u4fdd\u5b58\u30c7\u30fc\u30bf\u3092\u524a\u9664\u3057\u307e\u3057\u305f\u3002');}catch{this.toast('\u4fdd\u5b58\u30c7\u30fc\u30bf\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3002\u30d6\u30e9\u30a6\u30b6\u30fc\u306e\u30b5\u30a4\u30c8\u30c7\u30fc\u30bf\u8a2d\u5b9a\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002');}}\n    toast(message){if(!this.r.toast)return;clearTimeout(this.toastTimer);this.r.toast.textContent=message;this.r.toast.hidden=false;this.toastTimer=setTimeout(()=>{this.r.toast.hidden=true;},3500);}\n    showError(err){const text=err?.message||String(err);this.r.resultStatus.dataset.error='true';this.r.resultStatus.textContent=text;this.toast(text);}\n    status(text){this.r.resultStatus.dataset.error='false';this.r.resultStatus.textContent=text;}\n    setBusy(value) {\n      this.busy=value;this.app.setAttribute('aria-busy',String(value));this.r.resultStatus.classList.toggle('busy-mark',value);\n      if(value){this.disabledBefore=new Map();for(const el of this.shadowRoot.querySelectorAll('button,input,select,textarea')){this.disabledBefore.set(el,el.disabled);el.disabled=true;}}\n      else {for(const [el,disabled] of this.disabledBefore||[])el.disabled=disabled;this.disabledBefore=null;this.updateControls();this.updateExportControls();this.renderPreview();}\n    }\n    currentDocument() {if(this.fontState!=='ready')throw new Error('\u30d5\u30a9\u30f3\u30c8\u306e\u8aad\u307f\u8fbc\u307f\u3092\u5b8c\u4e86\u3057\u3066\u304f\u3060\u3055\u3044\u3002');if(!this.renderNow()||!this.doc)throw new Error('\u7528\u7d19\u30fb\u6587\u5b57\u306e\u8a2d\u5b9a\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002');return this.doc;}\n    async operation(label,fn){if(this.busy)return;this.setBusy(true);this.status(label);try{await fn();}catch(err){this.showError(err);}finally{this.setBusy(false);}}\n    async pngBytes(doc,index,dpi,{print=false}={}) {\n      const p=doc.pages[index],size=C.rasterSize(p.width,p.height,dpi),canvas=document.createElement('canvas');\n      canvas.width=size.width;canvas.height=size.height;\n      try{\n        const ctx=canvas.getContext('2d');if(!ctx)throw new Error('\u753b\u50cf\u7528\u306e\u30e1\u30e2\u30ea\u30fc\u3092\u78ba\u4fdd\u3067\u304d\u307e\u305b\u3093\u3002\u89e3\u50cf\u5ea6\u3092\u4e0b\u3052\u3066\u304f\u3060\u3055\u3044\u3002');\n        ctx.setTransform(size.scale,0,0,size.scale,0,0);C.render(ctx,doc,index,{print});\n        const blob=await new Promise((resolve,reject)=>canvas.toBlob(b=>b?resolve(b):reject(new Error('\u753b\u50cf\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u89e3\u50cf\u5ea6\u3092\u4e0b\u3052\u3066\u518d\u8a66\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002')),'image\/png'));\n        return C.pngDpi(new Uint8Array(await blob.arrayBuffer()),dpi);\n      }finally{canvas.width=1;canvas.height=1;}\n    }\n    showResult(blob,name,meta,isImage) {\n      if(this.resultUrl)URL.revokeObjectURL(this.resultUrl);\n      this.resultBlob=blob;this.resultName=name;this.resultUrl=URL.createObjectURL(blob);\n      this.r.dialogMeta.textContent=meta;this.r.downloadLink.href=this.resultUrl;this.r.downloadLink.download=name;\n      this.r.openLink.href=this.resultUrl;this.r.openLink.hidden=!isImage;\n      this.r.exportImageFrame.hidden=!isImage;\n      if(isImage)this.r.exportImage.src=this.resultUrl;else this.r.exportImage.removeAttribute('src');\n      this.r.dialogHint.textContent=isImage?'\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u3067\u4fdd\u5b58\u3067\u304d\u306a\u3044\u5834\u5408\u306f\u300c\u753b\u50cf\u3092\u958b\u304f\u300d\u304b\u3089\u753b\u50cf\u3092\u9577\u62bc\u3057\u3057\u3066\u304f\u3060\u3055\u3044\u3002':'ZIP\u3092\u4fdd\u5b58\u3057\u3066\u5c55\u958b\u3059\u308b\u3068\u3001\u30da\u30fc\u30b8\u3054\u3068\u306ePNG\u753b\u50cf\u304c\u53d6\u308a\u51fa\u305b\u307e\u3059\u3002';\n      let canShare=false;try{canShare=!!navigator.canShare?.({files:[new File([blob],name,{type:blob.type})]});}catch{}\n      this.r.shareButton.hidden=!canShare;this.r.shareButton.textContent=isImage?'\u5171\u6709\u30fb\u5199\u771f\u306b\u4fdd\u5b58':'\u30d5\u30a1\u30a4\u30eb\u3092\u5171\u6709';\n      if(!this.r.exportDialog.open)this.r.exportDialog.showModal();\n      this.status('\u66f8\u304d\u51fa\u3057\u5b8c\u4e86\u3002\u8868\u793a\u3055\u308c\u305f\u753b\u9762\u304b\u3089\u4fdd\u5b58\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n    }\n    async exportPng(){const doc=this.currentDocument(),index=this.pageIndex,dpi=this.state.dpi,name=C.filename(this.state.filename)+`-${String(index+1).padStart(2,'0')}.png`;\n      await this.operation('PNG\u753b\u50cf\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059\u3002',async()=>{const bytes=await this.pngBytes(doc,index,dpi),size=C.rasterSize(doc.pages[index].width,doc.pages[index].height,dpi);this.showResult(new Blob([bytes],{type:'image\/png'}),name,`${size.width.toLocaleString()} \u00d7 ${size.height.toLocaleString()} px \/ ${dpi} dpi \/ ${this.state.transparent?'\u80cc\u666f\u900f\u904e':'\u80cc\u666f\u3042\u308a'} \/ ${(bytes.length\/1024).toFixed(0)} KB`,true);});\n    }\n    async exportZip(){const doc=this.currentDocument(),dpi=this.state.dpi,base=C.filename(this.state.filename);if(doc.pages.length>40)throw new Error('ZIP\u66f8\u304d\u51fa\u3057\u306f\u4e00\u5ea6\u306b40\u30da\u30fc\u30b8\u307e\u3067\u3067\u3059\u3002\u672c\u6587\u3092\u5206\u3051\u3066\u304f\u3060\u3055\u3044\u3002');for(const page of doc.pages)C.rasterSize(page.width,page.height,dpi);\n      await this.operation('\u5168\u30da\u30fc\u30b8\u306e\u753b\u50cf\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059\u3002',async()=>{const files=[];let bytes=0;for(let i=0;i<doc.pages.length;i++){this.status(`${i+1} \/ ${doc.pages.length} \u30da\u30fc\u30b8\u3092\u66f8\u304d\u51fa\u3057\u3066\u3044\u307e\u3059\u3002`);const data=await this.pngBytes(doc,i,dpi);bytes+=data.length;if(bytes>80*1024*1024)throw new Error('ZIP\u306e\u753b\u50cf\u5bb9\u91cf\u304c80 MB\u3092\u8d85\u3048\u307e\u3057\u305f\u3002\u89e3\u50cf\u5ea6\u3092\u4e0b\u3052\u308b\u304b\u3001\u672c\u6587\u3092\u5206\u3051\u3066\u304f\u3060\u3055\u3044\u3002');files.push({name:`${base}-${String(i+1).padStart(3,'0')}.png`,data});await tick();}this.showResult(C.zip(files),base+'.zip',`${doc.pages.length}\u30da\u30fc\u30b8 \/ PNG \/ ${dpi} dpi`,false);});\n    }\n    async printDocument() {\n      const original=this.currentDocument(),state={...original.settings},dpi=state.dpi;\n      if(state.paper==='auto')state.paper='a4';\n      const doc=C.layout(this.measureCtx,state,this.fontFamily);\n      let pixels=0;for(const p of doc.pages){const size=C.rasterSize(p.width,p.height,dpi);pixels+=size.width*size.height;}\n      if(doc.pages.length>40||pixels>40000000)throw new Error('\u4e00\u5ea6\u306b\u5370\u5237\u3059\u308b\u30c7\u30fc\u30bf\u91cf\u304c\u591a\u3059\u304e\u307e\u3059\u3002\u89e3\u50cf\u5ea6\u3092\u4e0b\u3052\u308b\u304b\u3001\u6587\u7ae0\u3092\u5206\u3051\u3066\u304f\u3060\u3055\u3044\u3002');\n      const win=window.open('','_blank');if(!win)throw new Error('\u5370\u5237\u7528\u306e\u753b\u9762\u3092\u958b\u3051\u307e\u305b\u3093\u3002\u30d6\u30e9\u30a6\u30b6\u30fc\u3067\u30dd\u30c3\u30d7\u30a2\u30c3\u30d7\u3092\u8a31\u53ef\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n      win.opener=null;\n      const pd=win.document;pd.open();pd.write('<!doctype html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>\u7b46\u8a18\u4f53\u306e\u5370\u5237<\/title><\/head><body><\/body><\/html>');pd.close();\n      pd.title=(state.title||'\u7b46\u8a18\u4f53')+' - \u5370\u5237';\n      const pxmm=25.4\/96,w=doc.pages[0].width*pxmm,h=doc.pages[0].height*pxmm;\n      const style=pd.createElement('style');style.textContent=`*{box-sizing:border-box}body{margin:0;background:#e9ece6;font:14px\/1.6 system-ui,sans-serif;color:#273b36}.tools{padding:18px;position:sticky;top:0;background:#fff;border-bottom:1px solid #d7dfd5}.tools p{margin:8px 0 0}.tools button{font:inherit;background:#27634f;color:white;border:0;border-radius:8px;padding:10px 22px;cursor:pointer}.tools button:disabled{opacity:.5}.sheet{width:${w}mm;max-width:100%;margin:20px auto;background:white;box-shadow:0 4px 24px #0001}.sheet img{display:block;width:100%;height:auto}@page{size:${w}mm ${h}mm;margin:0}@media print{body{background:white}.tools{display:none}.sheet{width:${w}mm;height:${h}mm;max-width:none;margin:0;box-shadow:none;break-after:page;page-break-after:always}.sheet:last-child{break-after:auto;page-break-after:auto}.sheet img{width:100%;height:100%;print-color-adjust:exact;-webkit-print-color-adjust:exact}}`;pd.head.append(style);\n      const tools=pd.createElement('div');tools.className='tools';const button=pd.createElement('button');button.textContent='\u5370\u5237 \/ PDF\u306b\u4fdd\u5b58';button.disabled=true;button.addEventListener('click',()=>{win.focus();win.print();});const note=pd.createElement('p');note.textContent='\u5370\u5237\u30c7\u30fc\u30bf\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059\u3002';tools.append(button,note);pd.body.append(tools);\n      const urls=[];win.addEventListener('pagehide',()=>{for(const u of urls)URL.revokeObjectURL(u);});\n      await this.operation('\u5370\u5237\u7528\u306e\u753b\u9762\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059\u3002',async()=>{\n        try{\n          for(let i=0;i<doc.pages.length;i++){\n            if(win.closed)throw new Error('\u5370\u5237\u7528\u306e\u753b\u9762\u304c\u9589\u3058\u3089\u308c\u307e\u3057\u305f\u3002');\n            this.status(`\u5370\u5237\u7528 ${i+1} \/ ${doc.pages.length} \u30da\u30fc\u30b8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059\u3002`);\n            const data=await this.pngBytes(doc,i,dpi,{print:true}),url=URL.createObjectURL(new Blob([data],{type:'image\/png'}));urls.push(url);\n            const sheet=pd.createElement('section');sheet.className='sheet';const img=pd.createElement('img');img.alt=`${i+1}\u30da\u30fc\u30b8`;img.src=url;\n            const loaded=new Promise((resolve,reject)=>{img.onload=resolve;img.onerror=()=>reject(new Error('\u5370\u5237\u753b\u50cf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002'));});sheet.append(img);pd.body.append(sheet);await loaded;\n          }\n          button.disabled=false;note.textContent=`${doc.pages.length}\u30da\u30fc\u30b8 \/ ${state.paper==='a4landscape'?'A4 \u6a2a':state.paper==='letter'?'US Letter':'A4 \u7e26'} \/ ${dpi} dpi\u3002\u4e0a\u306e\u30dc\u30bf\u30f3\u3067\u5370\u5237\u753b\u9762\u3092\u958b\u304d\u3001PDF\u4fdd\u5b58\u3092\u9078\u629e\u3067\u304d\u307e\u3059\u3002\u5370\u5237\u8a2d\u5b9a\u306f\u7528\u7d19\u30b5\u30a4\u30ba\u3092\u5408\u308f\u305b\u3001\u4f59\u767d\u306a\u3057\u30fb\u500d\u7387100%\u30fb\u30d8\u30c3\u30c0\u30fc\u3068\u30d5\u30c3\u30bf\u30fc\u306a\u3057\u3092\u57fa\u672c\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002${original.settings.paper==='auto'?'\u753b\u50cf\u7528\u306e\u81ea\u52d5\u30b5\u30a4\u30ba\u304b\u3089A4\u7e26\u306b\u518d\u914d\u7f6e\u3057\u3066\u3044\u307e\u3059\u3002':''} \u900f\u904e\u80cc\u666f\u306f\u767d\u3068\u3057\u3066\u5370\u5237\u3055\u308c\u307e\u3059\u3002`;\n          this.status('\u5370\u5237\u7528\u306e\u753b\u9762\u3092\u958b\u304d\u307e\u3057\u305f\u3002\u305d\u3061\u3089\u306e\u300c\u5370\u5237 \/ PDF\u306b\u4fdd\u5b58\u300d\u3092\u62bc\u3057\u3066\u304f\u3060\u3055\u3044\u3002');\n        }catch(err){note.textContent=err.message;for(const u of urls)URL.revokeObjectURL(u);throw err;}\n      });\n    }\n    async importFile(file) {\n      if(!file)return;\n      try{if(file.size>200000)throw new Error('\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306f200 KB\u4ee5\u4e0b\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002');const next=C.readProject(await file.text());if(!window.confirm('\u73fe\u5728\u306e\u672c\u6587\u3068\u8a2d\u5b9a\u3092\u3001\u9078\u629e\u3057\u305f\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u5185\u5bb9\u306b\u7f6e\u304d\u63db\u3048\u307e\u3059\u304b\uff1f'))return;this.lastText=this.state.text;this.state=next;if(!this.state.autosave)this.clearLocal();this.pageIndex=0;this.fillUI();this.clearPreset();await this.loadFont();this.scheduleSave();this.toast('\u8a2d\u5b9a\u3068\u672c\u6587\u3092\u8aad\u307f\u8fbc\u307f\u307e\u3057\u305f\u3002');}catch(err){this.showError(err);}\n    }\n    async action(action) {\n      if(this.busy)return;\n      switch(action){\n        case 'load-font':await this.loadFont();break;\n        case 'clear-text':this.replaceText('');break;\n        case 'undo-text':if(this.lastText!==null){const before=this.lastText;this.replaceText(before);}break;\n        case 'example':this.replaceText(SAMPLES[this.r.example.value]||SAMPLES.greeting);break;\n        case 'copy-text':try{if(!navigator.clipboard?.writeText)throw new Error('\u30b3\u30d4\u30fc\u6a5f\u80fd\u304c\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002\u672c\u6587\u3092\u9078\u629e\u3057\u3066\u30b3\u30d4\u30fc\u3057\u3066\u304f\u3060\u3055\u3044\u3002');await navigator.clipboard.writeText(this.state.text);this.toast('\u539f\u6587\u3092\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\u3002\u7b46\u8a18\u4f53\u306e\u898b\u305f\u76ee\u3092\u6e21\u3059\u5834\u5408\u306fPNG\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002');}catch{this.r.text.focus();this.r.text.select();this.toast('\u672c\u6587\u3092\u9078\u629e\u3057\u307e\u3057\u305f\u3002\u7aef\u672b\u306e\u30b3\u30d4\u30fc\u64cd\u4f5c\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002');}break;\n        case 'show-preview':this.showPanel('preview');break;\n        case 'prev':this.pageIndex=Math.max(0,this.pageIndex-1);this.renderPreview();this.updateExportControls();break;\n        case 'next':this.pageIndex=Math.min(this.doc.pages.length-1,this.pageIndex+1);this.renderPreview();this.updateExportControls();break;\n        case 'png':await this.exportPng();break;\n        case 'zip':await this.exportZip();break;\n        case 'print':await this.printDocument();break;\n        case 'close-dialog':this.r.exportDialog.close();break;\n        case 'share':try{await navigator.share({files:[new File([this.resultBlob],this.resultName,{type:this.resultBlob.type})],title:'Cursive Studio'});}catch(err){if(err.name!=='AbortError')this.showError(new Error('\u5171\u6709\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u300c\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u300d\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002'));}break;\n        case 'save-project':{\n          const blob=new Blob([JSON.stringify(C.project(this.state),null,2)],{type:'application\/json'});\n          this.showResult(blob,C.filename(this.state.filename)+'.cursive.json','\u672c\u6587\u3068\u8a2d\u5b9a \/ \u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30a4\u30eb\u306f\u542b\u307e\u308c\u307e\u305b\u3093',false);this.r.dialogHint.textContent='\u3053\u306eJSON\u306b\u306f\u672c\u6587\u304c\u542b\u307e\u308c\u307e\u3059\u3002\u5171\u6709\u5148\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u300c\u8a2d\u5b9a\u3092\u8aad\u307f\u8fbc\u3080\u300d\u3067\u5fa9\u5143\u3067\u304d\u307e\u3059\u3002';break;\n        }\n        case 'import-project':this.r.projectFile.click();break;\n        case 'reset-style':{\n          const {text,fontMode,fontUrl,autosave,filename}=this.state;this.state=C.sanitize({text,fontMode,fontUrl,autosave,filename});this.pageIndex=0;this.fillUI();this.clearPreset();this.renderNow();this.scheduleSave();this.toast('\u898b\u305f\u76ee\u3092\u521d\u671f\u5316\u3057\u307e\u3057\u305f\u3002\u672c\u6587\u3068\u30d5\u30a9\u30f3\u30c8\u306f\u4fdd\u6301\u3057\u3066\u3044\u307e\u3059\u3002');break;\n        }\n      }\n    }\n  }\n  customElements.define('cursive-studio',CursiveStudio);\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>\u7b46\u8a18\u4f53\u30c4\u30fc\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002JavaScript\u304c\u524a\u9664\u3055\u308c\u308b\u5834\u5408\u306f\u540c\u68b1\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u7248\u3092\u5229\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5531","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u7b46\u8a18\u4f53\u30c4\u30fc\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002JavaScript\u304c\u524a\u9664\u3055\u308c\u308b\u5834\u5408\u306f\u540c\u68b1\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u7248\u3092\u5229\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"legato\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/ubun2m.com\/?p=5531\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@legato_ip4\" \/>\n\t\t<meta name=\"twitter:title\" content=\"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2 - M\u306e\u5099\u5fd8\u9332\" \/>\n\t\t<meta name=\"twitter:description\" content=\"\u7b46\u8a18\u4f53\u30c4\u30fc\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002JavaScript\u304c\u524a\u9664\u3055\u308c\u308b\u5834\u5408\u306f\u540c\u68b1\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u7248\u3092\u5229\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@legato_ip4\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531#blogposting\",\"name\":\"\\u30d5\\u30e9\\u30f3\\u30b9\\u8a9e\\u7b46\\u8a18\\u4f53\\u5909\\u63db\\u30c4\\u30fc\\u30ebv2 - M\\u306e\\u5099\\u5fd8\\u9332\",\"headline\":\"\\u30d5\\u30e9\\u30f3\\u30b9\\u8a9e\\u7b46\\u8a18\\u4f53\\u5909\\u63db\\u30c4\\u30fc\\u30ebv2\",\"author\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?author=1#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/ubun2m.com\\\/wp-content\\\/uploads\\\/2021\\\/08\\\/coollogo_com-18272444.png\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/#articleImage\",\"width\":102,\"height\":124},\"datePublished\":\"2026-09-22T15:10:21+09:00\",\"dateModified\":\"2026-09-22T15:12:30+09:00\",\"inLanguage\":\"ja\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531#webpage\"},\"articleSection\":\"\\u672a\\u5206\\u985e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ubun2m.com#listItem\",\"position\":1,\"name\":\"\\u30db\\u30fc\\u30e0\",\"item\":\"https:\\\/\\\/ubun2m.com\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?cat=1#listItem\",\"name\":\"\\u672a\\u5206\\u985e\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?cat=1#listItem\",\"position\":2,\"name\":\"\\u672a\\u5206\\u985e\",\"item\":\"https:\\\/\\\/ubun2m.com\\\/?cat=1\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531#listItem\",\"name\":\"\\u30d5\\u30e9\\u30f3\\u30b9\\u8a9e\\u7b46\\u8a18\\u4f53\\u5909\\u63db\\u30c4\\u30fc\\u30ebv2\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ubun2m.com#listItem\",\"name\":\"\\u30db\\u30fc\\u30e0\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531#listItem\",\"position\":3,\"name\":\"\\u30d5\\u30e9\\u30f3\\u30b9\\u8a9e\\u7b46\\u8a18\\u4f53\\u5909\\u63db\\u30c4\\u30fc\\u30ebv2\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?cat=1#listItem\",\"name\":\"\\u672a\\u5206\\u985e\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/#organization\",\"name\":\"Legato\\ud83c\\uddeb\\ud83c\\uddf7\\u306e\\u5099\\u5fd8\\u9332\",\"description\":\"\\u5b50\\u3069\\u3082\\u7528\\u306b\\u4f5c\\u3063\\u305fMineCraft\\u9bd6\\u306e\\u7247\\u9685\\u3067\\u904b\\u7528\\u3059\\u308b\\u30d6\\u30ed\\u30b0\\u3002\",\"url\":\"https:\\\/\\\/ubun2m.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/ubun2m.com\\\/wp-content\\\/uploads\\\/2021\\\/08\\\/coollogo_com-18272444.png\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531\\\/#organizationLogo\",\"width\":102,\"height\":124},\"image\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/twitter.com\\\/legato_ip4\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?author=1#author\",\"url\":\"https:\\\/\\\/ubun2m.com\\\/?author=1\",\"name\":\"legato\",\"sameAs\":[\"https:\\\/\\\/twitter.com\\\/legato_ip4\"]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531#webpage\",\"url\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531\",\"name\":\"\\u30d5\\u30e9\\u30f3\\u30b9\\u8a9e\\u7b46\\u8a18\\u4f53\\u5909\\u63db\\u30c4\\u30fc\\u30ebv2 - M\\u306e\\u5099\\u5fd8\\u9332\",\"description\":\"\\u7b46\\u8a18\\u4f53\\u30c4\\u30fc\\u30eb\\u3092\\u8aad\\u307f\\u8fbc\\u3093\\u3067\\u3044\\u307e\\u3059\\u3002JavaScript\\u304c\\u524a\\u9664\\u3055\\u308c\\u308b\\u5834\\u5408\\u306f\\u540c\\u68b1\\u306e\\u30d7\\u30e9\\u30b0\\u30a4\\u30f3\\u7248\\u3092\\u5229\\u7528\\u3057\\u3066\\u304f\\u3060\\u3055\\u3044\\u3002\",\"inLanguage\":\"ja\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?p=5531#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?author=1#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/?author=1#author\"},\"datePublished\":\"2026-09-22T15:10:21+09:00\",\"dateModified\":\"2026-09-22T15:12:30+09:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ubun2m.com\\\/#website\",\"url\":\"https:\\\/\\\/ubun2m.com\\\/\",\"name\":\"LEGATO\\ud83c\\uddeb\\ud83c\\uddf7\\u306e\\u5099\\u5fd8\\u9332\",\"description\":\"\\u5b50\\u3069\\u3082\\u7528\\u306b\\u4f5c\\u3063\\u305fMineCraft\\u9bd6\\u306e\\u7247\\u9685\\u3067\\u904b\\u7528\\u3059\\u308b\\u30d6\\u30ed\\u30b0\\u3002\",\"inLanguage\":\"ja\",\"publisher\":{\"@id\":\"https:\\\/\\\/ubun2m.com\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2 - M\u306e\u5099\u5fd8\u9332","description":"\u7b46\u8a18\u4f53\u30c4\u30fc\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002JavaScript\u304c\u524a\u9664\u3055\u308c\u308b\u5834\u5408\u306f\u540c\u68b1\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u7248\u3092\u5229\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002","canonical_url":"https:\/\/ubun2m.com\/?p=5531","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/ubun2m.com\/?p=5531#blogposting","name":"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2 - M\u306e\u5099\u5fd8\u9332","headline":"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2","author":{"@id":"https:\/\/ubun2m.com\/?author=1#author"},"publisher":{"@id":"https:\/\/ubun2m.com\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/ubun2m.com\/wp-content\/uploads\/2021\/08\/coollogo_com-18272444.png","@id":"https:\/\/ubun2m.com\/#articleImage","width":102,"height":124},"datePublished":"2026-09-22T15:10:21+09:00","dateModified":"2026-09-22T15:12:30+09:00","inLanguage":"ja","mainEntityOfPage":{"@id":"https:\/\/ubun2m.com\/?p=5531#webpage"},"isPartOf":{"@id":"https:\/\/ubun2m.com\/?p=5531#webpage"},"articleSection":"\u672a\u5206\u985e"},{"@type":"BreadcrumbList","@id":"https:\/\/ubun2m.com\/?p=5531#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/ubun2m.com#listItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/ubun2m.com","nextItem":{"@type":"ListItem","@id":"https:\/\/ubun2m.com\/?cat=1#listItem","name":"\u672a\u5206\u985e"}},{"@type":"ListItem","@id":"https:\/\/ubun2m.com\/?cat=1#listItem","position":2,"name":"\u672a\u5206\u985e","item":"https:\/\/ubun2m.com\/?cat=1","nextItem":{"@type":"ListItem","@id":"https:\/\/ubun2m.com\/?p=5531#listItem","name":"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2"},"previousItem":{"@type":"ListItem","@id":"https:\/\/ubun2m.com#listItem","name":"\u30db\u30fc\u30e0"}},{"@type":"ListItem","@id":"https:\/\/ubun2m.com\/?p=5531#listItem","position":3,"name":"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2","previousItem":{"@type":"ListItem","@id":"https:\/\/ubun2m.com\/?cat=1#listItem","name":"\u672a\u5206\u985e"}}]},{"@type":"Organization","@id":"https:\/\/ubun2m.com\/#organization","name":"Legato\ud83c\uddeb\ud83c\uddf7\u306e\u5099\u5fd8\u9332","description":"\u5b50\u3069\u3082\u7528\u306b\u4f5c\u3063\u305fMineCraft\u9bd6\u306e\u7247\u9685\u3067\u904b\u7528\u3059\u308b\u30d6\u30ed\u30b0\u3002","url":"https:\/\/ubun2m.com\/","logo":{"@type":"ImageObject","url":"https:\/\/ubun2m.com\/wp-content\/uploads\/2021\/08\/coollogo_com-18272444.png","@id":"https:\/\/ubun2m.com\/?p=5531\/#organizationLogo","width":102,"height":124},"image":{"@id":"https:\/\/ubun2m.com\/?p=5531\/#organizationLogo"},"sameAs":["https:\/\/twitter.com\/legato_ip4"]},{"@type":"Person","@id":"https:\/\/ubun2m.com\/?author=1#author","url":"https:\/\/ubun2m.com\/?author=1","name":"legato","sameAs":["https:\/\/twitter.com\/legato_ip4"]},{"@type":"WebPage","@id":"https:\/\/ubun2m.com\/?p=5531#webpage","url":"https:\/\/ubun2m.com\/?p=5531","name":"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2 - M\u306e\u5099\u5fd8\u9332","description":"\u7b46\u8a18\u4f53\u30c4\u30fc\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002JavaScript\u304c\u524a\u9664\u3055\u308c\u308b\u5834\u5408\u306f\u540c\u68b1\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u7248\u3092\u5229\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002","inLanguage":"ja","isPartOf":{"@id":"https:\/\/ubun2m.com\/#website"},"breadcrumb":{"@id":"https:\/\/ubun2m.com\/?p=5531#breadcrumblist"},"author":{"@id":"https:\/\/ubun2m.com\/?author=1#author"},"creator":{"@id":"https:\/\/ubun2m.com\/?author=1#author"},"datePublished":"2026-09-22T15:10:21+09:00","dateModified":"2026-09-22T15:12:30+09:00"},{"@type":"WebSite","@id":"https:\/\/ubun2m.com\/#website","url":"https:\/\/ubun2m.com\/","name":"LEGATO\ud83c\uddeb\ud83c\uddf7\u306e\u5099\u5fd8\u9332","description":"\u5b50\u3069\u3082\u7528\u306b\u4f5c\u3063\u305fMineCraft\u9bd6\u306e\u7247\u9685\u3067\u904b\u7528\u3059\u308b\u30d6\u30ed\u30b0\u3002","inLanguage":"ja","publisher":{"@id":"https:\/\/ubun2m.com\/#organization"}}]},"twitter:card":"summary_large_image","twitter:site":"@legato_ip4","twitter:title":"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2 - M\u306e\u5099\u5fd8\u9332","twitter:description":"\u7b46\u8a18\u4f53\u30c4\u30fc\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002JavaScript\u304c\u524a\u9664\u3055\u308c\u308b\u5834\u5408\u306f\u540c\u68b1\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u7248\u3092\u5229\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002","twitter:creator":"@legato_ip4"},"aioseo_meta_data":{"post_id":"5531","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-09-22 06:10:24","updated":"2026-09-22 06:17:48","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/ubun2m.com\" title=\"\u30db\u30fc\u30e0\">\u30db\u30fc\u30e0<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/ubun2m.com\/?cat=1\" title=\"\u672a\u5206\u985e\">\u672a\u5206\u985e<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"\u30db\u30fc\u30e0","link":"https:\/\/ubun2m.com"},{"label":"\u672a\u5206\u985e","link":"https:\/\/ubun2m.com\/?cat=1"},{"label":"\u30d5\u30e9\u30f3\u30b9\u8a9e\u7b46\u8a18\u4f53\u5909\u63db\u30c4\u30fc\u30ebv2","link":"https:\/\/ubun2m.com\/?p=5531"}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/ubun2m.com\/index.php?rest_route=\/wp\/v2\/posts\/5531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ubun2m.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ubun2m.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ubun2m.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ubun2m.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5531"}],"version-history":[{"count":2,"href":"https:\/\/ubun2m.com\/index.php?rest_route=\/wp\/v2\/posts\/5531\/revisions"}],"predecessor-version":[{"id":5533,"href":"https:\/\/ubun2m.com\/index.php?rest_route=\/wp\/v2\/posts\/5531\/revisions\/5533"}],"wp:attachment":[{"href":"https:\/\/ubun2m.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ubun2m.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ubun2m.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}