Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
80ca725
feat: weekly tech-news quiz (arcade leaderboard game)
tomeredlich Jul 29, 2026
68ea965
feat(weekly-quiz): add ?weekly-quiz-demo preview mode
tomeredlich Jul 29, 2026
901741b
feat(weekly-quiz): standalone /weekly-quiz-preview page
tomeredlich Jul 29, 2026
cdad147
fix(weekly-quiz): fill modal width so panels don't squeeze
tomeredlich Jul 29, 2026
44b3a37
fix(weekly-quiz): narrow modal to 52rem to match approved size
tomeredlich Jul 29, 2026
435bc9f
fix(weekly-quiz): strip Modal default background so surface isn't fra…
tomeredlich Jul 29, 2026
f533059
fix(weekly-quiz): always show logged-in player's own rank on the intr…
tomeredlich Jul 29, 2026
4abaa5b
feat(weekly-quiz): re-skin surface to daily.dev purple
tomeredlich Jul 29, 2026
330d91f
feat(weekly-quiz): show week date-range and source/story counts on intro
tomeredlich Jul 29, 2026
a4ff62a
feat(weekly-quiz): accessibility pass on the scoreboard
tomeredlich Jul 29, 2026
fb42913
feat(weekly-quiz): show top sources on the intro
tomeredlich Jul 29, 2026
80d095c
feat(weekly-quiz): redesign share image and add 'challenge your team'…
tomeredlich Jul 29, 2026
57ff4b7
feat(weekly-quiz): new dog-mascot logo, source logos, purple/orange S…
tomeredlich Jul 29, 2026
264767f
feat(weekly-quiz): use real daily.dev source logos, keep +N inline
tomeredlich Jul 29, 2026
8c78c70
feat(weekly-quiz): make results screen achievement-focused
tomeredlich Jul 29, 2026
4ea4651
chore(weekly-quiz): populate demo leaderboard with real public users
tomeredlich Jul 29, 2026
35d6b16
feat(weekly-quiz): enlarge intro logo (w-56 -> w-72)
tomeredlich Jul 29, 2026
fc02369
feat(weekly-quiz): move Start button above the date/context on the intro
tomeredlich Jul 29, 2026
5371e0a
feat(weekly-quiz): horizontal pressable social buttons + fix leaderbo…
tomeredlich Jul 29, 2026
85b4589
feat(weekly-quiz): stack intro social buttons vertically, full-width
tomeredlich Jul 29, 2026
d31d2f2
feat(weekly-quiz): 50-user demo board, period aggregation, scroll to #50
tomeredlich Jul 29, 2026
1ae5c08
feat(weekly-quiz): rework results screen + flatten leaderboard chrome
tomeredlich Jul 29, 2026
27a7a2b
feat(weekly-quiz): make results 'Share your result' button green
tomeredlich Jul 29, 2026
a0065d8
fix(weekly-quiz): fill leaderboard height + top-align preview modal
tomeredlich Jul 29, 2026
4754291
style(weekly-quiz): bump intro social button text to match leaderboar…
tomeredlich Jul 29, 2026
6b67fb0
fix(weekly-quiz): fix share image layout for the square mascot logo
tomeredlich Jul 29, 2026
3230445
feat(weekly-quiz): restyle foundation to daily.dev design system
tomeredlich Aug 3, 2026
f277b4c
feat(weekly-quiz): focus intro on the challenge, move leaderboard to …
tomeredlich Aug 3, 2026
52256f2
feat(weekly-quiz): two-column intro — logo left, content right
tomeredlich Aug 3, 2026
c967692
feat(weekly-quiz): swap intro columns — content left, logo right
tomeredlich Aug 3, 2026
3574a02
feat(weekly-quiz): animated logo aura, Start-button pulse, intro copy…
tomeredlich Aug 3, 2026
8f0d587
feat(weekly-quiz): new mascot logo, larger title, reorder intro, move…
tomeredlich Aug 3, 2026
d271468
style(weekly-quiz): less rounded corners on the intro date pill
tomeredlich Aug 3, 2026
f3e851b
feat(weekly-quiz): force dark theme for the quiz
tomeredlich Aug 3, 2026
538103d
feat(weekly-quiz): purple Start button, hover pop animation, 5s count…
tomeredlich Aug 3, 2026
ef0b032
feat(weekly-quiz): results Share button matches the Start button + sh…
tomeredlich Aug 3, 2026
5d5bc2f
feat(weekly-quiz): dark-themed share image with daily.dev logo + avat…
tomeredlich Aug 3, 2026
931cb9e
chore(weekly-quiz): compress logo/trophy assets
tomeredlich Aug 3, 2026
24fa02d
feat(weekly-quiz): falling papers behind logo + inline challenge link…
tomeredlich Aug 3, 2026
784a51e
chore(weekly-quiz): add a Results Storybook story to review the end s…
tomeredlich Aug 3, 2026
0357838
fix(weekly-quiz): darken results score circles for legible text
tomeredlich Aug 3, 2026
7086ab9
fix(weekly-quiz): papers fall from the surface top edge, no stuck fra…
tomeredlich Aug 3, 2026
4978749
fix(weekly-quiz): demo returns a viewer rank so the preview results s…
tomeredlich Aug 3, 2026
99830cd
feat(weekly-quiz): one-shot confetti burst on the results screen
tomeredlich Aug 3, 2026
6b43eaf
feat(weekly-quiz): BuzzFeed-style results — persona title, score ring…
tomeredlich Aug 3, 2026
a448fc6
feat(weekly-quiz): results polish — dual rings, dev-level titles, sin…
tomeredlich Aug 3, 2026
aa3072a
style(weekly-quiz): smaller, centered result GIF
tomeredlich Aug 3, 2026
9cef75e
feat(weekly-quiz): richer share image, single ring + time chip, 640 r…
tomeredlich Aug 3, 2026
5e5c0e2
feat(weekly-quiz): cap the whole quiz at 640px width
tomeredlich Aug 3, 2026
b8cefa2
feat(weekly-quiz): welcome 768px, persistent daily.dev logo, purple c…
tomeredlich Aug 4, 2026
b622500
feat(weekly-quiz): full daily.dev logo lockup in the header, smaller …
tomeredlich Aug 4, 2026
5a0e261
feat(weekly-quiz): odometer-style count-up on results stats and leade…
tomeredlich Aug 4, 2026
d0f8eb0
feat(weekly-quiz): gold bar on the viewer's leaderboard row, floating…
tomeredlich Aug 4, 2026
dd15c32
chore(weekly-quiz): export score tiers and add a Storybook gallery of…
tomeredlich Aug 4, 2026
398407a
chore(weekly-quiz): Storybook gallery of entry-point concepts (feed +…
tomeredlich Aug 4, 2026
dab0676
style(weekly-quiz): drop the background on the intro Share/reminder b…
tomeredlich Aug 4, 2026
0751bc1
feat(weekly-quiz): intro top bar with week pill, one-line bordered ac…
tomeredlich Aug 4, 2026
4174337
style(weekly-quiz): lighter (tertiary) button borders + top-bar botto…
tomeredlich Aug 4, 2026
3edab46
feat(weekly-quiz): smooth papers speed-up on Start hover, two floatin…
tomeredlich Aug 4, 2026
3b16215
feat(weekly-quiz): question progress + timer move to the top bar, log…
tomeredlich Aug 4, 2026
8878eef
style(weekly-quiz): keep the logo on the left of the question top bar
tomeredlich Aug 4, 2026
e2dd73a
revert(weekly-quiz): move the question progress bar + timer back into…
tomeredlich Aug 4, 2026
2bd4c3f
feat(weekly-quiz): redesign the downloadable share image + 4 Storyboo…
tomeredlich Aug 4, 2026
c031ef0
feat(weekly-quiz): use the daily.dev lockup (not the mascot) on the s…
tomeredlich Aug 4, 2026
b581971
feat(weekly-quiz): download uses the centered variant; drop the foote…
tomeredlich Aug 4, 2026
6fe0099
style(weekly-quiz): add breathing room between the GIF and footer on …
tomeredlich Aug 4, 2026
d6f27a5
refactor(weekly-quiz): results loses the outer surface; brand header …
tomeredlich Aug 4, 2026
decde5f
style(weekly-quiz): opaque result panels, drop the surrounding backdrop
tomeredlich Aug 4, 2026
9014f17
feat(weekly-quiz): per-score Open Graph social cards + generator
tomeredlich Aug 4, 2026
b546f84
feat(weekly-quiz): simplify the social card — GIF + level + range + o…
tomeredlich Aug 4, 2026
fce993e
chore(weekly-quiz): Storybook mockups of 3 mobile welcome-screen layouts
tomeredlich Aug 4, 2026
9fe2112
chore(weekly-quiz): mobile mockups for countdown / question / final s…
tomeredlich Aug 4, 2026
67773db
chore(weekly-quiz): mobile mocks — daily.dev logo on question, wrap l…
tomeredlich Aug 4, 2026
b3e2c6a
chore(weekly-quiz): use real colored social icons in the mobile final…
tomeredlich Aug 4, 2026
1c20f17
chore(weekly-quiz): bring web final-screen elements into the mobile mock
tomeredlich Aug 4, 2026
6ae9958
feat(weekly-quiz): full-bleed mobile layout with controls inside the …
tomeredlich Aug 4, 2026
34e82bd
feat(weekly-quiz): move the week pill above the title on mobile
tomeredlich Aug 5, 2026
f1a4a4a
chore(weekly-quiz): move the mobile week pill under the title
tomeredlich Aug 5, 2026
3cd7b1e
feat(weekly-quiz): full-screen mobile polish across the game screens
tomeredlich Aug 5, 2026
30aa28e
feat(weekly-quiz): show only the first name in the leaderboard on mobile
tomeredlich Aug 5, 2026
0435004
fix(weekly-quiz): make the results header match the intro top bar
tomeredlich Aug 5, 2026
2fd3a07
fix(weekly-quiz): include invite text in the share + use a working link
tomeredlich Aug 5, 2026
750eff6
feat(weekly-quiz): attach the premade result image to the native share
tomeredlich Aug 5, 2026
90f9a2b
feat(weekly-quiz): route social buttons through native share on mobile
tomeredlich Aug 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/shared/src/components/MainFeedLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { useFeeds } from '../hooks/feed/useFeeds';
import { WebappShortcutsRow } from '../features/shortcuts/components/WebappShortcutsRow';
import { LiveStandupsStrip } from './liveRooms/LiveStandupsStrip';
import { AskSearchBanner } from './marketing/banners/AskSearchBanner';
import { WeeklyQuizBanner } from '../features/weeklyQuiz/components/WeeklyQuizBanner';
import { FeedEngagementBanner } from './brand/FeedEngagementBanner';
import FeedContext from '../contexts/FeedContext';
import feedStyles from './Feed.module.css';
Expand Down Expand Up @@ -803,6 +804,7 @@ export default function MainFeedLayout({
>
<FeedEngagementBanner className="mb-3" />
</div>
{isHomePage && <WeeklyQuizBanner className="mx-4 mb-4 laptop:mx-0" />}
{isHomePage && (
<LiveStandupsStrip className="mx-0 mb-3 tablet:mx-2 laptop:mx-0" />
)}
Expand Down
7 changes: 7 additions & 0 deletions packages/shared/src/components/icons/Swords/filled.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions packages/shared/src/components/icons/Swords/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { ReactElement } from 'react';
import React from 'react';
import type { IconProps } from '../../Icon';
import Icon from '../../Icon';
import OutlinedIcon from './outlined.svg';
import FilledIcon from './filled.svg';

export const SwordsIcon = (props: IconProps): ReactElement => (
<Icon {...props} IconPrimary={OutlinedIcon} IconSecondary={FilledIcon} />
);
7 changes: 7 additions & 0 deletions packages/shared/src/components/icons/Swords/outlined.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions packages/shared/src/components/icons/VolumeLow/filled.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions packages/shared/src/components/icons/VolumeLow/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { ReactElement } from 'react';
import React from 'react';
import type { IconProps } from '../../Icon';
import Icon from '../../Icon';
import OutlinedIcon from './outlined.svg';
import FilledIcon from './filled.svg';

export const VolumeLowIcon = (props: IconProps): ReactElement => (
<Icon {...props} IconPrimary={OutlinedIcon} IconSecondary={FilledIcon} />
);
7 changes: 7 additions & 0 deletions packages/shared/src/components/icons/VolumeLow/outlined.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions packages/shared/src/components/icons/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,9 @@ export * from './Upvote';
export * from './User';
export * from './UserShare';
export * from './V';
export * from './Swords';
export * from './Volume';
export * from './VolumeLow';
export * from './VolumeOff';
export * from './Warning';
export * from './Whatsapp';
Expand Down
8 changes: 8 additions & 0 deletions packages/shared/src/components/modals/common.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,13 @@ const PostImpressionsModal = dynamic(
),
);

const WeeklyQuizModal = dynamic(
() =>
import(
/* webpackChunkName: "weeklyQuizModal" */ '../../features/weeklyQuiz/components/WeeklyQuizModal'
),
);

export const modals = {
[LazyModal.SquadMember]: SquadMemberModal,
[LazyModal.UpvotedPopup]: UpvotedPopupModal,
Expand Down Expand Up @@ -611,6 +618,7 @@ export const modals = {
[LazyModal.ReaderExtensionInstall]: ReaderExtensionInstallModal,
[LazyModal.ReaderPreview]: ReaderPreviewLazyModal,
[LazyModal.PostImpressions]: PostImpressionsModal,
[LazyModal.WeeklyQuiz]: WeeklyQuizModal,
};

type GetComponentProps<T> = T extends
Expand Down
1 change: 1 addition & 0 deletions packages/shared/src/components/modals/common/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ export enum LazyModal {
ReaderExtensionInstall = 'readerExtensionInstall',
ReaderPreview = 'readerPreview',
PostImpressions = 'postImpressions',
WeeklyQuiz = 'weeklyQuiz',
}

export type ModalTabItem = {
Expand Down
20 changes: 20 additions & 0 deletions packages/shared/src/components/widgets/SocialShareList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ interface SocialShareListProps {
onNativeShare(): void;
onClickSocial(provider: ShareProvider): void;
shortenUrl?: boolean;
// When set and the device can share files (mobile), the social buttons open
// the native share sheet with this image attached instead of the platform's
// web intent — the only client-side way to share a real image (web intents
// carry text + link only). Email/Copy keep their dedicated behavior.
nativeShareFile?: File | null;
}

export function SocialShareList({
Expand All @@ -39,13 +44,28 @@ export function SocialShareList({
onNativeShare,
onClickSocial,
shortenUrl = true,
nativeShareFile,
}: SocialShareListProps): ReactElement {
const { getShortUrl } = useGetShortUrl();

const openShareLink = async (provider: ShareProvider) => {
onClickSocial(provider);

const isEmailShare = provider === ShareProvider.Email;
// On mobile, route the platform buttons through the native share sheet so
// the image rides along (web intents can't attach files). Called with no
// prior await to stay inside the tap gesture. Email keeps its mailto.
if (
!isEmailShare &&
nativeShareFile &&
globalThis.navigator?.canShare?.({ files: [nativeShareFile] })
) {
navigator
.share({ text: `${description} ${link}`, files: [nativeShareFile] })
.catch(() => undefined);
return;
}

const shortLink = shortenUrl ? await getShortUrl(link) : link;
const shareLink = getShareLink({
provider,
Expand Down
Loading