@kobalte/core
Version:
Unstyled components and primitives for building accessible web apps and design systems with SolidJS.
324 lines (311 loc) • 8.53 kB
JSX
import {
createToggleState
} from "./VI7QYH27.jsx";
import {
FORM_CONTROL_FIELD_PROP_NAMES,
createFormControlField
} from "./NGHEENNE.jsx";
import {
FormControlLabel
} from "./FOXVCQFV.jsx";
import {
createFormResetListener
} from "./QJIB6BDF.jsx";
import {
FormControlErrorMessage
} from "./ZZYKR3VO.jsx";
import {
FORM_CONTROL_PROP_NAMES,
FormControlContext,
FormControlDescription,
createFormControl,
useFormControlContext
} from "./XUUROM4M.jsx";
import {
Polymorphic
} from "./FLVHQV4A.jsx";
import {
__export
} from "./5WXHJDCZ.jsx";
// src/switch/index.tsx
var switch_exports = {};
__export(switch_exports, {
Control: () => SwitchControl,
Description: () => SwitchDescription,
ErrorMessage: () => SwitchErrorMessage,
Input: () => SwitchInput,
Label: () => SwitchLabel,
Root: () => SwitchRoot,
Switch: () => Switch,
Thumb: () => SwitchThumb,
useSwitchContext: () => useSwitchContext
});
// src/switch/switch-control.tsx
import { EventKey, callHandler, mergeDefaultProps } from "@kobalte/utils";
import { splitProps } from "solid-js";
// src/switch/switch-context.tsx
import { createContext, useContext } from "solid-js";
var SwitchContext = createContext();
function useSwitchContext() {
const context = useContext(SwitchContext);
if (context === void 0) {
throw new Error(
"[kobalte]: `useSwitchContext` must be used within a `Switch` component"
);
}
return context;
}
// src/switch/switch-control.tsx
function SwitchControl(props) {
const formControlContext = useFormControlContext();
const context = useSwitchContext();
const mergedProps = mergeDefaultProps(
{
id: context.generateId("control")
},
props
);
const [local, others] = splitProps(mergedProps, ["onClick", "onKeyDown"]);
const onClick = (e) => {
callHandler(e, local.onClick);
context.toggle();
context.inputRef()?.focus();
};
const onKeyDown = (e) => {
callHandler(e, local.onKeyDown);
if (e.key === EventKey.Space) {
context.toggle();
context.inputRef()?.focus();
}
};
return <Polymorphic
as="div"
onClick={onClick}
onKeyDown={onKeyDown}
{...formControlContext.dataset()}
{...context.dataset()}
{...others}
/>;
}
// src/switch/switch-description.tsx
function SwitchDescription(props) {
const context = useSwitchContext();
return <FormControlDescription
{...context.dataset()}
{...props}
/>;
}
// src/switch/switch-error-message.tsx
function SwitchErrorMessage(props) {
const context = useSwitchContext();
return <FormControlErrorMessage
{...context.dataset()}
{...props}
/>;
}
// src/switch/switch-input.tsx
import {
callHandler as callHandler2,
mergeDefaultProps as mergeDefaultProps2,
mergeRefs,
visuallyHiddenStyles
} from "@kobalte/utils";
import {
splitProps as splitProps2
} from "solid-js";
import { combineStyle } from "@solid-primitives/props";
function SwitchInput(props) {
const formControlContext = useFormControlContext();
const context = useSwitchContext();
const mergedProps = mergeDefaultProps2(
{ id: context.generateId("input") },
props
);
const [local, formControlFieldProps, others] = splitProps2(
mergedProps,
["ref", "style", "onChange", "onFocus", "onBlur"],
FORM_CONTROL_FIELD_PROP_NAMES
);
const { fieldProps } = createFormControlField(formControlFieldProps);
const onChange = (e) => {
callHandler2(e, local.onChange);
e.stopPropagation();
const target = e.target;
context.setIsChecked(target.checked);
target.checked = context.checked();
};
const onFocus = (e) => {
callHandler2(e, local.onFocus);
context.setIsFocused(true);
};
const onBlur = (e) => {
callHandler2(e, local.onBlur);
context.setIsFocused(false);
};
return <Polymorphic
as="input"
ref={mergeRefs(context.setInputRef, local.ref)}
type="checkbox"
role="switch"
id={fieldProps.id()}
name={formControlContext.name()}
value={context.value()}
checked={context.checked()}
required={formControlContext.isRequired()}
disabled={formControlContext.isDisabled()}
readonly={formControlContext.isReadOnly()}
style={combineStyle({ ...visuallyHiddenStyles }, local.style)}
aria-checked={context.checked()}
aria-label={fieldProps.ariaLabel()}
aria-labelledby={fieldProps.ariaLabelledBy()}
aria-describedby={fieldProps.ariaDescribedBy()}
aria-invalid={formControlContext.validationState() === "invalid" || void 0}
aria-required={formControlContext.isRequired() || void 0}
aria-disabled={formControlContext.isDisabled() || void 0}
aria-readonly={formControlContext.isReadOnly() || void 0}
onChange={onChange}
onFocus={onFocus}
onBlur={onBlur}
{...formControlContext.dataset()}
{...context.dataset()}
{...others}
/>;
}
// src/switch/switch-label.tsx
function SwitchLabel(props) {
const context = useSwitchContext();
return <FormControlLabel
{...context.dataset()}
{...props}
/>;
}
// src/switch/switch-root.tsx
import {
access,
callHandler as callHandler3,
createGenerateId,
isFunction,
mergeDefaultProps as mergeDefaultProps3,
mergeRefs as mergeRefs2
} from "@kobalte/utils";
import {
children,
createMemo,
createSignal,
createUniqueId,
splitProps as splitProps3
} from "solid-js";
function SwitchRoot(props) {
let ref;
const defaultId = `switch-${createUniqueId()}`;
const mergedProps = mergeDefaultProps3(
{
value: "on",
id: defaultId
},
props
);
const [local, formControlProps, others] = splitProps3(
mergedProps,
[
"ref",
"children",
"value",
"checked",
"defaultChecked",
"onChange",
"onPointerDown"
],
FORM_CONTROL_PROP_NAMES
);
const [inputRef, setInputRef] = createSignal();
const [isFocused, setIsFocused] = createSignal(false);
const { formControlContext } = createFormControl(formControlProps);
const state = createToggleState({
isSelected: () => local.checked,
defaultIsSelected: () => local.defaultChecked,
onSelectedChange: (selected) => local.onChange?.(selected),
isDisabled: () => formControlContext.isDisabled(),
isReadOnly: () => formControlContext.isReadOnly()
});
createFormResetListener(
() => ref,
() => state.setIsSelected(local.defaultChecked ?? false)
);
const onPointerDown = (e) => {
callHandler3(e, local.onPointerDown);
if (isFocused()) {
e.preventDefault();
}
};
const dataset = createMemo(() => ({
"data-checked": state.isSelected() ? "" : void 0
}));
const context = {
value: () => local.value,
dataset,
checked: () => state.isSelected(),
inputRef,
generateId: createGenerateId(() => access(formControlProps.id)),
toggle: () => state.toggle(),
setIsChecked: (isChecked) => state.setIsSelected(isChecked),
setIsFocused,
setInputRef
};
return <FormControlContext.Provider value={formControlContext}><SwitchContext.Provider value={context}><Polymorphic
as="div"
ref={mergeRefs2((el) => ref = el, local.ref)}
role="group"
id={access(formControlProps.id)}
onPointerDown={onPointerDown}
{...formControlContext.dataset()}
{...dataset()}
{...others}
><SwitchRootChild state={context}>{local.children}</SwitchRootChild></Polymorphic></SwitchContext.Provider></FormControlContext.Provider>;
}
function SwitchRootChild(props) {
const resolvedChildren = children(() => {
const body = props.children;
return isFunction(body) ? body(props.state) : body;
});
return <>{resolvedChildren()}</>;
}
// src/switch/switch-thumb.tsx
import { mergeDefaultProps as mergeDefaultProps4 } from "@kobalte/utils";
function SwitchThumb(props) {
const formControlContext = useFormControlContext();
const context = useSwitchContext();
const mergedProps = mergeDefaultProps4(
{
id: context.generateId("thumb")
},
props
);
return <Polymorphic
as="div"
{...formControlContext.dataset()}
{...context.dataset()}
{...mergedProps}
/>;
}
// src/switch/index.tsx
var Switch = Object.assign(SwitchRoot, {
Control: SwitchControl,
Description: SwitchDescription,
ErrorMessage: SwitchErrorMessage,
Input: SwitchInput,
Label: SwitchLabel,
Thumb: SwitchThumb
});
export {
useSwitchContext,
SwitchControl,
SwitchDescription,
SwitchErrorMessage,
SwitchInput,
SwitchLabel,
SwitchRoot,
SwitchThumb,
Switch,
switch_exports
};