Stage 17 (contour round 4a): quick fixes
CI / changes (pull_request) Successful in 1s
CI / unit (pull_request) Successful in 8s
CI / integration (pull_request) Successful in 12s
CI / ui (pull_request) Successful in 27s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m6s
CI / changes (pull_request) Successful in 1s
CI / unit (pull_request) Successful in 8s
CI / integration (pull_request) Successful in 12s
CI / ui (pull_request) Successful in 27s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m6s
- #4 bag label: '{n} in the bag' / 'Bag is empty' (was 'Bag {n}') - #6 allow a single trailing dot in display names (backend + UI regex + tests) - #1 double-tap zooms toward the tapped cell, not the top-left - #8 shuffle fires a short multi-pulse haptic - #11 highlighted/flashing tiles darken their bottom edge too (shadow joins the flash) - #13 toast slides up from the bottom and fades out - #7 hide the logout button (kept wired behind `hidden`) - #16 admin game seats: left-align numeric columns, clarify the 'Hints used' header
This commit is contained in:
@@ -33,7 +33,7 @@
|
||||
locale: Locale;
|
||||
focus: { row: number; col: number } | null;
|
||||
oncell: (row: number, col: number) => void;
|
||||
ontogglezoom: () => void;
|
||||
ontogglezoom: (row: number, col: number) => void;
|
||||
} = $props();
|
||||
|
||||
const Z = 1.85;
|
||||
@@ -65,7 +65,7 @@
|
||||
function onTap(row: number, col: number) {
|
||||
const now = Date.now();
|
||||
if (now - lastTap < 300) {
|
||||
ontogglezoom();
|
||||
ontogglezoom(row, col); // zoom toward the double-tapped cell, not the top-left
|
||||
lastTap = 0;
|
||||
return;
|
||||
}
|
||||
@@ -172,6 +172,9 @@
|
||||
}
|
||||
.cell.hl {
|
||||
background: var(--tile-recent);
|
||||
/* The bottom edge goes darker than the highlighted fill (not lighter, as the plain
|
||||
--tile-edge would), so the tile still reads as raised. */
|
||||
box-shadow: inset 0 -2px 0 rgba(0, 0, 0, 0.32);
|
||||
}
|
||||
.cell.flash {
|
||||
/* Two flashes to draw the eye, then settle back to normal so it does not distract. */
|
||||
@@ -181,9 +184,11 @@
|
||||
0%,
|
||||
100% {
|
||||
background: var(--tile-bg);
|
||||
box-shadow: inset 0 -2px 0 var(--tile-edge);
|
||||
}
|
||||
50% {
|
||||
background: var(--tile-recent);
|
||||
box-shadow: inset 0 -2px 0 rgba(0, 0, 0, 0.32);
|
||||
}
|
||||
}
|
||||
/* cqw fonts are sized against the fixed viewport, so labels stay a constant size as
|
||||
|
||||
@@ -324,6 +324,8 @@
|
||||
[r[i], r[j]] = [r[j], r[i]];
|
||||
}
|
||||
placement = newPlacement(r);
|
||||
// A short "shake": a few quick light taps rather than one.
|
||||
for (let i = 0; i < 4; i++) setTimeout(() => telegramHaptic('light'), i * 55);
|
||||
}
|
||||
function openExchange() {
|
||||
resetPlacement();
|
||||
@@ -509,13 +511,13 @@
|
||||
locale={app.locale}
|
||||
{focus}
|
||||
oncell={onCell}
|
||||
ontogglezoom={() => { if (!gameOver) zoomed = !zoomed; }}
|
||||
ontogglezoom={(r, c) => { focus = { row: r, col: c }; if (!gameOver) zoomed = !zoomed; }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="status">
|
||||
<span>{t('game.bag', { n: view.bagLen })}</span>
|
||||
<span>{view.bagLen === 0 ? t('game.bagEmpty') : t('game.bag', { n: view.bagLen })}</span>
|
||||
{#if gameOver}
|
||||
<strong class="over">{t('game.over')} — {resultText()}</strong>
|
||||
{:else}
|
||||
|
||||
Reference in New Issue
Block a user