The rendered body loads into a monospace textarea with an Edit/Preview toggle. A small toolbar wraps a selection in bold or prefixes the caret's line with '## ', '- ' or '1. '. Preview renders through the same ContractMarkdown component the customer sees. On send, the edited body is posted only when it differs from the loaded original.
Also called: one-off contract change · custom clause for this customer · edit contract before sending
- 1applyFormat() wraps a selection for bold (re-selecting the wrapped text) or injects a line prefix at the start of the caret's line for headings and lists.
- 2Preview renders the current buffer through ContractMarkdown.
- 3doSend() computes bodyChanged and posts renderedBody only if it actually differs, 'so an untouched contract isn't needlessly rewritten'.
- 4Editing is disabled once the contract has been sent; the header switches to 'Contract Body (sent)'.
- 5Footnote under the editor: 'Edits here apply only to this customer's contract.'
The editor is deliberately guard-railed for a non-technical user: 'a one-line hint, a markdown formatting toolbar, and a grouped merge-field palette sit above the textarea so a non-technical builder can format + drop in real project values without breaking the document.' Raw markdown with no help is how a contract ends up with broken headings in front of a customer.
- Template edits made just to accommodate a single customer
- Builders formatting markdown by hand and breaking the document
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →