@app-studio/components
BlockEditor
A Markdown block editor built from App Studio primitives, without an external editor engine.
View component sourceImport
ts
import { BlockEditor } from '@app-studio/components';New to the library? Complete installation and provider setup first.
Interactive examples
Try the component, then open Code to copy the complete example.
import React, { useState } from 'react';
import { BlockEditor } from '@app-studio/components';
import { Text, Vertical } from 'app-studio';
export function BlockEditorExample() {
const [value, setValue] = useState(
'# Project notes\n\nSelect a block to edit its content.'
);
const [saved, setSaved] = useState('');
return (
<Vertical gap={16} width="100%">
<BlockEditor
label="Project notes"
value={value}
onChange={setValue}
onSave={() => setSaved(value)}
/>
<Text role="status">
{saved ? 'Document saved in this example.' : 'Changes stay local.'}
</Text>
</Vertical>
);
}Props
Required props are marked below. A dash indicates an unspecified default. Design system configuration can override implementation defaults.
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
value | string | — | Current controlled value. Update it from the matching change callback.Source |
defaultValue | string | — | Initial value for uncontrolled usage.Source |
onChange | ((markdown: string) => void) | — | Called with the new field value. Check the signature for the exact payload.Source |
label | string | — | Visible label describing this control.Source |
isDisabled | boolean | — | Disables user interaction.Source |
isReadOnly | boolean | — | Keeps the value visible without allowing edits.Source |
onSave | (() => void) | — | See the type and source declaration for this property.Source |
uploadMedia | ((file: EditorMediaFile, options: { signal: AbortSignal; }) => Promise<EditorMediaResult>) | — | Upload one user-selected file. The application owns storage and authorization.Source |
pickMedia | (() => Promise<EditorMediaFile | null>) | — | Native applications supply their real picker; null means user cancellation.Source |
generate | ((prompt: string, fragment: string, scope: "selection" | "section") => Promise<string>) | — | See the type and source declaration for this property.Source |
status | View typestring | number | bigint | boolean | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | — | See the type and source declaration for this property.Source |
labels | View typePartial<{ document: string; paragraph: string; h1: string; h2: string; h3: string; bullet: string; number: string; quote: string; codeBlock: string; table: string; blocks: string; below: string; duplicate: string; delete: string; up: string; down: string; drag: string; bold: string; italic: string; underline: string; strikethrough: string; code: string; link: string; linkUrl: string; invalidLink: string; media: string; image: string; video: string; mediaUrl: string; mediaDescription: string; mediaSource: string; invalidMedia: string; upload: string; uploading: string; pickingMedia: string; uploadError: string; cancelUpload: string; mediaStale: string; undo: string; redo: string; source: string; visual: string; emoji: string; sourceFallback: string; selectionToolbar: string; askSelection: string; askSection: string; aiPanel: string; instruction: string; generating: string; aiError: string; proposal: string; apply: string; discard: string; cancel: string; retry: string; generate: string; stale: string; selectionRequired: string; save: string; empty: string; }> | — | See the type and source declaration for this property.Source |
views | { container?: ViewProps; toolbar?: ViewProps; block?: ViewProps; content?: ViewProps; source?: ViewProps; notice?: ViewProps; panel?: ViewProps; } | — | Style overrides for the named internal parts.Source |
Common inherited styling props (7)
Scroll horizontally to see every column.
| Prop | Type | Default | Description |
|---|---|---|---|
onClick | any | — | Called when the user activates the component. |
media | Record<string, CssProps> | — | See the type and source declaration for this property. |
as | keyof JSX.IntrinsicElements"symbol""object""slot""style""title""pattern""form""animate""clipPath""filter""marker""mask""a""abbr""address""area""article""aside""audio""b""base""bdi""bdo""big""blockquote""body""br""button""canvas""caption""center""cite""code""col""colgroup""data""datalist""dd""del""details""dfn""dialog""div""dl""dt""em""embed""fieldset""figcaption""figure""footer""h1""h2""h3""h4""h5""h6""head""header""hgroup""hr""html""i""iframe""img""input""ins""kbd""keygen""label""legend""li""link""main""map""mark""menu""menuitem""meta""meter""nav""noindex""noscript""ol""optgroup""option""output""p""param""picture""pre""progress""q""rp""rt""ruby""s""samp""search""script""section""select""small""source""span""strong""sub""summary""sup""table""template""tbody""td""textarea""tfoot""th""thead""time""tr""track""u""ul""var""video""wbr""webview""svg""animateMotion""animateTransform""circle""defs""desc""ellipse""feBlend""feColorMatrix""feComponentTransfer""feComposite""feConvolveMatrix""feDiffuseLighting""feDisplacementMap""feDistantLight""feDropShadow""feFlood""feFuncA""feFuncB""feFuncG""feFuncR""feGaussianBlur""feImage""feMerge""feMergeNode""feMorphology""feOffset""fePointLight""feSpecularLighting""feSpotLight""feTile""feTurbulence""foreignObject""g""image""line""linearGradient""metadata""mpath""path""polygon""polyline""radialGradient""rect""set""stop""switch""text""textPath""tspan""use""view" | — | See the type and source declaration for this property. |
themeMode | "light" | "dark""light""dark" | — | See the type and source declaration for this property. |
_hover | string | CssProps | — | See the type and source declaration for this property. |
_active | string | CssProps | — | See the type and source declaration for this property. |
_focus | string | CssProps | — | See the type and source declaration for this property. |
For shared layout, color, and responsive properties, read Styling & composition and Responsive layouts. Additional native element attributes depend on the target platform.
Usage guidance
- Give controls a visible label or an accessible name, and verify keyboard interaction. See Accessibility.
- For controlled inputs, update the value from the callback shown in the props table. Keep application state in your component or form library.
- These previews run in the browser. Check React Native setup for platform requirements and differences.