raqam 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.d.ts CHANGED
@@ -1,62 +1,19 @@
1
- import { g as UseNumberFieldStateOptions, N as NumberFieldState, U as UseNumberFieldProps, b as NumberFieldAria, c as NumberFieldRootProps, R as RenderProp, e as ScrubAreaProps, d as ScrubAreaCursorProps } from './types-B2ZqkJI-.js';
2
- import * as react_jsx_runtime from 'react/jsx-runtime';
3
1
  import * as React$1 from 'react';
4
2
  import React__default, { RefObject } from 'react';
3
+ import { N as NumberFieldState, b as NumberFieldAria, U as UseNumberFieldProps, c as NumberFieldRootProps, R as RenderProp, e as ScrubAreaProps, d as ScrubAreaCursorProps, g as UseNumberFieldStateOptions } from './types-B2ZqkJI-.js';
5
4
 
6
- declare function useNumberFieldState(options: UseNumberFieldStateOptions): NumberFieldState;
7
-
8
- declare function useNumberField(props: UseNumberFieldProps, state: NumberFieldState, inputRef: React.RefObject<HTMLInputElement | null>): NumberFieldAria;
9
-
10
- type FormatOptions = Pick<UseNumberFieldStateOptions, "locale" | "formatOptions" | "prefix" | "suffix" | "minimumFractionDigits" | "maximumFractionDigits" | "fixedDecimalScale">;
11
- /**
12
- * Lightweight display-only formatting hook. Returns the formatted string for
13
- * a numeric value using the same Intl.NumberFormat engine as the full input.
14
- *
15
- * Use this when you need to display a formatted number in a read-only context
16
- * (table cells, summaries, labels) without the overhead of a full input state machine.
17
- *
18
- * @example
19
- * const price = useNumberFieldFormat(1234567.89, {
20
- * locale: 'en-US',
21
- * formatOptions: { style: 'currency', currency: 'USD' },
22
- * })
23
- * // price === "$1,234,567.89"
24
- *
25
- * @example
26
- * const pct = useNumberFieldFormat(0.4267, {
27
- * formatOptions: { style: 'percent', maximumFractionDigits: 1 },
28
- * })
29
- * // pct === "42.7%"
30
- */
31
- declare function useNumberFieldFormat(value: number | null, options?: FormatOptions): string;
32
-
33
- interface UseControllableStateOptions<T> {
34
- value?: T;
35
- defaultValue?: T;
36
- onChange?: (value: T) => void;
5
+ interface NumberFieldContextValue {
6
+ state: NumberFieldState;
7
+ aria: NumberFieldAria;
8
+ inputRef: RefObject<HTMLInputElement | null>;
9
+ props: UseNumberFieldProps;
37
10
  }
38
- type ControllableSetter<T> = (next: T | ((prev: T | undefined) => T)) => void;
11
+ declare const NumberFieldContext: React$1.Context<NumberFieldContextValue | null>;
39
12
  /**
40
- * Manages controlled vs uncontrolled state.
41
- * - If `value` is provided, the component is controlled.
42
- * - Otherwise it manages its own state starting from `defaultValue`.
43
- * Warns in dev mode if the component switches between controlled/uncontrolled.
44
- *
45
- * Overloads narrow the returned value to `T` (no `| undefined`) when a `value`
46
- * or `defaultValue` is supplied, so callers that guarantee one don't have to
47
- * null-check the result.
13
+ * Hook for sub-components to access the NumberField context.
14
+ * Throws if used outside NumberField.Root.
48
15
  */
49
- declare function useControllableState<T>(options: {
50
- value: T;
51
- defaultValue?: T;
52
- onChange?: (value: T) => void;
53
- }): [T, ControllableSetter<T>];
54
- declare function useControllableState<T>(options: {
55
- value?: T;
56
- defaultValue: T;
57
- onChange?: (value: T) => void;
58
- }): [T, ControllableSetter<T>];
59
- declare function useControllableState<T>(options: UseControllableStateOptions<T>): [T | undefined, ControllableSetter<T>];
16
+ declare function useNumberFieldContext(): NumberFieldContextValue;
60
17
 
61
18
  interface LabelProps extends React__default.LabelHTMLAttributes<HTMLLabelElement> {
62
19
  render?: RenderProp;
@@ -93,7 +50,7 @@ declare const NumberField: {
93
50
  Input: React__default.ForwardRefExoticComponent<InputProps & React__default.RefAttributes<HTMLInputElement>>;
94
51
  Increment: React__default.ForwardRefExoticComponent<IncrementProps & React__default.RefAttributes<HTMLButtonElement>>;
95
52
  Decrement: React__default.ForwardRefExoticComponent<DecrementProps & React__default.RefAttributes<HTMLButtonElement>>;
96
- HiddenInput: () => react_jsx_runtime.JSX.Element | null;
53
+ HiddenInput: () => React__default.JSX.Element | null;
97
54
  ScrubArea: React__default.ForwardRefExoticComponent<ScrubAreaProps & React__default.RefAttributes<HTMLSpanElement>>;
98
55
  ScrubAreaCursor: React__default.ForwardRefExoticComponent<ScrubAreaCursorProps & React__default.RefAttributes<HTMLSpanElement>>;
99
56
  Description: React__default.ForwardRefExoticComponent<DescriptionProps & React__default.RefAttributes<HTMLParagraphElement>>;
@@ -101,17 +58,59 @@ declare const NumberField: {
101
58
  Formatted: React__default.ForwardRefExoticComponent<FormattedProps & React__default.RefAttributes<HTMLSpanElement>>;
102
59
  };
103
60
 
104
- interface NumberFieldContextValue {
105
- state: NumberFieldState;
106
- aria: NumberFieldAria;
107
- inputRef: RefObject<HTMLInputElement | null>;
108
- props: UseNumberFieldProps;
61
+ interface UseControllableStateOptions<T> {
62
+ value?: T;
63
+ defaultValue?: T;
64
+ onChange?: (value: T) => void;
109
65
  }
110
- declare const NumberFieldContext: React$1.Context<NumberFieldContextValue | null>;
66
+ type ControllableSetter<T> = (next: T | ((prev: T | undefined) => T)) => void;
111
67
  /**
112
- * Hook for sub-components to access the NumberField context.
113
- * Throws if used outside NumberField.Root.
68
+ * Manages controlled vs uncontrolled state.
69
+ * - If `value` is provided, the component is controlled.
70
+ * - Otherwise it manages its own state starting from `defaultValue`.
71
+ * Warns in dev mode if the component switches between controlled/uncontrolled.
72
+ *
73
+ * Overloads narrow the returned value to `T` (no `| undefined`) when a `value`
74
+ * or `defaultValue` is supplied, so callers that guarantee one don't have to
75
+ * null-check the result.
114
76
  */
115
- declare function useNumberFieldContext(): NumberFieldContextValue;
77
+ declare function useControllableState<T>(options: {
78
+ value: T;
79
+ defaultValue?: T;
80
+ onChange?: (value: T) => void;
81
+ }): [T, ControllableSetter<T>];
82
+ declare function useControllableState<T>(options: {
83
+ value?: T;
84
+ defaultValue: T;
85
+ onChange?: (value: T) => void;
86
+ }): [T, ControllableSetter<T>];
87
+ declare function useControllableState<T>(options: UseControllableStateOptions<T>): [T | undefined, ControllableSetter<T>];
88
+
89
+ declare function useNumberField(props: UseNumberFieldProps, state: NumberFieldState, inputRef: React.RefObject<HTMLInputElement | null>): NumberFieldAria;
90
+
91
+ type FormatOptions = Pick<UseNumberFieldStateOptions, "locale" | "formatOptions" | "prefix" | "suffix" | "minimumFractionDigits" | "maximumFractionDigits" | "fixedDecimalScale">;
92
+ /**
93
+ * Lightweight display-only formatting hook. Returns the formatted string for
94
+ * a numeric value using the same Intl.NumberFormat engine as the full input.
95
+ *
96
+ * Use this when you need to display a formatted number in a read-only context
97
+ * (table cells, summaries, labels) without the overhead of a full input state machine.
98
+ *
99
+ * @example
100
+ * const price = useNumberFieldFormat(1234567.89, {
101
+ * locale: 'en-US',
102
+ * formatOptions: { style: 'currency', currency: 'USD' },
103
+ * })
104
+ * // price === "$1,234,567.89"
105
+ *
106
+ * @example
107
+ * const pct = useNumberFieldFormat(0.4267, {
108
+ * formatOptions: { style: 'percent', maximumFractionDigits: 1 },
109
+ * })
110
+ * // pct === "42.7%"
111
+ */
112
+ declare function useNumberFieldFormat(value: number | null, options?: FormatOptions): string;
113
+
114
+ declare function useNumberFieldState(options: UseNumberFieldStateOptions): NumberFieldState;
116
115
 
117
116
  export { NumberField, NumberFieldContext, type NumberFieldContextValue, useControllableState, useNumberField, useNumberFieldContext, useNumberFieldFormat, useNumberFieldState };
package/dist/react.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- export{i as NumberField,g as NumberFieldContext,a as useControllableState,d as useNumberField,h as useNumberFieldContext,e as useNumberFieldFormat,b as useNumberFieldState}from'./chunk-G7ACJUKH.js';import'./chunk-P6AWGQPY.js';import'./chunk-4GNLVHAM.js';//# sourceMappingURL=react.js.map
2
+ export{h as NumberField,a as NumberFieldContext,e as useControllableState,d as useNumberField,b as useNumberFieldContext,i as useNumberFieldFormat,f as useNumberFieldState}from'./chunk-NIPT3LT6.js';import'./chunk-YKK5OGE4.js';import'./chunk-4GNLVHAM.js';//# sourceMappingURL=react.js.map
3
3
  //# sourceMappingURL=react.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "raqam",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "The definitive React number input: live formatting, full i18n, headless, accessible",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -14,10 +14,10 @@
14
14
  "types": "./dist/index.d.ts",
15
15
  "author": "47vigen",
16
16
  "license": "MIT",
17
- "homepage": "https://raqam.vercel.app",
17
+ "homepage": "https://raqam.47vigen.com/",
18
18
  "repository": {
19
19
  "type": "git",
20
- "url": "https://github.com/47vigen/raqam"
20
+ "url": "git+https://github.com/47vigen/raqam.git"
21
21
  },
22
22
  "bugs": {
23
23
  "url": "https://github.com/47vigen/raqam/issues"
@@ -133,36 +133,36 @@
133
133
  "react-dom": "^18.0.0 || ^19.0.0"
134
134
  },
135
135
  "devDependencies": {
136
- "@biomejs/biome": "^1.9.4",
137
- "@changesets/cli": "^2.27.9",
138
- "@commitlint/cli": "^19.8.0",
139
- "@commitlint/config-conventional": "^19.8.0",
140
- "@playwright/experimental-ct-react": "^1.59.1",
141
- "@playwright/test": "^1.59.1",
142
- "@size-limit/preset-small-lib": "^11.1.6",
143
- "@storybook/react": "^10.3.4",
144
- "@storybook/react-vite": "^10.3.4",
145
- "@testing-library/jest-dom": "^6.6.3",
146
- "@testing-library/react": "^16.3.0",
136
+ "@biomejs/biome": "^2.5.1",
137
+ "@changesets/cli": "^2.31.0",
138
+ "@commitlint/cli": "^21.1.0",
139
+ "@commitlint/config-conventional": "^21.1.0",
140
+ "@playwright/experimental-ct-react": "^1.61.1",
141
+ "@playwright/test": "^1.61.1",
142
+ "@size-limit/preset-small-lib": "^12.1.0",
143
+ "@storybook/react": "^10.4.6",
144
+ "@storybook/react-vite": "^10.4.6",
145
+ "@testing-library/jest-dom": "^6.9.1",
146
+ "@testing-library/react": "^16.3.2",
147
147
  "@testing-library/user-event": "^14.6.1",
148
- "@types/react": "^19.1.0",
149
- "@types/react-dom": "^19.1.2",
150
- "@vitejs/plugin-react": "^4.4.1",
151
- "@vitest/coverage-v8": "^3.2.4",
152
- "chromatic": "^11.0.0",
148
+ "@types/react": "^19.2.17",
149
+ "@types/react-dom": "^19.2.3",
150
+ "@vitejs/plugin-react": "^5.2.0",
151
+ "@vitest/coverage-v8": "^4.1.9",
152
+ "chromatic": "^17.7.1",
153
153
  "husky": "^9.1.7",
154
- "jest-axe": "^9.0.0",
155
- "jsdom": "^26.1.0",
156
- "lint-staged": "^15.5.0",
157
- "publint": "^0.2.12",
158
- "react": "^19.1.0",
159
- "react-dom": "^19.1.0",
160
- "react-hook-form": "^7.72.1",
161
- "size-limit": "^11.1.6",
162
- "storybook": "^10.3.4",
163
- "tsup": "^8.4.0",
164
- "typescript": "^5.8.3",
165
- "vitest": "^3.1.1"
154
+ "jest-axe": "^10.0.0",
155
+ "jsdom": "^29.1.1",
156
+ "lint-staged": "^17.0.8",
157
+ "publint": "^0.3.21",
158
+ "react": "^19.2.7",
159
+ "react-dom": "^19.2.7",
160
+ "react-hook-form": "^7.80.0",
161
+ "size-limit": "^12.1.0",
162
+ "storybook": "^10.4.6",
163
+ "tsup": "^8.5.1",
164
+ "typescript": "^5.9.3",
165
+ "vitest": "^4.1.9"
166
166
  },
167
167
  "lint-staged": {
168
168
  "src/**/*.{ts,tsx}": [
@@ -1,2 +0,0 @@
1
- import {a,b,c,e}from'./chunk-P6AWGQPY.js';import {b as b$1,c as c$1}from'./chunk-4GNLVHAM.js';import ot,{createContext,forwardRef,useRef,useMemo,useCallback,useState,useId,useEffect,useContext,useLayoutEffect}from'react';import {jsx}from'react/jsx-runtime';var wt=typeof process<"u"&&typeof process.env<"u"&&process.env.NODE_ENV==="production";function lt({value:t,defaultValue:e,onChange:r}){let n=t!==void 0,i=useRef(n);!wt&&i.current!==n&&console.warn(`[raqam] Component is changing from ${i.current?"controlled":"uncontrolled"} to ${n?"controlled":"uncontrolled"}. Decide between using a controlled or uncontrolled component and don't switch.`);let[o,s]=useState(e),a=useCallback(v=>{let g=typeof v=="function"?v(n?t:o):v;n||s(g),r?.(g);},[n,t,o,r]);return [n?t:o,a]}function tt(t,e,r){let n=t;return e!==void 0&&Number.isFinite(e)&&(n=Math.max(n,e)),r!==void 0&&Number.isFinite(r)&&(n=Math.min(n,r)),n}function st(t,e){let r=Math.max(ct(t),ct(e));if(r>15)return t+e;let n=10**r,i=t*n,o=e*n;return !Number.isSafeInteger(Math.round(i))||!Number.isSafeInteger(Math.round(o))?t+e:Math.round(i+o)/n}function ct(t){if(!Number.isFinite(t))return 0;let e=String(t),r=e.indexOf("e");if(r!==-1){let i=Number(e.slice(r+1)),o=e.indexOf("."),s=o===-1?0:r-o-1;return Math.max(0,s-i)}let n=e.indexOf(".");return n===-1?0:e.length-n-1}function dt(t){let{locale:e,formatOptions:r,minValue:n,maxValue:i,step:o=1,largeStep:s,smallStep:a$1,allowNegative:v=true,allowDecimal:g=true,maximumFractionDigits:N,minimumFractionDigits:y,fixedDecimalScale:R,clampBehavior:x="blur",prefix:F,suffix:H,allowOutOfRange:I=false,validate:re,onRawChange:q,formatValue:M}=t,B=Number.isFinite(o)&&o>0?o:1,w=Number.isFinite(n)?n:void 0,l=Number.isFinite(i)?i:void 0,{effMinFrac:J,effMaxFrac:j,effFixedScale:le}=a({allowDecimal:g,minimumFractionDigits:y,maximumFractionDigits:N,fixedDecimalScale:R}),ie=useMemo(()=>b({locale:e,formatOptions:r,prefix:F,suffix:H,minimumFractionDigits:J,maximumFractionDigits:j,fixedDecimalScale:le}),[e,JSON.stringify(r),F,H,J,j,le]),S=useMemo(()=>c({locale:e,formatOptions:r,allowNegative:v,allowDecimal:g,prefix:F,suffix:H}),[e,JSON.stringify(r),v,g,F,H]),[V,X]=lt({value:t.value,defaultValue:t.defaultValue??null,onChange:t.onChange}),Q=useRef(t.value??t.defaultValue??null),_=useCallback(c=>M?M(Object.is(c,-0)?0:c):ie.format(Object.is(c,-0)?0:c),[ie,M]),pe=useMemo(()=>t.defaultValue!=null?_(t.defaultValue):t.value!=null?_(t.value):"",[]),[be,oe]=useState(pe),K=useRef(pe),Ie=useCallback(()=>K.current,[]),ve=useRef(pe),[ge,Re]=useState(t.defaultValue!=null?String(t.defaultValue):null),Pe=useCallback(c=>{if(!re)return {validationState:"valid",validationError:null};let h=re(c);return h===false?{validationState:"invalid",validationError:null}:typeof h=="string"?{validationState:"invalid",validationError:h}:{validationState:"valid",validationError:null}},[re]),Me=useMemo(()=>{let c=t.defaultValue??t.value??null;return Pe(c??null)},[]),[Oe,Se]=useState(Me.validationState),[Ae,C]=useState(Me.validationError),[qe,ke]=useState(false),[Z,U]=useState(false),se=useRef("input"),O=useCallback(c=>{se.current=c;},[]),_e=useCallback(()=>se.current,[]),ee=t.value,Be=useRef(ee);if(!Object.is(Be.current,ee)&&(Be.current=ee,!Object.is(ee,Q.current))){Q.current=ee;let c=Object.is(ee,-0)?0:ee,h=c!=null&&Number.isFinite(c),D=h?_(c):"";ve.current=D,K.current=D,oe(D),Re(h?String(c):null);}let Ve=`${e??""}|${JSON.stringify(r??{})}|${F??""}|${H??""}|${J??""}|${j??""}|${le??""}`,je=useRef(Ve);if(je.current!==Ve&&(je.current=Ve,V!=null&&Number.isFinite(V)&&!Z)){let c=_(V);c!==be&&(oe(c),ve.current=c,K.current=c);}let ce=useCallback(c=>{let{validationState:h,validationError:D}=Pe(c);Se(h),C(D);},[Pe]),Je=useCallback((c,h)=>{let D=S.parse(c),T=h!==void 0?h:D.value;if(x==="strict"&&!I&&T!==null&&(w!==void 0&&T<w||l!==void 0&&T>l))return;K.current=c,oe(c),Q.current=T,X(T);let $=null;if(T!==null){let Le=S.strip(c);/\d/.test(Le)&&Number(Le)===T?$=T===0&&Le.startsWith("-")?Le.slice(1):Le:$=String(T);}Re($),q?.($),ce(T);},[S,x,I,w,l,X,q,ce]),te=useCallback(c=>{let h=c!==null&&!Number.isFinite(c)?null:c,D=h!=null?_(h):"";if(K.current=D,Q.current=h,X(h),oe(D),ve.current=D,h!=null){let T=String(h);Re(T),q?.(T);}else Re(null),q?.(null);ce(h);},[_,X,q,ce]),We=useCallback(()=>{if(V==null||!Number.isFinite(V))return K.current="",oe(""),ve.current="",null;let c=V;x==="blur"&&!I&&(c=tt(V,w,l)),Object.is(c,-0)&&(c=0);let h=_(c);K.current=h,oe(h),ve.current=h;let D=c;if(!M){let T=S.parse(h).value;T!==null&&Number.isFinite(T)&&_(T)===h&&(D=T);}return D!==V&&(Q.current=D,X(D)),ce(D),D},[V,x,I,w,l,S,_,M,X,ce]),ae=V!=null&&Number.isFinite(V)?V:null,Ge=Number.isFinite(s)&&s>0?s:B*10,Xe=Number.isFinite(a$1)&&a$1>0?a$1:B*.1,Qe=!t.disabled&&!t.readOnly&&(I||l===void 0||(ae??Number.NEGATIVE_INFINITY)<l),Ze=!t.disabled&&!t.readOnly&&(I||w===void 0||(ae??Number.POSITIVE_INFINITY)>w),Ke=useCallback(c=>{let T=st(ae??0,c??B),$=I?T:tt(T,w,l);te($);},[ae,B,w,l,I,te]),at=useCallback(c=>{let T=st(ae??0,-(c??B)),$=I?T:tt(T,w,l);te($);},[ae,B,w,l,I,te]),De=useCallback(()=>{l!==void 0&&te(l);},[l,te]),Te=useCallback(()=>{w!==void 0&&te(w);},[w,te]);return {inputValue:be,numberValue:ae,rawValue:ge,canIncrement:Qe,canDecrement:Ze,isScrubbing:qe,setIsScrubbing:ke,isFocused:Z,setIsFocused:U,validationState:Oe,validationError:Ae,_setLastChangeReason:O,_getLastChangeReason:_e,_getLatestDisplay:Ie,setInputValue:Je,setNumberValue:te,commit:We,increment:Ke,decrement:at,incrementToMax:De,decrementToMin:Te,options:{...t,step:B,largeStep:Ge,smallStep:Xe,minValue:w,maxValue:l}}}function nt(t,e={}){let{delay:r=400,interval:n=200,disabled:i=false}=e,o=useRef(t);useEffect(()=>{o.current=t;});let s=useRef(r);useEffect(()=>{s.current=r;});let a=useRef(n);useEffect(()=>{a.current=n;});let v=useRef(i);useEffect(()=>{v.current=i;});let g=useRef(null),N=useRef(null),y=useRef(false),R=useCallback(()=>{y.current=false,g.current!==null&&(clearTimeout(g.current),g.current=null),N.current!==null&&(clearTimeout(N.current),N.current=null);},[]),x=useCallback(M=>{if(!y.current||v.current){R();return}o.current();let B=Math.max(50,Math.floor(M/2));N.current=setTimeout(()=>{x(B);},M);},[R]),F=useCallback(M=>{i||M.button!==0&&M.pointerType==="mouse"||(o.current(),y.current=true,g.current=setTimeout(()=>{x(a.current);},s.current));},[i,x]),H=useCallback(M=>{M.preventDefault(),R();},[R]),I=useCallback(M=>{R();},[R]),re=useCallback(M=>{R();},[R]),q=useCallback(M=>{R();},[R]);return useEffect(()=>{i&&R();},[i,R]),useEffect(()=>R,[R]),{onPointerDown:F,onPointerUp:H,onPointerLeave:I,onPointerCancel:re,onLostPointerCapture:q}}var mt=typeof window<"u"?useLayoutEffect:useEffect;function pt(t){return t.replace(/[.*+?^${}()|[\]\\\-]/g,"\\$&")}function bt(t){let e=t?.getRootNode();return e&&"activeElement"in e?e.activeElement:typeof document<"u"?document.activeElement:null}function Bt(t){if(t.length>256)return null;let e=t.replace(/\s+/g,"");if(/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)[eE][+-]?\d+$/.test(e)){let n=Number(e);return Number.isFinite(n)?n:null}let r=e.match(/^([+-]?(?:\d+(?:\.\d*)?|\.\d+))(k|m|b|t|thousand|million|billion|trillion)$/i);if(r){let n={k:1e3,thousand:1e3,m:1e6,million:1e6,b:1e9,billion:1e9,t:1e12,trillion:1e12},i=Number(r[1])*n[r[2].toLowerCase()];return Number.isFinite(i)?i:null}return null}function vt(t,e$1,r){let{locale:n,formatOptions:i,minValue:o,maxValue:s,allowNegative:a$1=true,allowDecimal:v=true,allowMouseWheel:g=false,liveFormat:N=true,prefix:y,suffix:R,name:x,disabled:F,readOnly:H,required:I,onFocus:re,onBlur:q,maximumFractionDigits:M,minimumFractionDigits:B,fixedDecimalScale:w,copyBehavior:l="formatted",stepHoldDelay:J=400,stepHoldInterval:j=200,incrementLabel:le="Increase",decrementLabel:ie="Decrease",formatValue:S,parseValue:V,onValueCommitted:X}=t,Q=Number.isFinite(o)?o:void 0,_=Number.isFinite(s)?s:void 0,pe=i?.notation,be=N&&pe!=="compact"&&pe!=="scientific"&&pe!=="engineering",{step:oe=1,largeStep:K=oe*10,smallStep:Ie=oe*.1}=e$1.options,ve=useId(),ge=t.id??`raqam-${ve}`,Re=`${ge}-label`,Pe=`${ge}-description`,Me=`${ge}-error`,{effMinFrac:Oe,effMaxFrac:Se,effFixedScale:Ae}=a({allowDecimal:v,minimumFractionDigits:B,maximumFractionDigits:M,fixedDecimalScale:w}),C=useMemo(()=>b({locale:n,formatOptions:i,prefix:y,suffix:R,minimumFractionDigits:Oe,maximumFractionDigits:Se,fixedDecimalScale:Ae}),[n,JSON.stringify(i),y,R,Oe,Se,Ae]),qe=i?.style==="percent",ke=v?qe?20:Se:0,Z=useMemo(()=>b({locale:n,formatOptions:i,prefix:y,suffix:R,minimumFractionDigits:0,maximumFractionDigits:ke,fixedDecimalScale:false}),[n,JSON.stringify(i),y,R,ke]),U=useMemo(()=>c({locale:n,formatOptions:i,allowNegative:a$1,allowDecimal:v,prefix:y,suffix:R}),[n,JSON.stringify(i),a$1,v,y,R]),se=useCallback((u,f)=>{let E=C.getLocaleInfo(),d=f.lastIndexOf(E.decimalSeparator);if(d===-1&&E.decimalSeparator!=="."&&E.groupingSeparator!=="."&&(d=f.lastIndexOf(".")),d===-1||!/\d/.test(b$1(f.slice(0,d))))return null;let L=b$1(f.slice(d+1)).match(/^\d+/);if(!L)return null;let m=Math.min(L[0].length,Se??20,20);return m===0?null:b({locale:n,formatOptions:i,prefix:y,suffix:R,minimumFractionDigits:m,maximumFractionDigits:m}).format(u)},[C,n,JSON.stringify(i),y,R,Se]),O=useRef(null),_e=useRef(e$1);_e.current=e$1,mt(()=>{O.current!==null&&r.current&&bt(r.current)===r.current&&(r.current.setSelectionRange(O.current,O.current),O.current=null);},[e$1.inputValue,r]),useEffect(()=>{let u=r.current;if(!u||!g)return;let f=E=>{if(F||H||bt(u)!==u)return;E.preventDefault();let d=_e.current;d._setLastChangeReason("wheel"),E.deltaY<0?d.increment():d.decrement();};return u.addEventListener("wheel",f,{passive:false}),()=>u.removeEventListener("wheel",f)},[g,F,H,r]);let ee=useRef(false),Be=useCallback(()=>{ee.current=true;},[]),Ve=useCallback(u=>{ee.current=false;let f=u.currentTarget.value,E=C.getLocaleInfo(),d=b$1(f),L,m;if(V){let p=V(d);m=p.value,p.isIntermediate?L=d:p.value!==null&&S?L=S(p.value):p.value!==null?L=C.format(p.value):L=d,O.current=L.length;}else if(be){let p=U.parse(d);p.isIntermediate?L=c$1(d,E.zero):p.value!==null?L=S?S(p.value):Z.format(p.value):L=d===""?"":d,O.current=e(f,f.length,L,E,"insertCompositionText");}else L=d,O.current=d.length;e$1._setLastChangeReason("input"),e$1.setInputValue(L,m);},[C,Z,U,be,e$1,S,V]),je=useCallback(u=>{let f=u.target.value,E=u.target.selectionStart??f.length,d=u.nativeEvent.inputType,L=C.getLocaleInfo();if(ee.current){e$1.setInputValue(f);return}let m=b$1(f);a$1||(m=m.split("-").join("").split(L.minusSign).join("")),v?L.decimalSeparator!=="."&&L.groupingSeparator!=="."&&(m=m.replace(/\./g,(A,b,P)=>/\d/.test(P[b-1]??"")||/\d/.test(P[b+1]??"")?L.decimalSeparator:".")):m=m.split(".").join("").split(L.decimalSeparator).join("");let p,de;if(V){let A=V(m);de=A.value,A.isIntermediate?p=m:A.value!==null?p=S?S(A.value):C.format(A.value):m===""?p="":p=m,O.current=p.length;}else if(be){let A=U.parse(m);if(A.isIntermediate)p=(!S&&A.value!==null?se(A.value,m):null)??c$1(m,L.zero);else if(A.value!==null)if(S)p=S(A.value);else {p=Z.format(A.value);let b=U.parse(p).value;de=b!==null&&Number.isFinite(b)&&Z.format(b)===p?b:A.value;}else m===""||!/\d/.test(m)?p="":p=m;S?O.current=p.length:O.current=e(f,E,p,L,d);}else p=m,O.current=E;e$1._setLastChangeReason(p===""?"clear":"input"),e$1.setInputValue(p,de);},[C,Z,U,be,e$1,S,V,se]),ce=useCallback(u=>{u.preventDefault();let f=u.clipboardData.getData("text/plain");if(!f||f.length>1e3)return;let E=f.replace(/[€$£¥₹₺₽﷼฿₩¢₦₨₪₫₱]/g,"").trim(),d=b$1(E);if(!a$1){let P=C.getLocaleInfo();d=d.split("-").join("").split(P.minusSign).join("");}if(!v){let P=C.getLocaleInfo();d=d.split(".").join("").split(P.decimalSeparator).join("");}if(e$1._setLastChangeReason("paste"),V){let P=V(d);if(P.value!==null){let k=S?S(P.value):C.format(P.value);e$1.setInputValue(k,P.value),O.current=k.length;}return}let L=Bt(d);if(L!==null){let k=i?.style==="percent"?L/100:L,ye=S?S(k):C.format(k);e$1.setInputValue(ye,k),O.current=ye.length;return}let m=U.parse(d);if(m.value!==null){let P=C.format(m.value);e$1.setInputValue(P,m.value),O.current=P.length;return}let p=C.getLocaleInfo(),de=new RegExp(`[^0-9${pt(p.decimalSeparator)}${pt(p.minusSign)}-]`,"g"),A=d.replace(de,""),b=U.parse(A);if(b.value!==null){let P=C.format(b.value);e$1.setInputValue(P,b.value),O.current=P.length;}},[U,C,e$1,S,V]),Je=useCallback(u=>{if(l==="formatted")return;u.preventDefault();let f=String(e$1.numberValue??"");u.clipboardData.setData("text/plain",f);},[l,e$1.numberValue]),te=useCallback(u=>{if(l==="formatted")return;u.preventDefault();let f=String(e$1.numberValue??"");u.clipboardData.setData("text/plain",f),e$1._setLastChangeReason("clear"),e$1.setInputValue("");},[l,e$1]),We=useCallback(u=>{if(F||H)return;let f=u.key;if(!u.metaKey&&!u.ctrlKey&&!u.altKey&&v){let E=C.getLocaleInfo();if(f===E.decimalSeparator||f==="."&&E.decimalSeparator!=="."&&E.groupingSeparator!=="."){let L=r.current;if(L){let m=L.value.indexOf(E.decimalSeparator);if(m!==-1){u.preventDefault(),L.setSelectionRange(m+1,m+1);return}}}}if(f==="Backspace"&&!u.shiftKey&&!u.altKey&&!u.metaKey&&!u.ctrlKey){let E=r.current;if(E){let d=E.selectionStart??0,L=E.selectionEnd??d,m=E.value,p=C.getLocaleInfo();if(d===L&&d>=2&&m[d-1]===p.groupingSeparator){u.preventDefault();let b=m.slice(0,d-2)+m.slice(d),P=U.parse(b);e$1._setLastChangeReason("input");let k;P.value!==null?(k=se(P.value,b)??Z.format(P.value),e$1.setInputValue(k,P.value)):(k=b,b===""&&e$1._setLastChangeReason("clear"),e$1.setInputValue(b)),O.current=e(b,d-2,k,p,"deleteContentBackward");return}let de=b=>b!==void 0&&/\p{Nd}/u.test(b),A=b=>b!==void 0&&!de(b)&&b!==p.decimalSeparator&&b!==p.minusSign&&b!=="-";if(d===L&&d===m.length&&d>=1&&A(m[d-1])){let b=d;for(;b>0&&A(m[b-1]);)b--;if(b>0&&de(m[b-1])){u.preventDefault();let P=m.slice(0,b-1)+m.slice(b),k=U.parse(P);e$1._setLastChangeReason("input");let ye;k.value!==null&&/\p{Nd}/u.test(P)?(ye=se(k.value,P)??Z.format(k.value),e$1.setInputValue(ye,k.value)):(ye="",e$1._setLastChangeReason("clear"),e$1.setInputValue("")),O.current=e(P,b-1,ye,p,"deleteContentBackward");return}}}}if(f==="ArrowUp"||f==="ArrowDown"){u.preventDefault();let E=f==="ArrowUp"?1:-1;e$1._setLastChangeReason("keyboard"),u.shiftKey?E>0?e$1.increment(K):e$1.decrement(K):u.metaKey||u.ctrlKey?E>0?e$1.increment(Ie):e$1.decrement(Ie):E>0?e$1.increment():e$1.decrement();return}if(f==="PageUp"){u.preventDefault(),e$1._setLastChangeReason("keyboard"),e$1.increment(K);return}if(f==="PageDown"){u.preventDefault(),e$1._setLastChangeReason("keyboard"),e$1.decrement(K);return}if(f==="Home"){Q!==void 0&&(u.preventDefault(),e$1._setLastChangeReason("keyboard"),e$1.decrementToMin());return}if(f==="End"){_!==void 0&&(u.preventDefault(),e$1._setLastChangeReason("keyboard"),e$1.incrementToMax());return}if(f==="Enter"){e$1._setLastChangeReason("blur");let E=e$1.commit();X?.(E,{reason:"keyboard"});return}},[F,H,e$1,K,Ie,Q,_,C,Z,U,r,v,se,X]),ae=useCallback(u=>{e$1.setIsFocused(false),e$1._setLastChangeReason("blur");let f=e$1.commit();X?.(f,{reason:"blur"}),q?.(u);},[e$1,q,X]),Ge=useCallback(u=>{e$1.setIsFocused(true),re?.(u);},[e$1,re]),Xe=nt(()=>{e$1._setLastChangeReason("increment"),e$1.increment();},{delay:J,interval:j,disabled:F||!e$1.canIncrement}),Qe=nt(()=>{e$1._setLastChangeReason("decrement"),e$1.decrement();},{delay:J,interval:j,disabled:F||!e$1.canDecrement}),Ze=useMemo(()=>{if(e$1.numberValue!=null)return S?S(e$1.numberValue):C.format(e$1.numberValue)},[e$1.numberValue,C,S]),Ke=C.getLocaleInfo(),De=e$1.numberValue!==null&&(Q!==void 0&&e$1.numberValue<Q||_!==void 0&&e$1.numberValue>_)||e$1.validationState==="invalid",Te=useRef(0),[c$2,h]=useState(false),D=useCallback(u=>{u?(Te.current+=1,h(true)):Te.current>0&&(Te.current-=1,Te.current===0&&h(false));},[]),T=t["aria-labelledby"]??(t["aria-label"]?void 0:c$2?Re:void 0),$=useRef(0),[Le,ut]=useState(false),Pt=useCallback(u=>{u?($.current+=1,ut(true)):$.current>0&&($.current-=1,$.current===0&&ut(false));},[]),Tt=[t["aria-describedby"],Le?Pe:null].filter(Boolean).join(" ")||void 0,xt={id:Re,htmlFor:ge,ref:D},Ft={role:"group","aria-labelledby":T},Ct={id:ge,type:"text",inputMode:"decimal",role:"spinbutton",autoComplete:"off",autoCorrect:"off",spellCheck:false,"aria-label":t["aria-label"],"aria-labelledby":T,"aria-describedby":Tt,"aria-valuenow":e$1.numberValue??void 0,"aria-valuemin":Q,"aria-valuemax":_,"aria-valuetext":Ze,"aria-disabled":F||void 0,"aria-readonly":H||void 0,"aria-required":I||void 0,"aria-invalid":De?true:void 0,"aria-errormessage":De&&e$1.validationError?Me:void 0,disabled:F,readOnly:H,required:I,value:e$1.inputValue,onChange:je,onKeyDown:We,onBlur:ae,onFocus:Ge,onPaste:ce,onCopy:l!=="formatted"?Je:void 0,onCut:l!=="formatted"?te:void 0,onCompositionStart:Be,onCompositionEnd:Ve,style:Ke.isRTL?{direction:"ltr",textAlign:"right",unicodeBidi:"plaintext"}:void 0,"data-disabled":F?"":void 0,"data-readonly":H?"":void 0,"data-required":I?"":void 0,"data-invalid":De?"":void 0,"data-rtl":Ke.isRTL?"":void 0},Nt=x?{type:"hidden",name:x,value:e$1.numberValue??"","aria-hidden":true}:null,It={type:"button",tabIndex:-1,"aria-label":le,disabled:F||!e$1.canIncrement,...Xe,"data-disabled":F||!e$1.canIncrement?"":void 0},Mt={type:"button",tabIndex:-1,"aria-label":ie,disabled:F||!e$1.canDecrement,...Qe,"data-disabled":F||!e$1.canDecrement?"":void 0};return {labelProps:xt,groupProps:Ft,inputProps:Ct,hiddenInputProps:Nt,incrementButtonProps:It,decrementButtonProps:Mt,descriptionProps:{id:Pe,ref:Pt},errorMessageProps:{id:Me,role:"alert","aria-live":"polite"}}}function Mn(t,e={}){let{locale:r,formatOptions:n,prefix:i,suffix:o,minimumFractionDigits:s,maximumFractionDigits:a,fixedDecimalScale:v}=e,g=useMemo(()=>b({locale:r,formatOptions:n,prefix:i,suffix:o,minimumFractionDigits:s,maximumFractionDigits:a,fixedDecimalScale:v}),[r,JSON.stringify(n),i,o,s,a,v]);return useMemo(()=>t==null?"":g.format(t),[t,g])}function Lt(t,e={}){let{direction:r="horizontal",pixelSensitivity:n=4,label:i="Scrub to change value"}=e,[o,s]=useState(false),a=useRef(t);a.current=t;let v=useRef(r);v.current=r;let g=useRef(n);g.current=n;let N=useRef(false),y=useRef(0),R=useRef(null),x=useRef({x:0,y:0}),[F,H]=useState({x:0,y:0}),I=useRef(l=>{if(!N.current)return;let J=x.current.x+l.movementX,j=x.current.y+l.movementY;x.current={x:J,y:j},H({x:J,y:j});let le=v.current,ie=0;le==="horizontal"?ie=l.movementX:le==="vertical"?ie=-l.movementY:ie=Math.abs(l.movementX)>=Math.abs(l.movementY)?l.movementX:-l.movementY,y.current+=ie;let S=Math.max(1,g.current);for((y.current>=S||y.current<=-S)&&a.current._setLastChangeReason("scrub");y.current>=S;)a.current.increment(),y.current-=S;for(;y.current<=-S;)a.current.decrement(),y.current+=S;}),re=useRef(()=>{document.pointerLockElement===R.current?(N.current=true,y.current=0,s(true),a.current.setIsScrubbing(true),document.addEventListener("mousemove",I.current)):(N.current=false,y.current=0,document.removeEventListener("mousemove",I.current),s(false),a.current.setIsScrubbing(false));});useEffect(()=>{let l=re.current;return document.addEventListener("pointerlockchange",l),()=>{document.removeEventListener("pointerlockchange",l),document.removeEventListener("mousemove",I.current),typeof document.exitPointerLock=="function"&&document.pointerLockElement&&document.pointerLockElement===R.current&&document.exitPointerLock(),N.current&&(N.current=false,y.current=0,a.current.setIsScrubbing(false));}},[]);let q=useCallback(l=>{if(a.current.options.disabled||a.current.options.readOnly||l.button!==0)return;let J=l.currentTarget;R.current=J,x.current={x:l.clientX,y:l.clientY},H({x:l.clientX,y:l.clientY});let j=J.requestPointerLock();j&&typeof j.then=="function"&&j.catch(()=>{R.current=null;});},[]),M=useCallback(l=>{a.current.options.disabled||a.current.options.readOnly||(l.key==="ArrowRight"||l.key==="ArrowUp"?(l.preventDefault(),a.current._setLastChangeReason("scrub"),a.current.increment()):(l.key==="ArrowLeft"||l.key==="ArrowDown")&&(l.preventDefault(),a.current._setLastChangeReason("scrub"),a.current.decrement()));},[]),B=r==="horizontal"?"ew-resize":r==="vertical"?"ns-resize":"move",w={role:"slider",tabIndex:t.options.disabled?-1:0,style:{cursor:t.options.disabled?void 0:B,userSelect:"none",WebkitUserSelect:"none"},"aria-label":i,"aria-valuenow":t.numberValue??void 0,"aria-valuemin":t.options.minValue,"aria-valuemax":t.options.maxValue,"aria-valuetext":t.inputValue||void 0,"aria-disabled":t.options.disabled?true:void 0,"data-scrubbing":o?"":void 0,onPointerDown:q,onKeyDown:M};return {isScrubbing:o,scrubAreaProps:w,virtualCursor:F}}var rt=createContext(null);function G(){let t=useContext(rt);if(!t)throw new Error("[raqam] NumberField sub-components must be used inside <NumberField.Root>.");return t}function fe(t,e,r,n){if(!e)return t;let i={...t.props};if(n!=null&&(i.ref=n),typeof e=="function")return e(i,r);let o=Object.assign({},i,e.props);return n!=null&&(o.ref=n),ot.cloneElement(e,o)}var ht=Number.parseInt(ot.version,10)>=19,$t=ht;function zt(t){return ht?t.props.ref:t.ref}function Et(...t){let e=n=>{let i=[];for(let o of t)if(o!=null)if(typeof o=="function"){let s=o(n);i.push(typeof s=="function"?s:()=>o(null));}else o.current=n,i.push(()=>{o.current=null;});return i};if($t)return n=>{let i=e(n);return ()=>{for(let o of i)o();}};let r=[];return n=>{for(let i of r)i();r=n==null?[]:e(n);}}function Yt(t,e){let{options:r}=t;return {"data-disabled":r.disabled?"":void 0,"data-readonly":r.readOnly?"":void 0,"data-required":r.required?"":void 0,"data-scrubbing":t.isScrubbing?"":void 0,"data-focused":t.isFocused?"":void 0,"data-invalid":e?"":void 0}}var qt=new Set(["className","style","id","tabIndex","title","role","aria-label","data-testid","onClick","onMouseEnter","onMouseLeave"]);function Jt(t){let e={},r={};for(let[n,i]of Object.entries(t))qt.has(n)||n.startsWith("data-")||n.startsWith("aria-")?r[n]=i:e[n]=i;return {fieldProps:e,divProps:r}}var Wt=forwardRef(function({children:e,onValueChange:r,onValueCommitted:n,...i},o){let s=useRef(null),{fieldProps:a,divProps:v}=Jt(i),g=a,N=useRef(r);N.current=r;let y=useRef(null),R={...g,onValueCommitted:n,onChange:I=>{g.onChange?.(I),N.current&&y.current&&N.current(I,{reason:y.current._getLastChangeReason(),formattedValue:y.current._getLatestDisplay()});}},x=dt(R);y.current=x;let F=vt(R,x,s),H=x.validationState==="invalid"||x.numberValue!==null&&(g.minValue!==void 0&&x.numberValue<g.minValue||g.maxValue!==void 0&&x.numberValue>g.maxValue);return jsx(rt.Provider,{value:{state:x,aria:F,inputRef:s,props:R},children:jsx("div",{ref:o,...v,...Yt(x,H),children:e})})}),Gt=forwardRef(function({render:e,children:r,...n},i){let{aria:o,state:s}=G(),{ref:a,...v}=o.labelProps,g=ot.isValidElement(e)?zt(e):void 0,N=useMemo(()=>Et(i,a,g),[i,a,g]),y=jsx("label",{ref:N,...v,...n,children:r});return fe(y,e,s,N)}),Xt=forwardRef(function({render:e,children:r,...n},i){let{aria:o,state:s}=G(),a=jsx("div",{ref:i,...o.groupProps,...n,children:r});return fe(a,e,s)}),Qt=forwardRef(function({render:e,...r},n){let{aria:i,state:o,inputRef:s}=G(),a=[r["aria-describedby"],i.inputProps["aria-describedby"]].filter(Boolean).join(" ")||void 0,v=jsx("input",{ref:s,...i.inputProps,...r,"aria-describedby":a});return fe(v,e,o)}),Zt=forwardRef(function({render:e,children:r,...n},i){let{aria:o,state:s}=G(),a=jsx("button",{ref:i,...o.incrementButtonProps,...n,children:r??"+"});return fe(a,e,s)}),en=forwardRef(function({render:e,children:r,...n},i){let{aria:o,state:s}=G(),a=jsx("button",{ref:i,...o.decrementButtonProps,...n,children:r??"\u2212"});return fe(a,e,s)}),tn=function(){let{aria:e}=G();return e.hiddenInputProps?jsx("input",{...e.hiddenInputProps}):null},nn=forwardRef(function({render:e,children:r,direction:n="horizontal",pixelSensitivity:i=4,label:o,...s},a){let{state:v}=G(),{scrubAreaProps:g}=Lt(v,{direction:n,pixelSensitivity:i,label:o}),N=jsx("span",{ref:a,...g,...s,children:r});return fe(N,e,v)}),rn=forwardRef(function({render:e,children:r,style:n,...i},o){let{state:s}=G();if(!s.isScrubbing)return null;let a=jsx("span",{ref:o,style:{position:"fixed",pointerEvents:"none",zIndex:9999,...n},...i,children:r});return fe(a,e,s)}),on=forwardRef(function({children:e,...r},n){let{aria:i}=G(),{ref:o,...s}=i.descriptionProps,a=useMemo(()=>Et(n,o),[n,o]);return jsx("p",{ref:a,...s,...r,children:e})}),an=forwardRef(function({children:e,...r},n){let{aria:i,state:o}=G(),s=e??o.validationError??null;return s?jsx("p",{ref:n,...i.errorMessageProps,...r,children:s}):null}),un=forwardRef(function({render:e,style:r,...n},i){let{state:o,aria:s}=G(),a=s.inputProps.style!=null,v=a?{direction:"ltr",textAlign:"right",unicodeBidi:"plaintext",...r}:{unicodeBidi:"isolate",...r},g=jsx("span",{ref:i,"aria-hidden":"true","data-rtl":a?"":void 0,style:v,...n,children:o.inputValue});return fe(g,e,o)}),Kn={Root:Wt,Label:Gt,Group:Xt,Input:Qt,Increment:Zt,Decrement:en,HiddenInput:tn,ScrubArea:nn,ScrubAreaCursor:rn,Description:on,ErrorMessage:an,Formatted:un};export{lt as a,dt as b,nt as c,vt as d,Mn as e,Lt as f,rt as g,G as h,Kn as i};//# sourceMappingURL=chunk-G7ACJUKH.js.map
2
- //# sourceMappingURL=chunk-G7ACJUKH.js.map