[object Object]

← back to Studio Zero

chore: guard clipboard copy (toast honesty), v0.2.0 (session close)

987c6f931a973445a5a9c1527c9c2968e16949d5 · 2026-07-25 11:01:52 -0700 · Steve

Files touched

Diff

commit 987c6f931a973445a5a9c1527c9c2968e16949d5
Author: Steve <steve@designerwallcoverings.com>
Date:   Sat Jul 25 11:01:52 2026 -0700

    chore: guard clipboard copy (toast honesty), v0.2.0 (session close)
---
 VERSION           | 1 +
 public/index.html | 8 ++++++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..0ea3a94
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+0.2.0
diff --git a/public/index.html b/public/index.html
index 19f2cfc..2f10f11 100644
--- a/public/index.html
+++ b/public/index.html
@@ -164,6 +164,10 @@ let CFG={liveMode:false,model:'demo',rate:{in:3,out:15}}, PROMPTS=[], STATE=null
 
 const LS_PROJECTS='sz_projects', LS_CAL='sz_cal_prefs';
 function toast(m){const t=$('#toast');t.textContent=m;t.classList.add('show');setTimeout(()=>t.classList.remove('show'),1800);}
+function copyText(text,okMsg){
+  if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(text).then(()=>toast(okMsg),()=>toast('Copy failed — clipboard blocked'));
+  else toast('Copy not supported here');
+}
 function fmtCost(n){return '$'+Number(n||0).toFixed(4);}
 function fmtWhen(iso){try{return new Date(iso).toLocaleString(undefined,{year:'numeric',month:'short',day:'numeric',hour:'numeric',minute:'2-digit'});}catch(e){return iso;}}
 function uid(){return 'ch_'+Math.random().toString(36).slice(2,9);}
@@ -254,7 +258,7 @@ function renderBar(){
   $('#pname').onchange=()=>{STATE.name=$('#pname').value.trim()||'Untitled channel';persist();};
   $('#autoBtn').onclick=()=>autoBuildAll();
   $('#dlBtn').onclick=()=>{ if(!done||running)return; downloadFile('studio-zero-'+slugify(STATE.name)+'.html',planHTML(),'text/html'); toast('Downloaded your channel plan'); };
-  $('#mdBtn').onclick=()=>{ if(!done||running)return; navigator.clipboard.writeText(planMarkdown()); toast('Copied full plan as Markdown'); };
+  $('#mdBtn').onclick=()=>{ if(!done||running)return; copyText(planMarkdown(),'Copied full plan as Markdown'); };
 }
 function setAuto(m){ autoMsg=m; renderBar(); }
 
@@ -388,7 +392,7 @@ function renderStep(){
   $('#genBtn').onclick=doGenerate;
   $('#prevBtn').onclick=()=>{if(cur>0){cur--;renderStep();renderStepper();}};
   $('#nextBtn').onclick=()=>{if(cur<6){cur++;renderStep();renderStepper();}};
-  $('#copyBtn').onclick=()=>{navigator.clipboard.writeText(STATE.outputs[step.key].text);toast('Copied deliverable');};
+  $('#copyBtn').onclick=()=>{copyText(STATE.outputs[step.key].text,'Copied deliverable');};
 }
 
 function updateEst(){

← cceb51d studio-zero: one-click auto-build all 7 steps (chains niche→  ·  back to Studio Zero  ·  5x sweep 1: add favicon (kills 404); render export buttons o 81d5154 →