Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
26701fa
feat: refine X repost cards in grid and list
tomeredlich Feb 17, 2026
e96137c
feat: refine social X repost UI consistency
tomeredlich Feb 17, 2026
f19016c
Merge remote-tracking branch 'origin/main' into feat/social-twitter-r…
tomeredlich Feb 17, 2026
61137a8
feat(shared): align X repost metadata across cards and modal
tomeredlich Feb 17, 2026
53f4697
Merge branch 'main' into feat/social-twitter-repost-preview
rebelchris Feb 17, 2026
61f3bc3
fix(shared): add explicit type for metadataBottomLabel in SocialTwitt…
github-actions[bot] Feb 17, 2026
695960c
feat(shared): align social repost metadata sizing and quote headers
tomeredlich Feb 18, 2026
dbe9af4
refactor(shared): dedupe social Twitter metadata helpers
tomeredlich Feb 18, 2026
45a7685
fix(shared): format social repost text helper call
tomeredlich Feb 18, 2026
32e859c
Merge branch 'main' into feat/social-twitter-repost-preview
rebelchris Feb 18, 2026
7ebb5dc
fix: basic cleanup
rebelchris Feb 18, 2026
d29c82d
Merge branch 'main' into feat/social-twitter-repost-preview
rebelchris Feb 18, 2026
406f2cc
fix: more cleanup
rebelchris Feb 18, 2026
de1f4ae
Merge remote-tracking branch 'origin/feat/social-twitter-repost-previ…
rebelchris Feb 18, 2026
42b61ab
fix: more cleanup
rebelchris Feb 18, 2026
2b70065
fix: some minor changes
rebelchris Feb 18, 2026
8855f4d
fix: card renders
rebelchris Feb 19, 2026
3a580c6
fix(shared): align social repost UI across feed and modal
tomeredlich Feb 20, 2026
cf862e5
fix(shared): address social Twitter review feedback
tomeredlich Feb 20, 2026
c7cd859
feat(shared): add streak progression system with animations and miles…
tomeredlich Feb 23, 2026
23cdb3e
feat(shared): add streak increment/broken popovers, milestone celebra…
tomeredlich Feb 24, 2026
51570e4
feat(shared): add animated milestone sparkles
tomeredlich Feb 24, 2026
1164089
feat(shared): enhance streak milestone claim and sponsored reward UX
tomeredlich Feb 25, 2026
8c366bb
feat(shared): add streak drawer mode and persistent milestone share o…
tomeredlich Feb 25, 2026
fd0ce2e
feat(shared): refine reading milestone tooltip actions
tomeredlich Feb 25, 2026
b3b1fdb
feat(shared): polish milestone timeline spacing and sponsored visuals
tomeredlich Feb 25, 2026
94ed765
feat(shared): polish streak modal interactions and responsive behavior
tomeredlich Feb 25, 2026
e663dba
feat(shared): align streak reminder and +1 progress popovers
tomeredlich Feb 26, 2026
05e2277
feat(shared): refine streak popup timeline behavior and debug controls
tomeredlich Feb 26, 2026
545ae99
feat(shared): redesign milestone cards around reward headlines
tomeredlich Feb 26, 2026
9795c1f
feat(shared): polish streak recover and milestone timeline UI
tomeredlich Feb 26, 2026
907a70d
feat(shared): add feed night hero for reading streak nudges
tomeredlich Feb 26, 2026
c8c0eae
feat(shared): add debug hero mode overrides
tomeredlich Feb 27, 2026
f9c1076
feat(shared): add glowing butterflies animation to morning hero
tomeredlich Feb 27, 2026
a1ef477
fix: move butterfly keyframes out of night-only block and enhance mor…
tomeredlich Feb 27, 2026
5c46ea1
fix(shared): polish streak claim flow and timeline interactions
tomeredlich Feb 27, 2026
d5c7f00
docs(shared): add streak feature animation automation assets
tomeredlich Feb 27, 2026
90f7611
Merge remote-tracking branch 'origin/main' into feat/streak-progressi…
tomeredlich Mar 1, 2026
d9c7bfd
fix(shared): unblock CI for streak milestone assets and tests
tomeredlich Mar 1, 2026
14b63c1
fix(shared): use streak hook value in recover preview fallback
tomeredlich Mar 1, 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
3 changes: 3 additions & 0 deletions packages/extension/__mocks__/fileMock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const mockFile = 'test-file-stub';

