@zag-js/number-input 0.53.0 → 0.55.0

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.mjs CHANGED
@@ -1,8 +1,848 @@
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=`
1
+ // src/number-input.anatomy.ts
2
+ import { createAnatomy } from "@zag-js/anatomy";
3
+ var anatomy = createAnatomy("numberInput").parts(
4
+ "root",
5
+ "label",
6
+ "input",
7
+ "control",
8
+ "incrementTrigger",
9
+ "decrementTrigger",
10
+ "scrubber"
11
+ );
12
+ var parts = anatomy.build();
13
+
14
+ // src/number-input.connect.ts
15
+ import { getEventPoint, getEventStep, isLeftClick } from "@zag-js/dom-event";
16
+ import { ariaAttr, dataAttr, isComposingEvent } from "@zag-js/dom-query";
17
+ import { roundToDevicePixel as roundToDevicePixel2 } from "@zag-js/number-utils";
18
+
19
+ // src/number-input.dom.ts
20
+ import { createScope, isSafari, MAX_Z_INDEX } from "@zag-js/dom-query";
21
+ import { roundToDevicePixel, wrap } from "@zag-js/number-utils";
22
+ var dom = createScope({
23
+ getRootId: (ctx) => ctx.ids?.root ?? `number-input:${ctx.id}`,
24
+ getInputId: (ctx) => ctx.ids?.input ?? `number-input:${ctx.id}:input`,
25
+ getIncrementTriggerId: (ctx) => ctx.ids?.incrementTrigger ?? `number-input:${ctx.id}:inc`,
26
+ getDecrementTriggerId: (ctx) => ctx.ids?.decrementTrigger ?? `number-input:${ctx.id}:dec`,
27
+ getScrubberId: (ctx) => ctx.ids?.scrubber ?? `number-input:${ctx.id}:scrubber`,
28
+ getCursorId: (ctx) => `number-input:${ctx.id}:cursor`,
29
+ getLabelId: (ctx) => ctx.ids?.label ?? `number-input:${ctx.id}:label`,
30
+ getInputEl: (ctx) => dom.getById(ctx, dom.getInputId(ctx)),
31
+ getIncrementTriggerEl: (ctx) => dom.getById(ctx, dom.getIncrementTriggerId(ctx)),
32
+ getDecrementTriggerEl: (ctx) => dom.getById(ctx, dom.getDecrementTriggerId(ctx)),
33
+ getScrubberEl: (ctx) => dom.getById(ctx, dom.getScrubberId(ctx)),
34
+ getCursorEl: (ctx) => dom.getDoc(ctx).getElementById(dom.getCursorId(ctx)),
35
+ getPressedTriggerEl: (ctx, hint = ctx.hint) => {
36
+ let btnEl = null;
37
+ if (hint === "increment") {
38
+ btnEl = dom.getIncrementTriggerEl(ctx);
39
+ }
40
+ if (hint === "decrement") {
41
+ btnEl = dom.getDecrementTriggerEl(ctx);
42
+ }
43
+ return btnEl;
44
+ },
45
+ setupVirtualCursor(ctx) {
46
+ if (isSafari())
47
+ return;
48
+ dom.createVirtualCursor(ctx);
49
+ return () => {
50
+ dom.getCursorEl(ctx)?.remove();
51
+ };
52
+ },
53
+ preventTextSelection(ctx) {
54
+ const doc = dom.getDoc(ctx);
55
+ const html = doc.documentElement;
56
+ const body = doc.body;
57
+ body.style.pointerEvents = "none";
58
+ html.style.userSelect = "none";
59
+ html.style.cursor = "ew-resize";
60
+ return () => {
61
+ body.style.pointerEvents = "";
62
+ html.style.userSelect = "";
63
+ html.style.cursor = "";
64
+ if (!html.style.length) {
65
+ html.removeAttribute("style");
66
+ }
67
+ if (!body.style.length) {
68
+ body.removeAttribute("style");
69
+ }
70
+ };
71
+ },
72
+ getMousementValue(ctx, event) {
73
+ const x = roundToDevicePixel(event.movementX);
74
+ const y = roundToDevicePixel(event.movementY);
75
+ let hint = x > 0 ? "increment" : x < 0 ? "decrement" : null;
76
+ if (ctx.isRtl && hint === "increment")
77
+ hint = "decrement";
78
+ if (ctx.isRtl && hint === "decrement")
79
+ hint = "increment";
80
+ const point = {
81
+ x: ctx.scrubberCursorPoint.x + x,
82
+ y: ctx.scrubberCursorPoint.y + y
83
+ };
84
+ const win = dom.getWin(ctx);
85
+ const width = win.innerWidth;
86
+ const half = roundToDevicePixel(7.5);
87
+ point.x = wrap(point.x + half, width) - half;
88
+ return { hint, point };
89
+ },
90
+ createVirtualCursor(ctx) {
91
+ const doc = dom.getDoc(ctx);
92
+ const el = doc.createElement("div");
93
+ el.className = "scrubber--cursor";
94
+ el.id = dom.getCursorId(ctx);
95
+ Object.assign(el.style, {
96
+ width: "15px",
97
+ height: "15px",
98
+ position: "fixed",
99
+ pointerEvents: "none",
100
+ left: "0px",
101
+ top: "0px",
102
+ zIndex: MAX_Z_INDEX,
103
+ transform: ctx.scrubberCursorPoint ? `translate3d(${ctx.scrubberCursorPoint.x}px, ${ctx.scrubberCursorPoint.y}px, 0px)` : void 0,
104
+ willChange: "transform"
105
+ });
106
+ el.innerHTML = `
2
107
  <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
