@zag-js/number-input 0.51.1 → 0.51.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -10
- package/src/number-input.connect.ts +4 -6
package/dist/index.js
CHANGED
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
<path fill-rule="evenodd" d="M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z" style="stroke-width: 2px; stroke: white;"></path>
|
|
5
5
|
<path fill-rule="evenodd" d="M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z"></path>
|
|
6
6
|
</g>
|
|
7
|
-
</svg>`;doc.body.appendChild(el)}});function connect(state,send,normalize){const focused=state.hasTag("focus");const disabled=state.context.isDisabled;const readOnly=state.context.readOnly;const empty=state.context.isValueEmpty;const invalid=state.context.isOutOfRange||!!state.context.invalid;const isIncrementDisabled=disabled||!state.context.canIncrement||readOnly;const isDecrementDisabled=disabled||!state.context.canDecrement||readOnly;const translations=state.context.translations;return{focused,invalid,empty,value:state.context.formattedValue,valueAsNumber:state.context.valueAsNumber,setValue(value){send({type:"VALUE.SET",value})},clearValue(){send("VALUE.CLEAR")},increment(){send("VALUE.INCREMENT")},decrement(){send("VALUE.DECREMENT")},setToMax(){send({type:"VALUE.SET",value:state.context.max})},setToMin(){send({type:"VALUE.SET",value:state.context.min})},focus(){dom.getInputEl(state.context)?.focus()},rootProps:normalize.element({id:dom.getRootId(state.context),...parts.root.attrs,dir:state.context.dir,"data-disabled":(0,import_dom_query2.dataAttr)(disabled),"data-focus":(0,import_dom_query2.dataAttr)(focused),"data-invalid":(0,import_dom_query2.dataAttr)(invalid)}),labelProps:normalize.label({...parts.label.attrs,dir:state.context.dir,"data-disabled":(0,import_dom_query2.dataAttr)(disabled),"data-focus":(0,import_dom_query2.dataAttr)(focused),"data-invalid":(0,import_dom_query2.dataAttr)(invalid),id:dom.getLabelId(state.context),htmlFor:dom.getInputId(state.context)}),controlProps:normalize.element({...parts.control.attrs,dir:state.context.dir,role:"group","aria-disabled":disabled,"data-focus":(0,import_dom_query2.dataAttr)(focused),"data-disabled":(0,import_dom_query2.dataAttr)(disabled),"data-invalid":(0,import_dom_query2.dataAttr)(invalid),"aria-invalid":(0,import_dom_query2.ariaAttr)(state.context.invalid)}),inputProps:normalize.input({...parts.input.attrs,dir:state.context.dir,name:state.context.name,form:state.context.form,id:dom.getInputId(state.context),role:"spinbutton",defaultValue:state.context.formattedValue,pattern:state.context.pattern,inputMode:state.context.inputMode,"aria-invalid":(0,import_dom_query2.ariaAttr)(invalid),"data-invalid":(0,import_dom_query2.dataAttr)(invalid),disabled,"data-disabled":(0,import_dom_query2.dataAttr)(disabled),readOnly:!!state.context.readOnly,autoComplete:"off",autoCorrect:"off",spellCheck:"false",type:"text","aria-roledescription":"numberfield","aria-valuemin":state.context.min,"aria-valuemax":state.context.max,"aria-valuenow":Number.isNaN(state.context.valueAsNumber)?void 0:state.context.valueAsNumber,"aria-valuetext":state.context.valueText,onFocus(){send("INPUT.FOCUS")},onBlur(){send({type:"INPUT.COMMIT",src:"blur"})},onChange(event){send({type:"INPUT.CHANGE",target:event.currentTarget,hint:"set"})},onBeforeInput(event){try{const{selectionStart,selectionEnd,value}=event.currentTarget;const nextValue=value.slice(0,selectionStart)+(event.data??"")+value.slice(selectionEnd);const isValid=state.context.parser.isValidPartialNumber(nextValue);if(!isValid){event.preventDefault()}}catch{}},onKeyDown(event){if(event.defaultPrevented)return;if(readOnly)return;const evt=(0,import_dom_event.getNativeEvent)(event);if(evt.isComposing)return;const step=(0,import_dom_event.getEventStep)(event)*state.context.step;const keyMap={ArrowUp(){send({type:"INPUT.ARROW_UP",step});event.preventDefault()},ArrowDown(){send({type:"INPUT.ARROW_DOWN",step});event.preventDefault()},Home(){send("INPUT.HOME");event.preventDefault()},End(){send("INPUT.END");event.preventDefault()},Enter(){send({type:"INPUT.COMMIT",src:"enter"})}};const exec=keyMap[event.key];exec?.(event)}}),decrementTriggerProps:normalize.button({...parts.decrementTrigger.attrs,dir:state.context.dir,id:dom.getDecrementTriggerId(state.context),disabled:isDecrementDisabled,"data-disabled":(0,import_dom_query2.dataAttr)(isDecrementDisabled),"aria-label":translations.decrementLabel,type:"button",tabIndex:-1,"aria-controls":dom.getInputId(state.context),onPointerDown(event){if(isDecrementDisabled||!(0,import_dom_event.isLeftClick)(event))return;send({type:"TRIGGER.PRESS_DOWN",hint:"decrement",pointerType:event.pointerType});if(event.pointerType==="mouse"){event.preventDefault()}if(event.pointerType==="touch"){event.currentTarget?.focus({preventScroll:true})}},onPointerUp(event){send({type:"TRIGGER.PRESS_UP",hint:"decrement",pointerType:event.pointerType})},onPointerLeave(){if(isDecrementDisabled)return;send({type:"TRIGGER.PRESS_UP",hint:"decrement"})}}),incrementTriggerProps:normalize.button({...parts.incrementTrigger.attrs,dir:state.context.dir,id:dom.getIncrementTriggerId(state.context),disabled:isIncrementDisabled,"data-disabled":(0,import_dom_query2.dataAttr)(isIncrementDisabled),"aria-label":translations.incrementLabel,type:"button",tabIndex:-1,"aria-controls":dom.getInputId(state.context),onPointerDown(event){if(isIncrementDisabled||!(0,import_dom_event.isLeftClick)(event))return;send({type:"TRIGGER.PRESS_DOWN",hint:"increment",pointerType:event.pointerType});if(event.pointerType==="mouse"){event.preventDefault()}if(event.pointerType==="touch"){event.currentTarget?.focus({preventScroll:true})}},onPointerUp(event){send({type:"TRIGGER.PRESS_UP",hint:"increment",pointerType:event.pointerType})},onPointerLeave(event){send({type:"TRIGGER.PRESS_UP",hint:"increment",pointerType:event.pointerType})}}),scrubberProps:normalize.element({...parts.scrubber.attrs,dir:state.context.dir,"data-disabled":(0,import_dom_query2.dataAttr)(disabled),id:dom.getScrubberId(state.context),role:"presentation",onMouseDown(event){if(disabled)return;const evt=(0,import_dom_event.getNativeEvent)(event);const point=(0,import_dom_event.getEventPoint)(evt);point.x=point.x-(0,import_number_utils2.roundToDevicePixel)(7.5);point.y=point.y-(0,import_number_utils2.roundToDevicePixel)(7.5);send({type:"SCRUBBER.PRESS_DOWN",point});event.preventDefault()},style:{cursor:disabled?void 0:"ew-resize"}})}}var import_core2=require("@zag-js/core");var import_dom_event2=require("@zag-js/dom-event");var import_dom_query3=require("@zag-js/dom-query");var import_form_utils=require("@zag-js/form-utils");var import_number_utils3=require("@zag-js/number-utils");var import_utils=require("@zag-js/utils");function recordCursor(inputEl){if(inputEl.ownerDocument.activeElement!==inputEl)return;try{const{selectionStart:start,selectionEnd:end,value}=inputEl;const beforeTxt=value.substring(0,start);const afterTxt=value.substring(end);return{start,end,value,beforeTxt,afterTxt}}catch{}}function restoreCursor(inputEl,selection){if(inputEl.ownerDocument.activeElement!==inputEl)return;if(!selection){inputEl.setSelectionRange(inputEl.value.length,inputEl.value.length);return}try{const{value}=inputEl;const{beforeTxt="",afterTxt="",start}=selection;let startPos=value.length;if(value.endsWith(afterTxt)){startPos=value.length-afterTxt.length}else if(value.startsWith(beforeTxt)){startPos=beforeTxt.length}else if(start!=null){const beforeLastChar=beforeTxt[start-1];const newIndex=value.indexOf(beforeLastChar,start-1);if(newIndex!==-1){startPos=newIndex+1}}inputEl.setSelectionRange(startPos,startPos)}catch{}}var import_number=require("@internationalized/number");var import_core=require("@zag-js/core");var createFormatter=(locale,options={})=>{return(0,import_core.ref)(new Intl.NumberFormat(locale,options))};var createParser=(locale,options={})=>{return(0,import_core.ref)(new import_number.NumberParser(locale,options))};var parseValue=(ctx,value)=>{if(!ctx.formatOptions)return parseFloat(value);return ctx.parser.parse(String(value))};var formatValue=(ctx,value)=>{if(Number.isNaN(value))return"";if(!ctx.formatOptions)return value.toString();return ctx.formatter.format(value)};var{not,and}=import_core2.guards;function machine(userContext){const ctx=(0,import_utils.compact)(userContext);return(0,import_core2.createMachine)({id:"number-input",initial:"idle",context:{dir:"ltr",locale:"en-US",focusInputOnChange:true,clampValueOnBlur:true,allowOverflow:false,inputMode:"decimal",pattern:"[0-9]*(.[0-9]+)?",value:"",step:1,min:Number.MIN_SAFE_INTEGER,max:Number.MAX_SAFE_INTEGER,invalid:false,spinOnPress:true,...ctx,hint:null,scrubberCursorPoint:null,fieldsetDisabled:false,formatter:createFormatter(ctx.locale||"en-US",ctx.formatOptions),parser:createParser(ctx.locale||"en-US",ctx.formatOptions),translations:{incrementLabel:"increment value",decrementLabel:"decrease value",...ctx.translations}},computed:{isRtl:ctx2=>ctx2.dir==="rtl",valueAsNumber:ctx2=>parseValue(ctx2,ctx2.value),formattedValue:ctx2=>formatValue(ctx2,ctx2.valueAsNumber),isAtMin:ctx2=>(0,import_number_utils3.isAtMin)(ctx2.valueAsNumber,ctx2),isAtMax:ctx2=>(0,import_number_utils3.isAtMax)(ctx2.valueAsNumber,ctx2),isOutOfRange:ctx2=>!(0,import_number_utils3.isWithinRange)(ctx2.valueAsNumber,ctx2),isValueEmpty:ctx2=>ctx2.value==="",isDisabled:ctx2=>!!ctx2.disabled||ctx2.fieldsetDisabled,canIncrement:ctx2=>ctx2.allowOverflow||!ctx2.isAtMax,canDecrement:ctx2=>ctx2.allowOverflow||!ctx2.isAtMin,valueText:ctx2=>ctx2.translations.valueText?.(ctx2.value)},watch:{formatOptions:["setFormatterAndParser","syncInputElement"],locale:["setFormatterAndParser","syncInputElement"],value:["syncInputElement"],isOutOfRange:["invokeOnInvalid"],scrubberCursorPoint:["setVirtualCursorPosition"]},activities:["trackFormControl"],on:{"VALUE.SET":{actions:["setRawValue","setHintToSet"]},"VALUE.CLEAR":{actions:["clearValue"]},"VALUE.INCREMENT":{actions:["increment"]},"VALUE.DECREMENT":{actions:["decrement"]}},states:{idle:{on:{"TRIGGER.PRESS_DOWN":[{guard:"isTouchPointer",target:"before:spin",actions:["setHint"]},{target:"before:spin",actions:["focusInput","invokeOnFocus","setHint"]}],"SCRUBBER.PRESS_DOWN":{target:"scrubbing",actions:["focusInput","invokeOnFocus","setHint","setCursorPoint"]},"INPUT.FOCUS":{target:"focused",actions:["focusInput","invokeOnFocus"]}}},focused:{tags:"focus",activities:"attachWheelListener",on:{"TRIGGER.PRESS_DOWN":[{guard:"isTouchPointer",target:"before:spin",actions:["setHint"]},{target:"before:spin",actions:["focusInput","setHint"]}],"SCRUBBER.PRESS_DOWN":{target:"scrubbing",actions:["focusInput","setHint","setCursorPoint"]},"INPUT.ARROW_UP":{actions:"increment"},"INPUT.ARROW_DOWN":{actions:"decrement"},"INPUT.HOME":{actions:"decrementToMin"},"INPUT.END":{actions:"incrementToMax"},"INPUT.CHANGE":{actions:["setValue","setHint"]},"INPUT.COMMIT":[{guard:and("clampValueOnBlur",not("isInRange")),target:"idle",actions:["setClampedValue","clearHint","invokeOnBlur"]},{target:"idle",actions:["setFormattedValue","clearHint","invokeOnBlur"]}]}},"before:spin":{tags:"focus",activities:"trackButtonDisabled",entry:(0,import_core2.choose)([{guard:"isIncrementHint",actions:"increment"},{guard:"isDecrementHint",actions:"decrement"}]),after:{CHANGE_DELAY:{target:"spinning",guard:and("isInRange","spinOnPress")}},on:{"TRIGGER.PRESS_UP":[{guard:"isTouchPointer",target:"focused",actions:"clearHint"},{target:"focused",actions:["focusInput","clearHint"]}]}},spinning:{tags:"focus",activities:"trackButtonDisabled",every:[{delay:"CHANGE_INTERVAL",guard:and(not("isAtMin"),"isIncrementHint"),actions:"increment"},{delay:"CHANGE_INTERVAL",guard:and(not("isAtMax"),"isDecrementHint"),actions:"decrement"}],on:{"TRIGGER.PRESS_UP":{target:"focused",actions:["focusInput","clearHint"]}}},scrubbing:{tags:"focus",activities:["activatePointerLock","trackMousemove","setupVirtualCursor","preventTextSelection"],on:{"SCRUBBER.POINTER_UP":{target:"focused",actions:["focusInput","clearCursorPoint"]},"SCRUBBER.POINTER_MOVE":[{guard:"isIncrementHint",actions:["increment","setCursorPoint"]},{guard:"isDecrementHint",actions:["decrement","setCursorPoint"]}]}}}},{delays:{CHANGE_INTERVAL:50,CHANGE_DELAY:300},guards:{clampValueOnBlur:ctx2=>ctx2.clampValueOnBlur,isAtMin:ctx2=>ctx2.isAtMin,spinOnPress:ctx2=>!!ctx2.spinOnPress,isAtMax:ctx2=>ctx2.isAtMax,isInRange:ctx2=>!ctx2.isOutOfRange,isDecrementHint:(ctx2,evt)=>(evt.hint??ctx2.hint)==="decrement",isIncrementHint:(ctx2,evt)=>(evt.hint??ctx2.hint)==="increment",isTouchPointer:(_ctx,evt)=>evt.pointerType==="touch"},activities:{trackFormControl(ctx2,_evt,{initialContext}){const inputEl=dom.getInputEl(ctx2);return(0,import_form_utils.trackFormControl)(inputEl,{onFieldsetDisabledChange(disabled){ctx2.fieldsetDisabled=disabled},onFormReset(){set.value(ctx2,initialContext.value)}})},setupVirtualCursor(ctx2){return dom.setupVirtualCursor(ctx2)},preventTextSelection(ctx2){return dom.preventTextSelection(ctx2)},trackButtonDisabled(ctx2,_evt,{send}){const btn=dom.getPressedTriggerEl(ctx2,ctx2.hint);return(0,import_dom_query3.observeAttributes)(btn,{attributes:["disabled"],callback(){send({type:"TRIGGER.PRESS_UP",src:"attr"})}})},attachWheelListener(ctx2,_evt,{send}){const inputEl=dom.getInputEl(ctx2);if(!inputEl||!dom.isActiveElement(ctx2,inputEl)||!ctx2.allowMouseWheel)return;function onWheel(event){event.preventDefault();const dir=Math.sign(event.deltaY)*-1;if(dir===1){send("VALUE.INCREMENT")}else if(dir===-1){send("VALUE.DECREMENT")}}return(0,import_dom_event2.addDomEvent)(inputEl,"wheel",onWheel,{passive:false})},activatePointerLock(ctx2){if((0,import_dom_query3.isSafari)())return;return(0,import_dom_event2.requestPointerLock)(dom.getDoc(ctx2))},trackMousemove(ctx2,_evt,{send}){const doc=dom.getDoc(ctx2);function onMousemove(event){if(!ctx2.scrubberCursorPoint)return;const value=dom.getMousementValue(ctx2,event);if(!value.hint)return;send({type:"SCRUBBER.POINTER_MOVE",hint:value.hint,point:value.point})}function onMouseup(){send("SCRUBBER.POINTER_UP")}return(0,import_utils.callAll)((0,import_dom_event2.addDomEvent)(doc,"mousemove",onMousemove,false),(0,import_dom_event2.addDomEvent)(doc,"mouseup",onMouseup,false))}},actions:{focusInput(ctx2){if(!ctx2.focusInputOnChange)return;const inputEl=dom.getInputEl(ctx2);if(dom.isActiveElement(ctx2,inputEl))return;(0,import_dom_query3.raf)(()=>inputEl?.focus({preventScroll:true}))},increment(ctx2,evt){const nextValue=(0,import_number_utils3.increment)(ctx2.valueAsNumber,evt.step??ctx2.step);const value=formatValue(ctx2,(0,import_number_utils3.clamp)(nextValue,ctx2));set.value(ctx2,value)},decrement(ctx2,evt){const nextValue=(0,import_number_utils3.decrement)(ctx2.valueAsNumber,evt.step??ctx2.step);const value=formatValue(ctx2,(0,import_number_utils3.clamp)(nextValue,ctx2));set.value(ctx2,value)},setClampedValue(ctx2){const nextValue=(0,import_number_utils3.clamp)(ctx2.valueAsNumber,ctx2);set.value(ctx2,formatValue(ctx2,nextValue))},setRawValue(ctx2,evt){const parsedValue=parseValue(ctx2,evt.value);const value=formatValue(ctx2,(0,import_number_utils3.clamp)(parsedValue,ctx2));set.value(ctx2,value)},setValue(ctx2,evt){const value=evt.target?.value??evt.value;set.value(ctx2,value)},clearValue(ctx2){set.value(ctx2,"")},incrementToMax(ctx2){const value=formatValue(ctx2,ctx2.max);set.value(ctx2,value)},decrementToMin(ctx2){const value=formatValue(ctx2,ctx2.min);set.value(ctx2,value)},setHint(ctx2,evt){ctx2.hint=evt.hint},clearHint(ctx2){ctx2.hint=null},setHintToSet(ctx2){ctx2.hint="set"},invokeOnFocus(ctx2){ctx2.onFocusChange?.({focused:true,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},invokeOnBlur(ctx2){ctx2.onFocusChange?.({focused:false,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},invokeOnInvalid(ctx2){if(!ctx2.isOutOfRange)return;const reason=ctx2.valueAsNumber>ctx2.max?"rangeOverflow":"rangeUnderflow";ctx2.onValueInvalid?.({reason,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},syncInputElement(ctx2,evt){const value=evt.type.endsWith("CHANGE")?ctx2.value:ctx2.formattedValue;sync.input(ctx2,value)},setFormattedValue(ctx2){set.value(ctx2,ctx2.formattedValue)},setCursorPoint(ctx2,evt){ctx2.scrubberCursorPoint=evt.point},clearCursorPoint(ctx2){ctx2.scrubberCursorPoint=null},setVirtualCursorPosition(ctx2){const cursorEl=dom.getCursorEl(ctx2);if(!cursorEl||!ctx2.scrubberCursorPoint)return;const{x,y}=ctx2.scrubberCursorPoint;cursorEl.style.transform=`translate3d(${x}px, ${y}px, 0px)`},setFormatterAndParser(ctx2){if(!ctx2.locale)return;ctx2.formatter=createFormatter(ctx2.locale,ctx2.formatOptions);ctx2.parser=createParser(ctx2.locale,ctx2.formatOptions)}},compareFns:{formatOptions:(a,b)=>(0,import_utils.isEqual)(a,b),scrubberCursorPoint:(a,b)=>(0,import_utils.isEqual)(a,b)}})}var sync={input(ctx,value){const inputEl=dom.getInputEl(ctx);if(!inputEl)return;const sel=recordCursor(inputEl);(0,import_dom_query3.raf)(()=>{dom.setValue(inputEl,value);restoreCursor(inputEl,sel)})}};var invoke={onChange:ctx=>{ctx.onValueChange?.({value:ctx.value,valueAsNumber:ctx.valueAsNumber})}};var set={value:(ctx,value)=>{if((0,import_utils.isEqual)(ctx.value,value))return;ctx.value=value;invoke.onChange(ctx)}};0&&(module.exports={anatomy,connect,machine});
|
|
7
|
+
</svg>`;doc.body.appendChild(el)}});function connect(state,send,normalize){const focused=state.hasTag("focus");const disabled=state.context.isDisabled;const readOnly=state.context.readOnly;const empty=state.context.isValueEmpty;const invalid=state.context.isOutOfRange||!!state.context.invalid;const isIncrementDisabled=disabled||!state.context.canIncrement||readOnly;const isDecrementDisabled=disabled||!state.context.canDecrement||readOnly;const translations=state.context.translations;return{focused,invalid,empty,value:state.context.formattedValue,valueAsNumber:state.context.valueAsNumber,setValue(value){send({type:"VALUE.SET",value})},clearValue(){send("VALUE.CLEAR")},increment(){send("VALUE.INCREMENT")},decrement(){send("VALUE.DECREMENT")},setToMax(){send({type:"VALUE.SET",value:state.context.max})},setToMin(){send({type:"VALUE.SET",value:state.context.min})},focus(){dom.getInputEl(state.context)?.focus()},rootProps:normalize.element({id:dom.getRootId(state.context),...parts.root.attrs,dir:state.context.dir,"data-disabled":(0,import_dom_query2.dataAttr)(disabled),"data-focus":(0,import_dom_query2.dataAttr)(focused),"data-invalid":(0,import_dom_query2.dataAttr)(invalid)}),labelProps:normalize.label({...parts.label.attrs,dir:state.context.dir,"data-disabled":(0,import_dom_query2.dataAttr)(disabled),"data-focus":(0,import_dom_query2.dataAttr)(focused),"data-invalid":(0,import_dom_query2.dataAttr)(invalid),id:dom.getLabelId(state.context),htmlFor:dom.getInputId(state.context)}),controlProps:normalize.element({...parts.control.attrs,dir:state.context.dir,role:"group","aria-disabled":disabled,"data-focus":(0,import_dom_query2.dataAttr)(focused),"data-disabled":(0,import_dom_query2.dataAttr)(disabled),"data-invalid":(0,import_dom_query2.dataAttr)(invalid),"aria-invalid":(0,import_dom_query2.ariaAttr)(state.context.invalid)}),inputProps:normalize.input({...parts.input.attrs,dir:state.context.dir,name:state.context.name,form:state.context.form,id:dom.getInputId(state.context),role:"spinbutton",defaultValue:state.context.formattedValue,pattern:state.context.pattern,inputMode:state.context.inputMode,"aria-invalid":(0,import_dom_query2.ariaAttr)(invalid),"data-invalid":(0,import_dom_query2.dataAttr)(invalid),disabled,"data-disabled":(0,import_dom_query2.dataAttr)(disabled),readOnly:!!state.context.readOnly,autoComplete:"off",autoCorrect:"off",spellCheck:"false",type:"text","aria-roledescription":"numberfield","aria-valuemin":state.context.min,"aria-valuemax":state.context.max,"aria-valuenow":Number.isNaN(state.context.valueAsNumber)?void 0:state.context.valueAsNumber,"aria-valuetext":state.context.valueText,onFocus(){send("INPUT.FOCUS")},onBlur(){send({type:"INPUT.COMMIT",src:"blur"})},onChange(event){send({type:"INPUT.CHANGE",target:event.currentTarget,hint:"set"})},onBeforeInput(event){try{const{selectionStart,selectionEnd,value}=event.currentTarget;const nextValue=value.slice(0,selectionStart)+(event.data??"")+value.slice(selectionEnd);const isValid=state.context.parser.isValidPartialNumber(nextValue);if(!isValid){event.preventDefault()}}catch{}},onKeyDown(event){if(event.defaultPrevented)return;if(readOnly)return;if((0,import_dom_query2.isComposingEvent)(event))return;const step=(0,import_dom_event.getEventStep)(event)*state.context.step;const keyMap={ArrowUp(){send({type:"INPUT.ARROW_UP",step});event.preventDefault()},ArrowDown(){send({type:"INPUT.ARROW_DOWN",step});event.preventDefault()},Home(){send("INPUT.HOME");event.preventDefault()},End(){send("INPUT.END");event.preventDefault()},Enter(){send({type:"INPUT.COMMIT",src:"enter"})}};const exec=keyMap[event.key];exec?.(event)}}),decrementTriggerProps:normalize.button({...parts.decrementTrigger.attrs,dir:state.context.dir,id:dom.getDecrementTriggerId(state.context),disabled:isDecrementDisabled,"data-disabled":(0,import_dom_query2.dataAttr)(isDecrementDisabled),"aria-label":translations.decrementLabel,type:"button",tabIndex:-1,"aria-controls":dom.getInputId(state.context),onPointerDown(event){if(isDecrementDisabled||!(0,import_dom_event.isLeftClick)(event))return;send({type:"TRIGGER.PRESS_DOWN",hint:"decrement",pointerType:event.pointerType});if(event.pointerType==="mouse"){event.preventDefault()}if(event.pointerType==="touch"){event.currentTarget?.focus({preventScroll:true})}},onPointerUp(event){send({type:"TRIGGER.PRESS_UP",hint:"decrement",pointerType:event.pointerType})},onPointerLeave(){if(isDecrementDisabled)return;send({type:"TRIGGER.PRESS_UP",hint:"decrement"})}}),incrementTriggerProps:normalize.button({...parts.incrementTrigger.attrs,dir:state.context.dir,id:dom.getIncrementTriggerId(state.context),disabled:isIncrementDisabled,"data-disabled":(0,import_dom_query2.dataAttr)(isIncrementDisabled),"aria-label":translations.incrementLabel,type:"button",tabIndex:-1,"aria-controls":dom.getInputId(state.context),onPointerDown(event){if(isIncrementDisabled||!(0,import_dom_event.isLeftClick)(event))return;send({type:"TRIGGER.PRESS_DOWN",hint:"increment",pointerType:event.pointerType});if(event.pointerType==="mouse"){event.preventDefault()}if(event.pointerType==="touch"){event.currentTarget?.focus({preventScroll:true})}},onPointerUp(event){send({type:"TRIGGER.PRESS_UP",hint:"increment",pointerType:event.pointerType})},onPointerLeave(event){send({type:"TRIGGER.PRESS_UP",hint:"increment",pointerType:event.pointerType})}}),scrubberProps:normalize.element({...parts.scrubber.attrs,dir:state.context.dir,"data-disabled":(0,import_dom_query2.dataAttr)(disabled),id:dom.getScrubberId(state.context),role:"presentation",onMouseDown(event){if(disabled)return;const point=(0,import_dom_event.getEventPoint)(event);point.x=point.x-(0,import_number_utils2.roundToDevicePixel)(7.5);point.y=point.y-(0,import_number_utils2.roundToDevicePixel)(7.5);send({type:"SCRUBBER.PRESS_DOWN",point});event.preventDefault()},style:{cursor:disabled?void 0:"ew-resize"}})}}var import_core2=require("@zag-js/core");var import_dom_event2=require("@zag-js/dom-event");var import_dom_query3=require("@zag-js/dom-query");var import_form_utils=require("@zag-js/form-utils");var import_number_utils3=require("@zag-js/number-utils");var import_utils=require("@zag-js/utils");function recordCursor(inputEl){if(inputEl.ownerDocument.activeElement!==inputEl)return;try{const{selectionStart:start,selectionEnd:end,value}=inputEl;const beforeTxt=value.substring(0,start);const afterTxt=value.substring(end);return{start,end,value,beforeTxt,afterTxt}}catch{}}function restoreCursor(inputEl,selection){if(inputEl.ownerDocument.activeElement!==inputEl)return;if(!selection){inputEl.setSelectionRange(inputEl.value.length,inputEl.value.length);return}try{const{value}=inputEl;const{beforeTxt="",afterTxt="",start}=selection;let startPos=value.length;if(value.endsWith(afterTxt)){startPos=value.length-afterTxt.length}else if(value.startsWith(beforeTxt)){startPos=beforeTxt.length}else if(start!=null){const beforeLastChar=beforeTxt[start-1];const newIndex=value.indexOf(beforeLastChar,start-1);if(newIndex!==-1){startPos=newIndex+1}}inputEl.setSelectionRange(startPos,startPos)}catch{}}var import_number=require("@internationalized/number");var import_core=require("@zag-js/core");var createFormatter=(locale,options={})=>{return(0,import_core.ref)(new Intl.NumberFormat(locale,options))};var createParser=(locale,options={})=>{return(0,import_core.ref)(new import_number.NumberParser(locale,options))};var parseValue=(ctx,value)=>{if(!ctx.formatOptions)return parseFloat(value);return ctx.parser.parse(String(value))};var formatValue=(ctx,value)=>{if(Number.isNaN(value))return"";if(!ctx.formatOptions)return value.toString();return ctx.formatter.format(value)};var{not,and}=import_core2.guards;function machine(userContext){const ctx=(0,import_utils.compact)(userContext);return(0,import_core2.createMachine)({id:"number-input",initial:"idle",context:{dir:"ltr",locale:"en-US",focusInputOnChange:true,clampValueOnBlur:true,allowOverflow:false,inputMode:"decimal",pattern:"[0-9]*(.[0-9]+)?",value:"",step:1,min:Number.MIN_SAFE_INTEGER,max:Number.MAX_SAFE_INTEGER,invalid:false,spinOnPress:true,...ctx,hint:null,scrubberCursorPoint:null,fieldsetDisabled:false,formatter:createFormatter(ctx.locale||"en-US",ctx.formatOptions),parser:createParser(ctx.locale||"en-US",ctx.formatOptions),translations:{incrementLabel:"increment value",decrementLabel:"decrease value",...ctx.translations}},computed:{isRtl:ctx2=>ctx2.dir==="rtl",valueAsNumber:ctx2=>parseValue(ctx2,ctx2.value),formattedValue:ctx2=>formatValue(ctx2,ctx2.valueAsNumber),isAtMin:ctx2=>(0,import_number_utils3.isAtMin)(ctx2.valueAsNumber,ctx2),isAtMax:ctx2=>(0,import_number_utils3.isAtMax)(ctx2.valueAsNumber,ctx2),isOutOfRange:ctx2=>!(0,import_number_utils3.isWithinRange)(ctx2.valueAsNumber,ctx2),isValueEmpty:ctx2=>ctx2.value==="",isDisabled:ctx2=>!!ctx2.disabled||ctx2.fieldsetDisabled,canIncrement:ctx2=>ctx2.allowOverflow||!ctx2.isAtMax,canDecrement:ctx2=>ctx2.allowOverflow||!ctx2.isAtMin,valueText:ctx2=>ctx2.translations.valueText?.(ctx2.value)},watch:{formatOptions:["setFormatterAndParser","syncInputElement"],locale:["setFormatterAndParser","syncInputElement"],value:["syncInputElement"],isOutOfRange:["invokeOnInvalid"],scrubberCursorPoint:["setVirtualCursorPosition"]},activities:["trackFormControl"],on:{"VALUE.SET":{actions:["setRawValue","setHintToSet"]},"VALUE.CLEAR":{actions:["clearValue"]},"VALUE.INCREMENT":{actions:["increment"]},"VALUE.DECREMENT":{actions:["decrement"]}},states:{idle:{on:{"TRIGGER.PRESS_DOWN":[{guard:"isTouchPointer",target:"before:spin",actions:["setHint"]},{target:"before:spin",actions:["focusInput","invokeOnFocus","setHint"]}],"SCRUBBER.PRESS_DOWN":{target:"scrubbing",actions:["focusInput","invokeOnFocus","setHint","setCursorPoint"]},"INPUT.FOCUS":{target:"focused",actions:["focusInput","invokeOnFocus"]}}},focused:{tags:"focus",activities:"attachWheelListener",on:{"TRIGGER.PRESS_DOWN":[{guard:"isTouchPointer",target:"before:spin",actions:["setHint"]},{target:"before:spin",actions:["focusInput","setHint"]}],"SCRUBBER.PRESS_DOWN":{target:"scrubbing",actions:["focusInput","setHint","setCursorPoint"]},"INPUT.ARROW_UP":{actions:"increment"},"INPUT.ARROW_DOWN":{actions:"decrement"},"INPUT.HOME":{actions:"decrementToMin"},"INPUT.END":{actions:"incrementToMax"},"INPUT.CHANGE":{actions:["setValue","setHint"]},"INPUT.COMMIT":[{guard:and("clampValueOnBlur",not("isInRange")),target:"idle",actions:["setClampedValue","clearHint","invokeOnBlur"]},{target:"idle",actions:["setFormattedValue","clearHint","invokeOnBlur"]}]}},"before:spin":{tags:"focus",activities:"trackButtonDisabled",entry:(0,import_core2.choose)([{guard:"isIncrementHint",actions:"increment"},{guard:"isDecrementHint",actions:"decrement"}]),after:{CHANGE_DELAY:{target:"spinning",guard:and("isInRange","spinOnPress")}},on:{"TRIGGER.PRESS_UP":[{guard:"isTouchPointer",target:"focused",actions:"clearHint"},{target:"focused",actions:["focusInput","clearHint"]}]}},spinning:{tags:"focus",activities:"trackButtonDisabled",every:[{delay:"CHANGE_INTERVAL",guard:and(not("isAtMin"),"isIncrementHint"),actions:"increment"},{delay:"CHANGE_INTERVAL",guard:and(not("isAtMax"),"isDecrementHint"),actions:"decrement"}],on:{"TRIGGER.PRESS_UP":{target:"focused",actions:["focusInput","clearHint"]}}},scrubbing:{tags:"focus",activities:["activatePointerLock","trackMousemove","setupVirtualCursor","preventTextSelection"],on:{"SCRUBBER.POINTER_UP":{target:"focused",actions:["focusInput","clearCursorPoint"]},"SCRUBBER.POINTER_MOVE":[{guard:"isIncrementHint",actions:["increment","setCursorPoint"]},{guard:"isDecrementHint",actions:["decrement","setCursorPoint"]}]}}}},{delays:{CHANGE_INTERVAL:50,CHANGE_DELAY:300},guards:{clampValueOnBlur:ctx2=>ctx2.clampValueOnBlur,isAtMin:ctx2=>ctx2.isAtMin,spinOnPress:ctx2=>!!ctx2.spinOnPress,isAtMax:ctx2=>ctx2.isAtMax,isInRange:ctx2=>!ctx2.isOutOfRange,isDecrementHint:(ctx2,evt)=>(evt.hint??ctx2.hint)==="decrement",isIncrementHint:(ctx2,evt)=>(evt.hint??ctx2.hint)==="increment",isTouchPointer:(_ctx,evt)=>evt.pointerType==="touch"},activities:{trackFormControl(ctx2,_evt,{initialContext}){const inputEl=dom.getInputEl(ctx2);return(0,import_form_utils.trackFormControl)(inputEl,{onFieldsetDisabledChange(disabled){ctx2.fieldsetDisabled=disabled},onFormReset(){set.value(ctx2,initialContext.value)}})},setupVirtualCursor(ctx2){return dom.setupVirtualCursor(ctx2)},preventTextSelection(ctx2){return dom.preventTextSelection(ctx2)},trackButtonDisabled(ctx2,_evt,{send}){const btn=dom.getPressedTriggerEl(ctx2,ctx2.hint);return(0,import_dom_query3.observeAttributes)(btn,{attributes:["disabled"],callback(){send({type:"TRIGGER.PRESS_UP",src:"attr"})}})},attachWheelListener(ctx2,_evt,{send}){const inputEl=dom.getInputEl(ctx2);if(!inputEl||!dom.isActiveElement(ctx2,inputEl)||!ctx2.allowMouseWheel)return;function onWheel(event){event.preventDefault();const dir=Math.sign(event.deltaY)*-1;if(dir===1){send("VALUE.INCREMENT")}else if(dir===-1){send("VALUE.DECREMENT")}}return(0,import_dom_event2.addDomEvent)(inputEl,"wheel",onWheel,{passive:false})},activatePointerLock(ctx2){if((0,import_dom_query3.isSafari)())return;return(0,import_dom_event2.requestPointerLock)(dom.getDoc(ctx2))},trackMousemove(ctx2,_evt,{send}){const doc=dom.getDoc(ctx2);function onMousemove(event){if(!ctx2.scrubberCursorPoint)return;const value=dom.getMousementValue(ctx2,event);if(!value.hint)return;send({type:"SCRUBBER.POINTER_MOVE",hint:value.hint,point:value.point})}function onMouseup(){send("SCRUBBER.POINTER_UP")}return(0,import_utils.callAll)((0,import_dom_event2.addDomEvent)(doc,"mousemove",onMousemove,false),(0,import_dom_event2.addDomEvent)(doc,"mouseup",onMouseup,false))}},actions:{focusInput(ctx2){if(!ctx2.focusInputOnChange)return;const inputEl=dom.getInputEl(ctx2);if(dom.isActiveElement(ctx2,inputEl))return;(0,import_dom_query3.raf)(()=>inputEl?.focus({preventScroll:true}))},increment(ctx2,evt){const nextValue=(0,import_number_utils3.increment)(ctx2.valueAsNumber,evt.step??ctx2.step);const value=formatValue(ctx2,(0,import_number_utils3.clamp)(nextValue,ctx2));set.value(ctx2,value)},decrement(ctx2,evt){const nextValue=(0,import_number_utils3.decrement)(ctx2.valueAsNumber,evt.step??ctx2.step);const value=formatValue(ctx2,(0,import_number_utils3.clamp)(nextValue,ctx2));set.value(ctx2,value)},setClampedValue(ctx2){const nextValue=(0,import_number_utils3.clamp)(ctx2.valueAsNumber,ctx2);set.value(ctx2,formatValue(ctx2,nextValue))},setRawValue(ctx2,evt){const parsedValue=parseValue(ctx2,evt.value);const value=formatValue(ctx2,(0,import_number_utils3.clamp)(parsedValue,ctx2));set.value(ctx2,value)},setValue(ctx2,evt){const value=evt.target?.value??evt.value;set.value(ctx2,value)},clearValue(ctx2){set.value(ctx2,"")},incrementToMax(ctx2){const value=formatValue(ctx2,ctx2.max);set.value(ctx2,value)},decrementToMin(ctx2){const value=formatValue(ctx2,ctx2.min);set.value(ctx2,value)},setHint(ctx2,evt){ctx2.hint=evt.hint},clearHint(ctx2){ctx2.hint=null},setHintToSet(ctx2){ctx2.hint="set"},invokeOnFocus(ctx2){ctx2.onFocusChange?.({focused:true,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},invokeOnBlur(ctx2){ctx2.onFocusChange?.({focused:false,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},invokeOnInvalid(ctx2){if(!ctx2.isOutOfRange)return;const reason=ctx2.valueAsNumber>ctx2.max?"rangeOverflow":"rangeUnderflow";ctx2.onValueInvalid?.({reason,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},syncInputElement(ctx2,evt){const value=evt.type.endsWith("CHANGE")?ctx2.value:ctx2.formattedValue;sync.input(ctx2,value)},setFormattedValue(ctx2){set.value(ctx2,ctx2.formattedValue)},setCursorPoint(ctx2,evt){ctx2.scrubberCursorPoint=evt.point},clearCursorPoint(ctx2){ctx2.scrubberCursorPoint=null},setVirtualCursorPosition(ctx2){const cursorEl=dom.getCursorEl(ctx2);if(!cursorEl||!ctx2.scrubberCursorPoint)return;const{x,y}=ctx2.scrubberCursorPoint;cursorEl.style.transform=`translate3d(${x}px, ${y}px, 0px)`},setFormatterAndParser(ctx2){if(!ctx2.locale)return;ctx2.formatter=createFormatter(ctx2.locale,ctx2.formatOptions);ctx2.parser=createParser(ctx2.locale,ctx2.formatOptions)}},compareFns:{formatOptions:(a,b)=>(0,import_utils.isEqual)(a,b),scrubberCursorPoint:(a,b)=>(0,import_utils.isEqual)(a,b)}})}var sync={input(ctx,value){const inputEl=dom.getInputEl(ctx);if(!inputEl)return;const sel=recordCursor(inputEl);(0,import_dom_query3.raf)(()=>{dom.setValue(inputEl,value);restoreCursor(inputEl,sel)})}};var invoke={onChange:ctx=>{ctx.onValueChange?.({value:ctx.value,valueAsNumber:ctx.valueAsNumber})}};var set={value:(ctx,value)=>{if((0,import_utils.isEqual)(ctx.value,value))return;ctx.value=value;invoke.onChange(ctx)}};0&&(module.exports={anatomy,connect,machine});
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/number-input.anatomy.ts","../src/number-input.connect.ts","../src/number-input.dom.ts","../src/number-input.machine.ts","../src/cursor.ts","../src/number-input.utils.ts"],"sourcesContent":["export { anatomy } from \"./number-input.anatomy\"\nexport { connect } from \"./number-input.connect\"\nexport { machine } from \"./number-input.machine\"\nexport type {\n MachineApi as Api,\n UserDefinedContext as Context,\n ElementIds,\n FocusChangeDetails,\n IntlTranslations,\n ValueChangeDetails,\n ValueInvalidDetails,\n} from \"./number-input.types\"\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"numberInput\").parts(\n \"root\",\n \"label\",\n \"input\",\n \"control\",\n \"incrementTrigger\",\n \"decrementTrigger\",\n \"scrubber\",\n)\n\nexport const parts = anatomy.build()\n","import { getEventPoint, getEventStep, getNativeEvent, isLeftClick, type EventKeyMap } from \"@zag-js/dom-event\"\nimport { ariaAttr, dataAttr } from \"@zag-js/dom-query\"\nimport { roundToDevicePixel } from \"@zag-js/number-utils\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./number-input.anatomy\"\nimport { dom } from \"./number-input.dom\"\nimport type { MachineApi, Send, State } from \"./number-input.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const focused = state.hasTag(\"focus\")\n const disabled = state.context.isDisabled\n const readOnly = state.context.readOnly\n\n const empty = state.context.isValueEmpty\n const invalid = state.context.isOutOfRange || !!state.context.invalid\n\n const isIncrementDisabled = disabled || !state.context.canIncrement || readOnly\n const isDecrementDisabled = disabled || !state.context.canDecrement || readOnly\n\n const translations = state.context.translations\n\n return {\n focused: focused,\n invalid: invalid,\n empty: empty,\n value: state.context.formattedValue,\n valueAsNumber: state.context.valueAsNumber,\n setValue(value) {\n send({ type: \"VALUE.SET\", value })\n },\n clearValue() {\n send(\"VALUE.CLEAR\")\n },\n increment() {\n send(\"VALUE.INCREMENT\")\n },\n decrement() {\n send(\"VALUE.DECREMENT\")\n },\n setToMax() {\n send({ type: \"VALUE.SET\", value: state.context.max })\n },\n setToMin() {\n send({ type: \"VALUE.SET\", value: state.context.min })\n },\n focus() {\n dom.getInputEl(state.context)?.focus()\n },\n\n rootProps: normalize.element({\n id: dom.getRootId(state.context),\n ...parts.root.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n \"data-focus\": dataAttr(focused),\n \"data-invalid\": dataAttr(invalid),\n }),\n\n labelProps: normalize.label({\n ...parts.label.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n \"data-focus\": dataAttr(focused),\n \"data-invalid\": dataAttr(invalid),\n id: dom.getLabelId(state.context),\n htmlFor: dom.getInputId(state.context),\n }),\n\n controlProps: normalize.element({\n ...parts.control.attrs,\n dir: state.context.dir,\n role: \"group\",\n \"aria-disabled\": disabled,\n \"data-focus\": dataAttr(focused),\n \"data-disabled\": dataAttr(disabled),\n \"data-invalid\": dataAttr(invalid),\n \"aria-invalid\": ariaAttr(state.context.invalid),\n }),\n\n inputProps: normalize.input({\n ...parts.input.attrs,\n dir: state.context.dir,\n name: state.context.name,\n form: state.context.form,\n id: dom.getInputId(state.context),\n role: \"spinbutton\",\n defaultValue: state.context.formattedValue,\n pattern: state.context.pattern,\n inputMode: state.context.inputMode,\n \"aria-invalid\": ariaAttr(invalid),\n \"data-invalid\": dataAttr(invalid),\n disabled: disabled,\n \"data-disabled\": dataAttr(disabled),\n readOnly: !!state.context.readOnly,\n autoComplete: \"off\",\n autoCorrect: \"off\",\n spellCheck: \"false\",\n type: \"text\",\n \"aria-roledescription\": \"numberfield\",\n \"aria-valuemin\": state.context.min,\n \"aria-valuemax\": state.context.max,\n \"aria-valuenow\": Number.isNaN(state.context.valueAsNumber) ? undefined : state.context.valueAsNumber,\n \"aria-valuetext\": state.context.valueText,\n onFocus() {\n send(\"INPUT.FOCUS\")\n },\n onBlur() {\n send({ type: \"INPUT.COMMIT\", src: \"blur\" })\n },\n onChange(event) {\n send({ type: \"INPUT.CHANGE\", target: event.currentTarget, hint: \"set\" })\n },\n onBeforeInput(event) {\n try {\n const { selectionStart, selectionEnd, value } = event.currentTarget\n\n const nextValue = value.slice(0, selectionStart!) + ((event as any).data ?? \"\") + value.slice(selectionEnd!)\n const isValid = state.context.parser.isValidPartialNumber(nextValue)\n\n if (!isValid) {\n event.preventDefault()\n }\n } catch {\n // noop\n }\n },\n onKeyDown(event) {\n if (event.defaultPrevented) return\n if (readOnly) return\n const evt = getNativeEvent(event)\n if (evt.isComposing) return\n\n const step = getEventStep(event) * state.context.step\n\n const keyMap: EventKeyMap = {\n ArrowUp() {\n send({ type: \"INPUT.ARROW_UP\", step })\n event.preventDefault()\n },\n ArrowDown() {\n send({ type: \"INPUT.ARROW_DOWN\", step })\n event.preventDefault()\n },\n Home() {\n send(\"INPUT.HOME\")\n event.preventDefault()\n },\n End() {\n send(\"INPUT.END\")\n event.preventDefault()\n },\n Enter() {\n send({ type: \"INPUT.COMMIT\", src: \"enter\" })\n },\n }\n\n const exec = keyMap[event.key]\n exec?.(event)\n },\n }),\n\n decrementTriggerProps: normalize.button({\n ...parts.decrementTrigger.attrs,\n dir: state.context.dir,\n id: dom.getDecrementTriggerId(state.context),\n disabled: isDecrementDisabled,\n \"data-disabled\": dataAttr(isDecrementDisabled),\n \"aria-label\": translations.decrementLabel,\n type: \"button\",\n tabIndex: -1,\n \"aria-controls\": dom.getInputId(state.context),\n onPointerDown(event) {\n if (isDecrementDisabled || !isLeftClick(event)) return\n send({ type: \"TRIGGER.PRESS_DOWN\", hint: \"decrement\", pointerType: event.pointerType })\n if (event.pointerType === \"mouse\") {\n event.preventDefault()\n }\n if (event.pointerType === \"touch\") {\n event.currentTarget?.focus({ preventScroll: true })\n }\n },\n onPointerUp(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"decrement\", pointerType: event.pointerType })\n },\n onPointerLeave() {\n if (isDecrementDisabled) return\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"decrement\" })\n },\n }),\n\n incrementTriggerProps: normalize.button({\n ...parts.incrementTrigger.attrs,\n dir: state.context.dir,\n id: dom.getIncrementTriggerId(state.context),\n disabled: isIncrementDisabled,\n \"data-disabled\": dataAttr(isIncrementDisabled),\n \"aria-label\": translations.incrementLabel,\n type: \"button\",\n tabIndex: -1,\n \"aria-controls\": dom.getInputId(state.context),\n onPointerDown(event) {\n if (isIncrementDisabled || !isLeftClick(event)) return\n send({ type: \"TRIGGER.PRESS_DOWN\", hint: \"increment\", pointerType: event.pointerType })\n if (event.pointerType === \"mouse\") {\n event.preventDefault()\n }\n if (event.pointerType === \"touch\") {\n event.currentTarget?.focus({ preventScroll: true })\n }\n },\n onPointerUp(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"increment\", pointerType: event.pointerType })\n },\n onPointerLeave(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"increment\", pointerType: event.pointerType })\n },\n }),\n\n scrubberProps: normalize.element({\n ...parts.scrubber.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n id: dom.getScrubberId(state.context),\n role: \"presentation\",\n onMouseDown(event) {\n if (disabled) return\n\n const evt = getNativeEvent(event)\n const point = getEventPoint(evt)\n\n point.x = point.x - roundToDevicePixel(7.5)\n point.y = point.y - roundToDevicePixel(7.5)\n\n send({ type: \"SCRUBBER.PRESS_DOWN\", point })\n event.preventDefault()\n },\n style: {\n cursor: disabled ? undefined : \"ew-resize\",\n },\n }),\n }\n}\n","import { createScope, isSafari, MAX_Z_INDEX } from \"@zag-js/dom-query\"\nimport { roundToDevicePixel, wrap } from \"@zag-js/number-utils\"\nimport type { MachineContext as Ctx } from \"./number-input.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `number-input:${ctx.id}`,\n getInputId: (ctx: Ctx) => ctx.ids?.input ?? `number-input:${ctx.id}:input`,\n getIncrementTriggerId: (ctx: Ctx) => ctx.ids?.incrementTrigger ?? `number-input:${ctx.id}:inc`,\n getDecrementTriggerId: (ctx: Ctx) => ctx.ids?.decrementTrigger ?? `number-input:${ctx.id}:dec`,\n getScrubberId: (ctx: Ctx) => ctx.ids?.scrubber ?? `number-input:${ctx.id}:scrubber`,\n getCursorId: (ctx: Ctx) => `number-input:${ctx.id}:cursor`,\n getLabelId: (ctx: Ctx) => ctx.ids?.label ?? `number-input:${ctx.id}:label`,\n\n getInputEl: (ctx: Ctx) => dom.getById<HTMLInputElement>(ctx, dom.getInputId(ctx)),\n getIncrementTriggerEl: (ctx: Ctx) => dom.getById<HTMLButtonElement>(ctx, dom.getIncrementTriggerId(ctx)),\n getDecrementTriggerEl: (ctx: Ctx) => dom.getById<HTMLButtonElement>(ctx, dom.getDecrementTriggerId(ctx)),\n getScrubberEl: (ctx: Ctx) => dom.getById(ctx, dom.getScrubberId(ctx)),\n getCursorEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getCursorId(ctx)),\n\n getPressedTriggerEl: (ctx: Ctx, hint = ctx.hint) => {\n let btnEl: HTMLButtonElement | null = null\n if (hint === \"increment\") {\n btnEl = dom.getIncrementTriggerEl(ctx)\n }\n if (hint === \"decrement\") {\n btnEl = dom.getDecrementTriggerEl(ctx)\n }\n return btnEl\n },\n\n setupVirtualCursor(ctx: Ctx) {\n if (isSafari()) return\n dom.createVirtualCursor(ctx)\n return () => {\n dom.getCursorEl(ctx)?.remove()\n }\n },\n\n preventTextSelection(ctx: Ctx) {\n const doc = dom.getDoc(ctx)\n const html = doc.documentElement\n const body = doc.body\n\n body.style.pointerEvents = \"none\"\n html.style.userSelect = \"none\"\n html.style.cursor = \"ew-resize\"\n\n return () => {\n body.style.pointerEvents = \"\"\n html.style.userSelect = \"\"\n html.style.cursor = \"\"\n if (!html.style.length) {\n html.removeAttribute(\"style\")\n }\n if (!body.style.length) {\n body.removeAttribute(\"style\")\n }\n }\n },\n\n getMousementValue(ctx: Ctx, event: MouseEvent) {\n const x = roundToDevicePixel(event.movementX)\n const y = roundToDevicePixel(event.movementY)\n\n let hint = x > 0 ? \"increment\" : x < 0 ? \"decrement\" : null\n\n if (ctx.isRtl && hint === \"increment\") hint = \"decrement\"\n if (ctx.isRtl && hint === \"decrement\") hint = \"increment\"\n\n const point = {\n x: ctx.scrubberCursorPoint!.x + x,\n y: ctx.scrubberCursorPoint!.y + y,\n }\n\n const win = dom.getWin(ctx)\n const width = win.innerWidth\n const half = roundToDevicePixel(7.5)\n point.x = wrap(point.x + half, width) - half\n\n return { hint, point }\n },\n\n createVirtualCursor(ctx: Ctx) {\n const doc = dom.getDoc(ctx)\n const el = doc.createElement(\"div\")\n el.className = \"scrubber--cursor\"\n el.id = dom.getCursorId(ctx)\n\n Object.assign(el.style, {\n width: \"15px\",\n height: \"15px\",\n position: \"fixed\",\n pointerEvents: \"none\",\n left: \"0px\",\n top: \"0px\",\n zIndex: MAX_Z_INDEX,\n transform: ctx.scrubberCursorPoint\n ? `translate3d(${ctx.scrubberCursorPoint.x}px, ${ctx.scrubberCursorPoint.y}px, 0px)`\n : undefined,\n willChange: \"transform\",\n })\n\n el.innerHTML = `\n <svg width=\"46\" height=\"15\" style=\"left: -15.5px; position: absolute; top: 0; filter: drop-shadow(rgba(0, 0, 0, 0.4) 0px 1px 1.1px);\">\n <g transform=\"translate(2 3)\">\n <path fill-rule=\"evenodd\" d=\"M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z\" style=\"stroke-width: 2px; stroke: white;\"></path>\n <path fill-rule=\"evenodd\" d=\"M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z\"></path>\n </g>\n </svg>`\n\n doc.body.appendChild(el)\n },\n})\n","import { choose, createMachine, guards } from \"@zag-js/core\"\nimport { addDomEvent, requestPointerLock } from \"@zag-js/dom-event\"\nimport { isSafari, observeAttributes, raf } from \"@zag-js/dom-query\"\nimport { trackFormControl } from \"@zag-js/form-utils\"\nimport { clamp, decrement, increment, isAtMax, isAtMin, isWithinRange } from \"@zag-js/number-utils\"\nimport { callAll, compact, isEqual } from \"@zag-js/utils\"\nimport { recordCursor, restoreCursor } from \"./cursor\"\nimport { dom } from \"./number-input.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./number-input.types\"\nimport { createFormatter, createParser, formatValue, parseValue } from \"./number-input.utils\"\n\nconst { not, and } = guards\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"number-input\",\n initial: \"idle\",\n context: {\n dir: \"ltr\",\n locale: \"en-US\",\n focusInputOnChange: true,\n clampValueOnBlur: true,\n allowOverflow: false,\n inputMode: \"decimal\",\n pattern: \"[0-9]*(.[0-9]+)?\",\n value: \"\",\n step: 1,\n min: Number.MIN_SAFE_INTEGER,\n max: Number.MAX_SAFE_INTEGER,\n invalid: false,\n spinOnPress: true,\n ...ctx,\n hint: null,\n scrubberCursorPoint: null,\n fieldsetDisabled: false,\n formatter: createFormatter(ctx.locale || \"en-US\", ctx.formatOptions),\n parser: createParser(ctx.locale || \"en-US\", ctx.formatOptions),\n translations: {\n incrementLabel: \"increment value\",\n decrementLabel: \"decrease value\",\n ...ctx.translations,\n },\n },\n\n computed: {\n isRtl: (ctx) => ctx.dir === \"rtl\",\n valueAsNumber: (ctx) => parseValue(ctx, ctx.value),\n formattedValue: (ctx) => formatValue(ctx, ctx.valueAsNumber),\n isAtMin: (ctx) => isAtMin(ctx.valueAsNumber, ctx),\n isAtMax: (ctx) => isAtMax(ctx.valueAsNumber, ctx),\n isOutOfRange: (ctx) => !isWithinRange(ctx.valueAsNumber, ctx),\n isValueEmpty: (ctx) => ctx.value === \"\",\n isDisabled: (ctx) => !!ctx.disabled || ctx.fieldsetDisabled,\n canIncrement: (ctx) => ctx.allowOverflow || !ctx.isAtMax,\n canDecrement: (ctx) => ctx.allowOverflow || !ctx.isAtMin,\n valueText: (ctx) => ctx.translations.valueText?.(ctx.value),\n },\n\n watch: {\n formatOptions: [\"setFormatterAndParser\", \"syncInputElement\"],\n locale: [\"setFormatterAndParser\", \"syncInputElement\"],\n value: [\"syncInputElement\"],\n isOutOfRange: [\"invokeOnInvalid\"],\n scrubberCursorPoint: [\"setVirtualCursorPosition\"],\n },\n\n activities: [\"trackFormControl\"],\n\n on: {\n \"VALUE.SET\": {\n actions: [\"setRawValue\", \"setHintToSet\"],\n },\n \"VALUE.CLEAR\": {\n actions: [\"clearValue\"],\n },\n \"VALUE.INCREMENT\": {\n actions: [\"increment\"],\n },\n \"VALUE.DECREMENT\": {\n actions: [\"decrement\"],\n },\n },\n\n states: {\n idle: {\n on: {\n \"TRIGGER.PRESS_DOWN\": [\n { guard: \"isTouchPointer\", target: \"before:spin\", actions: [\"setHint\"] },\n {\n target: \"before:spin\",\n actions: [\"focusInput\", \"invokeOnFocus\", \"setHint\"],\n },\n ],\n \"SCRUBBER.PRESS_DOWN\": {\n target: \"scrubbing\",\n actions: [\"focusInput\", \"invokeOnFocus\", \"setHint\", \"setCursorPoint\"],\n },\n \"INPUT.FOCUS\": {\n target: \"focused\",\n actions: [\"focusInput\", \"invokeOnFocus\"],\n },\n },\n },\n\n focused: {\n tags: \"focus\",\n activities: \"attachWheelListener\",\n on: {\n \"TRIGGER.PRESS_DOWN\": [\n { guard: \"isTouchPointer\", target: \"before:spin\", actions: [\"setHint\"] },\n { target: \"before:spin\", actions: [\"focusInput\", \"setHint\"] },\n ],\n \"SCRUBBER.PRESS_DOWN\": {\n target: \"scrubbing\",\n actions: [\"focusInput\", \"setHint\", \"setCursorPoint\"],\n },\n \"INPUT.ARROW_UP\": {\n actions: \"increment\",\n },\n \"INPUT.ARROW_DOWN\": {\n actions: \"decrement\",\n },\n \"INPUT.HOME\": {\n actions: \"decrementToMin\",\n },\n \"INPUT.END\": {\n actions: \"incrementToMax\",\n },\n \"INPUT.CHANGE\": {\n actions: [\"setValue\", \"setHint\"],\n },\n \"INPUT.COMMIT\": [\n {\n guard: and(\"clampValueOnBlur\", not(\"isInRange\")),\n target: \"idle\",\n actions: [\"setClampedValue\", \"clearHint\", \"invokeOnBlur\"],\n },\n {\n target: \"idle\",\n actions: [\"setFormattedValue\", \"clearHint\", \"invokeOnBlur\"],\n },\n ],\n },\n },\n\n \"before:spin\": {\n tags: \"focus\",\n activities: \"trackButtonDisabled\",\n entry: choose([\n { guard: \"isIncrementHint\", actions: \"increment\" },\n { guard: \"isDecrementHint\", actions: \"decrement\" },\n ]),\n after: {\n CHANGE_DELAY: {\n target: \"spinning\",\n guard: and(\"isInRange\", \"spinOnPress\"),\n },\n },\n on: {\n \"TRIGGER.PRESS_UP\": [\n { guard: \"isTouchPointer\", target: \"focused\", actions: \"clearHint\" },\n { target: \"focused\", actions: [\"focusInput\", \"clearHint\"] },\n ],\n },\n },\n\n spinning: {\n tags: \"focus\",\n activities: \"trackButtonDisabled\",\n every: [\n {\n delay: \"CHANGE_INTERVAL\",\n guard: and(not(\"isAtMin\"), \"isIncrementHint\"),\n actions: \"increment\",\n },\n {\n delay: \"CHANGE_INTERVAL\",\n guard: and(not(\"isAtMax\"), \"isDecrementHint\"),\n actions: \"decrement\",\n },\n ],\n on: {\n \"TRIGGER.PRESS_UP\": {\n target: \"focused\",\n actions: [\"focusInput\", \"clearHint\"],\n },\n },\n },\n\n scrubbing: {\n tags: \"focus\",\n activities: [\"activatePointerLock\", \"trackMousemove\", \"setupVirtualCursor\", \"preventTextSelection\"],\n on: {\n \"SCRUBBER.POINTER_UP\": {\n target: \"focused\",\n actions: [\"focusInput\", \"clearCursorPoint\"],\n },\n \"SCRUBBER.POINTER_MOVE\": [\n {\n guard: \"isIncrementHint\",\n actions: [\"increment\", \"setCursorPoint\"],\n },\n {\n guard: \"isDecrementHint\",\n actions: [\"decrement\", \"setCursorPoint\"],\n },\n ],\n },\n },\n },\n },\n {\n delays: {\n CHANGE_INTERVAL: 50,\n CHANGE_DELAY: 300,\n },\n\n guards: {\n clampValueOnBlur: (ctx) => ctx.clampValueOnBlur,\n isAtMin: (ctx) => ctx.isAtMin,\n spinOnPress: (ctx) => !!ctx.spinOnPress,\n isAtMax: (ctx) => ctx.isAtMax,\n isInRange: (ctx) => !ctx.isOutOfRange,\n isDecrementHint: (ctx, evt) => (evt.hint ?? ctx.hint) === \"decrement\",\n isIncrementHint: (ctx, evt) => (evt.hint ?? ctx.hint) === \"increment\",\n isTouchPointer: (_ctx, evt) => evt.pointerType === \"touch\",\n },\n\n activities: {\n trackFormControl(ctx, _evt, { initialContext }) {\n const inputEl = dom.getInputEl(ctx)\n return trackFormControl(inputEl, {\n onFieldsetDisabledChange(disabled) {\n ctx.fieldsetDisabled = disabled\n },\n onFormReset() {\n set.value(ctx, initialContext.value)\n },\n })\n },\n setupVirtualCursor(ctx) {\n return dom.setupVirtualCursor(ctx)\n },\n preventTextSelection(ctx) {\n return dom.preventTextSelection(ctx)\n },\n trackButtonDisabled(ctx, _evt, { send }) {\n const btn = dom.getPressedTriggerEl(ctx, ctx.hint)\n return observeAttributes(btn, {\n attributes: [\"disabled\"],\n callback() {\n send({ type: \"TRIGGER.PRESS_UP\", src: \"attr\" })\n },\n })\n },\n attachWheelListener(ctx, _evt, { send }) {\n const inputEl = dom.getInputEl(ctx)\n if (!inputEl || !dom.isActiveElement(ctx, inputEl) || !ctx.allowMouseWheel) return\n\n function onWheel(event: WheelEvent) {\n event.preventDefault()\n const dir = Math.sign(event.deltaY) * -1\n if (dir === 1) {\n send(\"VALUE.INCREMENT\")\n } else if (dir === -1) {\n send(\"VALUE.DECREMENT\")\n }\n }\n\n return addDomEvent(inputEl, \"wheel\", onWheel, { passive: false })\n },\n activatePointerLock(ctx) {\n if (isSafari()) return\n return requestPointerLock(dom.getDoc(ctx))\n },\n trackMousemove(ctx, _evt, { send }) {\n const doc = dom.getDoc(ctx)\n\n function onMousemove(event: MouseEvent) {\n if (!ctx.scrubberCursorPoint) return\n const value = dom.getMousementValue(ctx, event)\n if (!value.hint) return\n send({\n type: \"SCRUBBER.POINTER_MOVE\",\n hint: value.hint,\n point: value.point,\n })\n }\n\n function onMouseup() {\n send(\"SCRUBBER.POINTER_UP\")\n }\n\n return callAll(\n addDomEvent(doc, \"mousemove\", onMousemove, false),\n addDomEvent(doc, \"mouseup\", onMouseup, false),\n )\n },\n },\n\n actions: {\n focusInput(ctx) {\n if (!ctx.focusInputOnChange) return\n const inputEl = dom.getInputEl(ctx)\n if (dom.isActiveElement(ctx, inputEl)) return\n raf(() => inputEl?.focus({ preventScroll: true }))\n },\n increment(ctx, evt) {\n const nextValue = increment(ctx.valueAsNumber, evt.step ?? ctx.step)\n const value = formatValue(ctx, clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n decrement(ctx, evt) {\n const nextValue = decrement(ctx.valueAsNumber, evt.step ?? ctx.step)\n const value = formatValue(ctx, clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n setClampedValue(ctx) {\n const nextValue = clamp(ctx.valueAsNumber, ctx)\n set.value(ctx, formatValue(ctx, nextValue))\n },\n setRawValue(ctx, evt) {\n const parsedValue = parseValue(ctx, evt.value)\n const value = formatValue(ctx, clamp(parsedValue, ctx))\n set.value(ctx, value)\n },\n setValue(ctx, evt) {\n const value = evt.target?.value ?? evt.value\n set.value(ctx, value)\n },\n clearValue(ctx) {\n set.value(ctx, \"\")\n },\n incrementToMax(ctx) {\n const value = formatValue(ctx, ctx.max)\n set.value(ctx, value)\n },\n decrementToMin(ctx) {\n const value = formatValue(ctx, ctx.min)\n set.value(ctx, value)\n },\n setHint(ctx, evt) {\n ctx.hint = evt.hint\n },\n clearHint(ctx) {\n ctx.hint = null\n },\n setHintToSet(ctx) {\n ctx.hint = \"set\"\n },\n invokeOnFocus(ctx) {\n ctx.onFocusChange?.({\n focused: true,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n invokeOnBlur(ctx) {\n ctx.onFocusChange?.({\n focused: false,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n invokeOnInvalid(ctx) {\n if (!ctx.isOutOfRange) return\n const reason = ctx.valueAsNumber > ctx.max ? \"rangeOverflow\" : \"rangeUnderflow\"\n ctx.onValueInvalid?.({\n reason,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n syncInputElement(ctx, evt) {\n const value = evt.type.endsWith(\"CHANGE\") ? ctx.value : ctx.formattedValue\n sync.input(ctx, value)\n },\n setFormattedValue(ctx) {\n set.value(ctx, ctx.formattedValue)\n },\n setCursorPoint(ctx, evt) {\n ctx.scrubberCursorPoint = evt.point\n },\n clearCursorPoint(ctx) {\n ctx.scrubberCursorPoint = null\n },\n setVirtualCursorPosition(ctx) {\n const cursorEl = dom.getCursorEl(ctx)\n if (!cursorEl || !ctx.scrubberCursorPoint) return\n const { x, y } = ctx.scrubberCursorPoint\n cursorEl.style.transform = `translate3d(${x}px, ${y}px, 0px)`\n },\n setFormatterAndParser(ctx) {\n if (!ctx.locale) return\n ctx.formatter = createFormatter(ctx.locale, ctx.formatOptions)\n ctx.parser = createParser(ctx.locale, ctx.formatOptions)\n },\n },\n compareFns: {\n formatOptions: (a, b) => isEqual(a, b),\n scrubberCursorPoint: (a, b) => isEqual(a, b),\n },\n },\n )\n}\n\nconst sync = {\n input(ctx: MachineContext, value: string) {\n const inputEl = dom.getInputEl(ctx)\n if (!inputEl) return\n\n // record cursor position before updating input value\n const sel = recordCursor(inputEl)\n\n // restore cursor position after updating input value\n raf(() => {\n dom.setValue(inputEl, value)\n restoreCursor(inputEl, sel)\n })\n },\n}\n\nconst invoke = {\n onChange: (ctx: MachineContext) => {\n ctx.onValueChange?.({\n value: ctx.value,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n}\n\nconst set = {\n value: (ctx: MachineContext, value: string) => {\n if (isEqual(ctx.value, value)) return\n ctx.value = value\n invoke.onChange(ctx)\n },\n}\n","/**\n * Credits: https://github.com/react-component/input-number/blob/master/src/hooks/useCursor.ts\n */\n\ninterface Selection {\n start?: number\n end?: number\n value?: string\n beforeTxt?: string\n afterTxt?: string\n}\n\nexport function recordCursor(inputEl: HTMLInputElement): Selection | undefined {\n if (inputEl.ownerDocument.activeElement !== inputEl) return\n try {\n const { selectionStart: start, selectionEnd: end, value } = inputEl\n const beforeTxt = value.substring(0, start!)\n const afterTxt = value.substring(end!)\n return {\n start: start!,\n end: end!,\n value,\n beforeTxt,\n afterTxt,\n }\n } catch {}\n}\n\nexport function restoreCursor(inputEl: HTMLInputElement, selection: Selection | undefined) {\n if (inputEl.ownerDocument.activeElement !== inputEl) return\n\n if (!selection) {\n inputEl.setSelectionRange(inputEl.value.length, inputEl.value.length)\n return\n }\n\n try {\n const { value } = inputEl\n const { beforeTxt = \"\", afterTxt = \"\", start } = selection\n\n let startPos = value.length\n\n if (value.endsWith(afterTxt)) {\n startPos = value.length - afterTxt.length\n } else if (value.startsWith(beforeTxt)) {\n startPos = beforeTxt.length\n } else if (start != null) {\n const beforeLastChar = beforeTxt[start - 1]\n const newIndex = value.indexOf(beforeLastChar, start - 1)\n if (newIndex !== -1) {\n startPos = newIndex + 1\n }\n }\n\n inputEl.setSelectionRange(startPos, startPos)\n } catch {}\n}\n","import { NumberParser } from \"@internationalized/number\"\nimport { ref } from \"@zag-js/core\"\nimport type { MachineContext } from \"./number-input.types\"\n\nexport const createFormatter = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n return ref(new Intl.NumberFormat(locale, options))\n}\n\nexport const createParser = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n return ref(new NumberParser(locale, options))\n}\n\nexport const parseValue = (ctx: MachineContext, value: string) => {\n if (!ctx.formatOptions) return parseFloat(value)\n return ctx.parser.parse(String(value))\n}\n\nexport const formatValue = (ctx: MachineContext, value: number): string => {\n if (Number.isNaN(value)) return \"\"\n if (!ctx.formatOptions) return value.toString()\n return ctx.formatter.format(value)\n}\n"],"mappings":"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","names":["import_dom_query","import_number_utils","import_core","import_dom_event","import_dom_query","import_number_utils","ctx"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/number-input.anatomy.ts","../src/number-input.connect.ts","../src/number-input.dom.ts","../src/number-input.machine.ts","../src/cursor.ts","../src/number-input.utils.ts"],"sourcesContent":["export { anatomy } from \"./number-input.anatomy\"\nexport { connect } from \"./number-input.connect\"\nexport { machine } from \"./number-input.machine\"\nexport type {\n MachineApi as Api,\n UserDefinedContext as Context,\n ElementIds,\n FocusChangeDetails,\n IntlTranslations,\n ValueChangeDetails,\n ValueInvalidDetails,\n} from \"./number-input.types\"\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"numberInput\").parts(\n \"root\",\n \"label\",\n \"input\",\n \"control\",\n \"incrementTrigger\",\n \"decrementTrigger\",\n \"scrubber\",\n)\n\nexport const parts = anatomy.build()\n","import { getEventPoint, getEventStep, isLeftClick, type EventKeyMap } from \"@zag-js/dom-event\"\nimport { ariaAttr, dataAttr, isComposingEvent } from \"@zag-js/dom-query\"\nimport { roundToDevicePixel } from \"@zag-js/number-utils\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./number-input.anatomy\"\nimport { dom } from \"./number-input.dom\"\nimport type { MachineApi, Send, State } from \"./number-input.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const focused = state.hasTag(\"focus\")\n const disabled = state.context.isDisabled\n const readOnly = state.context.readOnly\n\n const empty = state.context.isValueEmpty\n const invalid = state.context.isOutOfRange || !!state.context.invalid\n\n const isIncrementDisabled = disabled || !state.context.canIncrement || readOnly\n const isDecrementDisabled = disabled || !state.context.canDecrement || readOnly\n\n const translations = state.context.translations\n\n return {\n focused: focused,\n invalid: invalid,\n empty: empty,\n value: state.context.formattedValue,\n valueAsNumber: state.context.valueAsNumber,\n setValue(value) {\n send({ type: \"VALUE.SET\", value })\n },\n clearValue() {\n send(\"VALUE.CLEAR\")\n },\n increment() {\n send(\"VALUE.INCREMENT\")\n },\n decrement() {\n send(\"VALUE.DECREMENT\")\n },\n setToMax() {\n send({ type: \"VALUE.SET\", value: state.context.max })\n },\n setToMin() {\n send({ type: \"VALUE.SET\", value: state.context.min })\n },\n focus() {\n dom.getInputEl(state.context)?.focus()\n },\n\n rootProps: normalize.element({\n id: dom.getRootId(state.context),\n ...parts.root.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n \"data-focus\": dataAttr(focused),\n \"data-invalid\": dataAttr(invalid),\n }),\n\n labelProps: normalize.label({\n ...parts.label.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n \"data-focus\": dataAttr(focused),\n \"data-invalid\": dataAttr(invalid),\n id: dom.getLabelId(state.context),\n htmlFor: dom.getInputId(state.context),\n }),\n\n controlProps: normalize.element({\n ...parts.control.attrs,\n dir: state.context.dir,\n role: \"group\",\n \"aria-disabled\": disabled,\n \"data-focus\": dataAttr(focused),\n \"data-disabled\": dataAttr(disabled),\n \"data-invalid\": dataAttr(invalid),\n \"aria-invalid\": ariaAttr(state.context.invalid),\n }),\n\n inputProps: normalize.input({\n ...parts.input.attrs,\n dir: state.context.dir,\n name: state.context.name,\n form: state.context.form,\n id: dom.getInputId(state.context),\n role: \"spinbutton\",\n defaultValue: state.context.formattedValue,\n pattern: state.context.pattern,\n inputMode: state.context.inputMode,\n \"aria-invalid\": ariaAttr(invalid),\n \"data-invalid\": dataAttr(invalid),\n disabled: disabled,\n \"data-disabled\": dataAttr(disabled),\n readOnly: !!state.context.readOnly,\n autoComplete: \"off\",\n autoCorrect: \"off\",\n spellCheck: \"false\",\n type: \"text\",\n \"aria-roledescription\": \"numberfield\",\n \"aria-valuemin\": state.context.min,\n \"aria-valuemax\": state.context.max,\n \"aria-valuenow\": Number.isNaN(state.context.valueAsNumber) ? undefined : state.context.valueAsNumber,\n \"aria-valuetext\": state.context.valueText,\n onFocus() {\n send(\"INPUT.FOCUS\")\n },\n onBlur() {\n send({ type: \"INPUT.COMMIT\", src: \"blur\" })\n },\n onChange(event) {\n send({ type: \"INPUT.CHANGE\", target: event.currentTarget, hint: \"set\" })\n },\n onBeforeInput(event) {\n try {\n const { selectionStart, selectionEnd, value } = event.currentTarget\n\n const nextValue = value.slice(0, selectionStart!) + ((event as any).data ?? \"\") + value.slice(selectionEnd!)\n const isValid = state.context.parser.isValidPartialNumber(nextValue)\n\n if (!isValid) {\n event.preventDefault()\n }\n } catch {\n // noop\n }\n },\n onKeyDown(event) {\n if (event.defaultPrevented) return\n if (readOnly) return\n if (isComposingEvent(event)) return\n\n const step = getEventStep(event) * state.context.step\n\n const keyMap: EventKeyMap = {\n ArrowUp() {\n send({ type: \"INPUT.ARROW_UP\", step })\n event.preventDefault()\n },\n ArrowDown() {\n send({ type: \"INPUT.ARROW_DOWN\", step })\n event.preventDefault()\n },\n Home() {\n send(\"INPUT.HOME\")\n event.preventDefault()\n },\n End() {\n send(\"INPUT.END\")\n event.preventDefault()\n },\n Enter() {\n send({ type: \"INPUT.COMMIT\", src: \"enter\" })\n },\n }\n\n const exec = keyMap[event.key]\n exec?.(event)\n },\n }),\n\n decrementTriggerProps: normalize.button({\n ...parts.decrementTrigger.attrs,\n dir: state.context.dir,\n id: dom.getDecrementTriggerId(state.context),\n disabled: isDecrementDisabled,\n \"data-disabled\": dataAttr(isDecrementDisabled),\n \"aria-label\": translations.decrementLabel,\n type: \"button\",\n tabIndex: -1,\n \"aria-controls\": dom.getInputId(state.context),\n onPointerDown(event) {\n if (isDecrementDisabled || !isLeftClick(event)) return\n send({ type: \"TRIGGER.PRESS_DOWN\", hint: \"decrement\", pointerType: event.pointerType })\n if (event.pointerType === \"mouse\") {\n event.preventDefault()\n }\n if (event.pointerType === \"touch\") {\n event.currentTarget?.focus({ preventScroll: true })\n }\n },\n onPointerUp(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"decrement\", pointerType: event.pointerType })\n },\n onPointerLeave() {\n if (isDecrementDisabled) return\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"decrement\" })\n },\n }),\n\n incrementTriggerProps: normalize.button({\n ...parts.incrementTrigger.attrs,\n dir: state.context.dir,\n id: dom.getIncrementTriggerId(state.context),\n disabled: isIncrementDisabled,\n \"data-disabled\": dataAttr(isIncrementDisabled),\n \"aria-label\": translations.incrementLabel,\n type: \"button\",\n tabIndex: -1,\n \"aria-controls\": dom.getInputId(state.context),\n onPointerDown(event) {\n if (isIncrementDisabled || !isLeftClick(event)) return\n send({ type: \"TRIGGER.PRESS_DOWN\", hint: \"increment\", pointerType: event.pointerType })\n if (event.pointerType === \"mouse\") {\n event.preventDefault()\n }\n if (event.pointerType === \"touch\") {\n event.currentTarget?.focus({ preventScroll: true })\n }\n },\n onPointerUp(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"increment\", pointerType: event.pointerType })\n },\n onPointerLeave(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"increment\", pointerType: event.pointerType })\n },\n }),\n\n scrubberProps: normalize.element({\n ...parts.scrubber.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n id: dom.getScrubberId(state.context),\n role: \"presentation\",\n onMouseDown(event) {\n if (disabled) return\n\n const point = getEventPoint(event)\n\n point.x = point.x - roundToDevicePixel(7.5)\n point.y = point.y - roundToDevicePixel(7.5)\n\n send({ type: \"SCRUBBER.PRESS_DOWN\", point })\n event.preventDefault()\n },\n style: {\n cursor: disabled ? undefined : \"ew-resize\",\n },\n }),\n }\n}\n","import { createScope, isSafari, MAX_Z_INDEX } from \"@zag-js/dom-query\"\nimport { roundToDevicePixel, wrap } from \"@zag-js/number-utils\"\nimport type { MachineContext as Ctx } from \"./number-input.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `number-input:${ctx.id}`,\n getInputId: (ctx: Ctx) => ctx.ids?.input ?? `number-input:${ctx.id}:input`,\n getIncrementTriggerId: (ctx: Ctx) => ctx.ids?.incrementTrigger ?? `number-input:${ctx.id}:inc`,\n getDecrementTriggerId: (ctx: Ctx) => ctx.ids?.decrementTrigger ?? `number-input:${ctx.id}:dec`,\n getScrubberId: (ctx: Ctx) => ctx.ids?.scrubber ?? `number-input:${ctx.id}:scrubber`,\n getCursorId: (ctx: Ctx) => `number-input:${ctx.id}:cursor`,\n getLabelId: (ctx: Ctx) => ctx.ids?.label ?? `number-input:${ctx.id}:label`,\n\n getInputEl: (ctx: Ctx) => dom.getById<HTMLInputElement>(ctx, dom.getInputId(ctx)),\n getIncrementTriggerEl: (ctx: Ctx) => dom.getById<HTMLButtonElement>(ctx, dom.getIncrementTriggerId(ctx)),\n getDecrementTriggerEl: (ctx: Ctx) => dom.getById<HTMLButtonElement>(ctx, dom.getDecrementTriggerId(ctx)),\n getScrubberEl: (ctx: Ctx) => dom.getById(ctx, dom.getScrubberId(ctx)),\n getCursorEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getCursorId(ctx)),\n\n getPressedTriggerEl: (ctx: Ctx, hint = ctx.hint) => {\n let btnEl: HTMLButtonElement | null = null\n if (hint === \"increment\") {\n btnEl = dom.getIncrementTriggerEl(ctx)\n }\n if (hint === \"decrement\") {\n btnEl = dom.getDecrementTriggerEl(ctx)\n }\n return btnEl\n },\n\n setupVirtualCursor(ctx: Ctx) {\n if (isSafari()) return\n dom.createVirtualCursor(ctx)\n return () => {\n dom.getCursorEl(ctx)?.remove()\n }\n },\n\n preventTextSelection(ctx: Ctx) {\n const doc = dom.getDoc(ctx)\n const html = doc.documentElement\n const body = doc.body\n\n body.style.pointerEvents = \"none\"\n html.style.userSelect = \"none\"\n html.style.cursor = \"ew-resize\"\n\n return () => {\n body.style.pointerEvents = \"\"\n html.style.userSelect = \"\"\n html.style.cursor = \"\"\n if (!html.style.length) {\n html.removeAttribute(\"style\")\n }\n if (!body.style.length) {\n body.removeAttribute(\"style\")\n }\n }\n },\n\n getMousementValue(ctx: Ctx, event: MouseEvent) {\n const x = roundToDevicePixel(event.movementX)\n const y = roundToDevicePixel(event.movementY)\n\n let hint = x > 0 ? \"increment\" : x < 0 ? \"decrement\" : null\n\n if (ctx.isRtl && hint === \"increment\") hint = \"decrement\"\n if (ctx.isRtl && hint === \"decrement\") hint = \"increment\"\n\n const point = {\n x: ctx.scrubberCursorPoint!.x + x,\n y: ctx.scrubberCursorPoint!.y + y,\n }\n\n const win = dom.getWin(ctx)\n const width = win.innerWidth\n const half = roundToDevicePixel(7.5)\n point.x = wrap(point.x + half, width) - half\n\n return { hint, point }\n },\n\n createVirtualCursor(ctx: Ctx) {\n const doc = dom.getDoc(ctx)\n const el = doc.createElement(\"div\")\n el.className = \"scrubber--cursor\"\n el.id = dom.getCursorId(ctx)\n\n Object.assign(el.style, {\n width: \"15px\",\n height: \"15px\",\n position: \"fixed\",\n pointerEvents: \"none\",\n left: \"0px\",\n top: \"0px\",\n zIndex: MAX_Z_INDEX,\n transform: ctx.scrubberCursorPoint\n ? `translate3d(${ctx.scrubberCursorPoint.x}px, ${ctx.scrubberCursorPoint.y}px, 0px)`\n : undefined,\n willChange: \"transform\",\n })\n\n el.innerHTML = `\n <svg width=\"46\" height=\"15\" style=\"left: -15.5px; position: absolute; top: 0; filter: drop-shadow(rgba(0, 0, 0, 0.4) 0px 1px 1.1px);\">\n <g transform=\"translate(2 3)\">\n <path fill-rule=\"evenodd\" d=\"M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z\" style=\"stroke-width: 2px; stroke: white;\"></path>\n <path fill-rule=\"evenodd\" d=\"M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z\"></path>\n </g>\n </svg>`\n\n doc.body.appendChild(el)\n },\n})\n","import { choose, createMachine, guards } from \"@zag-js/core\"\nimport { addDomEvent, requestPointerLock } from \"@zag-js/dom-event\"\nimport { isSafari, observeAttributes, raf } from \"@zag-js/dom-query\"\nimport { trackFormControl } from \"@zag-js/form-utils\"\nimport { clamp, decrement, increment, isAtMax, isAtMin, isWithinRange } from \"@zag-js/number-utils\"\nimport { callAll, compact, isEqual } from \"@zag-js/utils\"\nimport { recordCursor, restoreCursor } from \"./cursor\"\nimport { dom } from \"./number-input.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./number-input.types\"\nimport { createFormatter, createParser, formatValue, parseValue } from \"./number-input.utils\"\n\nconst { not, and } = guards\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"number-input\",\n initial: \"idle\",\n context: {\n dir: \"ltr\",\n locale: \"en-US\",\n focusInputOnChange: true,\n clampValueOnBlur: true,\n allowOverflow: false,\n inputMode: \"decimal\",\n pattern: \"[0-9]*(.[0-9]+)?\",\n value: \"\",\n step: 1,\n min: Number.MIN_SAFE_INTEGER,\n max: Number.MAX_SAFE_INTEGER,\n invalid: false,\n spinOnPress: true,\n ...ctx,\n hint: null,\n scrubberCursorPoint: null,\n fieldsetDisabled: false,\n formatter: createFormatter(ctx.locale || \"en-US\", ctx.formatOptions),\n parser: createParser(ctx.locale || \"en-US\", ctx.formatOptions),\n translations: {\n incrementLabel: \"increment value\",\n decrementLabel: \"decrease value\",\n ...ctx.translations,\n },\n },\n\n computed: {\n isRtl: (ctx) => ctx.dir === \"rtl\",\n valueAsNumber: (ctx) => parseValue(ctx, ctx.value),\n formattedValue: (ctx) => formatValue(ctx, ctx.valueAsNumber),\n isAtMin: (ctx) => isAtMin(ctx.valueAsNumber, ctx),\n isAtMax: (ctx) => isAtMax(ctx.valueAsNumber, ctx),\n isOutOfRange: (ctx) => !isWithinRange(ctx.valueAsNumber, ctx),\n isValueEmpty: (ctx) => ctx.value === \"\",\n isDisabled: (ctx) => !!ctx.disabled || ctx.fieldsetDisabled,\n canIncrement: (ctx) => ctx.allowOverflow || !ctx.isAtMax,\n canDecrement: (ctx) => ctx.allowOverflow || !ctx.isAtMin,\n valueText: (ctx) => ctx.translations.valueText?.(ctx.value),\n },\n\n watch: {\n formatOptions: [\"setFormatterAndParser\", \"syncInputElement\"],\n locale: [\"setFormatterAndParser\", \"syncInputElement\"],\n value: [\"syncInputElement\"],\n isOutOfRange: [\"invokeOnInvalid\"],\n scrubberCursorPoint: [\"setVirtualCursorPosition\"],\n },\n\n activities: [\"trackFormControl\"],\n\n on: {\n \"VALUE.SET\": {\n actions: [\"setRawValue\", \"setHintToSet\"],\n },\n \"VALUE.CLEAR\": {\n actions: [\"clearValue\"],\n },\n \"VALUE.INCREMENT\": {\n actions: [\"increment\"],\n },\n \"VALUE.DECREMENT\": {\n actions: [\"decrement\"],\n },\n },\n\n states: {\n idle: {\n on: {\n \"TRIGGER.PRESS_DOWN\": [\n { guard: \"isTouchPointer\", target: \"before:spin\", actions: [\"setHint\"] },\n {\n target: \"before:spin\",\n actions: [\"focusInput\", \"invokeOnFocus\", \"setHint\"],\n },\n ],\n \"SCRUBBER.PRESS_DOWN\": {\n target: \"scrubbing\",\n actions: [\"focusInput\", \"invokeOnFocus\", \"setHint\", \"setCursorPoint\"],\n },\n \"INPUT.FOCUS\": {\n target: \"focused\",\n actions: [\"focusInput\", \"invokeOnFocus\"],\n },\n },\n },\n\n focused: {\n tags: \"focus\",\n activities: \"attachWheelListener\",\n on: {\n \"TRIGGER.PRESS_DOWN\": [\n { guard: \"isTouchPointer\", target: \"before:spin\", actions: [\"setHint\"] },\n { target: \"before:spin\", actions: [\"focusInput\", \"setHint\"] },\n ],\n \"SCRUBBER.PRESS_DOWN\": {\n target: \"scrubbing\",\n actions: [\"focusInput\", \"setHint\", \"setCursorPoint\"],\n },\n \"INPUT.ARROW_UP\": {\n actions: \"increment\",\n },\n \"INPUT.ARROW_DOWN\": {\n actions: \"decrement\",\n },\n \"INPUT.HOME\": {\n actions: \"decrementToMin\",\n },\n \"INPUT.END\": {\n actions: \"incrementToMax\",\n },\n \"INPUT.CHANGE\": {\n actions: [\"setValue\", \"setHint\"],\n },\n \"INPUT.COMMIT\": [\n {\n guard: and(\"clampValueOnBlur\", not(\"isInRange\")),\n target: \"idle\",\n actions: [\"setClampedValue\", \"clearHint\", \"invokeOnBlur\"],\n },\n {\n target: \"idle\",\n actions: [\"setFormattedValue\", \"clearHint\", \"invokeOnBlur\"],\n },\n ],\n },\n },\n\n \"before:spin\": {\n tags: \"focus\",\n activities: \"trackButtonDisabled\",\n entry: choose([\n { guard: \"isIncrementHint\", actions: \"increment\" },\n { guard: \"isDecrementHint\", actions: \"decrement\" },\n ]),\n after: {\n CHANGE_DELAY: {\n target: \"spinning\",\n guard: and(\"isInRange\", \"spinOnPress\"),\n },\n },\n on: {\n \"TRIGGER.PRESS_UP\": [\n { guard: \"isTouchPointer\", target: \"focused\", actions: \"clearHint\" },\n { target: \"focused\", actions: [\"focusInput\", \"clearHint\"] },\n ],\n },\n },\n\n spinning: {\n tags: \"focus\",\n activities: \"trackButtonDisabled\",\n every: [\n {\n delay: \"CHANGE_INTERVAL\",\n guard: and(not(\"isAtMin\"), \"isIncrementHint\"),\n actions: \"increment\",\n },\n {\n delay: \"CHANGE_INTERVAL\",\n guard: and(not(\"isAtMax\"), \"isDecrementHint\"),\n actions: \"decrement\",\n },\n ],\n on: {\n \"TRIGGER.PRESS_UP\": {\n target: \"focused\",\n actions: [\"focusInput\", \"clearHint\"],\n },\n },\n },\n\n scrubbing: {\n tags: \"focus\",\n activities: [\"activatePointerLock\", \"trackMousemove\", \"setupVirtualCursor\", \"preventTextSelection\"],\n on: {\n \"SCRUBBER.POINTER_UP\": {\n target: \"focused\",\n actions: [\"focusInput\", \"clearCursorPoint\"],\n },\n \"SCRUBBER.POINTER_MOVE\": [\n {\n guard: \"isIncrementHint\",\n actions: [\"increment\", \"setCursorPoint\"],\n },\n {\n guard: \"isDecrementHint\",\n actions: [\"decrement\", \"setCursorPoint\"],\n },\n ],\n },\n },\n },\n },\n {\n delays: {\n CHANGE_INTERVAL: 50,\n CHANGE_DELAY: 300,\n },\n\n guards: {\n clampValueOnBlur: (ctx) => ctx.clampValueOnBlur,\n isAtMin: (ctx) => ctx.isAtMin,\n spinOnPress: (ctx) => !!ctx.spinOnPress,\n isAtMax: (ctx) => ctx.isAtMax,\n isInRange: (ctx) => !ctx.isOutOfRange,\n isDecrementHint: (ctx, evt) => (evt.hint ?? ctx.hint) === \"decrement\",\n isIncrementHint: (ctx, evt) => (evt.hint ?? ctx.hint) === \"increment\",\n isTouchPointer: (_ctx, evt) => evt.pointerType === \"touch\",\n },\n\n activities: {\n trackFormControl(ctx, _evt, { initialContext }) {\n const inputEl = dom.getInputEl(ctx)\n return trackFormControl(inputEl, {\n onFieldsetDisabledChange(disabled) {\n ctx.fieldsetDisabled = disabled\n },\n onFormReset() {\n set.value(ctx, initialContext.value)\n },\n })\n },\n setupVirtualCursor(ctx) {\n return dom.setupVirtualCursor(ctx)\n },\n preventTextSelection(ctx) {\n return dom.preventTextSelection(ctx)\n },\n trackButtonDisabled(ctx, _evt, { send }) {\n const btn = dom.getPressedTriggerEl(ctx, ctx.hint)\n return observeAttributes(btn, {\n attributes: [\"disabled\"],\n callback() {\n send({ type: \"TRIGGER.PRESS_UP\", src: \"attr\" })\n },\n })\n },\n attachWheelListener(ctx, _evt, { send }) {\n const inputEl = dom.getInputEl(ctx)\n if (!inputEl || !dom.isActiveElement(ctx, inputEl) || !ctx.allowMouseWheel) return\n\n function onWheel(event: WheelEvent) {\n event.preventDefault()\n const dir = Math.sign(event.deltaY) * -1\n if (dir === 1) {\n send(\"VALUE.INCREMENT\")\n } else if (dir === -1) {\n send(\"VALUE.DECREMENT\")\n }\n }\n\n return addDomEvent(inputEl, \"wheel\", onWheel, { passive: false })\n },\n activatePointerLock(ctx) {\n if (isSafari()) return\n return requestPointerLock(dom.getDoc(ctx))\n },\n trackMousemove(ctx, _evt, { send }) {\n const doc = dom.getDoc(ctx)\n\n function onMousemove(event: MouseEvent) {\n if (!ctx.scrubberCursorPoint) return\n const value = dom.getMousementValue(ctx, event)\n if (!value.hint) return\n send({\n type: \"SCRUBBER.POINTER_MOVE\",\n hint: value.hint,\n point: value.point,\n })\n }\n\n function onMouseup() {\n send(\"SCRUBBER.POINTER_UP\")\n }\n\n return callAll(\n addDomEvent(doc, \"mousemove\", onMousemove, false),\n addDomEvent(doc, \"mouseup\", onMouseup, false),\n )\n },\n },\n\n actions: {\n focusInput(ctx) {\n if (!ctx.focusInputOnChange) return\n const inputEl = dom.getInputEl(ctx)\n if (dom.isActiveElement(ctx, inputEl)) return\n raf(() => inputEl?.focus({ preventScroll: true }))\n },\n increment(ctx, evt) {\n const nextValue = increment(ctx.valueAsNumber, evt.step ?? ctx.step)\n const value = formatValue(ctx, clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n decrement(ctx, evt) {\n const nextValue = decrement(ctx.valueAsNumber, evt.step ?? ctx.step)\n const value = formatValue(ctx, clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n setClampedValue(ctx) {\n const nextValue = clamp(ctx.valueAsNumber, ctx)\n set.value(ctx, formatValue(ctx, nextValue))\n },\n setRawValue(ctx, evt) {\n const parsedValue = parseValue(ctx, evt.value)\n const value = formatValue(ctx, clamp(parsedValue, ctx))\n set.value(ctx, value)\n },\n setValue(ctx, evt) {\n const value = evt.target?.value ?? evt.value\n set.value(ctx, value)\n },\n clearValue(ctx) {\n set.value(ctx, \"\")\n },\n incrementToMax(ctx) {\n const value = formatValue(ctx, ctx.max)\n set.value(ctx, value)\n },\n decrementToMin(ctx) {\n const value = formatValue(ctx, ctx.min)\n set.value(ctx, value)\n },\n setHint(ctx, evt) {\n ctx.hint = evt.hint\n },\n clearHint(ctx) {\n ctx.hint = null\n },\n setHintToSet(ctx) {\n ctx.hint = \"set\"\n },\n invokeOnFocus(ctx) {\n ctx.onFocusChange?.({\n focused: true,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n invokeOnBlur(ctx) {\n ctx.onFocusChange?.({\n focused: false,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n invokeOnInvalid(ctx) {\n if (!ctx.isOutOfRange) return\n const reason = ctx.valueAsNumber > ctx.max ? \"rangeOverflow\" : \"rangeUnderflow\"\n ctx.onValueInvalid?.({\n reason,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n syncInputElement(ctx, evt) {\n const value = evt.type.endsWith(\"CHANGE\") ? ctx.value : ctx.formattedValue\n sync.input(ctx, value)\n },\n setFormattedValue(ctx) {\n set.value(ctx, ctx.formattedValue)\n },\n setCursorPoint(ctx, evt) {\n ctx.scrubberCursorPoint = evt.point\n },\n clearCursorPoint(ctx) {\n ctx.scrubberCursorPoint = null\n },\n setVirtualCursorPosition(ctx) {\n const cursorEl = dom.getCursorEl(ctx)\n if (!cursorEl || !ctx.scrubberCursorPoint) return\n const { x, y } = ctx.scrubberCursorPoint\n cursorEl.style.transform = `translate3d(${x}px, ${y}px, 0px)`\n },\n setFormatterAndParser(ctx) {\n if (!ctx.locale) return\n ctx.formatter = createFormatter(ctx.locale, ctx.formatOptions)\n ctx.parser = createParser(ctx.locale, ctx.formatOptions)\n },\n },\n compareFns: {\n formatOptions: (a, b) => isEqual(a, b),\n scrubberCursorPoint: (a, b) => isEqual(a, b),\n },\n },\n )\n}\n\nconst sync = {\n input(ctx: MachineContext, value: string) {\n const inputEl = dom.getInputEl(ctx)\n if (!inputEl) return\n\n // record cursor position before updating input value\n const sel = recordCursor(inputEl)\n\n // restore cursor position after updating input value\n raf(() => {\n dom.setValue(inputEl, value)\n restoreCursor(inputEl, sel)\n })\n },\n}\n\nconst invoke = {\n onChange: (ctx: MachineContext) => {\n ctx.onValueChange?.({\n value: ctx.value,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n}\n\nconst set = {\n value: (ctx: MachineContext, value: string) => {\n if (isEqual(ctx.value, value)) return\n ctx.value = value\n invoke.onChange(ctx)\n },\n}\n","/**\n * Credits: https://github.com/react-component/input-number/blob/master/src/hooks/useCursor.ts\n */\n\ninterface Selection {\n start?: number\n end?: number\n value?: string\n beforeTxt?: string\n afterTxt?: string\n}\n\nexport function recordCursor(inputEl: HTMLInputElement): Selection | undefined {\n if (inputEl.ownerDocument.activeElement !== inputEl) return\n try {\n const { selectionStart: start, selectionEnd: end, value } = inputEl\n const beforeTxt = value.substring(0, start!)\n const afterTxt = value.substring(end!)\n return {\n start: start!,\n end: end!,\n value,\n beforeTxt,\n afterTxt,\n }\n } catch {}\n}\n\nexport function restoreCursor(inputEl: HTMLInputElement, selection: Selection | undefined) {\n if (inputEl.ownerDocument.activeElement !== inputEl) return\n\n if (!selection) {\n inputEl.setSelectionRange(inputEl.value.length, inputEl.value.length)\n return\n }\n\n try {\n const { value } = inputEl\n const { beforeTxt = \"\", afterTxt = \"\", start } = selection\n\n let startPos = value.length\n\n if (value.endsWith(afterTxt)) {\n startPos = value.length - afterTxt.length\n } else if (value.startsWith(beforeTxt)) {\n startPos = beforeTxt.length\n } else if (start != null) {\n const beforeLastChar = beforeTxt[start - 1]\n const newIndex = value.indexOf(beforeLastChar, start - 1)\n if (newIndex !== -1) {\n startPos = newIndex + 1\n }\n }\n\n inputEl.setSelectionRange(startPos, startPos)\n } catch {}\n}\n","import { NumberParser } from \"@internationalized/number\"\nimport { ref } from \"@zag-js/core\"\nimport type { MachineContext } from \"./number-input.types\"\n\nexport const createFormatter = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n return ref(new Intl.NumberFormat(locale, options))\n}\n\nexport const createParser = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n return ref(new NumberParser(locale, options))\n}\n\nexport const parseValue = (ctx: MachineContext, value: string) => {\n if (!ctx.formatOptions) return parseFloat(value)\n return ctx.parser.parse(String(value))\n}\n\nexport const formatValue = (ctx: MachineContext, value: number): string => {\n if (Number.isNaN(value)) return \"\"\n if (!ctx.formatOptions) return value.toString()\n return ctx.formatter.format(value)\n}\n"],"mappings":"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","names":["import_dom_query","import_number_utils","import_core","import_dom_event","import_dom_query","import_number_utils","ctx"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{createAnatomy}from"@zag-js/anatomy";var anatomy=createAnatomy("numberInput").parts("root","label","input","control","incrementTrigger","decrementTrigger","scrubber");var parts=anatomy.build();import{getEventPoint,getEventStep,
|
|
1
|
+
import{createAnatomy}from"@zag-js/anatomy";var anatomy=createAnatomy("numberInput").parts("root","label","input","control","incrementTrigger","decrementTrigger","scrubber");var parts=anatomy.build();import{getEventPoint,getEventStep,isLeftClick}from"@zag-js/dom-event";import{ariaAttr,dataAttr,isComposingEvent}from"@zag-js/dom-query";import{roundToDevicePixel as roundToDevicePixel2}from"@zag-js/number-utils";import{createScope,isSafari,MAX_Z_INDEX}from"@zag-js/dom-query";import{roundToDevicePixel,wrap}from"@zag-js/number-utils";var dom=createScope({getRootId:ctx=>ctx.ids?.root??`number-input:${ctx.id}`,getInputId:ctx=>ctx.ids?.input??`number-input:${ctx.id}:input`,getIncrementTriggerId:ctx=>ctx.ids?.incrementTrigger??`number-input:${ctx.id}:inc`,getDecrementTriggerId:ctx=>ctx.ids?.decrementTrigger??`number-input:${ctx.id}:dec`,getScrubberId:ctx=>ctx.ids?.scrubber??`number-input:${ctx.id}:scrubber`,getCursorId:ctx=>`number-input:${ctx.id}:cursor`,getLabelId:ctx=>ctx.ids?.label??`number-input:${ctx.id}:label`,getInputEl:ctx=>dom.getById(ctx,dom.getInputId(ctx)),getIncrementTriggerEl:ctx=>dom.getById(ctx,dom.getIncrementTriggerId(ctx)),getDecrementTriggerEl:ctx=>dom.getById(ctx,dom.getDecrementTriggerId(ctx)),getScrubberEl:ctx=>dom.getById(ctx,dom.getScrubberId(ctx)),getCursorEl:ctx=>dom.getDoc(ctx).getElementById(dom.getCursorId(ctx)),getPressedTriggerEl:(ctx,hint=ctx.hint)=>{let btnEl=null;if(hint==="increment"){btnEl=dom.getIncrementTriggerEl(ctx)}if(hint==="decrement"){btnEl=dom.getDecrementTriggerEl(ctx)}return btnEl},setupVirtualCursor(ctx){if(isSafari())return;dom.createVirtualCursor(ctx);return()=>{dom.getCursorEl(ctx)?.remove()}},preventTextSelection(ctx){const doc=dom.getDoc(ctx);const html=doc.documentElement;const body=doc.body;body.style.pointerEvents="none";html.style.userSelect="none";html.style.cursor="ew-resize";return()=>{body.style.pointerEvents="";html.style.userSelect="";html.style.cursor="";if(!html.style.length){html.removeAttribute("style")}if(!body.style.length){body.removeAttribute("style")}}},getMousementValue(ctx,event){const x=roundToDevicePixel(event.movementX);const y=roundToDevicePixel(event.movementY);let hint=x>0?"increment":x<0?"decrement":null;if(ctx.isRtl&&hint==="increment")hint="decrement";if(ctx.isRtl&&hint==="decrement")hint="increment";const point={x:ctx.scrubberCursorPoint.x+x,y:ctx.scrubberCursorPoint.y+y};const win=dom.getWin(ctx);const width=win.innerWidth;const half=roundToDevicePixel(7.5);point.x=wrap(point.x+half,width)-half;return{hint,point}},createVirtualCursor(ctx){const doc=dom.getDoc(ctx);const el=doc.createElement("div");el.className="scrubber--cursor";el.id=dom.getCursorId(ctx);Object.assign(el.style,{width:"15px",height:"15px",position:"fixed",pointerEvents:"none",left:"0px",top:"0px",zIndex:MAX_Z_INDEX,transform:ctx.scrubberCursorPoint?`translate3d(${ctx.scrubberCursorPoint.x}px, ${ctx.scrubberCursorPoint.y}px, 0px)`:void 0,willChange:"transform"});el.innerHTML=`
|
|
2
2
|
<svg width="46" height="15" style="left: -15.5px; position: absolute; top: 0; filter: drop-shadow(rgba(0, 0, 0, 0.4) 0px 1px 1.1px);">
|
|
3
3
|
<g transform="translate(2 3)">
|
|
4
4
|
<path fill-rule="evenodd" d="M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z" style="stroke-width: 2px; stroke: white;"></path>
|
|
5
5
|
<path fill-rule="evenodd" d="M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z"></path>
|
|
6
6
|
</g>
|
|
7
|
-
</svg>`;doc.body.appendChild(el)}});function connect(state,send,normalize){const focused=state.hasTag("focus");const disabled=state.context.isDisabled;const readOnly=state.context.readOnly;const empty=state.context.isValueEmpty;const invalid=state.context.isOutOfRange||!!state.context.invalid;const isIncrementDisabled=disabled||!state.context.canIncrement||readOnly;const isDecrementDisabled=disabled||!state.context.canDecrement||readOnly;const translations=state.context.translations;return{focused,invalid,empty,value:state.context.formattedValue,valueAsNumber:state.context.valueAsNumber,setValue(value){send({type:"VALUE.SET",value})},clearValue(){send("VALUE.CLEAR")},increment(){send("VALUE.INCREMENT")},decrement(){send("VALUE.DECREMENT")},setToMax(){send({type:"VALUE.SET",value:state.context.max})},setToMin(){send({type:"VALUE.SET",value:state.context.min})},focus(){dom.getInputEl(state.context)?.focus()},rootProps:normalize.element({id:dom.getRootId(state.context),...parts.root.attrs,dir:state.context.dir,"data-disabled":dataAttr(disabled),"data-focus":dataAttr(focused),"data-invalid":dataAttr(invalid)}),labelProps:normalize.label({...parts.label.attrs,dir:state.context.dir,"data-disabled":dataAttr(disabled),"data-focus":dataAttr(focused),"data-invalid":dataAttr(invalid),id:dom.getLabelId(state.context),htmlFor:dom.getInputId(state.context)}),controlProps:normalize.element({...parts.control.attrs,dir:state.context.dir,role:"group","aria-disabled":disabled,"data-focus":dataAttr(focused),"data-disabled":dataAttr(disabled),"data-invalid":dataAttr(invalid),"aria-invalid":ariaAttr(state.context.invalid)}),inputProps:normalize.input({...parts.input.attrs,dir:state.context.dir,name:state.context.name,form:state.context.form,id:dom.getInputId(state.context),role:"spinbutton",defaultValue:state.context.formattedValue,pattern:state.context.pattern,inputMode:state.context.inputMode,"aria-invalid":ariaAttr(invalid),"data-invalid":dataAttr(invalid),disabled,"data-disabled":dataAttr(disabled),readOnly:!!state.context.readOnly,autoComplete:"off",autoCorrect:"off",spellCheck:"false",type:"text","aria-roledescription":"numberfield","aria-valuemin":state.context.min,"aria-valuemax":state.context.max,"aria-valuenow":Number.isNaN(state.context.valueAsNumber)?void 0:state.context.valueAsNumber,"aria-valuetext":state.context.valueText,onFocus(){send("INPUT.FOCUS")},onBlur(){send({type:"INPUT.COMMIT",src:"blur"})},onChange(event){send({type:"INPUT.CHANGE",target:event.currentTarget,hint:"set"})},onBeforeInput(event){try{const{selectionStart,selectionEnd,value}=event.currentTarget;const nextValue=value.slice(0,selectionStart)+(event.data??"")+value.slice(selectionEnd);const isValid=state.context.parser.isValidPartialNumber(nextValue);if(!isValid){event.preventDefault()}}catch{}},onKeyDown(event){if(event.defaultPrevented)return;if(readOnly)return;const evt=getNativeEvent(event);if(evt.isComposing)return;const step=getEventStep(event)*state.context.step;const keyMap={ArrowUp(){send({type:"INPUT.ARROW_UP",step});event.preventDefault()},ArrowDown(){send({type:"INPUT.ARROW_DOWN",step});event.preventDefault()},Home(){send("INPUT.HOME");event.preventDefault()},End(){send("INPUT.END");event.preventDefault()},Enter(){send({type:"INPUT.COMMIT",src:"enter"})}};const exec=keyMap[event.key];exec?.(event)}}),decrementTriggerProps:normalize.button({...parts.decrementTrigger.attrs,dir:state.context.dir,id:dom.getDecrementTriggerId(state.context),disabled:isDecrementDisabled,"data-disabled":dataAttr(isDecrementDisabled),"aria-label":translations.decrementLabel,type:"button",tabIndex:-1,"aria-controls":dom.getInputId(state.context),onPointerDown(event){if(isDecrementDisabled||!isLeftClick(event))return;send({type:"TRIGGER.PRESS_DOWN",hint:"decrement",pointerType:event.pointerType});if(event.pointerType==="mouse"){event.preventDefault()}if(event.pointerType==="touch"){event.currentTarget?.focus({preventScroll:true})}},onPointerUp(event){send({type:"TRIGGER.PRESS_UP",hint:"decrement",pointerType:event.pointerType})},onPointerLeave(){if(isDecrementDisabled)return;send({type:"TRIGGER.PRESS_UP",hint:"decrement"})}}),incrementTriggerProps:normalize.button({...parts.incrementTrigger.attrs,dir:state.context.dir,id:dom.getIncrementTriggerId(state.context),disabled:isIncrementDisabled,"data-disabled":dataAttr(isIncrementDisabled),"aria-label":translations.incrementLabel,type:"button",tabIndex:-1,"aria-controls":dom.getInputId(state.context),onPointerDown(event){if(isIncrementDisabled||!isLeftClick(event))return;send({type:"TRIGGER.PRESS_DOWN",hint:"increment",pointerType:event.pointerType});if(event.pointerType==="mouse"){event.preventDefault()}if(event.pointerType==="touch"){event.currentTarget?.focus({preventScroll:true})}},onPointerUp(event){send({type:"TRIGGER.PRESS_UP",hint:"increment",pointerType:event.pointerType})},onPointerLeave(event){send({type:"TRIGGER.PRESS_UP",hint:"increment",pointerType:event.pointerType})}}),scrubberProps:normalize.element({...parts.scrubber.attrs,dir:state.context.dir,"data-disabled":dataAttr(disabled),id:dom.getScrubberId(state.context),role:"presentation",onMouseDown(event){if(disabled)return;const evt=getNativeEvent(event);const point=getEventPoint(evt);point.x=point.x-roundToDevicePixel2(7.5);point.y=point.y-roundToDevicePixel2(7.5);send({type:"SCRUBBER.PRESS_DOWN",point});event.preventDefault()},style:{cursor:disabled?void 0:"ew-resize"}})}}import{choose,createMachine,guards}from"@zag-js/core";import{addDomEvent,requestPointerLock}from"@zag-js/dom-event";import{isSafari as isSafari2,observeAttributes,raf}from"@zag-js/dom-query";import{trackFormControl}from"@zag-js/form-utils";import{clamp,decrement,increment,isAtMax,isAtMin,isWithinRange}from"@zag-js/number-utils";import{callAll,compact,isEqual}from"@zag-js/utils";function recordCursor(inputEl){if(inputEl.ownerDocument.activeElement!==inputEl)return;try{const{selectionStart:start,selectionEnd:end,value}=inputEl;const beforeTxt=value.substring(0,start);const afterTxt=value.substring(end);return{start,end,value,beforeTxt,afterTxt}}catch{}}function restoreCursor(inputEl,selection){if(inputEl.ownerDocument.activeElement!==inputEl)return;if(!selection){inputEl.setSelectionRange(inputEl.value.length,inputEl.value.length);return}try{const{value}=inputEl;const{beforeTxt="",afterTxt="",start}=selection;let startPos=value.length;if(value.endsWith(afterTxt)){startPos=value.length-afterTxt.length}else if(value.startsWith(beforeTxt)){startPos=beforeTxt.length}else if(start!=null){const beforeLastChar=beforeTxt[start-1];const newIndex=value.indexOf(beforeLastChar,start-1);if(newIndex!==-1){startPos=newIndex+1}}inputEl.setSelectionRange(startPos,startPos)}catch{}}import{NumberParser}from"@internationalized/number";import{ref}from"@zag-js/core";var createFormatter=(locale,options={})=>{return ref(new Intl.NumberFormat(locale,options))};var createParser=(locale,options={})=>{return ref(new NumberParser(locale,options))};var parseValue=(ctx,value)=>{if(!ctx.formatOptions)return parseFloat(value);return ctx.parser.parse(String(value))};var formatValue=(ctx,value)=>{if(Number.isNaN(value))return"";if(!ctx.formatOptions)return value.toString();return ctx.formatter.format(value)};var{not,and}=guards;function machine(userContext){const ctx=compact(userContext);return createMachine({id:"number-input",initial:"idle",context:{dir:"ltr",locale:"en-US",focusInputOnChange:true,clampValueOnBlur:true,allowOverflow:false,inputMode:"decimal",pattern:"[0-9]*(.[0-9]+)?",value:"",step:1,min:Number.MIN_SAFE_INTEGER,max:Number.MAX_SAFE_INTEGER,invalid:false,spinOnPress:true,...ctx,hint:null,scrubberCursorPoint:null,fieldsetDisabled:false,formatter:createFormatter(ctx.locale||"en-US",ctx.formatOptions),parser:createParser(ctx.locale||"en-US",ctx.formatOptions),translations:{incrementLabel:"increment value",decrementLabel:"decrease value",...ctx.translations}},computed:{isRtl:ctx2=>ctx2.dir==="rtl",valueAsNumber:ctx2=>parseValue(ctx2,ctx2.value),formattedValue:ctx2=>formatValue(ctx2,ctx2.valueAsNumber),isAtMin:ctx2=>isAtMin(ctx2.valueAsNumber,ctx2),isAtMax:ctx2=>isAtMax(ctx2.valueAsNumber,ctx2),isOutOfRange:ctx2=>!isWithinRange(ctx2.valueAsNumber,ctx2),isValueEmpty:ctx2=>ctx2.value==="",isDisabled:ctx2=>!!ctx2.disabled||ctx2.fieldsetDisabled,canIncrement:ctx2=>ctx2.allowOverflow||!ctx2.isAtMax,canDecrement:ctx2=>ctx2.allowOverflow||!ctx2.isAtMin,valueText:ctx2=>ctx2.translations.valueText?.(ctx2.value)},watch:{formatOptions:["setFormatterAndParser","syncInputElement"],locale:["setFormatterAndParser","syncInputElement"],value:["syncInputElement"],isOutOfRange:["invokeOnInvalid"],scrubberCursorPoint:["setVirtualCursorPosition"]},activities:["trackFormControl"],on:{"VALUE.SET":{actions:["setRawValue","setHintToSet"]},"VALUE.CLEAR":{actions:["clearValue"]},"VALUE.INCREMENT":{actions:["increment"]},"VALUE.DECREMENT":{actions:["decrement"]}},states:{idle:{on:{"TRIGGER.PRESS_DOWN":[{guard:"isTouchPointer",target:"before:spin",actions:["setHint"]},{target:"before:spin",actions:["focusInput","invokeOnFocus","setHint"]}],"SCRUBBER.PRESS_DOWN":{target:"scrubbing",actions:["focusInput","invokeOnFocus","setHint","setCursorPoint"]},"INPUT.FOCUS":{target:"focused",actions:["focusInput","invokeOnFocus"]}}},focused:{tags:"focus",activities:"attachWheelListener",on:{"TRIGGER.PRESS_DOWN":[{guard:"isTouchPointer",target:"before:spin",actions:["setHint"]},{target:"before:spin",actions:["focusInput","setHint"]}],"SCRUBBER.PRESS_DOWN":{target:"scrubbing",actions:["focusInput","setHint","setCursorPoint"]},"INPUT.ARROW_UP":{actions:"increment"},"INPUT.ARROW_DOWN":{actions:"decrement"},"INPUT.HOME":{actions:"decrementToMin"},"INPUT.END":{actions:"incrementToMax"},"INPUT.CHANGE":{actions:["setValue","setHint"]},"INPUT.COMMIT":[{guard:and("clampValueOnBlur",not("isInRange")),target:"idle",actions:["setClampedValue","clearHint","invokeOnBlur"]},{target:"idle",actions:["setFormattedValue","clearHint","invokeOnBlur"]}]}},"before:spin":{tags:"focus",activities:"trackButtonDisabled",entry:choose([{guard:"isIncrementHint",actions:"increment"},{guard:"isDecrementHint",actions:"decrement"}]),after:{CHANGE_DELAY:{target:"spinning",guard:and("isInRange","spinOnPress")}},on:{"TRIGGER.PRESS_UP":[{guard:"isTouchPointer",target:"focused",actions:"clearHint"},{target:"focused",actions:["focusInput","clearHint"]}]}},spinning:{tags:"focus",activities:"trackButtonDisabled",every:[{delay:"CHANGE_INTERVAL",guard:and(not("isAtMin"),"isIncrementHint"),actions:"increment"},{delay:"CHANGE_INTERVAL",guard:and(not("isAtMax"),"isDecrementHint"),actions:"decrement"}],on:{"TRIGGER.PRESS_UP":{target:"focused",actions:["focusInput","clearHint"]}}},scrubbing:{tags:"focus",activities:["activatePointerLock","trackMousemove","setupVirtualCursor","preventTextSelection"],on:{"SCRUBBER.POINTER_UP":{target:"focused",actions:["focusInput","clearCursorPoint"]},"SCRUBBER.POINTER_MOVE":[{guard:"isIncrementHint",actions:["increment","setCursorPoint"]},{guard:"isDecrementHint",actions:["decrement","setCursorPoint"]}]}}}},{delays:{CHANGE_INTERVAL:50,CHANGE_DELAY:300},guards:{clampValueOnBlur:ctx2=>ctx2.clampValueOnBlur,isAtMin:ctx2=>ctx2.isAtMin,spinOnPress:ctx2=>!!ctx2.spinOnPress,isAtMax:ctx2=>ctx2.isAtMax,isInRange:ctx2=>!ctx2.isOutOfRange,isDecrementHint:(ctx2,evt)=>(evt.hint??ctx2.hint)==="decrement",isIncrementHint:(ctx2,evt)=>(evt.hint??ctx2.hint)==="increment",isTouchPointer:(_ctx,evt)=>evt.pointerType==="touch"},activities:{trackFormControl(ctx2,_evt,{initialContext}){const inputEl=dom.getInputEl(ctx2);return trackFormControl(inputEl,{onFieldsetDisabledChange(disabled){ctx2.fieldsetDisabled=disabled},onFormReset(){set.value(ctx2,initialContext.value)}})},setupVirtualCursor(ctx2){return dom.setupVirtualCursor(ctx2)},preventTextSelection(ctx2){return dom.preventTextSelection(ctx2)},trackButtonDisabled(ctx2,_evt,{send}){const btn=dom.getPressedTriggerEl(ctx2,ctx2.hint);return observeAttributes(btn,{attributes:["disabled"],callback(){send({type:"TRIGGER.PRESS_UP",src:"attr"})}})},attachWheelListener(ctx2,_evt,{send}){const inputEl=dom.getInputEl(ctx2);if(!inputEl||!dom.isActiveElement(ctx2,inputEl)||!ctx2.allowMouseWheel)return;function onWheel(event){event.preventDefault();const dir=Math.sign(event.deltaY)*-1;if(dir===1){send("VALUE.INCREMENT")}else if(dir===-1){send("VALUE.DECREMENT")}}return addDomEvent(inputEl,"wheel",onWheel,{passive:false})},activatePointerLock(ctx2){if(isSafari2())return;return requestPointerLock(dom.getDoc(ctx2))},trackMousemove(ctx2,_evt,{send}){const doc=dom.getDoc(ctx2);function onMousemove(event){if(!ctx2.scrubberCursorPoint)return;const value=dom.getMousementValue(ctx2,event);if(!value.hint)return;send({type:"SCRUBBER.POINTER_MOVE",hint:value.hint,point:value.point})}function onMouseup(){send("SCRUBBER.POINTER_UP")}return callAll(addDomEvent(doc,"mousemove",onMousemove,false),addDomEvent(doc,"mouseup",onMouseup,false))}},actions:{focusInput(ctx2){if(!ctx2.focusInputOnChange)return;const inputEl=dom.getInputEl(ctx2);if(dom.isActiveElement(ctx2,inputEl))return;raf(()=>inputEl?.focus({preventScroll:true}))},increment(ctx2,evt){const nextValue=increment(ctx2.valueAsNumber,evt.step??ctx2.step);const value=formatValue(ctx2,clamp(nextValue,ctx2));set.value(ctx2,value)},decrement(ctx2,evt){const nextValue=decrement(ctx2.valueAsNumber,evt.step??ctx2.step);const value=formatValue(ctx2,clamp(nextValue,ctx2));set.value(ctx2,value)},setClampedValue(ctx2){const nextValue=clamp(ctx2.valueAsNumber,ctx2);set.value(ctx2,formatValue(ctx2,nextValue))},setRawValue(ctx2,evt){const parsedValue=parseValue(ctx2,evt.value);const value=formatValue(ctx2,clamp(parsedValue,ctx2));set.value(ctx2,value)},setValue(ctx2,evt){const value=evt.target?.value??evt.value;set.value(ctx2,value)},clearValue(ctx2){set.value(ctx2,"")},incrementToMax(ctx2){const value=formatValue(ctx2,ctx2.max);set.value(ctx2,value)},decrementToMin(ctx2){const value=formatValue(ctx2,ctx2.min);set.value(ctx2,value)},setHint(ctx2,evt){ctx2.hint=evt.hint},clearHint(ctx2){ctx2.hint=null},setHintToSet(ctx2){ctx2.hint="set"},invokeOnFocus(ctx2){ctx2.onFocusChange?.({focused:true,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},invokeOnBlur(ctx2){ctx2.onFocusChange?.({focused:false,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},invokeOnInvalid(ctx2){if(!ctx2.isOutOfRange)return;const reason=ctx2.valueAsNumber>ctx2.max?"rangeOverflow":"rangeUnderflow";ctx2.onValueInvalid?.({reason,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},syncInputElement(ctx2,evt){const value=evt.type.endsWith("CHANGE")?ctx2.value:ctx2.formattedValue;sync.input(ctx2,value)},setFormattedValue(ctx2){set.value(ctx2,ctx2.formattedValue)},setCursorPoint(ctx2,evt){ctx2.scrubberCursorPoint=evt.point},clearCursorPoint(ctx2){ctx2.scrubberCursorPoint=null},setVirtualCursorPosition(ctx2){const cursorEl=dom.getCursorEl(ctx2);if(!cursorEl||!ctx2.scrubberCursorPoint)return;const{x,y}=ctx2.scrubberCursorPoint;cursorEl.style.transform=`translate3d(${x}px, ${y}px, 0px)`},setFormatterAndParser(ctx2){if(!ctx2.locale)return;ctx2.formatter=createFormatter(ctx2.locale,ctx2.formatOptions);ctx2.parser=createParser(ctx2.locale,ctx2.formatOptions)}},compareFns:{formatOptions:(a,b)=>isEqual(a,b),scrubberCursorPoint:(a,b)=>isEqual(a,b)}})}var sync={input(ctx,value){const inputEl=dom.getInputEl(ctx);if(!inputEl)return;const sel=recordCursor(inputEl);raf(()=>{dom.setValue(inputEl,value);restoreCursor(inputEl,sel)})}};var invoke={onChange:ctx=>{ctx.onValueChange?.({value:ctx.value,valueAsNumber:ctx.valueAsNumber})}};var set={value:(ctx,value)=>{if(isEqual(ctx.value,value))return;ctx.value=value;invoke.onChange(ctx)}};export{anatomy,connect,machine};
|
|
7
|
+
</svg>`;doc.body.appendChild(el)}});function connect(state,send,normalize){const focused=state.hasTag("focus");const disabled=state.context.isDisabled;const readOnly=state.context.readOnly;const empty=state.context.isValueEmpty;const invalid=state.context.isOutOfRange||!!state.context.invalid;const isIncrementDisabled=disabled||!state.context.canIncrement||readOnly;const isDecrementDisabled=disabled||!state.context.canDecrement||readOnly;const translations=state.context.translations;return{focused,invalid,empty,value:state.context.formattedValue,valueAsNumber:state.context.valueAsNumber,setValue(value){send({type:"VALUE.SET",value})},clearValue(){send("VALUE.CLEAR")},increment(){send("VALUE.INCREMENT")},decrement(){send("VALUE.DECREMENT")},setToMax(){send({type:"VALUE.SET",value:state.context.max})},setToMin(){send({type:"VALUE.SET",value:state.context.min})},focus(){dom.getInputEl(state.context)?.focus()},rootProps:normalize.element({id:dom.getRootId(state.context),...parts.root.attrs,dir:state.context.dir,"data-disabled":dataAttr(disabled),"data-focus":dataAttr(focused),"data-invalid":dataAttr(invalid)}),labelProps:normalize.label({...parts.label.attrs,dir:state.context.dir,"data-disabled":dataAttr(disabled),"data-focus":dataAttr(focused),"data-invalid":dataAttr(invalid),id:dom.getLabelId(state.context),htmlFor:dom.getInputId(state.context)}),controlProps:normalize.element({...parts.control.attrs,dir:state.context.dir,role:"group","aria-disabled":disabled,"data-focus":dataAttr(focused),"data-disabled":dataAttr(disabled),"data-invalid":dataAttr(invalid),"aria-invalid":ariaAttr(state.context.invalid)}),inputProps:normalize.input({...parts.input.attrs,dir:state.context.dir,name:state.context.name,form:state.context.form,id:dom.getInputId(state.context),role:"spinbutton",defaultValue:state.context.formattedValue,pattern:state.context.pattern,inputMode:state.context.inputMode,"aria-invalid":ariaAttr(invalid),"data-invalid":dataAttr(invalid),disabled,"data-disabled":dataAttr(disabled),readOnly:!!state.context.readOnly,autoComplete:"off",autoCorrect:"off",spellCheck:"false",type:"text","aria-roledescription":"numberfield","aria-valuemin":state.context.min,"aria-valuemax":state.context.max,"aria-valuenow":Number.isNaN(state.context.valueAsNumber)?void 0:state.context.valueAsNumber,"aria-valuetext":state.context.valueText,onFocus(){send("INPUT.FOCUS")},onBlur(){send({type:"INPUT.COMMIT",src:"blur"})},onChange(event){send({type:"INPUT.CHANGE",target:event.currentTarget,hint:"set"})},onBeforeInput(event){try{const{selectionStart,selectionEnd,value}=event.currentTarget;const nextValue=value.slice(0,selectionStart)+(event.data??"")+value.slice(selectionEnd);const isValid=state.context.parser.isValidPartialNumber(nextValue);if(!isValid){event.preventDefault()}}catch{}},onKeyDown(event){if(event.defaultPrevented)return;if(readOnly)return;if(isComposingEvent(event))return;const step=getEventStep(event)*state.context.step;const keyMap={ArrowUp(){send({type:"INPUT.ARROW_UP",step});event.preventDefault()},ArrowDown(){send({type:"INPUT.ARROW_DOWN",step});event.preventDefault()},Home(){send("INPUT.HOME");event.preventDefault()},End(){send("INPUT.END");event.preventDefault()},Enter(){send({type:"INPUT.COMMIT",src:"enter"})}};const exec=keyMap[event.key];exec?.(event)}}),decrementTriggerProps:normalize.button({...parts.decrementTrigger.attrs,dir:state.context.dir,id:dom.getDecrementTriggerId(state.context),disabled:isDecrementDisabled,"data-disabled":dataAttr(isDecrementDisabled),"aria-label":translations.decrementLabel,type:"button",tabIndex:-1,"aria-controls":dom.getInputId(state.context),onPointerDown(event){if(isDecrementDisabled||!isLeftClick(event))return;send({type:"TRIGGER.PRESS_DOWN",hint:"decrement",pointerType:event.pointerType});if(event.pointerType==="mouse"){event.preventDefault()}if(event.pointerType==="touch"){event.currentTarget?.focus({preventScroll:true})}},onPointerUp(event){send({type:"TRIGGER.PRESS_UP",hint:"decrement",pointerType:event.pointerType})},onPointerLeave(){if(isDecrementDisabled)return;send({type:"TRIGGER.PRESS_UP",hint:"decrement"})}}),incrementTriggerProps:normalize.button({...parts.incrementTrigger.attrs,dir:state.context.dir,id:dom.getIncrementTriggerId(state.context),disabled:isIncrementDisabled,"data-disabled":dataAttr(isIncrementDisabled),"aria-label":translations.incrementLabel,type:"button",tabIndex:-1,"aria-controls":dom.getInputId(state.context),onPointerDown(event){if(isIncrementDisabled||!isLeftClick(event))return;send({type:"TRIGGER.PRESS_DOWN",hint:"increment",pointerType:event.pointerType});if(event.pointerType==="mouse"){event.preventDefault()}if(event.pointerType==="touch"){event.currentTarget?.focus({preventScroll:true})}},onPointerUp(event){send({type:"TRIGGER.PRESS_UP",hint:"increment",pointerType:event.pointerType})},onPointerLeave(event){send({type:"TRIGGER.PRESS_UP",hint:"increment",pointerType:event.pointerType})}}),scrubberProps:normalize.element({...parts.scrubber.attrs,dir:state.context.dir,"data-disabled":dataAttr(disabled),id:dom.getScrubberId(state.context),role:"presentation",onMouseDown(event){if(disabled)return;const point=getEventPoint(event);point.x=point.x-roundToDevicePixel2(7.5);point.y=point.y-roundToDevicePixel2(7.5);send({type:"SCRUBBER.PRESS_DOWN",point});event.preventDefault()},style:{cursor:disabled?void 0:"ew-resize"}})}}import{choose,createMachine,guards}from"@zag-js/core";import{addDomEvent,requestPointerLock}from"@zag-js/dom-event";import{isSafari as isSafari2,observeAttributes,raf}from"@zag-js/dom-query";import{trackFormControl}from"@zag-js/form-utils";import{clamp,decrement,increment,isAtMax,isAtMin,isWithinRange}from"@zag-js/number-utils";import{callAll,compact,isEqual}from"@zag-js/utils";function recordCursor(inputEl){if(inputEl.ownerDocument.activeElement!==inputEl)return;try{const{selectionStart:start,selectionEnd:end,value}=inputEl;const beforeTxt=value.substring(0,start);const afterTxt=value.substring(end);return{start,end,value,beforeTxt,afterTxt}}catch{}}function restoreCursor(inputEl,selection){if(inputEl.ownerDocument.activeElement!==inputEl)return;if(!selection){inputEl.setSelectionRange(inputEl.value.length,inputEl.value.length);return}try{const{value}=inputEl;const{beforeTxt="",afterTxt="",start}=selection;let startPos=value.length;if(value.endsWith(afterTxt)){startPos=value.length-afterTxt.length}else if(value.startsWith(beforeTxt)){startPos=beforeTxt.length}else if(start!=null){const beforeLastChar=beforeTxt[start-1];const newIndex=value.indexOf(beforeLastChar,start-1);if(newIndex!==-1){startPos=newIndex+1}}inputEl.setSelectionRange(startPos,startPos)}catch{}}import{NumberParser}from"@internationalized/number";import{ref}from"@zag-js/core";var createFormatter=(locale,options={})=>{return ref(new Intl.NumberFormat(locale,options))};var createParser=(locale,options={})=>{return ref(new NumberParser(locale,options))};var parseValue=(ctx,value)=>{if(!ctx.formatOptions)return parseFloat(value);return ctx.parser.parse(String(value))};var formatValue=(ctx,value)=>{if(Number.isNaN(value))return"";if(!ctx.formatOptions)return value.toString();return ctx.formatter.format(value)};var{not,and}=guards;function machine(userContext){const ctx=compact(userContext);return createMachine({id:"number-input",initial:"idle",context:{dir:"ltr",locale:"en-US",focusInputOnChange:true,clampValueOnBlur:true,allowOverflow:false,inputMode:"decimal",pattern:"[0-9]*(.[0-9]+)?",value:"",step:1,min:Number.MIN_SAFE_INTEGER,max:Number.MAX_SAFE_INTEGER,invalid:false,spinOnPress:true,...ctx,hint:null,scrubberCursorPoint:null,fieldsetDisabled:false,formatter:createFormatter(ctx.locale||"en-US",ctx.formatOptions),parser:createParser(ctx.locale||"en-US",ctx.formatOptions),translations:{incrementLabel:"increment value",decrementLabel:"decrease value",...ctx.translations}},computed:{isRtl:ctx2=>ctx2.dir==="rtl",valueAsNumber:ctx2=>parseValue(ctx2,ctx2.value),formattedValue:ctx2=>formatValue(ctx2,ctx2.valueAsNumber),isAtMin:ctx2=>isAtMin(ctx2.valueAsNumber,ctx2),isAtMax:ctx2=>isAtMax(ctx2.valueAsNumber,ctx2),isOutOfRange:ctx2=>!isWithinRange(ctx2.valueAsNumber,ctx2),isValueEmpty:ctx2=>ctx2.value==="",isDisabled:ctx2=>!!ctx2.disabled||ctx2.fieldsetDisabled,canIncrement:ctx2=>ctx2.allowOverflow||!ctx2.isAtMax,canDecrement:ctx2=>ctx2.allowOverflow||!ctx2.isAtMin,valueText:ctx2=>ctx2.translations.valueText?.(ctx2.value)},watch:{formatOptions:["setFormatterAndParser","syncInputElement"],locale:["setFormatterAndParser","syncInputElement"],value:["syncInputElement"],isOutOfRange:["invokeOnInvalid"],scrubberCursorPoint:["setVirtualCursorPosition"]},activities:["trackFormControl"],on:{"VALUE.SET":{actions:["setRawValue","setHintToSet"]},"VALUE.CLEAR":{actions:["clearValue"]},"VALUE.INCREMENT":{actions:["increment"]},"VALUE.DECREMENT":{actions:["decrement"]}},states:{idle:{on:{"TRIGGER.PRESS_DOWN":[{guard:"isTouchPointer",target:"before:spin",actions:["setHint"]},{target:"before:spin",actions:["focusInput","invokeOnFocus","setHint"]}],"SCRUBBER.PRESS_DOWN":{target:"scrubbing",actions:["focusInput","invokeOnFocus","setHint","setCursorPoint"]},"INPUT.FOCUS":{target:"focused",actions:["focusInput","invokeOnFocus"]}}},focused:{tags:"focus",activities:"attachWheelListener",on:{"TRIGGER.PRESS_DOWN":[{guard:"isTouchPointer",target:"before:spin",actions:["setHint"]},{target:"before:spin",actions:["focusInput","setHint"]}],"SCRUBBER.PRESS_DOWN":{target:"scrubbing",actions:["focusInput","setHint","setCursorPoint"]},"INPUT.ARROW_UP":{actions:"increment"},"INPUT.ARROW_DOWN":{actions:"decrement"},"INPUT.HOME":{actions:"decrementToMin"},"INPUT.END":{actions:"incrementToMax"},"INPUT.CHANGE":{actions:["setValue","setHint"]},"INPUT.COMMIT":[{guard:and("clampValueOnBlur",not("isInRange")),target:"idle",actions:["setClampedValue","clearHint","invokeOnBlur"]},{target:"idle",actions:["setFormattedValue","clearHint","invokeOnBlur"]}]}},"before:spin":{tags:"focus",activities:"trackButtonDisabled",entry:choose([{guard:"isIncrementHint",actions:"increment"},{guard:"isDecrementHint",actions:"decrement"}]),after:{CHANGE_DELAY:{target:"spinning",guard:and("isInRange","spinOnPress")}},on:{"TRIGGER.PRESS_UP":[{guard:"isTouchPointer",target:"focused",actions:"clearHint"},{target:"focused",actions:["focusInput","clearHint"]}]}},spinning:{tags:"focus",activities:"trackButtonDisabled",every:[{delay:"CHANGE_INTERVAL",guard:and(not("isAtMin"),"isIncrementHint"),actions:"increment"},{delay:"CHANGE_INTERVAL",guard:and(not("isAtMax"),"isDecrementHint"),actions:"decrement"}],on:{"TRIGGER.PRESS_UP":{target:"focused",actions:["focusInput","clearHint"]}}},scrubbing:{tags:"focus",activities:["activatePointerLock","trackMousemove","setupVirtualCursor","preventTextSelection"],on:{"SCRUBBER.POINTER_UP":{target:"focused",actions:["focusInput","clearCursorPoint"]},"SCRUBBER.POINTER_MOVE":[{guard:"isIncrementHint",actions:["increment","setCursorPoint"]},{guard:"isDecrementHint",actions:["decrement","setCursorPoint"]}]}}}},{delays:{CHANGE_INTERVAL:50,CHANGE_DELAY:300},guards:{clampValueOnBlur:ctx2=>ctx2.clampValueOnBlur,isAtMin:ctx2=>ctx2.isAtMin,spinOnPress:ctx2=>!!ctx2.spinOnPress,isAtMax:ctx2=>ctx2.isAtMax,isInRange:ctx2=>!ctx2.isOutOfRange,isDecrementHint:(ctx2,evt)=>(evt.hint??ctx2.hint)==="decrement",isIncrementHint:(ctx2,evt)=>(evt.hint??ctx2.hint)==="increment",isTouchPointer:(_ctx,evt)=>evt.pointerType==="touch"},activities:{trackFormControl(ctx2,_evt,{initialContext}){const inputEl=dom.getInputEl(ctx2);return trackFormControl(inputEl,{onFieldsetDisabledChange(disabled){ctx2.fieldsetDisabled=disabled},onFormReset(){set.value(ctx2,initialContext.value)}})},setupVirtualCursor(ctx2){return dom.setupVirtualCursor(ctx2)},preventTextSelection(ctx2){return dom.preventTextSelection(ctx2)},trackButtonDisabled(ctx2,_evt,{send}){const btn=dom.getPressedTriggerEl(ctx2,ctx2.hint);return observeAttributes(btn,{attributes:["disabled"],callback(){send({type:"TRIGGER.PRESS_UP",src:"attr"})}})},attachWheelListener(ctx2,_evt,{send}){const inputEl=dom.getInputEl(ctx2);if(!inputEl||!dom.isActiveElement(ctx2,inputEl)||!ctx2.allowMouseWheel)return;function onWheel(event){event.preventDefault();const dir=Math.sign(event.deltaY)*-1;if(dir===1){send("VALUE.INCREMENT")}else if(dir===-1){send("VALUE.DECREMENT")}}return addDomEvent(inputEl,"wheel",onWheel,{passive:false})},activatePointerLock(ctx2){if(isSafari2())return;return requestPointerLock(dom.getDoc(ctx2))},trackMousemove(ctx2,_evt,{send}){const doc=dom.getDoc(ctx2);function onMousemove(event){if(!ctx2.scrubberCursorPoint)return;const value=dom.getMousementValue(ctx2,event);if(!value.hint)return;send({type:"SCRUBBER.POINTER_MOVE",hint:value.hint,point:value.point})}function onMouseup(){send("SCRUBBER.POINTER_UP")}return callAll(addDomEvent(doc,"mousemove",onMousemove,false),addDomEvent(doc,"mouseup",onMouseup,false))}},actions:{focusInput(ctx2){if(!ctx2.focusInputOnChange)return;const inputEl=dom.getInputEl(ctx2);if(dom.isActiveElement(ctx2,inputEl))return;raf(()=>inputEl?.focus({preventScroll:true}))},increment(ctx2,evt){const nextValue=increment(ctx2.valueAsNumber,evt.step??ctx2.step);const value=formatValue(ctx2,clamp(nextValue,ctx2));set.value(ctx2,value)},decrement(ctx2,evt){const nextValue=decrement(ctx2.valueAsNumber,evt.step??ctx2.step);const value=formatValue(ctx2,clamp(nextValue,ctx2));set.value(ctx2,value)},setClampedValue(ctx2){const nextValue=clamp(ctx2.valueAsNumber,ctx2);set.value(ctx2,formatValue(ctx2,nextValue))},setRawValue(ctx2,evt){const parsedValue=parseValue(ctx2,evt.value);const value=formatValue(ctx2,clamp(parsedValue,ctx2));set.value(ctx2,value)},setValue(ctx2,evt){const value=evt.target?.value??evt.value;set.value(ctx2,value)},clearValue(ctx2){set.value(ctx2,"")},incrementToMax(ctx2){const value=formatValue(ctx2,ctx2.max);set.value(ctx2,value)},decrementToMin(ctx2){const value=formatValue(ctx2,ctx2.min);set.value(ctx2,value)},setHint(ctx2,evt){ctx2.hint=evt.hint},clearHint(ctx2){ctx2.hint=null},setHintToSet(ctx2){ctx2.hint="set"},invokeOnFocus(ctx2){ctx2.onFocusChange?.({focused:true,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},invokeOnBlur(ctx2){ctx2.onFocusChange?.({focused:false,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},invokeOnInvalid(ctx2){if(!ctx2.isOutOfRange)return;const reason=ctx2.valueAsNumber>ctx2.max?"rangeOverflow":"rangeUnderflow";ctx2.onValueInvalid?.({reason,value:ctx2.formattedValue,valueAsNumber:ctx2.valueAsNumber})},syncInputElement(ctx2,evt){const value=evt.type.endsWith("CHANGE")?ctx2.value:ctx2.formattedValue;sync.input(ctx2,value)},setFormattedValue(ctx2){set.value(ctx2,ctx2.formattedValue)},setCursorPoint(ctx2,evt){ctx2.scrubberCursorPoint=evt.point},clearCursorPoint(ctx2){ctx2.scrubberCursorPoint=null},setVirtualCursorPosition(ctx2){const cursorEl=dom.getCursorEl(ctx2);if(!cursorEl||!ctx2.scrubberCursorPoint)return;const{x,y}=ctx2.scrubberCursorPoint;cursorEl.style.transform=`translate3d(${x}px, ${y}px, 0px)`},setFormatterAndParser(ctx2){if(!ctx2.locale)return;ctx2.formatter=createFormatter(ctx2.locale,ctx2.formatOptions);ctx2.parser=createParser(ctx2.locale,ctx2.formatOptions)}},compareFns:{formatOptions:(a,b)=>isEqual(a,b),scrubberCursorPoint:(a,b)=>isEqual(a,b)}})}var sync={input(ctx,value){const inputEl=dom.getInputEl(ctx);if(!inputEl)return;const sel=recordCursor(inputEl);raf(()=>{dom.setValue(inputEl,value);restoreCursor(inputEl,sel)})}};var invoke={onChange:ctx=>{ctx.onValueChange?.({value:ctx.value,valueAsNumber:ctx.valueAsNumber})}};var set={value:(ctx,value)=>{if(isEqual(ctx.value,value))return;ctx.value=value;invoke.onChange(ctx)}};export{anatomy,connect,machine};
|
|
8
8
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/number-input.anatomy.ts","../src/number-input.connect.ts","../src/number-input.dom.ts","../src/number-input.machine.ts","../src/cursor.ts","../src/number-input.utils.ts"],"sourcesContent":["import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"numberInput\").parts(\n \"root\",\n \"label\",\n \"input\",\n \"control\",\n \"incrementTrigger\",\n \"decrementTrigger\",\n \"scrubber\",\n)\n\nexport const parts = anatomy.build()\n","import { getEventPoint, getEventStep, getNativeEvent, isLeftClick, type EventKeyMap } from \"@zag-js/dom-event\"\nimport { ariaAttr, dataAttr } from \"@zag-js/dom-query\"\nimport { roundToDevicePixel } from \"@zag-js/number-utils\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./number-input.anatomy\"\nimport { dom } from \"./number-input.dom\"\nimport type { MachineApi, Send, State } from \"./number-input.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const focused = state.hasTag(\"focus\")\n const disabled = state.context.isDisabled\n const readOnly = state.context.readOnly\n\n const empty = state.context.isValueEmpty\n const invalid = state.context.isOutOfRange || !!state.context.invalid\n\n const isIncrementDisabled = disabled || !state.context.canIncrement || readOnly\n const isDecrementDisabled = disabled || !state.context.canDecrement || readOnly\n\n const translations = state.context.translations\n\n return {\n focused: focused,\n invalid: invalid,\n empty: empty,\n value: state.context.formattedValue,\n valueAsNumber: state.context.valueAsNumber,\n setValue(value) {\n send({ type: \"VALUE.SET\", value })\n },\n clearValue() {\n send(\"VALUE.CLEAR\")\n },\n increment() {\n send(\"VALUE.INCREMENT\")\n },\n decrement() {\n send(\"VALUE.DECREMENT\")\n },\n setToMax() {\n send({ type: \"VALUE.SET\", value: state.context.max })\n },\n setToMin() {\n send({ type: \"VALUE.SET\", value: state.context.min })\n },\n focus() {\n dom.getInputEl(state.context)?.focus()\n },\n\n rootProps: normalize.element({\n id: dom.getRootId(state.context),\n ...parts.root.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n \"data-focus\": dataAttr(focused),\n \"data-invalid\": dataAttr(invalid),\n }),\n\n labelProps: normalize.label({\n ...parts.label.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n \"data-focus\": dataAttr(focused),\n \"data-invalid\": dataAttr(invalid),\n id: dom.getLabelId(state.context),\n htmlFor: dom.getInputId(state.context),\n }),\n\n controlProps: normalize.element({\n ...parts.control.attrs,\n dir: state.context.dir,\n role: \"group\",\n \"aria-disabled\": disabled,\n \"data-focus\": dataAttr(focused),\n \"data-disabled\": dataAttr(disabled),\n \"data-invalid\": dataAttr(invalid),\n \"aria-invalid\": ariaAttr(state.context.invalid),\n }),\n\n inputProps: normalize.input({\n ...parts.input.attrs,\n dir: state.context.dir,\n name: state.context.name,\n form: state.context.form,\n id: dom.getInputId(state.context),\n role: \"spinbutton\",\n defaultValue: state.context.formattedValue,\n pattern: state.context.pattern,\n inputMode: state.context.inputMode,\n \"aria-invalid\": ariaAttr(invalid),\n \"data-invalid\": dataAttr(invalid),\n disabled: disabled,\n \"data-disabled\": dataAttr(disabled),\n readOnly: !!state.context.readOnly,\n autoComplete: \"off\",\n autoCorrect: \"off\",\n spellCheck: \"false\",\n type: \"text\",\n \"aria-roledescription\": \"numberfield\",\n \"aria-valuemin\": state.context.min,\n \"aria-valuemax\": state.context.max,\n \"aria-valuenow\": Number.isNaN(state.context.valueAsNumber) ? undefined : state.context.valueAsNumber,\n \"aria-valuetext\": state.context.valueText,\n onFocus() {\n send(\"INPUT.FOCUS\")\n },\n onBlur() {\n send({ type: \"INPUT.COMMIT\", src: \"blur\" })\n },\n onChange(event) {\n send({ type: \"INPUT.CHANGE\", target: event.currentTarget, hint: \"set\" })\n },\n onBeforeInput(event) {\n try {\n const { selectionStart, selectionEnd, value } = event.currentTarget\n\n const nextValue = value.slice(0, selectionStart!) + ((event as any).data ?? \"\") + value.slice(selectionEnd!)\n const isValid = state.context.parser.isValidPartialNumber(nextValue)\n\n if (!isValid) {\n event.preventDefault()\n }\n } catch {\n // noop\n }\n },\n onKeyDown(event) {\n if (event.defaultPrevented) return\n if (readOnly) return\n const evt = getNativeEvent(event)\n if (evt.isComposing) return\n\n const step = getEventStep(event) * state.context.step\n\n const keyMap: EventKeyMap = {\n ArrowUp() {\n send({ type: \"INPUT.ARROW_UP\", step })\n event.preventDefault()\n },\n ArrowDown() {\n send({ type: \"INPUT.ARROW_DOWN\", step })\n event.preventDefault()\n },\n Home() {\n send(\"INPUT.HOME\")\n event.preventDefault()\n },\n End() {\n send(\"INPUT.END\")\n event.preventDefault()\n },\n Enter() {\n send({ type: \"INPUT.COMMIT\", src: \"enter\" })\n },\n }\n\n const exec = keyMap[event.key]\n exec?.(event)\n },\n }),\n\n decrementTriggerProps: normalize.button({\n ...parts.decrementTrigger.attrs,\n dir: state.context.dir,\n id: dom.getDecrementTriggerId(state.context),\n disabled: isDecrementDisabled,\n \"data-disabled\": dataAttr(isDecrementDisabled),\n \"aria-label\": translations.decrementLabel,\n type: \"button\",\n tabIndex: -1,\n \"aria-controls\": dom.getInputId(state.context),\n onPointerDown(event) {\n if (isDecrementDisabled || !isLeftClick(event)) return\n send({ type: \"TRIGGER.PRESS_DOWN\", hint: \"decrement\", pointerType: event.pointerType })\n if (event.pointerType === \"mouse\") {\n event.preventDefault()\n }\n if (event.pointerType === \"touch\") {\n event.currentTarget?.focus({ preventScroll: true })\n }\n },\n onPointerUp(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"decrement\", pointerType: event.pointerType })\n },\n onPointerLeave() {\n if (isDecrementDisabled) return\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"decrement\" })\n },\n }),\n\n incrementTriggerProps: normalize.button({\n ...parts.incrementTrigger.attrs,\n dir: state.context.dir,\n id: dom.getIncrementTriggerId(state.context),\n disabled: isIncrementDisabled,\n \"data-disabled\": dataAttr(isIncrementDisabled),\n \"aria-label\": translations.incrementLabel,\n type: \"button\",\n tabIndex: -1,\n \"aria-controls\": dom.getInputId(state.context),\n onPointerDown(event) {\n if (isIncrementDisabled || !isLeftClick(event)) return\n send({ type: \"TRIGGER.PRESS_DOWN\", hint: \"increment\", pointerType: event.pointerType })\n if (event.pointerType === \"mouse\") {\n event.preventDefault()\n }\n if (event.pointerType === \"touch\") {\n event.currentTarget?.focus({ preventScroll: true })\n }\n },\n onPointerUp(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"increment\", pointerType: event.pointerType })\n },\n onPointerLeave(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"increment\", pointerType: event.pointerType })\n },\n }),\n\n scrubberProps: normalize.element({\n ...parts.scrubber.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n id: dom.getScrubberId(state.context),\n role: \"presentation\",\n onMouseDown(event) {\n if (disabled) return\n\n const evt = getNativeEvent(event)\n const point = getEventPoint(evt)\n\n point.x = point.x - roundToDevicePixel(7.5)\n point.y = point.y - roundToDevicePixel(7.5)\n\n send({ type: \"SCRUBBER.PRESS_DOWN\", point })\n event.preventDefault()\n },\n style: {\n cursor: disabled ? undefined : \"ew-resize\",\n },\n }),\n }\n}\n","import { createScope, isSafari, MAX_Z_INDEX } from \"@zag-js/dom-query\"\nimport { roundToDevicePixel, wrap } from \"@zag-js/number-utils\"\nimport type { MachineContext as Ctx } from \"./number-input.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `number-input:${ctx.id}`,\n getInputId: (ctx: Ctx) => ctx.ids?.input ?? `number-input:${ctx.id}:input`,\n getIncrementTriggerId: (ctx: Ctx) => ctx.ids?.incrementTrigger ?? `number-input:${ctx.id}:inc`,\n getDecrementTriggerId: (ctx: Ctx) => ctx.ids?.decrementTrigger ?? `number-input:${ctx.id}:dec`,\n getScrubberId: (ctx: Ctx) => ctx.ids?.scrubber ?? `number-input:${ctx.id}:scrubber`,\n getCursorId: (ctx: Ctx) => `number-input:${ctx.id}:cursor`,\n getLabelId: (ctx: Ctx) => ctx.ids?.label ?? `number-input:${ctx.id}:label`,\n\n getInputEl: (ctx: Ctx) => dom.getById<HTMLInputElement>(ctx, dom.getInputId(ctx)),\n getIncrementTriggerEl: (ctx: Ctx) => dom.getById<HTMLButtonElement>(ctx, dom.getIncrementTriggerId(ctx)),\n getDecrementTriggerEl: (ctx: Ctx) => dom.getById<HTMLButtonElement>(ctx, dom.getDecrementTriggerId(ctx)),\n getScrubberEl: (ctx: Ctx) => dom.getById(ctx, dom.getScrubberId(ctx)),\n getCursorEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getCursorId(ctx)),\n\n getPressedTriggerEl: (ctx: Ctx, hint = ctx.hint) => {\n let btnEl: HTMLButtonElement | null = null\n if (hint === \"increment\") {\n btnEl = dom.getIncrementTriggerEl(ctx)\n }\n if (hint === \"decrement\") {\n btnEl = dom.getDecrementTriggerEl(ctx)\n }\n return btnEl\n },\n\n setupVirtualCursor(ctx: Ctx) {\n if (isSafari()) return\n dom.createVirtualCursor(ctx)\n return () => {\n dom.getCursorEl(ctx)?.remove()\n }\n },\n\n preventTextSelection(ctx: Ctx) {\n const doc = dom.getDoc(ctx)\n const html = doc.documentElement\n const body = doc.body\n\n body.style.pointerEvents = \"none\"\n html.style.userSelect = \"none\"\n html.style.cursor = \"ew-resize\"\n\n return () => {\n body.style.pointerEvents = \"\"\n html.style.userSelect = \"\"\n html.style.cursor = \"\"\n if (!html.style.length) {\n html.removeAttribute(\"style\")\n }\n if (!body.style.length) {\n body.removeAttribute(\"style\")\n }\n }\n },\n\n getMousementValue(ctx: Ctx, event: MouseEvent) {\n const x = roundToDevicePixel(event.movementX)\n const y = roundToDevicePixel(event.movementY)\n\n let hint = x > 0 ? \"increment\" : x < 0 ? \"decrement\" : null\n\n if (ctx.isRtl && hint === \"increment\") hint = \"decrement\"\n if (ctx.isRtl && hint === \"decrement\") hint = \"increment\"\n\n const point = {\n x: ctx.scrubberCursorPoint!.x + x,\n y: ctx.scrubberCursorPoint!.y + y,\n }\n\n const win = dom.getWin(ctx)\n const width = win.innerWidth\n const half = roundToDevicePixel(7.5)\n point.x = wrap(point.x + half, width) - half\n\n return { hint, point }\n },\n\n createVirtualCursor(ctx: Ctx) {\n const doc = dom.getDoc(ctx)\n const el = doc.createElement(\"div\")\n el.className = \"scrubber--cursor\"\n el.id = dom.getCursorId(ctx)\n\n Object.assign(el.style, {\n width: \"15px\",\n height: \"15px\",\n position: \"fixed\",\n pointerEvents: \"none\",\n left: \"0px\",\n top: \"0px\",\n zIndex: MAX_Z_INDEX,\n transform: ctx.scrubberCursorPoint\n ? `translate3d(${ctx.scrubberCursorPoint.x}px, ${ctx.scrubberCursorPoint.y}px, 0px)`\n : undefined,\n willChange: \"transform\",\n })\n\n el.innerHTML = `\n <svg width=\"46\" height=\"15\" style=\"left: -15.5px; position: absolute; top: 0; filter: drop-shadow(rgba(0, 0, 0, 0.4) 0px 1px 1.1px);\">\n <g transform=\"translate(2 3)\">\n <path fill-rule=\"evenodd\" d=\"M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z\" style=\"stroke-width: 2px; stroke: white;\"></path>\n <path fill-rule=\"evenodd\" d=\"M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z\"></path>\n </g>\n </svg>`\n\n doc.body.appendChild(el)\n },\n})\n","import { choose, createMachine, guards } from \"@zag-js/core\"\nimport { addDomEvent, requestPointerLock } from \"@zag-js/dom-event\"\nimport { isSafari, observeAttributes, raf } from \"@zag-js/dom-query\"\nimport { trackFormControl } from \"@zag-js/form-utils\"\nimport { clamp, decrement, increment, isAtMax, isAtMin, isWithinRange } from \"@zag-js/number-utils\"\nimport { callAll, compact, isEqual } from \"@zag-js/utils\"\nimport { recordCursor, restoreCursor } from \"./cursor\"\nimport { dom } from \"./number-input.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./number-input.types\"\nimport { createFormatter, createParser, formatValue, parseValue } from \"./number-input.utils\"\n\nconst { not, and } = guards\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"number-input\",\n initial: \"idle\",\n context: {\n dir: \"ltr\",\n locale: \"en-US\",\n focusInputOnChange: true,\n clampValueOnBlur: true,\n allowOverflow: false,\n inputMode: \"decimal\",\n pattern: \"[0-9]*(.[0-9]+)?\",\n value: \"\",\n step: 1,\n min: Number.MIN_SAFE_INTEGER,\n max: Number.MAX_SAFE_INTEGER,\n invalid: false,\n spinOnPress: true,\n ...ctx,\n hint: null,\n scrubberCursorPoint: null,\n fieldsetDisabled: false,\n formatter: createFormatter(ctx.locale || \"en-US\", ctx.formatOptions),\n parser: createParser(ctx.locale || \"en-US\", ctx.formatOptions),\n translations: {\n incrementLabel: \"increment value\",\n decrementLabel: \"decrease value\",\n ...ctx.translations,\n },\n },\n\n computed: {\n isRtl: (ctx) => ctx.dir === \"rtl\",\n valueAsNumber: (ctx) => parseValue(ctx, ctx.value),\n formattedValue: (ctx) => formatValue(ctx, ctx.valueAsNumber),\n isAtMin: (ctx) => isAtMin(ctx.valueAsNumber, ctx),\n isAtMax: (ctx) => isAtMax(ctx.valueAsNumber, ctx),\n isOutOfRange: (ctx) => !isWithinRange(ctx.valueAsNumber, ctx),\n isValueEmpty: (ctx) => ctx.value === \"\",\n isDisabled: (ctx) => !!ctx.disabled || ctx.fieldsetDisabled,\n canIncrement: (ctx) => ctx.allowOverflow || !ctx.isAtMax,\n canDecrement: (ctx) => ctx.allowOverflow || !ctx.isAtMin,\n valueText: (ctx) => ctx.translations.valueText?.(ctx.value),\n },\n\n watch: {\n formatOptions: [\"setFormatterAndParser\", \"syncInputElement\"],\n locale: [\"setFormatterAndParser\", \"syncInputElement\"],\n value: [\"syncInputElement\"],\n isOutOfRange: [\"invokeOnInvalid\"],\n scrubberCursorPoint: [\"setVirtualCursorPosition\"],\n },\n\n activities: [\"trackFormControl\"],\n\n on: {\n \"VALUE.SET\": {\n actions: [\"setRawValue\", \"setHintToSet\"],\n },\n \"VALUE.CLEAR\": {\n actions: [\"clearValue\"],\n },\n \"VALUE.INCREMENT\": {\n actions: [\"increment\"],\n },\n \"VALUE.DECREMENT\": {\n actions: [\"decrement\"],\n },\n },\n\n states: {\n idle: {\n on: {\n \"TRIGGER.PRESS_DOWN\": [\n { guard: \"isTouchPointer\", target: \"before:spin\", actions: [\"setHint\"] },\n {\n target: \"before:spin\",\n actions: [\"focusInput\", \"invokeOnFocus\", \"setHint\"],\n },\n ],\n \"SCRUBBER.PRESS_DOWN\": {\n target: \"scrubbing\",\n actions: [\"focusInput\", \"invokeOnFocus\", \"setHint\", \"setCursorPoint\"],\n },\n \"INPUT.FOCUS\": {\n target: \"focused\",\n actions: [\"focusInput\", \"invokeOnFocus\"],\n },\n },\n },\n\n focused: {\n tags: \"focus\",\n activities: \"attachWheelListener\",\n on: {\n \"TRIGGER.PRESS_DOWN\": [\n { guard: \"isTouchPointer\", target: \"before:spin\", actions: [\"setHint\"] },\n { target: \"before:spin\", actions: [\"focusInput\", \"setHint\"] },\n ],\n \"SCRUBBER.PRESS_DOWN\": {\n target: \"scrubbing\",\n actions: [\"focusInput\", \"setHint\", \"setCursorPoint\"],\n },\n \"INPUT.ARROW_UP\": {\n actions: \"increment\",\n },\n \"INPUT.ARROW_DOWN\": {\n actions: \"decrement\",\n },\n \"INPUT.HOME\": {\n actions: \"decrementToMin\",\n },\n \"INPUT.END\": {\n actions: \"incrementToMax\",\n },\n \"INPUT.CHANGE\": {\n actions: [\"setValue\", \"setHint\"],\n },\n \"INPUT.COMMIT\": [\n {\n guard: and(\"clampValueOnBlur\", not(\"isInRange\")),\n target: \"idle\",\n actions: [\"setClampedValue\", \"clearHint\", \"invokeOnBlur\"],\n },\n {\n target: \"idle\",\n actions: [\"setFormattedValue\", \"clearHint\", \"invokeOnBlur\"],\n },\n ],\n },\n },\n\n \"before:spin\": {\n tags: \"focus\",\n activities: \"trackButtonDisabled\",\n entry: choose([\n { guard: \"isIncrementHint\", actions: \"increment\" },\n { guard: \"isDecrementHint\", actions: \"decrement\" },\n ]),\n after: {\n CHANGE_DELAY: {\n target: \"spinning\",\n guard: and(\"isInRange\", \"spinOnPress\"),\n },\n },\n on: {\n \"TRIGGER.PRESS_UP\": [\n { guard: \"isTouchPointer\", target: \"focused\", actions: \"clearHint\" },\n { target: \"focused\", actions: [\"focusInput\", \"clearHint\"] },\n ],\n },\n },\n\n spinning: {\n tags: \"focus\",\n activities: \"trackButtonDisabled\",\n every: [\n {\n delay: \"CHANGE_INTERVAL\",\n guard: and(not(\"isAtMin\"), \"isIncrementHint\"),\n actions: \"increment\",\n },\n {\n delay: \"CHANGE_INTERVAL\",\n guard: and(not(\"isAtMax\"), \"isDecrementHint\"),\n actions: \"decrement\",\n },\n ],\n on: {\n \"TRIGGER.PRESS_UP\": {\n target: \"focused\",\n actions: [\"focusInput\", \"clearHint\"],\n },\n },\n },\n\n scrubbing: {\n tags: \"focus\",\n activities: [\"activatePointerLock\", \"trackMousemove\", \"setupVirtualCursor\", \"preventTextSelection\"],\n on: {\n \"SCRUBBER.POINTER_UP\": {\n target: \"focused\",\n actions: [\"focusInput\", \"clearCursorPoint\"],\n },\n \"SCRUBBER.POINTER_MOVE\": [\n {\n guard: \"isIncrementHint\",\n actions: [\"increment\", \"setCursorPoint\"],\n },\n {\n guard: \"isDecrementHint\",\n actions: [\"decrement\", \"setCursorPoint\"],\n },\n ],\n },\n },\n },\n },\n {\n delays: {\n CHANGE_INTERVAL: 50,\n CHANGE_DELAY: 300,\n },\n\n guards: {\n clampValueOnBlur: (ctx) => ctx.clampValueOnBlur,\n isAtMin: (ctx) => ctx.isAtMin,\n spinOnPress: (ctx) => !!ctx.spinOnPress,\n isAtMax: (ctx) => ctx.isAtMax,\n isInRange: (ctx) => !ctx.isOutOfRange,\n isDecrementHint: (ctx, evt) => (evt.hint ?? ctx.hint) === \"decrement\",\n isIncrementHint: (ctx, evt) => (evt.hint ?? ctx.hint) === \"increment\",\n isTouchPointer: (_ctx, evt) => evt.pointerType === \"touch\",\n },\n\n activities: {\n trackFormControl(ctx, _evt, { initialContext }) {\n const inputEl = dom.getInputEl(ctx)\n return trackFormControl(inputEl, {\n onFieldsetDisabledChange(disabled) {\n ctx.fieldsetDisabled = disabled\n },\n onFormReset() {\n set.value(ctx, initialContext.value)\n },\n })\n },\n setupVirtualCursor(ctx) {\n return dom.setupVirtualCursor(ctx)\n },\n preventTextSelection(ctx) {\n return dom.preventTextSelection(ctx)\n },\n trackButtonDisabled(ctx, _evt, { send }) {\n const btn = dom.getPressedTriggerEl(ctx, ctx.hint)\n return observeAttributes(btn, {\n attributes: [\"disabled\"],\n callback() {\n send({ type: \"TRIGGER.PRESS_UP\", src: \"attr\" })\n },\n })\n },\n attachWheelListener(ctx, _evt, { send }) {\n const inputEl = dom.getInputEl(ctx)\n if (!inputEl || !dom.isActiveElement(ctx, inputEl) || !ctx.allowMouseWheel) return\n\n function onWheel(event: WheelEvent) {\n event.preventDefault()\n const dir = Math.sign(event.deltaY) * -1\n if (dir === 1) {\n send(\"VALUE.INCREMENT\")\n } else if (dir === -1) {\n send(\"VALUE.DECREMENT\")\n }\n }\n\n return addDomEvent(inputEl, \"wheel\", onWheel, { passive: false })\n },\n activatePointerLock(ctx) {\n if (isSafari()) return\n return requestPointerLock(dom.getDoc(ctx))\n },\n trackMousemove(ctx, _evt, { send }) {\n const doc = dom.getDoc(ctx)\n\n function onMousemove(event: MouseEvent) {\n if (!ctx.scrubberCursorPoint) return\n const value = dom.getMousementValue(ctx, event)\n if (!value.hint) return\n send({\n type: \"SCRUBBER.POINTER_MOVE\",\n hint: value.hint,\n point: value.point,\n })\n }\n\n function onMouseup() {\n send(\"SCRUBBER.POINTER_UP\")\n }\n\n return callAll(\n addDomEvent(doc, \"mousemove\", onMousemove, false),\n addDomEvent(doc, \"mouseup\", onMouseup, false),\n )\n },\n },\n\n actions: {\n focusInput(ctx) {\n if (!ctx.focusInputOnChange) return\n const inputEl = dom.getInputEl(ctx)\n if (dom.isActiveElement(ctx, inputEl)) return\n raf(() => inputEl?.focus({ preventScroll: true }))\n },\n increment(ctx, evt) {\n const nextValue = increment(ctx.valueAsNumber, evt.step ?? ctx.step)\n const value = formatValue(ctx, clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n decrement(ctx, evt) {\n const nextValue = decrement(ctx.valueAsNumber, evt.step ?? ctx.step)\n const value = formatValue(ctx, clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n setClampedValue(ctx) {\n const nextValue = clamp(ctx.valueAsNumber, ctx)\n set.value(ctx, formatValue(ctx, nextValue))\n },\n setRawValue(ctx, evt) {\n const parsedValue = parseValue(ctx, evt.value)\n const value = formatValue(ctx, clamp(parsedValue, ctx))\n set.value(ctx, value)\n },\n setValue(ctx, evt) {\n const value = evt.target?.value ?? evt.value\n set.value(ctx, value)\n },\n clearValue(ctx) {\n set.value(ctx, \"\")\n },\n incrementToMax(ctx) {\n const value = formatValue(ctx, ctx.max)\n set.value(ctx, value)\n },\n decrementToMin(ctx) {\n const value = formatValue(ctx, ctx.min)\n set.value(ctx, value)\n },\n setHint(ctx, evt) {\n ctx.hint = evt.hint\n },\n clearHint(ctx) {\n ctx.hint = null\n },\n setHintToSet(ctx) {\n ctx.hint = \"set\"\n },\n invokeOnFocus(ctx) {\n ctx.onFocusChange?.({\n focused: true,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n invokeOnBlur(ctx) {\n ctx.onFocusChange?.({\n focused: false,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n invokeOnInvalid(ctx) {\n if (!ctx.isOutOfRange) return\n const reason = ctx.valueAsNumber > ctx.max ? \"rangeOverflow\" : \"rangeUnderflow\"\n ctx.onValueInvalid?.({\n reason,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n syncInputElement(ctx, evt) {\n const value = evt.type.endsWith(\"CHANGE\") ? ctx.value : ctx.formattedValue\n sync.input(ctx, value)\n },\n setFormattedValue(ctx) {\n set.value(ctx, ctx.formattedValue)\n },\n setCursorPoint(ctx, evt) {\n ctx.scrubberCursorPoint = evt.point\n },\n clearCursorPoint(ctx) {\n ctx.scrubberCursorPoint = null\n },\n setVirtualCursorPosition(ctx) {\n const cursorEl = dom.getCursorEl(ctx)\n if (!cursorEl || !ctx.scrubberCursorPoint) return\n const { x, y } = ctx.scrubberCursorPoint\n cursorEl.style.transform = `translate3d(${x}px, ${y}px, 0px)`\n },\n setFormatterAndParser(ctx) {\n if (!ctx.locale) return\n ctx.formatter = createFormatter(ctx.locale, ctx.formatOptions)\n ctx.parser = createParser(ctx.locale, ctx.formatOptions)\n },\n },\n compareFns: {\n formatOptions: (a, b) => isEqual(a, b),\n scrubberCursorPoint: (a, b) => isEqual(a, b),\n },\n },\n )\n}\n\nconst sync = {\n input(ctx: MachineContext, value: string) {\n const inputEl = dom.getInputEl(ctx)\n if (!inputEl) return\n\n // record cursor position before updating input value\n const sel = recordCursor(inputEl)\n\n // restore cursor position after updating input value\n raf(() => {\n dom.setValue(inputEl, value)\n restoreCursor(inputEl, sel)\n })\n },\n}\n\nconst invoke = {\n onChange: (ctx: MachineContext) => {\n ctx.onValueChange?.({\n value: ctx.value,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n}\n\nconst set = {\n value: (ctx: MachineContext, value: string) => {\n if (isEqual(ctx.value, value)) return\n ctx.value = value\n invoke.onChange(ctx)\n },\n}\n","/**\n * Credits: https://github.com/react-component/input-number/blob/master/src/hooks/useCursor.ts\n */\n\ninterface Selection {\n start?: number\n end?: number\n value?: string\n beforeTxt?: string\n afterTxt?: string\n}\n\nexport function recordCursor(inputEl: HTMLInputElement): Selection | undefined {\n if (inputEl.ownerDocument.activeElement !== inputEl) return\n try {\n const { selectionStart: start, selectionEnd: end, value } = inputEl\n const beforeTxt = value.substring(0, start!)\n const afterTxt = value.substring(end!)\n return {\n start: start!,\n end: end!,\n value,\n beforeTxt,\n afterTxt,\n }\n } catch {}\n}\n\nexport function restoreCursor(inputEl: HTMLInputElement, selection: Selection | undefined) {\n if (inputEl.ownerDocument.activeElement !== inputEl) return\n\n if (!selection) {\n inputEl.setSelectionRange(inputEl.value.length, inputEl.value.length)\n return\n }\n\n try {\n const { value } = inputEl\n const { beforeTxt = \"\", afterTxt = \"\", start } = selection\n\n let startPos = value.length\n\n if (value.endsWith(afterTxt)) {\n startPos = value.length - afterTxt.length\n } else if (value.startsWith(beforeTxt)) {\n startPos = beforeTxt.length\n } else if (start != null) {\n const beforeLastChar = beforeTxt[start - 1]\n const newIndex = value.indexOf(beforeLastChar, start - 1)\n if (newIndex !== -1) {\n startPos = newIndex + 1\n }\n }\n\n inputEl.setSelectionRange(startPos, startPos)\n } catch {}\n}\n","import { NumberParser } from \"@internationalized/number\"\nimport { ref } from \"@zag-js/core\"\nimport type { MachineContext } from \"./number-input.types\"\n\nexport const createFormatter = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n return ref(new Intl.NumberFormat(locale, options))\n}\n\nexport const createParser = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n return ref(new NumberParser(locale, options))\n}\n\nexport const parseValue = (ctx: MachineContext, value: string) => {\n if (!ctx.formatOptions) return parseFloat(value)\n return ctx.parser.parse(String(value))\n}\n\nexport const formatValue = (ctx: MachineContext, value: number): string => {\n if (Number.isNaN(value)) return \"\"\n if (!ctx.formatOptions) return value.toString()\n return ctx.formatter.format(value)\n}\n"],"mappings":"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","names":["roundToDevicePixel","roundToDevicePixel","isSafari","ctx","isSafari"]}
|
|
1
|
+
{"version":3,"sources":["../src/number-input.anatomy.ts","../src/number-input.connect.ts","../src/number-input.dom.ts","../src/number-input.machine.ts","../src/cursor.ts","../src/number-input.utils.ts"],"sourcesContent":["import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"numberInput\").parts(\n \"root\",\n \"label\",\n \"input\",\n \"control\",\n \"incrementTrigger\",\n \"decrementTrigger\",\n \"scrubber\",\n)\n\nexport const parts = anatomy.build()\n","import { getEventPoint, getEventStep, isLeftClick, type EventKeyMap } from \"@zag-js/dom-event\"\nimport { ariaAttr, dataAttr, isComposingEvent } from \"@zag-js/dom-query\"\nimport { roundToDevicePixel } from \"@zag-js/number-utils\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./number-input.anatomy\"\nimport { dom } from \"./number-input.dom\"\nimport type { MachineApi, Send, State } from \"./number-input.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const focused = state.hasTag(\"focus\")\n const disabled = state.context.isDisabled\n const readOnly = state.context.readOnly\n\n const empty = state.context.isValueEmpty\n const invalid = state.context.isOutOfRange || !!state.context.invalid\n\n const isIncrementDisabled = disabled || !state.context.canIncrement || readOnly\n const isDecrementDisabled = disabled || !state.context.canDecrement || readOnly\n\n const translations = state.context.translations\n\n return {\n focused: focused,\n invalid: invalid,\n empty: empty,\n value: state.context.formattedValue,\n valueAsNumber: state.context.valueAsNumber,\n setValue(value) {\n send({ type: \"VALUE.SET\", value })\n },\n clearValue() {\n send(\"VALUE.CLEAR\")\n },\n increment() {\n send(\"VALUE.INCREMENT\")\n },\n decrement() {\n send(\"VALUE.DECREMENT\")\n },\n setToMax() {\n send({ type: \"VALUE.SET\", value: state.context.max })\n },\n setToMin() {\n send({ type: \"VALUE.SET\", value: state.context.min })\n },\n focus() {\n dom.getInputEl(state.context)?.focus()\n },\n\n rootProps: normalize.element({\n id: dom.getRootId(state.context),\n ...parts.root.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n \"data-focus\": dataAttr(focused),\n \"data-invalid\": dataAttr(invalid),\n }),\n\n labelProps: normalize.label({\n ...parts.label.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n \"data-focus\": dataAttr(focused),\n \"data-invalid\": dataAttr(invalid),\n id: dom.getLabelId(state.context),\n htmlFor: dom.getInputId(state.context),\n }),\n\n controlProps: normalize.element({\n ...parts.control.attrs,\n dir: state.context.dir,\n role: \"group\",\n \"aria-disabled\": disabled,\n \"data-focus\": dataAttr(focused),\n \"data-disabled\": dataAttr(disabled),\n \"data-invalid\": dataAttr(invalid),\n \"aria-invalid\": ariaAttr(state.context.invalid),\n }),\n\n inputProps: normalize.input({\n ...parts.input.attrs,\n dir: state.context.dir,\n name: state.context.name,\n form: state.context.form,\n id: dom.getInputId(state.context),\n role: \"spinbutton\",\n defaultValue: state.context.formattedValue,\n pattern: state.context.pattern,\n inputMode: state.context.inputMode,\n \"aria-invalid\": ariaAttr(invalid),\n \"data-invalid\": dataAttr(invalid),\n disabled: disabled,\n \"data-disabled\": dataAttr(disabled),\n readOnly: !!state.context.readOnly,\n autoComplete: \"off\",\n autoCorrect: \"off\",\n spellCheck: \"false\",\n type: \"text\",\n \"aria-roledescription\": \"numberfield\",\n \"aria-valuemin\": state.context.min,\n \"aria-valuemax\": state.context.max,\n \"aria-valuenow\": Number.isNaN(state.context.valueAsNumber) ? undefined : state.context.valueAsNumber,\n \"aria-valuetext\": state.context.valueText,\n onFocus() {\n send(\"INPUT.FOCUS\")\n },\n onBlur() {\n send({ type: \"INPUT.COMMIT\", src: \"blur\" })\n },\n onChange(event) {\n send({ type: \"INPUT.CHANGE\", target: event.currentTarget, hint: \"set\" })\n },\n onBeforeInput(event) {\n try {\n const { selectionStart, selectionEnd, value } = event.currentTarget\n\n const nextValue = value.slice(0, selectionStart!) + ((event as any).data ?? \"\") + value.slice(selectionEnd!)\n const isValid = state.context.parser.isValidPartialNumber(nextValue)\n\n if (!isValid) {\n event.preventDefault()\n }\n } catch {\n // noop\n }\n },\n onKeyDown(event) {\n if (event.defaultPrevented) return\n if (readOnly) return\n if (isComposingEvent(event)) return\n\n const step = getEventStep(event) * state.context.step\n\n const keyMap: EventKeyMap = {\n ArrowUp() {\n send({ type: \"INPUT.ARROW_UP\", step })\n event.preventDefault()\n },\n ArrowDown() {\n send({ type: \"INPUT.ARROW_DOWN\", step })\n event.preventDefault()\n },\n Home() {\n send(\"INPUT.HOME\")\n event.preventDefault()\n },\n End() {\n send(\"INPUT.END\")\n event.preventDefault()\n },\n Enter() {\n send({ type: \"INPUT.COMMIT\", src: \"enter\" })\n },\n }\n\n const exec = keyMap[event.key]\n exec?.(event)\n },\n }),\n\n decrementTriggerProps: normalize.button({\n ...parts.decrementTrigger.attrs,\n dir: state.context.dir,\n id: dom.getDecrementTriggerId(state.context),\n disabled: isDecrementDisabled,\n \"data-disabled\": dataAttr(isDecrementDisabled),\n \"aria-label\": translations.decrementLabel,\n type: \"button\",\n tabIndex: -1,\n \"aria-controls\": dom.getInputId(state.context),\n onPointerDown(event) {\n if (isDecrementDisabled || !isLeftClick(event)) return\n send({ type: \"TRIGGER.PRESS_DOWN\", hint: \"decrement\", pointerType: event.pointerType })\n if (event.pointerType === \"mouse\") {\n event.preventDefault()\n }\n if (event.pointerType === \"touch\") {\n event.currentTarget?.focus({ preventScroll: true })\n }\n },\n onPointerUp(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"decrement\", pointerType: event.pointerType })\n },\n onPointerLeave() {\n if (isDecrementDisabled) return\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"decrement\" })\n },\n }),\n\n incrementTriggerProps: normalize.button({\n ...parts.incrementTrigger.attrs,\n dir: state.context.dir,\n id: dom.getIncrementTriggerId(state.context),\n disabled: isIncrementDisabled,\n \"data-disabled\": dataAttr(isIncrementDisabled),\n \"aria-label\": translations.incrementLabel,\n type: \"button\",\n tabIndex: -1,\n \"aria-controls\": dom.getInputId(state.context),\n onPointerDown(event) {\n if (isIncrementDisabled || !isLeftClick(event)) return\n send({ type: \"TRIGGER.PRESS_DOWN\", hint: \"increment\", pointerType: event.pointerType })\n if (event.pointerType === \"mouse\") {\n event.preventDefault()\n }\n if (event.pointerType === \"touch\") {\n event.currentTarget?.focus({ preventScroll: true })\n }\n },\n onPointerUp(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"increment\", pointerType: event.pointerType })\n },\n onPointerLeave(event) {\n send({ type: \"TRIGGER.PRESS_UP\", hint: \"increment\", pointerType: event.pointerType })\n },\n }),\n\n scrubberProps: normalize.element({\n ...parts.scrubber.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(disabled),\n id: dom.getScrubberId(state.context),\n role: \"presentation\",\n onMouseDown(event) {\n if (disabled) return\n\n const point = getEventPoint(event)\n\n point.x = point.x - roundToDevicePixel(7.5)\n point.y = point.y - roundToDevicePixel(7.5)\n\n send({ type: \"SCRUBBER.PRESS_DOWN\", point })\n event.preventDefault()\n },\n style: {\n cursor: disabled ? undefined : \"ew-resize\",\n },\n }),\n }\n}\n","import { createScope, isSafari, MAX_Z_INDEX } from \"@zag-js/dom-query\"\nimport { roundToDevicePixel, wrap } from \"@zag-js/number-utils\"\nimport type { MachineContext as Ctx } from \"./number-input.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `number-input:${ctx.id}`,\n getInputId: (ctx: Ctx) => ctx.ids?.input ?? `number-input:${ctx.id}:input`,\n getIncrementTriggerId: (ctx: Ctx) => ctx.ids?.incrementTrigger ?? `number-input:${ctx.id}:inc`,\n getDecrementTriggerId: (ctx: Ctx) => ctx.ids?.decrementTrigger ?? `number-input:${ctx.id}:dec`,\n getScrubberId: (ctx: Ctx) => ctx.ids?.scrubber ?? `number-input:${ctx.id}:scrubber`,\n getCursorId: (ctx: Ctx) => `number-input:${ctx.id}:cursor`,\n getLabelId: (ctx: Ctx) => ctx.ids?.label ?? `number-input:${ctx.id}:label`,\n\n getInputEl: (ctx: Ctx) => dom.getById<HTMLInputElement>(ctx, dom.getInputId(ctx)),\n getIncrementTriggerEl: (ctx: Ctx) => dom.getById<HTMLButtonElement>(ctx, dom.getIncrementTriggerId(ctx)),\n getDecrementTriggerEl: (ctx: Ctx) => dom.getById<HTMLButtonElement>(ctx, dom.getDecrementTriggerId(ctx)),\n getScrubberEl: (ctx: Ctx) => dom.getById(ctx, dom.getScrubberId(ctx)),\n getCursorEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getCursorId(ctx)),\n\n getPressedTriggerEl: (ctx: Ctx, hint = ctx.hint) => {\n let btnEl: HTMLButtonElement | null = null\n if (hint === \"increment\") {\n btnEl = dom.getIncrementTriggerEl(ctx)\n }\n if (hint === \"decrement\") {\n btnEl = dom.getDecrementTriggerEl(ctx)\n }\n return btnEl\n },\n\n setupVirtualCursor(ctx: Ctx) {\n if (isSafari()) return\n dom.createVirtualCursor(ctx)\n return () => {\n dom.getCursorEl(ctx)?.remove()\n }\n },\n\n preventTextSelection(ctx: Ctx) {\n const doc = dom.getDoc(ctx)\n const html = doc.documentElement\n const body = doc.body\n\n body.style.pointerEvents = \"none\"\n html.style.userSelect = \"none\"\n html.style.cursor = \"ew-resize\"\n\n return () => {\n body.style.pointerEvents = \"\"\n html.style.userSelect = \"\"\n html.style.cursor = \"\"\n if (!html.style.length) {\n html.removeAttribute(\"style\")\n }\n if (!body.style.length) {\n body.removeAttribute(\"style\")\n }\n }\n },\n\n getMousementValue(ctx: Ctx, event: MouseEvent) {\n const x = roundToDevicePixel(event.movementX)\n const y = roundToDevicePixel(event.movementY)\n\n let hint = x > 0 ? \"increment\" : x < 0 ? \"decrement\" : null\n\n if (ctx.isRtl && hint === \"increment\") hint = \"decrement\"\n if (ctx.isRtl && hint === \"decrement\") hint = \"increment\"\n\n const point = {\n x: ctx.scrubberCursorPoint!.x + x,\n y: ctx.scrubberCursorPoint!.y + y,\n }\n\n const win = dom.getWin(ctx)\n const width = win.innerWidth\n const half = roundToDevicePixel(7.5)\n point.x = wrap(point.x + half, width) - half\n\n return { hint, point }\n },\n\n createVirtualCursor(ctx: Ctx) {\n const doc = dom.getDoc(ctx)\n const el = doc.createElement(\"div\")\n el.className = \"scrubber--cursor\"\n el.id = dom.getCursorId(ctx)\n\n Object.assign(el.style, {\n width: \"15px\",\n height: \"15px\",\n position: \"fixed\",\n pointerEvents: \"none\",\n left: \"0px\",\n top: \"0px\",\n zIndex: MAX_Z_INDEX,\n transform: ctx.scrubberCursorPoint\n ? `translate3d(${ctx.scrubberCursorPoint.x}px, ${ctx.scrubberCursorPoint.y}px, 0px)`\n : undefined,\n willChange: \"transform\",\n })\n\n el.innerHTML = `\n <svg width=\"46\" height=\"15\" style=\"left: -15.5px; position: absolute; top: 0; filter: drop-shadow(rgba(0, 0, 0, 0.4) 0px 1px 1.1px);\">\n <g transform=\"translate(2 3)\">\n <path fill-rule=\"evenodd\" d=\"M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z\" style=\"stroke-width: 2px; stroke: white;\"></path>\n <path fill-rule=\"evenodd\" d=\"M 15 4.5L 15 2L 11.5 5.5L 15 9L 15 6.5L 31 6.5L 31 9L 34.5 5.5L 31 2L 31 4.5Z\"></path>\n </g>\n </svg>`\n\n doc.body.appendChild(el)\n },\n})\n","import { choose, createMachine, guards } from \"@zag-js/core\"\nimport { addDomEvent, requestPointerLock } from \"@zag-js/dom-event\"\nimport { isSafari, observeAttributes, raf } from \"@zag-js/dom-query\"\nimport { trackFormControl } from \"@zag-js/form-utils\"\nimport { clamp, decrement, increment, isAtMax, isAtMin, isWithinRange } from \"@zag-js/number-utils\"\nimport { callAll, compact, isEqual } from \"@zag-js/utils\"\nimport { recordCursor, restoreCursor } from \"./cursor\"\nimport { dom } from \"./number-input.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./number-input.types\"\nimport { createFormatter, createParser, formatValue, parseValue } from \"./number-input.utils\"\n\nconst { not, and } = guards\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"number-input\",\n initial: \"idle\",\n context: {\n dir: \"ltr\",\n locale: \"en-US\",\n focusInputOnChange: true,\n clampValueOnBlur: true,\n allowOverflow: false,\n inputMode: \"decimal\",\n pattern: \"[0-9]*(.[0-9]+)?\",\n value: \"\",\n step: 1,\n min: Number.MIN_SAFE_INTEGER,\n max: Number.MAX_SAFE_INTEGER,\n invalid: false,\n spinOnPress: true,\n ...ctx,\n hint: null,\n scrubberCursorPoint: null,\n fieldsetDisabled: false,\n formatter: createFormatter(ctx.locale || \"en-US\", ctx.formatOptions),\n parser: createParser(ctx.locale || \"en-US\", ctx.formatOptions),\n translations: {\n incrementLabel: \"increment value\",\n decrementLabel: \"decrease value\",\n ...ctx.translations,\n },\n },\n\n computed: {\n isRtl: (ctx) => ctx.dir === \"rtl\",\n valueAsNumber: (ctx) => parseValue(ctx, ctx.value),\n formattedValue: (ctx) => formatValue(ctx, ctx.valueAsNumber),\n isAtMin: (ctx) => isAtMin(ctx.valueAsNumber, ctx),\n isAtMax: (ctx) => isAtMax(ctx.valueAsNumber, ctx),\n isOutOfRange: (ctx) => !isWithinRange(ctx.valueAsNumber, ctx),\n isValueEmpty: (ctx) => ctx.value === \"\",\n isDisabled: (ctx) => !!ctx.disabled || ctx.fieldsetDisabled,\n canIncrement: (ctx) => ctx.allowOverflow || !ctx.isAtMax,\n canDecrement: (ctx) => ctx.allowOverflow || !ctx.isAtMin,\n valueText: (ctx) => ctx.translations.valueText?.(ctx.value),\n },\n\n watch: {\n formatOptions: [\"setFormatterAndParser\", \"syncInputElement\"],\n locale: [\"setFormatterAndParser\", \"syncInputElement\"],\n value: [\"syncInputElement\"],\n isOutOfRange: [\"invokeOnInvalid\"],\n scrubberCursorPoint: [\"setVirtualCursorPosition\"],\n },\n\n activities: [\"trackFormControl\"],\n\n on: {\n \"VALUE.SET\": {\n actions: [\"setRawValue\", \"setHintToSet\"],\n },\n \"VALUE.CLEAR\": {\n actions: [\"clearValue\"],\n },\n \"VALUE.INCREMENT\": {\n actions: [\"increment\"],\n },\n \"VALUE.DECREMENT\": {\n actions: [\"decrement\"],\n },\n },\n\n states: {\n idle: {\n on: {\n \"TRIGGER.PRESS_DOWN\": [\n { guard: \"isTouchPointer\", target: \"before:spin\", actions: [\"setHint\"] },\n {\n target: \"before:spin\",\n actions: [\"focusInput\", \"invokeOnFocus\", \"setHint\"],\n },\n ],\n \"SCRUBBER.PRESS_DOWN\": {\n target: \"scrubbing\",\n actions: [\"focusInput\", \"invokeOnFocus\", \"setHint\", \"setCursorPoint\"],\n },\n \"INPUT.FOCUS\": {\n target: \"focused\",\n actions: [\"focusInput\", \"invokeOnFocus\"],\n },\n },\n },\n\n focused: {\n tags: \"focus\",\n activities: \"attachWheelListener\",\n on: {\n \"TRIGGER.PRESS_DOWN\": [\n { guard: \"isTouchPointer\", target: \"before:spin\", actions: [\"setHint\"] },\n { target: \"before:spin\", actions: [\"focusInput\", \"setHint\"] },\n ],\n \"SCRUBBER.PRESS_DOWN\": {\n target: \"scrubbing\",\n actions: [\"focusInput\", \"setHint\", \"setCursorPoint\"],\n },\n \"INPUT.ARROW_UP\": {\n actions: \"increment\",\n },\n \"INPUT.ARROW_DOWN\": {\n actions: \"decrement\",\n },\n \"INPUT.HOME\": {\n actions: \"decrementToMin\",\n },\n \"INPUT.END\": {\n actions: \"incrementToMax\",\n },\n \"INPUT.CHANGE\": {\n actions: [\"setValue\", \"setHint\"],\n },\n \"INPUT.COMMIT\": [\n {\n guard: and(\"clampValueOnBlur\", not(\"isInRange\")),\n target: \"idle\",\n actions: [\"setClampedValue\", \"clearHint\", \"invokeOnBlur\"],\n },\n {\n target: \"idle\",\n actions: [\"setFormattedValue\", \"clearHint\", \"invokeOnBlur\"],\n },\n ],\n },\n },\n\n \"before:spin\": {\n tags: \"focus\",\n activities: \"trackButtonDisabled\",\n entry: choose([\n { guard: \"isIncrementHint\", actions: \"increment\" },\n { guard: \"isDecrementHint\", actions: \"decrement\" },\n ]),\n after: {\n CHANGE_DELAY: {\n target: \"spinning\",\n guard: and(\"isInRange\", \"spinOnPress\"),\n },\n },\n on: {\n \"TRIGGER.PRESS_UP\": [\n { guard: \"isTouchPointer\", target: \"focused\", actions: \"clearHint\" },\n { target: \"focused\", actions: [\"focusInput\", \"clearHint\"] },\n ],\n },\n },\n\n spinning: {\n tags: \"focus\",\n activities: \"trackButtonDisabled\",\n every: [\n {\n delay: \"CHANGE_INTERVAL\",\n guard: and(not(\"isAtMin\"), \"isIncrementHint\"),\n actions: \"increment\",\n },\n {\n delay: \"CHANGE_INTERVAL\",\n guard: and(not(\"isAtMax\"), \"isDecrementHint\"),\n actions: \"decrement\",\n },\n ],\n on: {\n \"TRIGGER.PRESS_UP\": {\n target: \"focused\",\n actions: [\"focusInput\", \"clearHint\"],\n },\n },\n },\n\n scrubbing: {\n tags: \"focus\",\n activities: [\"activatePointerLock\", \"trackMousemove\", \"setupVirtualCursor\", \"preventTextSelection\"],\n on: {\n \"SCRUBBER.POINTER_UP\": {\n target: \"focused\",\n actions: [\"focusInput\", \"clearCursorPoint\"],\n },\n \"SCRUBBER.POINTER_MOVE\": [\n {\n guard: \"isIncrementHint\",\n actions: [\"increment\", \"setCursorPoint\"],\n },\n {\n guard: \"isDecrementHint\",\n actions: [\"decrement\", \"setCursorPoint\"],\n },\n ],\n },\n },\n },\n },\n {\n delays: {\n CHANGE_INTERVAL: 50,\n CHANGE_DELAY: 300,\n },\n\n guards: {\n clampValueOnBlur: (ctx) => ctx.clampValueOnBlur,\n isAtMin: (ctx) => ctx.isAtMin,\n spinOnPress: (ctx) => !!ctx.spinOnPress,\n isAtMax: (ctx) => ctx.isAtMax,\n isInRange: (ctx) => !ctx.isOutOfRange,\n isDecrementHint: (ctx, evt) => (evt.hint ?? ctx.hint) === \"decrement\",\n isIncrementHint: (ctx, evt) => (evt.hint ?? ctx.hint) === \"increment\",\n isTouchPointer: (_ctx, evt) => evt.pointerType === \"touch\",\n },\n\n activities: {\n trackFormControl(ctx, _evt, { initialContext }) {\n const inputEl = dom.getInputEl(ctx)\n return trackFormControl(inputEl, {\n onFieldsetDisabledChange(disabled) {\n ctx.fieldsetDisabled = disabled\n },\n onFormReset() {\n set.value(ctx, initialContext.value)\n },\n })\n },\n setupVirtualCursor(ctx) {\n return dom.setupVirtualCursor(ctx)\n },\n preventTextSelection(ctx) {\n return dom.preventTextSelection(ctx)\n },\n trackButtonDisabled(ctx, _evt, { send }) {\n const btn = dom.getPressedTriggerEl(ctx, ctx.hint)\n return observeAttributes(btn, {\n attributes: [\"disabled\"],\n callback() {\n send({ type: \"TRIGGER.PRESS_UP\", src: \"attr\" })\n },\n })\n },\n attachWheelListener(ctx, _evt, { send }) {\n const inputEl = dom.getInputEl(ctx)\n if (!inputEl || !dom.isActiveElement(ctx, inputEl) || !ctx.allowMouseWheel) return\n\n function onWheel(event: WheelEvent) {\n event.preventDefault()\n const dir = Math.sign(event.deltaY) * -1\n if (dir === 1) {\n send(\"VALUE.INCREMENT\")\n } else if (dir === -1) {\n send(\"VALUE.DECREMENT\")\n }\n }\n\n return addDomEvent(inputEl, \"wheel\", onWheel, { passive: false })\n },\n activatePointerLock(ctx) {\n if (isSafari()) return\n return requestPointerLock(dom.getDoc(ctx))\n },\n trackMousemove(ctx, _evt, { send }) {\n const doc = dom.getDoc(ctx)\n\n function onMousemove(event: MouseEvent) {\n if (!ctx.scrubberCursorPoint) return\n const value = dom.getMousementValue(ctx, event)\n if (!value.hint) return\n send({\n type: \"SCRUBBER.POINTER_MOVE\",\n hint: value.hint,\n point: value.point,\n })\n }\n\n function onMouseup() {\n send(\"SCRUBBER.POINTER_UP\")\n }\n\n return callAll(\n addDomEvent(doc, \"mousemove\", onMousemove, false),\n addDomEvent(doc, \"mouseup\", onMouseup, false),\n )\n },\n },\n\n actions: {\n focusInput(ctx) {\n if (!ctx.focusInputOnChange) return\n const inputEl = dom.getInputEl(ctx)\n if (dom.isActiveElement(ctx, inputEl)) return\n raf(() => inputEl?.focus({ preventScroll: true }))\n },\n increment(ctx, evt) {\n const nextValue = increment(ctx.valueAsNumber, evt.step ?? ctx.step)\n const value = formatValue(ctx, clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n decrement(ctx, evt) {\n const nextValue = decrement(ctx.valueAsNumber, evt.step ?? ctx.step)\n const value = formatValue(ctx, clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n setClampedValue(ctx) {\n const nextValue = clamp(ctx.valueAsNumber, ctx)\n set.value(ctx, formatValue(ctx, nextValue))\n },\n setRawValue(ctx, evt) {\n const parsedValue = parseValue(ctx, evt.value)\n const value = formatValue(ctx, clamp(parsedValue, ctx))\n set.value(ctx, value)\n },\n setValue(ctx, evt) {\n const value = evt.target?.value ?? evt.value\n set.value(ctx, value)\n },\n clearValue(ctx) {\n set.value(ctx, \"\")\n },\n incrementToMax(ctx) {\n const value = formatValue(ctx, ctx.max)\n set.value(ctx, value)\n },\n decrementToMin(ctx) {\n const value = formatValue(ctx, ctx.min)\n set.value(ctx, value)\n },\n setHint(ctx, evt) {\n ctx.hint = evt.hint\n },\n clearHint(ctx) {\n ctx.hint = null\n },\n setHintToSet(ctx) {\n ctx.hint = \"set\"\n },\n invokeOnFocus(ctx) {\n ctx.onFocusChange?.({\n focused: true,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n invokeOnBlur(ctx) {\n ctx.onFocusChange?.({\n focused: false,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n invokeOnInvalid(ctx) {\n if (!ctx.isOutOfRange) return\n const reason = ctx.valueAsNumber > ctx.max ? \"rangeOverflow\" : \"rangeUnderflow\"\n ctx.onValueInvalid?.({\n reason,\n value: ctx.formattedValue,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n syncInputElement(ctx, evt) {\n const value = evt.type.endsWith(\"CHANGE\") ? ctx.value : ctx.formattedValue\n sync.input(ctx, value)\n },\n setFormattedValue(ctx) {\n set.value(ctx, ctx.formattedValue)\n },\n setCursorPoint(ctx, evt) {\n ctx.scrubberCursorPoint = evt.point\n },\n clearCursorPoint(ctx) {\n ctx.scrubberCursorPoint = null\n },\n setVirtualCursorPosition(ctx) {\n const cursorEl = dom.getCursorEl(ctx)\n if (!cursorEl || !ctx.scrubberCursorPoint) return\n const { x, y } = ctx.scrubberCursorPoint\n cursorEl.style.transform = `translate3d(${x}px, ${y}px, 0px)`\n },\n setFormatterAndParser(ctx) {\n if (!ctx.locale) return\n ctx.formatter = createFormatter(ctx.locale, ctx.formatOptions)\n ctx.parser = createParser(ctx.locale, ctx.formatOptions)\n },\n },\n compareFns: {\n formatOptions: (a, b) => isEqual(a, b),\n scrubberCursorPoint: (a, b) => isEqual(a, b),\n },\n },\n )\n}\n\nconst sync = {\n input(ctx: MachineContext, value: string) {\n const inputEl = dom.getInputEl(ctx)\n if (!inputEl) return\n\n // record cursor position before updating input value\n const sel = recordCursor(inputEl)\n\n // restore cursor position after updating input value\n raf(() => {\n dom.setValue(inputEl, value)\n restoreCursor(inputEl, sel)\n })\n },\n}\n\nconst invoke = {\n onChange: (ctx: MachineContext) => {\n ctx.onValueChange?.({\n value: ctx.value,\n valueAsNumber: ctx.valueAsNumber,\n })\n },\n}\n\nconst set = {\n value: (ctx: MachineContext, value: string) => {\n if (isEqual(ctx.value, value)) return\n ctx.value = value\n invoke.onChange(ctx)\n },\n}\n","/**\n * Credits: https://github.com/react-component/input-number/blob/master/src/hooks/useCursor.ts\n */\n\ninterface Selection {\n start?: number\n end?: number\n value?: string\n beforeTxt?: string\n afterTxt?: string\n}\n\nexport function recordCursor(inputEl: HTMLInputElement): Selection | undefined {\n if (inputEl.ownerDocument.activeElement !== inputEl) return\n try {\n const { selectionStart: start, selectionEnd: end, value } = inputEl\n const beforeTxt = value.substring(0, start!)\n const afterTxt = value.substring(end!)\n return {\n start: start!,\n end: end!,\n value,\n beforeTxt,\n afterTxt,\n }\n } catch {}\n}\n\nexport function restoreCursor(inputEl: HTMLInputElement, selection: Selection | undefined) {\n if (inputEl.ownerDocument.activeElement !== inputEl) return\n\n if (!selection) {\n inputEl.setSelectionRange(inputEl.value.length, inputEl.value.length)\n return\n }\n\n try {\n const { value } = inputEl\n const { beforeTxt = \"\", afterTxt = \"\", start } = selection\n\n let startPos = value.length\n\n if (value.endsWith(afterTxt)) {\n startPos = value.length - afterTxt.length\n } else if (value.startsWith(beforeTxt)) {\n startPos = beforeTxt.length\n } else if (start != null) {\n const beforeLastChar = beforeTxt[start - 1]\n const newIndex = value.indexOf(beforeLastChar, start - 1)\n if (newIndex !== -1) {\n startPos = newIndex + 1\n }\n }\n\n inputEl.setSelectionRange(startPos, startPos)\n } catch {}\n}\n","import { NumberParser } from \"@internationalized/number\"\nimport { ref } from \"@zag-js/core\"\nimport type { MachineContext } from \"./number-input.types\"\n\nexport const createFormatter = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n return ref(new Intl.NumberFormat(locale, options))\n}\n\nexport const createParser = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n return ref(new NumberParser(locale, options))\n}\n\nexport const parseValue = (ctx: MachineContext, value: string) => {\n if (!ctx.formatOptions) return parseFloat(value)\n return ctx.parser.parse(String(value))\n}\n\nexport const formatValue = (ctx: MachineContext, value: number): string => {\n if (Number.isNaN(value)) return \"\"\n if (!ctx.formatOptions) return value.toString()\n return ctx.formatter.format(value)\n}\n"],"mappings":"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","names":["roundToDevicePixel","roundToDevicePixel","isSafari","ctx","isSafari"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zag-js/number-input",
|
|
3
|
-
"version": "0.51.
|
|
3
|
+
"version": "0.51.2",
|
|
4
4
|
"description": "Core logic for the number-input widget implemented as a state machine",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"js",
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
"url": "https://github.com/chakra-ui/zag/issues"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@internationalized/number": "3.5.
|
|
31
|
-
"@zag-js/anatomy": "0.51.
|
|
32
|
-
"@zag-js/core": "0.51.
|
|
33
|
-
"@zag-js/dom-event": "0.51.
|
|
34
|
-
"@zag-js/dom-query": "0.51.
|
|
35
|
-
"@zag-js/form-utils": "0.51.
|
|
36
|
-
"@zag-js/number-utils": "0.51.
|
|
37
|
-
"@zag-js/types": "0.51.
|
|
38
|
-
"@zag-js/utils": "0.51.
|
|
30
|
+
"@internationalized/number": "3.5.3",
|
|
31
|
+
"@zag-js/anatomy": "0.51.2",
|
|
32
|
+
"@zag-js/core": "0.51.2",
|
|
33
|
+
"@zag-js/dom-event": "0.51.2",
|
|
34
|
+
"@zag-js/dom-query": "0.51.2",
|
|
35
|
+
"@zag-js/form-utils": "0.51.2",
|
|
36
|
+
"@zag-js/number-utils": "0.51.2",
|
|
37
|
+
"@zag-js/types": "0.51.2",
|
|
38
|
+
"@zag-js/utils": "0.51.2"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"clean-package": "2.2.0"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getEventPoint, getEventStep,
|
|
2
|
-
import { ariaAttr, dataAttr } from "@zag-js/dom-query"
|
|
1
|
+
import { getEventPoint, getEventStep, isLeftClick, type EventKeyMap } from "@zag-js/dom-event"
|
|
2
|
+
import { ariaAttr, dataAttr, isComposingEvent } from "@zag-js/dom-query"
|
|
3
3
|
import { roundToDevicePixel } from "@zag-js/number-utils"
|
|
4
4
|
import type { NormalizeProps, PropTypes } from "@zag-js/types"
|
|
5
5
|
import { parts } from "./number-input.anatomy"
|
|
@@ -127,8 +127,7 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
127
127
|
onKeyDown(event) {
|
|
128
128
|
if (event.defaultPrevented) return
|
|
129
129
|
if (readOnly) return
|
|
130
|
-
|
|
131
|
-
if (evt.isComposing) return
|
|
130
|
+
if (isComposingEvent(event)) return
|
|
132
131
|
|
|
133
132
|
const step = getEventStep(event) * state.context.step
|
|
134
133
|
|
|
@@ -225,8 +224,7 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
225
224
|
onMouseDown(event) {
|
|
226
225
|
if (disabled) return
|
|
227
226
|
|
|
228
|
-
const
|
|
229
|
-
const point = getEventPoint(evt)
|
|
227
|
+
const point = getEventPoint(event)
|
|
230
228
|
|
|
231
229
|
point.x = point.x - roundToDevicePixel(7.5)
|
|
232
230
|
point.y = point.y - roundToDevicePixel(7.5)
|