From 0b8a310a7c2dbee33184296a11fe815bfdc4557f Mon Sep 17 00:00:00 2001 From: Devon-White Date: Mon, 8 Jun 2026 12:08:30 -0400 Subject: [PATCH 1/7] New TTS widget --- fern/components/skeleton.css | 25 ++ fern/components/skeleton.tsx | 50 +++ fern/components/types.ts | 51 +++ fern/components/voice-widget.css | 47 +++ fern/components/voice-widget.tsx | 357 ++++++++++++++++++ fern/docs.yml | 5 + .../pages/calling/voice/TTS/index.mdx | 9 + fern/voice-widget-overrides.css | 71 ++++ 8 files changed, 615 insertions(+) create mode 100644 fern/components/skeleton.css create mode 100644 fern/components/skeleton.tsx create mode 100644 fern/components/types.ts create mode 100644 fern/components/voice-widget.css create mode 100644 fern/components/voice-widget.tsx create mode 100644 fern/voice-widget-overrides.css diff --git a/fern/components/skeleton.css b/fern/components/skeleton.css new file mode 100644 index 0000000000..3b18147218 --- /dev/null +++ b/fern/components/skeleton.css @@ -0,0 +1,25 @@ +/* Reusable loading-skeleton (shimmer) for custom MDX components, ported from the SignalWire + components design reference. The original drove it with --skeleton-base / --skeleton-shimmer + design tokens; here those map onto Fern's theme-aware grayscale vars so it follows light/dark. + Loaded globally via docs.yml `css:`. Markup comes from components/skeleton.tsx (`.sw-skeleton`). */ +.sw-skeleton { + background: var(--grayscale-a3); + border-radius: 8px; + position: relative; + overflow: hidden; + flex: none; /* keep its size in flex layouts */ +} +.sw-skeleton::after { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient(90deg, transparent, var(--grayscale-a4), transparent); + animation: sw-shimmer 1.5s infinite; +} +@keyframes sw-shimmer { + 0% { transform: translateX(-100%); } + 100% { transform: translateX(100%); } +} +@media (prefers-reduced-motion: reduce) { + .sw-skeleton::after { animation: none; } +} diff --git a/fern/components/skeleton.tsx b/fern/components/skeleton.tsx new file mode 100644 index 0000000000..1326788011 --- /dev/null +++ b/fern/components/skeleton.tsx @@ -0,0 +1,50 @@ +import type { CSSProperties } from "react"; + +// Reusable loading-skeleton primitive for custom MDX components that fetch data at runtime. +// Compose a few of these to mimic the shape of the content that's loading. Pairs with +// skeleton.css (loaded via docs.yml `css:` — Fern's component bundler doesn't process CSS imports). +// Theme-aware (light/dark) through Fern's grayscale vars. +// +// import { Skeleton, SkeletonText } from "@/components/skeleton"; +// if (!data) return ; + +export interface SkeletonProps { + /** CSS width — number (px) or any CSS length (e.g. "60%"). */ + width?: string | number; + /** CSS height — number (px) or any CSS length. Default: 14. */ + height?: string | number; + /** Border radius override — number (px) or any CSS length (e.g. "50%" for a circle). */ + radius?: string | number; + className?: string; + style?: CSSProperties; +} + +export function Skeleton({ width, height = 14, radius, className, style }: SkeletonProps) { + return ( +