108
  <g transform="translate(2 3)">
4
109
  <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
110
  <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
111
  </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;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};
112
+ </svg>`;
113
+ doc.body.appendChild(el);
114
+ }
115
+ });
116
+
117
+ // src/number-input.connect.ts
118
+ function connect(state, send, normalize) {
119
+ const focused = state.hasTag("focus");
120
+ const disabled = state.context.isDisabled;
121
+ const readOnly = state.context.readOnly;
122
+ const empty = state.context.isValueEmpty;
123
+ const invalid = state.context.isOutOfRange || !!state.context.invalid;
124
+ const isIncrementDisabled = disabled || !state.context.canIncrement || readOnly;
125
+ const isDecrementDisabled = disabled || !state.context.canDecrement || readOnly;
126
+ const translations = state.context.translations;
127
+ return {
128
+ focused,
129
+ invalid,
130
+ empty,
131
+ value: state.context.formattedValue,
132
+ valueAsNumber: state.context.valueAsNumber,
133
+ setValue(value) {
134
+ send({ type: "VALUE.SET", value });
135
+ },
136
+ clearValue() {
137
+ send("VALUE.CLEAR");
138
+ },
139
+ increment() {
140
+ send("VALUE.INCREMENT");
141
+ },
142
+ decrement() {
143
+ send("VALUE.DECREMENT");
144
+ },
145
+ setToMax() {
146
+ send({ type: "VALUE.SET", value: state.context.max });
147
+ },
148
+ setToMin() {
149
+ send({ type: "VALUE.SET", value: state.context.min });
150
+ },
151
+ focus() {
152
+ dom.getInputEl(state.context)?.focus();
153
+ },
154
+ getRootProps() {
155
+ return normalize.element({
156
+ id: dom.getRootId(state.context),
157
+ ...parts.root.attrs,
158
+ dir: state.context.dir,
159
+ "data-disabled": dataAttr(disabled),
160
+ "data-focus": dataAttr(focused),
161
+ "data-invalid": dataAttr(invalid)
162
+ });
163
+ },
164
+ getLabelProps() {
165
+ return normalize.label({
166
+ ...parts.label.attrs,
167
+ dir: state.context.dir,
168
+ "data-disabled": dataAttr(disabled),
169
+ "data-focus": dataAttr(focused),
170
+ "data-invalid": dataAttr(invalid),
171
+ id: dom.getLabelId(state.context),
172
+ htmlFor: dom.getInputId(state.context)
173
+ });
174
+ },
175
+ getControlProps() {
176
+ return normalize.element({
177
+ ...parts.control.attrs,
178
+ dir: state.context.dir,
179
+ role: "group",
180
+ "aria-disabled": disabled,
181
+ "data-focus": dataAttr(focused),
182
+ "data-disabled": dataAttr(disabled),
183
+ "data-invalid": dataAttr(invalid),
184
+ "aria-invalid": ariaAttr(state.context.invalid)
185
+ });
186
+ },
187
+ getInputProps() {
188
+ return normalize.input({
189
+ ...parts.input.attrs,
190
+ dir: state.context.dir,
191
+ name: state.context.name,
192
+ form: state.context.form,
193
+ id: dom.getInputId(state.context),
194
+ role: "spinbutton",
195
+ defaultValue: state.context.formattedValue,
196
+ pattern: state.context.pattern,
197
+ inputMode: state.context.inputMode,
198
+ "aria-invalid": ariaAttr(invalid),
199
+ "data-invalid": dataAttr(invalid),
200
+ disabled,
201
+ "data-disabled": dataAttr(disabled),
202
+ readOnly: !!state.context.readOnly,
203
+ autoComplete: "off",
204
+ autoCorrect: "off",
205
+ spellCheck: "false",
206
+ type: "text",
207
+ "aria-roledescription": "numberfield",
208
+ "aria-valuemin": state.context.min,
209
+ "aria-valuemax": state.context.max,
210
+ "aria-valuenow": Number.isNaN(state.context.valueAsNumber) ? void 0 : state.context.valueAsNumber,
211
+ "aria-valuetext": state.context.valueText,
212
+ onFocus() {
213
+ send("INPUT.FOCUS");
214
+ },
215
+ onBlur() {
216
+ send({ type: "INPUT.COMMIT", src: "blur" });
217
+ },
218
+ onChange(event) {
219
+ send({ type: "INPUT.CHANGE", target: event.currentTarget, hint: "set" });
220
+ },
221
+ onBeforeInput(event) {
222
+ try {
223
+ const { selectionStart, selectionEnd, value } = event.currentTarget;
224
+ const nextValue = value.slice(0, selectionStart) + (event.data ?? "") + value.slice(selectionEnd);
225
+ const isValid = state.context.parser.isValidPartialNumber(nextValue);
226
+ if (!isValid) {
227
+ event.preventDefault();
228
+ }
229
+ } catch {
230
+ }
231
+ },
232
+ onKeyDown(event) {
233
+ if (event.defaultPrevented)
234
+ return;
235
+ if (readOnly)
236
+ return;
237
+ if (isComposingEvent(event))
238
+ return;
239
+ const step = getEventStep(event) * state.context.step;
240
+ const keyMap = {
241
+ ArrowUp() {
242
+ send({ type: "INPUT.ARROW_UP", step });
243
+ event.preventDefault();
244
+ },
245
+ ArrowDown() {
246
+ send({ type: "INPUT.ARROW_DOWN", step });
247
+ event.preventDefault();
248
+ },
249
+ Home() {
250
+ send("INPUT.HOME");
251
+ event.preventDefault();
252
+ },
253
+ End() {
254
+ send("INPUT.END");
255
+ event.preventDefault();
256
+ },
257
+ Enter() {
258
+ send({ type: "INPUT.COMMIT", src: "enter" });
259
+ }
260
+ };
261
+ const exec = keyMap[event.key];
262
+ exec?.(event);
263
+ }
264
+ });
265
+ },
266
+ getDecrementTriggerProps() {
267
+ return normalize.button({
268
+ ...parts.decrementTrigger.attrs,
269
+ dir: state.context.dir,
270
+ id: dom.getDecrementTriggerId(state.context),
271
+ disabled: isDecrementDisabled,
272
+ "data-disabled": dataAttr(isDecrementDisabled),
273
+ "aria-label": translations.decrementLabel,
274
+ type: "button",
275
+ tabIndex: -1,
276
+ "aria-controls": dom.getInputId(state.context),
277
+ onPointerDown(event) {
278
+ if (isDecrementDisabled || !isLeftClick(event))
279
+ return;
280
+ send({ type: "TRIGGER.PRESS_DOWN", hint: "decrement", pointerType: event.pointerType });
281
+ if (event.pointerType === "mouse") {
282
+ event.preventDefault();
283
+ }
284
+ if (event.pointerType === "touch") {
285
+ event.currentTarget?.focus({ preventScroll: true });
286
+ }
287
+ },
288
+ onPointerUp(event) {
289
+ send({ type: "TRIGGER.PRESS_UP", hint: "decrement", pointerType: event.pointerType });
290
+ },
291
+ onPointerLeave() {
292
+ if (isDecrementDisabled)
293
+ return;
294
+ send({ type: "TRIGGER.PRESS_UP", hint: "decrement" });
295
+ }
296
+ });
297
+ },
298
+ getIncrementTriggerProps() {
299
+ return normalize.button({
300
+ ...parts.incrementTrigger.attrs,
301
+ dir: state.context.dir,
302
+ id: dom.getIncrementTriggerId(state.context),
303
+ disabled: isIncrementDisabled,
304
+ "data-disabled": dataAttr(isIncrementDisabled),
305
+ "aria-label": translations.incrementLabel,
306
+ type: "button",
307
+ tabIndex: -1,
308
+ "aria-controls": dom.getInputId(state.context),
309
+ onPointerDown(event) {
310
+ if (isIncrementDisabled || !isLeftClick(event))
311
+ return;
312
+ send({ type: "TRIGGER.PRESS_DOWN", hint: "increment", pointerType: event.pointerType });
313
+ if (event.pointerType === "mouse") {
314
+ event.preventDefault();
315
+ }
316
+ if (event.pointerType === "touch") {
317
+ event.currentTarget?.focus({ preventScroll: true });
318
+ }
319
+ },
320
+ onPointerUp(event) {
321
+ send({ type: "TRIGGER.PRESS_UP", hint: "increment", pointerType: event.pointerType });
322
+ },
323
+ onPointerLeave(event) {
324
+ send({ type: "TRIGGER.PRESS_UP", hint: "increment", pointerType: event.pointerType });
325
+ }
326
+ });
327
+ },
328
+ getScrubberProps() {
329
+ return normalize.element({
330
+ ...parts.scrubber.attrs,
331
+ dir: state.context.dir,
332
+ "data-disabled": dataAttr(disabled),
333
+ id: dom.getScrubberId(state.context),
334
+ role: "presentation",
335
+ onMouseDown(event) {
336
+ if (disabled)
337
+ return;
338
+ const point = getEventPoint(event);
339
+ point.x = point.x - roundToDevicePixel2(7.5);
340
+ point.y = point.y - roundToDevicePixel2(7.5);
341
+ send({ type: "SCRUBBER.PRESS_DOWN", point });
342
+ event.preventDefault();
343
+ },
344
+ style: {
345
+ cursor: disabled ? void 0 : "ew-resize"
346
+ }
347
+ });
348
+ }
349
+ };
350
+ }
351
+
352
+ // src/number-input.machine.ts
353
+ import { choose, createMachine, guards } from "@zag-js/core";
354
+ import { addDomEvent, requestPointerLock } from "@zag-js/dom-event";
355
+ import { isSafari as isSafari2, observeAttributes, raf } from "@zag-js/dom-query";
356
+ import { trackFormControl } from "@zag-js/form-utils";
357
+ import { clamp, decrement, increment, isAtMax, isAtMin, isWithinRange } from "@zag-js/number-utils";
358
+ import { callAll, compact, isEqual } from "@zag-js/utils";
359
+
360
+ // src/cursor.ts
361
+ function recordCursor(inputEl) {
362
+ if (inputEl.ownerDocument.activeElement !== inputEl)
363
+ return;
364
+ try {
365
+ const { selectionStart: start, selectionEnd: end, value } = inputEl;
366
+ const beforeTxt = value.substring(0, start);
367
+ const afterTxt = value.substring(end);
368
+ return {
369
+ start,
370
+ end,
371
+ value,
372
+ beforeTxt,
373
+ afterTxt
374
+ };
375
+ } catch {
376
+ }
377
+ }
378
+ function restoreCursor(inputEl, selection) {
379
+ if (inputEl.ownerDocument.activeElement !== inputEl)
380
+ return;
381
+ if (!selection) {
382
+ inputEl.setSelectionRange(inputEl.value.length, inputEl.value.length);
383
+ return;
384
+ }
385
+ try {
386
+ const { value } = inputEl;
387
+ const { beforeTxt = "", afterTxt = "", start } = selection;
388
+ let startPos = value.length;
389
+ if (value.endsWith(afterTxt)) {
390
+ startPos = value.length - afterTxt.length;
391
+ } else if (value.startsWith(beforeTxt)) {
392
+ startPos = beforeTxt.length;
393
+ } else if (start != null) {
394
+ const beforeLastChar = beforeTxt[start - 1];
395
+ const newIndex = value.indexOf(beforeLastChar, start - 1);
396
+ if (newIndex !== -1) {
397
+ startPos = newIndex + 1;
398
+ }
399
+ }
400
+ inputEl.setSelectionRange(startPos, startPos);
401
+ } catch {
402
+ }
403
+ }
404
+
405
+ // src/number-input.utils.ts
406
+ import { NumberParser } from "@internationalized/number";
407
+ import { ref } from "@zag-js/core";
408
+ var createFormatter = (locale, options = {}) => {
409
+ return ref(new Intl.NumberFormat(locale, options));
410
+ };
411
+ var createParser = (locale, options = {}) => {
412
+ return ref(new NumberParser(locale, options));
413
+ };
414
+ var parseValue = (ctx, value) => {
415
+ if (!ctx.formatOptions)
416
+ return parseFloat(value);
417
+ return ctx.parser.parse(String(value));
418
+ };
419
+ var formatValue = (ctx, value) => {
420
+ if (Number.isNaN(value))
421
+ return "";
422
+ if (!ctx.formatOptions)
423
+ return value.toString();
424
+ return ctx.formatter.format(value);
425
+ };
426
+
427
+ // src/number-input.machine.ts
428
+ var { not, and } = guards;
429
+ function machine(userContext) {
430
+ const ctx = compact(userContext);
431
+ return createMachine(
432
+ {
433
+ id: "number-input",
434
+ initial: "idle",
435
+ context: {
436
+ dir: "ltr",
437
+ locale: "en-US",
438
+ focusInputOnChange: true,
439
+ clampValueOnBlur: true,
440
+ allowOverflow: false,
441
+ inputMode: "decimal",
442
+ pattern: "[0-9]*(.[0-9]+)?",
443
+ value: "",
444
+ step: 1,
445
+ min: Number.MIN_SAFE_INTEGER,
446
+ max: Number.MAX_SAFE_INTEGER,
447
+ invalid: false,
448
+ spinOnPress: true,
449
+ ...ctx,
450
+ hint: null,
451
+ scrubberCursorPoint: null,
452
+ fieldsetDisabled: false,
453
+ formatter: createFormatter(ctx.locale || "en-US", ctx.formatOptions),
454
+ parser: createParser(ctx.locale || "en-US", ctx.formatOptions),
455
+ translations: {
456
+ incrementLabel: "increment value",
457
+ decrementLabel: "decrease value",
458
+ ...ctx.translations
459
+ }
460
+ },
461
+ computed: {
462
+ isRtl: (ctx2) => ctx2.dir === "rtl",
463
+ valueAsNumber: (ctx2) => parseValue(ctx2, ctx2.value),
464
+ formattedValue: (ctx2) => formatValue(ctx2, ctx2.valueAsNumber),
465
+ isAtMin: (ctx2) => isAtMin(ctx2.valueAsNumber, ctx2),
466
+ isAtMax: (ctx2) => isAtMax(ctx2.valueAsNumber, ctx2),
467
+ isOutOfRange: (ctx2) => !isWithinRange(ctx2.valueAsNumber, ctx2),
468
+ isValueEmpty: (ctx2) => ctx2.value === "",
469
+ isDisabled: (ctx2) => !!ctx2.disabled || ctx2.fieldsetDisabled,
470
+ canIncrement: (ctx2) => ctx2.allowOverflow || !ctx2.isAtMax,
471
+ canDecrement: (ctx2) => ctx2.allowOverflow || !ctx2.isAtMin,
472
+ valueText: (ctx2) => ctx2.translations.valueText?.(ctx2.value)
473
+ },
474
+ watch: {
475
+ formatOptions: ["setFormatterAndParser", "syncInputElement"],
476
+ locale: ["setFormatterAndParser", "syncInputElement"],
477
+ value: ["syncInputElement"],
478
+ isOutOfRange: ["invokeOnInvalid"],
479
+ scrubberCursorPoint: ["setVirtualCursorPosition"]
480
+ },
481
+ activities: ["trackFormControl"],
482
+ on: {
483
+ "VALUE.SET": {
484
+ actions: ["setRawValue", "setHintToSet"]
485
+ },
486
+ "VALUE.CLEAR": {
487
+ actions: ["clearValue"]
488
+ },
489
+ "VALUE.INCREMENT": {
490
+ actions: ["increment"]
491
+ },
492
+ "VALUE.DECREMENT": {
493
+ actions: ["decrement"]
494
+ }
495
+ },
496
+ states: {
497
+ idle: {
498
+ on: {
499
+ "TRIGGER.PRESS_DOWN": [
500
+ { guard: "isTouchPointer", target: "before:spin", actions: ["setHint"] },
501
+ {
502
+ target: "before:spin",
503
+ actions: ["focusInput", "invokeOnFocus", "setHint"]
504
+ }
505
+ ],
506
+ "SCRUBBER.PRESS_DOWN": {
507
+ target: "scrubbing",
508
+ actions: ["focusInput", "invokeOnFocus", "setHint", "setCursorPoint"]
509
+ },
510
+ "INPUT.FOCUS": {
511
+ target: "focused",
512
+ actions: ["focusInput", "invokeOnFocus"]
513
+ }
514
+ }
515
+ },
516
+ focused: {
517
+ tags: "focus",
518
+ activities: "attachWheelListener",
519
+ on: {
520
+ "TRIGGER.PRESS_DOWN": [
521
+ { guard: "isTouchPointer", target: "before:spin", actions: ["setHint"] },
522
+ { target: "before:spin", actions: ["focusInput", "setHint"] }
523
+ ],
524
+ "SCRUBBER.PRESS_DOWN": {
525
+ target: "scrubbing",
526
+ actions: ["focusInput", "setHint", "setCursorPoint"]
527
+ },
528
+ "INPUT.ARROW_UP": {
529
+ actions: "increment"
530
+ },
531
+ "INPUT.ARROW_DOWN": {
532
+ actions: "decrement"
533
+ },
534
+ "INPUT.HOME": {
535
+ actions: "decrementToMin"
536
+ },
537
+ "INPUT.END": {
538
+ actions: "incrementToMax"
539
+ },
540
+ "INPUT.CHANGE": {
541
+ actions: ["setValue", "setHint"]
542
+ },
543
+ "INPUT.COMMIT": [
544
+ {
545
+ guard: and("clampValueOnBlur", not("isInRange")),
546
+ target: "idle",
547
+ actions: ["setClampedValue", "clearHint", "invokeOnBlur"]
548
+ },
549
+ {
550
+ target: "idle",
551
+ actions: ["setFormattedValue", "clearHint", "invokeOnBlur"]
552
+ }
553
+ ]
554
+ }
555
+ },
556
+ "before:spin": {
557
+ tags: "focus",
558
+ activities: "trackButtonDisabled",
559
+ entry: choose([
560
+ { guard: "isIncrementHint", actions: "increment" },
561
+ { guard: "isDecrementHint", actions: "decrement" }
562
+ ]),
563
+ after: {
564
+ CHANGE_DELAY: {
565
+ target: "spinning",
566
+ guard: and("isInRange", "spinOnPress")
567
+ }
568
+ },
569
+ on: {
570
+ "TRIGGER.PRESS_UP": [
571
+ { guard: "isTouchPointer", target: "focused", actions: "clearHint" },
572
+ { target: "focused", actions: ["focusInput", "clearHint"] }
573
+ ]
574
+ }
575
+ },
576
+ spinning: {
577
+ tags: "focus",
578
+ activities: "trackButtonDisabled",
579
+ every: [
580
+ {
581
+ delay: "CHANGE_INTERVAL",
582
+ guard: and(not("isAtMin"), "isIncrementHint"),
583
+ actions: "increment"
584
+ },
585
+ {
586
+ delay: "CHANGE_INTERVAL",
587
+ guard: and(not("isAtMax"), "isDecrementHint"),
588
+ actions: "decrement"
589
+ }
590
+ ],
591
+ on: {
592
+ "TRIGGER.PRESS_UP": {
593
+ target: "focused",
594
+ actions: ["focusInput", "clearHint"]
595
+ }
596
+ }
597
+ },
598
+ scrubbing: {
599
+ tags: "focus",
600
+ activities: ["activatePointerLock", "trackMousemove", "setupVirtualCursor", "preventTextSelection"],
601
+ on: {
602
+ "SCRUBBER.POINTER_UP": {
603
+ target: "focused",
604
+ actions: ["focusInput", "clearCursorPoint"]
605
+ },
606
+ "SCRUBBER.POINTER_MOVE": [
607
+ {
608
+ guard: "isIncrementHint",
609
+ actions: ["increment", "setCursorPoint"]
610
+ },
611
+ {
612
+ guard: "isDecrementHint",
613
+ actions: ["decrement", "setCursorPoint"]
614
+ }
615
+ ]
616
+ }
617
+ }
618
+ }
619
+ },
620
+ {
621
+ delays: {
622
+ CHANGE_INTERVAL: 50,
623
+ CHANGE_DELAY: 300
624
+ },
625
+ guards: {
626
+ clampValueOnBlur: (ctx2) => ctx2.clampValueOnBlur,
627
+ isAtMin: (ctx2) => ctx2.isAtMin,
628
+ spinOnPress: (ctx2) => !!ctx2.spinOnPress,
629
+ isAtMax: (ctx2) => ctx2.isAtMax,
630
+ isInRange: (ctx2) => !ctx2.isOutOfRange,
631
+ isDecrementHint: (ctx2, evt) => (evt.hint ?? ctx2.hint) === "decrement",
632
+ isIncrementHint: (ctx2, evt) => (evt.hint ?? ctx2.hint) === "increment",
633
+ isTouchPointer: (_ctx, evt) => evt.pointerType === "touch"
634
+ },
635
+ activities: {
636
+ trackFormControl(ctx2, _evt, { initialContext }) {
637
+ const inputEl = dom.getInputEl(ctx2);
638
+ return trackFormControl(inputEl, {
639
+ onFieldsetDisabledChange(disabled) {
640
+ ctx2.fieldsetDisabled = disabled;
641
+ },
642
+ onFormReset() {
643
+ set.value(ctx2, initialContext.value);
644
+ }
645
+ });
646
+ },
647
+ setupVirtualCursor(ctx2) {
648
+ return dom.setupVirtualCursor(ctx2);
649
+ },
650
+ preventTextSelection(ctx2) {
651
+ return dom.preventTextSelection(ctx2);
652
+ },
653
+ trackButtonDisabled(ctx2, _evt, { send }) {
654
+ const btn = dom.getPressedTriggerEl(ctx2, ctx2.hint);
655
+ return observeAttributes(btn, {
656
+ attributes: ["disabled"],
657
+ callback() {
658
+ send({ type: "TRIGGER.PRESS_UP", src: "attr" });
659
+ }
660
+ });
661
+ },
662
+ attachWheelListener(ctx2, _evt, { send }) {
663
+ const inputEl = dom.getInputEl(ctx2);
664
+ if (!inputEl || !dom.isActiveElement(ctx2, inputEl) || !ctx2.allowMouseWheel)
665
+ return;
666
+ function onWheel(event) {
667
+ event.preventDefault();
668
+ const dir = Math.sign(event.deltaY) * -1;
669
+ if (dir === 1) {
670
+ send("VALUE.INCREMENT");
671
+ } else if (dir === -1) {
672
+ send("VALUE.DECREMENT");
673
+ }
674
+ }
675
+ return addDomEvent(inputEl, "wheel", onWheel, { passive: false });
676
+ },
677
+ activatePointerLock(ctx2) {
678
+ if (isSafari2())
679
+ return;
680
+ return requestPointerLock(dom.getDoc(ctx2));
681
+ },
682
+ trackMousemove(ctx2, _evt, { send }) {
683
+ const doc = dom.getDoc(ctx2);
684
+ function onMousemove(event) {
685
+ if (!ctx2.scrubberCursorPoint)
686
+ return;
687
+ const value = dom.getMousementValue(ctx2, event);
688
+ if (!value.hint)
689
+ return;
690
+ send({
691
+ type: "SCRUBBER.POINTER_MOVE",
692
+ hint: value.hint,
693
+ point: value.point
694
+ });
695
+ }
696
+ function onMouseup() {
697
+ send("SCRUBBER.POINTER_UP");
698
+ }
699
+ return callAll(
700
+ addDomEvent(doc, "mousemove", onMousemove, false),
701
+ addDomEvent(doc, "mouseup", onMouseup, false)
702
+ );
703
+ }
704
+ },
705
+ actions: {
706
+ focusInput(ctx2) {
707
+ if (!ctx2.focusInputOnChange)
708
+ return;
709
+ const inputEl = dom.getInputEl(ctx2);
710
+ if (dom.isActiveElement(ctx2, inputEl))
711
+ return;
712
+ raf(() => inputEl?.focus({ preventScroll: true }));
713
+ },
714
+ increment(ctx2, evt) {
715
+ const nextValue = increment(ctx2.valueAsNumber, evt.step ?? ctx2.step);
716
+ const value = formatValue(ctx2, clamp(nextValue, ctx2));
717
+ set.value(ctx2, value);
718
+ },
719
+ decrement(ctx2, evt) {
720
+ const nextValue = decrement(ctx2.valueAsNumber, evt.step ?? ctx2.step);
721
+ const value = formatValue(ctx2, clamp(nextValue, ctx2));
722
+ set.value(ctx2, value);
723
+ },
724
+ setClampedValue(ctx2) {
725
+ const nextValue = clamp(ctx2.valueAsNumber, ctx2);
726
+ set.value(ctx2, formatValue(ctx2, nextValue));
727
+ },
728
+ setRawValue(ctx2, evt) {
729
+ const parsedValue = parseValue(ctx2, evt.value);
730
+ const value = formatValue(ctx2, clamp(parsedValue, ctx2));
731
+ set.value(ctx2, value);
732
+ },
733
+ setValue(ctx2, evt) {
734
+ const value = evt.target?.value ?? evt.value;
735
+ set.value(ctx2, value);
736
+ },
737
+ clearValue(ctx2) {
738
+ set.value(ctx2, "");
739
+ },
740
+ incrementToMax(ctx2) {
741
+ const value = formatValue(ctx2, ctx2.max);
742
+ set.value(ctx2, value);
743
+ },
744
+ decrementToMin(ctx2) {
745
+ const value = formatValue(ctx2, ctx2.min);
746
+ set.value(ctx2, value);
747
+ },
748
+ setHint(ctx2, evt) {
749
+ ctx2.hint = evt.hint;
750
+ },
751
+ clearHint(ctx2) {
752
+ ctx2.hint = null;
753
+ },
754
+ setHintToSet(ctx2) {
755
+ ctx2.hint = "set";
756
+ },
757
+ invokeOnFocus(ctx2) {
758
+ ctx2.onFocusChange?.({
759
+ focused: true,
760
+ value: ctx2.formattedValue,
761
+ valueAsNumber: ctx2.valueAsNumber
762
+ });
763
+ },
764
+ invokeOnBlur(ctx2) {
765
+ ctx2.onFocusChange?.({
766
+ focused: false,
767
+ value: ctx2.formattedValue,
768
+ valueAsNumber: ctx2.valueAsNumber
769
+ });
770
+ },
771
+ invokeOnInvalid(ctx2) {
772
+ if (!ctx2.isOutOfRange)
773
+ return;
774
+ const reason = ctx2.valueAsNumber > ctx2.max ? "rangeOverflow" : "rangeUnderflow";
775
+ ctx2.onValueInvalid?.({
776
+ reason,
777
+ value: ctx2.formattedValue,
778
+ valueAsNumber: ctx2.valueAsNumber
779
+ });
780
+ },
781
+ syncInputElement(ctx2, evt) {
782
+ const value = evt.type.endsWith("CHANGE") ? ctx2.value : ctx2.formattedValue;
783
+ sync.input(ctx2, value);
784
+ },
785
+ setFormattedValue(ctx2) {
786
+ set.value(ctx2, ctx2.formattedValue);
787
+ },
788
+ setCursorPoint(ctx2, evt) {
789
+ ctx2.scrubberCursorPoint = evt.point;
790
+ },
791
+ clearCursorPoint(ctx2) {
792
+ ctx2.scrubberCursorPoint = null;
793
+ },
794
+ setVirtualCursorPosition(ctx2) {
795
+ const cursorEl = dom.getCursorEl(ctx2);
796
+ if (!cursorEl || !ctx2.scrubberCursorPoint)
797
+ return;
798
+ const { x, y } = ctx2.scrubberCursorPoint;
799
+ cursorEl.style.transform = `translate3d(${x}px, ${y}px, 0px)`;
800
+ },
801
+ setFormatterAndParser(ctx2) {
802
+ if (!ctx2.locale)
803
+ return;
804
+ ctx2.formatter = createFormatter(ctx2.locale, ctx2.formatOptions);
805
+ ctx2.parser = createParser(ctx2.locale, ctx2.formatOptions);
806
+ }
807
+ },
808
+ compareFns: {
809
+ formatOptions: (a, b) => isEqual(a, b),
810
+ scrubberCursorPoint: (a, b) => isEqual(a, b)
811
+ }
812
+ }
813
+ );
814
+ }
815
+ var sync = {
816
+ input(ctx, value) {
817
+ const inputEl = dom.getInputEl(ctx);
818
+ if (!inputEl)
819
+ return;
820
+ const sel = recordCursor(inputEl);
821
+ raf(() => {
822
+ dom.setValue(inputEl, value);
823
+ restoreCursor(inputEl, sel);
824
+ });
825
+ }
826
+ };
827
+ var invoke = {
828
+ onChange: (ctx) => {
829
+ ctx.onValueChange?.({
830
+ value: ctx.value,
831
+ valueAsNumber: ctx.valueAsNumber
832
+ });
833
+ }
834
+ };
835
+ var set = {
836
+ value: (ctx, value) => {
837
+ if (isEqual(ctx.value, value))
838
+ return;
839
+ ctx.value = value;
840
+ invoke.onChange(ctx);
841
+ }
842
+ };
843
+ export {
844
+ anatomy,
845
+ connect,
846
+ machine
847
+ };
8
848
  //# sourceMappingURL=index.mjs.map