feat: Improve mobile experience by enabling card size sliders and long-press card previews.
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
# Mobile Long Press Card Preview
|
||||||
|
|
||||||
|
## Status
|
||||||
|
- [x] Research current implementation of `PackCard` and `CardPreview`
|
||||||
|
- [x] Implement long-press detection in `PackCard` (Found existing implementation in `CardPreview`)
|
||||||
|
- [x] Prevent default browser context menu on card images
|
||||||
|
- [x] Trigger preview on long-press only for small screens (or generally if touch)
|
||||||
|
- [x] Verify implementation
|
||||||
|
|
||||||
|
## Context
|
||||||
|
User reported that long-pressing a card on mobile opens the browser menu (download image context menu).
|
||||||
|
Goal: Long press should show the card preview instead.
|
||||||
|
|
||||||
|
## Implementation Details
|
||||||
|
- Modified `CardHoverWrapper` in `CardPreview.tsx` to prevent `contextmenu` event default behavior on mobile devices when an image is present.
|
||||||
|
- This ensures the custom long-press timer has time to trigger the preview without the system menu interfering.
|
||||||
|
- Logic uses `isMobile && hasImage` to target specific scenario.
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# Mobile Card Size Slider
|
||||||
|
|
||||||
|
## Status
|
||||||
|
- [x] Locate the card size slider component (`CubeManager` and `DraftView`)
|
||||||
|
- [x] Analyze why it is hidden on small screens (`hidden` utility classes)
|
||||||
|
- [x] Modify layout to ensure it is visible on mobile
|
||||||
|
- [x] Determine if layout adjustments are needed (Reduced width on `DraftView`)
|
||||||
|
- [x] Verify implementation (Code applied)
|
||||||
|
|
||||||
|
## Context
|
||||||
|
User reported that the card size adjustment bar is missing on small screens.
|
||||||
|
The fix was applied to both the Cube Manager (pack review) and Draft View (live drafting).
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
- **CubeManager.tsx**: Removed `hidden sm:flex` from the slider container. It is now always `flex`.
|
||||||
|
- **DraftView.tsx**: Removed `hidden md:flex` and adjusted width to `w-24 md:w-32` to fit better on small screens.
|
||||||
@@ -192,8 +192,10 @@ export const CardHoverWrapper: React.FC<{ card: DraftCard; children: React.React
|
|||||||
onTouchEnd={handleTouchEnd}
|
onTouchEnd={handleTouchEnd}
|
||||||
onTouchMove={handleTouchMove}
|
onTouchMove={handleTouchMove}
|
||||||
onContextMenu={(e) => {
|
onContextMenu={(e) => {
|
||||||
// Prevent context menu if we are long pressing to view card
|
// Prevent context menu to allow long-press preview without browser menu
|
||||||
if (isLongPressing) {
|
// We block it if we are on mobile (trying to open preview)
|
||||||
|
// OR if we are already in long-press state.
|
||||||
|
if ((isMobile && hasImage) || isLongPressing) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -671,13 +671,13 @@ export const CubeManager: React.FC<CubeManagerProps> = ({ packs, setPacks, onGoT
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
{/* Size Slider */}
|
{/* Size Slider */}
|
||||||
<div className="flex items-center gap-2 bg-slate-800 rounded-lg px-2 py-1 border border-slate-700 h-9 mr-2 hidden sm:flex">
|
<div className="flex items-center gap-2 bg-slate-800 rounded-lg px-2 py-1 border border-slate-700 h-9 mr-2 flex">
|
||||||
<div className="w-3 h-4 rounded border border-slate-500 bg-slate-700" title="Small Cards" />
|
<div className="w-3 h-4 rounded border border-slate-500 bg-slate-700" title="Small Cards" />
|
||||||
<input
|
<input
|
||||||
type="range"
|
type="range"
|
||||||
min="100"
|
min="100"
|
||||||
max="300"
|
max="300"
|
||||||
step="10"
|
step="1"
|
||||||
value={cardWidth}
|
value={cardWidth}
|
||||||
onChange={(e) => setCardWidth(parseInt(e.target.value))}
|
onChange={(e) => setCardWidth(parseInt(e.target.value))}
|
||||||
className="w-24 accent-purple-500 cursor-pointer h-1.5 bg-slate-600 rounded-lg appearance-none"
|
className="w-24 accent-purple-500 cursor-pointer h-1.5 bg-slate-600 rounded-lg appearance-none"
|
||||||
|
|||||||
@@ -113,13 +113,13 @@ export const DraftView: React.FC<DraftViewProps> = ({ draftState, currentPlayerI
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Card Scalar */}
|
{/* Card Scalar */}
|
||||||
<div className="hidden md:flex flex-col gap-1 w-32">
|
<div className="flex flex-col gap-1 w-24 md:w-32">
|
||||||
<label className="text-[10px] text-slate-500 uppercase font-bold tracking-wider">Card Size</label>
|
<label className="text-[10px] text-slate-500 uppercase font-bold tracking-wider">Card Size</label>
|
||||||
<input
|
<input
|
||||||
type="range"
|
type="range"
|
||||||
min="0.5"
|
min="0.5"
|
||||||
max="1.5"
|
max="1.5"
|
||||||
step="0.1"
|
step="0.01"
|
||||||
value={cardScale}
|
value={cardScale}
|
||||||
onChange={(e) => setCardScale(parseFloat(e.target.value))}
|
onChange={(e) => setCardScale(parseFloat(e.target.value))}
|
||||||
className="w-full h-1 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-emerald-500"
|
className="w-full h-1 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-emerald-500"
|
||||||
|
|||||||
Reference in New Issue
Block a user