@@ -487,6 +487,7 @@ function applySharedPaletteAndVectorBinding() {
487487 }
488488
489489 if ( refs . paletteSelect instanceof HTMLSelectElement ) {
490+ refs . paletteSelect . dataset . locked = "1" ;
490491 refs . paletteSelect . disabled = true ;
491492 refs . paletteSelect . value = paletteId ;
492493 }
@@ -777,14 +778,20 @@ function applyEnablementState() {
777778 const hasFill = hasFillSelection ( ) ;
778779 const hasGradient = Boolean ( ( normalizeColorValue ( state . gradientFillFrom ) || normalizeColorValue ( state . fill ) ) && normalizeColorValue ( state . gradientFillTo ) ) ;
779780 const hasObjectSelection = Boolean ( getSelectedElement ( ) ) ;
781+ const paletteActionsEnabled = hasPaletteControls && hasObjectSelection ;
780782
781- refs . setPaletteTargetPaintButton . disabled = ! hasPaletteControls ;
782- refs . setPaletteTargetStrokeButton . disabled = ! hasPaletteControls ;
783+ if ( refs . paletteSelect instanceof HTMLSelectElement ) {
784+ const paletteLocked = refs . paletteSelect . dataset . locked === "1" ;
785+ refs . paletteSelect . disabled = paletteLocked || ! hasObjectSelection ;
786+ }
787+
788+ refs . setPaletteTargetPaintButton . disabled = ! paletteActionsEnabled ;
789+ refs . setPaletteTargetStrokeButton . disabled = ! paletteActionsEnabled ;
783790 if ( refs . setPaletteTargetGradientStartButton instanceof HTMLButtonElement ) {
784- refs . setPaletteTargetGradientStartButton . disabled = ! hasPaletteControls ;
791+ refs . setPaletteTargetGradientStartButton . disabled = ! paletteActionsEnabled ;
785792 }
786793 if ( refs . setPaletteTargetGradientEndButton instanceof HTMLButtonElement ) {
787- refs . setPaletteTargetGradientEndButton . disabled = ! hasPaletteControls ;
794+ refs . setPaletteTargetGradientEndButton . disabled = ! paletteActionsEnabled ;
788795 }
789796 refs . applyCanvasSizeButton . disabled = ! hasStyleSelection ;
790797 refs . strokeWidthInput . disabled = ! hasStyleSelection ;
@@ -816,6 +823,19 @@ function applyEnablementState() {
816823 button . classList . toggle ( "locked" , isDisabled ) ;
817824 } ) ;
818825
826+ refs . mainPaletteGrid . querySelectorAll ( ".palette-swatch" ) . forEach ( ( button ) => {
827+ if ( button instanceof HTMLButtonElement ) {
828+ button . disabled = ! paletteActionsEnabled ;
829+ button . classList . toggle ( "locked" , ! paletteActionsEnabled ) ;
830+ }
831+ } ) ;
832+ refs . usedColorStrip . querySelectorAll ( ".palette-swatch" ) . forEach ( ( button ) => {
833+ if ( button instanceof HTMLButtonElement ) {
834+ button . disabled = ! paletteActionsEnabled ;
835+ button . classList . toggle ( "locked" , ! paletteActionsEnabled ) ;
836+ }
837+ } ) ;
838+
819839 if ( ! hasStyleSelection && DRAW_TOOL_SET . has ( state . activeTool ) ) {
820840 setActiveTool ( "select" , { silent : true } ) ;
821841 }
@@ -848,6 +868,7 @@ function setPaletteTarget(target, options = {}) {
848868function resetPaletteSelectionState ( ) {
849869 state . selectedPaletteId = NO_PALETTE_ID ;
850870 if ( refs . paletteSelect instanceof HTMLSelectElement ) {
871+ refs . paletteSelect . dataset . locked = "0" ;
851872 refs . paletteSelect . disabled = false ;
852873 refs . paletteSelect . value = NO_PALETTE_ID ;
853874 }
@@ -2006,6 +2027,10 @@ function deleteSelectedElement() {
20062027 refreshUsedColors ( ) ;
20072028 clearSelection ( ) ;
20082029 renderElementList ( ) ;
2030+ const firstElement = getDrawableElements ( ) [ 0 ] || null ;
2031+ if ( firstElement && ! getSelectedElement ( ) ) {
2032+ selectElement ( firstElement ) ;
2033+ }
20092034 setStatus ( "Deleted selected element." ) ;
20102035}
20112036
@@ -2405,6 +2430,7 @@ function applySampleEditorOptions(options = {}) {
24052430 state . selectedPaletteId = paletteId ;
24062431 if ( refs . paletteSelect instanceof HTMLSelectElement ) {
24072432 refs . paletteSelect . value = paletteId ;
2433+ refs . paletteSelect . dataset . locked = "1" ;
24082434 refs . paletteSelect . disabled = true ;
24092435 }
24102436 }
@@ -2659,6 +2685,7 @@ function ensurePaletteSelectionFromDeclaredInputs(editorOptions = {}, sampleId =
26592685 if ( firstPaletteOption ) {
26602686 state . selectedPaletteId = String ( firstPaletteOption . id ) ;
26612687 if ( refs . paletteSelect instanceof HTMLSelectElement ) {
2688+ refs . paletteSelect . dataset . locked = "0" ;
26622689 refs . paletteSelect . disabled = false ;
26632690 refs . paletteSelect . value = state . selectedPaletteId ;
26642691 }
@@ -2677,6 +2704,7 @@ function ensurePaletteSelectionFromDeclaredInputs(editorOptions = {}, sampleId =
26772704 upsertPaletteOption ( paletteId , paletteLabel ) ;
26782705 state . selectedPaletteId = paletteId ;
26792706 if ( refs . paletteSelect instanceof HTMLSelectElement ) {
2707+ refs . paletteSelect . dataset . locked = "0" ;
26802708 refs . paletteSelect . disabled = false ;
26812709 refs . paletteSelect . value = paletteId ;
26822710 }
@@ -3094,7 +3122,6 @@ function bindEvents() {
30943122 if ( state . selectedPaletteId === NO_PALETTE_ID ) {
30953123 setStatus ( "Palette selection cleared. Choose a palette set to show colors." ) ;
30963124 } else if ( state . selectedPaletteId !== previousPaletteId ) {
3097- refs . paletteSelect . disabled = true ;
30983125 setStatus ( `Palette set changed to ${ selectedLabel } .` ) ;
30993126 }
31003127 } ) ;
@@ -3336,8 +3363,47 @@ const vectorAssetStudioApi = {
33363363 state . zoom = Number . isFinite ( Number ( snapshot ?. zoom ) ) ? Number ( snapshot . zoom ) : state . zoom ;
33373364 state . panX = Number . isFinite ( Number ( snapshot ?. panX ) ) ? Number ( snapshot . panX ) : state . panX ;
33383365 state . panY = Number . isFinite ( Number ( snapshot ?. panY ) ) ? Number ( snapshot . panY ) : state . panY ;
3366+ if ( typeof snapshot ?. selectedPaletteId === "string" && snapshot . selectedPaletteId . trim ( ) ) {
3367+ const candidatePaletteId = snapshot . selectedPaletteId . trim ( ) ;
3368+ const hasCandidatePalette = candidatePaletteId === NO_PALETTE_ID
3369+ || Object . prototype . hasOwnProperty . call ( state . paletteGroups , candidatePaletteId ) ;
3370+ if ( hasCandidatePalette ) {
3371+ state . selectedPaletteId = candidatePaletteId ;
3372+ }
3373+ }
3374+ if ( typeof snapshot ?. activePaletteTarget === "string" ) {
3375+ setPaletteTarget ( snapshot . activePaletteTarget , { silent : true } ) ;
3376+ }
3377+ if ( Number . isFinite ( Number ( snapshot ?. strokeWidth ) ) ) {
3378+ state . strokeWidth = clamp ( snapshot . strokeWidth , 0 , 128 , state . strokeWidth ) ;
3379+ refs . strokeWidthInput . value = String ( state . strokeWidth ) ;
3380+ }
3381+ if ( Number . isFinite ( Number ( snapshot ?. gradientAngle ) ) ) {
3382+ state . gradientAngle = clamp ( snapshot . gradientAngle , - 360 , 360 , state . gradientAngle ) ;
3383+ if ( refs . gradientAngleInput instanceof HTMLInputElement ) {
3384+ refs . gradientAngleInput . value = String ( Math . round ( state . gradientAngle ) ) ;
3385+ }
3386+ }
3387+ renderPaletteSelect ( ) ;
3388+ renderMainPaletteGrid ( ) ;
3389+ renderUsedColorStrip ( ) ;
3390+ const snapshotSelectionId = typeof snapshot ?. selectedId === "string" ? snapshot . selectedId . trim ( ) : "" ;
3391+ const snapshotSelectedElement = snapshotSelectionId
3392+ ? refs . sceneRoot . querySelector ( `[data-editor-id="${ snapshotSelectionId } "]` )
3393+ : null ;
3394+ if ( snapshotSelectedElement instanceof SVGElement ) {
3395+ selectElement ( snapshotSelectedElement ) ;
3396+ } else {
3397+ const firstElement = getDrawableElements ( ) [ 0 ] || null ;
3398+ if ( firstElement ) {
3399+ selectElement ( firstElement ) ;
3400+ } else {
3401+ clearSelection ( ) ;
3402+ }
3403+ }
33393404 refs . zoomPercentInput . value = String ( Math . round ( state . zoom * 100 ) ) ;
33403405 updateViewTransform ( ) ;
3406+ applyEnablementState ( ) ;
33413407 setStatus ( `Project state loaded for ${ state . documentName } .` ) ;
33423408 return true ;
33433409 }
0 commit comments