---
title: BindableValue
description: Provider-driven value binding primitives for custom editor controls.
---
# BindableValue
BindableValue composes variable or token binding with fields without coupling the field to a
specific editor store. Applications supply a `BindingProvider`; NumberField consumes the context
automatically when nested beneath `BindableValueRoot`.
## Anatomy
- `BindableValueRoot` — binding state, policy, resolved value, picker state, and actions
- `BindableValueTrigger` — polymorphic bind-picker trigger
- `BindableValuePicker` — renderless Reka Combobox composition
## Policies
- `detach-on-edit` unbinds targets and keeps the complete interaction in one provider undo batch.
- `readonly-when-bound` blocks field editing, scrubbing, and keyboard stepping.
- `edit-variable` sends changes to `provider.setValue()` instead of changing the target value.
Cancellation rolls back an open provider batch. Providers without undo support still receive
binding changes, with binding snapshots restored where possible.
## Provider example
```ts twoslash
import type { BindingProvider, BindingTarget } from '@open-pencil/vue'
const values = new Map([['spacing/md', 16]])
const bindings = new Map()
const provider: BindingProvider = {
listVariables: () => [],
filterVariables: () => [],
getBound: () => undefined,
getState: () => 'unbound',
resolve: id => values.get(id),
bind: (target: BindingTarget, variableId) => {
bindings.set(`${target.nodeId}:${target.path}`, variableId)
},
unbind: (target: BindingTarget) => {
bindings.delete(`${target.nodeId}:${target.path}`)
}
}
```
## Generated API reference
The following tables are extracted from the Vue source and JSDoc during the documentation build.