feat(email): pre-launch marketing campaign for waitlist#356
Open
h4yfans wants to merge 1517 commits into
Open
Conversation
- Improved the `isExtractErrorMessageCall` function for better readability. - Clarified ESLint rule descriptions. - Adjusted button formatting in the Example component to align with internationalization standards.
…styles - Further refined the `isExtractErrorMessageCall` function for improved clarity. - Updated ESLint rule descriptions for better understanding. - Enhanced button styles in the Example component to ensure consistency with internationalization practices.
Adds title, openInInbox, unsnoozeNow, and reschedule keys under phaseI.inboxSnoozePopover for the snoozed inbox item popover on the calendar (chip-click action).
Renders a small floating popover for snoozed inbox items with three actions: open in inbox, unsnooze now, reschedule (via SnoozePicker). Mirrors the positioning/dismiss pattern of CalendarEventPopover but stays presentational — receives data + callbacks, fires callbacks. Outside-click handler explicitly ignores Radix popper portals so nesting SnoozePicker (DropdownMenu + Dialog) doesn't dismiss the popover mid-interaction.
Adds popover state slot, three action handlers (open in inbox via useTabActions.openTab, unsnooze, reschedule via inboxService), and prop passthrough to CalendarShell. Navigation uses tab system (openTab) since the renderer doesn't ship react-router; openTab dedups singleton tabs (inbox is one) so the existing inbox tab is focused if open. Typecheck will fail until CalendarShell props are extended in the next commit (Task 4).
Extends CalendarShellProps with the inboxSnoozePopoverState slot and five callbacks. Renders the popover when state is non-null, mirroring the existing event popover render path. Adds @/contexts/tabs mock to calendar-page.test.tsx and calendar-quick-create.test.tsx so they don't crash on the new useTabActions() call introduced in CalendarPage.
Three Playwright specs against the built bundle, seeded via the existing __memryTestHooks.seedCalendarProjection hook (which already creates a snoozed inbox item): - Click chip opens the popover with all three action buttons; Escape dismisses it. - Unsnooze now closes the popover and removes the chip from the calendar (cache invalidation works). - Open in inbox tears down the calendar surface (singleton inbox tab takes over the active group).
extractErrorMessage requires the fallback to come from t() (lint rule i18n/no-error-fallback-literal). Adds two phaseI.errors keys — couldNotUnsnoozeInboxItem, couldNotRescheduleInboxItem — and uses getI18n().getFixedT(null, 'calendar') in the new handlers, matching the pattern used by the existing event handlers in this file.
Commit d1228ee (chore(i18n): migrate updater dialogs, tab menu, and tag toasts) updated tag rename/delete toast strings to use the new i18n templates ('Renamed "x" to "y"' and 'Deleted "x" from N items') but did not refresh the corresponding test assertions in tag-detail-view.test.tsx, leaving main red. Update both assertions to match the rendered i18n output for the test's fixture (count=0). No source change.
Both branches added per-sourceType branches to handleSelectItem in calendar.tsx (main: 'task' popover; this branch: 'inbox_snooze' popover) and a corresponding popover state hook. Conflict was on the popover state declarations. Resolution: - Keep both inboxSnoozePopoverState and taskPopoverState as independent state hooks; keep useTabActions/openTab needed by the inbox-snooze "Open in inbox" handler. - Make handleSelectItem clear the two sibling states whenever it opens any of the three popovers — pre-merge each branch only knew about one sibling, so the merged switch could leave two popovers visible at once across calendar.tsx and calendar-shell.tsx. - Extend selectedItemId to also fall through to inboxSnoozePopoverState, matching the visual-selection contract main introduced for tasks. Verified: pnpm typecheck:web clean, 144/144 calendar vitest tests pass.
The committed snapshot drifted from the generator output (likely after
the generator's TypeScript printer settings changed). Channel set is
identical (333 channels in both versions) — diff is purely quote style
('foo' -> "foo") and collapsing multi-line generic types onto single
lines. Verified by sorting and diffing the channel-name lists from both
files: zero differences.
This drift was pre-existing on main and was failing CI's typecheck job
on every PR (the pre-typecheck hook runs 'pnpm ipc:check' which calls
'generate-ipc-invoke-map.js --check'). Regenerating unblocks both this
PR's CI and main CI.
Verified locally: 'pnpm typecheck' (full pipeline incl. pre-hook) clean.
feat(calendar): make inbox-snooze chips clickable with action popover
…ons and remove completion checkbox - Integrated status icons into CalendarTaskPopoverHeader, replacing the checkbox for task completion. - Updated tests to reflect changes in rendering and interaction with task statuses. - Removed unused props and streamlined the component's structure for better readability.
- Replaced useEffect with direct state updates during render in multiple components to avoid unnecessary re-renders and improve performance. - Updated components such as AuthorAvatar, ColumnHeader, and FilterBuilder to handle state changes more efficiently. - Introduced useLayoutEffect in appropriate places to ensure layout-related updates occur synchronously. - Enhanced user experience by ensuring focus and selection behaviors are handled more intuitively across input fields and dropdowns.
…g click functionality - Added project color display in CalendarTaskPopoverMeta for better visual identification of tasks. - Implemented onTagClick functionality to allow users to drill down into tags directly from the popover. - Updated CalendarTaskPopover to handle tag clicks and maintain popover state. - Refactored related tests to ensure new features are covered and existing functionality remains intact.
Raise React Doctor score
…ring sanitization' Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Raise desktop and sync-server test coverage
test: add desktop E2E coverage
…ult-mcp # Conflicts: # apps/desktop/src/renderer/src/pages/settings/settings-page.i18n.test.tsx
feat: agent chat P1 — vault MCP server
…n-storage feat: agent chat P2 conversation storage
Agent Chat P3: Chat UI and runtime orchestration
Support vertical split view parity
test(e2e): add desktop workflow coverage
Fix vault key initialization
Improve Agent Chat UI
…t, updating conversation ID handling, and improving conversation creation logic. Add new component for blocks-so and adjust tests accordingly.
Remove highlight reminder popover
Eleven-email drip series for the 400-person Memry waitlist, sent over eight weeks via Resend. Built with React Email. Voice follows the Capacities prosumer/calm reference: one feature per email, hero plus inline screenshots, no marketing varnish. Standalone package at email/, outside the pnpm workspace so marketing infra ships independently of the desktop app. - Shared components: Layout, Eyebrow, HeroImage, InlineImage, Signoff, Footer, constants, styles - 11 emails: introduction, notes (+E2E), inbox, tasks, journal (+sync), projects+calendar, AI agent, graph, offline, launch-week recap, launch-day with download buttons - scripts/send.ts with three modes: --to (test send), --audience (broadcast create), --export (render to HTML + plaintext) Verified: pnpm typecheck clean, all 11 emails render via send --export to 7.8 to 11 KB HTML each (well under Gmail clip threshold).
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
email/outside the pnpm workspace so marketing infra ships independently of the desktop appCadence
Schedule: 1/week W1–W6, 2/week W7, 3 emails W8 (launch week intensity).
Layout
Verified
pnpm install --ignore-workspace— 240 packages installedpnpm typecheck— 0 errorspnpm send <slug> --export— all 11 emails render to HTML (7.8–11 KB each) + plaintextTest plan
cd email && cp .env.example .envand fill in real Resend credentialspnpm dev— visually QA every email at http://localhost:3000placehold.coURLs with real product screenshots before each weekly sendpnpm send 01-introduction --to <your-email>— verify transactional send workspnpm send 01-introduction --audience— verify broadcast appears in Resend dashboard (no auto-send)components/styles.tsfor brand palette if neededNotes for reviewers
stop-sloprules: no em-dashes, no adverbs, no throat-clearing, active voice, varied rhythm. Worth a read-through.--audiencedefaults to create broadcast only, not send.--send-nowis the explicit blast flag to prevent fat-finger blasts.email/.env.exampleusesyour-resend-api-keyplaceholder (passes the repo secret scanner allowlist).pnpm-workspace.yaml) means root-levelpnpm installskips it. Usepnpm install --ignore-workspaceinsideemail/to set it up.