Triple Fallback Chain
When a user hits Submit, the form tries each layer in sequence. The user only ever sees success or the final fallback link — never a dead end.
① Main email to
mdakhinoorislam.official.2005@gmail.com using template template_5lv0are② Auto-reply email back to the sender's address using template
template_ruuu6raService ID:
service_l3om32p (Gmail service)Auto-reply failure is caught separately and silently ignored — the main send already succeeded.
fetch('https://api.web3forms.com/submit', { method:'POST', ... })Sends same form data (name, email, subject, message) via JSON to Web3Forms endpoint. No account setup needed for basic delivery. If
web3Response.ok → user sees success.
mailto: link with subject and body pre-filled from the form data using encodeURIComponent().Shows a warning message with a clickable link: "Click here to open your email client". Opens the user's native mail app with everything ready — they just hit Send.
EmailJS has a monthly free-tier limit. Web3Forms also has limits. mailto: has no limits — it always works because it uses the device's own email app. The 3-layer system means the contact form works even if both API quotas are exhausted.
Input Features
input[placeholder=" "] + label.floating-label. Works via the CSS :not(:placeholder-shown) trick — the placeholder=" " (single space) enables this without visible placeholder text.maxlength="500". A live counter below shows [n]/500 — updates on every keypress. Stops input at 500. Applied on mobile only (desktop uses different styling but same JS logic)..btn-text and .btn-spinner spans toggle display accordingly.#form-status div below the button shows the result. CSS classes: .success (green tint) and .warning (orange tint). On success, the form is also reset with form.reset().placeholder=" " (single space) makes label float using :not(:placeholder-shown) selector — no JS needed.
Quick Actions + Deep Links
Mobile contact page has 4 one-tap action cards above the form — for direct communication without filling in a form.
tel: dials immediately on phone. wa.me/{number} opens WhatsApp chat. t.me/{username} opens Telegram. These are OS-level deep links — no app switching needed on mobile.navigator.vibrate([100, 50, 100]) fires a double-buzz pattern. Confirms submission physically. Only fires on Android (iOS doesn't support navigator.vibrate). Checked with feature detection.Desktop vs Mobile
Desktop (Contact/contact.html)
- Two-column layout: info panel left, form right
- Pulsing green "Available" status dot (CSS keyframe statusPulse)
- Direct: Email, WhatsApp, Location in left panel
- Social grid: 5 icons with brand color hover
- Same 3-layer EmailJS → Web3Forms → mailto fallback
- particle background canvas + geometric shapes
- No char counter on textarea (desktop)
Mobile (mobile/contact/contact.html)
- Single column, vertical scroll
- 4 quick-action tap cards at top (tel/mailto/wa.me/t.me)
- Floating label inputs with .input-border animated underline
- 500-char counter on textarea
- Haptic vibrate on submit success
- 16px input font-size (prevents iOS auto-zoom)
- Same 3-layer fallback system
Code Details
Other Feature Guides
More deep-dives into A3KM Studio features — shortcuts, hidden tricks, mobile vs desktop comparisons and code references.