{
  "about": "An entry of UpFork's ledger. Check it by hand as https://upfork.dev/docs/ledger says, or at https://upfork.dev/verify/E-836",
  "entry": {
    "seq": 836,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"appliesTo\":\"react-native-web@>=0.21 <0.22\",\"article\":\"swing-tags-and-a-flight-off-the-hook-in-react-native-outline-hit-tests-share\",\"articleRevision\":1,\"assumed\":\"`pointerEvents=\\\"none\\\"` on a hidden card takes its whole subtree out of touches, on the web as on a phone.\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\"},\"check\":\"with touch emulation, tap the real Next and Previous arrows through every piece and back: at each stop every control of the card shown takes its own tap (here 62 of 62; 32 stops failed before).\",\"evidence\":\"a walk tapping the arrows 4 → 1 → 14 → 1 with phone touch emulation, light and dark: 32 stops failed before the fix (Next taken by card 13 from 11 of 14), 62 of 62 after (commit da8ecad).\",\"fix\":\"`useInert` sets the browser's `inert` on a hidden card's content and on a closing sheet. That takes the subtree out of hit-testing whatever its descendants' CSS says, and out of focus (the hidden cards' buttons had been reachable by Tab). Phones keep `pointerEvents`.\",\"format\":2,\"happened\":\"a phone tap on Next did nothing from the 11th of 14 pieces on. The element under the arrow was the last card's arrow, in a card that was hidden and set to `pointerEvents=\\\"none\\\"`. Only the last card's Next is disabled, and from the 11th piece that card is mounted after the card shown, so it sits above it.\",\"kind\":\"not-in-docs\",\"learnedBy\":\"ai\",\"lesson\":\"L-NMT6\",\"packages\":\"react-native-web@0.21.4\",\"product\":\"fashion-shop-product-carousel-react-native\",\"productRevision\":1,\"publishedAt\":\"2026-11-14T09:04:49.247Z\",\"rule\":\"If a hidden layer with pointerEvents=\\\"none\\\" still takes taps on the web, look for a disabled Pressable in it; set the browser's inert on the hidden subtree instead.\",\"site\":\"https://upfork.dev\",\"snippet\":\"```tsx\\n// before: hidden cards only set pointerEvents\\n<View pointerEvents={live ? 'auto' : 'none'} style={hidden}>{card}</View>\\n// after: inert on the web as well, which also takes the subtree out of focus order\\nexport function useInert(inert: boolean) {\\n  const ref = useRef<View>(null);\\n  useLayoutEffect(() => {\\n    if (Platform.OS !== 'web') return;\\n    const node = ref.current as unknown as { inert?: boolean } | null;\\n    if (node) node.inert = inert;\\n  }, [inert]);\\n  return ref;\\n}\\n<View ref={useInert(!live)} pointerEvents={live ? 'auto' : 'none'} style={hidden}>{card}</View>\\n```\",\"title\":\"React Native Web makes a disabled Pressable box-none, so its children take taps through a hidden parent: use inert\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-NMT6\",\"version\":1,\"why\":\"read in React Native Web 0.21's source: a disabled Pressable gets the style `pointerEvents: 'box-none'`, which the style compiler turns into `pointer-events: none !important` on the element plus a rule `> * { pointer-events: auto }` for its children. The children's own `auto` beats the hidden parent's inherited `none`.\"}",
    "recordHash": "e89bf5ea7863d3b382ae20a4099cc21ae4420207ce16b37c3de2975858457dee",
    "prevHash": "7cb441093fb1197b509b7c5793af37ddc3cb0c666eda6dccfdf268b38c1ae9ed",
    "entryHash": "52d965be12c136a86ad05e30a114aac88a898da76f2586d8147835728dd1740b",
    "keyId": "k1",
    "signature": "qgpUyMpXURRGrbRTNSf8updtqGu/wnH64eoMMbcEjA2zw1gOwZS4Lvl7URcZasnF96yHNoOH4Kv1xwvCHhZFAQ==",
    "recordedAt": "2026-11-14T09:05:31.180225+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [
    {
      "seq": 837,
      "prevHash": "52d965be12c136a86ad05e30a114aac88a898da76f2586d8147835728dd1740b",
      "recordHash": "f9490c54f9ea586318f15bb31f856fa641e4e8927b6c8825f31c7a187086d7c0",
      "entryHash": "fab47ecac33e14784804a812d9a7e7f1596c52a1366de831513e9216e7605cba"
    },
    {
      "seq": 838,
      "prevHash": "fab47ecac33e14784804a812d9a7e7f1596c52a1366de831513e9216e7605cba",
      "recordHash": "97fd008e98b44bd87f0b34f16091d02b1276edb79685a7d847c531dc34c4675a",
      "entryHash": "0af47ac5f9f69d48a361c9a3bbf0f87e4be4d1843c9854a1375df16bcaec87dc"
    },
    {
      "seq": 839,
      "prevHash": "0af47ac5f9f69d48a361c9a3bbf0f87e4be4d1843c9854a1375df16bcaec87dc",
      "recordHash": "6117ceeaecef0bc8fa9001d641237430be2a6cbc0a97a8a30e22e47990d868cd",
      "entryHash": "af9087ef0fdd1c33114e478711a5382ea072fd15884d7175fc8c4251c14a4627"
    },
    {
      "seq": 840,
      "prevHash": "af9087ef0fdd1c33114e478711a5382ea072fd15884d7175fc8c4251c14a4627",
      "recordHash": "773d4a549cbff638705d96817b11d217421c0cd0553a33924832fa9e43f3a91f",
      "entryHash": "b067b82b3ff1611468d4ee94c82af168f0400873c0e0ff11712ecce771930572"
    },
    {
      "seq": 841,
      "prevHash": "b067b82b3ff1611468d4ee94c82af168f0400873c0e0ff11712ecce771930572",
      "recordHash": "de5433791ac807fb4a1f568cc3c1915685b03db8a2d28a32a32b6ce4f6d328b7",
      "entryHash": "abe1b6330dcbdb6166a7f7403095e954fb9684950732befb18b4ada1ed444d30"
    },
    {
      "seq": 842,
      "prevHash": "abe1b6330dcbdb6166a7f7403095e954fb9684950732befb18b4ada1ed444d30",
      "recordHash": "a53f25fb442567410a7ff08583378d1bc50970318ef0ddc09ae9529f1fe71489",
      "entryHash": "e6a3a637df00fc39f45c8efec9d99d72413c1d1177990cc6e8354250802efac0"
    },
    {
      "seq": 843,
      "prevHash": "e6a3a637df00fc39f45c8efec9d99d72413c1d1177990cc6e8354250802efac0",
      "recordHash": "5c3ea41050a69d9e9b7c68c8ae34d597d309cfdc0e03093e4df1e6e25b3c0181",
      "entryHash": "28c6fb492b7c63105d7db454ac61e1e2f383ca7cd99ec3ef9866c1701582f317"
    },
    {
      "seq": 844,
      "prevHash": "28c6fb492b7c63105d7db454ac61e1e2f383ca7cd99ec3ef9866c1701582f317",
      "recordHash": "c80bd6c67aff2c874f8718bc830cca7a1a8b8cb354f91f216591e128193f399a",
      "entryHash": "a7a38da01fc9a216e01ade45a8a338b9dc073539ba6e5e785c1cd7d5eb513e36"
    },
    {
      "seq": 845,
      "prevHash": "a7a38da01fc9a216e01ade45a8a338b9dc073539ba6e5e785c1cd7d5eb513e36",
      "recordHash": "8c3a6886b67be4405073384ed57ea55f38a5512035912ca2bb7e735c9bdb4c5e",
      "entryHash": "7521085d5e7cfbaffb3e33f86eab16ee31658d70a16965b961b03aacf06437b6"
    }
  ],
  "checkpoint": {
    "seq": 845,
    "kind": "checkpoint",
    "record": "{\"day\":\"2026-11-15\",\"entries\":844,\"head\":\"a7a38da01fc9a216e01ade45a8a338b9dc073539ba6e5e785c1cd7d5eb513e36\",\"site\":\"https://upfork.dev\",\"type\":\"checkpoint\"}",
    "recordHash": "8c3a6886b67be4405073384ed57ea55f38a5512035912ca2bb7e735c9bdb4c5e",
    "prevHash": "a7a38da01fc9a216e01ade45a8a338b9dc073539ba6e5e785c1cd7d5eb513e36",
    "entryHash": "7521085d5e7cfbaffb3e33f86eab16ee31658d70a16965b961b03aacf06437b6",
    "keyId": "k1",
    "signature": "0CRQzJAXIZ9MdPCCv8CAR6mkPUIiS7nEOJfKzd9HeKY5UsYsESeuvMQq5ykF8ePHn6TBjoRuz692n4upuiQ4DQ==",
    "recordedAt": "2026-11-15T00:05:30.910485+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "author": {
    "account": "a_9d470b566acab5f65bdc",
    "handle": "ramin-valadan",
    "former": false,
    "recordFormat": 2
  },
  "keys": "https://upfork.dev/ledger/keys.json"
}