Editable
Switch inline content between preview and validated editing states.
Usage
Basic
Use the smallest complete composition and let it own its initial value.
Use the smallest complete composition and let it own its initial value.
<!-- Editable / Basic -->
<script setup lang="ts">
import { EditableArea, EditableCancelTrigger, EditableEditTrigger, EditableInput, EditablePreview, EditableRoot, EditableSubmitTrigger } from '@sectile/vue/editable'
</script>
<template>
<EditableRoot default-value="release-candidate" v-slot="{ value }">
<EditableArea><EditablePreview>{{ value }}</EditablePreview><EditableInput />
<EditableEditTrigger>Edit</EditableEditTrigger><EditableSubmitTrigger>Save</EditableSubmitTrigger><EditableCancelTrigger>Cancel</EditableCancelTrigger>
</EditableArea>
</EditableRoot>
</template>Validated
Reject an invalid edit while preserving the last accepted value.
Reject an invalid edit while preserving the last accepted value.
<!-- Editable / Validated -->
<script setup lang="ts">
import { EditableArea, EditableCancelTrigger, EditableEditTrigger, EditableInput, EditablePreview, EditableRoot, EditableSubmitTrigger } from '@sectile/vue/editable'
</script>
<template>
<EditableRoot default-value="release-candidate" v-slot="{ value }">
<EditableArea><EditablePreview>{{ value }}</EditablePreview><EditableInput />
<EditableEditTrigger>Edit</EditableEditTrigger><EditableSubmitTrigger>Save</EditableSubmitTrigger><EditableCancelTrigger>Cancel</EditableCancelTrigger>
</EditableArea>
</EditableRoot>
</template>Controlled
Let the parent own the current value and apply accepted changes back to the component.
Let the parent own the current value and apply accepted changes back to the component.
<!-- Editable / Controlled -->
<script setup lang="ts">
import { EditableArea, EditableCancelTrigger, EditableEditTrigger, EditableInput, EditablePreview, EditableRoot, EditableSubmitTrigger } from '@sectile/vue/editable'
</script>
<template>
<EditableRoot default-value="release-candidate" v-slot="{ value }">
<EditableArea><EditablePreview>{{ value }}</EditablePreview><EditableInput />
<EditableEditTrigger>Edit</EditableEditTrigger><EditableSubmitTrigger>Save</EditableSubmitTrigger><EditableCancelTrigger>Cancel</EditableCancelTrigger>
</EditableArea>
</EditableRoot>
</template>API
Vue package: @sectile/vue/editable
EditableRootEditableAreaEditablePreviewEditableInputEditableEditTriggerEditableSubmitTriggerEditableCancelTrigger
Props
EditableRootProps
asElement or component rendered for this part.
asChildWhether to merge this part into its single child instead of rendering a wrapper.
defaultValueInitial value used when the component owns its state.
disabledWhether interaction is unavailable.
labelAccessible name announced for the control.
modelValueCurrent value when state is controlled by the parent.
nameName used for native form submission.
policiesBehavior policies that customize validation, movement, or selection.
readonlyWhether the value can be inspected but not changed.
submitOnBlurWhether leaving the editor commits the current draft.
EditablePartProps
asElement or component rendered for this part.
asChildWhether to merge this part into its single child instead of rendering a wrapper.
Slots
EditableRootSlotProps
disabledWhether interaction is unavailable.
draftCurrent uncommitted input text.
editingWhether editing is active.
readonlyWhether the value can be inspected but not changed.
valueCurrent value exposed by this contract.
Events
EditableRoot
update:editingEmitted when editing starts or stops.
update:modelValueEmitted when the component requests a new controlled value.
Other types
EditableValueChangeHandler
type EditableValueChangeHandler = (value: string) => voidEditableEditingChangeHandler
type EditableEditingChangeHandler = (editing: boolean) => voidParts
Shared scope: [data-scope="editable"]. Combine it with a part selector to keep styles local to this component.
| Part | Selector | Role | Extra attributes |
|---|---|---|---|
root | [data-part="root"] | Defines the component boundary and owns its composed parts. | — |
area | [data-part="area"] | Provides the two-dimensional interaction surface. | — |
preview | [data-part="preview"] | Shows the committed value outside editing mode. | — |
input | [data-part="input"] | Accepts the editable value or draft. | — |
edit-trigger | [data-part="edit-trigger"] | Enters editing mode. | — |
submit-trigger | [data-part="submit-trigger"] | Commits the current draft. | — |
cancel-trigger | [data-part="cancel-trigger"] | Discards the current draft. | — |
Keyboard interaction
| Key | Behavior |
|---|---|
| Enter | Start editing from the preview, or commit a single-line draft. |
| Escape | Cancel editing and restore the accepted value. |
| Tab | Move through the preview, input, and explicit action controls. |
Accessibility
Preview and input states remain distinguishable; invalid drafts are announced on the real input.
