Skip to content

Commit 1457a9c

Browse files
noisysocksclaudeexe.dev usergithub-actions[bot]cursoragent
authored
Onboarding v4 design feedback and polish (#2319)
* Bump @duckduckgo/design-tokens to v0.13.0 Required for onboarding.css which provides .theme-light/.theme-dark tokens. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Onboarding v4: replace hardcoded colours with design token CSS vars Import @duckduckgo/design-tokens onboarding.css and apply theme-light/ theme-dark classes to <main> via isDarkMode from EnvironmentProvider. Replace all hardcoded hex/rgba colours across v4 CSS modules with --ds-* custom properties, collapsing paired @media (prefers-color-scheme: dark) overrides where both themes share the same token name. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Onboarding v4: replace systemSettings SVG with lottie Dax illustration Replace the static SVG Dax illustration on the systemSettings step with layered lottie animations (background body/circle behind the bubble, foreground wing in front). Move illustration rendering from Bubble into SingleStep so layers sit correctly in the stacking order. Add fade-out animation on step exit matching the existing getStarted pattern. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: simplify Background to vertical slide animation Replace CSS background-image with inline <picture>/<img> elements for SVG illustrations. Animate straight up/down (translateY) instead of diagonal offsets, using the default timings for all steps. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: unify vertical positioning into App container Move the top offset to a single padding-top on App's container using max(--sp-5, 45vh - 310px) so the tallest step (~620px) is centered near 45% of the viewport. Remove per-component top margins/padding and drop the unnecessary min-height: 100vh from WelcomeContent. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: keep background SVG at natural size Stop stretching the illustration to 100% width. Render at intrinsic size, centered horizontally and pinned to the bottom of the viewport. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: increase welcome Dax logo to 96x96 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: extend welcome title fade-in to match slide-up duration The fade-in was only ~200ms (13–20% of 3s), making it barely visible. Extend it to 29.67% so opacity and position arrive together over ~500ms. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: delay getStarted bubble entrance by 150ms Gives the Dax lottie animation more time before the bubble slides in, creating better overlap between the two intro animations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: fix bubble resize timing and align content fade-in - Add contentWidth prop to Bubble so the content measurement div immediately uses the target width. This prevents ResizeObserver from measuring at an intermediate width during width transitions, which caused a double-resize on getStarted -> makeDefaultSingle. - Delay content fade-in from 233ms to 400ms so it starts after the bubble finishes resizing (67ms delay + 333ms duration). - Align comparison table tick bounce-in base delay to 400ms to match the content fade-in timing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: smooth bubble split transition and delay right tail - Pre-size the hidden top bubble to match the bottom bubble's height so the makeDefaultSingle → systemSettings transition looks like a smooth split rather than the top bubble growing from zero. - Delay right tail slide-out to 400ms so it appears after the bubble finishes resizing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: bounce only the bubble frame, not content Extract visual styles (background, border, radius, shadow) and tails into a .frame div that receives the scale-bounce animation. Content sits as a sibling and stays perfectly still during the bounce. Remove unused useMergedRef hook and measureBubbleHeight function. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: pin progress badge to bubble top edge during bounce Move the progress badge into Bubble so it tracks the frame's scale-bounce animation. The badge animates translateY in sync with the frame's 1→1.07→1 scale, offsetting by (scale-1)/2 * height to stay pinned to the top border. Also replaces the hardcoded BORDER_WIDTH constant with measureHeight() reading from computed styles. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: move bubble sizing and positioning from JS to CSS Replace inline styles and JS constants (NARROW_WIDTH, WIDE_WIDTH, GAP) with CSS custom properties (--bubble-width, --bubble-height, --bubble-leading, --bubble-top-height, --bubble-bottom-height). Bubble content measurement now uses an inherited --bubble-width via CSS class instead of a contentWidth prop. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: keep Dax illustration stable as bottom bubble grows Position the illustration with an absolute offset that compensates for changes in --bubble-bottom-height, so Dax stays visually anchored while system settings rows are added. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Bump size of star icon in addressBarMode step * Fix invalid transition-timing-function value failing stylelint Remove stray `67ms` from cubic-bezier value — the delay is already specified via transition-delay. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix background image paths broken on CDN preview Remove `../` prefix from asset paths in Background.js to match the convention used by all other v4 components. The `../` navigated above the served root, causing 404s on CDN while working locally. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Add sparkle lottie animation to makeDefault and duckPlayer steps Play a sparkle effect at the top-left of the title when it transitions from "Protections activated!" to "Excellent! Let's move on.", and at the top-left of the Duck Player promo image when that step appears. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Onboarding v4: support default Duck Player variant with Rive animation toggle The duckPlayerSingle step previously always showed static ad-free copy. Now it checks the variant from stepDefinitions: ad-free shows the static promo image, while the default (no variant) shows the Rive before/after animation with "See With/Without Duck Player" toggle buttons, matching the v3 behaviour. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix package-lock.json regression for @duckduckgo/design-tokens The merge from main downgraded the lockfile entry from v0.13.0 to v0.11.0, breaking the onboarding.css import added in this branch. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Address design feedback: background alignment, content position, Dax spacing - Right-align background illustration on welcome step via data-current selector - Lift welcome logo and step bubbles from 45vh to 40vh - Increase min bubble leading from sp-5 to sp-10 - Nudge Dax illustration down 8px for more gap from Import button Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix Windows button ordering: primary action on left, secondary on right On Windows, primary actions (Make Default, Pin to Taskbar, Import Now, Next) should appear to the left of secondary actions (Skip). Adds platform-aware `order: -1` on `[data-platform-name="windows"]` to the button containers in MakeDefaultContent, SettingsContent, and DuckPlayerContent, matching the v3 convention. macOS ordering (primary on right) is unaffected. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Vertically center star icon in address bar footer Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Refine address bar preview: softened corners, detailing, and fix fillOpacity rendering Update SVG with rounded corners (rx=20), browser tab shapes, window dots, decorative wave, and corrected colors from Figma. Fix Preact fillOpacity bug where the JSX attribute wasn't converted to the SVG fill-opacity attribute — moved all opacity values to style props instead. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix .bubble CSS selector targeting nonexistent class * Show all X marks in v4 comparison grid for non-DDG browsers Remove partial support statuses so Chrome and Safari columns consistently show "not supported" across all comparison rows. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Replace Rive animation with MP4 videos for Duck Player onboarding step Swap the Rive-based before/after preview with two short mp4 videos (duck-player-enabled.mp4 and duck-player-disabled.mp4) for more efficient playback and direct control. Implements a 7-state FSM via useReducer to handle auto-play, toggle, mid-playback reverse queuing, and reduced-motion (seek to last frame with NaN-duration guard). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Add dark mode Lottie animations for v4 onboarding Use dark mode variants for dax-in-spotlight-thumbs-up, dax-in-spotlight-pointing-background, and sparkle animations when the user prefers dark color scheme. The LottieAnimation component now accepts an optional darkSrc prop and preserves the current frame when switching themes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Use package-lock.json from main * Fix WebKit CI failure in duck player video state-machine tests Disable reduced motion after page load in the mid-playback and double-toggle tests. In reduced motion mode, playVideo() seeks to video.duration which fires the 'ended' event immediately in WebKit, skipping past the transitional states the tests need to assert. Switching to no-preference after setup keeps the fast page load while letting playVideo() call video.play() for deterministic control. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix systemSettings illustration placement and background dark mode theming - Move systemSettings illustration config from inside bottomBubble to top-level step config so SingleStep can render it (matches getStarted) - Use class-based .theme-dark selector instead of @media prefers-color-scheme for background color, consistent with the rest of v4 theming Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Rewrite DuckPlayerDefault to simplify video toggle state management Replace the 7-state FSM with a simple { target, phase, reverse } state object. Side effects (play/reset) live directly in toggle, handleEnd, and autoPlay callbacks. Pre-seeks the hidden video to frame 0 when queuing a reverse to prevent flash of old end-frame on transition. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Polish onboarding v4 code quality: DRY components, consistent patterns, readability - Extract shared Container and Title components from repeated layout/heading styles - Thread updateSystemValue as prop from data.js into content components, removing raw dispatch({ kind: 'update-system-value' }) calls - Replace handle* callback prefixes with action-describing names (settle, complete, advance, apply, select) - Use advance from useStepConfig in SingleStep instead of duplicating dispatch - Consistent class prop usage (className → class) in ComparisonTable + AddressBarPreview - Add px comments to all standalone var(--sp-*) CSS usages - Convert raw px values to calc(N * var(--px-in-rem)) or var(--sp-N) tokens - Add prefers-reduced-motion: reduce to Background slide animations - Fix arialLabel typo, t parameter shadowing, pendingId string|false → string|null - Remove dead useEffect in AddressBarContent, empty <caption>, unused dispatch imports - Add typed AddressBarOption union, comment for magic slice(2) in progress calc Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Preload sparkle animation in MakeDefaultContent to eliminate load delay LottieAnimation gains autoplay and animationRef props so callers can preload without playing and trigger playback imperatively. The sparkle is now always mounted (hidden via visibility) and played from frame 6 when the success title appears, avoiding a visible fetch/parse delay. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Hide Dax illustration and tail on short viewports for getStarted step Add shared useMediaQuery hook and use it to reactively hide the illustration and bottom-left tail when viewport height is below 550px. Also refactor EnvironmentProvider to use the hook for dark mode detection. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Remove right tail from duckPlayer, customize, and addressBarMode steps These screens don't have a Dax illustration, so the speech bubble tail pointing at empty space is unnecessary. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Share background illustrations across onboarding steps and remove unused assets Map multiple steps to the same background image so transitions are skipped when consecutive steps share the same illustration. Delete 6 unused background SVGs and renumber the remaining files. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Add ?bubbleWidth query param for onboarding v4 bubble width override Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Set default bubble width to 530px and add line breaks to Duck Player step Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix double-toggle during initial phase not cancelling queued reverse Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix auto-play useEffect re-firing when reduced motion changes after mount Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Add v4 onboarding screenshot tests (#2400) * Add v4 onboarding screenshot tests Mirror the existing v3 screenshot test approach for the v4 onboarding flow. Covers all 7 steps: welcome, getStarted, makeDefaultSingle, systemSettings, duckPlayerSingle, customize, and addressBarMode. Masks Rive canvas on the duck player step to avoid flaky animation comparisons. Baseline images will be generated by CI on macOS. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Updated snapshots via workflow * Update screenshot tests --------- Co-authored-by: exe.dev user <exedev@falcon-ion.exe.xyz> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * Fix unhandled promise rejection from video.play() in DuckPlayerContent Add .catch() handler to video.play() call to prevent unhandled promise rejection warnings that can occur during rapid toggling or DOM changes. Applied via @cursor push command * Restore package.json * Fix lint error * Restructure videos dir * Fix background alignment * Update screenshot tests --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: exe.dev user <exedev@falcon-ion.exe.xyz> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com>
1 parent c5e8615 commit 1457a9c

File tree

103 files changed

+1933
-2212
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

103 files changed

+1933
-2212
lines changed

special-pages/pages/onboarding/app/v3/components/DockInstructions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export function DockInstructions() {
1515
<div className={styles.root}>
1616
<video
1717
className={styles.video}
18-
src="assets/video/dock-instructions/add-to-dock.mp4"
18+
src="assets/videos/add-to-dock.mp4"
1919
autoPlay={!isReducedMotion}
2020
loop
2121
muted

special-pages/pages/onboarding/app/v4/App.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { h } from 'preact';
2-
import { useContext } from 'preact/hooks';
32
import styles from './App.module.css';
4-
import { GlobalContext, GlobalDispatch } from '../global';
3+
import { useGlobalDispatch, useGlobalState } from '../global';
54
import { useEnv } from '../../../../shared/components/EnvironmentProvider';
65
import { usePlatformName } from '../shared/components/SettingsProvider';
76
import { ErrorBoundary } from '../../../../shared/components/ErrorBoundary';
@@ -14,10 +13,10 @@ import { SingleStep } from './components/SingleStep';
1413
* @param {import("preact").ComponentChild} props.children
1514
*/
1615
export function App({ children }) {
17-
const { debugState } = useEnv();
16+
const { debugState, isDarkMode } = useEnv();
1817
const platformName = usePlatformName();
19-
const globalState = useContext(GlobalContext);
20-
const dispatch = useContext(GlobalDispatch);
18+
const globalState = useGlobalState();
19+
const dispatch = useGlobalDispatch();
2120

2221
const { activeStep, exiting } = globalState;
2322

@@ -27,7 +26,7 @@ export function App({ children }) {
2726
};
2827

2928
return (
30-
<main data-platform-name={platformName || 'macos'} data-app-version="v4">
29+
<main class={isDarkMode ? 'theme-dark' : 'theme-light'} data-platform-name={platformName || 'macos'} data-app-version="v4">
3130
<Background />
3231
{debugState && <Debug state={globalState} />}
3332
<div class={styles.container} data-current={activeStep} data-exiting={String(exiting)}>
@@ -40,6 +39,10 @@ export function App({ children }) {
4039
);
4140
}
4241

42+
/**
43+
* @param {object} props
44+
* @param {import('../types').GlobalState} props.state
45+
*/
4346
function Debug(props) {
4447
const { order, step, exiting, activeStep, nextStep } = props.state;
4548
const debugData = { order, step, exiting, activeStep, nextStep };
Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
@import url('./fonts.css');
2+
@import url('@duckduckgo/design-tokens/build/desktop-browsers/onboarding.css');
23

34
:root {
45
--font-display: 'DuckSansDisplay', system-ui, sans-serif;
56
--font-product: 'DuckSansProduct', system-ui, sans-serif;
67
}
78

89
.container {
9-
--bubble-bg: white;
10-
--bubble-border: #CBEAFF;
10+
--bubble-bg: var(--ds-surface-tertiary);
11+
--bubble-border: var(--ds-accent-alt-primary);
1112

1213
display: flow-root;
1314
position: relative;
14-
15-
@media (prefers-color-scheme: dark) {
16-
--bubble-bg: #011D34;
17-
--bubble-border: #133E7C;
18-
}
1915
}
Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,57 @@
11
import { h } from 'preact';
2-
import { useState, useContext, useEffect } from 'preact/hooks';
2+
import { useState } from 'preact/hooks';
33
import { useTypedTranslation } from '../../types';
44
import { Trans } from '../../../../../shared/components/TranslationsProvider';
5-
import { GlobalDispatch, useGlobalState } from '../../global';
5+
import { useGlobalState } from '../../global';
66
import { useEnv } from '../../../../../shared/components/EnvironmentProvider';
77
import { ToggleButton } from '../../shared/components/ToggleButton';
88
import { AddressBarPreview } from './AddressBarPreview';
99
import { Button } from './Button';
10+
import { Container } from './Container';
1011
import { Launch } from '../../shared/components/Icons';
1112
import styles from './AddressBarContent.module.css';
1213

14+
/** @typedef {'search-and-duckai' | 'search-only'} AddressBarOption */
15+
1316
/**
1417
* Bottom bubble content for the addressBarMode step.
1518
* Shows the address bar preview animation, radio toggle buttons for search mode,
1619
* a footer note about AI features, and the Start Browsing button.
20+
*
21+
* @param {object} props
22+
* @param {() => void} props.dismiss
23+
* @param {(id: import('../../types').SystemValueId, payload: import('../../types').SystemValue, current: boolean) => void} props.updateSystemValue
1724
*/
18-
export function AddressBarContent() {
25+
export function AddressBarContent({ dismiss, updateSystemValue }) {
1926
const { t } = useTypedTranslation();
2027
const { isDarkMode } = useEnv();
21-
const dispatch = useContext(GlobalDispatch);
2228
const { status } = useGlobalState();
23-
const [selectedOption, setSelectedOption] = useState('search-and-duckai');
24-
const isPending = status.kind === 'executing';
25-
26-
const dispatchPreference = (option) => {
27-
dispatch({
28-
kind: 'update-system-value',
29-
id: 'address-bar-mode',
30-
payload: { enabled: option === 'search-and-duckai' },
31-
current: true,
32-
});
33-
};
3429

35-
useEffect(() => {
36-
dispatchPreference(selectedOption);
37-
}, []);
30+
const [selectedOption, setSelectedOption] = useState(/** @type {AddressBarOption} */ ('search-and-duckai'));
31+
const isPending = status.kind === 'executing';
3832

39-
const handleSelection = (option) => {
33+
/** @param {AddressBarOption} option */
34+
const select = (option) => {
4035
if (option === selectedOption || isPending) return;
4136
setSelectedOption(option);
42-
dispatchPreference(option);
37+
updateSystemValue('address-bar-mode', { enabled: option === 'search-and-duckai' }, true);
4338
};
4439

45-
const dismiss = () => dispatch({ kind: 'dismiss' });
46-
4740
return (
48-
<div class={styles.root}>
41+
<Container class={styles.root}>
4942
<div class={styles.previewContainer}>
5043
<AddressBarPreview isReduced={selectedOption === 'search-only'} isDarkMode={isDarkMode} />
5144
</div>
5245
<div class={styles.toggleButtons}>
5346
<ToggleButton
5447
label={t('addressBarMode_searchAndDuckAi')}
5548
selected={selectedOption === 'search-and-duckai'}
56-
onClick={() => handleSelection('search-and-duckai')}
49+
onClick={() => select('search-and-duckai')}
5750
/>
5851
<ToggleButton
5952
label={t('addressBarMode_searchOnly')}
6053
selected={selectedOption === 'search-only'}
61-
onClick={() => handleSelection('search-only')}
54+
onClick={() => select('search-only')}
6255
/>
6356
</div>
6457
<div class={styles.footer}>
@@ -70,6 +63,6 @@ export function AddressBarContent() {
7063
<Button variant="primary" size="wide" class={styles.startButton} onClick={dismiss}>
7164
{t('startBrowsing')} <Launch />
7265
</Button>
73-
</div>
66+
</Container>
7467
);
7568
}
Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
.root {
2-
display: flex;
3-
flex-direction: column;
4-
align-items: center;
5-
align-self: stretch;
6-
padding: var(--sp-12); /* 48px */
2+
gap: 0;
73
}
84

95
.previewContainer {
@@ -22,46 +18,42 @@
2218
line-height: calc(18 * var(--px-in-rem));
2319

2420
/* Override ToggleButton theme to match Figma — light */
25-
--toggle-accent-light: #4397E0;
26-
--toggle-accent-text-light: #1074CC;
27-
--toggle-accent-bg-light: rgba(161, 207, 247, 0.08);
28-
--toggle-border-light: rgba(0, 0, 0, 0.20);
29-
--toggle-color-light: rgba(36, 35, 35, 0.96);
30-
--toggle-radio-light: #4397E0;
21+
--toggle-accent-light: var(--ds-accent-primary);
22+
--toggle-accent-text-light: var(--ds-accent-primary-text-color);
23+
--toggle-accent-bg-light: var(--ds-accent-alt-glow-secondary);
24+
--toggle-border-light: var(--ds-control-primary-border-color);
25+
--toggle-color-light: var(--ds-text-primary);
26+
--toggle-radio-light: var(--ds-accent-primary);
3127

3228
/* Override ToggleButton theme to match Figma — dark */
33-
--toggle-accent-dark: #75B6EB;
34-
--toggle-accent-text-dark: #75B6EB;
35-
--toggle-accent-bg-dark: rgba(161, 207, 247, 0.08);
36-
--toggle-bg-dark: #011D34;
37-
--toggle-border-dark: rgba(255, 255, 255, 0.36);
38-
--toggle-color-dark: white;
39-
--toggle-radio-dark: #75B6EB;
40-
--toggle-radio-check-dark: #222222;
29+
--toggle-accent-dark: var(--ds-accent-primary);
30+
--toggle-accent-text-dark: var(--ds-accent-primary);
31+
--toggle-accent-bg-dark: var(--ds-accent-alt-glow-secondary);
32+
--toggle-bg-dark: var(--ds-surface-tertiary);
33+
--toggle-border-dark: var(--ds-control-primary-border-color);
34+
--toggle-color-dark: var(--ds-text-primary);
35+
--toggle-radio-dark: var(--ds-accent-primary);
36+
--toggle-radio-check-dark: var(--ds-accent-primary-content-color);
4137
}
4238

4339
.footer {
4440
display: flex;
45-
align-items: flex-start;
41+
align-items: center;
4642
gap: var(--sp-2); /* 8px */
4743
align-self: stretch;
4844
margin-top: calc(26 * var(--px-in-rem)); /* 26px */
4945
}
5046

5147
.starIcon {
52-
width: var(--sp-5); /* 20px */
53-
height: var(--sp-5); /* 20px */
48+
width: var(--sp-6); /* 24px */
49+
height: var(--sp-6); /* 24px */
5450
flex-shrink: 0;
5551
}
5652

5753
.footerText {
5854
font-size: calc(13 * var(--px-in-rem));
5955
line-height: calc(16 * var(--px-in-rem));
60-
color: var(--color-black-at-84);
61-
62-
@media (prefers-color-scheme: dark) {
63-
color: var(--color-white-at-84);
64-
}
56+
color: var(--ds-text-primary);
6557
}
6658

6759
.footerText :where(b) {
@@ -71,4 +63,3 @@
7163
.startButton {
7264
margin-top: var(--sp-8); /* 32px */
7365
}
74-

0 commit comments

Comments
 (0)