@zag-js/toggle
Version:
Core logic for the toggle widget implemented as a state machine
52 lines (45 loc) • 961 B
text/typescript
import { createMachine } from "@zag-js/core"
import type { ToggleSchema } from "./toggle.types"
export const machine = createMachine<ToggleSchema>({
props({ props }) {
return {
defaultPressed: false,
...props,
}
},
context({ prop, bindable }) {
return {
pressed: bindable<boolean>(() => ({
value: prop("pressed"),
defaultValue: prop("defaultPressed"),
onChange(value) {
prop("onPressedChange")?.(value)
},
})),
}
},
initialState() {
return "idle"
},
on: {
"PRESS.TOGGLE": {
actions: ["togglePressed"],
},
"PRESS.SET": {
actions: ["setPressed"],
},
},
states: {
idle: {},
},
implementations: {
actions: {
togglePressed({ context }) {
context.set("pressed", !context.get("pressed"))
},
setPressed({ context, event }) {
context.set("pressed", event.value)
},
},
},
})