- Replace the inline brand-upload-hint bar in RecipeDetailOverlay with a
confirm dialog (「去上传」/「取消」) that pops up when the card opens
- Extend useDialog/CustomDialog to support custom ok/cancel button text
- Add a 「← 返回配方卡片」banner in MyDiary brand tab when navigated
from a recipe card, allowing return without uploading
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add pendingAction callback to UI store. When user clicks favorite,
save-to-diary, or upload QR while not logged in, the action is stored
and automatically executed after successful login/register instead of
reloading the page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add en_name column to recipes table (migration in database.py)
- Include en_name in recipe API responses and RecipeUpdate model
- Save en_name when admin/senior_editor applies translation
- Load en_name on overlay open, so translation persists across sessions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Always show favorite/save-to-diary buttons (login check on click)
- Restrict translation editor to senior_editor/admin only (canManage)
- Fix save: map ingredient oil→oil_name for API, reload recipes after
- Ensures next open shows the saved data
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move action buttons (favorite, save-to-diary) inside card view so
they scroll with content instead of sticking at top
- Remove text-transform:uppercase so doTERRA renders correctly
- Fix English dilution text to match main branch (bottle vs single-use)
- Add close button to editor view header
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove "卡片预览" tab text, use top bar with action buttons
- Move language toggle (中文/English) to top of card view
- Fix favorite button: check recipe _id before toggling
- Fix save-to-diary: match API fields (name, source_recipe_id)
- Use custom translations in card rendering (getCardOilName/getCardRecipeName)
- Swap price columns: cost first, retail strikethrough after
- Add retail strikethrough price in total cost bar
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Card view: branded recipe card image (html2canvas), language toggle,
save image, copy text, favorite, save to diary, translation editor.
Editor view: volume/dilution controls, ingredient table with add row,
tag management with candidates, notes, total cost.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Restore the original modal popup (卡片预览/编辑 tabs) instead of
the inline detail panel, and bring back category carousel, personal
recipes, and favorites sections on the search page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- RecipeCard: simple card with name, tags, oil names, price (matching
original .recipe-card style with hover translateY and warm shadows)
- RecipeDetailOverlay: inline panel (not modal) with editable ingredients
table, add ingredient row, total cost bar, and card preview section
matching the original detail-panel + #recipe-card-export layout
- RecipeSearch: simplified layout with search box and grid, detail panel
appears inline below grid when a card is clicked
- Updated Cypress tests to match new component structure
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Grep pattern now matches full filenames (demo-walkthrough, visual-check)
- Updated all test files to use .oil-chip (new OilReference class name)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Notifications show inline in dropdown (not a separate route)
- Load from /api/notifications, show unread count badge
- Mark all read button
- Bug report form with /api/bug-report POST
- Both panels toggle in the dropdown
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>