From d29ed5c56ab17731169b22ff170c543ae87d1239 Mon Sep 17 00:00:00 2001 From: ujiro99 Date: Thu, 22 Oct 2026 12:53:55 +0900 Subject: [PATCH 1/4] feat(extension): support dark mode on the onboarding page Apply the theme to the onboarding page and add dark counterparts to its hard-coded colors next to the existing ones, so the light theme renders as before. The brand color (sky-950) gets a lighter shade that keeps buttons and progress pills visible on the dark background. The logo image has dark text on a transparent background, so a dark variant (wordmark lightness inverted, hue and icon kept) is added and chosen by theme. The page background uses the same token as the options page. Refs #495 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019DvJ25jdbq4pvn4K8Wk7Mx --- .../public/SelectionCommandLogo_dark.png | Bin 0 -> 43015 bytes .../onboarding/OnboardingCallout.tsx | 2 +- .../onboarding/OnboardingLayout.tsx | 16 +++++----- .../components/onboarding/OnboardingPage.tsx | 23 +++++++++----- .../components/onboarding/OnboardingRail.tsx | 22 ++++++++----- .../onboarding/OnboardingTargetText.tsx | 8 ++--- .../onboarding/OnboardingWelcome.tsx | 12 +++---- .../__tests__/onboardingLogo.test.tsx | 30 ++++++++++++++++++ .../components/onboarding/onboardingLogo.ts | 10 ++++++ .../onboarding/steps/StepAiPromptCommand.tsx | 8 ++--- .../onboarding/steps/StepComplete.tsx | 10 +++--- .../onboarding/steps/StepCustomize.tsx | 18 +++++------ .../components/onboarding/steps/StepIntro.tsx | 12 +++---- .../onboarding/steps/StepLinkPreview.tsx | 22 +++++++------ .../onboarding/steps/StepSearchCommand.tsx | 10 +++--- 15 files changed, 129 insertions(+), 74 deletions(-) create mode 100644 packages/extension/public/SelectionCommandLogo_dark.png create mode 100644 packages/extension/src/components/onboarding/__tests__/onboardingLogo.test.tsx create mode 100644 packages/extension/src/components/onboarding/onboardingLogo.ts diff --git a/packages/extension/public/SelectionCommandLogo_dark.png b/packages/extension/public/SelectionCommandLogo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..971b15b10ce65f40cc90a34156072579047ea131 GIT binary patch literal 43015 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 literal 0 HcmV?d00001 diff --git a/packages/extension/src/components/onboarding/OnboardingCallout.tsx b/packages/extension/src/components/onboarding/OnboardingCallout.tsx index 018f4f33..dc1af0c2 100644 --- a/packages/extension/src/components/onboarding/OnboardingCallout.tsx +++ b/packages/extension/src/components/onboarding/OnboardingCallout.tsx @@ -71,7 +71,7 @@ export function OnboardingCallout({ diff --git a/packages/extension/src/components/onboarding/OnboardingLayout.tsx b/packages/extension/src/components/onboarding/OnboardingLayout.tsx index eefe715a..b988717c 100644 --- a/packages/extension/src/components/onboarding/OnboardingLayout.tsx +++ b/packages/extension/src/components/onboarding/OnboardingLayout.tsx @@ -4,8 +4,7 @@ import { getProgress, showsSkip } from "./onboardingProgress" import { OnboardingGlow } from "./OnboardingGlow" import type { OnboardingBackground } from "./onboardingVariantUi" import type { OnboardingStep, StepPhase } from "@/types/onboarding" - -const ICON_URL = chrome.runtime.getURL("SelectionCommandLogo.png") +import { useLogoUrl } from "./onboardingLogo" type Props = { step: OnboardingStep @@ -29,10 +28,11 @@ export function OnboardingLayout({ onSkip, children, }: Props) { + const logoUrl = useLogoUrl() const progress = getProgress(step, phase) return ( -
+
{background === "glow" ? ( // Fixed to the viewport, like the welcome overlay, so its center // lines up exactly with the overlay's glow during the handoff. @@ -51,7 +51,7 @@ export function OnboardingLayout({
{progress && ( Logo of selection command ))}
- + {progress.current} / {progress.total}
@@ -86,7 +86,7 @@ export function OnboardingLayout({ diff --git a/packages/extension/src/components/onboarding/OnboardingPage.tsx b/packages/extension/src/components/onboarding/OnboardingPage.tsx index a6843cf6..c123341f 100644 --- a/packages/extension/src/components/onboarding/OnboardingPage.tsx +++ b/packages/extension/src/components/onboarding/OnboardingPage.tsx @@ -5,6 +5,7 @@ import { Popup } from "@/components/Popup" import { LinkSelector } from "@/components/LinkSelector" import { useOnboardingState } from "./useOnboardingState" import { useOnboardingVariant } from "./useOnboardingVariant" +import { useTheme, themeContext } from "@/hooks/useTheme" import { OnboardingLayout } from "./OnboardingLayout" import { OnboardingWelcome } from "./OnboardingWelcome" import { StepIntro } from "./steps/StepIntro" @@ -20,15 +21,21 @@ import "@/components/App.css" export function OnboardingPage() { const variant = useOnboardingVariant() + const theme = useTheme(document.documentElement) - // Hold a blank canvas until the A/B assignment is known (normally a single - // chrome.storage.local read, since the service worker assigns on - // install). Rendering a default arm first would flash variant A's INTRO - // screen at variant C users. - if (variant == null) { - return
- } - return + return ( + + {variant == null ? ( + // Hold a blank canvas until the A/B assignment is known (normally a + // single chrome.storage.local read, since the service worker assigns + // on install). Rendering a default arm first would flash variant A's + // INTRO screen at variant C users. +
+ ) : ( + + )} + + ) } function OnboardingFlow({ variant }: { variant: ExperimentVariant }) { diff --git a/packages/extension/src/components/onboarding/OnboardingRail.tsx b/packages/extension/src/components/onboarding/OnboardingRail.tsx index f87bda83..581c722c 100644 --- a/packages/extension/src/components/onboarding/OnboardingRail.tsx +++ b/packages/extension/src/components/onboarding/OnboardingRail.tsx @@ -60,7 +60,9 @@ export function OnboardingRail({ {state === "done" && ( @@ -93,12 +95,16 @@ export function OnboardingRail({ /> )} {state === "current" && ( - - + + )} - + {label}
diff --git a/packages/extension/src/components/onboarding/OnboardingTargetText.tsx b/packages/extension/src/components/onboarding/OnboardingTargetText.tsx index 5ca3c32c..a8b20db6 100644 --- a/packages/extension/src/components/onboarding/OnboardingTargetText.tsx +++ b/packages/extension/src/components/onboarding/OnboardingTargetText.tsx @@ -53,9 +53,9 @@ export function OnboardingTargetText({
diff --git a/packages/extension/src/components/onboarding/OnboardingWelcome.tsx b/packages/extension/src/components/onboarding/OnboardingWelcome.tsx index ad75db20..ab3919ba 100644 --- a/packages/extension/src/components/onboarding/OnboardingWelcome.tsx +++ b/packages/extension/src/components/onboarding/OnboardingWelcome.tsx @@ -7,8 +7,7 @@ import { DEFAULT_WELCOME_UI, type OnboardingWelcomeUi, } from "./onboardingVariantUi" - -const ICON_URL = chrome.runtime.getURL("SelectionCommandLogo.png") +import { useLogoUrl } from "./onboardingLogo" /** How long variant C's overlay stays up before advancing on its own. */ export const WELCOME_DURATION_MS = DEFAULT_WELCOME_UI.durationMs @@ -30,6 +29,7 @@ type Props = { // when the user clicks - there is nothing to read here, so making people // wait out the timer would just be a second thing to sit through. export function OnboardingWelcome({ onDone, ui = DEFAULT_WELCOME_UI }: Props) { + const logoUrl = useLogoUrl() const [exiting, setExiting] = useState(false) const timersRef = useRef[]>([]) const finishedRef = useRef(false) @@ -69,7 +69,7 @@ export function OnboardingWelcome({ onDone, ui = DEFAULT_WELCOME_UI }: Props) { aria-label={t("onboarding_welcomeContinue")} data-testid="onboarding-welcome" className={clsx( - "fixed inset-0 z-30 flex cursor-default flex-col items-center justify-center overflow-hidden bg-white", + "fixed inset-0 z-30 flex cursor-default flex-col items-center justify-center overflow-hidden bg-white dark:bg-background", ui.gapClassName, exiting && "animate-onboarding-blur-out motion-reduce:animate-none", )} @@ -87,15 +87,15 @@ export function OnboardingWelcome({ onDone, ui = DEFAULT_WELCOME_UI }: Props) { delay={ui.logoDelay} className={ui.logoClassName} > - + -

+

{t("onboarding_welcomeMessage")}

-

+

{t("onboarding_welcomeIntroduction")}

diff --git a/packages/extension/src/components/onboarding/__tests__/onboardingLogo.test.tsx b/packages/extension/src/components/onboarding/__tests__/onboardingLogo.test.tsx new file mode 100644 index 00000000..1f47bf56 --- /dev/null +++ b/packages/extension/src/components/onboarding/__tests__/onboardingLogo.test.tsx @@ -0,0 +1,30 @@ +import { describe, it, expect, vi } from "vitest" +import { renderHook } from "@testing-library/react" +import { themeContext, type ResolvedTheme } from "@/hooks/useTheme" +import { useLogoUrl } from "../onboardingLogo" + +// The logo URLs are resolved when the module loads, before any test runs. +vi.hoisted(() => { + vi.mocked(chrome.runtime.getURL).mockImplementation( + (path: string) => `chrome-extension://test/${path}`, + ) +}) + +const renderWithTheme = (theme: ResolvedTheme) => + renderHook(() => useLogoUrl(), { + wrapper: ({ children }) => ( + {children} + ), + }) + +describe("useLogoUrl", () => { + it("OL-01: 正常系: ライトテーマでは通常のロゴを返す", () => { + const { result } = renderWithTheme("light") + expect(result.current).toContain("SelectionCommandLogo.png") + }) + + it("OL-02: 正常系: ダークテーマではダーク用のロゴを返す", () => { + const { result } = renderWithTheme("dark") + expect(result.current).toContain("SelectionCommandLogo_dark.png") + }) +}) diff --git a/packages/extension/src/components/onboarding/onboardingLogo.ts b/packages/extension/src/components/onboarding/onboardingLogo.ts new file mode 100644 index 00000000..918aa12e --- /dev/null +++ b/packages/extension/src/components/onboarding/onboardingLogo.ts @@ -0,0 +1,10 @@ +import { useThemeContext } from "@/hooks/useTheme" + +const LOGO_URL = chrome.runtime.getURL("SelectionCommandLogo.png") +// The same logo with the wordmark's lightness inverted (hue kept) and the +// icon untouched, since the original's dark text vanishes on a dark page. +const LOGO_DARK_URL = chrome.runtime.getURL("SelectionCommandLogo_dark.png") + +/** Returns the logo image URL for the current theme. */ +export const useLogoUrl = (): string => + useThemeContext() === "dark" ? LOGO_DARK_URL : LOGO_URL diff --git a/packages/extension/src/components/onboarding/steps/StepAiPromptCommand.tsx b/packages/extension/src/components/onboarding/steps/StepAiPromptCommand.tsx index 5786340c..51e23ebc 100644 --- a/packages/extension/src/components/onboarding/steps/StepAiPromptCommand.tsx +++ b/packages/extension/src/components/onboarding/steps/StepAiPromptCommand.tsx @@ -132,7 +132,7 @@ export function StepAiPromptCommand({ onboarding }: Props) { return (
-

+

2.{" "} {t("Option_commandType_aiPrompt_title")}

@@ -157,7 +157,7 @@ export function StepAiPromptCommand({ onboarding }: Props) { className="flex flex-col items-center gap-4" delay={phaseDelays.message} > -

+

{isValueShown ? ( <> {t("onboarding_step2ValueMessage")} @@ -181,7 +181,7 @@ export function StepAiPromptCommand({ onboarding }: Props) { key="value-submessage" delay={phaseDelays.valueSubmessage} > -

+

{renderMultiline(t("onboarding_step2ValueSubmessage"))}

@@ -236,7 +236,7 @@ export function StepAiPromptCommand({ onboarding }: Props) { type="button" onClick={() => onboarding.goToStep(OnboardingStep.LINK_PREVIEW)} className={cn( - "flex items-center gap-2 min-h-14 rounded-xl bg-sky-950 px-8 text-lg font-semibold text-white shadow-[0_10px_20px_-14px_rgba(15,23,42,.7)] hover:brightness-[1.35]", + "flex items-center gap-2 min-h-14 rounded-xl bg-sky-950 dark:bg-sky-700 px-8 text-lg font-semibold text-white shadow-[0_10px_20px_-14px_rgba(15,23,42,.7)] hover:brightness-[1.35]", !onboarding.ui.showRail && "mt-4", )} > diff --git a/packages/extension/src/components/onboarding/steps/StepComplete.tsx b/packages/extension/src/components/onboarding/steps/StepComplete.tsx index f16302eb..418626de 100644 --- a/packages/extension/src/components/onboarding/steps/StepComplete.tsx +++ b/packages/extension/src/components/onboarding/steps/StepComplete.tsx @@ -33,7 +33,7 @@ export function StepComplete({ onboarding }: Props) {
@@ -43,7 +43,7 @@ export function StepComplete({ onboarding }: Props) { className="flex flex-col items-center gap-5" delay={delays[1]} > -

+

{t("onboarding_completeTitle")}

@@ -52,7 +52,7 @@ export function StepComplete({ onboarding }: Props) { className="flex flex-col items-center gap-5" delay={delays[2]} > -

+

{renderMultiline(t("onboarding_completeBody"))}

@@ -64,7 +64,7 @@ export function StepComplete({ onboarding }: Props) { >