Files
gui/apps/kitchen-sink/e2e/GroupPressTransitionMatrix.test.ts
zeekayandHanzo Dev 69c6e860d7 transplant onto tamagui v2.6.0, brand as a re-runnable transform
This repo could never sync. There was NO merge-base with tamagui — 372 commits
here against 15,791 there, unrelated histories — because it began as a
copy-paste rebrand with a flattened layout. Every "sync" since was a hand
re-application that drifted, which is why the tree sat on 7.3.1 while upstream
shipped fixes we then rediscovered by hand.

This commit's PARENT IS TAMAGUI. A future sync is `git merge tama/main` then
`node scripts/rebrand.mjs` — a real merge, because the history is now shared.

174 packages: 166 upstream, our 8 restored (chrome, shell, telemetry, recipes,
get, font-geist-{sans,mono}, @hanzo/booker), bento-get gained. 170/170 build.

Our patches to files UPSTREAM ALSO OWNS are carried, which the package-level
delta missed and which was where the value actually was:
  - useMedia's server snapshot (`initState ?? getMedia()`). Upstream still
    returns undefined there, so every Tamagui Dialog kills a prerender — the
    exact crash hanzo.app spent a day on.
  - data-slot on web host nodes, absent upstream entirely.
Both applied ONTO upstream's newer files (it rewrote useMedia +150/-63 and
createComponent +160/-55), marked `PATCH (ours, carried across the transplant)`.

Seven traps are encoded in scripts/rebrand.mjs, each found by a gate:
skip itself and lockfiles; special-case the double-branded names in BOTH scoped
and bare form; map path strings, not just paths; drop a level for the flattened
group; check disk rather than a stale index.

Rust build artifacts are NOT committed. An earlier draft of this commit swept
apps/desktop/src-tauri/target/debug in via `git add -A` — 3,859 files including
a 272MB .a, over GitHub's 100MB cap, so the push could never have landed. They
are gitignored now.

Co-Authored-By: Hanzo Dev <[email protected]>
2026-07-30 18:25:06 -07:00

85 lines
3.1 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Regression: $group-press stays stuck on children after release when the
* parent frame has `transition` and gestures end OFF the element.
*
* Only the specific sequence reproduces it:
* 1. finger DOWN on the pressable
* 2. finger moves OUTSIDE the pressable bounds while still down
* 3. finger UP (released off-element)
*
* A normal tap that releases on the element does NOT reproduce.
*
* Matrix covered (parentAnim × childAnim). `pa-cp` is the known bad cell;
* the others are included to pin down where the buggy behavior lives and
* catch regressions if the fix accidentally breaks another combination.
*/
import { by, element, expect as detoxExpect, waitFor } from 'detox'
import * as assert from 'assert'
import { remountDirectUseCase } from './utils/navigation'
import { safeLaunchApp } from './utils/detox'
import { getDominantColor, isBlueish, formatRGB } from './utils/colors'
const CELLS = ['pp-cp', 'pa-cp', 'pp-ca', 'pa-ca'] as const
async function pressDownDragOffAndRelease(cellId: string) {
// swipe downward on the cell to produce: press-down → move-off → release.
// swipe() only requires the source view to be hittable at its start
// point — no ambiguity about a drop target or cross-element visibility.
// start from the very top of the cell so the first portion of the swipe
// is still within the cell (gives press-in state time to dispatch to
// subscribers) before finger leaves bounds.
await element(by.id(`cell-${cellId}-frame`)).swipe(
'down',
'slow',
1.0, // full viewport traversal
0.5, // startX in cell
0.1 // startY near top of cell — maximizes in-cell travel distance
)
// give React + animation driver time to settle
await new Promise((r) => setTimeout(r, 500))
}
async function assertChildReturnedToDefault(cellId: string) {
// child bg should be blue (default), NOT red (press)
const bgPath = await element(by.id(`cell-${cellId}-child`)).takeScreenshot(
`${cellId}-child-after`
)
const bgColor = getDominantColor(bgPath)
assert.ok(
isBlueish(bgColor),
`cell ${cellId}: child did not revert to blue after release — got ${formatRGB(bgColor)}`
)
}
describe('GroupPressTransitionMatrix', () => {
beforeAll(async () => {
await safeLaunchApp({
newInstance: true,
launchArgs: { directUseCase: 'GroupPressTransitionMatrix' },
})
await waitFor(element(by.id('group-press-transition-matrix-root')))
.toExist()
.withTimeout(180000)
})
beforeEach(async () => {
await remountDirectUseCase('group-press-transition-matrix-root')
})
it('renders every cell and the release target', async () => {
for (const id of CELLS) {
await detoxExpect(element(by.id(`cell-${id}-frame`))).toExist()
await detoxExpect(element(by.id(`cell-${id}-child`))).toExist()
}
await detoxExpect(element(by.id('release-target'))).toExist()
})
for (const id of CELLS) {
it(`${id}: child reverts to default when press ends off-element`, async () => {
await pressDownDragOffAndRelease(id)
await assertChildReturnedToDefault(id)
})
}
})