@spark-ui/components 17.1.1 → 17.2.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  import { Ref } from 'react';
2
2
  import { RadioInputProps } from './RadioInput';
3
3
  export type RadioProps = RadioInputProps & {
4
- ref?: Ref<HTMLButtonElement>;
4
+ ref?: Ref<HTMLElement>;
5
5
  };
6
6
  export declare const Radio: {
7
- ({ className, children, id, disabled: disabledProp, ref, ...others }: RadioProps): import("react/jsx-runtime").JSX.Element;
7
+ ({ className, children, disabled: disabledProp, ref, ...others }: RadioProps): import("react/jsx-runtime").JSX.Element;
8
8
  displayName: string;
9
9
  };
@@ -38,10 +38,6 @@ export interface RadioGroupProps extends RadioGroupVariantsProps, Pick<RadioInpu
38
38
  * The reading direction of the radio group.
39
39
  */
40
40
  dir?: 'ltr' | 'rtl';
41
- /**
42
- * When true, keyboard navigation will loop from last item to first, and vice versa.
43
- */
44
- loop?: boolean;
45
41
  /**
46
42
  * When true, the label will be placed on the left side of the Radio
47
43
  */
@@ -49,6 +45,6 @@ export interface RadioGroupProps extends RadioGroupVariantsProps, Pick<RadioInpu
49
45
  ref?: Ref<HTMLDivElement>;
50
46
  }
51
47
  export declare const RadioGroup: {
52
- ({ orientation, loop, intent, disabled, className, required: requiredProp, reverse, ref, ...others }: RadioGroupProps): import("react/jsx-runtime").JSX.Element;
48
+ ({ orientation, intent, disabled, className, required: requiredProp, reverse, onValueChange: onValueChangeProp, ref, ...others }: RadioGroupProps): import("react/jsx-runtime").JSX.Element;
53
49
  displayName: string;
54
50
  };
@@ -3,16 +3,13 @@ import { RadioIndicatorStylesProps } from './RadioIndicator.styles';
3
3
  export interface RadioIndicatorProps extends RadioIndicatorStylesProps {
4
4
  className?: string;
5
5
  /**
6
- * Change the component to the HTML tag or custom component of the only child.
6
+ * Whether to keep the indicator mounted in the DOM when the radio is unchecked.
7
+ * Useful when controlling animation with React animation libraries.
7
8
  */
8
- asChild?: boolean;
9
- /**
10
- * Used to force mounting when more control is needed. Useful when controlling animation with React animation libraries.
11
- */
12
- forceMount?: true | undefined;
9
+ keepMounted?: boolean;
13
10
  ref?: Ref<HTMLSpanElement>;
14
11
  }
15
12
  export declare const RadioIndicator: {
16
- ({ intent, className, ref, ...others }: RadioIndicatorProps): import("react/jsx-runtime").JSX.Element;
13
+ ({ intent, className, keepMounted, ref, ...others }: RadioIndicatorProps): import("react/jsx-runtime").JSX.Element;
17
14
  displayName: string;
18
15
  };
@@ -1,8 +1,9 @@
1
- import { ButtonHTMLAttributes, Ref } from 'react';
1
+ import { HTMLAttributes, Ref } from 'react';
2
2
  import { RadioInputVariantsProps } from './RadioInput.styles';
3
- export interface RadioInputProps extends RadioInputVariantsProps, Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value' | 'onChange'> {
3
+ export interface RadioInputProps extends RadioInputVariantsProps, Omit<HTMLAttributes<HTMLElement>, 'value' | 'onChange'> {
4
4
  /**
5
5
  * Change the component to the HTML tag or custom component of the only child.
6
+ * Uses Base UI's render prop internally to merge behaviour into the child element.
6
7
  */
7
8
  asChild?: boolean;
8
9
  /**
@@ -17,9 +18,20 @@ export interface RadioInputProps extends RadioInputVariantsProps, Omit<ButtonHTM
17
18
  * When true, indicates that the user must check the radio item before the owning form can be submitted.
18
19
  */
19
20
  required?: boolean;
20
- ref?: Ref<HTMLButtonElement>;
21
+ /**
22
+ * Ref forwarded to the hidden `<input type="radio">` rendered by Base UI.
23
+ * Useful for programmatic activation (e.g. clicking from an associated label span).
24
+ */
25
+ inputRef?: Ref<HTMLInputElement>;
26
+ ref?: Ref<HTMLElement>;
27
+ /**
28
+ * When true, the visual radio input (outer ring and inner dot) is visually hidden but remains
29
+ * accessible in the DOM. Useful for custom radio appearances where only the label matters visually.
30
+ * @default false
31
+ */
32
+ hideInput?: boolean;
21
33
  }
