The Contact app makes reaching out feel native to the DevOS environment by wrapping a contact form in the chrome of a classic desktop email client. The layout copies the familiar three-part anatomy of Microsoft Outlook’s compose window: a toolbar of action buttons across the top, a form with labelled fields in the centre, and an address book sidebar on the right. Under the hood it is a standard React controlled form with a Framer Motion animation that plays on submit.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/dev-os/llms.txt
Use this file to discover all available pages before exploring further.
Layout
The app is divided into three horizontal layers:Toolbar
bg-gray-200 border-b border-gray-300 — contains three buttons:
| Button | Icon | Notes |
|---|---|---|
| Send | Send (lucide-react) | Submits the form; disabled while isSending or isSent is true |
| Attach | Paperclip (lucide-react) | Rendered but not wired to file input |
| CC | Users (lucide-react) | Rendered but not wired to any action |
w-px h-4 bg-gray-400 divider separates the Send button from Attach and CC.
Form + Sidebar
The main body is a flex row containing the compose form on the left and the address book on the right. Compose form (bg-white flex-1) — three fields stacked vertically, each separated by a border-b:
| Field | Type | Default / Placeholder |
|---|---|---|
| To | text input | hello@devos.local (pre-filled, readOnly) |
| Subject | text input | Placeholder: "Let's work together!" (required) |
| Body | <textarea> | Placeholder: "Write your message here..." (required, font-serif) |
To: field uses readOnly so visitors cannot change the recipient address. The label spans are w-16 text-sm text-gray-500.
Address Book sidebar (w-48 bg-gray-50 border-l border-gray-200) — visible only on sm: screens and above (hidden sm:block). Contains three anchor links styled in text-os-teal font-medium:
- GitHub —
href="#"(replace with your profile URL) - LinkedIn —
href="#"(replace with your profile URL) - Twitter —
href="#"(replace with your profile URL)
Submit Flow
Submitting the form (either via the toolbar Send button or the native form submit) triggers a three-stage animation sequence managed by two boolean state variables:isSending and isSent.
AnimatePresence wrapping a motion.div:
bg-white/80 backdrop-blur-sm full-cover div (z-40) containing a card with "Message Sent!" in text-os-teal font-bold and a sub-line "I'll get back to you soon.".
Customising the Contact App
Change the recipient address — find theTo: input’s value prop and replace "hello@devos.local" with your real email address:
href="#" values on the three address book anchors:
handleSubmit with a fetch call to your chosen provider. Because the Subject and Body fields are uncontrolled inputs, read their values from the form element via e.target. Example using Formspree:
name attributes to the Subject input (name="subject") and the Body textarea (name="message") so FormData can read them.
Show the address book on mobile — remove hidden sm:block from the sidebar className if you want it visible at all screen sizes.