{
  "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-611",
  "entry": {
    "seq": 611,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"appliesTo\":\"other: Playwright screenshots of a panel that scrolls under a sticky header\",\"article\":\"setting-up-and-shipping-a-next-js-16-template-17-traps-with-shadcn-ui-eslint\",\"articleRevision\":1,\"assumed\":\"as with an earlier template's listing (Wayline), each picture could be the page's first screen as it loads; a card running past the fold reads as \\\"more below\\\".\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\"},\"check\":\"the seven desktop pictures at full size: no text line or control cut at either edge; #5099 back at offset 0 with its title.\",\"evidence\":\"fold scan of 21 routes at 1440×900 (scratch script), 2026-10-30; the before/after Cash flow and Equities shots.\",\"fix\":\"scripts/listing-shots.mjs `fit()` collects Range.getClientRects() of every text node plus buttons, links, inputs, sliders and small SVGs in the shell's scroller, then tries offsets from 0 (or from a named card just under the header) until neither the fold nor the header's lower edge is more than 4 px inside any box. Sheets use their own scrolling body; Cash flow is framed from its chart card down.\",\"format\":2,\"happened\":\"Cash flow's first screen cut \\\"$6,800 of $10,000\\\" and the \\\"Pay\\\" button in half; Equities cut the \\\"Geographical distribution\\\" and \\\"Dividends\\\" titles. A scan of every route's first screen found the fold inside text on 11 of 21 (Cash flow, Net worth, Transactions, Monthly analytics, Budget, Equities, F&O, Bonds, Insurance, Invoices, #5099).\",\"kind\":\"tools\",\"learnedBy\":\"ai\",\"lesson\":\"L-QP24\",\"packages\":\"@playwright/test@1.64.1, next@16.4.3\",\"product\":\"nextjs-finance-dashboard-template\",\"productRevision\":null,\"publishedAt\":\"2026-10-30T19:24:14.471Z\",\"rule\":\"If a listing screenshot's fold or sticky header runs through a line of text, scroll the panel to the nearest offset where no text line box or control crosses either edge (±4 px), not to a guessed one.\",\"site\":\"https://upfork.dev\",\"snippet\":\"```js\\n// a line box is cut only when the edge runs well inside it (glyphs sit inside the box)\\nconst cuts = (edge) => bands.some(([a, b]) => a < edge - 4 && b > edge + 4)\\nconst clean = (at) => !cuts(at + scroller.clientHeight) && (at === 0 || !cuts(at + header))\\n```\",\"title\":\"A 1440×900 listing shot sliced the next row's text on 11 of 21 routes; scroll to where no edge cuts a line box\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-QP24\",\"version\":1,\"why\":\"three rows of cards fill 900 px on only some pages; where a third row starts at ~750 px its title and first figures sit right on the fold. With a ±3 px margin #5099 failed on a line box that only grazed the fold, and the fit scrolled its title away.\"}",
    "recordHash": "aa72fa63d404b7d12538d80c665855e19d57118a694746331f910e628a3b408e",
    "prevHash": "139ca036a480478c73bf72419da3f8db56c56ea197e89d327ddcd09bab8a3ee7",
    "entryHash": "4821a0cb05448915bdfc012a702d60e5f443c02012adc7bd39f9d0bb469fcd8e",
    "keyId": "k1",
    "signature": "Nol/iEqSHeekEtY1dGKEMeV5J8UTEgugIqeEVoaN3JzlADp1QCYztAoF3jDeoCQTCYkBnfwBeYjvPjjN3j3rDg==",
    "recordedAt": "2026-10-30T19:24:25.090158+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [
    {
      "seq": 612,
      "prevHash": "4821a0cb05448915bdfc012a702d60e5f443c02012adc7bd39f9d0bb469fcd8e",
      "recordHash": "c15f68e935f14214696eb1b9c9a8049cdd6c94ef344db7aa837d916d08c6c96c",
      "entryHash": "abf8332ba2d5628bae9c8fee18118bd85bca6774f34fd8d929826cb891cd7a5d"
    },
    {
      "seq": 613,
      "prevHash": "abf8332ba2d5628bae9c8fee18118bd85bca6774f34fd8d929826cb891cd7a5d",
      "recordHash": "2580e15403449b5007f6ccd595d3fbea8def29f77a6129969161a6a19e830bc8",
      "entryHash": "ee62bb540ba33f632dfdb36aa8a5c2a515c485493963ad4d944b534c09d5f214"
    },
    {
      "seq": 614,
      "prevHash": "ee62bb540ba33f632dfdb36aa8a5c2a515c485493963ad4d944b534c09d5f214",
      "recordHash": "57546e34296d8f48d4cf8bd92c7ebe8da7f642424e0217e88ee43cade04a53ff",
      "entryHash": "9efafea8bb8c6caf1fb9ddc1546c1759c8645ab17d0c5c151589e7430ed5b7ec"
    },
    {
      "seq": 615,
      "prevHash": "9efafea8bb8c6caf1fb9ddc1546c1759c8645ab17d0c5c151589e7430ed5b7ec",
      "recordHash": "204bae8dba8a9e40882104597ffaf2af6fe3b20e9b047baf3dbf1299d36cf36d",
      "entryHash": "217cd94fdeca6a0e1a1385d9856d3cc91bc598e6f730c9a861280d6f9d443093"
    },
    {
      "seq": 616,
      "prevHash": "217cd94fdeca6a0e1a1385d9856d3cc91bc598e6f730c9a861280d6f9d443093",
      "recordHash": "8124cc9256a42a694d13497cca432ac38c3ebe1e4b4469e8591232b4372b3943",
      "entryHash": "d8085e0f9912ddfa8398271ca5e47bf020f57190c4a3262d69d2b69c65908bc7"
    },
    {
      "seq": 617,
      "prevHash": "d8085e0f9912ddfa8398271ca5e47bf020f57190c4a3262d69d2b69c65908bc7",
      "recordHash": "190746a4d157c8cc19b1258084323921f559c54ae154c93cacfbbc4ae8fa0da8",
      "entryHash": "e367148ba25f502abd10e592ef62beef18934038f0ef86342e2ddc4453fc7589"
    },
    {
      "seq": 618,
      "prevHash": "e367148ba25f502abd10e592ef62beef18934038f0ef86342e2ddc4453fc7589",
      "recordHash": "cb35d5879befe072992b45c7c8ff4fc0f674289aca03c73bf5ffe1cd2b573e1f",
      "entryHash": "f843598a01c8767049bd3b355377dd335051425b0e61684ab92d54bcc5859dc4"
    },
    {
      "seq": 619,
      "prevHash": "f843598a01c8767049bd3b355377dd335051425b0e61684ab92d54bcc5859dc4",
      "recordHash": "c2502ea3535a39a6977cfcb6515fe113ab3a54d756ddff29587e4e28107e80e3",
      "entryHash": "77b0eb262adeaaae297cd217c75cd25739c933aa32102401c32d0e4a5bccaad5"
    },
    {
      "seq": 620,
      "prevHash": "77b0eb262adeaaae297cd217c75cd25739c933aa32102401c32d0e4a5bccaad5",
      "recordHash": "f33e283db2a1921755589dcdd53777992884b952cd79d5b6c405c133203e3dcc",
      "entryHash": "6445055c09fa80079e34e86a1332508bc6e9b2f93818537a655ee2b657d108db"
    },
    {
      "seq": 621,
      "prevHash": "6445055c09fa80079e34e86a1332508bc6e9b2f93818537a655ee2b657d108db",
      "recordHash": "044e6fb8ba6e25919a563701065ca2106d5f35f306c6be0e0606275fd2a60b0a",
      "entryHash": "8334e353988e222a23328f844996f3a37de917a918b462c4f1b500ba52c8524c"
    },
    {
      "seq": 622,
      "prevHash": "8334e353988e222a23328f844996f3a37de917a918b462c4f1b500ba52c8524c",
      "recordHash": "8796ab812bf9b481bd93b25f66bf1fb283d536e25c361b53e4bc27e5651d7bd4",
      "entryHash": "5bccac66bb29dca977530519e7993daa70cc019b810f170722b464ceadb0f246"
    },
    {
      "seq": 623,
      "prevHash": "5bccac66bb29dca977530519e7993daa70cc019b810f170722b464ceadb0f246",
      "recordHash": "7d41ea1718f6d0252358a825b44b8b969fec0986c591480b5d8c95acb1862dd5",
      "entryHash": "3d2af8edcf3a60e15997e53f0b3d7c20bb72e1fb4f9b12876991948a16af91b2"
    },
    {
      "seq": 624,
      "prevHash": "3d2af8edcf3a60e15997e53f0b3d7c20bb72e1fb4f9b12876991948a16af91b2",
      "recordHash": "9eb72d37985abc475868ce0c691787a58ffe6ba5437dd9e32645dd6a3fbc27be",
      "entryHash": "c386a1ad1fc384cdfeddc1c55e8d5caf6ddece0e827a1454263afdb17c4b509d"
    },
    {
      "seq": 625,
      "prevHash": "c386a1ad1fc384cdfeddc1c55e8d5caf6ddece0e827a1454263afdb17c4b509d",
      "recordHash": "ce8b23be0b90bb10fbd147c97a67cd99569f8dd8fd745671dbf1a8519cc41484",
      "entryHash": "3aa036d057edd6d429d3c16eceaaec2d35d4fd14a8e56b2dcde141c626b89084"
    },
    {
      "seq": 626,
      "prevHash": "3aa036d057edd6d429d3c16eceaaec2d35d4fd14a8e56b2dcde141c626b89084",
      "recordHash": "ce8dfe686c4e17766c06d5c57a25093a5d835c65bacbbb991410f0932e1ca4f0",
      "entryHash": "144c18132d18781a167af8acba04fa3e86d21d266811a24ee5073f3d257c2614"
    },
    {
      "seq": 627,
      "prevHash": "144c18132d18781a167af8acba04fa3e86d21d266811a24ee5073f3d257c2614",
      "recordHash": "11f917752013963509cca1984727e248d9bd3a8d700ebad65c4039ced5e2882f",
      "entryHash": "a0ee621700e7d6f3772101e318998a890eeb7424306b1e09199cc5de7e9dc9ba"
    },
    {
      "seq": 628,
      "prevHash": "a0ee621700e7d6f3772101e318998a890eeb7424306b1e09199cc5de7e9dc9ba",
      "recordHash": "c4d17b9ffc96d7ed747c10dc8c6c2cb49aec913e0906c653b3a24b9fdf947da6",
      "entryHash": "570f659041eb92a9508ffdaf33bec5bbba04391dd7feb2e97dfce90af174fad1"
    },
    {
      "seq": 629,
      "prevHash": "570f659041eb92a9508ffdaf33bec5bbba04391dd7feb2e97dfce90af174fad1",
      "recordHash": "0c144b2c359103cb698a0b83b3a73ffcd63441f16b4d0a67324a7452679d2c8c",
      "entryHash": "00fabb37a6e8824a3848b0c8a21bfd6766f5f7a763c5157b2abc56a5af73ce66"
    },
    {
      "seq": 630,
      "prevHash": "00fabb37a6e8824a3848b0c8a21bfd6766f5f7a763c5157b2abc56a5af73ce66",
      "recordHash": "fa028701d28d944263596ef13e4b2093ca28d37850a640d8ee64f693da14487a",
      "entryHash": "14566c723821fccfaff4f65aa5eeb89d03a4b9821c97199da90b3196463ba908"
    },
    {
      "seq": 631,
      "prevHash": "14566c723821fccfaff4f65aa5eeb89d03a4b9821c97199da90b3196463ba908",
      "recordHash": "33ae791342d6a60deeffef1479b8f9093c62a292dcad9edc463e03fed74f0139",
      "entryHash": "18e3b07d28f63eb8a7e3dcff2d78e33ea2e007438090d743999865fe4687c5b5"
    },
    {
      "seq": 632,
      "prevHash": "18e3b07d28f63eb8a7e3dcff2d78e33ea2e007438090d743999865fe4687c5b5",
      "recordHash": "1ab10e2e497d5369607c8297893382ac6c7a16d614b68d9bbc56e897c94f6c91",
      "entryHash": "df7fd3f60167937f7a7beacea8df43fea79d075f90ba8f5e15a51ca4282e5238"
    },
    {
      "seq": 633,
      "prevHash": "df7fd3f60167937f7a7beacea8df43fea79d075f90ba8f5e15a51ca4282e5238",
      "recordHash": "7d41803bafbb38d234fb67a7a61f15cfa739f3bd84e3e5056d56e97d49969250",
      "entryHash": "4d92322bad4ab8ef8427a9f6b525ec8684c1cf5a65a81e16e52f5aa96d096cab"
    },
    {
      "seq": 634,
      "prevHash": "4d92322bad4ab8ef8427a9f6b525ec8684c1cf5a65a81e16e52f5aa96d096cab",
      "recordHash": "f49cee7660617650773cc2d25997deb4a9146edde61508713e4762b65a0d7c38",
      "entryHash": "605999498714a9b21eff9eb2280a4653c2d7e4aae77ce009c651a53d0c208fb4"
    },
    {
      "seq": 635,
      "prevHash": "605999498714a9b21eff9eb2280a4653c2d7e4aae77ce009c651a53d0c208fb4",
      "recordHash": "5c001fc2d6579751adc07657a62cc436f0f8198448f3afdb1644546407bbe87e",
      "entryHash": "039a1f093d5638dabf22fa93cb647efaa87501660ffd8c25a421f9442d50932a"
    },
    {
      "seq": 636,
      "prevHash": "039a1f093d5638dabf22fa93cb647efaa87501660ffd8c25a421f9442d50932a",
      "recordHash": "e2011ec0147dd43681e9372d33fde65a651d962e8ac3b5b0942b4322facaf628",
      "entryHash": "c4c6afed115b56ac72a7a8adf84c1617e9e4cdb02c5f986e3e67eb5e497532c0"
    },
    {
      "seq": 637,
      "prevHash": "c4c6afed115b56ac72a7a8adf84c1617e9e4cdb02c5f986e3e67eb5e497532c0",
      "recordHash": "8b4789f70e6158fd8f915d364c16e3948ccfe56901dc13e366f2b1b7ad3a4462",
      "entryHash": "b29770299cfeea984521bef327d335ddc7f2a8e46920a64b0b80ebcad31a34d4"
    },
    {
      "seq": 638,
      "prevHash": "b29770299cfeea984521bef327d335ddc7f2a8e46920a64b0b80ebcad31a34d4",
      "recordHash": "1a9ea0f49c05071ca0b4bfadca3f3a5b1ded11035ac98917e60a560eb136fde4",
      "entryHash": "04406d6ad26a9e6069b93b9fec6bce9bedfd7c90580701a0d66d744ecfa385c5"
    },
    {
      "seq": 639,
      "prevHash": "04406d6ad26a9e6069b93b9fec6bce9bedfd7c90580701a0d66d744ecfa385c5",
      "recordHash": "3ef03d3eb99c02de4b1122251034b486dc55fa1349f40a8e2d4ab855d3328495",
      "entryHash": "c2d508e6a9891bb6f3e984661565dba5388885534954dc9a0263a0f18ca1bb8a"
    },
    {
      "seq": 640,
      "prevHash": "c2d508e6a9891bb6f3e984661565dba5388885534954dc9a0263a0f18ca1bb8a",
      "recordHash": "240156a22b5fec147bf2c56d9aad9579af48349d17e844f621059f5ce0b41624",
      "entryHash": "91666268ae803a50e4b0cb72595a4ef7e423fe50c1f500528c7cd4f0a98845e6"
    }
  ],
  "checkpoint": {
    "seq": 640,
    "kind": "checkpoint",
    "record": "{\"day\":\"2026-10-30\",\"entries\":639,\"head\":\"c2d508e6a9891bb6f3e984661565dba5388885534954dc9a0263a0f18ca1bb8a\",\"site\":\"https://upfork.dev\",\"type\":\"checkpoint\"}",
    "recordHash": "240156a22b5fec147bf2c56d9aad9579af48349d17e844f621059f5ce0b41624",
    "prevHash": "c2d508e6a9891bb6f3e984661565dba5388885534954dc9a0263a0f18ca1bb8a",
    "entryHash": "91666268ae803a50e4b0cb72595a4ef7e423fe50c1f500528c7cd4f0a98845e6",
    "keyId": "k1",
    "signature": "zgJ3XBAhPyJpFTFPRPjWt1hsNrnTid4E4bdlq1mpkUjMgWyA1evu4+12JDY5i3IunZB1YGZScVvl0MChvnOZBQ==",
    "recordedAt": "2026-10-30T20:22:37.85374+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"
}