11'use client' ;
22
3- import { useState } from 'react' ;
3+ import { useState , useEffect } from 'react' ;
44import { Dialog , DialogContent , DialogFooter , DialogHeader , DialogTitle } from './base/dialog.tsx' ;
55import { Button } from './base/button.tsx' ;
66import { Input } from './base/input.tsx' ;
@@ -18,6 +18,7 @@ import {
1818 assignMissingRefs ,
1919} from '../state-builder/index.ts' ;
2020import { SelectorHelperContent , type SelectorTab } from './helpers/SelectorHelperContent.tsx' ;
21+ import { NumericInput } from './components/NumericInput.tsx' ;
2122
2223interface SetupWizardProps {
2324 open : boolean ;
@@ -96,6 +97,16 @@ export function SetupWizard({ open, onOpenChange, onComplete }: SetupWizardProps
9697 const [ components , setComponents ] = useState < ComponentConfig [ ] > ( [ newComponent ( ) ] ) ;
9798 const [ activeCompTab , setActiveCompTab ] = useState ( '0' ) ;
9899
100+ useEffect ( ( ) => {
101+ if ( ! open ) return ;
102+ setStep ( 1 ) ;
103+ setUrl ( '' ) ; setFormat ( 'bcif' ) ;
104+ setStructureType ( 'model' ) ; setAssemblyId ( '' ) ;
105+ setRadius ( 5 ) ; setIjkMin ( [ 0 , 0 , 0 ] ) ; setIjkMax ( [ 1 , 1 , 1 ] ) ;
106+ setModelIndex ( undefined ) ; setBlockIndex ( undefined ) ; setBlockHeader ( undefined ) ; setCoordinatesRef ( undefined ) ;
107+ setComponents ( [ newComponent ( ) ] ) ; setActiveCompTab ( '0' ) ;
108+ } , [ open ] ) ;
109+
99110 const formats = getActiveValues ( PARSE_FORMATS ) ;
100111 const reprTypes = getActiveValues ( REPRESENTATION_TYPES ) ;
101112 const presetSelectors = getActiveValues ( COMPONENT_SELECTORS ) ;
@@ -164,7 +175,7 @@ export function SetupWizard({ open, onOpenChange, onComplete }: SetupWizardProps
164175
165176 return (
166177 < Dialog open = { open } onOpenChange = { onOpenChange } >
167- < DialogContent className = 'sm:max-w-[520px ] gap-0 p-0 overflow-hidden' >
178+ < DialogContent className = 'sm:max-w-[860px ] gap-0 p-0 overflow-hidden' >
168179 < DialogHeader className = 'pb-0' >
169180 < StepIndicator currentStep = { step } />
170181 < DialogTitle className = 'px-5 pt-3 pb-0 text-base' >
@@ -216,7 +227,7 @@ export function SetupWizard({ open, onOpenChange, onComplete }: SetupWizardProps
216227 { structureType === 'symmetry_mates' && (
217228 < div className = 'flex flex-col gap-1 w-28' >
218229 < Label className = 'text-xs' > Radius (Å)</ Label >
219- < Input className = 'h-7 text-xs font-mono' type = 'number' min = '0' step = '1' placeholder = '5' value = { radius } onChange = { ( e ) => setRadius ( parseFloat ( e . target . value ) || 5 ) } />
230+ < NumericInput className = 'h-7 text-xs font-mono' placeholder = '5' value = { radius } onChange = { ( v ) => setRadius ( v ?? radius ) } />
220231 </ div >
221232 ) }
222233 { structureType === 'symmetry' && (
@@ -229,16 +240,14 @@ export function SetupWizard({ open, onOpenChange, onComplete }: SetupWizardProps
229240 < Label className = 'text-xs' > IJK { bound } </ Label >
230241 < div className = 'flex gap-1' >
231242 { ( [ 'i' , 'j' , 'k' ] as const ) . map ( ( axis , idx ) => (
232- < Input
243+ < NumericInput
233244 key = { axis }
234245 className = 'h-7 text-xs font-mono w-14'
235- type = 'number'
236- step = '1'
237246 placeholder = { axis }
238247 value = { val [ idx ] }
239- onChange = { ( e ) => {
248+ onChange = { ( v ) => {
240249 const next = [ ...val ] as [ number , number , number ] ;
241- next [ idx ] = parseInt ( e . target . value ) || 0 ;
250+ next [ idx ] = v ?? next [ idx ] ;
242251 set ( next ) ;
243252 } }
244253 />
0 commit comments