From 5d2004d9131a25a11e8bea75a2f43009b378e9e1 Mon Sep 17 00:00:00 2001 From: Devon-White Date: Sun, 14 Jun 2026 17:54:37 -0400 Subject: [PATCH 1/6] =?UTF-8?q?Voice=20widget:=20compact=20rows=20(Directi?= =?UTF-8?q?on=20B)=20=E2=80=94=20preview=20vs=20cards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a compact-ROWS preview of the TTS voice browser, a sibling to the cards (Direction A) that reuses the cards' shared foundation rather than forking it. New component fern/components/voice-widget-rows renders a bordered, rounded list of hairline-divided two-line rows (ElevenLabs voice-picker style): cleaned name + sample-text info tooltip over a muted plain-middot meta line (language · gender · provider · model), 38px ghost play button with equalizer when playing, labeled "Copy config". Reuse mechanism: export the data layer + display-time helpers from voice-widget/index.tsx (loadBundle/bundleCache, the Row type, cleanName, friendlyLanguage, normalizeGender, normalizeModel, modelKeyOf, the no-preview/allowlist/lock baseRows filtering inputs, plus the shared Select/uniq/pageNumbers/useIsMobile and page-size constants) and import them into the rows. The rows implement only the row rendering, the row skeleton, and the thin filter/group/page orchestration glue. - Model is the neutral inline- (--code-bg + --fg-secondary, never --code-fg) so it doesn't read as the accent-colored Copy link. - Provider always shown in the meta; the provider prop hides the provider filter + personalizes the title (reused foundation behavior). - Skeleton rows in the same list container at matching row height (59px per row incl. divider) → verified zero layout shift; fade/rise-in and equalizer/shimmer reduced-motion-gated. - Theming light+dark (accent flips blue↔turquoise, model stays neutral), list semantics (