Skip to content

Commit 3b3585c

Browse files
authored
Merge pull request #2044 from codecrafters-io/add-dark-mode-upgrade-flow
add dark mode upgrade flow
2 parents 0d0288c + eaed354 commit 3b3585c

9 files changed

+71
-40
lines changed

app/components/course-leaderboard.hbs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
{{else}}
77
<div class="flex items-center justify-between mb-2 pl-4">
88
<div class="flex items-center">
9-
<span class="uppercase text-teal-500 text-xs font-bold">RECENT ATTEMPTS</span>
9+
<span class="uppercase text-teal-500 dark:text-teal-600 text-xs font-bold">RECENT ATTEMPTS</span>
1010

1111
<span
12-
class="text-white bg-teal-500 text-xs font-bold rounded px-1.5 py-0.5 ml-2
12+
class="text-white dark:text-teal-400 bg-teal-500 dark:bg-teal-900 border border-teal-500 dark:border-teal-700 text-xs font-bold rounded px-1.5 py-0.5 ml-2
1313
{{if this.isLoadingEntries 'opacity-0' 'opacity-100'}}
1414
transition-all"
1515
>

app/components/course-leaderboard/invite-button-entry.hbs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
</div>
88

99
{{#unless @isCollapsed}}
10-
<div class="text-xs text-gray-600 ml-2 group-hover/invite-entry:underline group-hover/invite-entry:text-teal-600">
10+
<div class="text-xs text-gray-600 dark:text-gray-400 ml-2 group-hover/invite-entry:underline group-hover/invite-entry:text-teal-600">
1111
{{@text}}
1212
</div>
1313
{{/unless}}

app/components/course-page/collapse-leaderboard-button.hbs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<button
2-
class="rounded-full border border-gray-300 dark:border-gray-800 bg-white dark:bg-gray-900 flex items-center justify-center p-1.5 transform scale-100 hover:scale-105 hover:border-gray-400 hover:bg-gray-200 transition-all"
2+
class="rounded-full border border-gray-300 dark:border-gray-800 bg-white dark:bg-gray-900 flex items-center justify-center p-1.5 transform scale-100 hover:scale-105 hover:border-gray-400 hover:bg-gray-200 dark:hover:bg-gray-800 transition-all"
33
...attributes
44
type="button"
55
>

app/components/course-page/expand-leaderboard-button.hbs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<button
2-
class="rounded-full border border-gray-300 dark:border-gray-800 bg-white dark:bg-gray-900 flex items-center justify-center p-1.5 transform scale-100 hover:scale-105 hover:border-gray-400 hover:bg-gray-200 transition-all"
2+
class="rounded-full border border-gray-300 dark:border-gray-800 bg-white dark:bg-gray-900 flex items-center justify-center p-1.5 transform scale-100 hover:scale-105 hover:border-gray-400 hover:bg-gray-200 dark:hover:bg-gray-800 transition-all"
33
...attributes
44
type="button"
55
>

app/components/header/account-dropdown.hbs

+8-6
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,15 @@
5454
<Header::AccountDropdownLink @text="Get Help" @icon="question-mark-circle" {{on "click" (fn this.handleGetHelpClick dd.actions)}} />
5555
<Header::AccountDropdownLink @text="Settings" @icon="cog" {{on "click" (fn this.handleSettingsLinkClick dd.actions)}} />
5656

57-
<div class="flex items-center justify-between gap-8 px-3 py-1.5">
58-
<span class="text-sm text-gray-800">
59-
Theme
60-
</span>
57+
{{#if this.featureFlags.canSeeDarkModeToggle}}
58+
<div class="flex items-center justify-between gap-8 px-3 py-1.5">
59+
<span class="text-sm text-gray-800">
60+
Theme
61+
</span>
6162

62-
<DarkModeToggleWithUpgradePrompt @size="small" />
63-
</div>
63+
<DarkModeToggleWithUpgradePrompt @size="small" />
64+
</div>
65+
{{/if}}
6466

6567
<div class="h-px my-2 mx-3 bg-gray-200" />
6668

app/components/leaderboard-entry.hbs

+15-12
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
{{! @glint-nocheck }}
21
<LinkTo
32
@route={{@route}}
43
@model={{or @routeModel "dummy"}}
54
class="flex items-center justify-between py-1.5 group/leaderboard-entry cursor-pointer pl-4 border-l-2
6-
{{if @isForCurrentUser 'border-teal-500' 'border-transparent'}}"
5+
{{if @isForCurrentUser 'border-teal-500 dark:border-teal-600' 'border-transparent'}}"
76
data-test-leaderboard-entry
87
>
98
<div class="flex items-center min-w-0">
@@ -13,17 +12,17 @@
1312
{{else}}
1413
<AvatarImage
1514
@user={{@user}}
16-
class="w-8 h-8 border border-gray-300 rounded shadow-sm group-hover/leaderboard-entry:shadow transition-shadow"
15+
class="w-8 h-8 border border-gray-300 dark:border-gray-700 rounded shadow-sm group-hover/leaderboard-entry:shadow transition-shadow dark:opacity-90"
1716
/>
1817
{{/if}}
1918
</div>
2019

2120
{{#unless @isCollapsed}}
2221
{{#if this.isSkeleton}}
23-
<span class="text-xs inline-block rounded bg-gray-200 mr-2">{{#each (repeat 30)}}&nbsp;{{/each}}</span>
22+
<span class="text-xs inline-block rounded bg-gray-200 dark:bg-gray-800 mr-2">{{#each (repeat 30)}}&nbsp;{{/each}}</span>
2423
{{else}}
2524
<span
26-
class="text-xs text-gray-600 group-hover/leaderboard-entry:underline mr-2 flex-shrink truncate"
25+
class="text-xs text-gray-600 dark:text-gray-400 group-hover/leaderboard-entry:underline mr-2 flex-shrink truncate"
2726
data-test-username
2827
>{{@user.username}}</span>
2928
{{/if}}
@@ -35,35 +34,39 @@
3534
<div class="flex items-center flex-shrink-0">
3635
<span
3736
class="mr-2 text-xs font-bold
38-
{{if (eq @status 'evaluating') 'text-yellow-500' 'text-teal-500'}}
37+
{{if (eq @status 'evaluating') 'text-yellow-500 dark:text-yellow-600' 'text-teal-500 dark:text-teal-600'}}
3938
{{if @isForCurrentUser 'opacity-100' 'opacity-0'}}
4039
group-hover/leaderboard-entry:opacity-100 transition-opacity"
4140
data-test-progress-text
4241
>
4342
{{#if this.isSkeleton}}
44-
<span class="inline-block bg-gray-200">{{#each (repeat 6)}}&nbsp;{{/each}}</span>
43+
<span class="inline-block bg-gray-200 dark:bg-gray-800">{{#each (repeat 6)}}&nbsp;{{/each}}</span>
4544
{{else}}
4645
{{@progressNumerator}}
4746
/
4847
{{@progressDenominator}}
4948
{{/if}}
5049
</span>
5150
{{#if this.isSkeleton}}
52-
<div class="w-12 h-3.5 rounded bg-gray-200" />
51+
<div class="w-12 h-3.5 rounded bg-gray-200 dark:bg-gray-800" />
5352
{{else}}
5453
<div
55-
class="w-12 h-3.5 rounded flex overflow-hidden border group-hover/leaderboard-entry:bg-white transition-all
54+
class="w-12 h-3.5 rounded flex overflow-hidden border group-hover/leaderboard-entry:bg-white dark:group-hover/leaderboard-entry:bg-gray-800 transition-all
5655
{{if
5756
(eq @status 'evaluating')
58-
'bg-yellow-50 border-yellow-500 animate-pulse'
59-
'bg-teal-50 border-teal-500 group-hover/leaderboard-entry:shadow-sm'
57+
'bg-yellow-50 dark:bg-yellow-900/80 border-yellow-500 dark:border-yellow-700 animate-pulse'
58+
'bg-teal-50 dark:bg-teal-900/80 border-teal-500 dark:border-teal-700 group-hover/leaderboard-entry:shadow-sm'
6059
}}"
6160
data-test-progress-bar-container
6261
>
6362
{{!s Look like a tailwind 3.3.0 bug, from-0% and to-100% are required to make the gradient work }}
6463
<div
6564
class="bg-gradient-to-r from-0% to-100%
66-
{{if (eq @status 'evaluating') 'from-yellow-500 to-yellow-400' 'from-teal-500 to-teal-400'}}
65+
{{if
66+
(eq @status 'evaluating')
67+
'from-yellow-500 dark:from-yellow-600 to-yellow-400 dark:to-yellow-500'
68+
'from-teal-500 dark:from-teal-600 to-teal-400 dark:to-teal-600'
69+
}}
6770
transition-all"
6871
style={{this.progressBarWidthStyle}}
6972
>

app/components/leaderboard-entry.js

-16
This file was deleted.

app/components/leaderboard-entry.ts

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import Component from '@glimmer/component';
2+
import type UserModel from 'codecrafters-frontend/models/user';
3+
import { htmlSafe } from '@ember/template';
4+
5+
interface Signature {
6+
Element: HTMLAnchorElement;
7+
8+
Args: {
9+
progressDenominator: number;
10+
progressNumerator: number;
11+
route: string;
12+
routeModel: string;
13+
status: string;
14+
isForCurrentUser?: boolean;
15+
isCollapsed?: boolean;
16+
user: UserModel;
17+
};
18+
19+
Blocks: {
20+
afterUsername: [];
21+
};
22+
}
23+
24+
export default class LeaderboardEntryComponent extends Component<Signature> {
25+
get isSkeleton(): boolean {
26+
return !this.args.user;
27+
}
28+
29+
get progressBarWidthStyle() {
30+
return htmlSafe(`width: ${this.progressPercentage}%;`);
31+
}
32+
33+
get progressPercentage(): number {
34+
return 100 * (this.args.progressNumerator / this.args.progressDenominator);
35+
}
36+
}
37+
38+
declare module '@glint/environment-ember-loose/registry' {
39+
export default interface Registry {
40+
LeaderboardEntry: typeof LeaderboardEntryComponent;
41+
}
42+
}

app/services/dark-mode.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type LocalStorageService from 'codecrafters-frontend/services/local-stora
88
import FastBootService from 'ember-cli-fastboot/services/fastboot';
99
import RouteInfoMetadata, { RouteColorScheme } from 'codecrafters-frontend/utils/route-info-metadata';
1010

11-
const LOCAL_STORAGE_KEY = 'dark-mode-preference';
11+
const LOCAL_STORAGE_KEY = 'dark-mode-preference-v2';
1212

1313
export type LocalStoragePreference = 'system' | 'dark' | 'light' | null;
1414
export type SystemPreference = 'dark' | 'light';

0 commit comments

Comments
 (0)