From 16f44d261cf6fff8f81f7729071be255955d4a87 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Tue, 27 Oct 2026 23:38:20 -0700 Subject: [PATCH 1/6] Settings: one HostedPlansLink for every no-plan line Co-Authored-By: Claude Opus 5.5 --- lib/src/components/HostedEnrollment.tsx | 7 ++++++- lib/src/components/ManagedVoiceSection.tsx | 5 ++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/src/components/HostedEnrollment.tsx b/lib/src/components/HostedEnrollment.tsx index 3637af7d6..a1ff805d2 100644 --- a/lib/src/components/HostedEnrollment.tsx +++ b/lib/src/components/HostedEnrollment.tsx @@ -13,6 +13,11 @@ export const HOSTED_PRICING_URL = 'https://dormouse.sh/hosted/#pricing'; /** The Hosted page's voice section, the spoken-alarm row's link where the build has no managed voice. */ export const HOSTED_VOICE_URL = 'https://dormouse.sh/hosted/#voice'; +/** The link to {@link HOSTED_PRICING_URL}, the one way every no-plan line names the plans. */ +export function HostedPlansLink() { + return See Hosted plans; +} + /** The one field the offer card and the typed form both ask for. */ export function BurrowNameField({ value, @@ -114,7 +119,7 @@ export function HostedEnrollmentEnded({ {ended.reason === 'failed' && ended.message ?
{ended.message}
: null} {ended.reason === 'not-entitled' ? (
- See Hosted plans +
) : null} {page ? ( diff --git a/lib/src/components/ManagedVoiceSection.tsx b/lib/src/components/ManagedVoiceSection.tsx index 1487edc4b..873da592f 100644 --- a/lib/src/components/ManagedVoiceSection.tsx +++ b/lib/src/components/ManagedVoiceSection.tsx @@ -1,7 +1,6 @@ import { useCallback, useState, useSyncExternalStore } from 'react'; import { INLINE_ACTION_CLASS, SELECT_CLASS, modalActionButton } from './design'; -import { ExternalTextLink } from './ExternalTextLink'; -import { HOSTED_PRICING_URL, HostedApprovalProgress } from './HostedEnrollment'; +import { HostedApprovalProgress, HostedPlansLink } from './HostedEnrollment'; import { FIELD_LABEL, useBusyAction, useNetworkPolicy } from './remote-control-shared'; import { getPlatform } from '../lib/platform'; import { @@ -82,7 +81,7 @@ export function ManagedVoiceSection({ onShowNetwork }: { onShowNetwork?: () => v <>
{voice.notEntitled ? ( - <>{NO_PLAN_COPY} See Hosted plans + <>{NO_PLAN_COPY} ) : 'Natural Voice is on.'}