@kushagradhawan/kookie-ui 0.1.103 → 0.1.105

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/components.css CHANGED
@@ -7057,10 +7057,6 @@
7057
7057
  user-select: none;
7058
7058
  cursor: var(--cursor-menu-item);
7059
7059
  }
7060
- .rt-BaseMenuItem:where(:focus-visible) {
7061
- outline: 2px solid var(--focus-8);
7062
- outline-offset: -2px;
7063
- }
7064
7060
  @media (prefers-reduced-motion: reduce) {
7065
7061
  .rt-BaseMenuItem {
7066
7062
  transition: none;
@@ -1 +1 @@
1
- {"version":3,"file":"text-field.d.ts","sourceRoot":"","sources":["../../../src/components/text-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,KAAK,qBAAqB,GAAG,eAAe,CAAC,OAAO,qBAAqB,CAAC,GAAG;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EACD,MAAM,GACN,gBAAgB,GAChB,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,KAAK,GACL,MAAM,GACN,MAAM,GACN,KAAK,GACL,MAAM,CAAC;CACZ,CAAC;AACF,KAAK,mBAAmB,GAAG,qBAAqB,CAC9C,OAAO,EACP,yBAAyB,GAAG,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CACjF,CAAC;AACF,UAAU,kBAAmB,SAAQ,mBAAmB,EAAE,WAAW,EAAE,qBAAqB;CAAG;AAC/F,QAAA,MAAM,aAAa,6FAkGlB,CAAC;AAIF,KAAK,qBAAqB,GAAG,eAAe,CAAC,OAAO,qBAAqB,CAAC,GAAG,uBAAuB,CAAC;AACrG,UAAU,kBACR,SAAQ,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,EAChD,qBAAqB;CAAG;AAC5B,QAAA,MAAM,aAAa,2FAsOlB,CAAC;AAGF,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,EAAE,CAAC;AACxD,YAAY,EAAE,kBAAkB,IAAI,SAAS,EAAE,kBAAkB,IAAI,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"text-field.d.ts","sourceRoot":"","sources":["../../../src/components/text-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAInH,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,KAAK,qBAAqB,GAAG,eAAe,CAAC,OAAO,qBAAqB,CAAC,GAAG;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CAC/I,CAAC;AACF,KAAK,mBAAmB,GAAG,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAC5I,UAAU,kBAAmB,SAAQ,mBAAmB,EAAE,WAAW,EAAE,qBAAqB;CAAG;AAC/F,QAAA,MAAM,aAAa,6FAiFjB,CAAC;AAIH,KAAK,qBAAqB,GAAG,eAAe,CAAC,OAAO,qBAAqB,CAAC,GAAG,uBAAuB,CAAC;AACrG,UAAU,kBAAmB,SAAQ,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,qBAAqB;CAAG;AAYzG,QAAA,MAAM,aAAa,2FAiSjB,CAAC;AAGH,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,EAAE,CAAC;AACxD,YAAY,EAAE,kBAAkB,IAAI,SAAS,EAAE,kBAAkB,IAAI,SAAS,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
- "use strict";"use client";var $=Object.create;var k=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty;var se=(t,o)=>{for(var r in o)k(t,r,{get:o[r],enumerable:!0})},U=(t,o,r,d)=>{if(o&&typeof o=="object"||typeof o=="function")for(let a of te(o))!oe.call(t,a)&&a!==r&&k(t,a,{get:()=>o[a],enumerable:!(d=ee(o,a))||d.enumerable});return t};var W=(t,o,r)=>(r=t!=null?$(re(t)):{},U(o||!t||!t.__esModule?k(r,"default",{value:t,enumerable:!0}):r,t)),ne=t=>U(k({},"__esModule",{value:!0}),t);var le={};se(le,{Root:()=>B,Slot:()=>G});module.exports=ne(le);var e=W(require("react")),ie=W(require("react-dom")),X=W(require("classnames")),Y=require("radix-ui/internal"),C=require("./text-field.props.js"),q=require("../helpers/extract-props.js"),Z=require("../props/margin.props.js");const B=e.forwardRef((t,o)=>{const r=e.useRef(null),{children:d,className:a,color:M,radius:F,panelBackground:R,material:w,style:E,...i}=(0,q.extractProps)(t,C.textFieldRootPropDefs,Z.marginPropDefs),L=w||R,h=e.useId(),v=i.error||i.isInvalid,{"aria-describedby":P,"aria-labelledby":g}=i,b=e.useMemo(()=>{const p=[];return i.errorMessage&&p.push(h),P&&p.push(P),p.length>0?p.join(" "):void 0},[i.errorMessage,P,h]),x=e.useMemo(()=>({"aria-invalid":v,"aria-describedby":b,"aria-labelledby":g}),[v,b,g]),{error:_,errorMessage:N,isInvalid:H,required:y,"aria-describedby":f,"aria-labelledby":c,...S}=i,V=e.useCallback(p=>{const s=p.target;if(s.closest("input, button, a"))return;const l=r.current;if(!l)return;const n=s.closest(`
1
+ "use strict";"use client";var ie=Object.create;var j=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ue=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var de=(r,n)=>{for(var o in n)j(r,o,{get:n[o],enumerable:!0})},$=(r,n,o,m)=>{if(n&&typeof n=="object"||typeof n=="function")for(let u of ae(n))!ce.call(r,u)&&u!==o&&j(r,u,{get:()=>n[u],enumerable:!(m=le(n,u))||m.enumerable});return r};var G=(r,n,o)=>(o=r!=null?ie(ue(r)):{},$(n||!r||!r.__esModule?j(o,"default",{value:r,enumerable:!0}):o,r)),pe=r=>$(j({},"__esModule",{value:!0}),r);var me={};de(me,{Root:()=>Z,Slot:()=>J});module.exports=pe(me);var e=G(require("react")),fe=G(require("react-dom")),U=G(require("classnames")),_=require("radix-ui/internal"),O=require("./text-field.props.js"),z=require("../helpers/extract-props.js"),ee=require("../props/margin.props.js");const Z=e.forwardRef((r,n)=>{const o=e.useRef(null),{children:m,className:u,color:w,radius:L,panelBackground:C,material:k,style:I,...l}=(0,z.extractProps)(r,O.textFieldRootPropDefs,ee.marginPropDefs),D=k||C,g=e.useId(),S=l.error||l.isInvalid,{"aria-describedby":M,"aria-labelledby":R}=l,h=e.useMemo(()=>{const a=[];return l.errorMessage&&a.push(g),M&&a.push(M),a.length>0?a.join(" "):void 0},[l.errorMessage,M,g]),i=e.useMemo(()=>({"aria-invalid":S,"aria-describedby":h,"aria-labelledby":R}),[S,h,R]),{error:N,errorMessage:W,isInvalid:K,required:x,"aria-describedby":P,"aria-labelledby":c,...y}=l,T=e.useCallback(a=>{const X=a.target;if(X.closest("input, button, a"))return;const b=o.current;if(!b)return;const A=X.closest(`
2
2
  .rt-TextFieldSlot[data-side='right'],
3
3
  .rt-TextFieldSlot:not([data-side='right']) ~ .rt-TextFieldSlot:not([data-side='left'])
4
- `)?l.value.length:0;requestAnimationFrame(()=>{try{l.setSelectionRange(n,n)}catch{}l.focus()})},[]);return e.createElement("div",{"data-accent-color":M,"data-radius":F,"data-panel-background":L,"data-material":L,style:E,className:(0,X.default)("rt-TextFieldRoot",a,{"rt-error":v}),onPointerDown:V},e.createElement("input",{spellCheck:"false",...S,...x,ref:(0,Y.composeRefs)(r,o),className:"rt-reset rt-TextFieldInput"}),d,i.errorMessage&&e.createElement("div",{id:h,className:"rt-TextFieldErrorMessage",role:"alert","aria-live":"polite"},i.errorMessage))});B.displayName="TextField.Root";const G=e.forwardRef((t,o)=>{const{scrub:r,scrubValue:d,scrubStep:a=1,scrubSensitivity:M=1,scrubMin:F,scrubMax:R,scrubShiftMultiplier:w=10,scrubAltMultiplier:E=.1,onScrub:i,...L}=t,{className:h,color:v,side:P,...g}=(0,q.extractProps)(L,C.textFieldSlotPropDefs),b=e.useRef(null),[x,_]=e.useState(!1),[N,H]=e.useState({x:0,y:0}),y=e.useRef(0),f=e.useRef(0),c=e.useRef(0),S=e.useRef({scrubValue:d,scrubStep:a,scrubSensitivity:M,scrubMin:F,scrubMax:R,scrubShiftMultiplier:w,scrubAltMultiplier:E,onScrub:i});S.current={scrubValue:d,scrubStep:a,scrubSensitivity:M,scrubMin:F,scrubMax:R,scrubShiftMultiplier:w,scrubAltMultiplier:E,onScrub:i};const V=e.useCallback(s=>{if(!r||s.target.closest("input, button, a"))return;s.preventDefault(),y.current=0,f.current=d??0,c.current=s.clientX,H({x:s.clientX,y:s.clientY});const m=b.current;m&&m.requestPointerLock()},[r,d]);e.useEffect(()=>{const s=()=>{const l=document.pointerLockElement===b.current;_(l),l||(S.current.onScrub?.(0,!1),y.current=0,f.current=0)};return document.addEventListener("pointerlockchange",s),()=>{document.removeEventListener("pointerlockchange",s)}},[]),e.useEffect(()=>{if(!x)return;const s=m=>{const n=S.current,z=m.movementX,J=m.movementY,D=window.innerWidth,I=window.innerHeight;c.current+=z,c.current>D?c.current=c.current%D:c.current<0&&(c.current=D+c.current%D),H(T=>{let u=T.y+J;return u>I?u=u%I:u<0&&(u=I+u%I),{x:c.current,y:u}}),y.current+=z;const j=y.current/n.scrubSensitivity;if(Math.abs(j)>=1){let T=1;m.shiftKey?T=n.scrubShiftMultiplier:m.altKey&&(T=n.scrubAltMultiplier);const u=Math.trunc(j),A=u*n.scrubStep*T;let O=A;if(n.scrubMin!==void 0||n.scrubMax!==void 0){const Q=f.current+A,K=Math.max(n.scrubMin??-1/0,Math.min(n.scrubMax??1/0,Q));O=K-f.current,f.current=K}else f.current+=A;O!==0&&n.onScrub?.(O,!0),y.current=(j-u)*n.scrubSensitivity}},l=()=>{document.exitPointerLock()};return document.addEventListener("mousemove",s),document.addEventListener("mouseup",l),document.body.style.userSelect="none",()=>{document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",l),document.body.style.userSelect=""}},[x]);const p=x?ie.createPortal(e.createElement("img",{className:"rt-TextFieldSlotScrubCursor",src:"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='black' stroke='white' stroke-width='1' d='M0 12 L5 7 L5 10 L19 10 L19 7 L24 12 L19 17 L19 14 L5 14 L5 17 Z'/%3E%3C/svg%3E",alt:"",style:{position:"fixed",left:N.x,top:N.y,transform:"translate(-50%, -50%)",pointerEvents:"none",zIndex:99999,width:24,height:24},"aria-hidden":"true"}),document.body):null;return e.createElement("div",{"data-accent-color":v,"data-side":P,"data-scrub":r||void 0,"data-scrubbing":x||void 0,...g,ref:(0,Y.composeRefs)(b,o),className:(0,X.default)("rt-TextFieldSlot",h),onPointerDown:r?V:void 0},g.children,p)});G.displayName="TextField.Slot";
4
+ `)?b.value.length:0;requestAnimationFrame(()=>{try{b.setSelectionRange(A,A)}catch{}b.focus()})},[]);return e.createElement("div",{"data-accent-color":w,"data-radius":L,"data-panel-background":D,"data-material":D,style:I,className:(0,U.default)("rt-TextFieldRoot",u,{"rt-error":S}),onPointerDown:T},e.createElement("input",{spellCheck:"false",...y,...i,ref:(0,_.composeRefs)(o,n),className:"rt-reset rt-TextFieldInput"}),m,l.errorMessage&&e.createElement("div",{id:g,className:"rt-TextFieldErrorMessage",role:"alert","aria-live":"polite"},l.errorMessage))});Z.displayName="TextField.Root";const v=(()=>{if(typeof navigator>"u")return!1;const r=navigator.userAgent,n=/^((?!chrome|android).)*safari/i.test(r),o=/firefox/i.test(r);return n||o})(),J=e.forwardRef((r,n)=>{const{scrub:o,scrubValue:m,scrubStep:u=1,scrubSensitivity:w=1,scrubMin:L,scrubMax:C,scrubShiftMultiplier:k=10,scrubAltMultiplier:I=.1,onScrub:l,...D}=r,{className:g,color:S,side:M,...R}=(0,z.extractProps)(D,O.textFieldSlotPropDefs),h=e.useRef(null),[i,N]=e.useState(!1),[W,K]=e.useState({x:0,y:0}),x=e.useRef(0),P=e.useRef(0),c=e.useRef(0),y=e.useRef(null),T=e.useRef(0),a=e.useRef({scrubValue:m,scrubStep:u,scrubSensitivity:w,scrubMin:L,scrubMax:C,scrubShiftMultiplier:k,scrubAltMultiplier:I,onScrub:l});a.current={scrubValue:m,scrubStep:u,scrubSensitivity:w,scrubMin:L,scrubMax:C,scrubShiftMultiplier:k,scrubAltMultiplier:I,onScrub:l};const X=e.useCallback(t=>{if(!o||t.target.closest("input, button, a"))return;t.preventDefault(),x.current=0,P.current=m??0,c.current=t.clientX,K({x:t.clientX,y:t.clientY});const d=h.current;d&&(v?(y.current=t.pointerId,T.current=t.clientX,d.setPointerCapture(t.pointerId),N(!0)):d.requestPointerLock())},[o,m]);e.useEffect(()=>{if(v)return;const t=()=>{const s=document.pointerLockElement===h.current;N(s),s||(a.current.onScrub?.(0,!1),x.current=0,P.current=0)};return document.addEventListener("pointerlockchange",t),()=>{document.removeEventListener("pointerlockchange",t)}},[]);const b=e.useCallback((t,s,d,ne)=>{const p=a.current,H=window.innerWidth,V=window.innerHeight;c.current+=t,c.current>H?c.current=c.current%H:c.current<0&&(c.current=H+c.current%H),K(E=>{let f=E.y+s;return f>V?f=f%V:f<0&&(f=V+f%V),{x:c.current,y:f}}),x.current+=t;const Y=x.current/p.scrubSensitivity;if(Math.abs(Y)>=1){let E=1;d?E=p.scrubShiftMultiplier:ne&&(E=p.scrubAltMultiplier);const f=Math.trunc(Y),q=f*p.scrubStep*E;let B=q;if(p.scrubMin!==void 0||p.scrubMax!==void 0){const se=P.current+q,Q=Math.max(p.scrubMin??-1/0,Math.min(p.scrubMax??1/0,se));B=Q-P.current,P.current=Q}else P.current+=q;B!==0&&p.onScrub?.(B,!0),x.current=(Y-f)*p.scrubSensitivity}},[]),F=e.useCallback(()=>{a.current.onScrub?.(0,!1),x.current=0,P.current=0,y.current=null,N(!1)},[]),A=e.useCallback(t=>{if(!i||!v)return;const s=t.clientX-T.current;T.current=t.clientX,b(s,t.movementY,t.shiftKey,t.altKey)},[i,b]),te=e.useCallback(t=>{if(!v||y.current!==t.pointerId)return;const s=h.current;s&&y.current!==null&&s.releasePointerCapture(y.current),F()},[F]),re=e.useCallback(()=>{v&&i&&F()},[i,F]);e.useEffect(()=>{if(!i||v)return;const t=d=>{b(d.movementX,d.movementY,d.shiftKey,d.altKey)},s=()=>{document.exitPointerLock()};return document.addEventListener("mousemove",t),document.addEventListener("mouseup",s),document.body.style.userSelect="none",()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",s),document.body.style.userSelect=""}},[i,b]),e.useEffect(()=>{if(!i||!v)return;const t=document.createElement("style");return t.textContent="* { cursor: none !important; user-select: none !important; }",document.head.appendChild(t),()=>{document.head.removeChild(t)}},[i]);const oe=i?fe.createPortal(e.createElement("img",{className:"rt-TextFieldSlotScrubCursor",src:"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='black' stroke='white' stroke-width='1' d='M0 12 L5 7 L5 10 L19 10 L19 7 L24 12 L19 17 L19 14 L5 14 L5 17 Z'/%3E%3C/svg%3E",alt:"",style:{position:"fixed",left:W.x,top:W.y,transform:"translate(-50%, -50%)",pointerEvents:"none",zIndex:99999,width:24,height:24},"aria-hidden":"true"}),document.body):null;return e.createElement("div",{"data-accent-color":S,"data-side":M,"data-scrub":o||void 0,"data-scrubbing":i||void 0,...R,ref:(0,_.composeRefs)(h,n),className:(0,U.default)("rt-TextFieldSlot",g),onPointerDown:o?X:void 0,onPointerMove:o?A:void 0,onPointerUp:o?te:void 0,onLostPointerCapture:o?re:void 0},R.children,oe)});J.displayName="TextField.Slot";
5
5
  //# sourceMappingURL=text-field.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/text-field.tsx"],
4
- "sourcesContent": ["'use client';\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport { composeRefs } from 'radix-ui/internal';\n\nimport {\n textFieldRootPropDefs,\n textFieldSlotPropDefs,\n type TextFieldSlotScrubProps,\n} from './text-field.props.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\n\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { NotInputTextualAttributes } from '../helpers/input-attributes.js';\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\n\ntype TextFieldRootElement = React.ElementRef<'input'>;\ntype TextFieldRootOwnProps = GetPropDefTypes<typeof textFieldRootPropDefs> & {\n defaultValue?: string | number;\n value?: string | number;\n type?:\n | 'date'\n | 'datetime-local'\n | 'email'\n | 'hidden'\n | 'month'\n | 'number'\n | 'password'\n | 'search'\n | 'tel'\n | 'text'\n | 'time'\n | 'url'\n | 'week';\n};\ntype TextFieldInputProps = ComponentPropsWithout<\n 'input',\n NotInputTextualAttributes | 'color' | 'defaultValue' | 'size' | 'type' | 'value'\n>;\ninterface TextFieldRootProps extends TextFieldInputProps, MarginProps, TextFieldRootOwnProps {}\nconst TextFieldRoot = React.forwardRef<TextFieldRootElement, TextFieldRootProps>(\n (props, forwardedRef) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { children, className, color, radius, panelBackground, material, style, ...inputProps } =\n extractProps(props, textFieldRootPropDefs, marginPropDefs);\n const effectiveMaterial = material || panelBackground;\n\n // Generate unique IDs for accessibility\n const errorId = React.useId();\n\n // Determine invalid state\n const isInvalid = inputProps.error || inputProps.isInvalid;\n\n const { 'aria-describedby': ariaDescribedby, 'aria-labelledby': ariaLabelledby } = inputProps;\n\n // Build aria-describedby string\n const describedBy = React.useMemo(() => {\n const parts = [];\n if (inputProps.errorMessage) parts.push(errorId);\n if (ariaDescribedby) parts.push(ariaDescribedby);\n return parts.length > 0 ? parts.join(' ') : undefined;\n }, [inputProps.errorMessage, ariaDescribedby, errorId]);\n\n // Build aria attributes\n const ariaProps = React.useMemo(\n () => ({\n 'aria-invalid': isInvalid,\n 'aria-describedby': describedBy,\n 'aria-labelledby': ariaLabelledby,\n }),\n [isInvalid, describedBy, ariaLabelledby],\n );\n\n // Filter out our custom props to avoid DOM warnings\n const {\n error,\n errorMessage,\n isInvalid: _isInvalid,\n required,\n 'aria-describedby': _ariaDescribedby,\n 'aria-labelledby': _ariaLabelledby,\n ...nativeInputProps\n } = inputProps;\n\n // Memoized pointer event handler\n const handlePointerDown = React.useCallback((event: React.PointerEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest('input, button, a')) return;\n\n const input = inputRef.current;\n if (!input) return;\n\n // Same selector as in the CSS to find the right slot\n const isRightSlot = target.closest(`\n .rt-TextFieldSlot[data-side='right'],\n .rt-TextFieldSlot:not([data-side='right']) ~ .rt-TextFieldSlot:not([data-side='left'])\n `);\n\n const cursorPosition = isRightSlot ? input.value.length : 0;\n\n requestAnimationFrame(() => {\n // Only some input types support this, browsers will throw an error if not supported\n // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange#:~:text=Note%20that%20according,not%20support%20selection%22.\n try {\n input.setSelectionRange(cursorPosition, cursorPosition);\n } catch {}\n input.focus();\n });\n }, []);\n\n return (\n <div\n data-accent-color={color}\n data-radius={radius}\n data-panel-background={effectiveMaterial}\n data-material={effectiveMaterial}\n style={style}\n className={classNames('rt-TextFieldRoot', className, {\n 'rt-error': isInvalid,\n })}\n onPointerDown={handlePointerDown}\n >\n <input\n spellCheck=\"false\"\n {...nativeInputProps}\n {...ariaProps}\n ref={composeRefs(inputRef, forwardedRef)}\n className=\"rt-reset rt-TextFieldInput\"\n />\n {children}\n {inputProps.errorMessage && (\n <div id={errorId} className=\"rt-TextFieldErrorMessage\" role=\"alert\" aria-live=\"polite\">\n {inputProps.errorMessage}\n </div>\n )}\n </div>\n );\n },\n);\nTextFieldRoot.displayName = 'TextField.Root';\n\ntype TextFieldSlotElement = React.ElementRef<'div'>;\ntype TextFieldSlotOwnProps = GetPropDefTypes<typeof textFieldSlotPropDefs> & TextFieldSlotScrubProps;\ninterface TextFieldSlotProps\n extends ComponentPropsWithout<'div', RemovedProps>,\n TextFieldSlotOwnProps {}\nconst TextFieldSlot = React.forwardRef<TextFieldSlotElement, TextFieldSlotProps>(\n (props, forwardedRef) => {\n // Extract scrub props first (not part of PropDef system)\n const {\n scrub,\n scrubValue,\n scrubStep = 1,\n scrubSensitivity = 1,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier = 10,\n scrubAltMultiplier = 0.1,\n onScrub,\n ...restProps\n } = props;\n\n // Then extract styling props\n const { className, color, side, ...slotProps } = extractProps(restProps, textFieldSlotPropDefs);\n\n const slotRef = React.useRef<HTMLDivElement>(null);\n const [isScrubbing, setIsScrubbing] = React.useState(false);\n // Virtual cursor position - X wraps around viewport, Y follows mouse\n const [cursorPosition, setCursorPosition] = React.useState({ x: 0, y: 0 });\n\n // Track accumulated sub-step movement for precision\n const accumulatedMovement = React.useRef(0);\n // Track current value for clamping (initialized to scrubValue when scrubbing starts)\n const currentValue = React.useRef(0);\n // Track virtual X position for wrap-around (separate from rendered position)\n const virtualX = React.useRef(0);\n\n // Store scrub config in refs so document handlers can access latest values\n const scrubConfigRef = React.useRef({\n scrubValue,\n scrubStep,\n scrubSensitivity,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier,\n scrubAltMultiplier,\n onScrub,\n });\n scrubConfigRef.current = {\n scrubValue,\n scrubStep,\n scrubSensitivity,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier,\n scrubAltMultiplier,\n onScrub,\n };\n\n const handlePointerDown = React.useCallback(\n (event: React.PointerEvent) => {\n if (!scrub) return;\n\n // Don't start scrubbing if clicking on interactive elements\n const target = event.target as HTMLElement;\n if (target.closest('input, button, a')) return;\n\n event.preventDefault();\n accumulatedMovement.current = 0;\n // Initialize to current value so min/max clamping works correctly\n currentValue.current = scrubValue ?? 0;\n\n // Initialize virtual cursor at actual mouse position\n virtualX.current = event.clientX;\n setCursorPosition({ x: event.clientX, y: event.clientY });\n\n // Request pointer lock for infinite movement (cursor won't hit screen edges)\n const slot = slotRef.current;\n if (slot) {\n slot.requestPointerLock();\n }\n },\n [scrub, scrubValue],\n );\n\n // Handle pointer lock state changes\n React.useEffect(() => {\n const handlePointerLockChange = () => {\n const isLocked = document.pointerLockElement === slotRef.current;\n setIsScrubbing(isLocked);\n if (!isLocked) {\n // Fire callback with isChanging = false when scrubbing ends\n scrubConfigRef.current.onScrub?.(0, false);\n accumulatedMovement.current = 0;\n currentValue.current = 0;\n }\n };\n\n document.addEventListener('pointerlockchange', handlePointerLockChange);\n return () => {\n document.removeEventListener('pointerlockchange', handlePointerLockChange);\n };\n }, []);\n\n // Attach document-level listeners when scrubbing starts\n React.useEffect(() => {\n if (!isScrubbing) return;\n\n const handleMouseMove = (event: MouseEvent) => {\n const config = scrubConfigRef.current;\n const movementX = event.movementX;\n const movementY = event.movementY;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Update virtual position with wrap-around at viewport edges\n virtualX.current += movementX;\n if (virtualX.current > viewportWidth) {\n virtualX.current = virtualX.current % viewportWidth;\n } else if (virtualX.current < 0) {\n virtualX.current = viewportWidth + (virtualX.current % viewportWidth);\n }\n\n // Also track Y with wrap-around\n setCursorPosition((prev) => {\n let newY = prev.y + movementY;\n if (newY > viewportHeight) {\n newY = newY % viewportHeight;\n } else if (newY < 0) {\n newY = viewportHeight + (newY % viewportHeight);\n }\n return { x: virtualX.current, y: newY };\n });\n\n // Accumulate movement for sensitivity calculation\n accumulatedMovement.current += movementX;\n\n // Calculate how many steps we've moved\n const stepsFromMovement = accumulatedMovement.current / config.scrubSensitivity;\n\n if (Math.abs(stepsFromMovement) >= 1) {\n // Determine modifier multiplier\n let multiplier = 1;\n if (event.shiftKey) {\n multiplier = config.scrubShiftMultiplier;\n } else if (event.altKey) {\n multiplier = config.scrubAltMultiplier;\n }\n\n // Calculate delta\n const wholeSteps = Math.trunc(stepsFromMovement);\n const delta = wholeSteps * config.scrubStep * multiplier;\n\n // Apply min/max clamping if bounds are set\n let clampedDelta = delta;\n if (config.scrubMin !== undefined || config.scrubMax !== undefined) {\n const newValue = currentValue.current + delta;\n const clampedValue = Math.max(\n config.scrubMin ?? -Infinity,\n Math.min(config.scrubMax ?? Infinity, newValue),\n );\n clampedDelta = clampedValue - currentValue.current;\n currentValue.current = clampedValue;\n } else {\n currentValue.current += delta;\n }\n\n // Fire callback with clamped delta (isChanging = true during drag)\n if (clampedDelta !== 0) {\n config.onScrub?.(clampedDelta, true);\n }\n\n // Keep the fractional remainder for smooth sub-pixel accumulation\n accumulatedMovement.current = (stepsFromMovement - wholeSteps) * config.scrubSensitivity;\n }\n };\n\n const handleMouseUp = () => {\n // Exit pointer lock to end scrubbing\n document.exitPointerLock();\n };\n\n // Use mousemove for pointer lock (pointermove doesn't work well with pointer lock)\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n // Disable text selection during scrubbing\n document.body.style.userSelect = 'none';\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.userSelect = '';\n };\n }, [isScrubbing]);\n\n // Render virtual cursor via portal to body so it's not clipped\n // Using a data URI of ew-resize cursor for a native look\n const virtualCursor = isScrubbing\n ? ReactDOM.createPortal(\n <img\n className=\"rt-TextFieldSlotScrubCursor\"\n src=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='black' stroke='white' stroke-width='1' d='M0 12 L5 7 L5 10 L19 10 L19 7 L24 12 L19 17 L19 14 L5 14 L5 17 Z'/%3E%3C/svg%3E\"\n alt=\"\"\n style={{\n position: 'fixed',\n left: cursorPosition.x,\n top: cursorPosition.y,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n zIndex: 99999,\n width: 24,\n height: 24,\n }}\n aria-hidden=\"true\"\n />,\n document.body,\n )\n : null;\n\n return (\n <div\n data-accent-color={color}\n data-side={side}\n data-scrub={scrub || undefined}\n data-scrubbing={isScrubbing || undefined}\n {...slotProps}\n ref={composeRefs(slotRef, forwardedRef)}\n className={classNames('rt-TextFieldSlot', className)}\n onPointerDown={scrub ? handlePointerDown : undefined}\n >\n {slotProps.children}\n {virtualCursor}\n </div>\n );\n },\n);\nTextFieldSlot.displayName = 'TextField.Slot';\n\nexport { TextFieldRoot as Root, TextFieldSlot as Slot };\nexport type { TextFieldRootProps as RootProps, TextFieldSlotProps as SlotProps };\n"],
5
- "mappings": "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",
6
- "names": ["text_field_exports", "__export", "TextFieldRoot", "TextFieldSlot", "__toCommonJS", "React", "ReactDOM", "import_classnames", "import_internal", "import_text_field_props", "import_extract_props", "import_margin_props", "props", "forwardedRef", "inputRef", "children", "className", "color", "radius", "panelBackground", "material", "style", "inputProps", "effectiveMaterial", "errorId", "isInvalid", "ariaDescribedby", "ariaLabelledby", "describedBy", "parts", "ariaProps", "error", "errorMessage", "_isInvalid", "required", "_ariaDescribedby", "_ariaLabelledby", "nativeInputProps", "handlePointerDown", "event", "target", "input", "cursorPosition", "classNames", "scrub", "scrubValue", "scrubStep", "scrubSensitivity", "scrubMin", "scrubMax", "scrubShiftMultiplier", "scrubAltMultiplier", "onScrub", "restProps", "side", "slotProps", "slotRef", "isScrubbing", "setIsScrubbing", "setCursorPosition", "accumulatedMovement", "currentValue", "virtualX", "scrubConfigRef", "slot", "handlePointerLockChange", "isLocked", "handleMouseMove", "config", "movementX", "movementY", "viewportWidth", "viewportHeight", "prev", "newY", "stepsFromMovement", "multiplier", "wholeSteps", "delta", "clampedDelta", "newValue", "clampedValue", "handleMouseUp", "virtualCursor"]
4
+ "sourcesContent": ["'use client';\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport { composeRefs } from 'radix-ui/internal';\n\nimport { textFieldRootPropDefs, textFieldSlotPropDefs, type TextFieldSlotScrubProps } from './text-field.props.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\n\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { NotInputTextualAttributes } from '../helpers/input-attributes.js';\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\n\ntype TextFieldRootElement = React.ElementRef<'input'>;\ntype TextFieldRootOwnProps = GetPropDefTypes<typeof textFieldRootPropDefs> & {\n defaultValue?: string | number;\n value?: string | number;\n type?: 'date' | 'datetime-local' | 'email' | 'hidden' | 'month' | 'number' | 'password' | 'search' | 'tel' | 'text' | 'time' | 'url' | 'week';\n};\ntype TextFieldInputProps = ComponentPropsWithout<'input', NotInputTextualAttributes | 'color' | 'defaultValue' | 'size' | 'type' | 'value'>;\ninterface TextFieldRootProps extends TextFieldInputProps, MarginProps, TextFieldRootOwnProps {}\nconst TextFieldRoot = React.forwardRef<TextFieldRootElement, TextFieldRootProps>((props, forwardedRef) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { children, className, color, radius, panelBackground, material, style, ...inputProps } = extractProps(props, textFieldRootPropDefs, marginPropDefs);\n const effectiveMaterial = material || panelBackground;\n\n // Generate unique IDs for accessibility\n const errorId = React.useId();\n\n // Determine invalid state\n const isInvalid = inputProps.error || inputProps.isInvalid;\n\n const { 'aria-describedby': ariaDescribedby, 'aria-labelledby': ariaLabelledby } = inputProps;\n\n // Build aria-describedby string\n const describedBy = React.useMemo(() => {\n const parts = [];\n if (inputProps.errorMessage) parts.push(errorId);\n if (ariaDescribedby) parts.push(ariaDescribedby);\n return parts.length > 0 ? parts.join(' ') : undefined;\n }, [inputProps.errorMessage, ariaDescribedby, errorId]);\n\n // Build aria attributes\n const ariaProps = React.useMemo(\n () => ({\n 'aria-invalid': isInvalid,\n 'aria-describedby': describedBy,\n 'aria-labelledby': ariaLabelledby,\n }),\n [isInvalid, describedBy, ariaLabelledby],\n );\n\n // Filter out our custom props to avoid DOM warnings\n const { error, errorMessage, isInvalid: _isInvalid, required, 'aria-describedby': _ariaDescribedby, 'aria-labelledby': _ariaLabelledby, ...nativeInputProps } = inputProps;\n\n // Memoized pointer event handler\n const handlePointerDown = React.useCallback((event: React.PointerEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest('input, button, a')) return;\n\n const input = inputRef.current;\n if (!input) return;\n\n // Same selector as in the CSS to find the right slot\n const isRightSlot = target.closest(`\n .rt-TextFieldSlot[data-side='right'],\n .rt-TextFieldSlot:not([data-side='right']) ~ .rt-TextFieldSlot:not([data-side='left'])\n `);\n\n const cursorPosition = isRightSlot ? input.value.length : 0;\n\n requestAnimationFrame(() => {\n // Only some input types support this, browsers will throw an error if not supported\n // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange#:~:text=Note%20that%20according,not%20support%20selection%22.\n try {\n input.setSelectionRange(cursorPosition, cursorPosition);\n } catch {}\n input.focus();\n });\n }, []);\n\n return (\n <div\n data-accent-color={color}\n data-radius={radius}\n data-panel-background={effectiveMaterial}\n data-material={effectiveMaterial}\n style={style}\n className={classNames('rt-TextFieldRoot', className, {\n 'rt-error': isInvalid,\n })}\n onPointerDown={handlePointerDown}\n >\n <input spellCheck=\"false\" {...nativeInputProps} {...ariaProps} ref={composeRefs(inputRef, forwardedRef)} className=\"rt-reset rt-TextFieldInput\" />\n {children}\n {inputProps.errorMessage && (\n <div id={errorId} className=\"rt-TextFieldErrorMessage\" role=\"alert\" aria-live=\"polite\">\n {inputProps.errorMessage}\n </div>\n )}\n </div>\n );\n});\nTextFieldRoot.displayName = 'TextField.Root';\n\ntype TextFieldSlotElement = React.ElementRef<'div'>;\ntype TextFieldSlotOwnProps = GetPropDefTypes<typeof textFieldSlotPropDefs> & TextFieldSlotScrubProps;\ninterface TextFieldSlotProps extends ComponentPropsWithout<'div', RemovedProps>, TextFieldSlotOwnProps {}\n\n// Detect if we should use pointer capture instead of pointer lock\n// Safari and Firefox show intrusive browser warnings with pointer lock\nconst usePointerCapture = (() => {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent;\n const isSafari = /^((?!chrome|android).)*safari/i.test(ua);\n const isFirefox = /firefox/i.test(ua);\n return isSafari || isFirefox;\n})();\n\nconst TextFieldSlot = React.forwardRef<TextFieldSlotElement, TextFieldSlotProps>((props, forwardedRef) => {\n // Extract scrub props first (not part of PropDef system)\n const { scrub, scrubValue, scrubStep = 1, scrubSensitivity = 1, scrubMin, scrubMax, scrubShiftMultiplier = 10, scrubAltMultiplier = 0.1, onScrub, ...restProps } = props;\n\n // Then extract styling props\n const { className, color, side, ...slotProps } = extractProps(restProps, textFieldSlotPropDefs);\n\n const slotRef = React.useRef<HTMLDivElement>(null);\n const [isScrubbing, setIsScrubbing] = React.useState(false);\n // Virtual cursor position - X wraps around viewport, Y follows mouse\n const [cursorPosition, setCursorPosition] = React.useState({ x: 0, y: 0 });\n\n // Track accumulated sub-step movement for precision\n const accumulatedMovement = React.useRef(0);\n // Track current value for clamping (initialized to scrubValue when scrubbing starts)\n const currentValue = React.useRef(0);\n // Track virtual X position for wrap-around (separate from rendered position)\n const virtualX = React.useRef(0);\n // Track pointer ID for capture mode\n const pointerIdRef = React.useRef<number | null>(null);\n // Track last X position for capture mode (movementX calculation)\n const lastXRef = React.useRef(0);\n\n // Store scrub config in refs so document handlers can access latest values\n const scrubConfigRef = React.useRef({\n scrubValue,\n scrubStep,\n scrubSensitivity,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier,\n scrubAltMultiplier,\n onScrub,\n });\n scrubConfigRef.current = {\n scrubValue,\n scrubStep,\n scrubSensitivity,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier,\n scrubAltMultiplier,\n onScrub,\n };\n\n const handlePointerDown = React.useCallback(\n (event: React.PointerEvent) => {\n if (!scrub) return;\n\n // Don't start scrubbing if clicking on interactive elements\n const target = event.target as HTMLElement;\n if (target.closest('input, button, a')) return;\n\n event.preventDefault();\n accumulatedMovement.current = 0;\n // Initialize to current value so min/max clamping works correctly\n currentValue.current = scrubValue ?? 0;\n\n // Initialize virtual cursor at actual mouse position\n virtualX.current = event.clientX;\n setCursorPosition({ x: event.clientX, y: event.clientY });\n\n const slot = slotRef.current;\n if (!slot) return;\n\n if (usePointerCapture) {\n // Safari/Firefox: Use pointer capture (no browser warning)\n pointerIdRef.current = event.pointerId;\n lastXRef.current = event.clientX;\n slot.setPointerCapture(event.pointerId);\n setIsScrubbing(true);\n } else {\n // Chrome: Use pointer lock for infinite movement\n slot.requestPointerLock();\n }\n },\n [scrub, scrubValue],\n );\n\n // Handle pointer lock state changes (Chrome only)\n React.useEffect(() => {\n if (usePointerCapture) return;\n\n const handlePointerLockChange = () => {\n const isLocked = document.pointerLockElement === slotRef.current;\n setIsScrubbing(isLocked);\n if (!isLocked) {\n // Fire callback with isChanging = false when scrubbing ends\n scrubConfigRef.current.onScrub?.(0, false);\n accumulatedMovement.current = 0;\n currentValue.current = 0;\n }\n };\n\n document.addEventListener('pointerlockchange', handlePointerLockChange);\n return () => {\n document.removeEventListener('pointerlockchange', handlePointerLockChange);\n };\n }, []);\n\n // Shared scrub calculation logic\n const processScrubMovement = React.useCallback((movementX: number, movementY: number, shiftKey: boolean, altKey: boolean) => {\n const config = scrubConfigRef.current;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Update virtual position with wrap-around at viewport edges\n virtualX.current += movementX;\n if (virtualX.current > viewportWidth) {\n virtualX.current = virtualX.current % viewportWidth;\n } else if (virtualX.current < 0) {\n virtualX.current = viewportWidth + (virtualX.current % viewportWidth);\n }\n\n // Also track Y with wrap-around\n setCursorPosition((prev) => {\n let newY = prev.y + movementY;\n if (newY > viewportHeight) {\n newY = newY % viewportHeight;\n } else if (newY < 0) {\n newY = viewportHeight + (newY % viewportHeight);\n }\n return { x: virtualX.current, y: newY };\n });\n\n // Accumulate movement for sensitivity calculation\n accumulatedMovement.current += movementX;\n\n // Calculate how many steps we've moved\n const stepsFromMovement = accumulatedMovement.current / config.scrubSensitivity;\n\n if (Math.abs(stepsFromMovement) >= 1) {\n // Determine modifier multiplier\n let multiplier = 1;\n if (shiftKey) {\n multiplier = config.scrubShiftMultiplier;\n } else if (altKey) {\n multiplier = config.scrubAltMultiplier;\n }\n\n // Calculate delta\n const wholeSteps = Math.trunc(stepsFromMovement);\n const delta = wholeSteps * config.scrubStep * multiplier;\n\n // Apply min/max clamping if bounds are set\n let clampedDelta = delta;\n if (config.scrubMin !== undefined || config.scrubMax !== undefined) {\n const newValue = currentValue.current + delta;\n const clampedValue = Math.max(config.scrubMin ?? -Infinity, Math.min(config.scrubMax ?? Infinity, newValue));\n clampedDelta = clampedValue - currentValue.current;\n currentValue.current = clampedValue;\n } else {\n currentValue.current += delta;\n }\n\n // Fire callback with clamped delta (isChanging = true during drag)\n if (clampedDelta !== 0) {\n config.onScrub?.(clampedDelta, true);\n }\n\n // Keep the fractional remainder for smooth sub-pixel accumulation\n accumulatedMovement.current = (stepsFromMovement - wholeSteps) * config.scrubSensitivity;\n }\n }, []);\n\n // End scrubbing helper\n const endScrubbing = React.useCallback(() => {\n scrubConfigRef.current.onScrub?.(0, false);\n accumulatedMovement.current = 0;\n currentValue.current = 0;\n pointerIdRef.current = null;\n setIsScrubbing(false);\n }, []);\n\n // Handle pointer capture mode events (Safari/Firefox)\n const handlePointerMove = React.useCallback(\n (event: React.PointerEvent) => {\n if (!isScrubbing || !usePointerCapture) return;\n\n const movementX = event.clientX - lastXRef.current;\n lastXRef.current = event.clientX;\n\n processScrubMovement(movementX, event.movementY, event.shiftKey, event.altKey);\n },\n [isScrubbing, processScrubMovement],\n );\n\n const handlePointerUp = React.useCallback(\n (event: React.PointerEvent) => {\n if (!usePointerCapture || pointerIdRef.current !== event.pointerId) return;\n\n const slot = slotRef.current;\n if (slot && pointerIdRef.current !== null) {\n slot.releasePointerCapture(pointerIdRef.current);\n }\n endScrubbing();\n },\n [endScrubbing],\n );\n\n const handleLostPointerCapture = React.useCallback(() => {\n if (usePointerCapture && isScrubbing) {\n endScrubbing();\n }\n }, [isScrubbing, endScrubbing]);\n\n // Attach document-level listeners for pointer lock mode (Chrome)\n React.useEffect(() => {\n if (!isScrubbing || usePointerCapture) return;\n\n const handleMouseMove = (event: MouseEvent) => {\n processScrubMovement(event.movementX, event.movementY, event.shiftKey, event.altKey);\n };\n\n const handleMouseUp = () => {\n // Exit pointer lock to end scrubbing\n document.exitPointerLock();\n };\n\n // Use mousemove for pointer lock (pointermove doesn't work well with pointer lock)\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n // Disable text selection during scrubbing\n document.body.style.userSelect = 'none';\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.userSelect = '';\n };\n }, [isScrubbing, processScrubMovement]);\n\n // Hide native cursor and disable text selection during pointer capture scrubbing\n React.useEffect(() => {\n if (!isScrubbing || !usePointerCapture) return;\n\n // Create a style element to hide cursor globally during scrub\n const style = document.createElement('style');\n style.textContent = '* { cursor: none !important; user-select: none !important; }';\n document.head.appendChild(style);\n\n return () => {\n document.head.removeChild(style);\n };\n }, [isScrubbing]);\n\n // Render virtual cursor via portal to body so it's not clipped\n // Using a data URI of ew-resize cursor for a native look\n const virtualCursor = isScrubbing\n ? ReactDOM.createPortal(\n <img\n className=\"rt-TextFieldSlotScrubCursor\"\n src=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='black' stroke='white' stroke-width='1' d='M0 12 L5 7 L5 10 L19 10 L19 7 L24 12 L19 17 L19 14 L5 14 L5 17 Z'/%3E%3C/svg%3E\"\n alt=\"\"\n style={{\n position: 'fixed',\n left: cursorPosition.x,\n top: cursorPosition.y,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n zIndex: 99999,\n width: 24,\n height: 24,\n }}\n aria-hidden=\"true\"\n />,\n document.body,\n )\n : null;\n\n return (\n <div\n data-accent-color={color}\n data-side={side}\n data-scrub={scrub || undefined}\n data-scrubbing={isScrubbing || undefined}\n {...slotProps}\n ref={composeRefs(slotRef, forwardedRef)}\n className={classNames('rt-TextFieldSlot', className)}\n onPointerDown={scrub ? handlePointerDown : undefined}\n onPointerMove={scrub ? handlePointerMove : undefined}\n onPointerUp={scrub ? handlePointerUp : undefined}\n onLostPointerCapture={scrub ? handleLostPointerCapture : undefined}\n >\n {slotProps.children}\n {virtualCursor}\n </div>\n );\n});\nTextFieldSlot.displayName = 'TextField.Slot';\n\nexport { TextFieldRoot as Root, TextFieldSlot as Slot };\nexport type { TextFieldRootProps as RootProps, TextFieldSlotProps as SlotProps };\n"],
5
+ "mappings": "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",
6
+ "names": ["text_field_exports", "__export", "TextFieldRoot", "TextFieldSlot", "__toCommonJS", "React", "ReactDOM", "import_classnames", "import_internal", "import_text_field_props", "import_extract_props", "import_margin_props", "props", "forwardedRef", "inputRef", "children", "className", "color", "radius", "panelBackground", "material", "style", "inputProps", "effectiveMaterial", "errorId", "isInvalid", "ariaDescribedby", "ariaLabelledby", "describedBy", "parts", "ariaProps", "error", "errorMessage", "_isInvalid", "required", "_ariaDescribedby", "_ariaLabelledby", "nativeInputProps", "handlePointerDown", "event", "target", "input", "cursorPosition", "classNames", "usePointerCapture", "ua", "isSafari", "isFirefox", "scrub", "scrubValue", "scrubStep", "scrubSensitivity", "scrubMin", "scrubMax", "scrubShiftMultiplier", "scrubAltMultiplier", "onScrub", "restProps", "side", "slotProps", "slotRef", "isScrubbing", "setIsScrubbing", "setCursorPosition", "accumulatedMovement", "currentValue", "virtualX", "pointerIdRef", "lastXRef", "scrubConfigRef", "slot", "handlePointerLockChange", "isLocked", "processScrubMovement", "movementX", "movementY", "shiftKey", "altKey", "config", "viewportWidth", "viewportHeight", "prev", "newY", "stepsFromMovement", "multiplier", "wholeSteps", "delta", "clampedDelta", "newValue", "clampedValue", "endScrubbing", "handlePointerMove", "handlePointerUp", "handleLostPointerCapture", "handleMouseMove", "handleMouseUp", "virtualCursor"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"text-field.d.ts","sourceRoot":"","sources":["../../../src/components/text-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,KAAK,qBAAqB,GAAG,eAAe,CAAC,OAAO,qBAAqB,CAAC,GAAG;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EACD,MAAM,GACN,gBAAgB,GAChB,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,KAAK,GACL,MAAM,GACN,MAAM,GACN,KAAK,GACL,MAAM,CAAC;CACZ,CAAC;AACF,KAAK,mBAAmB,GAAG,qBAAqB,CAC9C,OAAO,EACP,yBAAyB,GAAG,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CACjF,CAAC;AACF,UAAU,kBAAmB,SAAQ,mBAAmB,EAAE,WAAW,EAAE,qBAAqB;CAAG;AAC/F,QAAA,MAAM,aAAa,6FAkGlB,CAAC;AAIF,KAAK,qBAAqB,GAAG,eAAe,CAAC,OAAO,qBAAqB,CAAC,GAAG,uBAAuB,CAAC;AACrG,UAAU,kBACR,SAAQ,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,EAChD,qBAAqB;CAAG;AAC5B,QAAA,MAAM,aAAa,2FAsOlB,CAAC;AAGF,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,EAAE,CAAC;AACxD,YAAY,EAAE,kBAAkB,IAAI,SAAS,EAAE,kBAAkB,IAAI,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"text-field.d.ts","sourceRoot":"","sources":["../../../src/components/text-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAInH,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,KAAK,qBAAqB,GAAG,eAAe,CAAC,OAAO,qBAAqB,CAAC,GAAG;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CAC/I,CAAC;AACF,KAAK,mBAAmB,GAAG,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAC5I,UAAU,kBAAmB,SAAQ,mBAAmB,EAAE,WAAW,EAAE,qBAAqB;CAAG;AAC/F,QAAA,MAAM,aAAa,6FAiFjB,CAAC;AAIH,KAAK,qBAAqB,GAAG,eAAe,CAAC,OAAO,qBAAqB,CAAC,GAAG,uBAAuB,CAAC;AACrG,UAAU,kBAAmB,SAAQ,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,qBAAqB;CAAG;AAYzG,QAAA,MAAM,aAAa,2FAiSjB,CAAC;AAGH,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,EAAE,CAAC;AACxD,YAAY,EAAE,kBAAkB,IAAI,SAAS,EAAE,kBAAkB,IAAI,SAAS,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
- "use client";import*as e from"react";import*as K from"react-dom";import X from"classnames";import{composeRefs as Y}from"radix-ui/internal";import{textFieldRootPropDefs as U,textFieldSlotPropDefs as Z}from"./text-field.props.js";import{extractProps as q}from"../helpers/extract-props.js";import{marginPropDefs as J}from"../props/margin.props.js";const B=e.forwardRef((D,I)=>{const c=e.useRef(null),{children:d,className:g,color:S,radius:T,panelBackground:M,material:F,style:R,...o}=q(D,U,J),w=F||M,b=e.useId(),x=o.error||o.isInvalid,{"aria-describedby":y,"aria-labelledby":h}=o,p=e.useMemo(()=>{const l=[];return o.errorMessage&&l.push(b),y&&l.push(y),l.length>0?l.join(" "):void 0},[o.errorMessage,y,b]),m=e.useMemo(()=>({"aria-invalid":x,"aria-describedby":p,"aria-labelledby":h}),[x,p,h]),{error:A,errorMessage:k,isInvalid:C,required:f,"aria-describedby":u,"aria-labelledby":n,...v}=o,N=e.useCallback(l=>{const t=l.target;if(t.closest("input, button, a"))return;const s=c.current;if(!s)return;const r=t.closest(`
1
+ "use client";import*as e from"react";import*as te from"react-dom";import B from"classnames";import{composeRefs as G}from"radix-ui/internal";import{textFieldRootPropDefs as re,textFieldSlotPropDefs as oe}from"./text-field.props.js";import{extractProps as U}from"../helpers/extract-props.js";import{marginPropDefs as ne}from"../props/margin.props.js";const _=e.forwardRef((h,y)=>{const o=e.useRef(null),{children:x,className:E,color:w,radius:L,panelBackground:C,material:k,style:I,...s}=U(h,re,ne),D=k||C,v=e.useId(),g=s.error||s.isInvalid,{"aria-describedby":S,"aria-labelledby":M}=s,f=e.useMemo(()=>{const i=[];return s.errorMessage&&i.push(v),S&&i.push(S),i.length>0?i.join(" "):void 0},[s.errorMessage,S,v]),n=e.useMemo(()=>({"aria-invalid":g,"aria-describedby":f,"aria-labelledby":M}),[g,f,M]),{error:N,errorMessage:j,isInvalid:O,required:m,"aria-describedby":p,"aria-labelledby":l,...b}=s,R=e.useCallback(i=>{const X=i.target;if(X.closest("input, button, a"))return;const d=o.current;if(!d)return;const A=X.closest(`
2
2
  .rt-TextFieldSlot[data-side='right'],
3
3
  .rt-TextFieldSlot:not([data-side='right']) ~ .rt-TextFieldSlot:not([data-side='left'])
4
- `)?s.value.length:0;requestAnimationFrame(()=>{try{s.setSelectionRange(r,r)}catch{}s.focus()})},[]);return e.createElement("div",{"data-accent-color":S,"data-radius":T,"data-panel-background":w,"data-material":w,style:R,className:X("rt-TextFieldRoot",g,{"rt-error":x}),onPointerDown:N},e.createElement("input",{spellCheck:"false",...v,...m,ref:Y(c,I),className:"rt-reset rt-TextFieldInput"}),d,o.errorMessage&&e.createElement("div",{id:b,className:"rt-TextFieldErrorMessage",role:"alert","aria-live":"polite"},o.errorMessage))});B.displayName="TextField.Root";const G=e.forwardRef((D,I)=>{const{scrub:c,scrubValue:d,scrubStep:g=1,scrubSensitivity:S=1,scrubMin:T,scrubMax:M,scrubShiftMultiplier:F=10,scrubAltMultiplier:R=.1,onScrub:o,...w}=D,{className:b,color:x,side:y,...h}=q(w,Z),p=e.useRef(null),[m,A]=e.useState(!1),[k,C]=e.useState({x:0,y:0}),f=e.useRef(0),u=e.useRef(0),n=e.useRef(0),v=e.useRef({scrubValue:d,scrubStep:g,scrubSensitivity:S,scrubMin:T,scrubMax:M,scrubShiftMultiplier:F,scrubAltMultiplier:R,onScrub:o});v.current={scrubValue:d,scrubStep:g,scrubSensitivity:S,scrubMin:T,scrubMax:M,scrubShiftMultiplier:F,scrubAltMultiplier:R,onScrub:o};const N=e.useCallback(t=>{if(!c||t.target.closest("input, button, a"))return;t.preventDefault(),f.current=0,u.current=d??0,n.current=t.clientX,C({x:t.clientX,y:t.clientY});const a=p.current;a&&a.requestPointerLock()},[c,d]);e.useEffect(()=>{const t=()=>{const s=document.pointerLockElement===p.current;A(s),s||(v.current.onScrub?.(0,!1),f.current=0,u.current=0)};return document.addEventListener("pointerlockchange",t),()=>{document.removeEventListener("pointerlockchange",t)}},[]),e.useEffect(()=>{if(!m)return;const t=a=>{const r=v.current,O=a.movementX,_=a.movementY,E=window.innerWidth,L=window.innerHeight;n.current+=O,n.current>E?n.current=n.current%E:n.current<0&&(n.current=E+n.current%E),C(P=>{let i=P.y+_;return i>L?i=i%L:i<0&&(i=L+i%L),{x:n.current,y:i}}),f.current+=O;const H=f.current/r.scrubSensitivity;if(Math.abs(H)>=1){let P=1;a.shiftKey?P=r.scrubShiftMultiplier:a.altKey&&(P=r.scrubAltMultiplier);const i=Math.trunc(H),V=i*r.scrubStep*P;let j=V;if(r.scrubMin!==void 0||r.scrubMax!==void 0){const z=u.current+V,W=Math.max(r.scrubMin??-1/0,Math.min(r.scrubMax??1/0,z));j=W-u.current,u.current=W}else u.current+=V;j!==0&&r.onScrub?.(j,!0),f.current=(H-i)*r.scrubSensitivity}},s=()=>{document.exitPointerLock()};return document.addEventListener("mousemove",t),document.addEventListener("mouseup",s),document.body.style.userSelect="none",()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",s),document.body.style.userSelect=""}},[m]);const l=m?K.createPortal(e.createElement("img",{className:"rt-TextFieldSlotScrubCursor",src:"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='black' stroke='white' stroke-width='1' d='M0 12 L5 7 L5 10 L19 10 L19 7 L24 12 L19 17 L19 14 L5 14 L5 17 Z'/%3E%3C/svg%3E",alt:"",style:{position:"fixed",left:k.x,top:k.y,transform:"translate(-50%, -50%)",pointerEvents:"none",zIndex:99999,width:24,height:24},"aria-hidden":"true"}),document.body):null;return e.createElement("div",{"data-accent-color":x,"data-side":y,"data-scrub":c||void 0,"data-scrubbing":m||void 0,...h,ref:Y(p,I),className:X("rt-TextFieldSlot",b),onPointerDown:c?N:void 0},h.children,l)});G.displayName="TextField.Slot";export{B as Root,G as Slot};
4
+ `)?d.value.length:0;requestAnimationFrame(()=>{try{d.setSelectionRange(A,A)}catch{}d.focus()})},[]);return e.createElement("div",{"data-accent-color":w,"data-radius":L,"data-panel-background":D,"data-material":D,style:I,className:B("rt-TextFieldRoot",E,{"rt-error":g}),onPointerDown:R},e.createElement("input",{spellCheck:"false",...b,...n,ref:G(o,y),className:"rt-reset rt-TextFieldInput"}),x,s.errorMessage&&e.createElement("div",{id:v,className:"rt-TextFieldErrorMessage",role:"alert","aria-live":"polite"},s.errorMessage))});_.displayName="TextField.Root";const P=(()=>{if(typeof navigator>"u")return!1;const h=navigator.userAgent,y=/^((?!chrome|android).)*safari/i.test(h),o=/firefox/i.test(h);return y||o})(),z=e.forwardRef((h,y)=>{const{scrub:o,scrubValue:x,scrubStep:E=1,scrubSensitivity:w=1,scrubMin:L,scrubMax:C,scrubShiftMultiplier:k=10,scrubAltMultiplier:I=.1,onScrub:s,...D}=h,{className:v,color:g,side:S,...M}=U(D,oe),f=e.useRef(null),[n,N]=e.useState(!1),[j,O]=e.useState({x:0,y:0}),m=e.useRef(0),p=e.useRef(0),l=e.useRef(0),b=e.useRef(null),R=e.useRef(0),i=e.useRef({scrubValue:x,scrubStep:E,scrubSensitivity:w,scrubMin:L,scrubMax:C,scrubShiftMultiplier:k,scrubAltMultiplier:I,onScrub:s});i.current={scrubValue:x,scrubStep:E,scrubSensitivity:w,scrubMin:L,scrubMax:C,scrubShiftMultiplier:k,scrubAltMultiplier:I,onScrub:s};const X=e.useCallback(t=>{if(!o||t.target.closest("input, button, a"))return;t.preventDefault(),m.current=0,p.current=x??0,l.current=t.clientX,O({x:t.clientX,y:t.clientY});const a=f.current;a&&(P?(b.current=t.pointerId,R.current=t.clientX,a.setPointerCapture(t.pointerId),N(!0)):a.requestPointerLock())},[o,x]);e.useEffect(()=>{if(P)return;const t=()=>{const r=document.pointerLockElement===f.current;N(r),r||(i.current.onScrub?.(0,!1),m.current=0,p.current=0)};return document.addEventListener("pointerlockchange",t),()=>{document.removeEventListener("pointerlockchange",t)}},[]);const d=e.useCallback((t,r,a,$)=>{const u=i.current,H=window.innerWidth,V=window.innerHeight;l.current+=t,l.current>H?l.current=l.current%H:l.current<0&&(l.current=H+l.current%H),O(F=>{let c=F.y+r;return c>V?c=c%V:c<0&&(c=V+c%V),{x:l.current,y:c}}),m.current+=t;const W=m.current/u.scrubSensitivity;if(Math.abs(W)>=1){let F=1;a?F=u.scrubShiftMultiplier:$&&(F=u.scrubAltMultiplier);const c=Math.trunc(W),K=c*u.scrubStep*F;let Y=K;if(u.scrubMin!==void 0||u.scrubMax!==void 0){const ee=p.current+K,q=Math.max(u.scrubMin??-1/0,Math.min(u.scrubMax??1/0,ee));Y=q-p.current,p.current=q}else p.current+=K;Y!==0&&u.onScrub?.(Y,!0),m.current=(W-c)*u.scrubSensitivity}},[]),T=e.useCallback(()=>{i.current.onScrub?.(0,!1),m.current=0,p.current=0,b.current=null,N(!1)},[]),A=e.useCallback(t=>{if(!n||!P)return;const r=t.clientX-R.current;R.current=t.clientX,d(r,t.movementY,t.shiftKey,t.altKey)},[n,d]),Z=e.useCallback(t=>{if(!P||b.current!==t.pointerId)return;const r=f.current;r&&b.current!==null&&r.releasePointerCapture(b.current),T()},[T]),J=e.useCallback(()=>{P&&n&&T()},[n,T]);e.useEffect(()=>{if(!n||P)return;const t=a=>{d(a.movementX,a.movementY,a.shiftKey,a.altKey)},r=()=>{document.exitPointerLock()};return document.addEventListener("mousemove",t),document.addEventListener("mouseup",r),document.body.style.userSelect="none",()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",r),document.body.style.userSelect=""}},[n,d]),e.useEffect(()=>{if(!n||!P)return;const t=document.createElement("style");return t.textContent="* { cursor: none !important; user-select: none !important; }",document.head.appendChild(t),()=>{document.head.removeChild(t)}},[n]);const Q=n?te.createPortal(e.createElement("img",{className:"rt-TextFieldSlotScrubCursor",src:"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='black' stroke='white' stroke-width='1' d='M0 12 L5 7 L5 10 L19 10 L19 7 L24 12 L19 17 L19 14 L5 14 L5 17 Z'/%3E%3C/svg%3E",alt:"",style:{position:"fixed",left:j.x,top:j.y,transform:"translate(-50%, -50%)",pointerEvents:"none",zIndex:99999,width:24,height:24},"aria-hidden":"true"}),document.body):null;return e.createElement("div",{"data-accent-color":g,"data-side":S,"data-scrub":o||void 0,"data-scrubbing":n||void 0,...M,ref:G(f,y),className:B("rt-TextFieldSlot",v),onPointerDown:o?X:void 0,onPointerMove:o?A:void 0,onPointerUp:o?Z:void 0,onLostPointerCapture:o?J:void 0},M.children,Q)});z.displayName="TextField.Slot";export{_ as Root,z as Slot};
5
5
  //# sourceMappingURL=text-field.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/text-field.tsx"],
4
- "sourcesContent": ["'use client';\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport { composeRefs } from 'radix-ui/internal';\n\nimport {\n textFieldRootPropDefs,\n textFieldSlotPropDefs,\n type TextFieldSlotScrubProps,\n} from './text-field.props.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\n\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { NotInputTextualAttributes } from '../helpers/input-attributes.js';\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\n\ntype TextFieldRootElement = React.ElementRef<'input'>;\ntype TextFieldRootOwnProps = GetPropDefTypes<typeof textFieldRootPropDefs> & {\n defaultValue?: string | number;\n value?: string | number;\n type?:\n | 'date'\n | 'datetime-local'\n | 'email'\n | 'hidden'\n | 'month'\n | 'number'\n | 'password'\n | 'search'\n | 'tel'\n | 'text'\n | 'time'\n | 'url'\n | 'week';\n};\ntype TextFieldInputProps = ComponentPropsWithout<\n 'input',\n NotInputTextualAttributes | 'color' | 'defaultValue' | 'size' | 'type' | 'value'\n>;\ninterface TextFieldRootProps extends TextFieldInputProps, MarginProps, TextFieldRootOwnProps {}\nconst TextFieldRoot = React.forwardRef<TextFieldRootElement, TextFieldRootProps>(\n (props, forwardedRef) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { children, className, color, radius, panelBackground, material, style, ...inputProps } =\n extractProps(props, textFieldRootPropDefs, marginPropDefs);\n const effectiveMaterial = material || panelBackground;\n\n // Generate unique IDs for accessibility\n const errorId = React.useId();\n\n // Determine invalid state\n const isInvalid = inputProps.error || inputProps.isInvalid;\n\n const { 'aria-describedby': ariaDescribedby, 'aria-labelledby': ariaLabelledby } = inputProps;\n\n // Build aria-describedby string\n const describedBy = React.useMemo(() => {\n const parts = [];\n if (inputProps.errorMessage) parts.push(errorId);\n if (ariaDescribedby) parts.push(ariaDescribedby);\n return parts.length > 0 ? parts.join(' ') : undefined;\n }, [inputProps.errorMessage, ariaDescribedby, errorId]);\n\n // Build aria attributes\n const ariaProps = React.useMemo(\n () => ({\n 'aria-invalid': isInvalid,\n 'aria-describedby': describedBy,\n 'aria-labelledby': ariaLabelledby,\n }),\n [isInvalid, describedBy, ariaLabelledby],\n );\n\n // Filter out our custom props to avoid DOM warnings\n const {\n error,\n errorMessage,\n isInvalid: _isInvalid,\n required,\n 'aria-describedby': _ariaDescribedby,\n 'aria-labelledby': _ariaLabelledby,\n ...nativeInputProps\n } = inputProps;\n\n // Memoized pointer event handler\n const handlePointerDown = React.useCallback((event: React.PointerEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest('input, button, a')) return;\n\n const input = inputRef.current;\n if (!input) return;\n\n // Same selector as in the CSS to find the right slot\n const isRightSlot = target.closest(`\n .rt-TextFieldSlot[data-side='right'],\n .rt-TextFieldSlot:not([data-side='right']) ~ .rt-TextFieldSlot:not([data-side='left'])\n `);\n\n const cursorPosition = isRightSlot ? input.value.length : 0;\n\n requestAnimationFrame(() => {\n // Only some input types support this, browsers will throw an error if not supported\n // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange#:~:text=Note%20that%20according,not%20support%20selection%22.\n try {\n input.setSelectionRange(cursorPosition, cursorPosition);\n } catch {}\n input.focus();\n });\n }, []);\n\n return (\n <div\n data-accent-color={color}\n data-radius={radius}\n data-panel-background={effectiveMaterial}\n data-material={effectiveMaterial}\n style={style}\n className={classNames('rt-TextFieldRoot', className, {\n 'rt-error': isInvalid,\n })}\n onPointerDown={handlePointerDown}\n >\n <input\n spellCheck=\"false\"\n {...nativeInputProps}\n {...ariaProps}\n ref={composeRefs(inputRef, forwardedRef)}\n className=\"rt-reset rt-TextFieldInput\"\n />\n {children}\n {inputProps.errorMessage && (\n <div id={errorId} className=\"rt-TextFieldErrorMessage\" role=\"alert\" aria-live=\"polite\">\n {inputProps.errorMessage}\n </div>\n )}\n </div>\n );\n },\n);\nTextFieldRoot.displayName = 'TextField.Root';\n\ntype TextFieldSlotElement = React.ElementRef<'div'>;\ntype TextFieldSlotOwnProps = GetPropDefTypes<typeof textFieldSlotPropDefs> & TextFieldSlotScrubProps;\ninterface TextFieldSlotProps\n extends ComponentPropsWithout<'div', RemovedProps>,\n TextFieldSlotOwnProps {}\nconst TextFieldSlot = React.forwardRef<TextFieldSlotElement, TextFieldSlotProps>(\n (props, forwardedRef) => {\n // Extract scrub props first (not part of PropDef system)\n const {\n scrub,\n scrubValue,\n scrubStep = 1,\n scrubSensitivity = 1,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier = 10,\n scrubAltMultiplier = 0.1,\n onScrub,\n ...restProps\n } = props;\n\n // Then extract styling props\n const { className, color, side, ...slotProps } = extractProps(restProps, textFieldSlotPropDefs);\n\n const slotRef = React.useRef<HTMLDivElement>(null);\n const [isScrubbing, setIsScrubbing] = React.useState(false);\n // Virtual cursor position - X wraps around viewport, Y follows mouse\n const [cursorPosition, setCursorPosition] = React.useState({ x: 0, y: 0 });\n\n // Track accumulated sub-step movement for precision\n const accumulatedMovement = React.useRef(0);\n // Track current value for clamping (initialized to scrubValue when scrubbing starts)\n const currentValue = React.useRef(0);\n // Track virtual X position for wrap-around (separate from rendered position)\n const virtualX = React.useRef(0);\n\n // Store scrub config in refs so document handlers can access latest values\n const scrubConfigRef = React.useRef({\n scrubValue,\n scrubStep,\n scrubSensitivity,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier,\n scrubAltMultiplier,\n onScrub,\n });\n scrubConfigRef.current = {\n scrubValue,\n scrubStep,\n scrubSensitivity,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier,\n scrubAltMultiplier,\n onScrub,\n };\n\n const handlePointerDown = React.useCallback(\n (event: React.PointerEvent) => {\n if (!scrub) return;\n\n // Don't start scrubbing if clicking on interactive elements\n const target = event.target as HTMLElement;\n if (target.closest('input, button, a')) return;\n\n event.preventDefault();\n accumulatedMovement.current = 0;\n // Initialize to current value so min/max clamping works correctly\n currentValue.current = scrubValue ?? 0;\n\n // Initialize virtual cursor at actual mouse position\n virtualX.current = event.clientX;\n setCursorPosition({ x: event.clientX, y: event.clientY });\n\n // Request pointer lock for infinite movement (cursor won't hit screen edges)\n const slot = slotRef.current;\n if (slot) {\n slot.requestPointerLock();\n }\n },\n [scrub, scrubValue],\n );\n\n // Handle pointer lock state changes\n React.useEffect(() => {\n const handlePointerLockChange = () => {\n const isLocked = document.pointerLockElement === slotRef.current;\n setIsScrubbing(isLocked);\n if (!isLocked) {\n // Fire callback with isChanging = false when scrubbing ends\n scrubConfigRef.current.onScrub?.(0, false);\n accumulatedMovement.current = 0;\n currentValue.current = 0;\n }\n };\n\n document.addEventListener('pointerlockchange', handlePointerLockChange);\n return () => {\n document.removeEventListener('pointerlockchange', handlePointerLockChange);\n };\n }, []);\n\n // Attach document-level listeners when scrubbing starts\n React.useEffect(() => {\n if (!isScrubbing) return;\n\n const handleMouseMove = (event: MouseEvent) => {\n const config = scrubConfigRef.current;\n const movementX = event.movementX;\n const movementY = event.movementY;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Update virtual position with wrap-around at viewport edges\n virtualX.current += movementX;\n if (virtualX.current > viewportWidth) {\n virtualX.current = virtualX.current % viewportWidth;\n } else if (virtualX.current < 0) {\n virtualX.current = viewportWidth + (virtualX.current % viewportWidth);\n }\n\n // Also track Y with wrap-around\n setCursorPosition((prev) => {\n let newY = prev.y + movementY;\n if (newY > viewportHeight) {\n newY = newY % viewportHeight;\n } else if (newY < 0) {\n newY = viewportHeight + (newY % viewportHeight);\n }\n return { x: virtualX.current, y: newY };\n });\n\n // Accumulate movement for sensitivity calculation\n accumulatedMovement.current += movementX;\n\n // Calculate how many steps we've moved\n const stepsFromMovement = accumulatedMovement.current / config.scrubSensitivity;\n\n if (Math.abs(stepsFromMovement) >= 1) {\n // Determine modifier multiplier\n let multiplier = 1;\n if (event.shiftKey) {\n multiplier = config.scrubShiftMultiplier;\n } else if (event.altKey) {\n multiplier = config.scrubAltMultiplier;\n }\n\n // Calculate delta\n const wholeSteps = Math.trunc(stepsFromMovement);\n const delta = wholeSteps * config.scrubStep * multiplier;\n\n // Apply min/max clamping if bounds are set\n let clampedDelta = delta;\n if (config.scrubMin !== undefined || config.scrubMax !== undefined) {\n const newValue = currentValue.current + delta;\n const clampedValue = Math.max(\n config.scrubMin ?? -Infinity,\n Math.min(config.scrubMax ?? Infinity, newValue),\n );\n clampedDelta = clampedValue - currentValue.current;\n currentValue.current = clampedValue;\n } else {\n currentValue.current += delta;\n }\n\n // Fire callback with clamped delta (isChanging = true during drag)\n if (clampedDelta !== 0) {\n config.onScrub?.(clampedDelta, true);\n }\n\n // Keep the fractional remainder for smooth sub-pixel accumulation\n accumulatedMovement.current = (stepsFromMovement - wholeSteps) * config.scrubSensitivity;\n }\n };\n\n const handleMouseUp = () => {\n // Exit pointer lock to end scrubbing\n document.exitPointerLock();\n };\n\n // Use mousemove for pointer lock (pointermove doesn't work well with pointer lock)\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n // Disable text selection during scrubbing\n document.body.style.userSelect = 'none';\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.userSelect = '';\n };\n }, [isScrubbing]);\n\n // Render virtual cursor via portal to body so it's not clipped\n // Using a data URI of ew-resize cursor for a native look\n const virtualCursor = isScrubbing\n ? ReactDOM.createPortal(\n <img\n className=\"rt-TextFieldSlotScrubCursor\"\n src=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='black' stroke='white' stroke-width='1' d='M0 12 L5 7 L5 10 L19 10 L19 7 L24 12 L19 17 L19 14 L5 14 L5 17 Z'/%3E%3C/svg%3E\"\n alt=\"\"\n style={{\n position: 'fixed',\n left: cursorPosition.x,\n top: cursorPosition.y,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n zIndex: 99999,\n width: 24,\n height: 24,\n }}\n aria-hidden=\"true\"\n />,\n document.body,\n )\n : null;\n\n return (\n <div\n data-accent-color={color}\n data-side={side}\n data-scrub={scrub || undefined}\n data-scrubbing={isScrubbing || undefined}\n {...slotProps}\n ref={composeRefs(slotRef, forwardedRef)}\n className={classNames('rt-TextFieldSlot', className)}\n onPointerDown={scrub ? handlePointerDown : undefined}\n >\n {slotProps.children}\n {virtualCursor}\n </div>\n );\n },\n);\nTextFieldSlot.displayName = 'TextField.Slot';\n\nexport { TextFieldRoot as Root, TextFieldSlot as Slot };\nexport type { TextFieldRootProps as RootProps, TextFieldSlotProps as SlotProps };\n"],
5
- "mappings": "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",
6
- "names": ["React", "ReactDOM", "classNames", "composeRefs", "textFieldRootPropDefs", "textFieldSlotPropDefs", "extractProps", "marginPropDefs", "TextFieldRoot", "props", "forwardedRef", "inputRef", "children", "className", "color", "radius", "panelBackground", "material", "style", "inputProps", "effectiveMaterial", "errorId", "isInvalid", "ariaDescribedby", "ariaLabelledby", "describedBy", "parts", "ariaProps", "error", "errorMessage", "_isInvalid", "required", "_ariaDescribedby", "_ariaLabelledby", "nativeInputProps", "handlePointerDown", "event", "target", "input", "cursorPosition", "TextFieldSlot", "scrub", "scrubValue", "scrubStep", "scrubSensitivity", "scrubMin", "scrubMax", "scrubShiftMultiplier", "scrubAltMultiplier", "onScrub", "restProps", "side", "slotProps", "slotRef", "isScrubbing", "setIsScrubbing", "setCursorPosition", "accumulatedMovement", "currentValue", "virtualX", "scrubConfigRef", "slot", "handlePointerLockChange", "isLocked", "handleMouseMove", "config", "movementX", "movementY", "viewportWidth", "viewportHeight", "prev", "newY", "stepsFromMovement", "multiplier", "wholeSteps", "delta", "clampedDelta", "newValue", "clampedValue", "handleMouseUp", "virtualCursor"]
4
+ "sourcesContent": ["'use client';\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport { composeRefs } from 'radix-ui/internal';\n\nimport { textFieldRootPropDefs, textFieldSlotPropDefs, type TextFieldSlotScrubProps } from './text-field.props.js';\nimport { extractProps } from '../helpers/extract-props.js';\nimport { marginPropDefs } from '../props/margin.props.js';\n\nimport type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';\nimport type { NotInputTextualAttributes } from '../helpers/input-attributes.js';\nimport type { MarginProps } from '../props/margin.props.js';\nimport type { GetPropDefTypes } from '../props/prop-def.js';\n\ntype TextFieldRootElement = React.ElementRef<'input'>;\ntype TextFieldRootOwnProps = GetPropDefTypes<typeof textFieldRootPropDefs> & {\n defaultValue?: string | number;\n value?: string | number;\n type?: 'date' | 'datetime-local' | 'email' | 'hidden' | 'month' | 'number' | 'password' | 'search' | 'tel' | 'text' | 'time' | 'url' | 'week';\n};\ntype TextFieldInputProps = ComponentPropsWithout<'input', NotInputTextualAttributes | 'color' | 'defaultValue' | 'size' | 'type' | 'value'>;\ninterface TextFieldRootProps extends TextFieldInputProps, MarginProps, TextFieldRootOwnProps {}\nconst TextFieldRoot = React.forwardRef<TextFieldRootElement, TextFieldRootProps>((props, forwardedRef) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { children, className, color, radius, panelBackground, material, style, ...inputProps } = extractProps(props, textFieldRootPropDefs, marginPropDefs);\n const effectiveMaterial = material || panelBackground;\n\n // Generate unique IDs for accessibility\n const errorId = React.useId();\n\n // Determine invalid state\n const isInvalid = inputProps.error || inputProps.isInvalid;\n\n const { 'aria-describedby': ariaDescribedby, 'aria-labelledby': ariaLabelledby } = inputProps;\n\n // Build aria-describedby string\n const describedBy = React.useMemo(() => {\n const parts = [];\n if (inputProps.errorMessage) parts.push(errorId);\n if (ariaDescribedby) parts.push(ariaDescribedby);\n return parts.length > 0 ? parts.join(' ') : undefined;\n }, [inputProps.errorMessage, ariaDescribedby, errorId]);\n\n // Build aria attributes\n const ariaProps = React.useMemo(\n () => ({\n 'aria-invalid': isInvalid,\n 'aria-describedby': describedBy,\n 'aria-labelledby': ariaLabelledby,\n }),\n [isInvalid, describedBy, ariaLabelledby],\n );\n\n // Filter out our custom props to avoid DOM warnings\n const { error, errorMessage, isInvalid: _isInvalid, required, 'aria-describedby': _ariaDescribedby, 'aria-labelledby': _ariaLabelledby, ...nativeInputProps } = inputProps;\n\n // Memoized pointer event handler\n const handlePointerDown = React.useCallback((event: React.PointerEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest('input, button, a')) return;\n\n const input = inputRef.current;\n if (!input) return;\n\n // Same selector as in the CSS to find the right slot\n const isRightSlot = target.closest(`\n .rt-TextFieldSlot[data-side='right'],\n .rt-TextFieldSlot:not([data-side='right']) ~ .rt-TextFieldSlot:not([data-side='left'])\n `);\n\n const cursorPosition = isRightSlot ? input.value.length : 0;\n\n requestAnimationFrame(() => {\n // Only some input types support this, browsers will throw an error if not supported\n // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange#:~:text=Note%20that%20according,not%20support%20selection%22.\n try {\n input.setSelectionRange(cursorPosition, cursorPosition);\n } catch {}\n input.focus();\n });\n }, []);\n\n return (\n <div\n data-accent-color={color}\n data-radius={radius}\n data-panel-background={effectiveMaterial}\n data-material={effectiveMaterial}\n style={style}\n className={classNames('rt-TextFieldRoot', className, {\n 'rt-error': isInvalid,\n })}\n onPointerDown={handlePointerDown}\n >\n <input spellCheck=\"false\" {...nativeInputProps} {...ariaProps} ref={composeRefs(inputRef, forwardedRef)} className=\"rt-reset rt-TextFieldInput\" />\n {children}\n {inputProps.errorMessage && (\n <div id={errorId} className=\"rt-TextFieldErrorMessage\" role=\"alert\" aria-live=\"polite\">\n {inputProps.errorMessage}\n </div>\n )}\n </div>\n );\n});\nTextFieldRoot.displayName = 'TextField.Root';\n\ntype TextFieldSlotElement = React.ElementRef<'div'>;\ntype TextFieldSlotOwnProps = GetPropDefTypes<typeof textFieldSlotPropDefs> & TextFieldSlotScrubProps;\ninterface TextFieldSlotProps extends ComponentPropsWithout<'div', RemovedProps>, TextFieldSlotOwnProps {}\n\n// Detect if we should use pointer capture instead of pointer lock\n// Safari and Firefox show intrusive browser warnings with pointer lock\nconst usePointerCapture = (() => {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent;\n const isSafari = /^((?!chrome|android).)*safari/i.test(ua);\n const isFirefox = /firefox/i.test(ua);\n return isSafari || isFirefox;\n})();\n\nconst TextFieldSlot = React.forwardRef<TextFieldSlotElement, TextFieldSlotProps>((props, forwardedRef) => {\n // Extract scrub props first (not part of PropDef system)\n const { scrub, scrubValue, scrubStep = 1, scrubSensitivity = 1, scrubMin, scrubMax, scrubShiftMultiplier = 10, scrubAltMultiplier = 0.1, onScrub, ...restProps } = props;\n\n // Then extract styling props\n const { className, color, side, ...slotProps } = extractProps(restProps, textFieldSlotPropDefs);\n\n const slotRef = React.useRef<HTMLDivElement>(null);\n const [isScrubbing, setIsScrubbing] = React.useState(false);\n // Virtual cursor position - X wraps around viewport, Y follows mouse\n const [cursorPosition, setCursorPosition] = React.useState({ x: 0, y: 0 });\n\n // Track accumulated sub-step movement for precision\n const accumulatedMovement = React.useRef(0);\n // Track current value for clamping (initialized to scrubValue when scrubbing starts)\n const currentValue = React.useRef(0);\n // Track virtual X position for wrap-around (separate from rendered position)\n const virtualX = React.useRef(0);\n // Track pointer ID for capture mode\n const pointerIdRef = React.useRef<number | null>(null);\n // Track last X position for capture mode (movementX calculation)\n const lastXRef = React.useRef(0);\n\n // Store scrub config in refs so document handlers can access latest values\n const scrubConfigRef = React.useRef({\n scrubValue,\n scrubStep,\n scrubSensitivity,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier,\n scrubAltMultiplier,\n onScrub,\n });\n scrubConfigRef.current = {\n scrubValue,\n scrubStep,\n scrubSensitivity,\n scrubMin,\n scrubMax,\n scrubShiftMultiplier,\n scrubAltMultiplier,\n onScrub,\n };\n\n const handlePointerDown = React.useCallback(\n (event: React.PointerEvent) => {\n if (!scrub) return;\n\n // Don't start scrubbing if clicking on interactive elements\n const target = event.target as HTMLElement;\n if (target.closest('input, button, a')) return;\n\n event.preventDefault();\n accumulatedMovement.current = 0;\n // Initialize to current value so min/max clamping works correctly\n currentValue.current = scrubValue ?? 0;\n\n // Initialize virtual cursor at actual mouse position\n virtualX.current = event.clientX;\n setCursorPosition({ x: event.clientX, y: event.clientY });\n\n const slot = slotRef.current;\n if (!slot) return;\n\n if (usePointerCapture) {\n // Safari/Firefox: Use pointer capture (no browser warning)\n pointerIdRef.current = event.pointerId;\n lastXRef.current = event.clientX;\n slot.setPointerCapture(event.pointerId);\n setIsScrubbing(true);\n } else {\n // Chrome: Use pointer lock for infinite movement\n slot.requestPointerLock();\n }\n },\n [scrub, scrubValue],\n );\n\n // Handle pointer lock state changes (Chrome only)\n React.useEffect(() => {\n if (usePointerCapture) return;\n\n const handlePointerLockChange = () => {\n const isLocked = document.pointerLockElement === slotRef.current;\n setIsScrubbing(isLocked);\n if (!isLocked) {\n // Fire callback with isChanging = false when scrubbing ends\n scrubConfigRef.current.onScrub?.(0, false);\n accumulatedMovement.current = 0;\n currentValue.current = 0;\n }\n };\n\n document.addEventListener('pointerlockchange', handlePointerLockChange);\n return () => {\n document.removeEventListener('pointerlockchange', handlePointerLockChange);\n };\n }, []);\n\n // Shared scrub calculation logic\n const processScrubMovement = React.useCallback((movementX: number, movementY: number, shiftKey: boolean, altKey: boolean) => {\n const config = scrubConfigRef.current;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Update virtual position with wrap-around at viewport edges\n virtualX.current += movementX;\n if (virtualX.current > viewportWidth) {\n virtualX.current = virtualX.current % viewportWidth;\n } else if (virtualX.current < 0) {\n virtualX.current = viewportWidth + (virtualX.current % viewportWidth);\n }\n\n // Also track Y with wrap-around\n setCursorPosition((prev) => {\n let newY = prev.y + movementY;\n if (newY > viewportHeight) {\n newY = newY % viewportHeight;\n } else if (newY < 0) {\n newY = viewportHeight + (newY % viewportHeight);\n }\n return { x: virtualX.current, y: newY };\n });\n\n // Accumulate movement for sensitivity calculation\n accumulatedMovement.current += movementX;\n\n // Calculate how many steps we've moved\n const stepsFromMovement = accumulatedMovement.current / config.scrubSensitivity;\n\n if (Math.abs(stepsFromMovement) >= 1) {\n // Determine modifier multiplier\n let multiplier = 1;\n if (shiftKey) {\n multiplier = config.scrubShiftMultiplier;\n } else if (altKey) {\n multiplier = config.scrubAltMultiplier;\n }\n\n // Calculate delta\n const wholeSteps = Math.trunc(stepsFromMovement);\n const delta = wholeSteps * config.scrubStep * multiplier;\n\n // Apply min/max clamping if bounds are set\n let clampedDelta = delta;\n if (config.scrubMin !== undefined || config.scrubMax !== undefined) {\n const newValue = currentValue.current + delta;\n const clampedValue = Math.max(config.scrubMin ?? -Infinity, Math.min(config.scrubMax ?? Infinity, newValue));\n clampedDelta = clampedValue - currentValue.current;\n currentValue.current = clampedValue;\n } else {\n currentValue.current += delta;\n }\n\n // Fire callback with clamped delta (isChanging = true during drag)\n if (clampedDelta !== 0) {\n config.onScrub?.(clampedDelta, true);\n }\n\n // Keep the fractional remainder for smooth sub-pixel accumulation\n accumulatedMovement.current = (stepsFromMovement - wholeSteps) * config.scrubSensitivity;\n }\n }, []);\n\n // End scrubbing helper\n const endScrubbing = React.useCallback(() => {\n scrubConfigRef.current.onScrub?.(0, false);\n accumulatedMovement.current = 0;\n currentValue.current = 0;\n pointerIdRef.current = null;\n setIsScrubbing(false);\n }, []);\n\n // Handle pointer capture mode events (Safari/Firefox)\n const handlePointerMove = React.useCallback(\n (event: React.PointerEvent) => {\n if (!isScrubbing || !usePointerCapture) return;\n\n const movementX = event.clientX - lastXRef.current;\n lastXRef.current = event.clientX;\n\n processScrubMovement(movementX, event.movementY, event.shiftKey, event.altKey);\n },\n [isScrubbing, processScrubMovement],\n );\n\n const handlePointerUp = React.useCallback(\n (event: React.PointerEvent) => {\n if (!usePointerCapture || pointerIdRef.current !== event.pointerId) return;\n\n const slot = slotRef.current;\n if (slot && pointerIdRef.current !== null) {\n slot.releasePointerCapture(pointerIdRef.current);\n }\n endScrubbing();\n },\n [endScrubbing],\n );\n\n const handleLostPointerCapture = React.useCallback(() => {\n if (usePointerCapture && isScrubbing) {\n endScrubbing();\n }\n }, [isScrubbing, endScrubbing]);\n\n // Attach document-level listeners for pointer lock mode (Chrome)\n React.useEffect(() => {\n if (!isScrubbing || usePointerCapture) return;\n\n const handleMouseMove = (event: MouseEvent) => {\n processScrubMovement(event.movementX, event.movementY, event.shiftKey, event.altKey);\n };\n\n const handleMouseUp = () => {\n // Exit pointer lock to end scrubbing\n document.exitPointerLock();\n };\n\n // Use mousemove for pointer lock (pointermove doesn't work well with pointer lock)\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n // Disable text selection during scrubbing\n document.body.style.userSelect = 'none';\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.userSelect = '';\n };\n }, [isScrubbing, processScrubMovement]);\n\n // Hide native cursor and disable text selection during pointer capture scrubbing\n React.useEffect(() => {\n if (!isScrubbing || !usePointerCapture) return;\n\n // Create a style element to hide cursor globally during scrub\n const style = document.createElement('style');\n style.textContent = '* { cursor: none !important; user-select: none !important; }';\n document.head.appendChild(style);\n\n return () => {\n document.head.removeChild(style);\n };\n }, [isScrubbing]);\n\n // Render virtual cursor via portal to body so it's not clipped\n // Using a data URI of ew-resize cursor for a native look\n const virtualCursor = isScrubbing\n ? ReactDOM.createPortal(\n <img\n className=\"rt-TextFieldSlotScrubCursor\"\n src=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='black' stroke='white' stroke-width='1' d='M0 12 L5 7 L5 10 L19 10 L19 7 L24 12 L19 17 L19 14 L5 14 L5 17 Z'/%3E%3C/svg%3E\"\n alt=\"\"\n style={{\n position: 'fixed',\n left: cursorPosition.x,\n top: cursorPosition.y,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n zIndex: 99999,\n width: 24,\n height: 24,\n }}\n aria-hidden=\"true\"\n />,\n document.body,\n )\n : null;\n\n return (\n <div\n data-accent-color={color}\n data-side={side}\n data-scrub={scrub || undefined}\n data-scrubbing={isScrubbing || undefined}\n {...slotProps}\n ref={composeRefs(slotRef, forwardedRef)}\n className={classNames('rt-TextFieldSlot', className)}\n onPointerDown={scrub ? handlePointerDown : undefined}\n onPointerMove={scrub ? handlePointerMove : undefined}\n onPointerUp={scrub ? handlePointerUp : undefined}\n onLostPointerCapture={scrub ? handleLostPointerCapture : undefined}\n >\n {slotProps.children}\n {virtualCursor}\n </div>\n );\n});\nTextFieldSlot.displayName = 'TextField.Slot';\n\nexport { TextFieldRoot as Root, TextFieldSlot as Slot };\nexport type { TextFieldRootProps as RootProps, TextFieldSlotProps as SlotProps };\n"],
5
+ "mappings": "aAEA,UAAYA,MAAW,QACvB,UAAYC,OAAc,YAC1B,OAAOC,MAAgB,aACvB,OAAS,eAAAC,MAAmB,oBAE5B,OAAS,yBAAAC,GAAuB,yBAAAC,OAA2D,wBAC3F,OAAS,gBAAAC,MAAoB,8BAC7B,OAAS,kBAAAC,OAAsB,2BAe/B,MAAMC,EAAgBR,EAAM,WAAqD,CAACS,EAAOC,IAAiB,CACxG,MAAMC,EAAWX,EAAM,OAAyB,IAAI,EAC9C,CAAE,SAAAY,EAAU,UAAAC,EAAW,MAAAC,EAAO,OAAAC,EAAQ,gBAAAC,EAAiB,SAAAC,EAAU,MAAAC,EAAO,GAAGC,CAAW,EAAIb,EAAaG,EAAOL,GAAuBG,EAAc,EACnJa,EAAoBH,GAAYD,EAGhCK,EAAUrB,EAAM,MAAM,EAGtBsB,EAAYH,EAAW,OAASA,EAAW,UAE3C,CAAE,mBAAoBI,EAAiB,kBAAmBC,CAAe,EAAIL,EAG7EM,EAAczB,EAAM,QAAQ,IAAM,CACtC,MAAM0B,EAAQ,CAAC,EACf,OAAIP,EAAW,cAAcO,EAAM,KAAKL,CAAO,EAC3CE,GAAiBG,EAAM,KAAKH,CAAe,EACxCG,EAAM,OAAS,EAAIA,EAAM,KAAK,GAAG,EAAI,MAC9C,EAAG,CAACP,EAAW,aAAcI,EAAiBF,CAAO,CAAC,EAGhDM,EAAY3B,EAAM,QACtB,KAAO,CACL,eAAgBsB,EAChB,mBAAoBG,EACpB,kBAAmBD,CACrB,GACA,CAACF,EAAWG,EAAaD,CAAc,CACzC,EAGM,CAAE,MAAAI,EAAO,aAAAC,EAAc,UAAWC,EAAY,SAAAC,EAAU,mBAAoBC,EAAkB,kBAAmBC,EAAiB,GAAGC,CAAiB,EAAIf,EAG1JgB,EAAoBnC,EAAM,YAAaoC,GAA8B,CACzE,MAAMC,EAASD,EAAM,OACrB,GAAIC,EAAO,QAAQ,kBAAkB,EAAG,OAExC,MAAMC,EAAQ3B,EAAS,QACvB,GAAI,CAAC2B,EAAO,OAQZ,MAAMC,EALcF,EAAO,QAAQ;AAAA;AAAA;AAAA,OAGhC,EAEkCC,EAAM,MAAM,OAAS,EAE1D,sBAAsB,IAAM,CAG1B,GAAI,CACFA,EAAM,kBAAkBC,EAAgBA,CAAc,CACxD,MAAQ,CAAC,CACTD,EAAM,MAAM,CACd,CAAC,CACH,EAAG,CAAC,CAAC,EAEL,OACEtC,EAAA,cAAC,OACC,oBAAmBc,EACnB,cAAaC,EACb,wBAAuBK,EACvB,gBAAeA,EACf,MAAOF,EACP,UAAWhB,EAAW,mBAAoBW,EAAW,CACnD,WAAYS,CACd,CAAC,EACD,cAAea,GAEfnC,EAAA,cAAC,SAAM,WAAW,QAAS,GAAGkC,EAAmB,GAAGP,EAAW,IAAKxB,EAAYQ,EAAUD,CAAY,EAAG,UAAU,6BAA6B,EAC/IE,EACAO,EAAW,cACVnB,EAAA,cAAC,OAAI,GAAIqB,EAAS,UAAU,2BAA2B,KAAK,QAAQ,YAAU,UAC3EF,EAAW,YACd,CAEJ,CAEJ,CAAC,EACDX,EAAc,YAAc,iBAQ5B,MAAMgC,GAAqB,IAAM,CAC/B,GAAI,OAAO,UAAc,IAAa,MAAO,GAC7C,MAAMC,EAAK,UAAU,UACfC,EAAW,iCAAiC,KAAKD,CAAE,EACnDE,EAAY,WAAW,KAAKF,CAAE,EACpC,OAAOC,GAAYC,CACrB,GAAG,EAEGC,EAAgB5C,EAAM,WAAqD,CAACS,EAAOC,IAAiB,CAExG,KAAM,CAAE,MAAAmC,EAAO,WAAAC,EAAY,UAAAC,EAAY,EAAG,iBAAAC,EAAmB,EAAG,SAAAC,EAAU,SAAAC,EAAU,qBAAAC,EAAuB,GAAI,mBAAAC,EAAqB,GAAK,QAAAC,EAAS,GAAGC,CAAU,EAAI7C,EAG7J,CAAE,UAAAI,EAAW,MAAAC,EAAO,KAAAyC,EAAM,GAAGC,CAAU,EAAIlD,EAAagD,EAAWjD,EAAqB,EAExFoD,EAAUzD,EAAM,OAAuB,IAAI,EAC3C,CAAC0D,EAAaC,CAAc,EAAI3D,EAAM,SAAS,EAAK,EAEpD,CAACuC,EAAgBqB,CAAiB,EAAI5D,EAAM,SAAS,CAAE,EAAG,EAAG,EAAG,CAAE,CAAC,EAGnE6D,EAAsB7D,EAAM,OAAO,CAAC,EAEpC8D,EAAe9D,EAAM,OAAO,CAAC,EAE7B+D,EAAW/D,EAAM,OAAO,CAAC,EAEzBgE,EAAehE,EAAM,OAAsB,IAAI,EAE/CiE,EAAWjE,EAAM,OAAO,CAAC,EAGzBkE,EAAiBlE,EAAM,OAAO,CAClC,WAAA8C,EACA,UAAAC,EACA,iBAAAC,EACA,SAAAC,EACA,SAAAC,EACA,qBAAAC,EACA,mBAAAC,EACA,QAAAC,CACF,CAAC,EACDa,EAAe,QAAU,CACvB,WAAApB,EACA,UAAAC,EACA,iBAAAC,EACA,SAAAC,EACA,SAAAC,EACA,qBAAAC,EACA,mBAAAC,EACA,QAAAC,CACF,EAEA,MAAMlB,EAAoBnC,EAAM,YAC7BoC,GAA8B,CAK7B,GAJI,CAACS,GAGUT,EAAM,OACV,QAAQ,kBAAkB,EAAG,OAExCA,EAAM,eAAe,EACrByB,EAAoB,QAAU,EAE9BC,EAAa,QAAUhB,GAAc,EAGrCiB,EAAS,QAAU3B,EAAM,QACzBwB,EAAkB,CAAE,EAAGxB,EAAM,QAAS,EAAGA,EAAM,OAAQ,CAAC,EAExD,MAAM+B,EAAOV,EAAQ,QAChBU,IAED3B,GAEFwB,EAAa,QAAU5B,EAAM,UAC7B6B,EAAS,QAAU7B,EAAM,QACzB+B,EAAK,kBAAkB/B,EAAM,SAAS,EACtCuB,EAAe,EAAI,GAGnBQ,EAAK,mBAAmB,EAE5B,EACA,CAACtB,EAAOC,CAAU,CACpB,EAGA9C,EAAM,UAAU,IAAM,CACpB,GAAIwC,EAAmB,OAEvB,MAAM4B,EAA0B,IAAM,CACpC,MAAMC,EAAW,SAAS,qBAAuBZ,EAAQ,QACzDE,EAAeU,CAAQ,EAClBA,IAEHH,EAAe,QAAQ,UAAU,EAAG,EAAK,EACzCL,EAAoB,QAAU,EAC9BC,EAAa,QAAU,EAE3B,EAEA,gBAAS,iBAAiB,oBAAqBM,CAAuB,EAC/D,IAAM,CACX,SAAS,oBAAoB,oBAAqBA,CAAuB,CAC3E,CACF,EAAG,CAAC,CAAC,EAGL,MAAME,EAAuBtE,EAAM,YAAY,CAACuE,EAAmBC,EAAmBC,EAAmBC,IAAoB,CAC3H,MAAMC,EAAST,EAAe,QACxBU,EAAgB,OAAO,WACvBC,EAAiB,OAAO,YAG9Bd,EAAS,SAAWQ,EAChBR,EAAS,QAAUa,EACrBb,EAAS,QAAUA,EAAS,QAAUa,EAC7Bb,EAAS,QAAU,IAC5BA,EAAS,QAAUa,EAAiBb,EAAS,QAAUa,GAIzDhB,EAAmBkB,GAAS,CAC1B,IAAIC,EAAOD,EAAK,EAAIN,EACpB,OAAIO,EAAOF,EACTE,EAAOA,EAAOF,EACLE,EAAO,IAChBA,EAAOF,EAAkBE,EAAOF,GAE3B,CAAE,EAAGd,EAAS,QAAS,EAAGgB,CAAK,CACxC,CAAC,EAGDlB,EAAoB,SAAWU,EAG/B,MAAMS,EAAoBnB,EAAoB,QAAUc,EAAO,iBAE/D,GAAI,KAAK,IAAIK,CAAiB,GAAK,EAAG,CAEpC,IAAIC,EAAa,EACbR,EACFQ,EAAaN,EAAO,qBACXD,IACTO,EAAaN,EAAO,oBAItB,MAAMO,EAAa,KAAK,MAAMF,CAAiB,EACzCG,EAAQD,EAAaP,EAAO,UAAYM,EAG9C,IAAIG,EAAeD,EACnB,GAAIR,EAAO,WAAa,QAAaA,EAAO,WAAa,OAAW,CAClE,MAAMU,GAAWvB,EAAa,QAAUqB,EAClCG,EAAe,KAAK,IAAIX,EAAO,UAAY,KAAW,KAAK,IAAIA,EAAO,UAAY,IAAUU,EAAQ,CAAC,EAC3GD,EAAeE,EAAexB,EAAa,QAC3CA,EAAa,QAAUwB,CACzB,MACExB,EAAa,SAAWqB,EAItBC,IAAiB,GACnBT,EAAO,UAAUS,EAAc,EAAI,EAIrCvB,EAAoB,SAAWmB,EAAoBE,GAAcP,EAAO,gBAC1E,CACF,EAAG,CAAC,CAAC,EAGCY,EAAevF,EAAM,YAAY,IAAM,CAC3CkE,EAAe,QAAQ,UAAU,EAAG,EAAK,EACzCL,EAAoB,QAAU,EAC9BC,EAAa,QAAU,EACvBE,EAAa,QAAU,KACvBL,EAAe,EAAK,CACtB,EAAG,CAAC,CAAC,EAGC6B,EAAoBxF,EAAM,YAC7BoC,GAA8B,CAC7B,GAAI,CAACsB,GAAe,CAAClB,EAAmB,OAExC,MAAM+B,EAAYnC,EAAM,QAAU6B,EAAS,QAC3CA,EAAS,QAAU7B,EAAM,QAEzBkC,EAAqBC,EAAWnC,EAAM,UAAWA,EAAM,SAAUA,EAAM,MAAM,CAC/E,EACA,CAACsB,EAAaY,CAAoB,CACpC,EAEMmB,EAAkBzF,EAAM,YAC3BoC,GAA8B,CAC7B,GAAI,CAACI,GAAqBwB,EAAa,UAAY5B,EAAM,UAAW,OAEpE,MAAM+B,EAAOV,EAAQ,QACjBU,GAAQH,EAAa,UAAY,MACnCG,EAAK,sBAAsBH,EAAa,OAAO,EAEjDuB,EAAa,CACf,EACA,CAACA,CAAY,CACf,EAEMG,EAA2B1F,EAAM,YAAY,IAAM,CACnDwC,GAAqBkB,GACvB6B,EAAa,CAEjB,EAAG,CAAC7B,EAAa6B,CAAY,CAAC,EAG9BvF,EAAM,UAAU,IAAM,CACpB,GAAI,CAAC0D,GAAelB,EAAmB,OAEvC,MAAMmD,EAAmBvD,GAAsB,CAC7CkC,EAAqBlC,EAAM,UAAWA,EAAM,UAAWA,EAAM,SAAUA,EAAM,MAAM,CACrF,EAEMwD,EAAgB,IAAM,CAE1B,SAAS,gBAAgB,CAC3B,EAGA,gBAAS,iBAAiB,YAAaD,CAAe,EACtD,SAAS,iBAAiB,UAAWC,CAAa,EAGlD,SAAS,KAAK,MAAM,WAAa,OAE1B,IAAM,CACX,SAAS,oBAAoB,YAAaD,CAAe,EACzD,SAAS,oBAAoB,UAAWC,CAAa,EACrD,SAAS,KAAK,MAAM,WAAa,EACnC,CACF,EAAG,CAAClC,EAAaY,CAAoB,CAAC,EAGtCtE,EAAM,UAAU,IAAM,CACpB,GAAI,CAAC0D,GAAe,CAAClB,EAAmB,OAGxC,MAAMtB,EAAQ,SAAS,cAAc,OAAO,EAC5C,OAAAA,EAAM,YAAc,+DACpB,SAAS,KAAK,YAAYA,CAAK,EAExB,IAAM,CACX,SAAS,KAAK,YAAYA,CAAK,CACjC,CACF,EAAG,CAACwC,CAAW,CAAC,EAIhB,MAAMmC,EAAgBnC,EAClBzD,GAAS,aACPD,EAAA,cAAC,OACC,UAAU,8BACV,IAAI,oPACJ,IAAI,GACJ,MAAO,CACL,SAAU,QACV,KAAMuC,EAAe,EACrB,IAAKA,EAAe,EACpB,UAAW,wBACX,cAAe,OACf,OAAQ,MACR,MAAO,GACP,OAAQ,EACV,EACA,cAAY,OACd,EACA,SAAS,IACX,EACA,KAEJ,OACEvC,EAAA,cAAC,OACC,oBAAmBc,EACnB,YAAWyC,EACX,aAAYV,GAAS,OACrB,iBAAgBa,GAAe,OAC9B,GAAGF,EACJ,IAAKrD,EAAYsD,EAAS/C,CAAY,EACtC,UAAWR,EAAW,mBAAoBW,CAAS,EACnD,cAAegC,EAAQV,EAAoB,OAC3C,cAAeU,EAAQ2C,EAAoB,OAC3C,YAAa3C,EAAQ4C,EAAkB,OACvC,qBAAsB5C,EAAQ6C,EAA2B,QAExDlC,EAAU,SACVqC,CACH,CAEJ,CAAC,EACDjD,EAAc,YAAc",
6
+ "names": ["React", "ReactDOM", "classNames", "composeRefs", "textFieldRootPropDefs", "textFieldSlotPropDefs", "extractProps", "marginPropDefs", "TextFieldRoot", "props", "forwardedRef", "inputRef", "children", "className", "color", "radius", "panelBackground", "material", "style", "inputProps", "effectiveMaterial", "errorId", "isInvalid", "ariaDescribedby", "ariaLabelledby", "describedBy", "parts", "ariaProps", "error", "errorMessage", "_isInvalid", "required", "_ariaDescribedby", "_ariaLabelledby", "nativeInputProps", "handlePointerDown", "event", "target", "input", "cursorPosition", "usePointerCapture", "ua", "isSafari", "isFirefox", "TextFieldSlot", "scrub", "scrubValue", "scrubStep", "scrubSensitivity", "scrubMin", "scrubMax", "scrubShiftMultiplier", "scrubAltMultiplier", "onScrub", "restProps", "side", "slotProps", "slotRef", "isScrubbing", "setIsScrubbing", "setCursorPosition", "accumulatedMovement", "currentValue", "virtualX", "pointerIdRef", "lastXRef", "scrubConfigRef", "slot", "handlePointerLockChange", "isLocked", "processScrubMovement", "movementX", "movementY", "shiftKey", "altKey", "config", "viewportWidth", "viewportHeight", "prev", "newY", "stepsFromMovement", "multiplier", "wholeSteps", "delta", "clampedDelta", "newValue", "clampedValue", "endScrubbing", "handlePointerMove", "handlePointerUp", "handleLostPointerCapture", "handleMouseMove", "handleMouseUp", "virtualCursor"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kushagradhawan/kookie-ui",
3
- "version": "0.1.103",
3
+ "version": "0.1.105",
4
4
  "description": "A modern React component library with beautiful design tokens, flexible theming, and comprehensive documentation",
5
5
  "keywords": [
6
6
  "react",
@@ -279,6 +279,6 @@
279
279
  "title": "Base-button Component Props",
280
280
  "description": "Props schema for the base-button component in Kookie UI",
281
281
  "version": "1.0.0",
282
- "generatedAt": "2026-01-05T09:18:51.681Z",
282
+ "generatedAt": "2026-01-05T19:36:34.470Z",
283
283
  "source": "Zod schema"
284
284
  }
@@ -530,6 +530,6 @@
530
530
  "title": "Button Component Props",
531
531
  "description": "Props schema for the button component in Kookie UI",
532
532
  "version": "1.0.0",
533
- "generatedAt": "2026-01-05T09:18:51.687Z",
533
+ "generatedAt": "2026-01-05T19:36:34.477Z",
534
534
  "source": "Zod schema"
535
535
  }
@@ -313,6 +313,6 @@
313
313
  "title": "Icon-button Component Props",
314
314
  "description": "Props schema for the icon-button component in Kookie UI",
315
315
  "version": "1.0.0",
316
- "generatedAt": "2026-01-05T09:18:51.688Z",
316
+ "generatedAt": "2026-01-05T19:36:34.477Z",
317
317
  "source": "Zod schema"
318
318
  }
@@ -3,7 +3,7 @@
3
3
  "title": "Kookie UI Button Components",
4
4
  "description": "Complete JSON Schema collection for all button components in Kookie UI",
5
5
  "version": "1.0.0",
6
- "generatedAt": "2026-01-05T09:18:51.691Z",
6
+ "generatedAt": "2026-01-05T19:36:34.480Z",
7
7
  "source": "Zod schemas",
8
8
  "components": {
9
9
  "base-button": {
@@ -287,7 +287,7 @@
287
287
  "title": "Base-button Component Props",
288
288
  "description": "Props schema for the base-button component in Kookie UI",
289
289
  "version": "1.0.0",
290
- "generatedAt": "2026-01-05T09:18:51.681Z",
290
+ "generatedAt": "2026-01-05T19:36:34.470Z",
291
291
  "source": "Zod schema"
292
292
  },
293
293
  "button": {
@@ -822,7 +822,7 @@
822
822
  "title": "Button Component Props",
823
823
  "description": "Props schema for the button component in Kookie UI",
824
824
  "version": "1.0.0",
825
- "generatedAt": "2026-01-05T09:18:51.687Z",
825
+ "generatedAt": "2026-01-05T19:36:34.477Z",
826
826
  "source": "Zod schema"
827
827
  },
828
828
  "icon-button": {
@@ -1140,7 +1140,7 @@
1140
1140
  "title": "Icon-button Component Props",
1141
1141
  "description": "Props schema for the icon-button component in Kookie UI",
1142
1142
  "version": "1.0.0",
1143
- "generatedAt": "2026-01-05T09:18:51.688Z",
1143
+ "generatedAt": "2026-01-05T19:36:34.477Z",
1144
1144
  "source": "Zod schema"
1145
1145
  },
1146
1146
  "toggle-button": {
@@ -1683,7 +1683,7 @@
1683
1683
  "title": "Toggle-button Component Props",
1684
1684
  "description": "Props schema for the toggle-button component in Kookie UI",
1685
1685
  "version": "1.0.0",
1686
- "generatedAt": "2026-01-05T09:18:51.690Z",
1686
+ "generatedAt": "2026-01-05T19:36:34.479Z",
1687
1687
  "source": "Zod schema"
1688
1688
  },
1689
1689
  "toggle-icon-button": {
@@ -2009,7 +2009,7 @@
2009
2009
  "title": "Toggle-icon-button Component Props",
2010
2010
  "description": "Props schema for the toggle-icon-button component in Kookie UI",
2011
2011
  "version": "1.0.0",
2012
- "generatedAt": "2026-01-05T09:18:51.691Z",
2012
+ "generatedAt": "2026-01-05T19:36:34.480Z",
2013
2013
  "source": "Zod schema"
2014
2014
  }
2015
2015
  }
@@ -538,6 +538,6 @@
538
538
  "title": "Toggle-button Component Props",
539
539
  "description": "Props schema for the toggle-button component in Kookie UI",
540
540
  "version": "1.0.0",
541
- "generatedAt": "2026-01-05T09:18:51.690Z",
541
+ "generatedAt": "2026-01-05T19:36:34.479Z",
542
542
  "source": "Zod schema"
543
543
  }
@@ -321,6 +321,6 @@
321
321
  "title": "Toggle-icon-button Component Props",
322
322
  "description": "Props schema for the toggle-icon-button component in Kookie UI",
323
323
  "version": "1.0.0",
324
- "generatedAt": "2026-01-05T09:18:51.691Z",
324
+ "generatedAt": "2026-01-05T19:36:34.480Z",
325
325
  "source": "Zod schema"
326
326
  }
@@ -79,12 +79,6 @@
79
79
  cursor: default;
80
80
  }
81
81
 
82
- /* Focus-visible support */
83
- &:where(:focus-visible) {
84
- outline: 2px solid var(--focus-8);
85
- outline-offset: -2px;
86
- }
87
-
88
82
  /* Enhanced reduced motion support */
89
83
  @media (prefers-reduced-motion: reduce) {
90
84
  transition: none;