Adds a useDevTools() composable that returns true when either Vite's
own DEV flag is set (local pnpm dev) or VITE_DEV_TOOLS='true' is
passed at build time. AppLayout's PaletteSwitcher now reads through
this composable, so the picker can render on earthwalker.aiolabs.dev
without flipping the build to development mode.
Single gate intentionally — future preview-only surfaces (debug
overlays, unfinished pages, work-in-progress UI) hook into the same
composable. Anything Nicholette should see but the public shouldn't
becomes a v-if="devTools" check. Set the var on the deploy host,
rebuild, surfaces appear; unset, surfaces vanish.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ContactForm wires vee-validate + zod against the inquiry payload:
optional name, required method (Email/WhatsApp/Signal/Telegram/Nostr),
contact value validated per method (email regex, phone-or-handle,
@handle, npub1 prefix), and a 10-2000 char message. On submit the
form calls submitInquiry() from the Nostr feature and toasts the
result — partial relay acceptance still counts as success and is
surfaced to the visitor.
PrivacyBlurb sits above the form explaining the model in plain
language: encrypted in the browser, delivered through Nostr, no
server in between. Lock icon plus terse copy — the goal is to put a
non-Nostr-native visitor at ease without a wall of jargon.
.env.example documents the two build-time vars (VITE_OWNER_NPUB,
VITE_NOSTR_RELAYS) the form depends on.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>