export default mockFile;
1 change: 1 addition & 0 deletions packages/extension/jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ module.exports = {
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
moduleNameMapper: {
'\\.svg$': '<rootDir>/__mocks__/svgrMock.ts',
'\\.(png|jpe?g|gif|webp|avif)$': '<rootDir>/__mocks__/fileMock.ts',
'\\.css$': 'identity-obj-proxy',
'react-markdown': '<rootDir>/__mocks__/reactMarkdownMock.tsx',
},
Expand Down
3 changes: 3 additions & 0 deletions packages/shared/__mocks__/fileMock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const mockFile = 'test-file-stub';

export default mockFile;
1 change: 1 addition & 0 deletions packages/shared/jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ module.exports = {
moduleNameMapper: {
'^node-emoji$': 'node-emoji/lib/index.cjs',
'\\.svg$': '<rootDir>/__mocks__/svgrMock.ts',
'\\.(png|jpe?g|gif|webp|avif)$': '<rootDir>/__mocks__/fileMock.ts',
'\\.css$': 'identity-obj-proxy',
'react-markdown': '<rootDir>/__mocks__/reactMarkdownMock.tsx',
'react-turnstile': 'identity-obj-proxy',
Expand Down
6 changes: 5 additions & 1 deletion packages/shared/src/components/MainFeedLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ import useCustomDefaultFeed from '../hooks/feed/useCustomDefaultFeed';
import { useSearchContextProvider } from '../contexts/search/SearchContext';
import { isDevelopment, isProductionAPI, webappUrl } from '../lib/constants';
import { useReadingReminderHero } from '../hooks/notifications/useReadingReminderHero';
import { FeedGreetingHero } from './streak/FeedGreetingHero';

const FeedExploreHeader = dynamic(
() =>
Expand Down Expand Up @@ -521,6 +522,8 @@ export default function MainFeedLayout({
}, [sortingEnabled, selectedAlgo, loadedSettings, loadedAlgo]);

const disableTopPadding = isFinder || shouldUseListFeedLayout;
const shouldShowFeedGreetingHero =
feedName === SharedFeedPage.MyFeed && !isSearchOn;
const shouldShowReadingReminderOnHomepage =
router.pathname === webappUrl && shouldShowReadingReminder;

Expand Down Expand Up @@ -568,7 +571,8 @@ export default function MainFeedLayout({
>
{isAnyExplore && <FeedExploreComponent />}
{isSearchOn && !isSearchPageLaptop && search}
{shouldShowReadingReminderOnHomepage && (
{shouldShowFeedGreetingHero && <FeedGreetingHero />}
{shouldShowReadingReminderOnHomepage && !shouldShowFeedGreetingHero && (
<ReadingReminderHero className="px-4 pb-2" onEnable={onEnable} />
)}
{shouldUseCommentFeedLayout ? (
Expand Down
2 changes: 1 addition & 1 deletion packages/shared/src/components/feeds/FeedNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ function FeedNav(): ReactElement {
shouldMountInactive
className={{
header: classNames(
'no-scrollbar overflow-x-auto px-2',
'no-scrollbar overflow-x-auto !bg-background-default px-2 tablet:!bg-background-default',
isSortableFeed && sortingEnabled && 'pr-28',
),
}}
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion packages/shared/src/components/layout/common.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ export const SearchControlHeader = ({
);

return (
<div className="flex w-full items-center justify-between tablet:mb-2 tablet:p-2">
<div className="mt-2 flex w-full items-center justify-between tablet:mb-2 tablet:p-2">
{wrapperChildren}

{isStreaksEnabled && (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,9 @@ it('Should have no cost for first time recovery', async () => {
expect(popupHeader).toBeInTheDocument();

// expect cost to be 0
const cost = screen.getByText('Restore my streakFree');
expect(cost).toBeInTheDocument();
const button = screen.getByTestId('streak-recover-button');
expect(button).toHaveTextContent(/Restore my streak/i);
expect(button).toHaveTextContent(/Free/i);
});

it('Should have cost of 100 Cores for 2nd+ time recovery', async () => {
Expand All @@ -285,8 +286,9 @@ it('Should have cost of 100 Cores for 2nd+ time recovery', async () => {
expect(popupHeader).toBeInTheDocument();

// expect cost to be 100
const cost = screen.getByText('Restore my streak100');
expect(cost).toBeInTheDocument();
const button = screen.getByTestId('streak-recover-button');
expect(button).toHaveTextContent(/Restore my streak/i);
expect(button).toHaveTextContent(/100/i);
});

it('Should show buy Cores message if user does not have enough Cores', async () => {
Expand Down
Loading