@zag-js/number-input 0.46.0 → 0.48.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.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +39 -53
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +40 -54
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -10
- package/src/number-input.connect.ts +31 -36
- package/src/number-input.machine.ts +6 -17
- package/src/number-input.types.ts +4 -8
package/dist/index.d.mts
CHANGED
|
@@ -210,15 +210,15 @@ interface MachineApi<T extends PropTypes = PropTypes> {
|
|
|
210
210
|
/**
|
|
211
211
|
* Whether the input is focused.
|
|
212
212
|
*/
|
|
213
|
-
|
|
213
|
+
focused: boolean;
|
|
214
214
|
/**
|
|
215
215
|
* Whether the input is invalid.
|
|
216
216
|
*/
|
|
217
|
-
|
|
217
|
+
invalid: boolean;
|
|
218
218
|
/**
|
|
219
219
|
* Whether the input value is empty.
|
|
220
220
|
*/
|
|
221
|
-
|
|
221
|
+
empty: boolean;
|
|
222
222
|
/**
|
|
223
223
|
* The formatted value of the input.
|
|
224
224
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -210,15 +210,15 @@ interface MachineApi<T extends PropTypes = PropTypes> {
|
|
|
210
210
|
/**
|
|
211
211
|
* Whether the input is focused.
|
|
212
212
|
*/
|
|
213
|
-
|
|
213
|
+
focused: boolean;
|
|
214
214
|
/**
|
|
215
215
|
* Whether the input is invalid.
|
|
216
216
|
*/
|
|
217
|
-
|
|
217
|
+
invalid: boolean;
|
|
218
218
|
/**
|
|
219
219
|
* Whether the input value is empty.
|
|
220
220
|
*/
|
|
221
|
-
|
|
221
|
+
empty: boolean;
|
|
222
222
|
/**
|
|
223
223
|
* The formatted value of the input.
|
|
224
224
|
*/
|
package/dist/index.js
CHANGED
|
@@ -144,18 +144,18 @@ var dom = (0, import_dom_query.createScope)({
|
|
|
144
144
|
|
|
145
145
|
// src/number-input.connect.ts
|
|
146
146
|
function connect(state, send, normalize) {
|
|
147
|
-
const
|
|
148
|
-
const
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
const
|
|
152
|
-
const isIncrementDisabled =
|
|
153
|
-
const isDecrementDisabled =
|
|
147
|
+
const focused = state.hasTag("focus");
|
|
148
|
+
const disabled = state.context.isDisabled;
|
|
149
|
+
const readOnly = state.context.readOnly;
|
|
150
|
+
const empty = state.context.isValueEmpty;
|
|
151
|
+
const invalid = state.context.isOutOfRange || !!state.context.invalid;
|
|
152
|
+
const isIncrementDisabled = disabled || !state.context.canIncrement || readOnly;
|
|
153
|
+
const isDecrementDisabled = disabled || !state.context.canDecrement || readOnly;
|
|
154
154
|
const translations = state.context.translations;
|
|
155
155
|
return {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
focused,
|
|
157
|
+
invalid,
|
|
158
|
+
empty,
|
|
159
159
|
value: state.context.formattedValue,
|
|
160
160
|
valueAsNumber: state.context.valueAsNumber,
|
|
161
161
|
setValue(value) {
|
|
@@ -183,16 +183,16 @@ function connect(state, send, normalize) {
|
|
|
183
183
|
id: dom.getRootId(state.context),
|
|
184
184
|
...parts.root.attrs,
|
|
185
185
|
dir: state.context.dir,
|
|
186
|
-
"data-disabled": (0, import_dom_query2.dataAttr)(
|
|
187
|
-
"data-focus": (0, import_dom_query2.dataAttr)(
|
|
188
|
-
"data-invalid": (0, import_dom_query2.dataAttr)(
|
|
186
|
+
"data-disabled": (0, import_dom_query2.dataAttr)(disabled),
|
|
187
|
+
"data-focus": (0, import_dom_query2.dataAttr)(focused),
|
|
188
|
+
"data-invalid": (0, import_dom_query2.dataAttr)(invalid)
|
|
189
189
|
}),
|
|
190
190
|
labelProps: normalize.label({
|
|
191
191
|
...parts.label.attrs,
|
|
192
192
|
dir: state.context.dir,
|
|
193
|
-
"data-disabled": (0, import_dom_query2.dataAttr)(
|
|
194
|
-
"data-focus": (0, import_dom_query2.dataAttr)(
|
|
195
|
-
"data-invalid": (0, import_dom_query2.dataAttr)(
|
|
193
|
+
"data-disabled": (0, import_dom_query2.dataAttr)(disabled),
|
|
194
|
+
"data-focus": (0, import_dom_query2.dataAttr)(focused),
|
|
195
|
+
"data-invalid": (0, import_dom_query2.dataAttr)(invalid),
|
|
196
196
|
id: dom.getLabelId(state.context),
|
|
197
197
|
htmlFor: dom.getInputId(state.context)
|
|
198
198
|
}),
|
|
@@ -200,10 +200,10 @@ function connect(state, send, normalize) {
|
|
|
200
200
|
...parts.control.attrs,
|
|
201
201
|
dir: state.context.dir,
|
|
202
202
|
role: "group",
|
|
203
|
-
"aria-disabled":
|
|
204
|
-
"data-focus": (0, import_dom_query2.dataAttr)(
|
|
205
|
-
"data-disabled": (0, import_dom_query2.dataAttr)(
|
|
206
|
-
"data-invalid": (0, import_dom_query2.dataAttr)(
|
|
203
|
+
"aria-disabled": disabled,
|
|
204
|
+
"data-focus": (0, import_dom_query2.dataAttr)(focused),
|
|
205
|
+
"data-disabled": (0, import_dom_query2.dataAttr)(disabled),
|
|
206
|
+
"data-invalid": (0, import_dom_query2.dataAttr)(invalid),
|
|
207
207
|
"aria-invalid": (0, import_dom_query2.ariaAttr)(state.context.invalid)
|
|
208
208
|
}),
|
|
209
209
|
inputProps: normalize.input({
|
|
@@ -216,10 +216,10 @@ function connect(state, send, normalize) {
|
|
|
216
216
|
defaultValue: state.context.formattedValue,
|
|
217
217
|
pattern: state.context.pattern,
|
|
218
218
|
inputMode: state.context.inputMode,
|
|
219
|
-
"aria-invalid": (0, import_dom_query2.ariaAttr)(
|
|
220
|
-
"data-invalid": (0, import_dom_query2.dataAttr)(
|
|
221
|
-
disabled
|
|
222
|
-
"data-disabled": (0, import_dom_query2.dataAttr)(
|
|
219
|
+
"aria-invalid": (0, import_dom_query2.ariaAttr)(invalid),
|
|
220
|
+
"data-invalid": (0, import_dom_query2.dataAttr)(invalid),
|
|
221
|
+
disabled,
|
|
222
|
+
"data-disabled": (0, import_dom_query2.dataAttr)(disabled),
|
|
223
223
|
readOnly: !!state.context.readOnly,
|
|
224
224
|
autoComplete: "off",
|
|
225
225
|
autoCorrect: "off",
|
|
@@ -230,12 +230,6 @@ function connect(state, send, normalize) {
|
|
|
230
230
|
"aria-valuemax": state.context.max,
|
|
231
231
|
"aria-valuenow": Number.isNaN(state.context.valueAsNumber) ? void 0 : state.context.valueAsNumber,
|
|
232
232
|
"aria-valuetext": state.context.valueText,
|
|
233
|
-
onCompositionStart() {
|
|
234
|
-
send("INPUT.COMPOSITION_START");
|
|
235
|
-
},
|
|
236
|
-
onCompositionEnd() {
|
|
237
|
-
send("INPUT.COMPOSITION_END");
|
|
238
|
-
},
|
|
239
233
|
onFocus() {
|
|
240
234
|
send("INPUT.FOCUS");
|
|
241
235
|
},
|
|
@@ -257,7 +251,12 @@ function connect(state, send, normalize) {
|
|
|
257
251
|
}
|
|
258
252
|
},
|
|
259
253
|
onKeyDown(event) {
|
|
260
|
-
if (
|
|
254
|
+
if (event.defaultPrevented)
|
|
255
|
+
return;
|
|
256
|
+
if (readOnly)
|
|
257
|
+
return;
|
|
258
|
+
const evt = (0, import_dom_event.getNativeEvent)(event);
|
|
259
|
+
if (evt.isComposing)
|
|
261
260
|
return;
|
|
262
261
|
const step = (0, import_dom_event.getEventStep)(event) * state.context.step;
|
|
263
262
|
const keyMap = {
|
|
@@ -278,8 +277,6 @@ function connect(state, send, normalize) {
|
|
|
278
277
|
event.preventDefault();
|
|
279
278
|
},
|
|
280
279
|
Enter() {
|
|
281
|
-
if (state.context.composing)
|
|
282
|
-
return;
|
|
283
280
|
send({ type: "INPUT.COMMIT", src: "enter" });
|
|
284
281
|
}
|
|
285
282
|
};
|
|
@@ -348,11 +345,11 @@ function connect(state, send, normalize) {
|
|
|
348
345
|
scrubberProps: normalize.element({
|
|
349
346
|
...parts.scrubber.attrs,
|
|
350
347
|
dir: state.context.dir,
|
|
351
|
-
"data-disabled": (0, import_dom_query2.dataAttr)(
|
|
348
|
+
"data-disabled": (0, import_dom_query2.dataAttr)(disabled),
|
|
352
349
|
id: dom.getScrubberId(state.context),
|
|
353
350
|
role: "presentation",
|
|
354
351
|
onMouseDown(event) {
|
|
355
|
-
if (
|
|
352
|
+
if (disabled)
|
|
356
353
|
return;
|
|
357
354
|
const evt = (0, import_dom_event.getNativeEvent)(event);
|
|
358
355
|
const point = (0, import_dom_event.getEventPoint)(evt);
|
|
@@ -362,7 +359,7 @@ function connect(state, send, normalize) {
|
|
|
362
359
|
event.preventDefault();
|
|
363
360
|
},
|
|
364
361
|
style: {
|
|
365
|
-
cursor:
|
|
362
|
+
cursor: disabled ? void 0 : "ew-resize"
|
|
366
363
|
}
|
|
367
364
|
})
|
|
368
365
|
};
|
|
@@ -373,7 +370,6 @@ var import_core2 = require("@zag-js/core");
|
|
|
373
370
|
var import_dom_event2 = require("@zag-js/dom-event");
|
|
374
371
|
var import_dom_query3 = require("@zag-js/dom-query");
|
|
375
372
|
var import_form_utils = require("@zag-js/form-utils");
|
|
376
|
-
var import_mutation_observer = require("@zag-js/mutation-observer");
|
|
377
373
|
var import_number_utils3 = require("@zag-js/number-utils");
|
|
378
374
|
var import_utils = require("@zag-js/utils");
|
|
379
375
|
|
|
@@ -472,7 +468,6 @@ function machine(userContext) {
|
|
|
472
468
|
...ctx,
|
|
473
469
|
hint: null,
|
|
474
470
|
scrubberCursorPoint: null,
|
|
475
|
-
composing: false,
|
|
476
471
|
fieldsetDisabled: false,
|
|
477
472
|
formatter: createFormatter(ctx.locale || "en-US", ctx.formatOptions),
|
|
478
473
|
parser: createParser(ctx.locale || "en-US", ctx.formatOptions),
|
|
@@ -574,13 +569,7 @@ function machine(userContext) {
|
|
|
574
569
|
target: "idle",
|
|
575
570
|
actions: ["setFormattedValue", "clearHint", "invokeOnBlur"]
|
|
576
571
|
}
|
|
577
|
-
]
|
|
578
|
-
"INPUT.COMPOSITION_START": {
|
|
579
|
-
actions: "setComposing"
|
|
580
|
-
},
|
|
581
|
-
"INPUT.COMPOSITION_END": {
|
|
582
|
-
actions: "clearComposing"
|
|
583
|
-
}
|
|
572
|
+
]
|
|
584
573
|
}
|
|
585
574
|
},
|
|
586
575
|
"before:spin": {
|
|
@@ -682,8 +671,11 @@ function machine(userContext) {
|
|
|
682
671
|
},
|
|
683
672
|
trackButtonDisabled(ctx2, _evt, { send }) {
|
|
684
673
|
const btn = dom.getPressedTriggerEl(ctx2, ctx2.hint);
|
|
685
|
-
return (0,
|
|
686
|
-
|
|
674
|
+
return (0, import_dom_query3.observeAttributes)(btn, {
|
|
675
|
+
attributes: ["disabled"],
|
|
676
|
+
callback() {
|
|
677
|
+
send({ type: "TRIGGER.PRESS_UP", src: "attr" });
|
|
678
|
+
}
|
|
687
679
|
});
|
|
688
680
|
},
|
|
689
681
|
attachWheelListener(ctx2, _evt, { send }) {
|
|
@@ -825,12 +817,6 @@ function machine(userContext) {
|
|
|
825
817
|
const { x, y } = ctx2.scrubberCursorPoint;
|
|
826
818
|
cursorEl.style.transform = `translate3d(${x}px, ${y}px, 0px)`;
|
|
827
819
|
},
|
|
828
|
-
setComposing(ctx2) {
|
|
829
|
-
ctx2.composing = true;
|
|
830
|
-
},
|
|
831
|
-
clearComposing(ctx2) {
|
|
832
|
-
ctx2.composing = false;
|
|
833
|
-
},
|
|
834
820
|
setFormatterAndParser(ctx2) {
|
|
835
821
|
if (!ctx2.locale)
|
|
836
822
|
return;
|
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 isFocused = state.hasTag(\"focus\")\n const isInvalid = state.context.isOutOfRange || !!state.context.invalid\n\n const isValueEmpty = state.context.isValueEmpty\n\n const isDisabled = state.context.isDisabled\n const isReadOnly = state.context.readOnly\n\n const isIncrementDisabled = isDisabled || !state.context.canIncrement || isReadOnly\n const isDecrementDisabled = isDisabled || !state.context.canDecrement || isReadOnly\n\n const translations = state.context.translations\n\n return {\n isFocused,\n isInvalid,\n isValueEmpty,\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(isDisabled),\n \"data-focus\": dataAttr(isFocused),\n \"data-invalid\": dataAttr(isInvalid),\n }),\n\n labelProps: normalize.label({\n ...parts.label.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(isDisabled),\n \"data-focus\": dataAttr(isFocused),\n \"data-invalid\": dataAttr(isInvalid),\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\": isDisabled,\n \"data-focus\": dataAttr(isFocused),\n \"data-disabled\": dataAttr(isDisabled),\n \"data-invalid\": dataAttr(isInvalid),\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(isInvalid),\n \"data-invalid\": dataAttr(isInvalid),\n disabled: isDisabled,\n \"data-disabled\": dataAttr(isDisabled),\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 onCompositionStart() {\n send(\"INPUT.COMPOSITION_START\")\n },\n onCompositionEnd() {\n send(\"INPUT.COMPOSITION_END\")\n },\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 (state.context.readOnly) 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 if (state.context.composing) return\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(isDisabled),\n id: dom.getScrubberId(state.context),\n role: \"presentation\",\n onMouseDown(event) {\n if (isDisabled) 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: isDisabled ? 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, raf } from \"@zag-js/dom-query\"\nimport { trackFormControl } from \"@zag-js/form-utils\"\nimport { observeAttributes } from \"@zag-js/mutation-observer\"\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 composing: false,\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 \"INPUT.COMPOSITION_START\": {\n actions: \"setComposing\",\n },\n \"INPUT.COMPOSITION_END\": {\n actions: \"clearComposing\",\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, [\"disabled\"], () => {\n send({ type: \"TRIGGER.PRESS_UP\", src: \"attr\" })\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 = ctx.formatter.format(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 = ctx.formatter.format(clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n setClampedValue(ctx) {\n const nextValue = clamp(ctx.valueAsNumber, ctx)\n set.value(ctx, ctx.formatter.format(nextValue))\n },\n setRawValue(ctx, evt) {\n const value = ctx.formatter.format(clamp(evt.value, 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 = ctx.formatter.format(ctx.max)\n set.value(ctx, value)\n },\n decrementToMin(ctx) {\n const value = ctx.formatter.format(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 const value = ctx.formatter.format(ctx.valueAsNumber)\n set.value(ctx, value)\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 setComposing(ctx) {\n ctx.composing = true\n },\n clearComposing(ctx) {\n ctx.composing = false\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\nconst defaultFormatOptions: Intl.NumberFormatOptions = {\n style: \"decimal\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 20,\n}\n\nexport const createFormatter = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n const formatOptions = Object.assign({}, defaultFormatOptions, options)\n return ref(new Intl.NumberFormat(locale, formatOptions))\n}\n\nexport const createParser = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n const formatOptions = Object.assign({}, defaultFormatOptions, options)\n return ref(new NumberParser(locale, formatOptions))\n}\n\nexport const parseValue = (ctx: MachineContext, value: string) => {\n return ctx.parser.parse(String(value))\n}\n\nexport const nan = (value: any, fallback: any) => {\n return Number.isNaN(value) ? fallback : value\n}\n\nexport const formatValue = (ctx: MachineContext, value: number): string => {\n if (Number.isNaN(value)) return \"\"\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, 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 = ctx.formatter.format(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 = ctx.formatter.format(clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n setClampedValue(ctx) {\n const nextValue = clamp(ctx.valueAsNumber, ctx)\n set.value(ctx, ctx.formatter.format(nextValue))\n },\n setRawValue(ctx, evt) {\n const value = ctx.formatter.format(clamp(evt.value, 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 = ctx.formatter.format(ctx.max)\n set.value(ctx, value)\n },\n decrementToMin(ctx) {\n const value = ctx.formatter.format(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 const value = ctx.formatter.format(ctx.valueAsNumber)\n set.value(ctx, value)\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\nconst defaultFormatOptions: Intl.NumberFormatOptions = {\n style: \"decimal\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 20,\n}\n\nexport const createFormatter = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n const formatOptions = Object.assign({}, defaultFormatOptions, options)\n return ref(new Intl.NumberFormat(locale, formatOptions))\n}\n\nexport const createParser = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n const formatOptions = Object.assign({}, defaultFormatOptions, options)\n return ref(new NumberParser(locale, formatOptions))\n}\n\nexport const parseValue = (ctx: MachineContext, value: string) => {\n return ctx.parser.parse(String(value))\n}\n\nexport const nan = (value: any, fallback: any) => {\n return Number.isNaN(value) ? fallback : value\n}\n\nexport const formatValue = (ctx: MachineContext, value: number): string => {\n if (Number.isNaN(value)) return \"\"\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
|
@@ -116,18 +116,18 @@ var dom = createScope({
|
|
|
116
116
|
|
|
117
117
|
// src/number-input.connect.ts
|
|
118
118
|
function connect(state, send, normalize) {
|
|
119
|
-
const
|
|
120
|
-
const
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
const
|
|
124
|
-
const isIncrementDisabled =
|
|
125
|
-
const isDecrementDisabled =
|
|
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
126
|
const translations = state.context.translations;
|
|
127
127
|
return {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
focused,
|
|
129
|
+
invalid,
|
|
130
|
+
empty,
|
|
131
131
|
value: state.context.formattedValue,
|
|
132
132
|
valueAsNumber: state.context.valueAsNumber,
|
|
133
133
|
setValue(value) {
|
|
@@ -155,16 +155,16 @@ function connect(state, send, normalize) {
|
|
|
155
155
|
id: dom.getRootId(state.context),
|
|
156
156
|
...parts.root.attrs,
|
|
157
157
|
dir: state.context.dir,
|
|
158
|
-
"data-disabled": dataAttr(
|
|
159
|
-
"data-focus": dataAttr(
|
|
160
|
-
"data-invalid": dataAttr(
|
|
158
|
+
"data-disabled": dataAttr(disabled),
|
|
159
|
+
"data-focus": dataAttr(focused),
|
|
160
|
+
"data-invalid": dataAttr(invalid)
|
|
161
161
|
}),
|
|
162
162
|
labelProps: normalize.label({
|
|
163
163
|
...parts.label.attrs,
|
|
164
164
|
dir: state.context.dir,
|
|
165
|
-
"data-disabled": dataAttr(
|
|
166
|
-
"data-focus": dataAttr(
|
|
167
|
-
"data-invalid": dataAttr(
|
|
165
|
+
"data-disabled": dataAttr(disabled),
|
|
166
|
+
"data-focus": dataAttr(focused),
|
|
167
|
+
"data-invalid": dataAttr(invalid),
|
|
168
168
|
id: dom.getLabelId(state.context),
|
|
169
169
|
htmlFor: dom.getInputId(state.context)
|
|
170
170
|
}),
|
|
@@ -172,10 +172,10 @@ function connect(state, send, normalize) {
|
|
|
172
172
|
...parts.control.attrs,
|
|
173
173
|
dir: state.context.dir,
|
|
174
174
|
role: "group",
|
|
175
|
-
"aria-disabled":
|
|
176
|
-
"data-focus": dataAttr(
|
|
177
|
-
"data-disabled": dataAttr(
|
|
178
|
-
"data-invalid": dataAttr(
|
|
175
|
+
"aria-disabled": disabled,
|
|
176
|
+
"data-focus": dataAttr(focused),
|
|
177
|
+
"data-disabled": dataAttr(disabled),
|
|
178
|
+
"data-invalid": dataAttr(invalid),
|
|
179
179
|
"aria-invalid": ariaAttr(state.context.invalid)
|
|
180
180
|
}),
|
|
181
181
|
inputProps: normalize.input({
|
|
@@ -188,10 +188,10 @@ function connect(state, send, normalize) {
|
|
|
188
188
|
defaultValue: state.context.formattedValue,
|
|
189
189
|
pattern: state.context.pattern,
|
|
190
190
|
inputMode: state.context.inputMode,
|
|
191
|
-
"aria-invalid": ariaAttr(
|
|
192
|
-
"data-invalid": dataAttr(
|
|
193
|
-
disabled
|
|
194
|
-
"data-disabled": dataAttr(
|
|
191
|
+
"aria-invalid": ariaAttr(invalid),
|
|
192
|
+
"data-invalid": dataAttr(invalid),
|
|
193
|
+
disabled,
|
|
194
|
+
"data-disabled": dataAttr(disabled),
|
|
195
195
|
readOnly: !!state.context.readOnly,
|
|
196
196
|
autoComplete: "off",
|
|
197
197
|
autoCorrect: "off",
|
|
@@ -202,12 +202,6 @@ function connect(state, send, normalize) {
|
|
|
202
202
|
"aria-valuemax": state.context.max,
|
|
203
203
|
"aria-valuenow": Number.isNaN(state.context.valueAsNumber) ? void 0 : state.context.valueAsNumber,
|
|
204
204
|
"aria-valuetext": state.context.valueText,
|
|
205
|
-
onCompositionStart() {
|
|
206
|
-
send("INPUT.COMPOSITION_START");
|
|
207
|
-
},
|
|
208
|
-
onCompositionEnd() {
|
|
209
|
-
send("INPUT.COMPOSITION_END");
|
|
210
|
-
},
|
|
211
205
|
onFocus() {
|
|
212
206
|
send("INPUT.FOCUS");
|
|
213
207
|
},
|
|
@@ -229,7 +223,12 @@ function connect(state, send, normalize) {
|
|
|
229
223
|
}
|
|
230
224
|
},
|
|
231
225
|
onKeyDown(event) {
|
|
232
|
-
if (
|
|
226
|
+
if (event.defaultPrevented)
|
|
227
|
+
return;
|
|
228
|
+
if (readOnly)
|
|
229
|
+
return;
|
|
230
|
+
const evt = getNativeEvent(event);
|
|
231
|
+
if (evt.isComposing)
|
|
233
232
|
return;
|
|
234
233
|
const step = getEventStep(event) * state.context.step;
|
|
235
234
|
const keyMap = {
|
|
@@ -250,8 +249,6 @@ function connect(state, send, normalize) {
|
|
|
250
249
|
event.preventDefault();
|
|
251
250
|
},
|
|
252
251
|
Enter() {
|
|
253
|
-
if (state.context.composing)
|
|
254
|
-
return;
|
|
255
252
|
send({ type: "INPUT.COMMIT", src: "enter" });
|
|
256
253
|
}
|
|
257
254
|
};
|
|
@@ -320,11 +317,11 @@ function connect(state, send, normalize) {
|
|
|
320
317
|
scrubberProps: normalize.element({
|
|
321
318
|
...parts.scrubber.attrs,
|
|
322
319
|
dir: state.context.dir,
|
|
323
|
-
"data-disabled": dataAttr(
|
|
320
|
+
"data-disabled": dataAttr(disabled),
|
|
324
321
|
id: dom.getScrubberId(state.context),
|
|
325
322
|
role: "presentation",
|
|
326
323
|
onMouseDown(event) {
|
|
327
|
-
if (
|
|
324
|
+
if (disabled)
|
|
328
325
|
return;
|
|
329
326
|
const evt = getNativeEvent(event);
|
|
330
327
|
const point = getEventPoint(evt);
|
|
@@ -334,7 +331,7 @@ function connect(state, send, normalize) {
|
|
|
334
331
|
event.preventDefault();
|
|
335
332
|
},
|
|
336
333
|
style: {
|
|
337
|
-
cursor:
|
|
334
|
+
cursor: disabled ? void 0 : "ew-resize"
|
|
338
335
|
}
|
|
339
336
|
})
|
|
340
337
|
};
|
|
@@ -343,9 +340,8 @@ function connect(state, send, normalize) {
|
|
|
343
340
|
// src/number-input.machine.ts
|
|
344
341
|
import { choose, createMachine, guards } from "@zag-js/core";
|
|
345
342
|
import { addDomEvent, requestPointerLock } from "@zag-js/dom-event";
|
|
346
|
-
import { isSafari as isSafari2, raf } from "@zag-js/dom-query";
|
|
343
|
+
import { isSafari as isSafari2, observeAttributes, raf } from "@zag-js/dom-query";
|
|
347
344
|
import { trackFormControl } from "@zag-js/form-utils";
|
|
348
|
-
import { observeAttributes } from "@zag-js/mutation-observer";
|
|
349
345
|
import { clamp, decrement, increment, isAtMax, isAtMin, isWithinRange } from "@zag-js/number-utils";
|
|
350
346
|
import { callAll, compact, isEqual } from "@zag-js/utils";
|
|
351
347
|
|
|
@@ -444,7 +440,6 @@ function machine(userContext) {
|
|
|
444
440
|
...ctx,
|
|
445
441
|
hint: null,
|
|
446
442
|
scrubberCursorPoint: null,
|
|
447
|
-
composing: false,
|
|
448
443
|
fieldsetDisabled: false,
|
|
449
444
|
formatter: createFormatter(ctx.locale || "en-US", ctx.formatOptions),
|
|
450
445
|
parser: createParser(ctx.locale || "en-US", ctx.formatOptions),
|
|
@@ -546,13 +541,7 @@ function machine(userContext) {
|
|
|
546
541
|
target: "idle",
|
|
547
542
|
actions: ["setFormattedValue", "clearHint", "invokeOnBlur"]
|
|
548
543
|
}
|
|
549
|
-
]
|
|
550
|
-
"INPUT.COMPOSITION_START": {
|
|
551
|
-
actions: "setComposing"
|
|
552
|
-
},
|
|
553
|
-
"INPUT.COMPOSITION_END": {
|
|
554
|
-
actions: "clearComposing"
|
|
555
|
-
}
|
|
544
|
+
]
|
|
556
545
|
}
|
|
557
546
|
},
|
|
558
547
|
"before:spin": {
|
|
@@ -654,8 +643,11 @@ function machine(userContext) {
|
|
|
654
643
|
},
|
|
655
644
|
trackButtonDisabled(ctx2, _evt, { send }) {
|
|
656
645
|
const btn = dom.getPressedTriggerEl(ctx2, ctx2.hint);
|
|
657
|
-
return observeAttributes(btn,
|
|
658
|
-
|
|
646
|
+
return observeAttributes(btn, {
|
|
647
|
+
attributes: ["disabled"],
|
|
648
|
+
callback() {
|
|
649
|
+
send({ type: "TRIGGER.PRESS_UP", src: "attr" });
|
|
650
|
+
}
|
|
659
651
|
});
|
|
660
652
|
},
|
|
661
653
|
attachWheelListener(ctx2, _evt, { send }) {
|
|
@@ -797,12 +789,6 @@ function machine(userContext) {
|
|
|
797
789
|
const { x, y } = ctx2.scrubberCursorPoint;
|
|
798
790
|
cursorEl.style.transform = `translate3d(${x}px, ${y}px, 0px)`;
|
|
799
791
|
},
|
|
800
|
-
setComposing(ctx2) {
|
|
801
|
-
ctx2.composing = true;
|
|
802
|
-
},
|
|
803
|
-
clearComposing(ctx2) {
|
|
804
|
-
ctx2.composing = false;
|
|
805
|
-
},
|
|
806
792
|
setFormatterAndParser(ctx2) {
|
|
807
793
|
if (!ctx2.locale)
|
|
808
794
|
return;
|
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 isFocused = state.hasTag(\"focus\")\n const isInvalid = state.context.isOutOfRange || !!state.context.invalid\n\n const isValueEmpty = state.context.isValueEmpty\n\n const isDisabled = state.context.isDisabled\n const isReadOnly = state.context.readOnly\n\n const isIncrementDisabled = isDisabled || !state.context.canIncrement || isReadOnly\n const isDecrementDisabled = isDisabled || !state.context.canDecrement || isReadOnly\n\n const translations = state.context.translations\n\n return {\n isFocused,\n isInvalid,\n isValueEmpty,\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(isDisabled),\n \"data-focus\": dataAttr(isFocused),\n \"data-invalid\": dataAttr(isInvalid),\n }),\n\n labelProps: normalize.label({\n ...parts.label.attrs,\n dir: state.context.dir,\n \"data-disabled\": dataAttr(isDisabled),\n \"data-focus\": dataAttr(isFocused),\n \"data-invalid\": dataAttr(isInvalid),\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\": isDisabled,\n \"data-focus\": dataAttr(isFocused),\n \"data-disabled\": dataAttr(isDisabled),\n \"data-invalid\": dataAttr(isInvalid),\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(isInvalid),\n \"data-invalid\": dataAttr(isInvalid),\n disabled: isDisabled,\n \"data-disabled\": dataAttr(isDisabled),\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 onCompositionStart() {\n send(\"INPUT.COMPOSITION_START\")\n },\n onCompositionEnd() {\n send(\"INPUT.COMPOSITION_END\")\n },\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 (state.context.readOnly) 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 if (state.context.composing) return\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(isDisabled),\n id: dom.getScrubberId(state.context),\n role: \"presentation\",\n onMouseDown(event) {\n if (isDisabled) 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: isDisabled ? 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, raf } from \"@zag-js/dom-query\"\nimport { trackFormControl } from \"@zag-js/form-utils\"\nimport { observeAttributes } from \"@zag-js/mutation-observer\"\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 composing: false,\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 \"INPUT.COMPOSITION_START\": {\n actions: \"setComposing\",\n },\n \"INPUT.COMPOSITION_END\": {\n actions: \"clearComposing\",\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, [\"disabled\"], () => {\n send({ type: \"TRIGGER.PRESS_UP\", src: \"attr\" })\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 = ctx.formatter.format(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 = ctx.formatter.format(clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n setClampedValue(ctx) {\n const nextValue = clamp(ctx.valueAsNumber, ctx)\n set.value(ctx, ctx.formatter.format(nextValue))\n },\n setRawValue(ctx, evt) {\n const value = ctx.formatter.format(clamp(evt.value, 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 = ctx.formatter.format(ctx.max)\n set.value(ctx, value)\n },\n decrementToMin(ctx) {\n const value = ctx.formatter.format(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 const value = ctx.formatter.format(ctx.valueAsNumber)\n set.value(ctx, value)\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 setComposing(ctx) {\n ctx.composing = true\n },\n clearComposing(ctx) {\n ctx.composing = false\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\nconst defaultFormatOptions: Intl.NumberFormatOptions = {\n style: \"decimal\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 20,\n}\n\nexport const createFormatter = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n const formatOptions = Object.assign({}, defaultFormatOptions, options)\n return ref(new Intl.NumberFormat(locale, formatOptions))\n}\n\nexport const createParser = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n const formatOptions = Object.assign({}, defaultFormatOptions, options)\n return ref(new NumberParser(locale, formatOptions))\n}\n\nexport const parseValue = (ctx: MachineContext, value: string) => {\n return ctx.parser.parse(String(value))\n}\n\nexport const nan = (value: any, fallback: any) => {\n return Number.isNaN(value) ? fallback : value\n}\n\nexport const formatValue = (ctx: MachineContext, value: number): string => {\n if (Number.isNaN(value)) return \"\"\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, 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 = ctx.formatter.format(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 = ctx.formatter.format(clamp(nextValue, ctx))\n set.value(ctx, value)\n },\n setClampedValue(ctx) {\n const nextValue = clamp(ctx.valueAsNumber, ctx)\n set.value(ctx, ctx.formatter.format(nextValue))\n },\n setRawValue(ctx, evt) {\n const value = ctx.formatter.format(clamp(evt.value, 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 = ctx.formatter.format(ctx.max)\n set.value(ctx, value)\n },\n decrementToMin(ctx) {\n const value = ctx.formatter.format(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 const value = ctx.formatter.format(ctx.valueAsNumber)\n set.value(ctx, value)\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\nconst defaultFormatOptions: Intl.NumberFormatOptions = {\n style: \"decimal\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 20,\n}\n\nexport const createFormatter = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n const formatOptions = Object.assign({}, defaultFormatOptions, options)\n return ref(new Intl.NumberFormat(locale, formatOptions))\n}\n\nexport const createParser = (locale: string, options: Intl.NumberFormatOptions = {}) => {\n const formatOptions = Object.assign({}, defaultFormatOptions, options)\n return ref(new NumberParser(locale, formatOptions))\n}\n\nexport const parseValue = (ctx: MachineContext, value: string) => {\n return ctx.parser.parse(String(value))\n}\n\nexport const nan = (value: any, fallback: any) => {\n return Number.isNaN(value) ? fallback : value\n}\n\nexport const formatValue = (ctx: MachineContext, value: number): string => {\n if (Number.isNaN(value)) return \"\"\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.
|
|
3
|
+
"version": "0.48.0",
|
|
4
4
|
"description": "Core logic for the number-input widget implemented as a state machine",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"js",
|
|
@@ -28,15 +28,14 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@internationalized/number": "3.5.1",
|
|
31
|
-
"@zag-js/anatomy": "0.
|
|
32
|
-
"@zag-js/core": "0.
|
|
33
|
-
"@zag-js/dom-event": "0.
|
|
34
|
-
"@zag-js/dom-query": "0.
|
|
35
|
-
"@zag-js/form-utils": "0.
|
|
36
|
-
"@zag-js/
|
|
37
|
-
"@zag-js/
|
|
38
|
-
"@zag-js/
|
|
39
|
-
"@zag-js/utils": "0.46.0"
|
|
31
|
+
"@zag-js/anatomy": "0.48.0",
|
|
32
|
+
"@zag-js/core": "0.48.0",
|
|
33
|
+
"@zag-js/dom-event": "0.48.0",
|
|
34
|
+
"@zag-js/dom-query": "0.48.0",
|
|
35
|
+
"@zag-js/form-utils": "0.48.0",
|
|
36
|
+
"@zag-js/number-utils": "0.48.0",
|
|
37
|
+
"@zag-js/types": "0.48.0",
|
|
38
|
+
"@zag-js/utils": "0.48.0"
|
|
40
39
|
},
|
|
41
40
|
"devDependencies": {
|
|
42
41
|
"clean-package": "2.2.0"
|
|
@@ -7,23 +7,22 @@ import { dom } from "./number-input.dom"
|
|
|
7
7
|
import type { MachineApi, Send, State } from "./number-input.types"
|
|
8
8
|
|
|
9
9
|
export function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {
|
|
10
|
-
const
|
|
11
|
-
const
|
|
10
|
+
const focused = state.hasTag("focus")
|
|
11
|
+
const disabled = state.context.isDisabled
|
|
12
|
+
const readOnly = state.context.readOnly
|
|
12
13
|
|
|
13
|
-
const
|
|
14
|
+
const empty = state.context.isValueEmpty
|
|
15
|
+
const invalid = state.context.isOutOfRange || !!state.context.invalid
|
|
14
16
|
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
const isIncrementDisabled = isDisabled || !state.context.canIncrement || isReadOnly
|
|
19
|
-
const isDecrementDisabled = isDisabled || !state.context.canDecrement || isReadOnly
|
|
17
|
+
const isIncrementDisabled = disabled || !state.context.canIncrement || readOnly
|
|
18
|
+
const isDecrementDisabled = disabled || !state.context.canDecrement || readOnly
|
|
20
19
|
|
|
21
20
|
const translations = state.context.translations
|
|
22
21
|
|
|
23
22
|
return {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
focused: focused,
|
|
24
|
+
invalid: invalid,
|
|
25
|
+
empty: empty,
|
|
27
26
|
value: state.context.formattedValue,
|
|
28
27
|
valueAsNumber: state.context.valueAsNumber,
|
|
29
28
|
setValue(value) {
|
|
@@ -52,17 +51,17 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
52
51
|
id: dom.getRootId(state.context),
|
|
53
52
|
...parts.root.attrs,
|
|
54
53
|
dir: state.context.dir,
|
|
55
|
-
"data-disabled": dataAttr(
|
|
56
|
-
"data-focus": dataAttr(
|
|
57
|
-
"data-invalid": dataAttr(
|
|
54
|
+
"data-disabled": dataAttr(disabled),
|
|
55
|
+
"data-focus": dataAttr(focused),
|
|
56
|
+
"data-invalid": dataAttr(invalid),
|
|
58
57
|
}),
|
|
59
58
|
|
|
60
59
|
labelProps: normalize.label({
|
|
61
60
|
...parts.label.attrs,
|
|
62
61
|
dir: state.context.dir,
|
|
63
|
-
"data-disabled": dataAttr(
|
|
64
|
-
"data-focus": dataAttr(
|
|
65
|
-
"data-invalid": dataAttr(
|
|
62
|
+
"data-disabled": dataAttr(disabled),
|
|
63
|
+
"data-focus": dataAttr(focused),
|
|
64
|
+
"data-invalid": dataAttr(invalid),
|
|
66
65
|
id: dom.getLabelId(state.context),
|
|
67
66
|
htmlFor: dom.getInputId(state.context),
|
|
68
67
|
}),
|
|
@@ -71,10 +70,10 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
71
70
|
...parts.control.attrs,
|
|
72
71
|
dir: state.context.dir,
|
|
73
72
|
role: "group",
|
|
74
|
-
"aria-disabled":
|
|
75
|
-
"data-focus": dataAttr(
|
|
76
|
-
"data-disabled": dataAttr(
|
|
77
|
-
"data-invalid": dataAttr(
|
|
73
|
+
"aria-disabled": disabled,
|
|
74
|
+
"data-focus": dataAttr(focused),
|
|
75
|
+
"data-disabled": dataAttr(disabled),
|
|
76
|
+
"data-invalid": dataAttr(invalid),
|
|
78
77
|
"aria-invalid": ariaAttr(state.context.invalid),
|
|
79
78
|
}),
|
|
80
79
|
|
|
@@ -88,10 +87,10 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
88
87
|
defaultValue: state.context.formattedValue,
|
|
89
88
|
pattern: state.context.pattern,
|
|
90
89
|
inputMode: state.context.inputMode,
|
|
91
|
-
"aria-invalid": ariaAttr(
|
|
92
|
-
"data-invalid": dataAttr(
|
|
93
|
-
disabled:
|
|
94
|
-
"data-disabled": dataAttr(
|
|
90
|
+
"aria-invalid": ariaAttr(invalid),
|
|
91
|
+
"data-invalid": dataAttr(invalid),
|
|
92
|
+
disabled: disabled,
|
|
93
|
+
"data-disabled": dataAttr(disabled),
|
|
95
94
|
readOnly: !!state.context.readOnly,
|
|
96
95
|
autoComplete: "off",
|
|
97
96
|
autoCorrect: "off",
|
|
@@ -102,12 +101,6 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
102
101
|
"aria-valuemax": state.context.max,
|
|
103
102
|
"aria-valuenow": Number.isNaN(state.context.valueAsNumber) ? undefined : state.context.valueAsNumber,
|
|
104
103
|
"aria-valuetext": state.context.valueText,
|
|
105
|
-
onCompositionStart() {
|
|
106
|
-
send("INPUT.COMPOSITION_START")
|
|
107
|
-
},
|
|
108
|
-
onCompositionEnd() {
|
|
109
|
-
send("INPUT.COMPOSITION_END")
|
|
110
|
-
},
|
|
111
104
|
onFocus() {
|
|
112
105
|
send("INPUT.FOCUS")
|
|
113
106
|
},
|
|
@@ -132,7 +125,10 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
132
125
|
}
|
|
133
126
|
},
|
|
134
127
|
onKeyDown(event) {
|
|
135
|
-
if (
|
|
128
|
+
if (event.defaultPrevented) return
|
|
129
|
+
if (readOnly) return
|
|
130
|
+
const evt = getNativeEvent(event)
|
|
131
|
+
if (evt.isComposing) return
|
|
136
132
|
|
|
137
133
|
const step = getEventStep(event) * state.context.step
|
|
138
134
|
|
|
@@ -154,7 +150,6 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
154
150
|
event.preventDefault()
|
|
155
151
|
},
|
|
156
152
|
Enter() {
|
|
157
|
-
if (state.context.composing) return
|
|
158
153
|
send({ type: "INPUT.COMMIT", src: "enter" })
|
|
159
154
|
},
|
|
160
155
|
}
|
|
@@ -224,11 +219,11 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
224
219
|
scrubberProps: normalize.element({
|
|
225
220
|
...parts.scrubber.attrs,
|
|
226
221
|
dir: state.context.dir,
|
|
227
|
-
"data-disabled": dataAttr(
|
|
222
|
+
"data-disabled": dataAttr(disabled),
|
|
228
223
|
id: dom.getScrubberId(state.context),
|
|
229
224
|
role: "presentation",
|
|
230
225
|
onMouseDown(event) {
|
|
231
|
-
if (
|
|
226
|
+
if (disabled) return
|
|
232
227
|
|
|
233
228
|
const evt = getNativeEvent(event)
|
|
234
229
|
const point = getEventPoint(evt)
|
|
@@ -240,7 +235,7 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
|
|
|
240
235
|
event.preventDefault()
|
|
241
236
|
},
|
|
242
237
|
style: {
|
|
243
|
-
cursor:
|
|
238
|
+
cursor: disabled ? undefined : "ew-resize",
|
|
244
239
|
},
|
|
245
240
|
}),
|
|
246
241
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { choose, createMachine, guards } from "@zag-js/core"
|
|
2
2
|
import { addDomEvent, requestPointerLock } from "@zag-js/dom-event"
|
|
3
|
-
import { isSafari, raf } from "@zag-js/dom-query"
|
|
3
|
+
import { isSafari, observeAttributes, raf } from "@zag-js/dom-query"
|
|
4
4
|
import { trackFormControl } from "@zag-js/form-utils"
|
|
5
|
-
import { observeAttributes } from "@zag-js/mutation-observer"
|
|
6
5
|
import { clamp, decrement, increment, isAtMax, isAtMin, isWithinRange } from "@zag-js/number-utils"
|
|
7
6
|
import { callAll, compact, isEqual } from "@zag-js/utils"
|
|
8
7
|
import { recordCursor, restoreCursor } from "./cursor"
|
|
@@ -35,7 +34,6 @@ export function machine(userContext: UserDefinedContext) {
|
|
|
35
34
|
...ctx,
|
|
36
35
|
hint: null,
|
|
37
36
|
scrubberCursorPoint: null,
|
|
38
|
-
composing: false,
|
|
39
37
|
fieldsetDisabled: false,
|
|
40
38
|
formatter: createFormatter(ctx.locale || "en-US", ctx.formatOptions),
|
|
41
39
|
parser: createParser(ctx.locale || "en-US", ctx.formatOptions),
|
|
@@ -144,12 +142,6 @@ export function machine(userContext: UserDefinedContext) {
|
|
|
144
142
|
actions: ["setFormattedValue", "clearHint", "invokeOnBlur"],
|
|
145
143
|
},
|
|
146
144
|
],
|
|
147
|
-
"INPUT.COMPOSITION_START": {
|
|
148
|
-
actions: "setComposing",
|
|
149
|
-
},
|
|
150
|
-
"INPUT.COMPOSITION_END": {
|
|
151
|
-
actions: "clearComposing",
|
|
152
|
-
},
|
|
153
145
|
},
|
|
154
146
|
},
|
|
155
147
|
|
|
@@ -256,8 +248,11 @@ export function machine(userContext: UserDefinedContext) {
|
|
|
256
248
|
},
|
|
257
249
|
trackButtonDisabled(ctx, _evt, { send }) {
|
|
258
250
|
const btn = dom.getPressedTriggerEl(ctx, ctx.hint)
|
|
259
|
-
return observeAttributes(btn,
|
|
260
|
-
|
|
251
|
+
return observeAttributes(btn, {
|
|
252
|
+
attributes: ["disabled"],
|
|
253
|
+
callback() {
|
|
254
|
+
send({ type: "TRIGGER.PRESS_UP", src: "attr" })
|
|
255
|
+
},
|
|
261
256
|
})
|
|
262
257
|
},
|
|
263
258
|
attachWheelListener(ctx, _evt, { send }) {
|
|
@@ -397,12 +392,6 @@ export function machine(userContext: UserDefinedContext) {
|
|
|
397
392
|
const { x, y } = ctx.scrubberCursorPoint
|
|
398
393
|
cursorEl.style.transform = `translate3d(${x}px, ${y}px, 0px)`
|
|
399
394
|
},
|
|
400
|
-
setComposing(ctx) {
|
|
401
|
-
ctx.composing = true
|
|
402
|
-
},
|
|
403
|
-
clearComposing(ctx) {
|
|
404
|
-
ctx.composing = false
|
|
405
|
-
},
|
|
406
395
|
setFormatterAndParser(ctx) {
|
|
407
396
|
if (!ctx.locale) return
|
|
408
397
|
ctx.formatter = createFormatter(ctx.locale, ctx.formatOptions)
|
|
@@ -232,11 +232,6 @@ interface PrivateContext {
|
|
|
232
232
|
* The number i18n parser
|
|
233
233
|
*/
|
|
234
234
|
parser: NumberParser
|
|
235
|
-
/**
|
|
236
|
-
* @internal
|
|
237
|
-
* Whether the input is composing
|
|
238
|
-
*/
|
|
239
|
-
composing: boolean
|
|
240
235
|
/**
|
|
241
236
|
* @internal
|
|
242
237
|
* Whether the checkbox's fieldset is disabled
|
|
@@ -263,15 +258,15 @@ export interface MachineApi<T extends PropTypes = PropTypes> {
|
|
|
263
258
|
/**
|
|
264
259
|
* Whether the input is focused.
|
|
265
260
|
*/
|
|
266
|
-
|
|
261
|
+
focused: boolean
|
|
267
262
|
/**
|
|
268
263
|
* Whether the input is invalid.
|
|
269
264
|
*/
|
|
270
|
-
|
|
265
|
+
invalid: boolean
|
|
271
266
|
/**
|
|
272
267
|
* Whether the input value is empty.
|
|
273
268
|
*/
|
|
274
|
-
|
|
269
|
+
empty: boolean
|
|
275
270
|
/**
|
|
276
271
|
* The formatted value of the input.
|
|
277
272
|
*/
|
|
@@ -308,6 +303,7 @@ export interface MachineApi<T extends PropTypes = PropTypes> {
|
|
|
308
303
|
* Function to focus the input.
|
|
309
304
|
*/
|
|
310
305
|
focus(): void
|
|
306
|
+
|
|
311
307
|
rootProps: T["element"]
|
|
312
308
|
labelProps: T["label"]
|
|
313
309
|
controlProps: T["element"]
|