@@ -7,6 +7,21 @@ let fonts = [];
77let currentTab = 'sprites' ;
88const animState = new Map ( ) ; // baseName → intervalId
99
10+ function openEditorWithSprite ( sprite , suggestedName = null ) {
11+ const payload = {
12+ name : suggestedName || sprite . name ,
13+ width : sprite . width ,
14+ height : sprite . height ,
15+ data : sprite . data
16+ } ;
17+ try {
18+ localStorage . setItem ( 'spriteanvil.editorPayload' , JSON . stringify ( payload ) ) ;
19+ } catch ( err ) {
20+ console . error ( 'Failed to store sprite payload for editor' , err ) ;
21+ }
22+ globalThis . open ( 'editor.html' , '_blank' , 'noopener' ) ;
23+ }
24+
1025// ─── Tab switching ────────────────────────────────────────────────────────────
1126function switchTab ( name ) {
1227 currentTab = name ;
@@ -374,19 +389,20 @@ function renderSprites() {
374389 } ) ;
375390
376391 singles . forEach ( s => {
377- const { card, zoomBtn, nativeBtn, exportBtn } = mkCard ( `${ s . name } <span class="dim">${ s . width } ×${ s . height } </span>` ) ;
392+ const { card, zoomBtn, nativeBtn, editBtn , exportBtn } = mkCard ( `${ s . name } <span class="dim">${ s . width } ×${ s . height } </span>` ) ;
378393 const canvas = drawSprite ( s , z , grid ) ;
379394 card . appendChild ( canvas ) ;
380395 if ( s . isMono ) card . appendChild ( mkMonoPickers ( s , canvas ) ) ;
381396 zoomBtn . onclick = ( ) => downloadCanvas ( drawSprite ( s , getZoom ( ) , false ) , s . name , getZoom ( ) ) ;
382397 nativeBtn . onclick = ( ) => downloadCanvas ( drawSprite ( s , 1 , false ) , s . name ) ;
398+ editBtn . onclick = ( ) => openEditorWithSprite ( s , s . name ) ;
383399 exportBtn . onclick = ( ) => exportSpriteHeader ( s ) ;
384400 container . appendChild ( card ) ;
385401 } ) ;
386402
387403 Object . entries ( frameGroups ) . forEach ( ( [ base , frames ] ) => {
388404 const { width : w , height : h } = frames [ 0 ] ;
389- const { card, zoomBtn, nativeBtn, exportBtn } = mkCard (
405+ const { card, zoomBtn, nativeBtn, editBtn , exportBtn } = mkCard (
390406 `${ base } <span class="dim">${ frames . length } frames × ${ w } ×${ h } </span>` ) ;
391407
392408 // ── animated preview ─────────────────────────────────────────────────
@@ -423,9 +439,22 @@ function renderSprites() {
423439 const getCurrentFrame = setupAnim ( base , frames , animCanvas , fpsInput , playBtn ) ;
424440 attachPixelInspector ( animCanvas , getCurrentFrame ) ;
425441
442+ editBtn . onclick = ( ) => openEditorWithSprite ( frames [ 0 ] , `${ base } _frame0` ) ;
443+
426444 // ── strip or individual frames ───────────────────────────────────────
427445 if ( useStrip && frames . length > 1 ) {
428446 card . appendChild ( drawStrip ( frames , z , grid ) ) ;
447+ const stripEditRow = document . createElement ( 'div' ) ;
448+ stripEditRow . className = 'frames-row' ;
449+ frames . forEach ( ( f , i ) => {
450+ const btn = document . createElement ( 'button' ) ;
451+ btn . className = 'save-png-btn' ;
452+ btn . textContent = `Edit Frame ${ i } ` ;
453+ btn . title = `Open Frame ${ i } in the sprite editor` ;
454+ btn . onclick = ( ) => openEditorWithSprite ( f , `${ base } _frame${ i } ` ) ;
455+ stripEditRow . appendChild ( btn ) ;
456+ } ) ;
457+ card . appendChild ( stripEditRow ) ;
429458 } else {
430459 const row = document . createElement ( 'div' ) ;
431460 row . className = 'frames-row' ;
@@ -441,6 +470,12 @@ function renderSprites() {
441470 framePngBtn . title = `Save Frame ${ i } as PNG at current zoom (${ z } ×)` ;
442471 framePngBtn . onclick = ( ) => downloadCanvas ( drawSprite ( f , z , false ) , `${ base } _frame${ i } ` , z ) ;
443472 wrap . appendChild ( framePngBtn ) ;
473+ const frameEditBtn = document . createElement ( 'button' ) ;
474+ frameEditBtn . className = 'save-png-btn' ;
475+ frameEditBtn . textContent = 'Edit' ;
476+ frameEditBtn . title = `Open Frame ${ i } in the sprite editor` ;
477+ frameEditBtn . onclick = ( ) => openEditorWithSprite ( f , `${ base } _frame${ i } ` ) ;
478+ wrap . appendChild ( frameEditBtn ) ;
444479 row . appendChild ( wrap ) ;
445480 } ) ;
446481 card . appendChild ( row ) ;
@@ -554,6 +589,11 @@ function mkCard(labelHtml) {
554589 nativeBtn . title = 'Save PNG at native size (1 screen pixel per sprite pixel)' ;
555590 btns . appendChild ( zoomBtn ) ;
556591 btns . appendChild ( nativeBtn ) ;
592+ const editBtn = document . createElement ( 'button' ) ;
593+ editBtn . className = 'save-png-btn' ;
594+ editBtn . textContent = 'Edit' ;
595+ editBtn . title = 'Open this sprite in the editor' ;
596+ btns . appendChild ( editBtn ) ;
557597 // Add Export RGB565 .h button
558598 const exportBtn = document . createElement ( 'button' ) ;
559599 exportBtn . className = 'save-png-btn' ;
@@ -562,7 +602,7 @@ function mkCard(labelHtml) {
562602 btns . appendChild ( exportBtn ) ;
563603 lbl . appendChild ( btns ) ;
564604 card . appendChild ( lbl ) ;
565- return { card, zoomBtn, nativeBtn, exportBtn } ;
605+ return { card, zoomBtn, nativeBtn, editBtn , exportBtn } ;
566606}
567607
568608function drawBg ( ctx , w , h , z , offX = 0 , bg = null ) {
0 commit comments