<script setup lang="ts">
import { EditableArea, EditableCancelTrigger, EditableEditTrigger, EditableInput, EditablePreview, EditableRoot, EditableSubmitTrigger } from 'akar';
import './styles.css';
</script>
<template>
<div class="akar-demo akar-demo-Editable">
<div style="width: 250px;">
<EditableRoot
v-slot="{ isEditing }"
placeholder="Enter text..."
class="EditableRoot"
default-value="Click to edit 'Reka UI'"
auto-resize
>
<EditableArea class="EditableArea">
<EditablePreview />
<EditableInput />
</EditableArea>
<EditableEditTrigger
v-if="!isEditing"
class="EditableTrigger"
/>
<div
v-else
class="EditableWrapper"
>
<EditableSubmitTrigger
class="EditableSubmitTrigger"
/>
<EditableCancelTrigger
class="EditableTrigger"
/>
</div>
</EditableRoot>
</div>
</div>
</template>@scope (.akar-demo-Editable) {
.EditableRoot {
display: flex;
flex-direction: column;
gap: 1rem;
}
.EditableArea {
color: var(--white);
width: 250px;
}
.EditableWrapper {
display: flex;
gap: 1rem;
}
.EditableSubmitTrigger {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 0.25rem;
font-weight: 500;
font-size: 0.9375rem;
padding: 0.9375rem 1.25rem;
height: 2.1875rem;
background-color: var(--grass8);
color: var(--white);
box-shadow:
0px 2px 1.25rem rgba(0, 0, 0, 0.07),
0px 2px 1.25rem rgba(0, 0, 0, 0.07);
outline: none;
transition:
background-color 0.2s,
box-shadow 0.2s;
}
.EditableTrigger {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 0.25rem;
font-weight: 500;
font-size: 0.9375rem;
padding: 0.9375rem 1.25rem;
height: 2.1875rem;
background-color: var(--white);
color: var(--grass11);
box-shadow:
0px 2px 1.25rem rgba(0, 0, 0, 0.07),
0px 2px 1.25rem rgba(0, 0, 0, 0.07);
outline: none;
transition:
background-color 0.2s,
box-shadow 0.2s;
}
}Features
- Full keyboard navigation
- Can be controlled or uncontrolled
- Focus is fully managed
Installation
Install the component from your command line.
pnpm add akar
yarn add akar
npm install akar
bun add akar
Anatomy
Import all parts and piece them together.
<script setup>
import {
EditableArea,
EditableCancelTrigger,
EditableEditTrigger,
EditableInput,
EditablePreview,
EditableRoot,
EditableSubmitTrigger
} from 'akar';
</script>
<template>
<EditableRoot>
<EditableArea>
<EditablePreview />
<EditableInput />
</EditableArea>
<EditableEditTrigger />
<EditableSubmitTrigger />
<EditableCancelTrigger />
</EditableRoot>
</template>
API Reference
Root
Contains all the parts of an editable component.
| Prop | Default | Type |
|---|---|---|
activationMode | "focus" | "dblclick" | "focus" | "none"The activation event of the editable field |
as | "div" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | |
autoResize | false | booleanWhether the editable field should auto resize |
defaultValue | stringThe default value of the editable field | |
dir | "ltr" | "rtl"The reading direction of the calendar when applicable. If omitted, inherits globally from | |
disabled | false | booleanWhether the editable field is disabled |
id | stringThe id of the field | |
maxLength | numberThe maximum number of characters allowed | |
modelValue | string | nullThe value of the editable field | |
name | stringThe name of the field. Submitted with its owning form as part of a name/value pair. | |
placeholder | "Enter text..." | string | { edit: string; preview: string; }The placeholder for the editable field |
readonly | booleanWhether the editable field is read-only | |
required | false | booleanWhen |
selectOnFocus | false | booleanWhether to select the text in the input when it is focused. |
startWithEditMode | booleanWhether to start with the edit mode active | |
submitMode | "blur" | "blur" | "none" | "enter" | "both"The submit event of the editable field |
| Event | Payload |
|---|---|
submit | value: string | nullEvent handler called when a value is submitted |
update:modelValue | value: stringEvent handler called whenever the model value changes |
update:state | state: "cancel" | "submit" | "edit"Event handler called when the editable field changes state |
| Slot (default) | Payload |
|---|---|
isEditing | booleanWhether the editable field is in edit mode |
modelValue | string | nullThe value of the editable field |
isEmpty | booleanWhether the editable field is empty |
submit | (): voidFunction to submit the value of the editable |
cancel | (): voidFunction to cancel the value of the editable |
edit | (): voidFunction to set the editable in edit mode |
| Method | Type |
|---|---|
submit | () => voidFunction to submit the value of the editable |
cancel | () => voidFunction to cancel the value of the editable |
edit | () => voidFunction to set the editable in edit mode |
Area
Contains the text parts of an editable component.
| Prop | Default | Type |
|---|---|---|
as | "div" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. |
| Data attribute | Value |
|---|---|
[data-readonly] | Present when readonly |
[data-disabled] | Present when disabled |
[data-placeholder-shown] | Present when preview is shown |
[data-empty] | Present when the input is empty |
[data-focus] | Present when the editable field is focused. To be deprecated in favor of data-focused |
[data-focused] | Present when the editable field is focused |
Input
Contains the input of an editable component.
| Prop | Default | Type |
|---|---|---|
as | "input" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. |
| Data attribute | Value |
|---|---|
[data-readonly] | Present when readonly |
[data-disabled] | Present when disabled |
Preview
Contains the preview of the editable component.
| Prop | Default | Type |
|---|---|---|
as | "span" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. |
Edit Trigger
Contains the edit trigger of the editable component.
| Prop | Default | Type |
|---|---|---|
as | "button" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. |
Submit Trigger
Contains the submit trigger of the editable component.
| Prop | Default | Type |
|---|---|---|
as | "button" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. |
Cancel Trigger
Contains the cancel trigger of the editable component.
| Prop | Default | Type |
|---|---|---|
as | "button" | AsTag | ComponentThe element or component this component should render as. Can be overwritten by |
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. |
Examples
Change only on submit
By default the component will submit when blur event triggers. We can modify the submit-mode prop to alter this behavior.
In this case, we want to submit only when user click on EditableSubmitTrigger, so we change the submit mode to none.
<template>
<EditableRoot submit-mode="none">
<EditableArea>
<EditablePreview />
<EditableInput />
</EditableArea>
<EditableEditTrigger />
<EditableSubmitTrigger />
<EditableCancelTrigger />
</EditableRoot>
</template>
Accessibility
Keyboard Interactions
| Key | Description |
|---|---|
| Tab | When focus moves onto the editable field, switches into the editable mode if the activation-mode is set to focus. |
| Enter | If the submit-mode is set to enter or both, it submits the changes. |
| Escape | When the focus is on the editable field, it cancels the changes. |