22
34
  export declare const RadioInput: {
23
- ({ intent: intentProp, className, ref, ...others }: RadioInputProps): import("react/jsx-runtime").JSX.Element;
35
+ ({ intent: intentProp, className, asChild, children, inputRef, hideInput, ref, ...others }: RadioInputProps): import("react/jsx-runtime").JSX.Element;
24
36
  displayName: string;
25
37
  };
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),d=require("class-variance-authority"),s=require("react"),G=require("@spark-ui/components/form-field"),b=require("radix-ui"),y=require("@spark-ui/internal-utils"),k=s.createContext(null),w=()=>{const e=s.useContext(k);if(!e)throw Error("useRadioGroup must be used within a RadioGroup provider");return e},V=d.cva(["relative block","size-3/5","after:absolute","after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2","after:h-0","after:w-0","after:block","after:rounded-[50%]","after:content-['']","after:transition-all","data-[state=checked]:after:size-full"],{variants:{intent:y.makeVariants({main:["after:bg-main"],support:["after:bg-support"],accent:["after:bg-accent"],neutral:["after:bg-neutral"],success:["after:bg-success"],alert:["after:bg-alert"],error:["after:bg-error"],info:["after:bg-info"]})},defaultVariants:{intent:"support"}}),I=({intent:e,className:r,ref:t,...o})=>a.jsx(b.RadioGroup.Indicator,{ref:t,className:V({intent:e,className:r}),...o});I.displayName="RadioGroup.RadioIndicator";const L=d.cva(["flex shrink-0 items-center justify-center","rounded-full","border-md","outline-hidden","hover:ring-4","focus-visible:u-outline","disabled:cursor-not-allowed disabled:border-outline/dim-2 disabled:hover:ring-transparent","u-shadow-border-transition","size-sz-24"],{variants:{intent:y.makeVariants({main:["border-outline","data-[state=checked]:border-main","hover:ring-main-container"],support:["border-outline","data-[state=checked]:border-support","hover:ring-support-container"],accent:["border-outline","data-[state=checked]:border-accent","hover:ring-accent-container"],neutral:["border-outline","data-[state=checked]:border-neutral","hover:ring-neutral-container"],info:["border-info","data-[state=checked]:border-info","hover:ring-info-container"],success:["border-success","data-[state=checked]:border-success","hover:ring-success-container"],alert:["border-alert","data-[state=checked]:border-alert","hover:ring-alert-container"],error:["border-error","data-[state=checked]:border-error","hover:ring-error-container"]})},defaultVariants:{intent:"support"}}),j=({intent:e,className:r,ref:t,...o})=>{const{state:n}=G.useFormFieldControl(),i=n??e;return a.jsx(b.RadioGroup.RadioGroupItem,{"data-spark-component":"radio-input",ref:t,className:L({intent:i,className:r}),...o,children:a.jsx(I,{intent:i,forceMount:!0})})};j.displayName="RadioGroup.RadioInput";const z=d.cva("grow",{variants:{disabled:{true:["text-neutral/dim-2","cursor-not-allowed"],false:["cursor-pointer"]}},defaultVariants:{disabled:!1}}),N=({disabled:e,...r})=>a.jsx(b.Label.Root,{"data-spark-component":"radio-label",className:z({disabled:e}),...r});N.displayName="RadioGroup.RadioLabel";const x=":radio",v=({className:e,children:r,id:t,disabled:o,ref:n,...i})=>{const c=`${x}-input-${s.useId()}`,l=`${x}-label-${s.useId()}`,{intent:f,disabled:m,reverse:R}=w(),u=r&&a.jsx(N,{disabled:o||m,htmlFor:t||c,id:l,children:r}),p=a.jsx(j,{ref:n,id:t||c,intent:f,"aria-labelledby":r?l:void 0,...i,disabled:o}),h=R?a.jsxs(a.Fragment,{children:[u,p]}):a.jsxs(a.Fragment,{children:[p,u]});return a.jsx("span",{className:d.cx("gap-md text-body-1 flex items-start",e),children:h})};v.displayName="RadioGroup.Radio";const C=d.cva(["flex"],{variants:{orientation:{vertical:["flex-col","gap-lg"],horizontal:["flex-row","gap-xl"]}}}),S=({intent:e,disabled:r,reverse:t,children:o})=>{const n=s.useMemo(()=>({intent:e,disabled:r,reverse:t}),[e,r,t]);return a.jsx(k.Provider,{value:n,children:o})},q=({orientation:e="vertical",loop:r=!0,intent:t="support",disabled:o,className:n,required:i,reverse:c=!1,ref:l,...f})=>{const{labelId:m,isInvalid:R,isRequired:u,description:p,name:h}=G.useFormFieldControl(),g=i!==void 0?i:u;return a.jsx(S,{reverse:c,intent:t,disabled:o,children:a.jsx(b.RadioGroup.RadioGroup,{"data-spark-component":"radio-group",className:C({orientation:e,className:n}),name:h,ref:l,disabled:o,orientation:e,loop:r,required:g,"aria-labelledby":m,"aria-invalid":R,"aria-required":g,"aria-describedby":p,...f})})};q.displayName="RadioGroup";const F=Object.assign(q,{Radio:v});F.displayName="RadioGroup";v.displayName="RadioGroup.Radio";exports.RadioGroup=F;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),u=require("class-variance-authority"),f=require("react"),v=require("@base-ui/react/radio"),R=require("@spark-ui/components/form-field"),x=require("@spark-ui/internal-utils"),F=require("@base-ui/react/radio-group"),k=f.createContext(null),V=()=>{const e=f.useContext(k);if(!e)throw Error("useRadioGroup must be used within a RadioGroup provider");return e},C=u.cva(["relative block","size-3/5","after:absolute","after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2","after:h-0","after:w-0","after:block","after:rounded-[50%]","after:content-['']","after:transition-all","data-checked:after:size-full"],{variants:{intent:x.makeVariants({main:["after:bg-main"],support:["after:bg-support"],accent:["after:bg-accent"],neutral:["after:bg-neutral"],success:["after:bg-success"],alert:["after:bg-alert"],error:["after:bg-error"],info:["after:bg-info"]})},defaultVariants:{intent:"support"}}),y=({intent:e,className:t,keepMounted:r,ref:n,...o})=>a.jsx(v.Radio.Indicator,{ref:n,keepMounted:r,className:C({intent:e,className:t}),...o});y.displayName="RadioGroup.RadioIndicator";const z=u.cva(["flex shrink-0 items-center justify-center","rounded-full","border-md","outline-hidden","hover:ring-4","focus-visible:u-outline","data-disabled:cursor-not-allowed data-disabled:border-outline/dim-2 data-disabled:hover:ring-transparent","u-shadow-border-transition","size-sz-24"],{variants:{intent:x.makeVariants({main:["border-outline","data-checked:border-main","hover:ring-main-container"],support:["border-outline","data-checked:border-support","hover:ring-support-container"],accent:["border-outline","data-checked:border-accent","hover:ring-accent-container"],neutral:["border-outline","data-checked:border-neutral","hover:ring-neutral-container"],info:["border-info","data-checked:border-info","hover:ring-info-container"],success:["border-success","data-checked:border-success","hover:ring-success-container"],alert:["border-alert","data-checked:border-alert","hover:ring-alert-container"],error:["border-error","data-checked:border-error","hover:ring-error-container"]})},defaultVariants:{intent:"support"}}),G=({intent:e,className:t,asChild:r,children:n,inputRef:o,hideInput:i=!1,ref:s,...c})=>{const{state:l}=R.useFormFieldControl(),d=l??e;return a.jsx(v.Radio.Root,{"data-spark-component":"radio-input",ref:s,inputRef:o,render:r?n:void 0,className:i?"sr-only":z({intent:d,className:t}),...c,children:!r&&!i&&a.jsx(y,{intent:d,keepMounted:!0})})};G.displayName="RadioGroup.RadioInput";const S=":radio",g=({className:e,children:t,disabled:r,ref:n,...o})=>{const i=`${S}-label-${f.useId()}`,{intent:s,disabled:c,reverse:l}=V(),d=r||c,p=t&&a.jsx("span",{"data-spark-component":"radio-label",id:i,className:u.cx("grow",d?"text-neutral/dim-2 cursor-not-allowed":"cursor-pointer"),children:t}),b=a.jsx(G,{ref:n,intent:s,"aria-labelledby":t?i:void 0,...o,disabled:r}),m=l?a.jsxs(a.Fragment,{children:[p,b]}):a.jsxs(a.Fragment,{children:[b,p]});return a.jsx("label",{className:u.cx("gap-md text-body-1 flex items-start",e),children:m})};g.displayName="RadioGroup.Radio";const M=u.cva(["flex"],{variants:{orientation:{vertical:["flex-col","gap-lg"],horizontal:["flex-row","gap-xl"]}}}),$=({intent:e,disabled:t,reverse:r,children:n})=>{const o=f.useMemo(()=>({intent:e,disabled:t,reverse:r}),[e,t,r]);return a.jsx(k.Provider,{value:o,children:n})},j=({orientation:e="vertical",intent:t="support",disabled:r,className:n,required:o,reverse:i=!1,onValueChange:s,ref:c,...l})=>{const{labelId:d,isInvalid:p,isRequired:b,description:m,name:N}=R.useFormFieldControl(),h=o!==void 0?o:b,q=s?w=>s(w):void 0;return a.jsx($,{reverse:i,intent:t,disabled:r,children:a.jsx(F.RadioGroup,{"data-spark-component":"radio-group",className:M({orientation:e,className:n}),name:N,ref:c,disabled:r,required:h,onValueChange:q,"aria-orientation":e,"aria-labelledby":d,"aria-invalid":p,"aria-required":h,"aria-describedby":m,...l})})};j.displayName="RadioGroup";const I=Object.assign(j,{Radio:g});I.displayName="RadioGroup";g.displayName="RadioGroup.Radio";exports.RadioGroup=I;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/radio-group/RadioGroupContext.tsx","../../src/radio-group/RadioIndicator.styles.ts","../../src/radio-group/RadioIndicator.tsx","../../src/radio-group/RadioInput.styles.ts","../../src/radio-group/RadioInput.tsx","../../src/radio-group/RadioLabel.styles.tsx","../../src/radio-group/RadioLabel.tsx","../../src/radio-group/Radio.tsx","../../src/radio-group/RadioGroup.styles.ts","../../src/radio-group/RadioGroupProvider.tsx","../../src/radio-group/RadioGroup.tsx","../../src/radio-group/index.ts"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nimport type { RadioGroupProps } from './RadioGroup'\nimport type { RadioInputProps } from './RadioInput'\n\nexport type RadioGroupContextState = Pick<RadioInputProps, 'intent' | 'disabled'> &\n Pick<RadioGroupProps, 'reverse'>\n\nexport const RadioGroupContext = createContext<RadioGroupContextState | null>(null)\n\nexport const useRadioGroup = () => {\n const context = useContext(RadioGroupContext)\n\n if (!context) {\n throw Error('useRadioGroup must be used within a RadioGroup provider')\n }\n\n return context\n}\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioIndicatorStyles = cva(\n [\n 'relative block',\n 'size-3/5',\n 'after:absolute',\n 'after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2',\n 'after:h-0',\n 'after:w-0',\n 'after:block',\n 'after:rounded-[50%]',\n \"after:content-['']\",\n 'after:transition-all',\n 'data-[state=checked]:after:size-full',\n ],\n {\n variants: {\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: ['after:bg-main'],\n support: ['after:bg-support'],\n accent: ['after:bg-accent'],\n neutral: ['after:bg-neutral'],\n success: ['after:bg-success'],\n alert: ['after:bg-alert'],\n error: ['after:bg-error'],\n info: ['after:bg-info'],\n }),\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type RadioIndicatorStylesProps = VariantProps<typeof radioIndicatorStyles>\n","import { RadioGroup as RadixRadioGroup } from 'radix-ui'\nimport { Ref } from 'react'\n\nimport { radioIndicatorStyles, RadioIndicatorStylesProps } from './RadioIndicator.styles'\n\nexport interface RadioIndicatorProps extends RadioIndicatorStylesProps {\n className?: string\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * Used to force mounting when more control is needed. Useful when controlling animation with React animation libraries.\n */\n forceMount?: true | undefined\n ref?: Ref<HTMLSpanElement>\n}\n\nexport const RadioIndicator = ({ intent, className, ref, ...others }: RadioIndicatorProps) => {\n return (\n <RadixRadioGroup.Indicator\n ref={ref}\n className={radioIndicatorStyles({ intent, className })}\n {...others}\n />\n )\n}\n\nRadioIndicator.displayName = 'RadioGroup.RadioIndicator'\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioInputVariants = cva(\n [\n 'flex shrink-0 items-center justify-center',\n 'rounded-full',\n 'border-md',\n 'outline-hidden',\n 'hover:ring-4',\n 'focus-visible:u-outline',\n 'disabled:cursor-not-allowed disabled:border-outline/dim-2 disabled:hover:ring-transparent',\n 'u-shadow-border-transition',\n 'size-sz-24',\n ],\n {\n variants: {\n /**\n * Color scheme of the radio input.\n */\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: ['border-outline', 'data-[state=checked]:border-main', 'hover:ring-main-container'],\n support: [\n 'border-outline',\n 'data-[state=checked]:border-support',\n 'hover:ring-support-container',\n ],\n accent: [\n 'border-outline',\n 'data-[state=checked]:border-accent',\n 'hover:ring-accent-container',\n ],\n neutral: [\n 'border-outline',\n 'data-[state=checked]:border-neutral',\n 'hover:ring-neutral-container',\n ],\n info: ['border-info', 'data-[state=checked]:border-info', 'hover:ring-info-container'],\n success: [\n 'border-success',\n 'data-[state=checked]:border-success',\n 'hover:ring-success-container',\n ],\n alert: ['border-alert', 'data-[state=checked]:border-alert', 'hover:ring-alert-container'],\n error: ['border-error', 'data-[state=checked]:border-error', 'hover:ring-error-container'],\n }),\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type RadioInputVariantsProps = VariantProps<typeof radioInputVariants>\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { RadioGroup as RadixRadioGroup } from 'radix-ui'\nimport { ButtonHTMLAttributes, Ref } from 'react'\n\nimport { RadioIndicator } from './RadioIndicator'\nimport { radioInputVariants, RadioInputVariantsProps } from './RadioInput.styles'\n\nexport interface RadioInputProps\n extends RadioInputVariantsProps,\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value' | 'onChange'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * The value given as data when submitted with a name.\n */\n value: string\n /**\n * When true, prevents the user from interacting with the radio item.\n */\n disabled?: boolean\n /**\n * When true, indicates that the user must check the radio item before the owning form can be submitted.\n */\n required?: boolean\n ref?: Ref<HTMLButtonElement>\n}\n\nexport const RadioInput = ({ intent: intentProp, className, ref, ...others }: RadioInputProps) => {\n const { state } = useFormFieldControl()\n\n const intent = state ?? intentProp\n\n return (\n <RadixRadioGroup.RadioGroupItem\n data-spark-component=\"radio-input\"\n ref={ref}\n className={radioInputVariants({ intent, className })}\n {...others}\n >\n <RadioIndicator intent={intent} forceMount />\n </RadixRadioGroup.RadioGroupItem>\n )\n}\n\nRadioInput.displayName = 'RadioGroup.RadioInput'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioLabelStyles = cva('grow', {\n variants: {\n disabled: {\n true: ['text-neutral/dim-2', 'cursor-not-allowed'],\n false: ['cursor-pointer'],\n },\n },\n defaultVariants: {\n disabled: false,\n },\n})\n\nexport type RadioLabelStylesProps = VariantProps<typeof radioLabelStyles>\n","import { Label } from 'radix-ui'\nimport type { HTMLAttributes, PropsWithChildren } from 'react'\n\nimport { radioLabelStyles, RadioLabelStylesProps } from './RadioLabel.styles'\n\nexport interface RadioLabelProps\n extends RadioLabelStylesProps,\n PropsWithChildren<HTMLAttributes<HTMLLabelElement>> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * The id of the element the label is associated with.\n */\n htmlFor?: string\n /**\n * When true, prevents the user from interacting with the radio item.\n */\n disabled?: boolean\n}\n\nexport const RadioLabel = ({ disabled, ...others }: RadioLabelProps) => {\n return (\n <Label.Root\n data-spark-component=\"radio-label\"\n className={radioLabelStyles({ disabled })}\n {...others}\n />\n )\n}\n\nRadioLabel.displayName = 'RadioGroup.RadioLabel'\n","import { cx } from 'class-variance-authority'\nimport { Ref, useId } from 'react'\n\nimport { useRadioGroup } from './RadioGroupContext'\nimport { RadioInput, RadioInputProps } from './RadioInput'\nimport { RadioLabel } from './RadioLabel'\n\nexport type RadioProps = RadioInputProps & {\n ref?: Ref<HTMLButtonElement>\n}\n\nconst ID_PREFIX = ':radio'\n\nexport const Radio = ({\n className,\n children,\n id,\n disabled: disabledProp,\n ref,\n ...others\n}: RadioProps) => {\n const innerId = `${ID_PREFIX}-input-${useId()}`\n const innerLabelId = `${ID_PREFIX}-label-${useId()}`\n\n const { intent, disabled, reverse } = useRadioGroup()\n\n const radioLabel = children && (\n <RadioLabel disabled={disabledProp || disabled} htmlFor={id || innerId} id={innerLabelId}>\n {children}\n </RadioLabel>\n )\n\n const radioInput = (\n <RadioInput\n ref={ref}\n id={id || innerId}\n intent={intent}\n aria-labelledby={children ? innerLabelId : undefined}\n {...others}\n disabled={disabledProp}\n />\n )\n\n const content = reverse ? (\n <>\n {radioLabel}\n {radioInput}\n </>\n ) : (\n <>\n {radioInput}\n {radioLabel}\n </>\n )\n\n return <span className={cx('gap-md text-body-1 flex items-start', className)}>{content}</span>\n}\n\nRadio.displayName = 'RadioGroup.Radio'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioGroupStyles = cva(['flex'], {\n variants: {\n orientation: {\n vertical: ['flex-col', 'gap-lg'],\n horizontal: ['flex-row', 'gap-xl'],\n },\n },\n})\n\nexport type RadioGroupVariantsProps = VariantProps<typeof radioGroupStyles>\n","import { ReactNode, useMemo } from 'react'\n\nimport type { RadioGroupProps } from './RadioGroup'\nimport { RadioGroupContext } from './RadioGroupContext'\nimport type { RadioInputProps } from './RadioInput'\n\nexport interface RadioGroupProviderProps\n extends Pick<RadioInputProps, 'intent' | 'disabled'>,\n Pick<RadioGroupProps, 'reverse'> {\n children: ReactNode\n}\n\nexport const RadioGroupProvider = ({\n intent,\n disabled,\n reverse,\n children,\n}: RadioGroupProviderProps) => {\n const value = useMemo(() => ({ intent, disabled, reverse }), [intent, disabled, reverse])\n\n return <RadioGroupContext.Provider value={value}>{children}</RadioGroupContext.Provider>\n}\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { RadioGroup as RadixRadioGroup } from 'radix-ui'\nimport { HTMLAttributes, Ref } from 'react'\n\nimport { radioGroupStyles, RadioGroupVariantsProps } from './RadioGroup.styles'\nimport { RadioGroupProvider } from './RadioGroupProvider'\nimport { RadioInputVariantsProps } from './RadioInput.styles'\n\nexport interface RadioGroupProps\n extends RadioGroupVariantsProps,\n Pick<RadioInputVariantsProps, 'intent'>,\n Omit<HTMLAttributes<HTMLDivElement>, 'value' | 'defaultValue' | 'dir' | 'onChange'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * The value of the radio item that should be checked when initially rendered. Use when you do not need to control the state of the radio items.\n */\n defaultValue?: string\n /**\n * The controlled value of the radio item to check. Should be used in conjunction with onValueChange.\n */\n value?: string\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: string) => void\n /**\n * When true, prevents the user from interacting with radio items.\n */\n disabled?: boolean\n /**\n * The name of the group. Submitted with its owning form as part of a name/value pair.\n */\n name?: string\n /**\n * When true, indicates that the user must check a radio item before the owning form can be submitted.\n */\n required?: boolean\n /**\n * The orientation of the component.\n */\n orientation?: 'horizontal' | 'vertical'\n /**\n * The reading direction of the radio group.\n */\n dir?: 'ltr' | 'rtl'\n /**\n * When true, keyboard navigation will loop from last item to first, and vice versa.\n */\n loop?: boolean\n /**\n * When true, the label will be placed on the left side of the Radio\n */\n reverse?: boolean\n ref?: Ref<HTMLDivElement>\n}\n\nexport const RadioGroup = ({\n orientation = 'vertical',\n loop = true,\n intent = 'support',\n disabled,\n className,\n required: requiredProp,\n reverse = false,\n ref,\n ...others\n}: RadioGroupProps) => {\n const { labelId, isInvalid, isRequired, description, name } = useFormFieldControl()\n const required = requiredProp !== undefined ? requiredProp : isRequired\n\n return (\n <RadioGroupProvider reverse={reverse} intent={intent} disabled={disabled}>\n <RadixRadioGroup.RadioGroup\n data-spark-component=\"radio-group\"\n className={radioGroupStyles({ orientation, className })}\n name={name}\n ref={ref}\n disabled={disabled}\n orientation={orientation}\n loop={loop}\n required={required}\n aria-labelledby={labelId}\n aria-invalid={isInvalid}\n aria-required={required}\n aria-describedby={description}\n {...others}\n />\n </RadioGroupProvider>\n )\n}\n\nRadioGroup.displayName = 'RadioGroup'\n","import { Radio } from './Radio'\nimport { RadioGroup as Root } from './RadioGroup'\n\nexport const RadioGroup: typeof Root & {\n Radio: typeof Radio\n} = Object.assign(Root, {\n Radio,\n})\n\nRadioGroup.displayName = 'RadioGroup'\nRadio.displayName = 'RadioGroup.Radio'\n\nexport { type RadioGroupProps } from './RadioGroup'\nexport { type RadioProps } from './Radio'\n"],"names":["RadioGroupContext","createContext","useRadioGroup","context","useContext","radioIndicatorStyles","cva","makeVariants","RadioIndicator","intent","className","ref","others","jsx","RadixRadioGroup","radioInputVariants","RadioInput","intentProp","state","useFormFieldControl","radioLabelStyles","RadioLabel","disabled","Label","ID_PREFIX","Radio","children","id","disabledProp","innerId","useId","innerLabelId","reverse","radioLabel","radioInput","content","jsxs","Fragment","cx","radioGroupStyles","RadioGroupProvider","value","useMemo","RadioGroup","orientation","loop","requiredProp","labelId","isInvalid","isRequired","description","name","required","Root"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/radio-group/RadioGroupContext.tsx","../../src/radio-group/RadioIndicator.styles.ts","../../src/radio-group/RadioIndicator.tsx","../../src/radio-group/RadioInput.styles.ts","../../src/radio-group/RadioInput.tsx","../../src/radio-group/Radio.tsx","../../src/radio-group/RadioGroup.styles.ts","../../src/radio-group/RadioGroupProvider.tsx","../../src/radio-group/RadioGroup.tsx","../../src/radio-group/index.ts"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nimport type { RadioGroupProps } from './RadioGroup'\nimport type { RadioInputProps } from './RadioInput'\n\nexport type RadioGroupContextState = Pick<RadioInputProps, 'intent' | 'disabled'> &\n Pick<RadioGroupProps, 'reverse'>\n\nexport const RadioGroupContext = createContext<RadioGroupContextState | null>(null)\n\nexport const useRadioGroup = () => {\n const context = useContext(RadioGroupContext)\n\n if (!context) {\n throw Error('useRadioGroup must be used within a RadioGroup provider')\n }\n\n return context\n}\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioIndicatorStyles = cva(\n [\n 'relative block',\n 'size-3/5',\n 'after:absolute',\n 'after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2',\n 'after:h-0',\n 'after:w-0',\n 'after:block',\n 'after:rounded-[50%]',\n \"after:content-['']\",\n 'after:transition-all',\n 'data-checked:after:size-full',\n ],\n {\n variants: {\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: ['after:bg-main'],\n support: ['after:bg-support'],\n accent: ['after:bg-accent'],\n neutral: ['after:bg-neutral'],\n success: ['after:bg-success'],\n alert: ['after:bg-alert'],\n error: ['after:bg-error'],\n info: ['after:bg-info'],\n }),\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type RadioIndicatorStylesProps = VariantProps<typeof radioIndicatorStyles>\n","import { Radio } from '@base-ui/react/radio'\nimport { Ref } from 'react'\n\nimport { radioIndicatorStyles, RadioIndicatorStylesProps } from './RadioIndicator.styles'\n\nexport interface RadioIndicatorProps extends RadioIndicatorStylesProps {\n className?: string\n /**\n * Whether to keep the indicator mounted in the DOM when the radio is unchecked.\n * Useful when controlling animation with React animation libraries.\n */\n keepMounted?: boolean\n ref?: Ref<HTMLSpanElement>\n}\n\nexport const RadioIndicator = ({\n intent,\n className,\n keepMounted,\n ref,\n ...others\n}: RadioIndicatorProps) => {\n return (\n <Radio.Indicator\n ref={ref}\n keepMounted={keepMounted}\n className={radioIndicatorStyles({ intent, className })}\n {...others}\n />\n )\n}\n\nRadioIndicator.displayName = 'RadioGroup.RadioIndicator'\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioInputVariants = cva(\n [\n 'flex shrink-0 items-center justify-center',\n 'rounded-full',\n 'border-md',\n 'outline-hidden',\n 'hover:ring-4',\n 'focus-visible:u-outline',\n 'data-disabled:cursor-not-allowed data-disabled:border-outline/dim-2 data-disabled:hover:ring-transparent',\n 'u-shadow-border-transition',\n 'size-sz-24',\n ],\n {\n variants: {\n /**\n * Color scheme of the radio input.\n */\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: ['border-outline', 'data-checked:border-main', 'hover:ring-main-container'],\n support: ['border-outline', 'data-checked:border-support', 'hover:ring-support-container'],\n accent: ['border-outline', 'data-checked:border-accent', 'hover:ring-accent-container'],\n neutral: ['border-outline', 'data-checked:border-neutral', 'hover:ring-neutral-container'],\n info: ['border-info', 'data-checked:border-info', 'hover:ring-info-container'],\n success: ['border-success', 'data-checked:border-success', 'hover:ring-success-container'],\n alert: ['border-alert', 'data-checked:border-alert', 'hover:ring-alert-container'],\n error: ['border-error', 'data-checked:border-error', 'hover:ring-error-container'],\n }),\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type RadioInputVariantsProps = VariantProps<typeof radioInputVariants>\n","import { Radio } from '@base-ui/react/radio'\nimport { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { HTMLAttributes, ReactElement, Ref } from 'react'\n\nimport { RadioIndicator } from './RadioIndicator'\nimport { radioInputVariants, RadioInputVariantsProps } from './RadioInput.styles'\n\nexport interface RadioInputProps\n extends RadioInputVariantsProps,\n Omit<HTMLAttributes<HTMLElement>, 'value' | 'onChange'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n * Uses Base UI's render prop internally to merge behaviour into the child element.\n */\n asChild?: boolean\n /**\n * The value given as data when submitted with a name.\n */\n value: string\n /**\n * When true, prevents the user from interacting with the radio item.\n */\n disabled?: boolean\n /**\n * When true, indicates that the user must check the radio item before the owning form can be submitted.\n */\n required?: boolean\n /**\n * Ref forwarded to the hidden `<input type=\"radio\">` rendered by Base UI.\n * Useful for programmatic activation (e.g. clicking from an associated label span).\n */\n inputRef?: Ref<HTMLInputElement>\n ref?: Ref<HTMLElement>\n /**\n * When true, the visual radio input (outer ring and inner dot) is visually hidden but remains\n * accessible in the DOM. Useful for custom radio appearances where only the label matters visually.\n * @default false\n */\n hideInput?: boolean\n}\n\nexport const RadioInput = ({\n intent: intentProp,\n className,\n asChild,\n children,\n inputRef,\n hideInput = false,\n ref,\n ...others\n}: RadioInputProps) => {\n const { state } = useFormFieldControl()\n\n const intent = state ?? intentProp\n\n return (\n <Radio.Root\n data-spark-component=\"radio-input\"\n ref={ref}\n inputRef={inputRef}\n render={asChild ? (children as ReactElement) : undefined}\n className={hideInput ? 'sr-only' : radioInputVariants({ intent, className })}\n {...others}\n >\n {!asChild && !hideInput && <RadioIndicator intent={intent} keepMounted />}\n </Radio.Root>\n )\n}\n\nRadioInput.displayName = 'RadioGroup.RadioInput'\n","import { cx } from 'class-variance-authority'\nimport { Ref, useId } from 'react'\n\nimport { useRadioGroup } from './RadioGroupContext'\nimport { RadioInput, RadioInputProps } from './RadioInput'\n\nexport type RadioProps = RadioInputProps & {\n ref?: Ref<HTMLElement>\n}\n\nconst ID_PREFIX = ':radio'\n\nexport const Radio = ({\n className,\n children,\n disabled: disabledProp,\n ref,\n ...others\n}: RadioProps) => {\n const innerLabelId = `${ID_PREFIX}-label-${useId()}`\n\n const { intent, disabled, reverse } = useRadioGroup()\n\n const isDisabled = disabledProp || disabled\n\n const radioLabel = children && (\n <span\n data-spark-component=\"radio-label\"\n id={innerLabelId}\n className={cx(\n 'grow',\n isDisabled ? 'text-neutral/dim-2 cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n {children}\n </span>\n )\n\n const radioInput = (\n <RadioInput\n ref={ref}\n intent={intent}\n aria-labelledby={children ? innerLabelId : undefined}\n {...others}\n disabled={disabledProp}\n />\n )\n\n const content = reverse ? (\n <>\n {radioLabel}\n {radioInput}\n </>\n ) : (\n <>\n {radioInput}\n {radioLabel}\n </>\n )\n\n return <label className={cx('gap-md text-body-1 flex items-start', className)}>{content}</label>\n}\n\nRadio.displayName = 'RadioGroup.Radio'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioGroupStyles = cva(['flex'], {\n variants: {\n orientation: {\n vertical: ['flex-col', 'gap-lg'],\n horizontal: ['flex-row', 'gap-xl'],\n },\n },\n})\n\nexport type RadioGroupVariantsProps = VariantProps<typeof radioGroupStyles>\n","import { ReactNode, useMemo } from 'react'\n\nimport type { RadioGroupProps } from './RadioGroup'\nimport { RadioGroupContext } from './RadioGroupContext'\nimport type { RadioInputProps } from './RadioInput'\n\nexport interface RadioGroupProviderProps\n extends Pick<RadioInputProps, 'intent' | 'disabled'>,\n Pick<RadioGroupProps, 'reverse'> {\n children: ReactNode\n}\n\nexport const RadioGroupProvider = ({\n intent,\n disabled,\n reverse,\n children,\n}: RadioGroupProviderProps) => {\n const value = useMemo(() => ({ intent, disabled, reverse }), [intent, disabled, reverse])\n\n return <RadioGroupContext.Provider value={value}>{children}</RadioGroupContext.Provider>\n}\n","import { RadioGroup as BaseUIRadioGroup } from '@base-ui/react/radio-group'\nimport { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { HTMLAttributes, Ref } from 'react'\n\nimport { radioGroupStyles, RadioGroupVariantsProps } from './RadioGroup.styles'\nimport { RadioGroupProvider } from './RadioGroupProvider'\nimport { RadioInputVariantsProps } from './RadioInput.styles'\n\nexport interface RadioGroupProps\n extends RadioGroupVariantsProps,\n Pick<RadioInputVariantsProps, 'intent'>,\n Omit<HTMLAttributes<HTMLDivElement>, 'value' | 'defaultValue' | 'dir' | 'onChange'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * The value of the radio item that should be checked when initially rendered. Use when you do not need to control the state of the radio items.\n */\n defaultValue?: string\n /**\n * The controlled value of the radio item to check. Should be used in conjunction with onValueChange.\n */\n value?: string\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: string) => void\n /**\n * When true, prevents the user from interacting with radio items.\n */\n disabled?: boolean\n /**\n * The name of the group. Submitted with its owning form as part of a name/value pair.\n */\n name?: string\n /**\n * When true, indicates that the user must check a radio item before the owning form can be submitted.\n */\n required?: boolean\n /**\n * The orientation of the component.\n */\n orientation?: 'horizontal' | 'vertical'\n /**\n * The reading direction of the radio group.\n */\n dir?: 'ltr' | 'rtl'\n /**\n * When true, the label will be placed on the left side of the Radio\n */\n reverse?: boolean\n ref?: Ref<HTMLDivElement>\n}\n\nexport const RadioGroup = ({\n orientation = 'vertical',\n intent = 'support',\n disabled,\n className,\n required: requiredProp,\n reverse = false,\n onValueChange: onValueChangeProp,\n ref,\n ...others\n}: RadioGroupProps) => {\n const { labelId, isInvalid, isRequired, description, name } = useFormFieldControl()\n const required = requiredProp !== undefined ? requiredProp : isRequired\n\n const handleValueChange = onValueChangeProp\n ? (value: unknown) => onValueChangeProp(value as string)\n : undefined\n\n return (\n <RadioGroupProvider reverse={reverse} intent={intent} disabled={disabled}>\n <BaseUIRadioGroup\n data-spark-component=\"radio-group\"\n className={radioGroupStyles({ orientation, className })}\n name={name}\n ref={ref}\n disabled={disabled}\n required={required}\n onValueChange={handleValueChange}\n aria-orientation={orientation}\n aria-labelledby={labelId}\n aria-invalid={isInvalid}\n aria-required={required}\n aria-describedby={description}\n {...others}\n />\n </RadioGroupProvider>\n )\n}\n\nRadioGroup.displayName = 'RadioGroup'\n","import { Radio } from './Radio'\nimport { RadioGroup as Root } from './RadioGroup'\n\nexport const RadioGroup: typeof Root & {\n Radio: typeof Radio\n} = Object.assign(Root, {\n Radio,\n})\n\nRadioGroup.displayName = 'RadioGroup'\nRadio.displayName = 'RadioGroup.Radio'\n\nexport { type RadioGroupProps } from './RadioGroup'\nexport { type RadioProps } from './Radio'\n"],"names":["RadioGroupContext","createContext","useRadioGroup","context","useContext","radioIndicatorStyles","cva","makeVariants","RadioIndicator","intent","className","keepMounted","ref","others","jsx","Radio","radioInputVariants","RadioInput","intentProp","asChild","children","inputRef","hideInput","state","useFormFieldControl","ID_PREFIX","disabledProp","innerLabelId","useId","disabled","reverse","isDisabled","radioLabel","cx","radioInput","content","jsxs","Fragment","radioGroupStyles","RadioGroupProvider","value","useMemo","RadioGroup","orientation","requiredProp","onValueChangeProp","labelId","isInvalid","isRequired","description","name","required","handleValueChange","BaseUIRadioGroup","Root"],"mappings":"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"}
@@ -1,15 +1,16 @@
1
- import { jsx as o, jsxs as g, Fragment as G } from "react/jsx-runtime";
2
- import { cva as u, cx as F } from "class-variance-authority";
3
- import { createContext as V, useContext as j, useId as x, useMemo as C } from "react";
4
- import { useFormFieldControl as y } from "@spark-ui/components/form-field";
5
- import { RadioGroup as h, Label as q } from "radix-ui";
6
- import { makeVariants as I } from "@spark-ui/internal-utils";
7
- const N = V(null), S = () => {
8
- const r = j(N);
1
+ import { jsx as n, jsxs as g, Fragment as v } from "react/jsx-runtime";
2
+ import { cva as f, cx as R } from "class-variance-authority";
3
+ import { createContext as $, useContext as j, useId as F, useMemo as q } from "react";
4
+ import { Radio as k } from "@base-ui/react/radio";
5
+ import { useFormFieldControl as x } from "@spark-ui/components/form-field";
6
+ import { makeVariants as G } from "@spark-ui/internal-utils";
7
+ import { RadioGroup as D } from "@base-ui/react/radio-group";
8
+ const y = $(null), E = () => {
9
+ const r = j(y);
9
10
  if (!r)
10
11
  throw Error("useRadioGroup must be used within a RadioGroup provider");
11
12
  return r;
12
- }, E = u(
13
+ }, L = f(
13
14
  [
14
15
  "relative block",
15
16
  "size-3/5",
@@ -21,11 +22,11 @@ const N = V(null), S = () => {
21
22
  "after:rounded-[50%]",
22
23
  "after:content-['']",
23
24
  "after:transition-all",
24
- "data-[state=checked]:after:size-full"
25
+ "data-checked:after:size-full"
25
26
  ],
26
27
  {
27
28
  variants: {
28
- intent: I({
29
+ intent: G({
29
30
  main: ["after:bg-main"],
30
31
  support: ["after:bg-support"],
31
32
  accent: ["after:bg-accent"],
@@ -40,16 +41,23 @@ const N = V(null), S = () => {
40
41
  intent: "support"
41
42
  }
42
43
  }
43
- ), w = ({ intent: r, className: e, ref: a, ...t }) => /* @__PURE__ */ o(
44
- h.Indicator,
44
+ ), I = ({
45
+ intent: r,
46
+ className: a,
47
+ keepMounted: e,
48
+ ref: t,
49
+ ...o
50
+ }) => /* @__PURE__ */ n(
51
+ k.Indicator,
45
52
  {
46
- ref: a,
47
- className: E({ intent: r, className: e }),
48
- ...t
53
+ ref: t,
54
+ keepMounted: e,
55
+ className: L({ intent: r, className: a }),
56
+ ...o
49
57
  }
50
58
  );
51
- w.displayName = "RadioGroup.RadioIndicator";
52
- const M = u(
59
+ I.displayName = "RadioGroup.RadioIndicator";
60
+ const M = f(
53
61
  [
54
62
  "flex shrink-0 items-center justify-center",
55
63
  "rounded-full",
@@ -57,7 +65,7 @@ const M = u(
57
65
  "outline-hidden",
58
66
  "hover:ring-4",
59
67
  "focus-visible:u-outline",
60
- "disabled:cursor-not-allowed disabled:border-outline/dim-2 disabled:hover:ring-transparent",
68
+ "data-disabled:cursor-not-allowed data-disabled:border-outline/dim-2 data-disabled:hover:ring-transparent",
61
69
  "u-shadow-border-transition",
62
70
  "size-sz-24"
63
71
  ],
@@ -66,151 +74,136 @@ const M = u(
66
74
  /**
67
75
  * Color scheme of the radio input.
68
76
  */
69
- intent: I({
70
- main: ["border-outline", "data-[state=checked]:border-main", "hover:ring-main-container"],
71
- support: [
72
- "border-outline",
73
- "data-[state=checked]:border-support",
74
- "hover:ring-support-container"
75
- ],
76
- accent: [
77
- "border-outline",
78
- "data-[state=checked]:border-accent",
79
- "hover:ring-accent-container"
80
- ],
81
- neutral: [
82
- "border-outline",
83
- "data-[state=checked]:border-neutral",
84
- "hover:ring-neutral-container"
85
- ],
86
- info: ["border-info", "data-[state=checked]:border-info", "hover:ring-info-container"],
87
- success: [
88
- "border-success",
89
- "data-[state=checked]:border-success",
90
- "hover:ring-success-container"
91
- ],
92
- alert: ["border-alert", "data-[state=checked]:border-alert", "hover:ring-alert-container"],
93
- error: ["border-error", "data-[state=checked]:border-error", "hover:ring-error-container"]
77
+ intent: G({
78
+ main: ["border-outline", "data-checked:border-main", "hover:ring-main-container"],
79
+ support: ["border-outline", "data-checked:border-support", "hover:ring-support-container"],
80
+ accent: ["border-outline", "data-checked:border-accent", "hover:ring-accent-container"],
81
+ neutral: ["border-outline", "data-checked:border-neutral", "hover:ring-neutral-container"],
82
+ info: ["border-info", "data-checked:border-info", "hover:ring-info-container"],
83
+ success: ["border-success", "data-checked:border-success", "hover:ring-success-container"],
84
+ alert: ["border-alert", "data-checked:border-alert", "hover:ring-alert-container"],
85
+ error: ["border-error", "data-checked:border-error", "hover:ring-error-container"]
94
86
  })
95
87
  },
96
88
  defaultVariants: {
97
89
  intent: "support"
98
90
  }
99
91
  }
100
- ), L = ({ intent: r, className: e, ref: a, ...t }) => {
101
- const { state: n } = y(), i = n ?? r;
102
- return /* @__PURE__ */ o(
103
- h.RadioGroupItem,
92
+ ), N = ({
93
+ intent: r,
94
+ className: a,
95
+ asChild: e,
96
+ children: t,
97
+ inputRef: o,
98
+ hideInput: i = !1,
99
+ ref: d,
100
+ ...s
101
+ }) => {
102
+ const { state: c } = x(), l = c ?? r;
103
+ return /* @__PURE__ */ n(
104
+ k.Root,
104
105
  {
105
106
  "data-spark-component": "radio-input",
106
- ref: a,
107
- className: M({ intent: i, className: e }),
108
- ...t,
109
- children: /* @__PURE__ */ o(w, { intent: i, forceMount: !0 })
107
+ ref: d,
108
+ inputRef: o,
109
+ render: e ? t : void 0,
110
+ className: i ? "sr-only" : M({ intent: l, className: a }),
111
+ ...s,
112
+ children: !e && !i && /* @__PURE__ */ n(I, { intent: l, keepMounted: !0 })
110
113
  }
111
114
  );
112
115
  };
113
- L.displayName = "RadioGroup.RadioInput";
114
- const D = u("grow", {
115
- variants: {
116
- disabled: {
117
- true: ["text-neutral/dim-2", "cursor-not-allowed"],
118
- false: ["cursor-pointer"]
119
- }
120
- },
121
- defaultVariants: {
122
- disabled: !1
123
- }
124
- }), $ = ({ disabled: r, ...e }) => /* @__PURE__ */ o(
125
- q.Root,
126
- {
127
- "data-spark-component": "radio-label",
128
- className: D({ disabled: r }),
129
- ...e
130
- }
131
- );
132
- $.displayName = "RadioGroup.RadioLabel";
133
- const k = ":radio", R = ({
116
+ N.displayName = "RadioGroup.RadioInput";
117
+ const S = ":radio", m = ({
134
118
  className: r,
135
- children: e,
136
- id: a,
137
- disabled: t,
138
- ref: n,
139
- ...i
119
+ children: a,
120
+ disabled: e,
121
+ ref: t,
122
+ ...o
140
123
  }) => {
141
- const s = `${k}-input-${x()}`, d = `${k}-label-${x()}`, { intent: p, disabled: b, reverse: f } = S(), c = e && /* @__PURE__ */ o($, { disabled: t || b, htmlFor: a || s, id: d, children: e }), l = /* @__PURE__ */ o(
142
- L,
124
+ const i = `${S}-label-${F()}`, { intent: d, disabled: s, reverse: c } = E(), u = a && /* @__PURE__ */ n(
125
+ "span",
126
+ {
127
+ "data-spark-component": "radio-label",
128
+ id: i,
129
+ className: R(
130
+ "grow",
131
+ e || s ? "text-neutral/dim-2 cursor-not-allowed" : "cursor-pointer"
132
+ ),
133
+ children: a
134
+ }
135
+ ), p = /* @__PURE__ */ n(
136
+ N,
143
137
  {
144
- ref: n,
145
- id: a || s,
146
- intent: p,
147
- "aria-labelledby": e ? d : void 0,
148
- ...i,
149
- disabled: t
138
+ ref: t,
139
+ intent: d,
140
+ "aria-labelledby": a ? i : void 0,
141
+ ...o,
142
+ disabled: e
150
143
  }
151
- ), m = f ? /* @__PURE__ */ g(G, { children: [
152
- c,
153
- l
154
- ] }) : /* @__PURE__ */ g(G, { children: [
155
- l,
156
- c
144
+ ), b = c ? /* @__PURE__ */ g(v, { children: [
145
+ u,
146
+ p
147
+ ] }) : /* @__PURE__ */ g(v, { children: [
148
+ p,
149
+ u
157
150
  ] });
158
- return /* @__PURE__ */ o("span", { className: F("gap-md text-body-1 flex items-start", r), children: m });
151
+ return /* @__PURE__ */ n("label", { className: R("gap-md text-body-1 flex items-start", r), children: b });
159
152
  };
160
- R.displayName = "RadioGroup.Radio";
161
- const O = u(["flex"], {
153
+ m.displayName = "RadioGroup.Radio";
154
+ const O = f(["flex"], {
162
155
  variants: {
163
156
  orientation: {
164
157
  vertical: ["flex-col", "gap-lg"],
165
158
  horizontal: ["flex-row", "gap-xl"]
166
159
  }
167
160
  }
168
- }), P = ({
161
+ }), X = ({
169
162
  intent: r,
170
- disabled: e,
171
- reverse: a,
163
+ disabled: a,
164
+ reverse: e,
172
165
  children: t
173
166
  }) => {
174
- const n = C(() => ({ intent: r, disabled: e, reverse: a }), [r, e, a]);
175
- return /* @__PURE__ */ o(N.Provider, { value: n, children: t });
176
- }, z = ({
167
+ const o = q(() => ({ intent: r, disabled: a, reverse: e }), [r, a, e]);
168
+ return /* @__PURE__ */ n(y.Provider, { value: o, children: t });
169
+ }, w = ({
177
170
  orientation: r = "vertical",
178
- loop: e = !0,
179
171
  intent: a = "support",
180
- disabled: t,
181
- className: n,
182
- required: i,
183
- reverse: s = !1,
184
- ref: d,
185
- ...p
172
+ disabled: e,
173
+ className: t,
174
+ required: o,
175
+ reverse: i = !1,
176
+ onValueChange: d,
177
+ ref: s,
178
+ ...c
186
179
  }) => {
187
- const { labelId: b, isInvalid: f, isRequired: c, description: l, name: m } = y(), v = i !== void 0 ? i : c;
188
- return /* @__PURE__ */ o(P, { reverse: s, intent: a, disabled: t, children: /* @__PURE__ */ o(
189
- h.RadioGroup,
180
+ const { labelId: l, isInvalid: u, isRequired: p, description: b, name: V } = x(), h = o !== void 0 ? o : p, z = d ? (C) => d(C) : void 0;
181
+ return /* @__PURE__ */ n(X, { reverse: i, intent: a, disabled: e, children: /* @__PURE__ */ n(
182
+ D,
190
183
  {
191
184
  "data-spark-component": "radio-group",
192
- className: O({ orientation: r, className: n }),
193
- name: m,
194
- ref: d,
195
- disabled: t,
196
- orientation: r,
197
- loop: e,
198
- required: v,
199
- "aria-labelledby": b,
200
- "aria-invalid": f,
201
- "aria-required": v,
202
- "aria-describedby": l,
203
- ...p
185
+ className: O({ orientation: r, className: t }),
186
+ name: V,
187
+ ref: s,
188
+ disabled: e,
189
+ required: h,
190
+ onValueChange: z,
191
+ "aria-orientation": r,
192
+ "aria-labelledby": l,
193
+ "aria-invalid": u,
194
+ "aria-required": h,
195
+ "aria-describedby": b,
196
+ ...c
204
197
  }
205
198
  ) });
206
199
  };
207
- z.displayName = "RadioGroup";
208
- const X = Object.assign(z, {
209
- Radio: R
200
+ w.displayName = "RadioGroup";
201
+ const _ = Object.assign(w, {
202
+ Radio: m
210
203
  });
211
- X.displayName = "RadioGroup";
212
- R.displayName = "RadioGroup.Radio";
204
+ _.displayName = "RadioGroup";
205
+ m.displayName = "RadioGroup.Radio";
213
206
  export {
214
- X as RadioGroup
207
+ _ as RadioGroup
215
208
  };
216
209
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/radio-group/RadioGroupContext.tsx","../../src/radio-group/RadioIndicator.styles.ts","../../src/radio-group/RadioIndicator.tsx","../../src/radio-group/RadioInput.styles.ts","../../src/radio-group/RadioInput.tsx","../../src/radio-group/RadioLabel.styles.tsx","../../src/radio-group/RadioLabel.tsx","../../src/radio-group/Radio.tsx","../../src/radio-group/RadioGroup.styles.ts","../../src/radio-group/RadioGroupProvider.tsx","../../src/radio-group/RadioGroup.tsx","../../src/radio-group/index.ts"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nimport type { RadioGroupProps } from './RadioGroup'\nimport type { RadioInputProps } from './RadioInput'\n\nexport type RadioGroupContextState = Pick<RadioInputProps, 'intent' | 'disabled'> &\n Pick<RadioGroupProps, 'reverse'>\n\nexport const RadioGroupContext = createContext<RadioGroupContextState | null>(null)\n\nexport const useRadioGroup = () => {\n const context = useContext(RadioGroupContext)\n\n if (!context) {\n throw Error('useRadioGroup must be used within a RadioGroup provider')\n }\n\n return context\n}\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioIndicatorStyles = cva(\n [\n 'relative block',\n 'size-3/5',\n 'after:absolute',\n 'after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2',\n 'after:h-0',\n 'after:w-0',\n 'after:block',\n 'after:rounded-[50%]',\n \"after:content-['']\",\n 'after:transition-all',\n 'data-[state=checked]:after:size-full',\n ],\n {\n variants: {\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: ['after:bg-main'],\n support: ['after:bg-support'],\n accent: ['after:bg-accent'],\n neutral: ['after:bg-neutral'],\n success: ['after:bg-success'],\n alert: ['after:bg-alert'],\n error: ['after:bg-error'],\n info: ['after:bg-info'],\n }),\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type RadioIndicatorStylesProps = VariantProps<typeof radioIndicatorStyles>\n","import { RadioGroup as RadixRadioGroup } from 'radix-ui'\nimport { Ref } from 'react'\n\nimport { radioIndicatorStyles, RadioIndicatorStylesProps } from './RadioIndicator.styles'\n\nexport interface RadioIndicatorProps extends RadioIndicatorStylesProps {\n className?: string\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * Used to force mounting when more control is needed. Useful when controlling animation with React animation libraries.\n */\n forceMount?: true | undefined\n ref?: Ref<HTMLSpanElement>\n}\n\nexport const RadioIndicator = ({ intent, className, ref, ...others }: RadioIndicatorProps) => {\n return (\n <RadixRadioGroup.Indicator\n ref={ref}\n className={radioIndicatorStyles({ intent, className })}\n {...others}\n />\n )\n}\n\nRadioIndicator.displayName = 'RadioGroup.RadioIndicator'\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioInputVariants = cva(\n [\n 'flex shrink-0 items-center justify-center',\n 'rounded-full',\n 'border-md',\n 'outline-hidden',\n 'hover:ring-4',\n 'focus-visible:u-outline',\n 'disabled:cursor-not-allowed disabled:border-outline/dim-2 disabled:hover:ring-transparent',\n 'u-shadow-border-transition',\n 'size-sz-24',\n ],\n {\n variants: {\n /**\n * Color scheme of the radio input.\n */\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: ['border-outline', 'data-[state=checked]:border-main', 'hover:ring-main-container'],\n support: [\n 'border-outline',\n 'data-[state=checked]:border-support',\n 'hover:ring-support-container',\n ],\n accent: [\n 'border-outline',\n 'data-[state=checked]:border-accent',\n 'hover:ring-accent-container',\n ],\n neutral: [\n 'border-outline',\n 'data-[state=checked]:border-neutral',\n 'hover:ring-neutral-container',\n ],\n info: ['border-info', 'data-[state=checked]:border-info', 'hover:ring-info-container'],\n success: [\n 'border-success',\n 'data-[state=checked]:border-success',\n 'hover:ring-success-container',\n ],\n alert: ['border-alert', 'data-[state=checked]:border-alert', 'hover:ring-alert-container'],\n error: ['border-error', 'data-[state=checked]:border-error', 'hover:ring-error-container'],\n }),\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type RadioInputVariantsProps = VariantProps<typeof radioInputVariants>\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { RadioGroup as RadixRadioGroup } from 'radix-ui'\nimport { ButtonHTMLAttributes, Ref } from 'react'\n\nimport { RadioIndicator } from './RadioIndicator'\nimport { radioInputVariants, RadioInputVariantsProps } from './RadioInput.styles'\n\nexport interface RadioInputProps\n extends RadioInputVariantsProps,\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value' | 'onChange'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * The value given as data when submitted with a name.\n */\n value: string\n /**\n * When true, prevents the user from interacting with the radio item.\n */\n disabled?: boolean\n /**\n * When true, indicates that the user must check the radio item before the owning form can be submitted.\n */\n required?: boolean\n ref?: Ref<HTMLButtonElement>\n}\n\nexport const RadioInput = ({ intent: intentProp, className, ref, ...others }: RadioInputProps) => {\n const { state } = useFormFieldControl()\n\n const intent = state ?? intentProp\n\n return (\n <RadixRadioGroup.RadioGroupItem\n data-spark-component=\"radio-input\"\n ref={ref}\n className={radioInputVariants({ intent, className })}\n {...others}\n >\n <RadioIndicator intent={intent} forceMount />\n </RadixRadioGroup.RadioGroupItem>\n )\n}\n\nRadioInput.displayName = 'RadioGroup.RadioInput'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioLabelStyles = cva('grow', {\n variants: {\n disabled: {\n true: ['text-neutral/dim-2', 'cursor-not-allowed'],\n false: ['cursor-pointer'],\n },\n },\n defaultVariants: {\n disabled: false,\n },\n})\n\nexport type RadioLabelStylesProps = VariantProps<typeof radioLabelStyles>\n","import { Label } from 'radix-ui'\nimport type { HTMLAttributes, PropsWithChildren } from 'react'\n\nimport { radioLabelStyles, RadioLabelStylesProps } from './RadioLabel.styles'\n\nexport interface RadioLabelProps\n extends RadioLabelStylesProps,\n PropsWithChildren<HTMLAttributes<HTMLLabelElement>> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * The id of the element the label is associated with.\n */\n htmlFor?: string\n /**\n * When true, prevents the user from interacting with the radio item.\n */\n disabled?: boolean\n}\n\nexport const RadioLabel = ({ disabled, ...others }: RadioLabelProps) => {\n return (\n <Label.Root\n data-spark-component=\"radio-label\"\n className={radioLabelStyles({ disabled })}\n {...others}\n />\n )\n}\n\nRadioLabel.displayName = 'RadioGroup.RadioLabel'\n","import { cx } from 'class-variance-authority'\nimport { Ref, useId } from 'react'\n\nimport { useRadioGroup } from './RadioGroupContext'\nimport { RadioInput, RadioInputProps } from './RadioInput'\nimport { RadioLabel } from './RadioLabel'\n\nexport type RadioProps = RadioInputProps & {\n ref?: Ref<HTMLButtonElement>\n}\n\nconst ID_PREFIX = ':radio'\n\nexport const Radio = ({\n className,\n children,\n id,\n disabled: disabledProp,\n ref,\n ...others\n}: RadioProps) => {\n const innerId = `${ID_PREFIX}-input-${useId()}`\n const innerLabelId = `${ID_PREFIX}-label-${useId()}`\n\n const { intent, disabled, reverse } = useRadioGroup()\n\n const radioLabel = children && (\n <RadioLabel disabled={disabledProp || disabled} htmlFor={id || innerId} id={innerLabelId}>\n {children}\n </RadioLabel>\n )\n\n const radioInput = (\n <RadioInput\n ref={ref}\n id={id || innerId}\n intent={intent}\n aria-labelledby={children ? innerLabelId : undefined}\n {...others}\n disabled={disabledProp}\n />\n )\n\n const content = reverse ? (\n <>\n {radioLabel}\n {radioInput}\n </>\n ) : (\n <>\n {radioInput}\n {radioLabel}\n </>\n )\n\n return <span className={cx('gap-md text-body-1 flex items-start', className)}>{content}</span>\n}\n\nRadio.displayName = 'RadioGroup.Radio'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioGroupStyles = cva(['flex'], {\n variants: {\n orientation: {\n vertical: ['flex-col', 'gap-lg'],\n horizontal: ['flex-row', 'gap-xl'],\n },\n },\n})\n\nexport type RadioGroupVariantsProps = VariantProps<typeof radioGroupStyles>\n","import { ReactNode, useMemo } from 'react'\n\nimport type { RadioGroupProps } from './RadioGroup'\nimport { RadioGroupContext } from './RadioGroupContext'\nimport type { RadioInputProps } from './RadioInput'\n\nexport interface RadioGroupProviderProps\n extends Pick<RadioInputProps, 'intent' | 'disabled'>,\n Pick<RadioGroupProps, 'reverse'> {\n children: ReactNode\n}\n\nexport const RadioGroupProvider = ({\n intent,\n disabled,\n reverse,\n children,\n}: RadioGroupProviderProps) => {\n const value = useMemo(() => ({ intent, disabled, reverse }), [intent, disabled, reverse])\n\n return <RadioGroupContext.Provider value={value}>{children}</RadioGroupContext.Provider>\n}\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { RadioGroup as RadixRadioGroup } from 'radix-ui'\nimport { HTMLAttributes, Ref } from 'react'\n\nimport { radioGroupStyles, RadioGroupVariantsProps } from './RadioGroup.styles'\nimport { RadioGroupProvider } from './RadioGroupProvider'\nimport { RadioInputVariantsProps } from './RadioInput.styles'\n\nexport interface RadioGroupProps\n extends RadioGroupVariantsProps,\n Pick<RadioInputVariantsProps, 'intent'>,\n Omit<HTMLAttributes<HTMLDivElement>, 'value' | 'defaultValue' | 'dir' | 'onChange'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * The value of the radio item that should be checked when initially rendered. Use when you do not need to control the state of the radio items.\n */\n defaultValue?: string\n /**\n * The controlled value of the radio item to check. Should be used in conjunction with onValueChange.\n */\n value?: string\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: string) => void\n /**\n * When true, prevents the user from interacting with radio items.\n */\n disabled?: boolean\n /**\n * The name of the group. Submitted with its owning form as part of a name/value pair.\n */\n name?: string\n /**\n * When true, indicates that the user must check a radio item before the owning form can be submitted.\n */\n required?: boolean\n /**\n * The orientation of the component.\n */\n orientation?: 'horizontal' | 'vertical'\n /**\n * The reading direction of the radio group.\n */\n dir?: 'ltr' | 'rtl'\n /**\n * When true, keyboard navigation will loop from last item to first, and vice versa.\n */\n loop?: boolean\n /**\n * When true, the label will be placed on the left side of the Radio\n */\n reverse?: boolean\n ref?: Ref<HTMLDivElement>\n}\n\nexport const RadioGroup = ({\n orientation = 'vertical',\n loop = true,\n intent = 'support',\n disabled,\n className,\n required: requiredProp,\n reverse = false,\n ref,\n ...others\n}: RadioGroupProps) => {\n const { labelId, isInvalid, isRequired, description, name } = useFormFieldControl()\n const required = requiredProp !== undefined ? requiredProp : isRequired\n\n return (\n <RadioGroupProvider reverse={reverse} intent={intent} disabled={disabled}>\n <RadixRadioGroup.RadioGroup\n data-spark-component=\"radio-group\"\n className={radioGroupStyles({ orientation, className })}\n name={name}\n ref={ref}\n disabled={disabled}\n orientation={orientation}\n loop={loop}\n required={required}\n aria-labelledby={labelId}\n aria-invalid={isInvalid}\n aria-required={required}\n aria-describedby={description}\n {...others}\n />\n </RadioGroupProvider>\n )\n}\n\nRadioGroup.displayName = 'RadioGroup'\n","import { Radio } from './Radio'\nimport { RadioGroup as Root } from './RadioGroup'\n\nexport const RadioGroup: typeof Root & {\n Radio: typeof Radio\n} = Object.assign(Root, {\n Radio,\n})\n\nRadioGroup.displayName = 'RadioGroup'\nRadio.displayName = 'RadioGroup.Radio'\n\nexport { type RadioGroupProps } from './RadioGroup'\nexport { type RadioProps } from './Radio'\n"],"names":["RadioGroupContext","createContext","useRadioGroup","context","useContext","radioIndicatorStyles","cva","makeVariants","RadioIndicator","intent","className","ref","others","jsx","RadixRadioGroup","radioInputVariants","RadioInput","intentProp","state","useFormFieldControl","radioLabelStyles","RadioLabel","disabled","Label","ID_PREFIX","Radio","children","id","disabledProp","innerId","useId","innerLabelId","reverse","radioLabel","radioInput","content","jsxs","Fragment","cx","radioGroupStyles","RadioGroupProvider","value","useMemo","RadioGroup","orientation","loop","requiredProp","labelId","isInvalid","isRequired","description","name","required","Root"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/radio-group/RadioGroupContext.tsx","../../src/radio-group/RadioIndicator.styles.ts","../../src/radio-group/RadioIndicator.tsx","../../src/radio-group/RadioInput.styles.ts","../../src/radio-group/RadioInput.tsx","../../src/radio-group/Radio.tsx","../../src/radio-group/RadioGroup.styles.ts","../../src/radio-group/RadioGroupProvider.tsx","../../src/radio-group/RadioGroup.tsx","../../src/radio-group/index.ts"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nimport type { RadioGroupProps } from './RadioGroup'\nimport type { RadioInputProps } from './RadioInput'\n\nexport type RadioGroupContextState = Pick<RadioInputProps, 'intent' | 'disabled'> &\n Pick<RadioGroupProps, 'reverse'>\n\nexport const RadioGroupContext = createContext<RadioGroupContextState | null>(null)\n\nexport const useRadioGroup = () => {\n const context = useContext(RadioGroupContext)\n\n if (!context) {\n throw Error('useRadioGroup must be used within a RadioGroup provider')\n }\n\n return context\n}\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioIndicatorStyles = cva(\n [\n 'relative block',\n 'size-3/5',\n 'after:absolute',\n 'after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2',\n 'after:h-0',\n 'after:w-0',\n 'after:block',\n 'after:rounded-[50%]',\n \"after:content-['']\",\n 'after:transition-all',\n 'data-checked:after:size-full',\n ],\n {\n variants: {\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: ['after:bg-main'],\n support: ['after:bg-support'],\n accent: ['after:bg-accent'],\n neutral: ['after:bg-neutral'],\n success: ['after:bg-success'],\n alert: ['after:bg-alert'],\n error: ['after:bg-error'],\n info: ['after:bg-info'],\n }),\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type RadioIndicatorStylesProps = VariantProps<typeof radioIndicatorStyles>\n","import { Radio } from '@base-ui/react/radio'\nimport { Ref } from 'react'\n\nimport { radioIndicatorStyles, RadioIndicatorStylesProps } from './RadioIndicator.styles'\n\nexport interface RadioIndicatorProps extends RadioIndicatorStylesProps {\n className?: string\n /**\n * Whether to keep the indicator mounted in the DOM when the radio is unchecked.\n * Useful when controlling animation with React animation libraries.\n */\n keepMounted?: boolean\n ref?: Ref<HTMLSpanElement>\n}\n\nexport const RadioIndicator = ({\n intent,\n className,\n keepMounted,\n ref,\n ...others\n}: RadioIndicatorProps) => {\n return (\n <Radio.Indicator\n ref={ref}\n keepMounted={keepMounted}\n className={radioIndicatorStyles({ intent, className })}\n {...others}\n />\n )\n}\n\nRadioIndicator.displayName = 'RadioGroup.RadioIndicator'\n","import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioInputVariants = cva(\n [\n 'flex shrink-0 items-center justify-center',\n 'rounded-full',\n 'border-md',\n 'outline-hidden',\n 'hover:ring-4',\n 'focus-visible:u-outline',\n 'data-disabled:cursor-not-allowed data-disabled:border-outline/dim-2 data-disabled:hover:ring-transparent',\n 'u-shadow-border-transition',\n 'size-sz-24',\n ],\n {\n variants: {\n /**\n * Color scheme of the radio input.\n */\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'error', 'info', 'neutral']\n >({\n main: ['border-outline', 'data-checked:border-main', 'hover:ring-main-container'],\n support: ['border-outline', 'data-checked:border-support', 'hover:ring-support-container'],\n accent: ['border-outline', 'data-checked:border-accent', 'hover:ring-accent-container'],\n neutral: ['border-outline', 'data-checked:border-neutral', 'hover:ring-neutral-container'],\n info: ['border-info', 'data-checked:border-info', 'hover:ring-info-container'],\n success: ['border-success', 'data-checked:border-success', 'hover:ring-success-container'],\n alert: ['border-alert', 'data-checked:border-alert', 'hover:ring-alert-container'],\n error: ['border-error', 'data-checked:border-error', 'hover:ring-error-container'],\n }),\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type RadioInputVariantsProps = VariantProps<typeof radioInputVariants>\n","import { Radio } from '@base-ui/react/radio'\nimport { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { HTMLAttributes, ReactElement, Ref } from 'react'\n\nimport { RadioIndicator } from './RadioIndicator'\nimport { radioInputVariants, RadioInputVariantsProps } from './RadioInput.styles'\n\nexport interface RadioInputProps\n extends RadioInputVariantsProps,\n Omit<HTMLAttributes<HTMLElement>, 'value' | 'onChange'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n * Uses Base UI's render prop internally to merge behaviour into the child element.\n */\n asChild?: boolean\n /**\n * The value given as data when submitted with a name.\n */\n value: string\n /**\n * When true, prevents the user from interacting with the radio item.\n */\n disabled?: boolean\n /**\n * When true, indicates that the user must check the radio item before the owning form can be submitted.\n */\n required?: boolean\n /**\n * Ref forwarded to the hidden `<input type=\"radio\">` rendered by Base UI.\n * Useful for programmatic activation (e.g. clicking from an associated label span).\n */\n inputRef?: Ref<HTMLInputElement>\n ref?: Ref<HTMLElement>\n /**\n * When true, the visual radio input (outer ring and inner dot) is visually hidden but remains\n * accessible in the DOM. Useful for custom radio appearances where only the label matters visually.\n * @default false\n */\n hideInput?: boolean\n}\n\nexport const RadioInput = ({\n intent: intentProp,\n className,\n asChild,\n children,\n inputRef,\n hideInput = false,\n ref,\n ...others\n}: RadioInputProps) => {\n const { state } = useFormFieldControl()\n\n const intent = state ?? intentProp\n\n return (\n <Radio.Root\n data-spark-component=\"radio-input\"\n ref={ref}\n inputRef={inputRef}\n render={asChild ? (children as ReactElement) : undefined}\n className={hideInput ? 'sr-only' : radioInputVariants({ intent, className })}\n {...others}\n >\n {!asChild && !hideInput && <RadioIndicator intent={intent} keepMounted />}\n </Radio.Root>\n )\n}\n\nRadioInput.displayName = 'RadioGroup.RadioInput'\n","import { cx } from 'class-variance-authority'\nimport { Ref, useId } from 'react'\n\nimport { useRadioGroup } from './RadioGroupContext'\nimport { RadioInput, RadioInputProps } from './RadioInput'\n\nexport type RadioProps = RadioInputProps & {\n ref?: Ref<HTMLElement>\n}\n\nconst ID_PREFIX = ':radio'\n\nexport const Radio = ({\n className,\n children,\n disabled: disabledProp,\n ref,\n ...others\n}: RadioProps) => {\n const innerLabelId = `${ID_PREFIX}-label-${useId()}`\n\n const { intent, disabled, reverse } = useRadioGroup()\n\n const isDisabled = disabledProp || disabled\n\n const radioLabel = children && (\n <span\n data-spark-component=\"radio-label\"\n id={innerLabelId}\n className={cx(\n 'grow',\n isDisabled ? 'text-neutral/dim-2 cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n {children}\n </span>\n )\n\n const radioInput = (\n <RadioInput\n ref={ref}\n intent={intent}\n aria-labelledby={children ? innerLabelId : undefined}\n {...others}\n disabled={disabledProp}\n />\n )\n\n const content = reverse ? (\n <>\n {radioLabel}\n {radioInput}\n </>\n ) : (\n <>\n {radioInput}\n {radioLabel}\n </>\n )\n\n return <label className={cx('gap-md text-body-1 flex items-start', className)}>{content}</label>\n}\n\nRadio.displayName = 'RadioGroup.Radio'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const radioGroupStyles = cva(['flex'], {\n variants: {\n orientation: {\n vertical: ['flex-col', 'gap-lg'],\n horizontal: ['flex-row', 'gap-xl'],\n },\n },\n})\n\nexport type RadioGroupVariantsProps = VariantProps<typeof radioGroupStyles>\n","import { ReactNode, useMemo } from 'react'\n\nimport type { RadioGroupProps } from './RadioGroup'\nimport { RadioGroupContext } from './RadioGroupContext'\nimport type { RadioInputProps } from './RadioInput'\n\nexport interface RadioGroupProviderProps\n extends Pick<RadioInputProps, 'intent' | 'disabled'>,\n Pick<RadioGroupProps, 'reverse'> {\n children: ReactNode\n}\n\nexport const RadioGroupProvider = ({\n intent,\n disabled,\n reverse,\n children,\n}: RadioGroupProviderProps) => {\n const value = useMemo(() => ({ intent, disabled, reverse }), [intent, disabled, reverse])\n\n return <RadioGroupContext.Provider value={value}>{children}</RadioGroupContext.Provider>\n}\n","import { RadioGroup as BaseUIRadioGroup } from '@base-ui/react/radio-group'\nimport { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { HTMLAttributes, Ref } from 'react'\n\nimport { radioGroupStyles, RadioGroupVariantsProps } from './RadioGroup.styles'\nimport { RadioGroupProvider } from './RadioGroupProvider'\nimport { RadioInputVariantsProps } from './RadioInput.styles'\n\nexport interface RadioGroupProps\n extends RadioGroupVariantsProps,\n Pick<RadioInputVariantsProps, 'intent'>,\n Omit<HTMLAttributes<HTMLDivElement>, 'value' | 'defaultValue' | 'dir' | 'onChange'> {\n /**\n * Change the component to the HTML tag or custom component of the only child.\n */\n asChild?: boolean\n /**\n * The value of the radio item that should be checked when initially rendered. Use when you do not need to control the state of the radio items.\n */\n defaultValue?: string\n /**\n * The controlled value of the radio item to check. Should be used in conjunction with onValueChange.\n */\n value?: string\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: string) => void\n /**\n * When true, prevents the user from interacting with radio items.\n */\n disabled?: boolean\n /**\n * The name of the group. Submitted with its owning form as part of a name/value pair.\n */\n name?: string\n /**\n * When true, indicates that the user must check a radio item before the owning form can be submitted.\n */\n required?: boolean\n /**\n * The orientation of the component.\n */\n orientation?: 'horizontal' | 'vertical'\n /**\n * The reading direction of the radio group.\n */\n dir?: 'ltr' | 'rtl'\n /**\n * When true, the label will be placed on the left side of the Radio\n */\n reverse?: boolean\n ref?: Ref<HTMLDivElement>\n}\n\nexport const RadioGroup = ({\n orientation = 'vertical',\n intent = 'support',\n disabled,\n className,\n required: requiredProp,\n reverse = false,\n onValueChange: onValueChangeProp,\n ref,\n ...others\n}: RadioGroupProps) => {\n const { labelId, isInvalid, isRequired, description, name } = useFormFieldControl()\n const required = requiredProp !== undefined ? requiredProp : isRequired\n\n const handleValueChange = onValueChangeProp\n ? (value: unknown) => onValueChangeProp(value as string)\n : undefined\n\n return (\n <RadioGroupProvider reverse={reverse} intent={intent} disabled={disabled}>\n <BaseUIRadioGroup\n data-spark-component=\"radio-group\"\n className={radioGroupStyles({ orientation, className })}\n name={name}\n ref={ref}\n disabled={disabled}\n required={required}\n onValueChange={handleValueChange}\n aria-orientation={orientation}\n aria-labelledby={labelId}\n aria-invalid={isInvalid}\n aria-required={required}\n aria-describedby={description}\n {...others}\n />\n </RadioGroupProvider>\n )\n}\n\nRadioGroup.displayName = 'RadioGroup'\n","import { Radio } from './Radio'\nimport { RadioGroup as Root } from './RadioGroup'\n\nexport const RadioGroup: typeof Root & {\n Radio: typeof Radio\n} = Object.assign(Root, {\n Radio,\n})\n\nRadioGroup.displayName = 'RadioGroup'\nRadio.displayName = 'RadioGroup.Radio'\n\nexport { type RadioGroupProps } from './RadioGroup'\nexport { type RadioProps } from './Radio'\n"],"names":["RadioGroupContext","createContext","useRadioGroup","context","useContext","radioIndicatorStyles","cva","makeVariants","RadioIndicator","intent","className","keepMounted","ref","others","jsx","Radio","radioInputVariants","RadioInput","intentProp","asChild","children","inputRef","hideInput","state","useFormFieldControl","ID_PREFIX","disabledProp","innerLabelId","useId","disabled","reverse","radioLabel","cx","radioInput","content","jsxs","Fragment","radioGroupStyles","RadioGroupProvider","value","useMemo","RadioGroup","orientation","requiredProp","onValueChangeProp","labelId","isInvalid","isRequired","description","name","required","handleValueChange","BaseUIRadioGroup","Root"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { Slider as BaseSlider } from '@base-ui/react/slider';
2
- import { ComponentProps } from 'react';
3
- export type SliderValueProps = Omit<ComponentProps<typeof BaseSlider.Value>, 'render'>;
2
+ import { ReactNode, ComponentProps } from 'react';
3
+ export type SliderValueProps = Omit<ComponentProps<typeof BaseSlider.Value>, 'render' | 'children'> & {
4
+ children?: ReactNode | ((formatted: string, value: number) => ReactNode);
5
+ };
4
6
  /**
5
7
  * Normalizes Base UI's (formattedValues, values) to single (formatted, value) for the render prop.
6
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/slider/Slider.styles.ts","../../src/slider/SliderContext.tsx","../../src/slider/Slider.tsx","../../src/slider/SliderControl.tsx","../../src/slider/SliderTrack.styles.ts","../../src/slider/SliderIndicator.tsx","../../src/slider/SliderLabel.tsx","../../src/slider/SliderMaxValue.tsx","../../src/slider/SliderMinValue.tsx","../../src/slider/SliderThumbContext.tsx","../../src/slider/SliderThumb.styles.ts","../../src/slider/SliderThumb.tsx","../../src/slider/SliderTrack.tsx","../../src/slider/useSliderValueBoundaries.ts","../../src/slider/SliderValue.tsx","../../src/slider/index.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\nexport const rootStyles = cva([\n 'grid grid-cols-[1fr_auto] gap-y-sm gap-x-md relative',\n 'touch-none select-none',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-dim-3',\n])\n","import type { RefObject } from 'react'\nimport { createContext, useContext } from 'react'\n\nimport type { SliderProps } from './Slider'\n\nexport type SliderContextInterface = Pick<SliderProps, 'intent' | 'min' | 'max'> & {\n fieldLabelId?: string\n fieldId?: string\n onLabelId?: (id: string | undefined) => void\n hasValueInThumb: boolean\n registerValueInThumb: () => () => void\n controlRef: RefObject<HTMLElement | null>\n thumbRef: RefObject<HTMLElement | null>\n}\n\nexport const SliderContext = createContext<SliderContextInterface>({} as SliderContextInterface)\n\nexport const useSliderContext = () => useContext(SliderContext)\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { ComponentProps, type PropsWithChildren, Ref, useCallback, useRef, useState } from 'react'\n\nimport { rootStyles } from './Slider.styles'\nimport { SliderContext } from './SliderContext'\nimport type { SliderRangeVariantsProps } from './SliderTrack.styles'\n\nexport interface SliderProps\n extends Omit<\n ComponentProps<typeof BaseSlider.Root>,\n 'render' | 'orientation' | 'onValueChange' | 'onValueCommitted'\n >,\n PropsWithChildren<SliderRangeVariantsProps> {\n /**\n * The value of the slider when initially rendered. Use when you do not need to control the state of the slider.\n */\n defaultValue?: number\n /**\n * The controlled value of the slider. Must be used in conjunction with `onValueChange`.\n */\n value?: number\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: number) => void\n /**\n * Event handler called when the value changes at the end of an interaction. Useful when you only need to capture a final value e.g. to update a backend service.\n */\n onValueCommit?: (value: number) => void\n /**\n * The name of the slider. Submitted with its owning form as part of a name/value pair.\n * If wrapped with a FormField with a name, will be inherited from it.\n */\n name?: string\n /**\n * When `true`, prevents the user from interacting with the slider.\n * @default false\n */\n disabled?: boolean\n /**\n * Sets the slider as interactive or not.\n */\n readOnly?: boolean\n /**\n * The minimum value for the range.\n * @default 0\n */\n min?: number\n /**\n * The maximum value for the range.\n * @default 100\n */\n max?: number\n /**\n * The stepping interval.\n * @default 1\n */\n step?: number\n ref?: Ref<HTMLDivElement>\n}\n\nexport const Slider = ({\n intent = 'support',\n children,\n className,\n ref,\n value: valueProp,\n defaultValue: defaultValueProp,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n name: nameProp,\n onValueChange,\n onValueCommit,\n min = 0,\n max = 100,\n ...rest\n}: SliderProps) => {\n const field = useFormFieldControl()\n\n const disabled = field.disabled ?? disabledProp\n const readOnly = field.readOnly ?? readOnlyProp\n const name = field.name ?? nameProp\n\n const [labelId, setLabelId] = useState<string | undefined>(field.labelId)\n const [valueInThumbCount, setValueInThumbCount] = useState(0)\n const controlRef = useRef<HTMLElement | null>(null)\n const thumbRef = useRef<HTMLElement | null>(null)\n\n const handleLabelId = useCallback((id: string | undefined) => {\n setLabelId(id)\n }, [])\n\n const registerValueInThumb = useCallback(() => {\n setValueInThumbCount(c => c + 1)\n\n return () => setValueInThumbCount(c => c - 1)\n }, [])\n\n return (\n <SliderContext.Provider\n value={{\n intent,\n min,\n max,\n fieldLabelId: field.labelId || labelId,\n fieldId: field.id,\n onLabelId: handleLabelId,\n hasValueInThumb: valueInThumbCount > 0,\n registerValueInThumb,\n controlRef,\n thumbRef,\n }}\n >\n <BaseSlider.Root\n ref={ref}\n data-spark-component=\"slider\"\n className={rootStyles({ className })}\n orientation=\"horizontal\"\n disabled={disabled || readOnly}\n thumbAlignment=\"edge\"\n name={name}\n aria-describedby={field.description}\n aria-invalid={field.isInvalid}\n aria-disabled={disabled || readOnly ? true : undefined}\n value={valueProp !== undefined ? [valueProp] : undefined}\n defaultValue={defaultValueProp !== undefined ? [defaultValueProp] : undefined}\n onValueChange={\n onValueChange\n ? (value: number | readonly number[]) => {\n const v = Array.isArray(value) ? (value[0] ?? 0) : value\n onValueChange(v)\n }\n : undefined\n }\n onValueCommitted={\n onValueCommit\n ? (value: number | readonly number[]) => {\n const v = Array.isArray(value) ? (value[0] ?? 0) : value\n onValueCommit(v)\n }\n : undefined\n }\n min={min}\n max={max}\n {...rest}\n >\n {children}\n </BaseSlider.Root>\n </SliderContext.Provider>\n )\n}\n\nSlider.displayName = 'Slider'\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { ComponentProps } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport type SliderControlProps = Omit<ComponentProps<typeof BaseSlider.Control>, 'render'>\n\nexport const SliderControl = ({ className, ref, ...rest }: SliderControlProps) => {\n const { hasValueInThumb, controlRef } = useSliderContext()\n const mergedRef = useMergeRefs(controlRef, ref)\n\n return (\n <BaseSlider.Control\n data-spark-component=\"slider-control\"\n ref={mergedRef}\n className={cx(\n 'min-h-sz-24 relative col-span-2 flex w-full min-w-0 flex-1 items-center',\n hasValueInThumb && 'mt-xl',\n className\n )}\n {...rest}\n />\n )\n}\n\nSliderControl.displayName = 'Slider.Control'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const trackVariants = cva(['relative grow h-sz-4 bg-on-background/dim-4 rounded-sm'])\n\nexport const rangeVariants = cva(\n [\n 'absolute h-full rounded-sm',\n // Disable transitions during drag to eliminate latency\n 'transition-none',\n ],\n {\n variants: {\n intent: {\n main: ['bg-main'],\n support: ['bg-support'],\n accent: ['bg-accent'],\n info: ['bg-info'],\n neutral: ['bg-neutral'],\n success: ['bg-success'],\n alert: ['bg-alert'],\n error: ['bg-error'],\n },\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type SliderRangeVariantsProps = VariantProps<typeof rangeVariants>\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { rangeVariants } from './SliderTrack.styles'\n\nexport type SliderIndicatorProps = Omit<ComponentProps<typeof BaseSlider.Indicator>, 'render'>\n\nexport const SliderIndicator = ({ className, ref, ...rest }: SliderIndicatorProps) => {\n const { intent } = useSliderContext()\n\n return (\n <BaseSlider.Indicator\n data-spark-component=\"slider-indicator\"\n ref={ref}\n className={rangeVariants({ intent, className })}\n {...rest}\n />\n )\n}\n\nSliderIndicator.displayName = 'Slider.Indicator'\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { ReactNode, Ref, useEffect, useId, useRef } from 'react'\n\nimport { FormFieldRequiredIndicator } from '../form-field/FormFieldRequiredIndicator'\nimport { Label, LabelProps } from '../label'\nimport { Slottable } from '../slot'\nimport { useSliderContext } from './SliderContext'\n\nconst ID_PREFIX = ':slider-label'\n\nexport interface SliderLabelProps extends LabelProps {\n /**\n * Element shown when the input is required inside the label.\n */\n requiredIndicator?: ReactNode\n ref?: Ref<HTMLLabelElement>\n}\n\nexport const SliderLabel = ({\n htmlFor: htmlForProp,\n id: idProp,\n className,\n children,\n requiredIndicator = <FormFieldRequiredIndicator />,\n asChild,\n ref,\n ...others\n}: SliderLabelProps) => {\n const field = useFormFieldControl()\n const { fieldLabelId, fieldId, onLabelId } = useSliderContext()\n\n // Generate an id if not provided and no FormField labelId is available\n const internalId = useId()\n const generatedId = `${ID_PREFIX}-${internalId}`\n const labelId = idProp || fieldLabelId || field.labelId || generatedId\n\n // Use FormField id for htmlFor if present, otherwise use fieldId from context, or the prop\n const htmlFor = asChild ? undefined : htmlForProp || fieldId || field.id\n\n // Get disabled and required state from FormField if present\n const disabled = field.disabled\n const isRequired = field.isRequired\n\n // Notify SliderContext of the label id if no FormField is present\n const labelRef = useRef<HTMLLabelElement>(null)\n const mergedRef = useMergeRefs(ref, labelRef)\n\n useEffect(() => {\n if (onLabelId && !fieldLabelId && !field.labelId) {\n onLabelId(labelId)\n }\n }, [onLabelId, fieldLabelId, field.labelId, labelId])\n\n return (\n <Label\n ref={mergedRef}\n id={labelId}\n data-spark-component=\"slider-label\"\n htmlFor={htmlFor}\n className={cx(disabled ? 'text-on-surface/dim-3 pointer-events-none' : undefined, className)}\n asChild={asChild}\n {...others}\n >\n <>\n <Slottable>{children}</Slottable>\n {isRequired && requiredIndicator}\n </>\n </Label>\n )\n}\n\nSliderLabel.displayName = 'Slider.Label'\n","import { cx } from 'class-variance-authority'\nimport { forwardRef, type ReactNode } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport interface SliderMaxValueProps {\n className?: string\n children?: (value: number) => ReactNode\n}\n\nexport const SliderMaxValue = forwardRef<HTMLDivElement, SliderMaxValueProps>(\n ({ className, children }, ref) => {\n const { max = 100 } = useSliderContext()\n\n const content = children ? children(max) : max\n\n return (\n <div\n data-spark-component=\"slider-max-value\"\n ref={ref}\n className={cx('text-on-surface/dim-1 text-body-2 col-start-2 text-right', className)}\n >\n {content}\n </div>\n )\n }\n)\n\nSliderMaxValue.displayName = 'Slider.MaxValue'\n","import { cx } from 'class-variance-authority'\nimport { forwardRef, type ReactNode } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport interface SliderMinValueProps {\n className?: string\n children?: (value: number) => ReactNode\n}\n\nexport const SliderMinValue = forwardRef<HTMLDivElement, SliderMinValueProps>(\n ({ className, children }, ref) => {\n const { min = 0 } = useSliderContext()\n\n const content = children ? children(min) : min\n\n return (\n <div\n data-spark-component=\"slider-min-value\"\n ref={ref}\n className={cx('text-on-surface/dim-1 text-body-2 col-start-1 text-left', className)}\n >\n {content}\n </div>\n )\n }\n)\n\nSliderMinValue.displayName = 'Slider.MinValue'\n","import { createContext, useContext } from 'react'\n\nexport interface SliderThumbContextValue {\n isInsideThumb: true\n}\n\nexport const SliderThumbContext = createContext<SliderThumbContextValue | null>(null)\n\nexport const useSliderThumbContext = () => useContext(SliderThumbContext)\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const thumbVariants = cva(\n [\n 'relative block size-sz-24 rounded-full cursor-pointer',\n 'outline-hidden',\n 'has-focus-visible:ring-2 has-focus-visible:ring-offset-2 has-focus-visible:ring-focus',\n 'data-disabled:hover:ring-0 data-disabled:cursor-not-allowed data-disabled:before:hidden',\n // visual thumb\n 'after:absolute after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2',\n 'after:size-sz-24 after:rounded-full',\n // hover effect\n 'before:absolute before:left-1/2 before:top-1/2 before:-translate-x-1/2 before:-translate-y-1/2',\n 'before:size-sz-24 before:rounded-full before:border-solid before:border-sm before:transition-all before:duration-75',\n 'hover:before:size-sz-32 data-dragging:before:size-sz-32',\n ],\n {\n variants: {\n intent: {\n main: ['after:bg-main', 'before:bg-main-container before:border-main'],\n support: ['after:bg-support', 'before:bg-support-container before:border-support'],\n accent: ['after:bg-accent', 'before:bg-accent-container before:border-accent'],\n info: ['after:bg-info', 'before:bg-info-container before:border-info'],\n neutral: ['after:bg-neutral', 'before:bg-neutral-container before:border-neutral'],\n success: ['after:bg-success', 'before:bg-success-container before:border-success'],\n alert: ['after:bg-alert', 'before:bg-alert-container before:border-alert'],\n error: ['after:bg-error', 'before:bg-error-container before:border-error'],\n },\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type SliderThumbVariantsProps = VariantProps<typeof thumbVariants>\n","import { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps, type PropsWithChildren, useRef } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { SliderThumbContext } from './SliderThumbContext'\nimport { thumbVariants } from './SliderThumb.styles'\n\nexport type SliderThumbProps = Omit<\n ComponentProps<typeof BaseSlider.Thumb>,\n 'render' | 'index'\n> &\n PropsWithChildren\n\nexport const SliderThumb = ({\n className,\n ref: forwardedRef,\n children,\n ...rest\n}: SliderThumbProps) => {\n const { intent, fieldLabelId, fieldId, thumbRef: contextThumbRef } = useSliderContext()\n\n const innerRef = useRef<HTMLDivElement>(null)\n const ref = useMergeRefs(contextThumbRef, forwardedRef ?? innerRef)\n\n return (\n <SliderThumbContext.Provider value={{ isInsideThumb: true }}>\n <BaseSlider.Thumb\n data-spark-component=\"slider-thumb\"\n ref={ref}\n id={fieldId}\n className={thumbVariants({ intent, className })}\n aria-labelledby={fieldLabelId}\n {...rest}\n >\n {children}\n </BaseSlider.Thumb>\n </SliderThumbContext.Provider>\n )\n}\n\nSliderThumb.displayName = 'Slider.Thumb'\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps } from 'react'\n\nimport { trackVariants } from './SliderTrack.styles'\n\nexport type SliderTrackProps = Omit<ComponentProps<typeof BaseSlider.Track>, 'render'>\n\nexport const SliderTrack = ({ className, ref, ...rest }: SliderTrackProps) => {\n return (\n <BaseSlider.Track\n data-spark-component=\"slider-track\"\n ref={ref}\n className={trackVariants({ className })}\n {...rest}\n />\n )\n}\n\nSliderTrack.displayName = 'Slider.Track'\n","import type { RefObject } from 'react'\nimport { useLayoutEffect, useState } from 'react'\n\n/**\n * Computes the translateX (in pixels) to apply to the value element so it stays\n * within the horizontal bounds of the slider control when displayed inside the thumb.\n *\n * @param controlRef - Ref to the slider control (track container)\n * @param thumbRef - Ref to the thumb element\n * @param valueRef - Ref to the value label element\n * @param value - Current slider value (0–100 or min–max), used to re-run when thumb moves\n * @returns translateX in pixels (positive = right, negative = left), or 0 if refs are missing\n */\nexport function useSliderValueBoundaries(\n controlRef: RefObject<HTMLElement | null>,\n thumbRef: RefObject<HTMLElement | null>,\n valueRef: RefObject<HTMLElement | null>,\n value: number\n): number {\n const [translateX, setTranslateX] = useState(0)\n const [refsRetryScheduled, setRefsRetryScheduled] = useState(false)\n\n useLayoutEffect(() => {\n const control = controlRef.current\n const thumb = thumbRef.current\n const valueEl = valueRef.current\n\n if (!control || !thumb || !valueEl) {\n setTranslateX(0)\n // Re-run once on next frame when refs may be set (e.g. Slider.Value mounts after Control/Thumb)\n if (!refsRetryScheduled) {\n requestAnimationFrame(() => setRefsRetryScheduled(true))\n }\n\n return\n }\n\n let cancelled = false\n\n const compute = () => {\n if (cancelled) return\n\n const controlRect = control.getBoundingClientRect()\n const thumbRect = thumb.getBoundingClientRect()\n const valueWidth = valueEl.scrollWidth\n\n // Skip until value label has been laid out (content from render prop may not be ready on first paint)\n if (valueWidth === 0) {\n requestAnimationFrame(compute)\n\n return\n }\n\n const thumbCenterPx = thumbRect.left - controlRect.left + thumbRect.width / 2\n\n const valueCenterMin = valueWidth / 2\n const valueCenterMax = controlRect.width - valueWidth / 2\n\n const clampedCenter = Math.max(valueCenterMin, Math.min(valueCenterMax, thumbCenterPx))\n const nextTranslateX = clampedCenter - thumbCenterPx\n\n setTranslateX(prev => (prev !== nextTranslateX ? nextTranslateX : prev))\n }\n\n compute()\n\n const resizeObserver = new ResizeObserver(compute)\n resizeObserver.observe(control)\n resizeObserver.observe(valueEl)\n\n return () => {\n cancelled = true\n resizeObserver.disconnect()\n }\n }, [controlRef, thumbRef, valueRef, value, refsRetryScheduled])\n\n return translateX\n}\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { ComponentProps, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { useSliderThumbContext } from './SliderThumbContext'\nimport { useSliderValueBoundaries } from './useSliderValueBoundaries'\n\nexport type SliderValueProps = Omit<ComponentProps<typeof BaseSlider.Value>, 'render'>\n\n/**\n * Normalizes Base UI's (formattedValues, values) to single (formatted, value) for the render prop.\n */\nexport const SliderValue = ({ className, children, ref, ...rest }: SliderValueProps) => {\n const { registerValueInThumb, controlRef, thumbRef } = useSliderContext()\n const thumbContext = useSliderThumbContext()\n const isInsideThumb = thumbContext !== null\n\n const valueRef = useRef<HTMLOutputElement | null>(null)\n const mergedRef = useMergeRefs(valueRef, ref)\n\n const [currentValue, setCurrentValue] = useState(0)\n const translateX = useSliderValueBoundaries(controlRef, thumbRef, valueRef, currentValue)\n\n useEffect(() => {\n if (!isInsideThumb) return\n\n return registerValueInThumb()\n }, [isInsideThumb, registerValueInThumb])\n\n const resolvedClassName = cx(\n isInsideThumb\n ? 'absolute left-1/2 -translate-x-1/2 top-[calc(-100%-var(--spacing-sm))] text-body-1 font-bold whitespace-nowrap'\n : 'default:text-body-1 col-start-2 text-right default:font-bold',\n className\n )\n\n const normalizedChildren = useCallback(\n (formattedValues: readonly string[], values: readonly number[]) => {\n const formatted = formattedValues[0] ?? String(values[0] ?? '')\n const value = values[0] ?? 0\n setCurrentValue(value)\n if (typeof children === 'function') {\n return (children as unknown as (formatted: string, value: number) => ReactNode)(\n formatted,\n value\n )\n }\n\n return formatted\n },\n [children]\n )\n\n const style = isInsideThumb\n ? { transform: `translate(calc(0% + ${translateX}px), 0)` }\n : undefined\n\n return (\n <BaseSlider.Value\n data-spark-component=\"slider-value\"\n ref={mergedRef}\n className={resolvedClassName}\n style={style}\n {...rest}\n >\n {normalizedChildren}\n </BaseSlider.Value>\n )\n}\n\nSliderValue.displayName = 'Slider.Value'\n","import { Slider as Root, type SliderProps } from './Slider'\nimport { SliderControl as Control, type SliderControlProps } from './SliderControl'\nimport { SliderIndicator as Indicator, type SliderIndicatorProps } from './SliderIndicator'\nimport { SliderLabel as Label, type SliderLabelProps } from './SliderLabel'\nimport { SliderMaxValue as MaxValue, type SliderMaxValueProps } from './SliderMaxValue'\nimport { SliderMinValue as MinValue, type SliderMinValueProps } from './SliderMinValue'\nimport { SliderThumb as Thumb, type SliderThumbProps } from './SliderThumb'\nimport { SliderTrack as Track, type SliderTrackProps } from './SliderTrack'\nimport { SliderValue as Value, type SliderValueProps } from './SliderValue'\n\nexport const Slider: typeof Root & {\n Control: typeof Control\n Indicator: typeof Indicator\n Label: typeof Label\n MaxValue: typeof MaxValue\n MinValue: typeof MinValue\n Thumb: typeof Thumb\n Track: typeof Track\n Value: typeof Value\n} = Object.assign(Root, {\n Control,\n Indicator,\n Label,\n MaxValue,\n MinValue,\n Thumb,\n Track,\n Value,\n})\n\nSlider.displayName = 'Slider'\nControl.displayName = 'Slider.Control'\nIndicator.displayName = 'Slider.Indicator'\nLabel.displayName = 'Slider.Label'\nMaxValue.displayName = 'Slider.MaxValue'\nMinValue.displayName = 'Slider.MinValue'\nThumb.displayName = 'Slider.Thumb'\nTrack.displayName = 'Slider.Track'\nValue.displayName = 'Slider.Value'\n\nexport type {\n SliderProps,\n SliderControlProps,\n SliderIndicatorProps,\n SliderLabelProps,\n SliderMaxValueProps,\n SliderMinValueProps,\n SliderThumbProps,\n SliderTrackProps,\n SliderValueProps,\n}\n"],"names":["rootStyles","cva","SliderContext","createContext","useSliderContext","useContext","Slider","intent","children","className","ref","valueProp","defaultValueProp","disabledProp","readOnlyProp","nameProp","onValueChange","onValueCommit","min","max","rest","field","useFormFieldControl","disabled","readOnly","name","labelId","setLabelId","useState","valueInThumbCount","setValueInThumbCount","controlRef","useRef","thumbRef","handleLabelId","useCallback","id","registerValueInThumb","c","jsx","BaseSlider","value","v","SliderControl","hasValueInThumb","mergedRef","useMergeRefs","cx","trackVariants","rangeVariants","SliderIndicator","ID_PREFIX","SliderLabel","htmlForProp","idProp","requiredIndicator","FormFieldRequiredIndicator","asChild","others","fieldLabelId","fieldId","onLabelId","internalId","useId","generatedId","htmlFor","isRequired","labelRef","useEffect","Label","jsxs","Fragment","Slottable","SliderMaxValue","forwardRef","content","SliderMinValue","SliderThumbContext","useSliderThumbContext","thumbVariants","SliderThumb","forwardedRef","contextThumbRef","innerRef","SliderTrack","useSliderValueBoundaries","valueRef","translateX","setTranslateX","refsRetryScheduled","setRefsRetryScheduled","useLayoutEffect","control","thumb","valueEl","cancelled","compute","controlRect","thumbRect","valueWidth","thumbCenterPx","valueCenterMin","valueCenterMax","nextTranslateX","prev","resizeObserver","SliderValue","isInsideThumb","currentValue","setCurrentValue","resolvedClassName","normalizedChildren","formattedValues","values","formatted","style","Root","Control","Indicator","MaxValue","MinValue","Thumb","Track","Value"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/slider/Slider.styles.ts","../../src/slider/SliderContext.tsx","../../src/slider/Slider.tsx","../../src/slider/SliderControl.tsx","../../src/slider/SliderTrack.styles.ts","../../src/slider/SliderIndicator.tsx","../../src/slider/SliderLabel.tsx","../../src/slider/SliderMaxValue.tsx","../../src/slider/SliderMinValue.tsx","../../src/slider/SliderThumbContext.tsx","../../src/slider/SliderThumb.styles.ts","../../src/slider/SliderThumb.tsx","../../src/slider/SliderTrack.tsx","../../src/slider/useSliderValueBoundaries.ts","../../src/slider/SliderValue.tsx","../../src/slider/index.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\nexport const rootStyles = cva([\n 'grid grid-cols-[1fr_auto] gap-y-sm gap-x-md relative',\n 'touch-none select-none',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-dim-3',\n])\n","import type { RefObject } from 'react'\nimport { createContext, useContext } from 'react'\n\nimport type { SliderProps } from './Slider'\n\nexport type SliderContextInterface = Pick<SliderProps, 'intent' | 'min' | 'max'> & {\n fieldLabelId?: string\n fieldId?: string\n onLabelId?: (id: string | undefined) => void\n hasValueInThumb: boolean\n registerValueInThumb: () => () => void\n controlRef: RefObject<HTMLElement | null>\n thumbRef: RefObject<HTMLElement | null>\n}\n\nexport const SliderContext = createContext<SliderContextInterface>({} as SliderContextInterface)\n\nexport const useSliderContext = () => useContext(SliderContext)\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { ComponentProps, type PropsWithChildren, Ref, useCallback, useRef, useState } from 'react'\n\nimport { rootStyles } from './Slider.styles'\nimport { SliderContext } from './SliderContext'\nimport type { SliderRangeVariantsProps } from './SliderTrack.styles'\n\nexport interface SliderProps\n extends Omit<\n ComponentProps<typeof BaseSlider.Root>,\n 'render' | 'orientation' | 'onValueChange' | 'onValueCommitted'\n >,\n PropsWithChildren<SliderRangeVariantsProps> {\n /**\n * The value of the slider when initially rendered. Use when you do not need to control the state of the slider.\n */\n defaultValue?: number\n /**\n * The controlled value of the slider. Must be used in conjunction with `onValueChange`.\n */\n value?: number\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: number) => void\n /**\n * Event handler called when the value changes at the end of an interaction. Useful when you only need to capture a final value e.g. to update a backend service.\n */\n onValueCommit?: (value: number) => void\n /**\n * The name of the slider. Submitted with its owning form as part of a name/value pair.\n * If wrapped with a FormField with a name, will be inherited from it.\n */\n name?: string\n /**\n * When `true`, prevents the user from interacting with the slider.\n * @default false\n */\n disabled?: boolean\n /**\n * Sets the slider as interactive or not.\n */\n readOnly?: boolean\n /**\n * The minimum value for the range.\n * @default 0\n */\n min?: number\n /**\n * The maximum value for the range.\n * @default 100\n */\n max?: number\n /**\n * The stepping interval.\n * @default 1\n */\n step?: number\n ref?: Ref<HTMLDivElement>\n}\n\nexport const Slider = ({\n intent = 'support',\n children,\n className,\n ref,\n value: valueProp,\n defaultValue: defaultValueProp,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n name: nameProp,\n onValueChange,\n onValueCommit,\n min = 0,\n max = 100,\n ...rest\n}: SliderProps) => {\n const field = useFormFieldControl()\n\n const disabled = field.disabled ?? disabledProp\n const readOnly = field.readOnly ?? readOnlyProp\n const name = field.name ?? nameProp\n\n const [labelId, setLabelId] = useState<string | undefined>(field.labelId)\n const [valueInThumbCount, setValueInThumbCount] = useState(0)\n const controlRef = useRef<HTMLElement | null>(null)\n const thumbRef = useRef<HTMLElement | null>(null)\n\n const handleLabelId = useCallback((id: string | undefined) => {\n setLabelId(id)\n }, [])\n\n const registerValueInThumb = useCallback(() => {\n setValueInThumbCount(c => c + 1)\n\n return () => setValueInThumbCount(c => c - 1)\n }, [])\n\n return (\n <SliderContext.Provider\n value={{\n intent,\n min,\n max,\n fieldLabelId: field.labelId || labelId,\n fieldId: field.id,\n onLabelId: handleLabelId,\n hasValueInThumb: valueInThumbCount > 0,\n registerValueInThumb,\n controlRef,\n thumbRef,\n }}\n >\n <BaseSlider.Root\n ref={ref}\n data-spark-component=\"slider\"\n className={rootStyles({ className })}\n orientation=\"horizontal\"\n disabled={disabled || readOnly}\n thumbAlignment=\"edge\"\n name={name}\n aria-describedby={field.description}\n aria-invalid={field.isInvalid}\n aria-disabled={disabled || readOnly ? true : undefined}\n value={valueProp !== undefined ? [valueProp] : undefined}\n defaultValue={defaultValueProp !== undefined ? [defaultValueProp] : undefined}\n onValueChange={\n onValueChange\n ? (value: number | readonly number[]) => {\n const v = Array.isArray(value) ? (value[0] ?? 0) : value\n onValueChange(v)\n }\n : undefined\n }\n onValueCommitted={\n onValueCommit\n ? (value: number | readonly number[]) => {\n const v = Array.isArray(value) ? (value[0] ?? 0) : value\n onValueCommit(v)\n }\n : undefined\n }\n min={min}\n max={max}\n {...rest}\n >\n {children}\n </BaseSlider.Root>\n </SliderContext.Provider>\n )\n}\n\nSlider.displayName = 'Slider'\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { ComponentProps } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport type SliderControlProps = Omit<ComponentProps<typeof BaseSlider.Control>, 'render'>\n\nexport const SliderControl = ({ className, ref, ...rest }: SliderControlProps) => {\n const { hasValueInThumb, controlRef } = useSliderContext()\n const mergedRef = useMergeRefs(controlRef, ref)\n\n return (\n <BaseSlider.Control\n data-spark-component=\"slider-control\"\n ref={mergedRef}\n className={cx(\n 'min-h-sz-24 relative col-span-2 flex w-full min-w-0 flex-1 items-center',\n hasValueInThumb && 'mt-xl',\n className\n )}\n {...rest}\n />\n )\n}\n\nSliderControl.displayName = 'Slider.Control'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const trackVariants = cva(['relative grow h-sz-4 bg-on-background/dim-4 rounded-sm'])\n\nexport const rangeVariants = cva(\n [\n 'absolute h-full rounded-sm',\n // Disable transitions during drag to eliminate latency\n 'transition-none',\n ],\n {\n variants: {\n intent: {\n main: ['bg-main'],\n support: ['bg-support'],\n accent: ['bg-accent'],\n info: ['bg-info'],\n neutral: ['bg-neutral'],\n success: ['bg-success'],\n alert: ['bg-alert'],\n error: ['bg-error'],\n },\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type SliderRangeVariantsProps = VariantProps<typeof rangeVariants>\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { rangeVariants } from './SliderTrack.styles'\n\nexport type SliderIndicatorProps = Omit<ComponentProps<typeof BaseSlider.Indicator>, 'render'>\n\nexport const SliderIndicator = ({ className, ref, ...rest }: SliderIndicatorProps) => {\n const { intent } = useSliderContext()\n\n return (\n <BaseSlider.Indicator\n data-spark-component=\"slider-indicator\"\n ref={ref}\n className={rangeVariants({ intent, className })}\n {...rest}\n />\n )\n}\n\nSliderIndicator.displayName = 'Slider.Indicator'\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { ReactNode, Ref, useEffect, useId, useRef } from 'react'\n\nimport { FormFieldRequiredIndicator } from '../form-field/FormFieldRequiredIndicator'\nimport { Label, LabelProps } from '../label'\nimport { Slottable } from '../slot'\nimport { useSliderContext } from './SliderContext'\n\nconst ID_PREFIX = ':slider-label'\n\nexport interface SliderLabelProps extends LabelProps {\n /**\n * Element shown when the input is required inside the label.\n */\n requiredIndicator?: ReactNode\n ref?: Ref<HTMLLabelElement>\n}\n\nexport const SliderLabel = ({\n htmlFor: htmlForProp,\n id: idProp,\n className,\n children,\n requiredIndicator = <FormFieldRequiredIndicator />,\n asChild,\n ref,\n ...others\n}: SliderLabelProps) => {\n const field = useFormFieldControl()\n const { fieldLabelId, fieldId, onLabelId } = useSliderContext()\n\n // Generate an id if not provided and no FormField labelId is available\n const internalId = useId()\n const generatedId = `${ID_PREFIX}-${internalId}`\n const labelId = idProp || fieldLabelId || field.labelId || generatedId\n\n // Use FormField id for htmlFor if present, otherwise use fieldId from context, or the prop\n const htmlFor = asChild ? undefined : htmlForProp || fieldId || field.id\n\n // Get disabled and required state from FormField if present\n const disabled = field.disabled\n const isRequired = field.isRequired\n\n // Notify SliderContext of the label id if no FormField is present\n const labelRef = useRef<HTMLLabelElement>(null)\n const mergedRef = useMergeRefs(ref, labelRef)\n\n useEffect(() => {\n if (onLabelId && !fieldLabelId && !field.labelId) {\n onLabelId(labelId)\n }\n }, [onLabelId, fieldLabelId, field.labelId, labelId])\n\n return (\n <Label\n ref={mergedRef}\n id={labelId}\n data-spark-component=\"slider-label\"\n htmlFor={htmlFor}\n className={cx(disabled ? 'text-on-surface/dim-3 pointer-events-none' : undefined, className)}\n asChild={asChild}\n {...others}\n >\n <>\n <Slottable>{children}</Slottable>\n {isRequired && requiredIndicator}\n </>\n </Label>\n )\n}\n\nSliderLabel.displayName = 'Slider.Label'\n","import { cx } from 'class-variance-authority'\nimport { forwardRef, type ReactNode } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport interface SliderMaxValueProps {\n className?: string\n children?: (value: number) => ReactNode\n}\n\nexport const SliderMaxValue = forwardRef<HTMLDivElement, SliderMaxValueProps>(\n ({ className, children }, ref) => {\n const { max = 100 } = useSliderContext()\n\n const content = children ? children(max) : max\n\n return (\n <div\n data-spark-component=\"slider-max-value\"\n ref={ref}\n className={cx('text-on-surface/dim-1 text-body-2 col-start-2 text-right', className)}\n >\n {content}\n </div>\n )\n }\n)\n\nSliderMaxValue.displayName = 'Slider.MaxValue'\n","import { cx } from 'class-variance-authority'\nimport { forwardRef, type ReactNode } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport interface SliderMinValueProps {\n className?: string\n children?: (value: number) => ReactNode\n}\n\nexport const SliderMinValue = forwardRef<HTMLDivElement, SliderMinValueProps>(\n ({ className, children }, ref) => {\n const { min = 0 } = useSliderContext()\n\n const content = children ? children(min) : min\n\n return (\n <div\n data-spark-component=\"slider-min-value\"\n ref={ref}\n className={cx('text-on-surface/dim-1 text-body-2 col-start-1 text-left', className)}\n >\n {content}\n </div>\n )\n }\n)\n\nSliderMinValue.displayName = 'Slider.MinValue'\n","import { createContext, useContext } from 'react'\n\nexport interface SliderThumbContextValue {\n isInsideThumb: true\n}\n\nexport const SliderThumbContext = createContext<SliderThumbContextValue | null>(null)\n\nexport const useSliderThumbContext = () => useContext(SliderThumbContext)\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const thumbVariants = cva(\n [\n 'relative block size-sz-24 rounded-full cursor-pointer',\n 'outline-hidden',\n 'has-focus-visible:ring-2 has-focus-visible:ring-offset-2 has-focus-visible:ring-focus',\n 'data-disabled:hover:ring-0 data-disabled:cursor-not-allowed data-disabled:before:hidden',\n // visual thumb\n 'after:absolute after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2',\n 'after:size-sz-24 after:rounded-full',\n // hover effect\n 'before:absolute before:left-1/2 before:top-1/2 before:-translate-x-1/2 before:-translate-y-1/2',\n 'before:size-sz-24 before:rounded-full before:border-solid before:border-sm before:transition-all before:duration-75',\n 'hover:before:size-sz-32 data-dragging:before:size-sz-32',\n ],\n {\n variants: {\n intent: {\n main: ['after:bg-main', 'before:bg-main-container before:border-main'],\n support: ['after:bg-support', 'before:bg-support-container before:border-support'],\n accent: ['after:bg-accent', 'before:bg-accent-container before:border-accent'],\n info: ['after:bg-info', 'before:bg-info-container before:border-info'],\n neutral: ['after:bg-neutral', 'before:bg-neutral-container before:border-neutral'],\n success: ['after:bg-success', 'before:bg-success-container before:border-success'],\n alert: ['after:bg-alert', 'before:bg-alert-container before:border-alert'],\n error: ['after:bg-error', 'before:bg-error-container before:border-error'],\n },\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type SliderThumbVariantsProps = VariantProps<typeof thumbVariants>\n","import { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps, type PropsWithChildren, useRef } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { SliderThumbContext } from './SliderThumbContext'\nimport { thumbVariants } from './SliderThumb.styles'\n\nexport type SliderThumbProps = Omit<\n ComponentProps<typeof BaseSlider.Thumb>,\n 'render' | 'index'\n> &\n PropsWithChildren\n\nexport const SliderThumb = ({\n className,\n ref: forwardedRef,\n children,\n ...rest\n}: SliderThumbProps) => {\n const { intent, fieldLabelId, fieldId, thumbRef: contextThumbRef } = useSliderContext()\n\n const innerRef = useRef<HTMLDivElement>(null)\n const ref = useMergeRefs(contextThumbRef, forwardedRef ?? innerRef)\n\n return (\n <SliderThumbContext.Provider value={{ isInsideThumb: true }}>\n <BaseSlider.Thumb\n data-spark-component=\"slider-thumb\"\n ref={ref}\n id={fieldId}\n className={thumbVariants({ intent, className })}\n aria-labelledby={fieldLabelId}\n {...rest}\n >\n {children}\n </BaseSlider.Thumb>\n </SliderThumbContext.Provider>\n )\n}\n\nSliderThumb.displayName = 'Slider.Thumb'\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps } from 'react'\n\nimport { trackVariants } from './SliderTrack.styles'\n\nexport type SliderTrackProps = Omit<ComponentProps<typeof BaseSlider.Track>, 'render'>\n\nexport const SliderTrack = ({ className, ref, ...rest }: SliderTrackProps) => {\n return (\n <BaseSlider.Track\n data-spark-component=\"slider-track\"\n ref={ref}\n className={trackVariants({ className })}\n {...rest}\n />\n )\n}\n\nSliderTrack.displayName = 'Slider.Track'\n","import type { RefObject } from 'react'\nimport { useLayoutEffect, useState } from 'react'\n\n/**\n * Computes the translateX (in pixels) to apply to the value element so it stays\n * within the horizontal bounds of the slider control when displayed inside the thumb.\n *\n * @param controlRef - Ref to the slider control (track container)\n * @param thumbRef - Ref to the thumb element\n * @param valueRef - Ref to the value label element\n * @param value - Current slider value (0–100 or min–max), used to re-run when thumb moves\n * @returns translateX in pixels (positive = right, negative = left), or 0 if refs are missing\n */\nexport function useSliderValueBoundaries(\n controlRef: RefObject<HTMLElement | null>,\n thumbRef: RefObject<HTMLElement | null>,\n valueRef: RefObject<HTMLElement | null>,\n value: number\n): number {\n const [translateX, setTranslateX] = useState(0)\n const [refsRetryScheduled, setRefsRetryScheduled] = useState(false)\n\n useLayoutEffect(() => {\n const control = controlRef.current\n const thumb = thumbRef.current\n const valueEl = valueRef.current\n\n if (!control || !thumb || !valueEl) {\n setTranslateX(0)\n // Re-run once on next frame when refs may be set (e.g. Slider.Value mounts after Control/Thumb)\n if (!refsRetryScheduled) {\n requestAnimationFrame(() => setRefsRetryScheduled(true))\n }\n\n return\n }\n\n let cancelled = false\n\n const compute = () => {\n if (cancelled) return\n\n const controlRect = control.getBoundingClientRect()\n const thumbRect = thumb.getBoundingClientRect()\n const valueWidth = valueEl.scrollWidth\n\n // Skip until value label has been laid out (content from render prop may not be ready on first paint)\n if (valueWidth === 0) {\n requestAnimationFrame(compute)\n\n return\n }\n\n const thumbCenterPx = thumbRect.left - controlRect.left + thumbRect.width / 2\n\n const valueCenterMin = valueWidth / 2\n const valueCenterMax = controlRect.width - valueWidth / 2\n\n const clampedCenter = Math.max(valueCenterMin, Math.min(valueCenterMax, thumbCenterPx))\n const nextTranslateX = clampedCenter - thumbCenterPx\n\n setTranslateX(prev => (prev !== nextTranslateX ? nextTranslateX : prev))\n }\n\n compute()\n\n const resizeObserver = new ResizeObserver(compute)\n resizeObserver.observe(control)\n resizeObserver.observe(valueEl)\n\n return () => {\n cancelled = true\n resizeObserver.disconnect()\n }\n }, [controlRef, thumbRef, valueRef, value, refsRetryScheduled])\n\n return translateX\n}\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { ComponentProps, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { useSliderThumbContext } from './SliderThumbContext'\nimport { useSliderValueBoundaries } from './useSliderValueBoundaries'\n\nexport type SliderValueProps = Omit<\n ComponentProps<typeof BaseSlider.Value>,\n 'render' | 'children'\n> & {\n children?: ReactNode | ((formatted: string, value: number) => ReactNode)\n}\n\n/**\n * Normalizes Base UI's (formattedValues, values) to single (formatted, value) for the render prop.\n */\nexport const SliderValue = ({ className, children, ref, ...rest }: SliderValueProps) => {\n const { registerValueInThumb, controlRef, thumbRef } = useSliderContext()\n const thumbContext = useSliderThumbContext()\n const isInsideThumb = thumbContext !== null\n\n const valueRef = useRef<HTMLOutputElement | null>(null)\n const mergedRef = useMergeRefs(valueRef, ref)\n\n const [currentValue, setCurrentValue] = useState(0)\n const translateX = useSliderValueBoundaries(controlRef, thumbRef, valueRef, currentValue)\n\n useEffect(() => {\n if (!isInsideThumb) return\n\n return registerValueInThumb()\n }, [isInsideThumb, registerValueInThumb])\n\n const resolvedClassName = cx(\n isInsideThumb\n ? 'absolute left-1/2 -translate-x-1/2 top-[calc(-100%-var(--spacing-sm))] text-body-1 font-bold whitespace-nowrap'\n : 'default:text-body-1 col-start-2 text-right default:font-bold',\n className\n )\n\n const normalizedChildren = useCallback(\n (formattedValues: readonly string[], values: readonly number[]) => {\n const formatted = formattedValues[0] ?? String(values[0] ?? '')\n const value = values[0] ?? 0\n setCurrentValue(value)\n if (typeof children === 'function') {\n return children(formatted, value)\n }\n\n return formatted\n },\n [children]\n )\n\n const style = isInsideThumb\n ? { transform: `translate(calc(0% + ${translateX}px), 0)` }\n : undefined\n\n return (\n <BaseSlider.Value\n data-spark-component=\"slider-value\"\n ref={mergedRef}\n className={resolvedClassName}\n style={style}\n {...rest}\n >\n {normalizedChildren}\n </BaseSlider.Value>\n )\n}\n\nSliderValue.displayName = 'Slider.Value'\n","import { Slider as Root, type SliderProps } from './Slider'\nimport { SliderControl as Control, type SliderControlProps } from './SliderControl'\nimport { SliderIndicator as Indicator, type SliderIndicatorProps } from './SliderIndicator'\nimport { SliderLabel as Label, type SliderLabelProps } from './SliderLabel'\nimport { SliderMaxValue as MaxValue, type SliderMaxValueProps } from './SliderMaxValue'\nimport { SliderMinValue as MinValue, type SliderMinValueProps } from './SliderMinValue'\nimport { SliderThumb as Thumb, type SliderThumbProps } from './SliderThumb'\nimport { SliderTrack as Track, type SliderTrackProps } from './SliderTrack'\nimport { SliderValue as Value, type SliderValueProps } from './SliderValue'\n\nexport const Slider: typeof Root & {\n Control: typeof Control\n Indicator: typeof Indicator\n Label: typeof Label\n MaxValue: typeof MaxValue\n MinValue: typeof MinValue\n Thumb: typeof Thumb\n Track: typeof Track\n Value: typeof Value\n} = Object.assign(Root, {\n Control,\n Indicator,\n Label,\n MaxValue,\n MinValue,\n Thumb,\n Track,\n Value,\n})\n\nSlider.displayName = 'Slider'\nControl.displayName = 'Slider.Control'\nIndicator.displayName = 'Slider.Indicator'\nLabel.displayName = 'Slider.Label'\nMaxValue.displayName = 'Slider.MaxValue'\nMinValue.displayName = 'Slider.MinValue'\nThumb.displayName = 'Slider.Thumb'\nTrack.displayName = 'Slider.Track'\nValue.displayName = 'Slider.Value'\n\nexport type {\n SliderProps,\n SliderControlProps,\n SliderIndicatorProps,\n SliderLabelProps,\n SliderMaxValueProps,\n SliderMinValueProps,\n SliderThumbProps,\n SliderTrackProps,\n SliderValueProps,\n}\n"],"names":["rootStyles","cva","SliderContext","createContext","useSliderContext","useContext","Slider","intent","children","className","ref","valueProp","defaultValueProp","disabledProp","readOnlyProp","nameProp","onValueChange","onValueCommit","min","max","rest","field","useFormFieldControl","disabled","readOnly","name","labelId","setLabelId","useState","valueInThumbCount","setValueInThumbCount","controlRef","useRef","thumbRef","handleLabelId","useCallback","id","registerValueInThumb","c","jsx","BaseSlider","value","v","SliderControl","hasValueInThumb","mergedRef","useMergeRefs","cx","trackVariants","rangeVariants","SliderIndicator","ID_PREFIX","SliderLabel","htmlForProp","idProp","requiredIndicator","FormFieldRequiredIndicator","asChild","others","fieldLabelId","fieldId","onLabelId","internalId","useId","generatedId","htmlFor","isRequired","labelRef","useEffect","Label","jsxs","Fragment","Slottable","SliderMaxValue","forwardRef","content","SliderMinValue","SliderThumbContext","useSliderThumbContext","thumbVariants","SliderThumb","forwardedRef","contextThumbRef","innerRef","SliderTrack","useSliderValueBoundaries","valueRef","translateX","setTranslateX","refsRetryScheduled","setRefsRetryScheduled","useLayoutEffect","control","thumb","valueEl","cancelled","compute","controlRect","thumbRect","valueWidth","thumbCenterPx","valueCenterMin","valueCenterMax","nextTranslateX","prev","resizeObserver","SliderValue","isInsideThumb","currentValue","setCurrentValue","resolvedClassName","normalizedChildren","formattedValues","values","formatted","style","Root","Control","Indicator","MaxValue","MinValue","Thumb","Track","Value"],"mappings":"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"}
@@ -292,10 +292,7 @@ const B = ({ className: t, children: e, ref: r, ...a }) => {
292
292
  ), h = F(
293
293
  (y, S) => {
294
294
  const x = y[0] ?? String(S[0] ?? ""), V = S[0] ?? 0;
295
- return m(V), typeof e == "function" ? e(
296
- x,
297
- V
298
- ) : x;
295
+ return m(V), typeof e == "function" ? e(x, V) : x;
299
296
  },
300
297
  [e]
301
298
  ), p = n ? { transform: `translate(calc(0% + ${g}px), 0)` } : void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/slider/Slider.styles.ts","../../src/slider/SliderContext.tsx","../../src/slider/Slider.tsx","../../src/slider/SliderControl.tsx","../../src/slider/SliderTrack.styles.ts","../../src/slider/SliderIndicator.tsx","../../src/slider/SliderLabel.tsx","../../src/slider/SliderMaxValue.tsx","../../src/slider/SliderMinValue.tsx","../../src/slider/SliderThumbContext.tsx","../../src/slider/SliderThumb.styles.ts","../../src/slider/SliderThumb.tsx","../../src/slider/SliderTrack.tsx","../../src/slider/useSliderValueBoundaries.ts","../../src/slider/SliderValue.tsx","../../src/slider/index.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\nexport const rootStyles = cva([\n 'grid grid-cols-[1fr_auto] gap-y-sm gap-x-md relative',\n 'touch-none select-none',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-dim-3',\n])\n","import type { RefObject } from 'react'\nimport { createContext, useContext } from 'react'\n\nimport type { SliderProps } from './Slider'\n\nexport type SliderContextInterface = Pick<SliderProps, 'intent' | 'min' | 'max'> & {\n fieldLabelId?: string\n fieldId?: string\n onLabelId?: (id: string | undefined) => void\n hasValueInThumb: boolean\n registerValueInThumb: () => () => void\n controlRef: RefObject<HTMLElement | null>\n thumbRef: RefObject<HTMLElement | null>\n}\n\nexport const SliderContext = createContext<SliderContextInterface>({} as SliderContextInterface)\n\nexport const useSliderContext = () => useContext(SliderContext)\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { ComponentProps, type PropsWithChildren, Ref, useCallback, useRef, useState } from 'react'\n\nimport { rootStyles } from './Slider.styles'\nimport { SliderContext } from './SliderContext'\nimport type { SliderRangeVariantsProps } from './SliderTrack.styles'\n\nexport interface SliderProps\n extends Omit<\n ComponentProps<typeof BaseSlider.Root>,\n 'render' | 'orientation' | 'onValueChange' | 'onValueCommitted'\n >,\n PropsWithChildren<SliderRangeVariantsProps> {\n /**\n * The value of the slider when initially rendered. Use when you do not need to control the state of the slider.\n */\n defaultValue?: number\n /**\n * The controlled value of the slider. Must be used in conjunction with `onValueChange`.\n */\n value?: number\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: number) => void\n /**\n * Event handler called when the value changes at the end of an interaction. Useful when you only need to capture a final value e.g. to update a backend service.\n */\n onValueCommit?: (value: number) => void\n /**\n * The name of the slider. Submitted with its owning form as part of a name/value pair.\n * If wrapped with a FormField with a name, will be inherited from it.\n */\n name?: string\n /**\n * When `true`, prevents the user from interacting with the slider.\n * @default false\n */\n disabled?: boolean\n /**\n * Sets the slider as interactive or not.\n */\n readOnly?: boolean\n /**\n * The minimum value for the range.\n * @default 0\n */\n min?: number\n /**\n * The maximum value for the range.\n * @default 100\n */\n max?: number\n /**\n * The stepping interval.\n * @default 1\n */\n step?: number\n ref?: Ref<HTMLDivElement>\n}\n\nexport const Slider = ({\n intent = 'support',\n children,\n className,\n ref,\n value: valueProp,\n defaultValue: defaultValueProp,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n name: nameProp,\n onValueChange,\n onValueCommit,\n min = 0,\n max = 100,\n ...rest\n}: SliderProps) => {\n const field = useFormFieldControl()\n\n const disabled = field.disabled ?? disabledProp\n const readOnly = field.readOnly ?? readOnlyProp\n const name = field.name ?? nameProp\n\n const [labelId, setLabelId] = useState<string | undefined>(field.labelId)\n const [valueInThumbCount, setValueInThumbCount] = useState(0)\n const controlRef = useRef<HTMLElement | null>(null)\n const thumbRef = useRef<HTMLElement | null>(null)\n\n const handleLabelId = useCallback((id: string | undefined) => {\n setLabelId(id)\n }, [])\n\n const registerValueInThumb = useCallback(() => {\n setValueInThumbCount(c => c + 1)\n\n return () => setValueInThumbCount(c => c - 1)\n }, [])\n\n return (\n <SliderContext.Provider\n value={{\n intent,\n min,\n max,\n fieldLabelId: field.labelId || labelId,\n fieldId: field.id,\n onLabelId: handleLabelId,\n hasValueInThumb: valueInThumbCount > 0,\n registerValueInThumb,\n controlRef,\n thumbRef,\n }}\n >\n <BaseSlider.Root\n ref={ref}\n data-spark-component=\"slider\"\n className={rootStyles({ className })}\n orientation=\"horizontal\"\n disabled={disabled || readOnly}\n thumbAlignment=\"edge\"\n name={name}\n aria-describedby={field.description}\n aria-invalid={field.isInvalid}\n aria-disabled={disabled || readOnly ? true : undefined}\n value={valueProp !== undefined ? [valueProp] : undefined}\n defaultValue={defaultValueProp !== undefined ? [defaultValueProp] : undefined}\n onValueChange={\n onValueChange\n ? (value: number | readonly number[]) => {\n const v = Array.isArray(value) ? (value[0] ?? 0) : value\n onValueChange(v)\n }\n : undefined\n }\n onValueCommitted={\n onValueCommit\n ? (value: number | readonly number[]) => {\n const v = Array.isArray(value) ? (value[0] ?? 0) : value\n onValueCommit(v)\n }\n : undefined\n }\n min={min}\n max={max}\n {...rest}\n >\n {children}\n </BaseSlider.Root>\n </SliderContext.Provider>\n )\n}\n\nSlider.displayName = 'Slider'\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { ComponentProps } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport type SliderControlProps = Omit<ComponentProps<typeof BaseSlider.Control>, 'render'>\n\nexport const SliderControl = ({ className, ref, ...rest }: SliderControlProps) => {\n const { hasValueInThumb, controlRef } = useSliderContext()\n const mergedRef = useMergeRefs(controlRef, ref)\n\n return (\n <BaseSlider.Control\n data-spark-component=\"slider-control\"\n ref={mergedRef}\n className={cx(\n 'min-h-sz-24 relative col-span-2 flex w-full min-w-0 flex-1 items-center',\n hasValueInThumb && 'mt-xl',\n className\n )}\n {...rest}\n />\n )\n}\n\nSliderControl.displayName = 'Slider.Control'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const trackVariants = cva(['relative grow h-sz-4 bg-on-background/dim-4 rounded-sm'])\n\nexport const rangeVariants = cva(\n [\n 'absolute h-full rounded-sm',\n // Disable transitions during drag to eliminate latency\n 'transition-none',\n ],\n {\n variants: {\n intent: {\n main: ['bg-main'],\n support: ['bg-support'],\n accent: ['bg-accent'],\n info: ['bg-info'],\n neutral: ['bg-neutral'],\n success: ['bg-success'],\n alert: ['bg-alert'],\n error: ['bg-error'],\n },\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type SliderRangeVariantsProps = VariantProps<typeof rangeVariants>\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { rangeVariants } from './SliderTrack.styles'\n\nexport type SliderIndicatorProps = Omit<ComponentProps<typeof BaseSlider.Indicator>, 'render'>\n\nexport const SliderIndicator = ({ className, ref, ...rest }: SliderIndicatorProps) => {\n const { intent } = useSliderContext()\n\n return (\n <BaseSlider.Indicator\n data-spark-component=\"slider-indicator\"\n ref={ref}\n className={rangeVariants({ intent, className })}\n {...rest}\n />\n )\n}\n\nSliderIndicator.displayName = 'Slider.Indicator'\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { ReactNode, Ref, useEffect, useId, useRef } from 'react'\n\nimport { FormFieldRequiredIndicator } from '../form-field/FormFieldRequiredIndicator'\nimport { Label, LabelProps } from '../label'\nimport { Slottable } from '../slot'\nimport { useSliderContext } from './SliderContext'\n\nconst ID_PREFIX = ':slider-label'\n\nexport interface SliderLabelProps extends LabelProps {\n /**\n * Element shown when the input is required inside the label.\n */\n requiredIndicator?: ReactNode\n ref?: Ref<HTMLLabelElement>\n}\n\nexport const SliderLabel = ({\n htmlFor: htmlForProp,\n id: idProp,\n className,\n children,\n requiredIndicator = <FormFieldRequiredIndicator />,\n asChild,\n ref,\n ...others\n}: SliderLabelProps) => {\n const field = useFormFieldControl()\n const { fieldLabelId, fieldId, onLabelId } = useSliderContext()\n\n // Generate an id if not provided and no FormField labelId is available\n const internalId = useId()\n const generatedId = `${ID_PREFIX}-${internalId}`\n const labelId = idProp || fieldLabelId || field.labelId || generatedId\n\n // Use FormField id for htmlFor if present, otherwise use fieldId from context, or the prop\n const htmlFor = asChild ? undefined : htmlForProp || fieldId || field.id\n\n // Get disabled and required state from FormField if present\n const disabled = field.disabled\n const isRequired = field.isRequired\n\n // Notify SliderContext of the label id if no FormField is present\n const labelRef = useRef<HTMLLabelElement>(null)\n const mergedRef = useMergeRefs(ref, labelRef)\n\n useEffect(() => {\n if (onLabelId && !fieldLabelId && !field.labelId) {\n onLabelId(labelId)\n }\n }, [onLabelId, fieldLabelId, field.labelId, labelId])\n\n return (\n <Label\n ref={mergedRef}\n id={labelId}\n data-spark-component=\"slider-label\"\n htmlFor={htmlFor}\n className={cx(disabled ? 'text-on-surface/dim-3 pointer-events-none' : undefined, className)}\n asChild={asChild}\n {...others}\n >\n <>\n <Slottable>{children}</Slottable>\n {isRequired && requiredIndicator}\n </>\n </Label>\n )\n}\n\nSliderLabel.displayName = 'Slider.Label'\n","import { cx } from 'class-variance-authority'\nimport { forwardRef, type ReactNode } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport interface SliderMaxValueProps {\n className?: string\n children?: (value: number) => ReactNode\n}\n\nexport const SliderMaxValue = forwardRef<HTMLDivElement, SliderMaxValueProps>(\n ({ className, children }, ref) => {\n const { max = 100 } = useSliderContext()\n\n const content = children ? children(max) : max\n\n return (\n <div\n data-spark-component=\"slider-max-value\"\n ref={ref}\n className={cx('text-on-surface/dim-1 text-body-2 col-start-2 text-right', className)}\n >\n {content}\n </div>\n )\n }\n)\n\nSliderMaxValue.displayName = 'Slider.MaxValue'\n","import { cx } from 'class-variance-authority'\nimport { forwardRef, type ReactNode } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport interface SliderMinValueProps {\n className?: string\n children?: (value: number) => ReactNode\n}\n\nexport const SliderMinValue = forwardRef<HTMLDivElement, SliderMinValueProps>(\n ({ className, children }, ref) => {\n const { min = 0 } = useSliderContext()\n\n const content = children ? children(min) : min\n\n return (\n <div\n data-spark-component=\"slider-min-value\"\n ref={ref}\n className={cx('text-on-surface/dim-1 text-body-2 col-start-1 text-left', className)}\n >\n {content}\n </div>\n )\n }\n)\n\nSliderMinValue.displayName = 'Slider.MinValue'\n","import { createContext, useContext } from 'react'\n\nexport interface SliderThumbContextValue {\n isInsideThumb: true\n}\n\nexport const SliderThumbContext = createContext<SliderThumbContextValue | null>(null)\n\nexport const useSliderThumbContext = () => useContext(SliderThumbContext)\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const thumbVariants = cva(\n [\n 'relative block size-sz-24 rounded-full cursor-pointer',\n 'outline-hidden',\n 'has-focus-visible:ring-2 has-focus-visible:ring-offset-2 has-focus-visible:ring-focus',\n 'data-disabled:hover:ring-0 data-disabled:cursor-not-allowed data-disabled:before:hidden',\n // visual thumb\n 'after:absolute after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2',\n 'after:size-sz-24 after:rounded-full',\n // hover effect\n 'before:absolute before:left-1/2 before:top-1/2 before:-translate-x-1/2 before:-translate-y-1/2',\n 'before:size-sz-24 before:rounded-full before:border-solid before:border-sm before:transition-all before:duration-75',\n 'hover:before:size-sz-32 data-dragging:before:size-sz-32',\n ],\n {\n variants: {\n intent: {\n main: ['after:bg-main', 'before:bg-main-container before:border-main'],\n support: ['after:bg-support', 'before:bg-support-container before:border-support'],\n accent: ['after:bg-accent', 'before:bg-accent-container before:border-accent'],\n info: ['after:bg-info', 'before:bg-info-container before:border-info'],\n neutral: ['after:bg-neutral', 'before:bg-neutral-container before:border-neutral'],\n success: ['after:bg-success', 'before:bg-success-container before:border-success'],\n alert: ['after:bg-alert', 'before:bg-alert-container before:border-alert'],\n error: ['after:bg-error', 'before:bg-error-container before:border-error'],\n },\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type SliderThumbVariantsProps = VariantProps<typeof thumbVariants>\n","import { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps, type PropsWithChildren, useRef } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { SliderThumbContext } from './SliderThumbContext'\nimport { thumbVariants } from './SliderThumb.styles'\n\nexport type SliderThumbProps = Omit<\n ComponentProps<typeof BaseSlider.Thumb>,\n 'render' | 'index'\n> &\n PropsWithChildren\n\nexport const SliderThumb = ({\n className,\n ref: forwardedRef,\n children,\n ...rest\n}: SliderThumbProps) => {\n const { intent, fieldLabelId, fieldId, thumbRef: contextThumbRef } = useSliderContext()\n\n const innerRef = useRef<HTMLDivElement>(null)\n const ref = useMergeRefs(contextThumbRef, forwardedRef ?? innerRef)\n\n return (\n <SliderThumbContext.Provider value={{ isInsideThumb: true }}>\n <BaseSlider.Thumb\n data-spark-component=\"slider-thumb\"\n ref={ref}\n id={fieldId}\n className={thumbVariants({ intent, className })}\n aria-labelledby={fieldLabelId}\n {...rest}\n >\n {children}\n </BaseSlider.Thumb>\n </SliderThumbContext.Provider>\n )\n}\n\nSliderThumb.displayName = 'Slider.Thumb'\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps } from 'react'\n\nimport { trackVariants } from './SliderTrack.styles'\n\nexport type SliderTrackProps = Omit<ComponentProps<typeof BaseSlider.Track>, 'render'>\n\nexport const SliderTrack = ({ className, ref, ...rest }: SliderTrackProps) => {\n return (\n <BaseSlider.Track\n data-spark-component=\"slider-track\"\n ref={ref}\n className={trackVariants({ className })}\n {...rest}\n />\n )\n}\n\nSliderTrack.displayName = 'Slider.Track'\n","import type { RefObject } from 'react'\nimport { useLayoutEffect, useState } from 'react'\n\n/**\n * Computes the translateX (in pixels) to apply to the value element so it stays\n * within the horizontal bounds of the slider control when displayed inside the thumb.\n *\n * @param controlRef - Ref to the slider control (track container)\n * @param thumbRef - Ref to the thumb element\n * @param valueRef - Ref to the value label element\n * @param value - Current slider value (0–100 or min–max), used to re-run when thumb moves\n * @returns translateX in pixels (positive = right, negative = left), or 0 if refs are missing\n */\nexport function useSliderValueBoundaries(\n controlRef: RefObject<HTMLElement | null>,\n thumbRef: RefObject<HTMLElement | null>,\n valueRef: RefObject<HTMLElement | null>,\n value: number\n): number {\n const [translateX, setTranslateX] = useState(0)\n const [refsRetryScheduled, setRefsRetryScheduled] = useState(false)\n\n useLayoutEffect(() => {\n const control = controlRef.current\n const thumb = thumbRef.current\n const valueEl = valueRef.current\n\n if (!control || !thumb || !valueEl) {\n setTranslateX(0)\n // Re-run once on next frame when refs may be set (e.g. Slider.Value mounts after Control/Thumb)\n if (!refsRetryScheduled) {\n requestAnimationFrame(() => setRefsRetryScheduled(true))\n }\n\n return\n }\n\n let cancelled = false\n\n const compute = () => {\n if (cancelled) return\n\n const controlRect = control.getBoundingClientRect()\n const thumbRect = thumb.getBoundingClientRect()\n const valueWidth = valueEl.scrollWidth\n\n // Skip until value label has been laid out (content from render prop may not be ready on first paint)\n if (valueWidth === 0) {\n requestAnimationFrame(compute)\n\n return\n }\n\n const thumbCenterPx = thumbRect.left - controlRect.left + thumbRect.width / 2\n\n const valueCenterMin = valueWidth / 2\n const valueCenterMax = controlRect.width - valueWidth / 2\n\n const clampedCenter = Math.max(valueCenterMin, Math.min(valueCenterMax, thumbCenterPx))\n const nextTranslateX = clampedCenter - thumbCenterPx\n\n setTranslateX(prev => (prev !== nextTranslateX ? nextTranslateX : prev))\n }\n\n compute()\n\n const resizeObserver = new ResizeObserver(compute)\n resizeObserver.observe(control)\n resizeObserver.observe(valueEl)\n\n return () => {\n cancelled = true\n resizeObserver.disconnect()\n }\n }, [controlRef, thumbRef, valueRef, value, refsRetryScheduled])\n\n return translateX\n}\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { ComponentProps, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { useSliderThumbContext } from './SliderThumbContext'\nimport { useSliderValueBoundaries } from './useSliderValueBoundaries'\n\nexport type SliderValueProps = Omit<ComponentProps<typeof BaseSlider.Value>, 'render'>\n\n/**\n * Normalizes Base UI's (formattedValues, values) to single (formatted, value) for the render prop.\n */\nexport const SliderValue = ({ className, children, ref, ...rest }: SliderValueProps) => {\n const { registerValueInThumb, controlRef, thumbRef } = useSliderContext()\n const thumbContext = useSliderThumbContext()\n const isInsideThumb = thumbContext !== null\n\n const valueRef = useRef<HTMLOutputElement | null>(null)\n const mergedRef = useMergeRefs(valueRef, ref)\n\n const [currentValue, setCurrentValue] = useState(0)\n const translateX = useSliderValueBoundaries(controlRef, thumbRef, valueRef, currentValue)\n\n useEffect(() => {\n if (!isInsideThumb) return\n\n return registerValueInThumb()\n }, [isInsideThumb, registerValueInThumb])\n\n const resolvedClassName = cx(\n isInsideThumb\n ? 'absolute left-1/2 -translate-x-1/2 top-[calc(-100%-var(--spacing-sm))] text-body-1 font-bold whitespace-nowrap'\n : 'default:text-body-1 col-start-2 text-right default:font-bold',\n className\n )\n\n const normalizedChildren = useCallback(\n (formattedValues: readonly string[], values: readonly number[]) => {\n const formatted = formattedValues[0] ?? String(values[0] ?? '')\n const value = values[0] ?? 0\n setCurrentValue(value)\n if (typeof children === 'function') {\n return (children as unknown as (formatted: string, value: number) => ReactNode)(\n formatted,\n value\n )\n }\n\n return formatted\n },\n [children]\n )\n\n const style = isInsideThumb\n ? { transform: `translate(calc(0% + ${translateX}px), 0)` }\n : undefined\n\n return (\n <BaseSlider.Value\n data-spark-component=\"slider-value\"\n ref={mergedRef}\n className={resolvedClassName}\n style={style}\n {...rest}\n >\n {normalizedChildren}\n </BaseSlider.Value>\n )\n}\n\nSliderValue.displayName = 'Slider.Value'\n","import { Slider as Root, type SliderProps } from './Slider'\nimport { SliderControl as Control, type SliderControlProps } from './SliderControl'\nimport { SliderIndicator as Indicator, type SliderIndicatorProps } from './SliderIndicator'\nimport { SliderLabel as Label, type SliderLabelProps } from './SliderLabel'\nimport { SliderMaxValue as MaxValue, type SliderMaxValueProps } from './SliderMaxValue'\nimport { SliderMinValue as MinValue, type SliderMinValueProps } from './SliderMinValue'\nimport { SliderThumb as Thumb, type SliderThumbProps } from './SliderThumb'\nimport { SliderTrack as Track, type SliderTrackProps } from './SliderTrack'\nimport { SliderValue as Value, type SliderValueProps } from './SliderValue'\n\nexport const Slider: typeof Root & {\n Control: typeof Control\n Indicator: typeof Indicator\n Label: typeof Label\n MaxValue: typeof MaxValue\n MinValue: typeof MinValue\n Thumb: typeof Thumb\n Track: typeof Track\n Value: typeof Value\n} = Object.assign(Root, {\n Control,\n Indicator,\n Label,\n MaxValue,\n MinValue,\n Thumb,\n Track,\n Value,\n})\n\nSlider.displayName = 'Slider'\nControl.displayName = 'Slider.Control'\nIndicator.displayName = 'Slider.Indicator'\nLabel.displayName = 'Slider.Label'\nMaxValue.displayName = 'Slider.MaxValue'\nMinValue.displayName = 'Slider.MinValue'\nThumb.displayName = 'Slider.Thumb'\nTrack.displayName = 'Slider.Track'\nValue.displayName = 'Slider.Value'\n\nexport type {\n SliderProps,\n SliderControlProps,\n SliderIndicatorProps,\n SliderLabelProps,\n SliderMaxValueProps,\n SliderMinValueProps,\n SliderThumbProps,\n SliderTrackProps,\n SliderValueProps,\n}\n"],"names":["rootStyles","cva","SliderContext","createContext","useSliderContext","useContext","Slider","intent","children","className","ref","valueProp","defaultValueProp","disabledProp","readOnlyProp","nameProp","onValueChange","onValueCommit","min","max","rest","field","useFormFieldControl","disabled","readOnly","name","labelId","setLabelId","useState","valueInThumbCount","setValueInThumbCount","controlRef","useRef","thumbRef","handleLabelId","useCallback","id","registerValueInThumb","c","jsx","BaseSlider","value","v","SliderControl","hasValueInThumb","mergedRef","useMergeRefs","cx","trackVariants","rangeVariants","SliderIndicator","ID_PREFIX","SliderLabel","htmlForProp","idProp","requiredIndicator","FormFieldRequiredIndicator","asChild","others","fieldLabelId","fieldId","onLabelId","internalId","useId","generatedId","htmlFor","isRequired","labelRef","useEffect","Label","jsxs","Fragment","Slottable","SliderMaxValue","forwardRef","content","SliderMinValue","SliderThumbContext","useSliderThumbContext","thumbVariants","SliderThumb","forwardedRef","contextThumbRef","innerRef","SliderTrack","useSliderValueBoundaries","valueRef","translateX","setTranslateX","refsRetryScheduled","setRefsRetryScheduled","useLayoutEffect","control","thumb","valueEl","cancelled","compute","controlRect","thumbRect","valueWidth","thumbCenterPx","valueCenterMin","valueCenterMax","nextTranslateX","prev","resizeObserver","SliderValue","isInsideThumb","currentValue","setCurrentValue","resolvedClassName","normalizedChildren","formattedValues","values","formatted","style","Root","Control","Indicator","MaxValue","MinValue","Thumb","Track","Value"],"mappings":";;;;;;;;;AAEO,MAAMA,KAAaC,EAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,CAAC,GCSYC,IAAgBC,EAAsC,EAA4B,GAElFC,IAAmB,MAAMC,EAAWH,CAAa,GC6CjDI,IAAS,CAAC;AAAA,EACrB,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,KAAAC;AAAA,EACA,OAAOC;AAAA,EACP,cAAcC;AAAA,EACd,UAAUC;AAAA,EACV,UAAUC;AAAA,EACV,MAAMC;AAAA,EACN,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,KAAAC,IAAM;AAAA,EACN,GAAGC;AACL,MAAmB;AACjB,QAAMC,IAAQC,EAAA,GAERC,IAAWF,EAAM,YAAYR,GAC7BW,IAAWH,EAAM,YAAYP,GAC7BW,IAAOJ,EAAM,QAAQN,GAErB,CAACW,GAASC,CAAU,IAAIC,EAA6BP,EAAM,OAAO,GAClE,CAACQ,GAAmBC,CAAoB,IAAIF,EAAS,CAAC,GACtDG,IAAaC,EAA2B,IAAI,GAC5CC,IAAWD,EAA2B,IAAI,GAE1CE,IAAgBC,EAAY,CAACC,MAA2B;AAC5D,IAAAT,EAAWS,CAAE;AAAA,EACf,GAAG,CAAA,CAAE,GAECC,IAAuBF,EAAY,OACvCL,EAAqB,CAAAQ,MAAKA,IAAI,CAAC,GAExB,MAAMR,EAAqB,CAAAQ,MAAKA,IAAI,CAAC,IAC3C,CAAA,CAAE;AAEL,SACE,gBAAAC;AAAA,IAACrC,EAAc;AAAA,IAAd;AAAA,MACC,OAAO;AAAA,QACL,QAAAK;AAAA,QACA,KAAAW;AAAA,QACA,KAAAC;AAAA,QACA,cAAcE,EAAM,WAAWK;AAAA,QAC/B,SAASL,EAAM;AAAA,QACf,WAAWa;AAAA,QACX,iBAAiBL,IAAoB;AAAA,QACrC,sBAAAQ;AAAA,QACA,YAAAN;AAAA,QACA,UAAAE;AAAA,MAAA;AAAA,MAGF,UAAA,gBAAAM;AAAA,QAACC,EAAW;AAAA,QAAX;AAAA,UACC,KAAA9B;AAAA,UACA,wBAAqB;AAAA,UACrB,WAAWV,GAAW,EAAE,WAAAS,GAAW;AAAA,UACnC,aAAY;AAAA,UACZ,UAAUc,KAAYC;AAAA,UACtB,gBAAe;AAAA,UACf,MAAAC;AAAA,UACA,oBAAkBJ,EAAM;AAAA,UACxB,gBAAcA,EAAM;AAAA,UACpB,iBAAeE,KAAYC,IAAW,KAAO;AAAA,UAC7C,OAAOb,MAAc,SAAY,CAACA,CAAS,IAAI;AAAA,UAC/C,cAAcC,MAAqB,SAAY,CAACA,CAAgB,IAAI;AAAA,UACpE,eACEI,IACI,CAACyB,MAAsC;AACrC,kBAAMC,IAAI,MAAM,QAAQD,CAAK,IAAKA,EAAM,CAAC,KAAK,IAAKA;AACnD,YAAAzB,EAAc0B,CAAC;AAAA,UACjB,IACA;AAAA,UAEN,kBACEzB,IACI,CAACwB,MAAsC;AACrC,kBAAMC,IAAI,MAAM,QAAQD,CAAK,IAAKA,EAAM,CAAC,KAAK,IAAKA;AACnD,YAAAxB,EAAcyB,CAAC;AAAA,UACjB,IACA;AAAA,UAEN,KAAAxB;AAAA,UACA,KAAAC;AAAA,UACC,GAAGC;AAAA,UAEH,UAAAZ;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN;AAEAF,EAAO,cAAc;AChJd,MAAMqC,IAAgB,CAAC,EAAE,WAAAlC,GAAW,KAAAC,GAAK,GAAGU,QAA+B;AAChF,QAAM,EAAE,iBAAAwB,GAAiB,YAAAb,EAAA,IAAe3B,EAAA,GAClCyC,IAAYC,EAAaf,GAAYrB,CAAG;AAE9C,SACE,gBAAA6B;AAAA,IAACC,EAAW;AAAA,IAAX;AAAA,MACC,wBAAqB;AAAA,MACrB,KAAKK;AAAA,MACL,WAAWE;AAAA,QACT;AAAA,QACAH,KAAmB;AAAA,QACnBnC;AAAA,MAAA;AAAA,MAED,GAAGW;AAAA,IAAA;AAAA,EAAA;AAGV;AAEAuB,EAAc,cAAc;ACzBrB,MAAMK,KAAgB/C,EAAI,CAAC,wDAAwD,CAAC,GAE9EgD,KAAgBhD;AAAA,EAC3B;AAAA,IACE;AAAA;AAAA,IAEA;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,MAAM,CAAC,SAAS;AAAA,QAChB,SAAS,CAAC,YAAY;AAAA,QACtB,QAAQ,CAAC,WAAW;AAAA,QACpB,MAAM,CAAC,SAAS;AAAA,QAChB,SAAS,CAAC,YAAY;AAAA,QACtB,SAAS,CAAC,YAAY;AAAA,QACtB,OAAO,CAAC,UAAU;AAAA,QAClB,OAAO,CAAC,UAAU;AAAA,MAAA;AAAA,IACpB;AAAA,IAEF,iBAAiB;AAAA,MACf,QAAQ;AAAA,IAAA;AAAA,EACV;AAEJ,GCnBaiD,IAAkB,CAAC,EAAE,WAAAzC,GAAW,KAAAC,GAAK,GAAGU,QAAiC;AACpF,QAAM,EAAE,QAAAb,EAAA,IAAWH,EAAA;AAEnB,SACE,gBAAAmC;AAAA,IAACC,EAAW;AAAA,IAAX;AAAA,MACC,wBAAqB;AAAA,MACrB,KAAA9B;AAAA,MACA,WAAWuC,GAAc,EAAE,QAAA1C,GAAQ,WAAAE,GAAW;AAAA,MAC7C,GAAGW;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA8B,EAAgB,cAAc;ACX9B,MAAMC,KAAY,iBAULC,IAAc,CAAC;AAAA,EAC1B,SAASC;AAAA,EACT,IAAIC;AAAA,EACJ,WAAA7C;AAAA,EACA,UAAAD;AAAA,EACA,mBAAA+C,sBAAqBC,IAAA,EAA2B;AAAA,EAChD,SAAAC;AAAA,EACA,KAAA/C;AAAA,EACA,GAAGgD;AACL,MAAwB;AACtB,QAAMrC,IAAQC,EAAA,GACR,EAAE,cAAAqC,GAAc,SAAAC,GAAS,WAAAC,EAAA,IAAczD,EAAA,GAGvC0D,IAAaC,GAAA,GACbC,IAAc,GAAGb,EAAS,IAAIW,CAAU,IACxCpC,IAAU4B,KAAUK,KAAgBtC,EAAM,WAAW2C,GAGrDC,IAAUR,IAAU,SAAYJ,KAAeO,KAAWvC,EAAM,IAGhEE,IAAWF,EAAM,UACjB6C,IAAa7C,EAAM,YAGnB8C,IAAWnC,EAAyB,IAAI,GACxCa,IAAYC,EAAapC,GAAKyD,CAAQ;AAE5C,SAAAC,EAAU,MAAM;AACd,IAAIP,KAAa,CAACF,KAAgB,CAACtC,EAAM,WACvCwC,EAAUnC,CAAO;AAAA,EAErB,GAAG,CAACmC,GAAWF,GAActC,EAAM,SAASK,CAAO,CAAC,GAGlD,gBAAAa;AAAA,IAAC8B;AAAA,IAAA;AAAA,MACC,KAAKxB;AAAA,MACL,IAAInB;AAAA,MACJ,wBAAqB;AAAA,MACrB,SAAAuC;AAAA,MACA,WAAWlB,EAAGxB,IAAW,8CAA8C,QAAWd,CAAS;AAAA,MAC3F,SAAAgD;AAAA,MACC,GAAGC;AAAA,MAEJ,UAAA,gBAAAY,EAAAC,IAAA,EACE,UAAA;AAAA,QAAA,gBAAAhC,EAACiC,MAAW,UAAAhE,GAAS;AAAA,QACpB0D,KAAcX;AAAA,MAAA,EAAA,CACjB;AAAA,IAAA;AAAA,EAAA;AAGN;AAEAH,EAAY,cAAc;AC/DnB,MAAMqB,IAAiBC;AAAA,EAC5B,CAAC,EAAE,WAAAjE,GAAW,UAAAD,EAAA,GAAYE,MAAQ;AAChC,UAAM,EAAE,KAAAS,IAAM,IAAA,IAAQf,EAAA,GAEhBuE,IAAUnE,IAAWA,EAASW,CAAG,IAAIA;AAE3C,WACE,gBAAAoB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,wBAAqB;AAAA,QACrB,KAAA7B;AAAA,QACA,WAAWqC,EAAG,4DAA4DtC,CAAS;AAAA,QAElF,UAAAkE;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEAF,EAAe,cAAc;AClBtB,MAAMG,IAAiBF;AAAA,EAC5B,CAAC,EAAE,WAAAjE,GAAW,UAAAD,EAAA,GAAYE,MAAQ;AAChC,UAAM,EAAE,KAAAQ,IAAM,EAAA,IAAMd,EAAA,GAEduE,IAAUnE,IAAWA,EAASU,CAAG,IAAIA;AAE3C,WACE,gBAAAqB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,wBAAqB;AAAA,QACrB,KAAA7B;AAAA,QACA,WAAWqC,EAAG,2DAA2DtC,CAAS;AAAA,QAEjF,UAAAkE;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEAC,EAAe,cAAc;ACtBtB,MAAMC,IAAqB1E,EAA8C,IAAI,GAEvE2E,KAAwB,MAAMzE,EAAWwE,CAAkB,GCN3DE,KAAgB9E;AAAA,EAC3B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,MAAM,CAAC,iBAAiB,6CAA6C;AAAA,QACrE,SAAS,CAAC,oBAAoB,mDAAmD;AAAA,QACjF,QAAQ,CAAC,mBAAmB,iDAAiD;AAAA,QAC7E,MAAM,CAAC,iBAAiB,6CAA6C;AAAA,QACrE,SAAS,CAAC,oBAAoB,mDAAmD;AAAA,QACjF,SAAS,CAAC,oBAAoB,mDAAmD;AAAA,QACjF,OAAO,CAAC,kBAAkB,+CAA+C;AAAA,QACzE,OAAO,CAAC,kBAAkB,+CAA+C;AAAA,MAAA;AAAA,IAC3E;AAAA,IAEF,iBAAiB;AAAA,MACf,QAAQ;AAAA,IAAA;AAAA,EACV;AAEJ,GCnBa+E,IAAc,CAAC;AAAA,EAC1B,WAAAvE;AAAA,EACA,KAAKwE;AAAA,EACL,UAAAzE;AAAA,EACA,GAAGY;AACL,MAAwB;AACtB,QAAM,EAAE,QAAAb,GAAQ,cAAAoD,GAAc,SAAAC,GAAS,UAAUsB,EAAA,IAAoB9E,EAAA,GAE/D+E,IAAWnD,EAAuB,IAAI,GACtCtB,IAAMoC,EAAaoC,GAAiBD,KAAgBE,CAAQ;AAElE,SACE,gBAAA5C,EAACsC,EAAmB,UAAnB,EAA4B,OAAO,EAAE,eAAe,MACnD,UAAA,gBAAAtC;AAAA,IAACC,EAAW;AAAA,IAAX;AAAA,MACC,wBAAqB;AAAA,MACrB,KAAA9B;AAAA,MACA,IAAIkD;AAAA,MACJ,WAAWmB,GAAc,EAAE,QAAAxE,GAAQ,WAAAE,GAAW;AAAA,MAC9C,mBAAiBkD;AAAA,MAChB,GAAGvC;AAAA,MAEH,UAAAZ;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;AAEAwE,EAAY,cAAc;AClCnB,MAAMI,IAAc,CAAC,EAAE,WAAA3E,GAAW,KAAAC,GAAK,GAAGU,QAE7C,gBAAAmB;AAAA,EAACC,EAAW;AAAA,EAAX;AAAA,IACC,wBAAqB;AAAA,IACrB,KAAA9B;AAAA,IACA,WAAWsC,GAAc,EAAE,WAAAvC,GAAW;AAAA,IACrC,GAAGW;AAAA,EAAA;AAAA;AAKVgE,EAAY,cAAc;ACLnB,SAASC,GACdtD,GACAE,GACAqD,GACA7C,GACQ;AACR,QAAM,CAAC8C,GAAYC,CAAa,IAAI5D,EAAS,CAAC,GACxC,CAAC6D,GAAoBC,CAAqB,IAAI9D,EAAS,EAAK;AAElE,SAAA+D,GAAgB,MAAM;AACpB,UAAMC,IAAU7D,EAAW,SACrB8D,IAAQ5D,EAAS,SACjB6D,IAAUR,EAAS;AAEzB,QAAI,CAACM,KAAW,CAACC,KAAS,CAACC,GAAS;AAClC,MAAAN,EAAc,CAAC,GAEVC,KACH,sBAAsB,MAAMC,EAAsB,EAAI,CAAC;AAGzD;AAAA,IACF;AAEA,QAAIK,IAAY;AAEhB,UAAMC,IAAU,MAAM;AACpB,UAAID,EAAW;AAEf,YAAME,IAAcL,EAAQ,sBAAA,GACtBM,IAAYL,EAAM,sBAAA,GAClBM,IAAaL,EAAQ;AAG3B,UAAIK,MAAe,GAAG;AACpB,8BAAsBH,CAAO;AAE7B;AAAA,MACF;AAEA,YAAMI,IAAgBF,EAAU,OAAOD,EAAY,OAAOC,EAAU,QAAQ,GAEtEG,IAAiBF,IAAa,GAC9BG,IAAiBL,EAAY,QAAQE,IAAa,GAGlDI,IADgB,KAAK,IAAIF,GAAgB,KAAK,IAAIC,GAAgBF,CAAa,CAAC,IAC/CA;AAEvC,MAAAZ,EAAc,CAAAgB,MAASA,MAASD,IAAiBA,IAAiBC,CAAK;AAAA,IACzE;AAEA,IAAAR,EAAA;AAEA,UAAMS,IAAiB,IAAI,eAAeT,CAAO;AACjD,WAAAS,EAAe,QAAQb,CAAO,GAC9Ba,EAAe,QAAQX,CAAO,GAEvB,MAAM;AACX,MAAAC,IAAY,IACZU,EAAe,WAAA;AAAA,IACjB;AAAA,EACF,GAAG,CAAC1E,GAAYE,GAAUqD,GAAU7C,GAAOgD,CAAkB,CAAC,GAEvDF;AACT;AC9DO,MAAMmB,IAAc,CAAC,EAAE,WAAAjG,GAAW,UAAAD,GAAU,KAAAE,GAAK,GAAGU,QAA6B;AACtF,QAAM,EAAE,sBAAAiB,GAAsB,YAAAN,GAAY,UAAAE,EAAA,IAAa7B,EAAA,GAEjDuG,IADe7B,GAAA,MACkB,MAEjCQ,IAAWtD,EAAiC,IAAI,GAChDa,IAAYC,EAAawC,GAAU5E,CAAG,GAEtC,CAACkG,GAAcC,CAAe,IAAIjF,EAAS,CAAC,GAC5C2D,IAAaF,GAAyBtD,GAAYE,GAAUqD,GAAUsB,CAAY;AAExF,EAAAxC,EAAU,MAAM;AACd,QAAKuC;AAEL,aAAOtE,EAAA;AAAA,EACT,GAAG,CAACsE,GAAetE,CAAoB,CAAC;AAExC,QAAMyE,IAAoB/D;AAAA,IACxB4D,IACI,mHACA;AAAA,IACJlG;AAAA,EAAA,GAGIsG,IAAqB5E;AAAA,IACzB,CAAC6E,GAAoCC,MAA8B;AACjE,YAAMC,IAAYF,EAAgB,CAAC,KAAK,OAAOC,EAAO,CAAC,KAAK,EAAE,GACxDxE,IAAQwE,EAAO,CAAC,KAAK;AAE3B,aADAJ,EAAgBpE,CAAK,GACjB,OAAOjC,KAAa,aACdA;AAAA,QACN0G;AAAA,QACAzE;AAAA,MAAA,IAIGyE;AAAA,IACT;AAAA,IACA,CAAC1G,CAAQ;AAAA,EAAA,GAGL2G,IAAQR,IACV,EAAE,WAAW,uBAAuBpB,CAAU,cAC9C;AAEJ,SACE,gBAAAhD;AAAA,IAACC,EAAW;AAAA,IAAX;AAAA,MACC,wBAAqB;AAAA,MACrB,KAAKK;AAAA,MACL,WAAWiE;AAAA,MACX,OAAAK;AAAA,MACC,GAAG/F;AAAA,MAEH,UAAA2F;AAAA,IAAA;AAAA,EAAA;AAGP;AAEAL,EAAY,cAAc;AC/DnB,MAAMpG,KAST,OAAO,OAAO8G,GAAM;AAAA,EAAA,SACtBC;AAAAA,EAAA,WACAC;AAAAA,EAAA,OACAjD;AAAAA,EAAA,UACAkD;AAAAA,EAAA,UACAC;AAAAA,EAAA,OACAC;AAAAA,EAAA,OACAC;AAAAA,EAAA,OACAC;AACF,CAAC;AAEDrH,GAAO,cAAc;AACrB+G,EAAQ,cAAc;AACtBC,EAAU,cAAc;AACxBjD,EAAM,cAAc;AACpBkD,EAAS,cAAc;AACvBC,EAAS,cAAc;AACvBC,EAAM,cAAc;AACpBC,EAAM,cAAc;AACpBC,EAAM,cAAc;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/slider/Slider.styles.ts","../../src/slider/SliderContext.tsx","../../src/slider/Slider.tsx","../../src/slider/SliderControl.tsx","../../src/slider/SliderTrack.styles.ts","../../src/slider/SliderIndicator.tsx","../../src/slider/SliderLabel.tsx","../../src/slider/SliderMaxValue.tsx","../../src/slider/SliderMinValue.tsx","../../src/slider/SliderThumbContext.tsx","../../src/slider/SliderThumb.styles.ts","../../src/slider/SliderThumb.tsx","../../src/slider/SliderTrack.tsx","../../src/slider/useSliderValueBoundaries.ts","../../src/slider/SliderValue.tsx","../../src/slider/index.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\nexport const rootStyles = cva([\n 'grid grid-cols-[1fr_auto] gap-y-sm gap-x-md relative',\n 'touch-none select-none',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-dim-3',\n])\n","import type { RefObject } from 'react'\nimport { createContext, useContext } from 'react'\n\nimport type { SliderProps } from './Slider'\n\nexport type SliderContextInterface = Pick<SliderProps, 'intent' | 'min' | 'max'> & {\n fieldLabelId?: string\n fieldId?: string\n onLabelId?: (id: string | undefined) => void\n hasValueInThumb: boolean\n registerValueInThumb: () => () => void\n controlRef: RefObject<HTMLElement | null>\n thumbRef: RefObject<HTMLElement | null>\n}\n\nexport const SliderContext = createContext<SliderContextInterface>({} as SliderContextInterface)\n\nexport const useSliderContext = () => useContext(SliderContext)\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { ComponentProps, type PropsWithChildren, Ref, useCallback, useRef, useState } from 'react'\n\nimport { rootStyles } from './Slider.styles'\nimport { SliderContext } from './SliderContext'\nimport type { SliderRangeVariantsProps } from './SliderTrack.styles'\n\nexport interface SliderProps\n extends Omit<\n ComponentProps<typeof BaseSlider.Root>,\n 'render' | 'orientation' | 'onValueChange' | 'onValueCommitted'\n >,\n PropsWithChildren<SliderRangeVariantsProps> {\n /**\n * The value of the slider when initially rendered. Use when you do not need to control the state of the slider.\n */\n defaultValue?: number\n /**\n * The controlled value of the slider. Must be used in conjunction with `onValueChange`.\n */\n value?: number\n /**\n * Event handler called when the value changes.\n */\n onValueChange?: (value: number) => void\n /**\n * Event handler called when the value changes at the end of an interaction. Useful when you only need to capture a final value e.g. to update a backend service.\n */\n onValueCommit?: (value: number) => void\n /**\n * The name of the slider. Submitted with its owning form as part of a name/value pair.\n * If wrapped with a FormField with a name, will be inherited from it.\n */\n name?: string\n /**\n * When `true`, prevents the user from interacting with the slider.\n * @default false\n */\n disabled?: boolean\n /**\n * Sets the slider as interactive or not.\n */\n readOnly?: boolean\n /**\n * The minimum value for the range.\n * @default 0\n */\n min?: number\n /**\n * The maximum value for the range.\n * @default 100\n */\n max?: number\n /**\n * The stepping interval.\n * @default 1\n */\n step?: number\n ref?: Ref<HTMLDivElement>\n}\n\nexport const Slider = ({\n intent = 'support',\n children,\n className,\n ref,\n value: valueProp,\n defaultValue: defaultValueProp,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n name: nameProp,\n onValueChange,\n onValueCommit,\n min = 0,\n max = 100,\n ...rest\n}: SliderProps) => {\n const field = useFormFieldControl()\n\n const disabled = field.disabled ?? disabledProp\n const readOnly = field.readOnly ?? readOnlyProp\n const name = field.name ?? nameProp\n\n const [labelId, setLabelId] = useState<string | undefined>(field.labelId)\n const [valueInThumbCount, setValueInThumbCount] = useState(0)\n const controlRef = useRef<HTMLElement | null>(null)\n const thumbRef = useRef<HTMLElement | null>(null)\n\n const handleLabelId = useCallback((id: string | undefined) => {\n setLabelId(id)\n }, [])\n\n const registerValueInThumb = useCallback(() => {\n setValueInThumbCount(c => c + 1)\n\n return () => setValueInThumbCount(c => c - 1)\n }, [])\n\n return (\n <SliderContext.Provider\n value={{\n intent,\n min,\n max,\n fieldLabelId: field.labelId || labelId,\n fieldId: field.id,\n onLabelId: handleLabelId,\n hasValueInThumb: valueInThumbCount > 0,\n registerValueInThumb,\n controlRef,\n thumbRef,\n }}\n >\n <BaseSlider.Root\n ref={ref}\n data-spark-component=\"slider\"\n className={rootStyles({ className })}\n orientation=\"horizontal\"\n disabled={disabled || readOnly}\n thumbAlignment=\"edge\"\n name={name}\n aria-describedby={field.description}\n aria-invalid={field.isInvalid}\n aria-disabled={disabled || readOnly ? true : undefined}\n value={valueProp !== undefined ? [valueProp] : undefined}\n defaultValue={defaultValueProp !== undefined ? [defaultValueProp] : undefined}\n onValueChange={\n onValueChange\n ? (value: number | readonly number[]) => {\n const v = Array.isArray(value) ? (value[0] ?? 0) : value\n onValueChange(v)\n }\n : undefined\n }\n onValueCommitted={\n onValueCommit\n ? (value: number | readonly number[]) => {\n const v = Array.isArray(value) ? (value[0] ?? 0) : value\n onValueCommit(v)\n }\n : undefined\n }\n min={min}\n max={max}\n {...rest}\n >\n {children}\n </BaseSlider.Root>\n </SliderContext.Provider>\n )\n}\n\nSlider.displayName = 'Slider'\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { ComponentProps } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport type SliderControlProps = Omit<ComponentProps<typeof BaseSlider.Control>, 'render'>\n\nexport const SliderControl = ({ className, ref, ...rest }: SliderControlProps) => {\n const { hasValueInThumb, controlRef } = useSliderContext()\n const mergedRef = useMergeRefs(controlRef, ref)\n\n return (\n <BaseSlider.Control\n data-spark-component=\"slider-control\"\n ref={mergedRef}\n className={cx(\n 'min-h-sz-24 relative col-span-2 flex w-full min-w-0 flex-1 items-center',\n hasValueInThumb && 'mt-xl',\n className\n )}\n {...rest}\n />\n )\n}\n\nSliderControl.displayName = 'Slider.Control'\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const trackVariants = cva(['relative grow h-sz-4 bg-on-background/dim-4 rounded-sm'])\n\nexport const rangeVariants = cva(\n [\n 'absolute h-full rounded-sm',\n // Disable transitions during drag to eliminate latency\n 'transition-none',\n ],\n {\n variants: {\n intent: {\n main: ['bg-main'],\n support: ['bg-support'],\n accent: ['bg-accent'],\n info: ['bg-info'],\n neutral: ['bg-neutral'],\n success: ['bg-success'],\n alert: ['bg-alert'],\n error: ['bg-error'],\n },\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type SliderRangeVariantsProps = VariantProps<typeof rangeVariants>\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { rangeVariants } from './SliderTrack.styles'\n\nexport type SliderIndicatorProps = Omit<ComponentProps<typeof BaseSlider.Indicator>, 'render'>\n\nexport const SliderIndicator = ({ className, ref, ...rest }: SliderIndicatorProps) => {\n const { intent } = useSliderContext()\n\n return (\n <BaseSlider.Indicator\n data-spark-component=\"slider-indicator\"\n ref={ref}\n className={rangeVariants({ intent, className })}\n {...rest}\n />\n )\n}\n\nSliderIndicator.displayName = 'Slider.Indicator'\n","import { useFormFieldControl } from '@spark-ui/components/form-field'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport { ReactNode, Ref, useEffect, useId, useRef } from 'react'\n\nimport { FormFieldRequiredIndicator } from '../form-field/FormFieldRequiredIndicator'\nimport { Label, LabelProps } from '../label'\nimport { Slottable } from '../slot'\nimport { useSliderContext } from './SliderContext'\n\nconst ID_PREFIX = ':slider-label'\n\nexport interface SliderLabelProps extends LabelProps {\n /**\n * Element shown when the input is required inside the label.\n */\n requiredIndicator?: ReactNode\n ref?: Ref<HTMLLabelElement>\n}\n\nexport const SliderLabel = ({\n htmlFor: htmlForProp,\n id: idProp,\n className,\n children,\n requiredIndicator = <FormFieldRequiredIndicator />,\n asChild,\n ref,\n ...others\n}: SliderLabelProps) => {\n const field = useFormFieldControl()\n const { fieldLabelId, fieldId, onLabelId } = useSliderContext()\n\n // Generate an id if not provided and no FormField labelId is available\n const internalId = useId()\n const generatedId = `${ID_PREFIX}-${internalId}`\n const labelId = idProp || fieldLabelId || field.labelId || generatedId\n\n // Use FormField id for htmlFor if present, otherwise use fieldId from context, or the prop\n const htmlFor = asChild ? undefined : htmlForProp || fieldId || field.id\n\n // Get disabled and required state from FormField if present\n const disabled = field.disabled\n const isRequired = field.isRequired\n\n // Notify SliderContext of the label id if no FormField is present\n const labelRef = useRef<HTMLLabelElement>(null)\n const mergedRef = useMergeRefs(ref, labelRef)\n\n useEffect(() => {\n if (onLabelId && !fieldLabelId && !field.labelId) {\n onLabelId(labelId)\n }\n }, [onLabelId, fieldLabelId, field.labelId, labelId])\n\n return (\n <Label\n ref={mergedRef}\n id={labelId}\n data-spark-component=\"slider-label\"\n htmlFor={htmlFor}\n className={cx(disabled ? 'text-on-surface/dim-3 pointer-events-none' : undefined, className)}\n asChild={asChild}\n {...others}\n >\n <>\n <Slottable>{children}</Slottable>\n {isRequired && requiredIndicator}\n </>\n </Label>\n )\n}\n\nSliderLabel.displayName = 'Slider.Label'\n","import { cx } from 'class-variance-authority'\nimport { forwardRef, type ReactNode } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport interface SliderMaxValueProps {\n className?: string\n children?: (value: number) => ReactNode\n}\n\nexport const SliderMaxValue = forwardRef<HTMLDivElement, SliderMaxValueProps>(\n ({ className, children }, ref) => {\n const { max = 100 } = useSliderContext()\n\n const content = children ? children(max) : max\n\n return (\n <div\n data-spark-component=\"slider-max-value\"\n ref={ref}\n className={cx('text-on-surface/dim-1 text-body-2 col-start-2 text-right', className)}\n >\n {content}\n </div>\n )\n }\n)\n\nSliderMaxValue.displayName = 'Slider.MaxValue'\n","import { cx } from 'class-variance-authority'\nimport { forwardRef, type ReactNode } from 'react'\n\nimport { useSliderContext } from './SliderContext'\n\nexport interface SliderMinValueProps {\n className?: string\n children?: (value: number) => ReactNode\n}\n\nexport const SliderMinValue = forwardRef<HTMLDivElement, SliderMinValueProps>(\n ({ className, children }, ref) => {\n const { min = 0 } = useSliderContext()\n\n const content = children ? children(min) : min\n\n return (\n <div\n data-spark-component=\"slider-min-value\"\n ref={ref}\n className={cx('text-on-surface/dim-1 text-body-2 col-start-1 text-left', className)}\n >\n {content}\n </div>\n )\n }\n)\n\nSliderMinValue.displayName = 'Slider.MinValue'\n","import { createContext, useContext } from 'react'\n\nexport interface SliderThumbContextValue {\n isInsideThumb: true\n}\n\nexport const SliderThumbContext = createContext<SliderThumbContextValue | null>(null)\n\nexport const useSliderThumbContext = () => useContext(SliderThumbContext)\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const thumbVariants = cva(\n [\n 'relative block size-sz-24 rounded-full cursor-pointer',\n 'outline-hidden',\n 'has-focus-visible:ring-2 has-focus-visible:ring-offset-2 has-focus-visible:ring-focus',\n 'data-disabled:hover:ring-0 data-disabled:cursor-not-allowed data-disabled:before:hidden',\n // visual thumb\n 'after:absolute after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2',\n 'after:size-sz-24 after:rounded-full',\n // hover effect\n 'before:absolute before:left-1/2 before:top-1/2 before:-translate-x-1/2 before:-translate-y-1/2',\n 'before:size-sz-24 before:rounded-full before:border-solid before:border-sm before:transition-all before:duration-75',\n 'hover:before:size-sz-32 data-dragging:before:size-sz-32',\n ],\n {\n variants: {\n intent: {\n main: ['after:bg-main', 'before:bg-main-container before:border-main'],\n support: ['after:bg-support', 'before:bg-support-container before:border-support'],\n accent: ['after:bg-accent', 'before:bg-accent-container before:border-accent'],\n info: ['after:bg-info', 'before:bg-info-container before:border-info'],\n neutral: ['after:bg-neutral', 'before:bg-neutral-container before:border-neutral'],\n success: ['after:bg-success', 'before:bg-success-container before:border-success'],\n alert: ['after:bg-alert', 'before:bg-alert-container before:border-alert'],\n error: ['after:bg-error', 'before:bg-error-container before:border-error'],\n },\n },\n defaultVariants: {\n intent: 'support',\n },\n }\n)\n\nexport type SliderThumbVariantsProps = VariantProps<typeof thumbVariants>\n","import { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps, type PropsWithChildren, useRef } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { SliderThumbContext } from './SliderThumbContext'\nimport { thumbVariants } from './SliderThumb.styles'\n\nexport type SliderThumbProps = Omit<\n ComponentProps<typeof BaseSlider.Thumb>,\n 'render' | 'index'\n> &\n PropsWithChildren\n\nexport const SliderThumb = ({\n className,\n ref: forwardedRef,\n children,\n ...rest\n}: SliderThumbProps) => {\n const { intent, fieldLabelId, fieldId, thumbRef: contextThumbRef } = useSliderContext()\n\n const innerRef = useRef<HTMLDivElement>(null)\n const ref = useMergeRefs(contextThumbRef, forwardedRef ?? innerRef)\n\n return (\n <SliderThumbContext.Provider value={{ isInsideThumb: true }}>\n <BaseSlider.Thumb\n data-spark-component=\"slider-thumb\"\n ref={ref}\n id={fieldId}\n className={thumbVariants({ intent, className })}\n aria-labelledby={fieldLabelId}\n {...rest}\n >\n {children}\n </BaseSlider.Thumb>\n </SliderThumbContext.Provider>\n )\n}\n\nSliderThumb.displayName = 'Slider.Thumb'\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { ComponentProps } from 'react'\n\nimport { trackVariants } from './SliderTrack.styles'\n\nexport type SliderTrackProps = Omit<ComponentProps<typeof BaseSlider.Track>, 'render'>\n\nexport const SliderTrack = ({ className, ref, ...rest }: SliderTrackProps) => {\n return (\n <BaseSlider.Track\n data-spark-component=\"slider-track\"\n ref={ref}\n className={trackVariants({ className })}\n {...rest}\n />\n )\n}\n\nSliderTrack.displayName = 'Slider.Track'\n","import type { RefObject } from 'react'\nimport { useLayoutEffect, useState } from 'react'\n\n/**\n * Computes the translateX (in pixels) to apply to the value element so it stays\n * within the horizontal bounds of the slider control when displayed inside the thumb.\n *\n * @param controlRef - Ref to the slider control (track container)\n * @param thumbRef - Ref to the thumb element\n * @param valueRef - Ref to the value label element\n * @param value - Current slider value (0–100 or min–max), used to re-run when thumb moves\n * @returns translateX in pixels (positive = right, negative = left), or 0 if refs are missing\n */\nexport function useSliderValueBoundaries(\n controlRef: RefObject<HTMLElement | null>,\n thumbRef: RefObject<HTMLElement | null>,\n valueRef: RefObject<HTMLElement | null>,\n value: number\n): number {\n const [translateX, setTranslateX] = useState(0)\n const [refsRetryScheduled, setRefsRetryScheduled] = useState(false)\n\n useLayoutEffect(() => {\n const control = controlRef.current\n const thumb = thumbRef.current\n const valueEl = valueRef.current\n\n if (!control || !thumb || !valueEl) {\n setTranslateX(0)\n // Re-run once on next frame when refs may be set (e.g. Slider.Value mounts after Control/Thumb)\n if (!refsRetryScheduled) {\n requestAnimationFrame(() => setRefsRetryScheduled(true))\n }\n\n return\n }\n\n let cancelled = false\n\n const compute = () => {\n if (cancelled) return\n\n const controlRect = control.getBoundingClientRect()\n const thumbRect = thumb.getBoundingClientRect()\n const valueWidth = valueEl.scrollWidth\n\n // Skip until value label has been laid out (content from render prop may not be ready on first paint)\n if (valueWidth === 0) {\n requestAnimationFrame(compute)\n\n return\n }\n\n const thumbCenterPx = thumbRect.left - controlRect.left + thumbRect.width / 2\n\n const valueCenterMin = valueWidth / 2\n const valueCenterMax = controlRect.width - valueWidth / 2\n\n const clampedCenter = Math.max(valueCenterMin, Math.min(valueCenterMax, thumbCenterPx))\n const nextTranslateX = clampedCenter - thumbCenterPx\n\n setTranslateX(prev => (prev !== nextTranslateX ? nextTranslateX : prev))\n }\n\n compute()\n\n const resizeObserver = new ResizeObserver(compute)\n resizeObserver.observe(control)\n resizeObserver.observe(valueEl)\n\n return () => {\n cancelled = true\n resizeObserver.disconnect()\n }\n }, [controlRef, thumbRef, valueRef, value, refsRetryScheduled])\n\n return translateX\n}\n","import { Slider as BaseSlider } from '@base-ui/react/slider'\nimport { useMergeRefs } from '@spark-ui/hooks/use-merge-refs'\nimport { cx } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { ComponentProps, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { useSliderContext } from './SliderContext'\nimport { useSliderThumbContext } from './SliderThumbContext'\nimport { useSliderValueBoundaries } from './useSliderValueBoundaries'\n\nexport type SliderValueProps = Omit<\n ComponentProps<typeof BaseSlider.Value>,\n 'render' | 'children'\n> & {\n children?: ReactNode | ((formatted: string, value: number) => ReactNode)\n}\n\n/**\n * Normalizes Base UI's (formattedValues, values) to single (formatted, value) for the render prop.\n */\nexport const SliderValue = ({ className, children, ref, ...rest }: SliderValueProps) => {\n const { registerValueInThumb, controlRef, thumbRef } = useSliderContext()\n const thumbContext = useSliderThumbContext()\n const isInsideThumb = thumbContext !== null\n\n const valueRef = useRef<HTMLOutputElement | null>(null)\n const mergedRef = useMergeRefs(valueRef, ref)\n\n const [currentValue, setCurrentValue] = useState(0)\n const translateX = useSliderValueBoundaries(controlRef, thumbRef, valueRef, currentValue)\n\n useEffect(() => {\n if (!isInsideThumb) return\n\n return registerValueInThumb()\n }, [isInsideThumb, registerValueInThumb])\n\n const resolvedClassName = cx(\n isInsideThumb\n ? 'absolute left-1/2 -translate-x-1/2 top-[calc(-100%-var(--spacing-sm))] text-body-1 font-bold whitespace-nowrap'\n : 'default:text-body-1 col-start-2 text-right default:font-bold',\n className\n )\n\n const normalizedChildren = useCallback(\n (formattedValues: readonly string[], values: readonly number[]) => {\n const formatted = formattedValues[0] ?? String(values[0] ?? '')\n const value = values[0] ?? 0\n setCurrentValue(value)\n if (typeof children === 'function') {\n return children(formatted, value)\n }\n\n return formatted\n },\n [children]\n )\n\n const style = isInsideThumb\n ? { transform: `translate(calc(0% + ${translateX}px), 0)` }\n : undefined\n\n return (\n <BaseSlider.Value\n data-spark-component=\"slider-value\"\n ref={mergedRef}\n className={resolvedClassName}\n style={style}\n {...rest}\n >\n {normalizedChildren}\n </BaseSlider.Value>\n )\n}\n\nSliderValue.displayName = 'Slider.Value'\n","import { Slider as Root, type SliderProps } from './Slider'\nimport { SliderControl as Control, type SliderControlProps } from './SliderControl'\nimport { SliderIndicator as Indicator, type SliderIndicatorProps } from './SliderIndicator'\nimport { SliderLabel as Label, type SliderLabelProps } from './SliderLabel'\nimport { SliderMaxValue as MaxValue, type SliderMaxValueProps } from './SliderMaxValue'\nimport { SliderMinValue as MinValue, type SliderMinValueProps } from './SliderMinValue'\nimport { SliderThumb as Thumb, type SliderThumbProps } from './SliderThumb'\nimport { SliderTrack as Track, type SliderTrackProps } from './SliderTrack'\nimport { SliderValue as Value, type SliderValueProps } from './SliderValue'\n\nexport const Slider: typeof Root & {\n Control: typeof Control\n Indicator: typeof Indicator\n Label: typeof Label\n MaxValue: typeof MaxValue\n MinValue: typeof MinValue\n Thumb: typeof Thumb\n Track: typeof Track\n Value: typeof Value\n} = Object.assign(Root, {\n Control,\n Indicator,\n Label,\n MaxValue,\n MinValue,\n Thumb,\n Track,\n Value,\n})\n\nSlider.displayName = 'Slider'\nControl.displayName = 'Slider.Control'\nIndicator.displayName = 'Slider.Indicator'\nLabel.displayName = 'Slider.Label'\nMaxValue.displayName = 'Slider.MaxValue'\nMinValue.displayName = 'Slider.MinValue'\nThumb.displayName = 'Slider.Thumb'\nTrack.displayName = 'Slider.Track'\nValue.displayName = 'Slider.Value'\n\nexport type {\n SliderProps,\n SliderControlProps,\n SliderIndicatorProps,\n SliderLabelProps,\n SliderMaxValueProps,\n SliderMinValueProps,\n SliderThumbProps,\n SliderTrackProps,\n SliderValueProps,\n}\n"],"names":["rootStyles","cva","SliderContext","createContext","useSliderContext","useContext","Slider","intent","children","className","ref","valueProp","defaultValueProp","disabledProp","readOnlyProp","nameProp","onValueChange","onValueCommit","min","max","rest","field","useFormFieldControl","disabled","readOnly","name","labelId","setLabelId","useState","valueInThumbCount","setValueInThumbCount","controlRef","useRef","thumbRef","handleLabelId","useCallback","id","registerValueInThumb","c","jsx","BaseSlider","value","v","SliderControl","hasValueInThumb","mergedRef","useMergeRefs","cx","trackVariants","rangeVariants","SliderIndicator","ID_PREFIX","SliderLabel","htmlForProp","idProp","requiredIndicator","FormFieldRequiredIndicator","asChild","others","fieldLabelId","fieldId","onLabelId","internalId","useId","generatedId","htmlFor","isRequired","labelRef","useEffect","Label","jsxs","Fragment","Slottable","SliderMaxValue","forwardRef","content","SliderMinValue","SliderThumbContext","useSliderThumbContext","thumbVariants","SliderThumb","forwardedRef","contextThumbRef","innerRef","SliderTrack","useSliderValueBoundaries","valueRef","translateX","setTranslateX","refsRetryScheduled","setRefsRetryScheduled","useLayoutEffect","control","thumb","valueEl","cancelled","compute","controlRect","thumbRect","valueWidth","thumbCenterPx","valueCenterMin","valueCenterMax","nextTranslateX","prev","resizeObserver","SliderValue","isInsideThumb","currentValue","setCurrentValue","resolvedClassName","normalizedChildren","formattedValues","values","formatted","style","Root","Control","Indicator","MaxValue","MinValue","Thumb","Track","Value"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spark-ui/components",
3
- "version": "17.1.1",
3
+ "version": "17.2.1-beta.0",
4
4
  "license": "MIT",
5
5
  "description": "Spark (Leboncoin design system) components.",
6
6
  "exports": {
@@ -54,9 +54,9 @@
54
54
  "@react-aria/toast": "^3.0.0-beta.18",
55
55
  "@react-stately/numberfield": "3.9.11",
56
56
  "@react-stately/toast": "^3.0.0-beta.7",
57
- "@spark-ui/hooks": "^17.1.1",
58
- "@spark-ui/icons": "^17.1.1",
59
- "@spark-ui/internal-utils": "^17.1.1",
57
+ "@spark-ui/hooks": "^17.2.1-beta.0",
58
+ "@spark-ui/icons": "^17.2.1-beta.0",
59
+ "@spark-ui/internal-utils": "^17.2.1-beta.0",
60
60
  "@zag-js/pagination": "1.30.0",
61
61
  "@zag-js/react": "1.30.0",
62
62
  "class-variance-authority": "0.7.1",
@@ -1,20 +0,0 @@
1
- import { HTMLAttributes, PropsWithChildren } from 'react';
2
- import { RadioLabelStylesProps } from './RadioLabel.styles';
3
- export interface RadioLabelProps extends RadioLabelStylesProps, PropsWithChildren<HTMLAttributes<HTMLLabelElement>> {
4
- /**
5
- * Change the component to the HTML tag or custom component of the only child.
6
- */
7
- asChild?: boolean;
8
- /**
9
- * The id of the element the label is associated with.
10
- */
11
- htmlFor?: string;
12
- /**
13
- * When true, prevents the user from interacting with the radio item.
14
- */
15
- disabled?: boolean;
16
- }
17
- export declare const RadioLabel: {
18
- ({ disabled, ...others }: RadioLabelProps): import("react/jsx-runtime").JSX.Element;
19
- displayName: string;
20
- };
@@ -1,5 +0,0 @@
1
- import { VariantProps } from 'class-variance-authority';
2
- export declare const radioLabelStyles: (props?: ({
3
- disabled?: boolean | null | undefined;
4
- } & import('class-variance-authority/types').ClassProp) | undefined) => string;
5
- export type RadioLabelStylesProps = VariantProps<typeof radioLabelStyles>;