Created
December 20, 2025 06:53
-
-
Save simonw/2a157668c080cc01954e46f914572af4 to your computer and use it in GitHub Desktop.
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {"type":"summary","summary":"SQLite Datasette permission matching fix","leafUuid":"87b603ee-c5a4-44eb-b270-ebc8ea6841d7"} | |
| {"type":"file-history-snapshot","messageId":"5ff4b2b2-6ef6-4119-9b87-28fb8f0a568a","snapshot":{"messageId":"5ff4b2b2-6ef6-4119-9b87-28fb8f0a568a","trackedFileBackups":{},"timestamp":"2025-12-20T05:56:49.103Z"},"isSnapshotUpdate":false} | |
| {"parentUuid":null,"isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","type":"user","message":{"role":"user","content":"http://localhost:8042/demo.html is served from this directory, take a screenshot of it and look at it"},"uuid":"5ff4b2b2-6ef6-4119-9b87-28fb8f0a568a","timestamp":"2025-12-20T05:56:49.097Z","thinkingMetadata":{"level":"high","disabled":false,"triggers":[]},"todos":[]} | |
| {"parentUuid":"5ff4b2b2-6ef6-4119-9b87-28fb8f0a568a","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","message":{"model":"claude-opus-4-5-20251101","id":"msg_01KmmGm9AQozMLbwXwa849Ro","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to take a screenshot of a webpage at http://localhost:8042/demo.html. I need to use a tool that can capture screenshots. Let me think about what tools I have available.\n\nLooking at my available tools, I have WebFetch which can fetch content from URLs, but it doesn't take screenshots - it converts HTML to markdown and processes with AI.\n\nI don't have a dedicated screenshot tool. However, I could potentially use a bash command to take a screenshot. On macOS, there are tools like `screencapture` but that captures the screen, not a webpage.\n\nFor taking screenshots of webpages, I might need to use tools like:\n- `webkit2png` (macOS)\n- `puppeteer` (Node.js)\n- `playwright` (Node.js/Python)\n- Chrome/Chromium headless mode\n\nLet me try using a headless browser approach. First, let me check what's available on the system and what files are in the current directory.\n\nActually, let me first check what files are in the directory to understand what demo.html contains, and then figure out how to take a screenshot.","signature":"EqQJCkYIChgCKkAAdkO0HkT2Qz3UKguNveTopm8oy6Eu8WYmd/4ehpA77Tw9mx0JJN860L0PItvpP3iXufVMHkwOoZkOuKg/fqB+Egxpv5BpU9bKgvQRjHMaDCKYB4BnUWYxtpL6wCIwcM4ygsbt41pGhSrvDjuNGlubu9S7+vAuRPql+DoO1SraAsVnNuHtd9InndI0BfiIKosIVy44dOlID7fOwu3NPg0jUWFYZ0Od68t1+5sUF5UA+X2tdMBNtDUPibwOcPU58kJYc8Z4PhOk3IqqTS7G+1956zYV9nuvKpiTS/dhMOKa23Ubxy72E1yYIOlAionfPs7W+Ydx1xgp/zjG6wEmyHsmj9++4PtRRyA2kxQIlqoIxewahKzD9hJ9fRnvyuoP1mTZRWuDUqQ8cOBHjZkVvCXKyG5wLRn1qARbR08FokKPYC/guVQILIy5pWW/mX84fesxTGT1tz+cJR22qwZo6GKGWycWu0G3xfTmGphOps/Sw6pBGKVE2ddbbdbzp/mTb7U6RvSj3eAUN76tNHvqxSdTyixfVbWQfLgOLo7gt9Bm+j25FkfKSMLADeC1ZAmSOGCmQM6GNzMjxmJhzqoLqvdUHqSw9yjLC+LF2+yQKdAP3bmw/SFD2MrK4V2PKZE0T5nJ9pNL22GxKUlqVF3qTEziml+DCe+WTb0pX4x4Tw23qlYJVbaRfIQi+D/Olna4CzO21Tu4DQ8gqsPsYhcvE/6N/fNnZNrLplXesmSW+ugRjkWvCjfLKv/7CTIS1S25LxzLHN7DDEGf1bV1Xx44vYfbhLmh/nXt3UwGDjUbCkJsRWWaxb/Tuv1oEw+L7FqW3i069QoioDYLtNMS6trLHKi/5zd3MEGjEpChvx2tT18pmCjKGM6HO/YLl4SGVMgTqFVEHhkYk4r0ld2Jcibt0I14fWxvtsOxqgExuzt6Ec+Swqn+RIgWSOmYWYGbMwBRaDzrYTFGNPnq3WYsRqpWzpQX7KqLyQt1oAfWhbfgv8zd+anyWvCbCUdizLVsoH/i43vczvIGZMC0bBMZKXn4OUYaUjGVvMolMedztjqF0IESAFebjhxxw2pIuCIO4qkCm5z5qIvP8EKtXZ5Kt7WjjnIKytNwi0dkCMNkeHQC7yQ2VzFWf1KPvZGXptFh3jPtJuwMizKAyYe5VDv6iNJDuKLqXEmcQYuUre4PrkGKwfFOkJZfNrb9jqtcWhWAphvoh524rs1LmlQnr+ArweOR9Wfm8ewdpjuS4tFEoGTjldSKsXglYRNovOwOIne/qP6ryryVpy09Bee5M3OA3A6aetJzYZezbnvjzY74+hXgELqcf+Ac7057MprdXJ2BeOX3VvItcG3PvAYB2dUcatYfULcVGCn6wU8VNHzUtjcEhgIy1dZb9z41YKpLtSUw5+WH0MBM5oBLMrP7hX82htr0PNsQhMVLLJUXEvAbIYnxgd5XAnoI+HnESt7fDi7JTJF07ohiUDQhRVBCxo//P5a6uFJldFWIst6qNwbP1XmySh82QkBpbGkSrxuXYlDgTyg2QDxWmN/nBGtX1XUJGqEC69EdQi4D8p+/fChIFMukGAE="}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":5823,"cache_read_input_tokens":12832,"cache_creation":{"ephemeral_5m_input_tokens":5823,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard"}},"requestId":"req_011CWHRZLm2fYHirLU6NDN97","type":"assistant","uuid":"ffc3e0af-3a96-4787-a724-9f944084c5e1","timestamp":"2025-12-20T05:56:57.125Z"} | |
| {"parentUuid":"ffc3e0af-3a96-4787-a724-9f944084c5e1","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","message":{"model":"claude-opus-4-5-20251101","id":"msg_01KmmGm9AQozMLbwXwa849Ro","type":"message","role":"assistant","content":[{"type":"text","text":"I'll take a screenshot of that webpage. Let me first check what's in this directory and then use a tool to capture the screenshot."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":5823,"cache_read_input_tokens":12832,"cache_creation":{"ephemeral_5m_input_tokens":5823,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard"}},"requestId":"req_011CWHRZLm2fYHirLU6NDN97","type":"assistant","uuid":"d95e696a-eb3c-46cd-94a5-2b8f81ee3810","timestamp":"2025-12-20T05:56:58.008Z"} | |
| {"parentUuid":"d95e696a-eb3c-46cd-94a5-2b8f81ee3810","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","message":{"model":"claude-opus-4-5-20251101","id":"msg_01KmmGm9AQozMLbwXwa849Ro","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01CSgJQYaZzW19Vybo3VzBQ7","name":"Glob","input":{"pattern":"*"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":5823,"cache_read_input_tokens":12832,"cache_creation":{"ephemeral_5m_input_tokens":5823,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard"}},"requestId":"req_011CWHRZLm2fYHirLU6NDN97","type":"assistant","uuid":"22d25b16-918d-4e92-aeea-135089cb4688","timestamp":"2025-12-20T05:56:58.435Z"} | |
| {"parentUuid":"22d25b16-918d-4e92-aeea-135089cb4688","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","message":{"model":"claude-opus-4-5-20251101","id":"msg_01KmmGm9AQozMLbwXwa849Ro","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_013wahzW9SzSk4tCHLrDYsmF","name":"Bash","input":{"command":"which screencapture && which open","description":"Check available screenshot tools"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":5823,"cache_read_input_tokens":12832,"cache_creation":{"ephemeral_5m_input_tokens":5823,"ephemeral_1h_input_tokens":0},"output_tokens":403,"service_tier":"standard"}},"requestId":"req_011CWHRZLm2fYHirLU6NDN97","type":"assistant","uuid":"3b69f8f3-6a4f-42ff-8742-e8fe24c3854a","timestamp":"2025-12-20T05:56:59.330Z"} | |
| {"parentUuid":"3b69f8f3-6a4f-42ff-8742-e8fe24c3854a","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01CSgJQYaZzW19Vybo3VzBQ7","type":"tool_result","content":"/private/tmp/files/README.md\n/private/tmp/files/grid-lanes-polyfill.min.js\n/private/tmp/files/package.json\n/private/tmp/files/grid-lanes-polyfill.js\n/private/tmp/files/demo.html\n/private/tmp/files/grid-lanes-polyfill.d.ts"}]},"uuid":"52be6726-9b2c-4b85-9490-68f284a28490","timestamp":"2025-12-20T05:56:59.390Z","toolUseResult":{"filenames":["/private/tmp/files/README.md","/private/tmp/files/grid-lanes-polyfill.min.js","/private/tmp/files/package.json","/private/tmp/files/grid-lanes-polyfill.js","/private/tmp/files/demo.html","/private/tmp/files/grid-lanes-polyfill.d.ts"],"durationMs":9,"numFiles":6,"truncated":false}} | |
| {"parentUuid":"52be6726-9b2c-4b85-9490-68f284a28490","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_013wahzW9SzSk4tCHLrDYsmF","type":"tool_result","content":"/usr/sbin/screencapture\n/usr/bin/open","is_error":false}]},"uuid":"c87883bd-4b3f-4cbe-9fd7-e5fae02d03c8","timestamp":"2025-12-20T05:56:59.526Z","toolUseResult":{"stdout":"/usr/sbin/screencapture\n/usr/bin/open","stderr":"","interrupted":false,"isImage":false}} | |
| {"parentUuid":"c87883bd-4b3f-4cbe-9fd7-e5fae02d03c8","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01H4PdNGgVYismWjxfs9nAkN","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"I see there's a demo.html file. I need to take a screenshot of it in a browser. Let me try using a headless browser approach. On macOS, I could use Safari's webkit or try using a tool like `wkhtmltoimage` if installed, or use a Python/Node script with puppeteer or playwright.\n\nLet me check if puppeteer or playwright is available, or if I can use another approach.","signature":"EpYECkYIChgCKkABmHqmFXpJeOc3tdA2JufUPqddVpdMI7LSQk+V55RGn1sLD62WLAcP69xn4dJWofwn0EnTtYiREP/t3VJRyLJDEgwWGPzG6C8CCOue+KMaDCf8jBl7UWhxGkjjaSIwVnQHsMksVVwi6ahuLEQRjIjlquVtO7r73Od7HO5Obcd2dupA0UKdug7j2sa7S+7eKv0CCiC/5gEtfSJbb8RlZ1uD+LnykT3JUqF0Ff5si5EFcBoW6kD7HHB/mIep28j+5f+p01agjIVxKlusO0k6YwKLGFySu9TLXYSB6gK7ZxrUYXuVirtpwTUQUxvS5ZHdqOqChyWzL8JZgi6GQwRb3CZVe1YbZ50lN2RQwsOYMeifUHyNfe0JVObqf/Vbc174pdVKpUEAz+pP/tfFMWOxw/qr30460yk7KULew79YRW/0Hn92BiLBhEeW7zP35FtUOCvXa3arWhO2fcJImXap32cT/L4qj9GYfjIY3z05EE9tcwvAN7z1FOSRmRRD+ZundfJl0h345OyDZIEWSkMLz10nQGJaRJTsNuxWt9nVxZ15hW+6qpZ7JBNIRiOgoQ3kPw6UPljqUNNrhUyABFmdD2jzKvmvwhu2HNdTOc40Hzda0XtSRltZ4sUtdrbSCoeBX25EyfNchRS5Y7skJp07I5z/gRYjNKNfBGoY9+mVLRYGqspaWD5TVTpT0s+wkrfeGAE="}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":570,"cache_read_input_tokens":18655,"cache_creation":{"ephemeral_5m_input_tokens":570,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRa6eEyDANSsxzMdUHp","type":"assistant","uuid":"af1f0b31-2fd6-44d3-8053-3e9dd6058611","timestamp":"2025-12-20T05:57:04.174Z"} | |
| {"parentUuid":"af1f0b31-2fd6-44d3-8053-3e9dd6058611","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01H4PdNGgVYismWjxfs9nAkN","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01CMEkxcEXRwdLV45RHcfNNF","name":"Bash","input":{"command":"which npx && npx --version","description":"Check if npx is available for running screenshot tools"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":570,"cache_read_input_tokens":18655,"cache_creation":{"ephemeral_5m_input_tokens":570,"ephemeral_1h_input_tokens":0},"output_tokens":186,"service_tier":"standard"}},"requestId":"req_011CWHRa6eEyDANSsxzMdUHp","type":"assistant","uuid":"189c2a7e-3951-41aa-a761-53f6c0089505","timestamp":"2025-12-20T05:57:04.881Z"} | |
| {"parentUuid":"189c2a7e-3951-41aa-a761-53f6c0089505","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01CMEkxcEXRwdLV45RHcfNNF","type":"tool_result","content":"/opt/homebrew/bin/npx\n11.6.0","is_error":false}]},"uuid":"4f86e436-5081-4f4f-8494-05df280e53ce","timestamp":"2025-12-20T05:57:06.580Z","toolUseResult":{"stdout":"/opt/homebrew/bin/npx\n11.6.0","stderr":"","interrupted":false,"isImage":false}} | |
| {"parentUuid":"4f86e436-5081-4f4f-8494-05df280e53ce","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01CfURBqLUu7i8xkRzg7k1Hp","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Good, npx is available. Let me try using playwright or puppeteer to take a screenshot. I can try using playwright's screenshot capability. Let me try a quick approach with playwright.","signature":"EuACCkYIChgCKkByJzfXHTJngppC4YvaiPPM/fHoC/Xxo9jc6wRVbZ4Rh0JIOwz0LETOqMqzTde3Yg9W3SheRbr7KJm43mbuVZ42EgyMIzHRBUSvw1NfXhsaDN6Rqhv8JK3KYbfZbCIw7KVyGn1KwEaX3oCwRWy8MJ6Unzg4OWuIb7so93bsFOHXQAoVU4KDgLyVuGeWCONMKscB7RMQvBEV66W9Vbt6pVEl7wDV0FGflcNzlI7IQ5XFqUfRRSc2U6MQUzRitSSxf4SKfzRulR7UgwoQOK/2Svu15ucDEP2UnToK7Betm5SJ18Jxp5/vKlIIoUSLt/Rm0yJT6v4H6QVOmCP8RQzUdUh79Z88k4brYrA1tkuL69f6t6SLa9fShvkltpBHEDB1rs5mjMYoTznI3kw46+GouOx/sp/Ljw+/VVZg9MSDjKSogfIenjVO8q4FncXlbnkoPmgj1TW5Zx7D6hgB"}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":220,"cache_read_input_tokens":19225,"cache_creation":{"ephemeral_5m_input_tokens":220,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard"}},"requestId":"req_011CWHRacdYMu8qMNdVJDoFU","type":"assistant","uuid":"3ed543d9-d394-468c-bc09-3ea0843dd05a","timestamp":"2025-12-20T05:57:09.343Z"} | |
| {"parentUuid":"3ed543d9-d394-468c-bc09-3ea0843dd05a","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01CfURBqLUu7i8xkRzg7k1Hp","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Xy5cTkP1HuKHh2RXAq9KiU","name":"Bash","input":{"command":"npx playwright screenshot --browser chromium \"http://localhost:8042/demo.html\" screenshot.png 2>&1","description":"Take screenshot of demo.html using playwright","timeout":120000}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":220,"cache_read_input_tokens":19225,"cache_creation":{"ephemeral_5m_input_tokens":220,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard"}},"requestId":"req_011CWHRacdYMu8qMNdVJDoFU","type":"assistant","uuid":"a793c4b3-cf5d-467b-a851-2d75ac69063d","timestamp":"2025-12-20T05:57:10.932Z"} | |
| {"parentUuid":"a793c4b3-cf5d-467b-a851-2d75ac69063d","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Xy5cTkP1HuKHh2RXAq9KiU","type":"tool_result","content":"Navigating to http://localhost:8042/demo.html\nCapturing screenshot into screenshot.png","is_error":false}]},"uuid":"a2d60069-411e-4004-8a26-8769cbd1f292","timestamp":"2025-12-20T05:57:16.546Z","toolUseResult":{"stdout":"Navigating to http://localhost:8042/demo.html\nCapturing screenshot into screenshot.png","stderr":"","interrupted":false,"isImage":false}} | |
| {"parentUuid":"a2d60069-411e-4004-8a26-8769cbd1f292","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01EFzCGpRYHokpEdmxjuEe8f","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"The screenshot was captured. Now let me read it using the Read tool which can view images.","signature":"EoICCkYIChgCKkAuAQ/cw90pv9qsTnMcO86uDLM5v9Bqki1+YHWndsUN/M9ehN74U2TBRQkNhJLCwcGqC4XvebMnwNUT19cWuPPpEgxEbmojgh6USvBYhBUaDO5PfEnXHJsraasfVCIwnM63kWC3z2RzQa/WDtpF4Sy4R/6pDRY+5T8bP0xLD2GokklBNaB4ZQMVX15kfK+uKmosnfl6gXrYpXHQTtbP6C2W+PuKoO/9/+2C5urIQXdREjsNYtruQAot8A4niw+soOoIVGjOq0pLPF74PkcF6Fhnv2hqkyO11GeBItkAKg453fWO13A8/saWcDrc3zlt9A9FlatnMGXWcDthGAE="}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":208,"cache_read_input_tokens":19445,"cache_creation":{"ephemeral_5m_input_tokens":208,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRbMtJDbKH3b3PHmJxq","type":"assistant","uuid":"47b36520-9dd4-4bac-baf5-22c8c917eb8a","timestamp":"2025-12-20T05:57:19.523Z"} | |
| {"parentUuid":"47b36520-9dd4-4bac-baf5-22c8c917eb8a","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01EFzCGpRYHokpEdmxjuEe8f","type":"message","role":"assistant","content":[{"type":"text","text":"The screenshot was captured. Let me view it."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":208,"cache_read_input_tokens":19445,"cache_creation":{"ephemeral_5m_input_tokens":208,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRbMtJDbKH3b3PHmJxq","type":"assistant","uuid":"f8676dfe-20d6-44cf-a127-fe31e64ae96d","timestamp":"2025-12-20T05:57:20.023Z"} | |
| {"parentUuid":"f8676dfe-20d6-44cf-a127-fe31e64ae96d","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01EFzCGpRYHokpEdmxjuEe8f","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01EPVyHaJdLymx6QmTPfZXAj","name":"Read","input":{"file_path":"/private/tmp/files/screenshot.png"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":208,"cache_read_input_tokens":19445,"cache_creation":{"ephemeral_5m_input_tokens":208,"ephemeral_1h_input_tokens":0},"output_tokens":100,"service_tier":"standard"}},"requestId":"req_011CWHRbMtJDbKH3b3PHmJxq","type":"assistant","uuid":"6d63a016-4c96-43a4-8413-4858fbbcbfe7","timestamp":"2025-12-20T05:57:20.497Z"} | |
| {"parentUuid":"6d63a016-4c96-43a4-8413-4858fbbcbfe7","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01EPVyHaJdLymx6QmTPfZXAj","type":"tool_result","content":[{"type":"image","source":{"type":"base64","data":"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ZU+B/uyzz+JPktPyuuuulcdkvhqnqBBi7NixixcvHjp0qDHMrr32WukhvOqqq0wI5OujK4cPv2DIkNOYNyv4lltu+c1vfpMsGnff/fPBg081T6FH7Ny5g7yF0iCn2x966MHevXuzA3HmmWfu3bs3MzOzRYuWl112qbHGV6xYkfD65cuXr169um/fvmQtyzODBg0yv7777nvG+i0rK/v2229r1qzZqlUreeb8889fvHgJ+Z8nT55MLlw6b+zYhQsXygM5//kPf/gDuTft1NH1ZIVKy7Bp02Zku1566aUJY5ibmysPyLNtT+GmAYV///vfZm2wgXKeHLDM89ya5G/atPHTTz8jNy+ViDzpbdfVdN26tazCvPXWmyY3Nm/eTN715s1bnHxyH7kxdd++/W666eann/5f6K5QDMeNG0duYTKMmTcGMXDgQDrDvLEGMx5RVLQHL14CAAAAAAAgHfje1gAbyIX45ZdjjCOxV6/eZLOR+UfHTz/99L/+9S/mLa+dM2e2nDdrtssyliHxzTfffOZxzTXXyFWdU6d+neKhZ511pjm+55573n33XeZNuKW7pH1Vr169Vq1aLl++ImXcGbma409S5H/1q1/Fn3/nnXfoWcwz0qZNm16nTm3mLX4mJycZrmQfmsm6FMLpp59OpjId33LLrb/61T3y/A03XE8GsNximkLr1q2bPH/22WfbD7rkkout1P2S7GrmrXYmz600R3v06FGjRg17NriEImMMyI0bA8utTzjhBPM4m/Xr10sDuGvXrrLUior2Dhp06v79xcyd473017++V145fPj5jzxyEHt9k4dfHmzYsIEMV2mNd+jQ4eOPP5bnzzzzjHgDmBgxYsQLL7xAYxA0NkFfH3/88T/+8Y/yp3vv/bU0gO+44w6T0tdff4MBAAAAAAAA0oDKNoBXrlxZXh5lnjuODE7muXx/+tOf1ahRU24pPGXKZLnNOS/BAAAQAElEQVSMli7o1avXvffeK52l5eXKQs7Ly5MHEyaMlys/ib/85S/33XffkiVLxowZQz5JMplSR6NpU7WF8rp166T1S+zYsZMM42bNjtNRXcUOHvK1XnDBBYsWLQqdJ6ue0mKOp06devbZaqfoPn1OHjly5Omnn2YuJhtPWr/MW3JM3uyaNd2l2glnR4eoVq1aXl6+PCbrVFq/zHOzT548pV+/vsyzwPv16xe/zrm0tJTiJi3DijzLRk5Np9IkS5uc840aNQwF0qXLiRUOzDXXjT+5Ro3qzz7rr901MWzTpnX8jVT6odGHF1988Ze//KWsNnSLHNe4+OJL5K808vLgg5j/DAAAAAAAQFpQ2Qbw+eefb3aNatq02ccfjyCDjXkTm//73/9u376deUtGX375FWnyJYTsH7KCnnjiySFDTiPHozxJ3stOHj/96U+/+mribbfdZu9ObEM+ZOnmJZYtW27/RKbRAb2+NmRpS9/1jh07ZsyY8cUXo7/+emrCTaR37dptb/hM1rsxgGvVcpe5Nm/e3PxKQdn3rl69qmZNNV+3UaNGqc17+4VSodTNnDlDGsDM27Aq4e1kA8sRB8p/mc/y/NixYy++WDmWzz333PhF2hkZGY8//picgp6Q+NXaKTjjjDPMcX5+gZnRbUN2PoUZ2kY74brlt956iyqYPP797/9IfmNTu6iqSGc1AAAAAAAA4Jjn+5wCvXbtmldeeYUsVfl1+PDhzzzzzPHHH//RRx/ZKznlxFpjshrINqNbTjml/x133Nm+fXvjGWbeBr/PPPO/H/3oioTP3blzpznOyjqsHDjzzDPtXaBTUFZWGvxaFrpg7Vp/faycHW2QYwSSAz7OuI6Z5zu1f7L9sUVFiUcHyLpu0aIF80YZzjrrLOMlLioqmjlzpjxOOMGbjEwzGME8z2o0GiWrOH7ZcEWwBy8or3bvTpBqIWLxL5FavHhx/JX/+Mc/yWKXFjgNAdgbaz3wwJ8ZAAAAAAAAID2o7F2gQ9StW88cS7vruuuuMybTJ598QvZw27Zt27VrF28xHnfccXTL2rXryIQmx2///qeQ989YRCee2C3ZQzdv3mzsq9DOzHfddfc7Hm+//TY5qFkl8uGHH5rjgQP9nbHIH2smbFPqjAFs235mSy3mvW9p794iedy69fG2/dmnj7+19YIFCxNG44033jTHDz74oO1PlgwYcEqPHj1CJ+kpJ5xwgjwmHzK5iGXBvfTSS+yQ+PDDEeb42Wef7dmzR/yfmQBvk9D9Tj7e0aO/kMdkBpv3PK1cuXLZsmUMAAAAAAAAkB58bwZw7dq177zzjmHDzjNnRoxwNzc68UR/pSjZhNLMe+ihh+I9wCNHfjzG46uvviIf6fr16/70pz+tW7dO/mrv5xTP4sVL5EF+fsGLL74krzzzzLN+8pMfd/OgaGzZsoVVIrZZThH46U9/SrGqVavmRx+NMGk37/hl3v5S5viBBx5o1KiRfDcvsWiR8oJS6l5//fW8vHzyxP7lL38xO2nv379/6tQpCaPx0ksv7tu3Tx7TXR988MG9994rzeB69erdf//9zz2XYI4xeeDNDOft27fPnz+fuTs/N7388svZIbFu3VqKpDy+8cYbjXX961//eoXmqaeerHiA9913f/xJvP0IAAAAAACAtKKyp0DPnj1b+uhCK0LJwStNsnnz5pvtfx977LFFixbV84gP6osvRg8bNox5/s9p06bNmzevTp06zZopt+3q1asTOgMlDz/80PPPvyDt3v79+5ExSRGw/aiTJ0+p/KWhr7zy6s033yyPyQC+8847bRu+vLxc7v8sGTdunDEvh3swb+nskiVLHnnk4RdeeFHeS27SefPmmo2jJCleKVxSUnLHHXeQ01V+zcnJudmDpWThwoU0VCHLtEGDBhMnTty9ezeZzQe17jfEiBEj5KpjaYfv2rWLCsi8OJpS9Mc/3lfx0DZu3Eh1z56kXVS0hx7BAAAAAAAAAGlDZXuAyQxzPOyTpaWlP/rRj+Txyy+/ZAxXsnw6deokrd94a/Zvf/vbzp3qRT5kGnXv3t3sI+VtkfUES86ECV/9+Mc/NmFSfGzrl4yl66+/jlU6lCJy2JqvtslK5uUVV1xhe4DHjx+/devWhOF89dXEn/zkDjvH7KAeeujBZ555hiVn7Nixv/rVr+KX1xqWLg1PG6ZnmRXCzNupi0YxDsf6Zd5K41GjRpmvNWrUsK3f//zn31RM7GC477777Dcbv/ba6wwAAAAAAACQTnyfa4DJGtmwYcPYseMGDx5szCey8a644srQBs7kYLzoootCt2/atKl3715Tpky2rRrmvc2IzOm33347/ollZf6Vn332GdnA27fvsC8gq++dd94dPPjUUJiHTywWtb+WlJQmvOy3v/3t008/TSMC9sktW7ZceeVV06dPt0/SNf379586dSp5Mq1gS+TBp59+Qg5kM0Ag2bdv39///o+KvIyXcu+ss86iwEPjDpQtlD9nn31W/JLsyy67bOLESfb1FMPf/e53cjp0Qkye2Om1j2+77bZXXnll27bt9l309dJLL33sscetWJWxCvDtt9+awKmgH3roYQYAAAAAAABIJ3heXg32g6R27Vp9+pyclZU1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","media_type":"image/png"}}]}]},"uuid":"60ebd8f6-adb3-407b-91d1-1e38ffd0bd8f","timestamp":"2025-12-20T05:57:20.522Z","toolUseResult":{"type":"image","file":{"base64":"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ZU+B/uyzz+JPktPyuuuulcdkvhqnqBBi7NixixcvHjp0qDHMrr32WukhvOqqq0wI5OujK4cPv2DIkNOYNyv4lltu+c1vfpMsGnff/fPBg081T6FH7Ny5g7yF0iCn2x966MHevXuzA3HmmWfu3bs3MzOzRYuWl112qbHGV6xYkfD65cuXr169um/fvmQtyzODBg0yv7777nvG+i0rK/v2229r1qzZqlUreeb8889fvHgJ+Z8nT55MLlw6b+zYhQsXygM5//kPf/gDuTft1NH1ZIVKy7Bp02Zku1566aUJY5ibmysPyLNtT+GmAYV///vfZm2wgXKeHLDM89ya5G/atPHTTz8jNy+ViDzpbdfVdN26tazCvPXWmyY3Nm/eTN715s1bnHxyH7kxdd++/W666eann/5f6K5QDMeNG0duYTKMmTcGMXDgQDrDvLEGMx5RVLQHL14CAAAAAAAgHfje1gAbyIX45ZdjjCOxV6/eZLOR+UfHTz/99L/+9S/mLa+dM2e2nDdrtssyliHxzTfffOZxzTXXyFWdU6d+neKhZ511pjm+55573n33XeZNuKW7pH1Vr169Vq1aLl++ImXcGbma409S5H/1q1/Fn3/nnXfoWcwz0qZNm16nTm3mLX4mJycZrmQfmsm6FMLpp59OpjId33LLrb/61T3y/A03XE8GsNximkLr1q2bPH/22WfbD7rkkout1P2S7GrmrXYmz600R3v06FGjRg17NriEImMMyI0bA8utTzjhBPM4m/Xr10sDuGvXrrLUior2Dhp06v79xcyd473017++V145fPj5jzxyEHt9k4dfHmzYsIEMV2mNd+jQ4eOPP5bnzzzzjHgDmBgxYsQLL7xAYxA0NkFfH3/88T/+8Y/yp3vv/bU0gO+44w6T0tdff4MBAAAAAAAA0oDKNoBXrlxZXh5lnjuODE7muXx/+tOf1ahRU24pPGXKZLnNOS/BAAAQAElEQVSMli7o1avXvffeK52l5eXKQs7Ly5MHEyaMlys/ib/85S/33XffkiVLxowZQz5JMplSR6NpU7WF8rp166T1S+zYsZMM42bNjtNRXcUOHvK1XnDBBYsWLQqdJ6ue0mKOp06devbZaqfoPn1OHjly5Omnn2YuJhtPWr/MW3JM3uyaNd2l2glnR4eoVq1aXl6+PCbrVFq/zHOzT548pV+/vsyzwPv16xe/zrm0tJTiJi3DijzLRk5Np9IkS5uc840aNQwF0qXLiRUOzDXXjT+5Ro3qzz7rr901MWzTpnX8jVT6odGHF1988Ze//KWsNnSLHNe4+OJL5K808vLgg5j/DAAAAAAAQFpQ2Qbw+eefb3aNatq02ccfjyCDjXkTm//73/9u376deUtGX375FWnyJYTsH7KCnnjiySFDTiPHozxJ3stOHj/96U+/+mribbfdZu9ObEM+ZOnmJZYtW27/RKbRAb2+NmRpS9/1jh07ZsyY8cUXo7/+emrCTaR37dptb/hM1rsxgGvVcpe5Nm/e3PxKQdn3rl69qmZNNV+3UaNGqc17+4VSodTNnDlDGsDM27Aq4e1kA8sRB8p/mc/y/NixYy++WDmWzz333PhF2hkZGY8//picgp6Q+NXaKTjjjDPMcX5+gZnRbUN2PoUZ2kY74brlt956iyqYPP797/9IfmNTu6iqSGc1AAAAAAAA4Jjn+5wCvXbtmldeeYUsVfl1+PDhzzzzzPHHH//RRx/ZKznlxFpjshrINqNbTjml/x133Nm+fXvjGWbeBr/PPPO/H/3oioTP3blzpznOyjqsHDjzzDPtXaBTUFZWGvxaFrpg7Vp/faycHW2QYwSSAz7OuI6Z5zu1f7L9sUVFiUcHyLpu0aIF80YZzjrrLOMlLioqmjlzpjxOOMGbjEwzGME8z2o0GiWrOH7ZcEWwBy8or3bvTpBqIWLxL5FavHhx/JX/+Mc/yWKXFjgNAdgbaz3wwJ8ZAAAAAAAAID2o7F2gQ9StW88cS7vruuuuMybTJ598QvZw27Zt27VrF28xHnfccXTL2rXryIQmx2///qeQ989YRCee2C3ZQzdv3mzsq9DOzHfddfc7Hm+//TY5qFkl8uGHH5rjgQP9nbHIH2smbFPqjAFs235mSy3mvW9p794iedy69fG2/dmnj7+19YIFCxNG44033jTHDz74oO1PlgwYcEqPHj1CJ+kpJ5xwgjwmHzK5iGXBvfTSS+yQ+PDDEeb42Wef7dmzR/yfmQBvk9D9Tj7e0aO/kMdkBpv3PK1cuXLZsmUMAAAAAAAAkB58bwZw7dq177zzjmHDzjNnRoxwNzc68UR/pSjZhNLMe+ihh+I9wCNHfjzG46uvviIf6fr16/70pz+tW7dO/mrv5xTP4sVL5EF+fsGLL74krzzzzLN+8pMfd/OgaGzZsoVVIrZZThH46U9/SrGqVavmRx+NMGk37/hl3v5S5viBBx5o1KiRfDcvsWiR8oJS6l5//fW8vHzyxP7lL38xO2nv379/6tQpCaPx0ksv7tu3Tx7TXR988MG9994rzeB69erdf//9zz2XYI4xeeDNDOft27fPnz+fuTs/N7388svZIbFu3VqKpDy+8cYbjXX961//eoXmqaeerHiA9913f/xJvP0IAAAAAACAtKKyp0DPnj1b+uhCK0LJwStNsnnz5pvtfx977LFFixbV84gP6osvRg8bNox5/s9p06bNmzevTp06zZopt+3q1asTOgMlDz/80PPPvyDt3v79+5ExSRGw/aiTJ0+p/KWhr7zy6s033yyPyQC+8847bRu+vLxc7v8sGTdunDEvh3swb+nskiVLHnnk4RdeeFHeS27SefPmmo2jJCleKVxSUnLHHXeQ01V+zcnJudmDpWThwoU0VCHLtEGDBhMnTty9ezeZzQe17jfEiBEj5KpjaYfv2rWLCsi8OJpS9Mc/3lfx0DZu3Eh1z56kXVS0hx7BAAAAAAAAAGlDZXuAyQxzPOyTpaWlP/rRj+Txyy+/ZAxXsnw6deokrd94a/Zvf/vbzp3qRT5kGnXv3t3sI+VtkfUES86ECV/9+Mc/NmFSfGzrl4yl66+/jlU6lCJy2JqvtslK5uUVV1xhe4DHjx+/devWhOF89dXEn/zkDjvH7KAeeujBZ555hiVn7Nixv/rVr+KX1xqWLg1PG6ZnmRXCzNupi0YxDsf6Zd5K41GjRpmvNWrUsK3f//zn31RM7GC477777Dcbv/ba6wwAAAAAAACQTnyfa4DJGtmwYcPYseMGDx5szCey8a644srQBs7kYLzoootCt2/atKl3715Tpky2rRrmvc2IzOm33347/ollZf6Vn332GdnA27fvsC8gq++dd94dPPjUUJiHTywWtb+WlJQmvOy3v/3t008/TSMC9sktW7ZceeVV06dPt0/SNf379586dSp5Mq1gS+TBp59+Qg5kM0Ag2bdv39///o+KvIyXcu+ss86iwEPjDpQtlD9nn31W/JLsyy67bOLESfb1FMPf/e53cjp0Qkye2Om1j2+77bZXXnll27bt9l309dJLL33sscetWJWxCvDtt9+awKmgH3roYQYAAAAAAABIJ3heXg32g6R27Vp9+pyclZU1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","type":"image/png","originalSize":124777,"dimensions":{"originalWidth":1280,"originalHeight":720,"displayWidth":1280,"displayHeight":720}}}} | |
| {"type":"queue-operation","operation":"enqueue","timestamp":"2025-12-20T05:57:30.030Z","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","content":"It is meant to be a polyfill for https://webkit.org/blog/17660/introducing-css-grid-lanes/ but the screeshot does not seem to show it working, fix it"} | |
| {"parentUuid":"60ebd8f6-adb3-407b-91d1-1e38ffd0bd8f","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01BXwnd6s3pR8hFdfJFTBNSb","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"I've successfully taken and viewed the screenshot. Let me describe what I see to the user.\n\nThe screenshot shows a demo page for a \"CSS Grid Lanes Polyfill\". It has:\n\n1. A dark-themed header section with:\n - Title: \"CSS Grid Lanes Polyfill\" in a purple/blue gradient color\n - Subtitle explaining it's \"A polyfill for the new `display: grid-lanes` CSS feature, enabling masonry-style layouts in all browsers\"\n - A status indicator showing \"Polyfill active (0 containers)\" with a green dot\n\n2. Below that is a section titled \"Basic Photo Gallery\" with:\n - Description: \"The classic masonry layout with auto-fill columns. Items flow into whichever column gets them closest to the top.\"\n - A code block showing CSS:\n ```\n .gallery {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 16px;\n }\n ```\n - The beginning of what appears to be a photo gallery section (cut off at the bottom)\n\nThe page demonstrates a polyfill for CSS grid-lanes, which enables masonry-style layouts.","signature":"Er8JCkYIChgCKkBCC2TnxqUy1hyM0aighsBJQvlQxwSz9uvaOjhARC7XSMVvy+TmfH+NPRcCiuHigJYgcmsF5C6vd8BldIsPAIvKEgyZl+l52bkJvmSpGVoaDIoGDU9M8R8B3caPMyIwZWg5ogxp+zdKzLTTfsFMTgQ1E7IYlHUfT8mr6cuI4aYxpISxVMbfP7ZRkFBGw6JeKqYIbHTl8zn0pZ14LTWZcM4sk5TnpiS08Ik9i02RiZUFivGUudOcX8W5gDlJ3U5/fVew5ckHv7JSo9Oar7HG7an8H9r10VMegLRVztq85zeFrJhE44ots4RUhr2JFxXChY+Y1GSefJ4AE2sek8FnWcp4m97GkfwRvy0ph8hxi/z1vU/+AunhNkyrk/OGh9fkaoleVreZCCOnsfYTWDPkbOuqodq1rX36c3NgIQZ2W+LnIiuU2qK6r5YuY75EevaymlBLYEMtihR5nGB12Ljg7GkVMhpIZ4Qo7j63rFPW5JhRV5PUkX3KMwDoAESuV9fCF0ChIlIdM50/aSzckuzVL9zjKxmk5Fk2DoGbpaNGLrpFM5SeO84X89LOFtIuHIPGllnQMZm2CJJLNoDmGZ/IafBUIVQ9hS8hXbmhd83q1UweRLyitd1mgKN1lUMDoARImQdP7xb96zI7D58fWP9547sizo3NrtC2Ez5tYVPs9CLP/ebH/V+RzgBSTHuzp3SLcb4ci5x2g73zB/kxluDLTIT9gKQtK1rpRO2LKvnvdbHymxVvv2u1u3hxUgUReeuLCqWSZtw4bixxhn0oXO3vL/hXr3D+w4TWY72EI08ddvyQjXJ7l4WmQ+eL/pl8uuy+u0t3CCXB/k7lCJYtET5LmHlWm/4lIjlSa/V0SeqipFSqYvCF9p5cmWvpOyi+c2Pb3QT+IYsh7yUNscJSrQEVh9VbUhaq+EHStyCcdmFg7mj6De4gmKP5Z4T3zmxKA6NR2kwiKh42CMIVd74qK+sMLV0tnbqvjXY8ofM4Wp5JdUAu+JiDVEdka20poYZJzvBncanxtgO/CDrDv0nqfAeQqZpxPH3z+ouksbXw+7aTdy2Rs8CH4CqoUZbCAuX3ouT+3pH939H7gZQ8jBgzX0q4ujf9LQEwx4CBuZTdGQa1qDI57mAieuXTzDFVpZodxqU9L20pHWV7EdZmCnUlXCIOqaA8oRpwOX/Mb4CjdfHpTBhtTg8WC5uH/gdExF51WCcxUct8Xd+NS5KurRCkp1c6Zu+kSWf5ww/glAc1BLAxVcjQZeamM9JPWrF3JBUvTRC6X9Rco9M5lXwS4Y0sltDl6+dd0LNwEtaqcaUDekhW4d8RWNgIBw0Apaiw5WcNjpAp27iXhM2crIf/OxCa1QG/85CnxNrTm6wISimRZOWIAH4e61iZp1xJxZ0gaPlaEhc6cy5fi6SZoE9cuViu6ROFbLruhy8x26vJgcDhgUih7XR89pCYJk42bRcskeMOt4Yj8N2eNr3bqNRgSjfe9XieQX5YTLo2xcC672BXhqbGpEAzUERKKiweUScDTsTH9ZYx6xBpzibWU4o5iWO6PTlz/ndZi8glz+usF2neLb80midaj4+OY29JoRG0QiCXQhJTOALEUE26wCK6GAE="}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":1435,"cache_read_input_tokens":19653,"cache_creation":{"ephemeral_5m_input_tokens":1435,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRbf5uLbjy5YdAka6ye","type":"assistant","uuid":"24e028a0-a55d-4388-ad29-77526b631b96","timestamp":"2025-12-20T05:57:30.099Z"} | |
| {"parentUuid":"24e028a0-a55d-4388-ad29-77526b631b96","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01BXwnd6s3pR8hFdfJFTBNSb","type":"message","role":"assistant","content":[{"type":"text","text":"The screenshot shows a demo page for a **CSS Grid Lanes Polyfill**. Here's what's on the page:\n\n**Header Section:**\n- Title: \"CSS Grid Lanes Polyfill\" in purple/blue text\n- Subtitle: \"A polyfill for the new `display: grid-lanes` CSS feature, enabling masonry-style layouts in all browsers\"\n- Status badge showing \"Polyfill active (0 containers)\" with a green indicator\n\n**Basic Photo Gallery Section:**\n- Description explaining it's a \"classic masonry layout with auto-fill columns\" where items flow into whichever column gets them closest to the top\n- Code example showing the CSS:\n ```css\n .gallery {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 16px;\n }\n ```\n- The beginning of a photo gallery demo is visible at the bottom (partially cut off)\n\nThe page has a dark theme with a sleek design. The polyfill status shows \"0 containers\" which suggests either no grid-lanes containers are currently being processed, or the gallery section below the fold hasn't been detected yet."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":1435,"cache_read_input_tokens":19653,"cache_creation":{"ephemeral_5m_input_tokens":1435,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRbf5uLbjy5YdAka6ye","type":"assistant","uuid":"d7df6a50-4a43-41a8-bd16-dce38d78f49c","timestamp":"2025-12-20T05:57:33.683Z"} | |
| {"type":"queue-operation","operation":"dequeue","timestamp":"2025-12-20T05:57:33.769Z","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9"} | |
| {"type":"file-history-snapshot","messageId":"9acfeb7e-d69d-45ff-8148-4cf63865d77c","snapshot":{"messageId":"9acfeb7e-d69d-45ff-8148-4cf63865d77c","trackedFileBackups":{},"timestamp":"2025-12-20T05:57:33.787Z"},"isSnapshotUpdate":false} | |
| {"parentUuid":"d7df6a50-4a43-41a8-bd16-dce38d78f49c","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":"It is meant to be a polyfill for https://webkit.org/blog/17660/introducing-css-grid-lanes/ but the screeshot does not seem to show it working, fix it"},"uuid":"9acfeb7e-d69d-45ff-8148-4cf63865d77c","timestamp":"2025-12-20T05:57:33.782Z","thinkingMetadata":{"level":"high","disabled":false,"triggers":[]},"todos":[]} | |
| {"parentUuid":"9acfeb7e-d69d-45ff-8148-4cf63865d77c","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_0164x7srgVkvdHanrshbMLYt","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to fix the polyfill so it actually works. Let me first read the demo.html and the polyfill code to understand what's happening, and also fetch the WebKit blog post to understand what CSS Grid Lanes is supposed to do.","signature":"EpMDCkYIChgCKkCj6RzxTyN/IWe/Y+mDHm0nerNZ5RjrQlANA3R8WCpTjmLL5SCkMiAC9MYs8KghnYCk/IYjNDZrliZuNTq0tHf/EgyvSH3ke/3736U6S7IaDJ8UaoqiKOIpgDBt0CIwDld96zIY4Coey7jyCXlZXOTTddgpcB5U9w/cY+saGXBLhpybL3ST5E0VuhDqF0JVKvoBd2ibld5g4pu15lsvv/KSdIWGKYEkFzfiTXX7o46uT773g9C7/HWyOl1DTvaZARqeTkihxatIUUfNahhiMtNGOaRX+DhZKQ48LIAk4ALH8KgWlwOeldJ/LSJZPElz/bScWXxM2u6cBPGr6P+PydhAF3jO4KoFlueJ8WU+zw4aZRH0Gt3JjDXavATtkuZtMEBrjDFzmybN+uA9OLO0qN8Ho6NLMDuldEBphKUsGwttsNOFdp/YL4WepOiXrL1rn2r12j94OeEUjdEYMktQwCB7t0kxwegQbn7jFPxHBR9bFH13aShTHFazaAhbR3v5CuAEHaXlTZ5osjA2pBgB"}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":616,"cache_read_input_tokens":21088,"cache_creation":{"ephemeral_5m_input_tokens":616,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard"}},"requestId":"req_011CWHRcdq2KLZDaLXL3SW24","type":"assistant","uuid":"86454311-c035-4593-bfa9-c0c461423054","timestamp":"2025-12-20T05:57:37.748Z"} | |
| {"parentUuid":"86454311-c035-4593-bfa9-c0c461423054","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_0164x7srgVkvdHanrshbMLYt","type":"message","role":"assistant","content":[{"type":"text","text":"Let me read the demo.html and polyfill code, and fetch the WebKit blog post to understand what needs to be fixed."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":616,"cache_read_input_tokens":21088,"cache_creation":{"ephemeral_5m_input_tokens":616,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard"}},"requestId":"req_011CWHRcdq2KLZDaLXL3SW24","type":"assistant","uuid":"5b752dea-98fc-44a3-8397-59b829dab72e","timestamp":"2025-12-20T05:57:38.242Z"} | |
| {"parentUuid":"5b752dea-98fc-44a3-8397-59b829dab72e","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_0164x7srgVkvdHanrshbMLYt","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01PU62y3o1LH283nvEgi2G1P","name":"Read","input":{"file_path":"/private/tmp/files/demo.html"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":616,"cache_read_input_tokens":21088,"cache_creation":{"ephemeral_5m_input_tokens":616,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard"}},"requestId":"req_011CWHRcdq2KLZDaLXL3SW24","type":"assistant","uuid":"55e99881-a2c4-45e5-8855-1d2c26b436fa","timestamp":"2025-12-20T05:57:38.602Z"} | |
| {"parentUuid":"55e99881-a2c4-45e5-8855-1d2c26b436fa","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_0164x7srgVkvdHanrshbMLYt","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01QFxhkeXtKXdHNdceDpKSXw","name":"Read","input":{"file_path":"/private/tmp/files/grid-lanes-polyfill.js"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":616,"cache_read_input_tokens":21088,"cache_creation":{"ephemeral_5m_input_tokens":616,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard"}},"requestId":"req_011CWHRcdq2KLZDaLXL3SW24","type":"assistant","uuid":"05f00245-b50f-4683-af80-4938c6ee6314","timestamp":"2025-12-20T05:57:39.015Z"} | |
| {"parentUuid":"05f00245-b50f-4683-af80-4938c6ee6314","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_0164x7srgVkvdHanrshbMLYt","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01SWW6gND4p4e7wNEKZ33hXE","name":"WebFetch","input":{"url":"https://webkit.org/blog/17660/introducing-css-grid-lanes/","prompt":"Explain how CSS Grid Lanes work, specifically the display: masonry or grid-lanes feature. What CSS properties are used? How does the masonry layout algorithm work? What are the key CSS properties like masonry-direction, masonry-fill, etc.?"}}],"stop_reason":"tool_use","stop_sequence":null,"usage":{"input_tokens":9,"cache_creation_input_tokens":616,"cache_read_input_tokens":21088,"cache_creation":{"ephemeral_5m_input_tokens":616,"ephemeral_1h_input_tokens":0},"output_tokens":331,"service_tier":"standard"}},"requestId":"req_011CWHRcdq2KLZDaLXL3SW24","type":"assistant","uuid":"17cf83d3-b534-4062-944e-fca652928df1","timestamp":"2025-12-20T05:57:41.020Z"} | |
| {"parentUuid":"17cf83d3-b534-4062-944e-fca652928df1","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01PU62y3o1LH283nvEgi2G1P","type":"tool_result","content":" 1→<!DOCTYPE html>\n 2→<html lang=\"en\">\n 3→<head>\n 4→ <meta charset=\"UTF-8\">\n 5→ <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n 6→ <title>CSS Grid Lanes Polyfill Demo</title>\n 7→ <style>\n 8→ @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Space+Mono&display=swap');\n 9→\n 10→ * {\n 11→ box-sizing: border-box;\n 12→ margin: 0;\n 13→ padding: 0;\n 14→ }\n 15→\n 16→ :root {\n 17→ --bg: #0a0a0f;\n 18→ --surface: #16161d;\n 19→ --surface-hover: #1e1e28;\n 20→ --border: #2a2a35;\n 21→ --text: #e8e8ed;\n 22→ --text-muted: #8888a0;\n 23→ --accent: #6366f1;\n 24→ --accent-light: #818cf8;\n 25→ --success: #22c55e;\n 26→ --warning: #f59e0b;\n 27→ }\n 28→\n 29→ body {\n 30→ font-family: 'DM Sans', system-ui, sans-serif;\n 31→ background: var(--bg);\n 32→ color: var(--text);\n 33→ line-height: 1.6;\n 34→ min-height: 100vh;\n 35→ }\n 36→\n 37→ header {\n 38→ padding: 3rem 2rem;\n 39→ text-align: center;\n 40→ border-bottom: 1px solid var(--border);\n 41→ background: linear-gradient(180deg, #12121a 0%, var(--bg) 100%);\n 42→ }\n 43→\n 44→ header h1 {\n 45→ font-size: clamp(2rem, 5vw, 3.5rem);\n 46→ font-weight: 700;\n 47→ background: linear-gradient(135deg, var(--text) 0%, var(--accent-light) 100%);\n 48→ -webkit-background-clip: text;\n 49→ -webkit-text-fill-color: transparent;\n 50→ background-clip: text;\n 51→ margin-bottom: 1rem;\n 52→ }\n 53→\n 54→ header p {\n 55→ color: var(--text-muted);\n 56→ font-size: 1.125rem;\n 57→ max-width: 600px;\n 58→ margin: 0 auto 1.5rem;\n 59→ }\n 60→\n 61→ .status {\n 62→ display: inline-flex;\n 63→ align-items: center;\n 64→ gap: 0.5rem;\n 65→ padding: 0.5rem 1rem;\n 66→ background: var(--surface);\n 67→ border: 1px solid var(--border);\n 68→ border-radius: 2rem;\n 69→ font-family: 'Space Mono', monospace;\n 70→ font-size: 0.875rem;\n 71→ }\n 72→\n 73→ .status::before {\n 74→ content: '';\n 75→ width: 8px;\n 76→ height: 8px;\n 77→ border-radius: 50%;\n 78→ background: var(--success);\n 79→ animation: pulse 2s infinite;\n 80→ }\n 81→\n 82→ @keyframes pulse {\n 83→ 0%, 100% { opacity: 1; }\n 84→ 50% { opacity: 0.5; }\n 85→ }\n 86→\n 87→ main {\n 88→ max-width: 1400px;\n 89→ margin: 0 auto;\n 90→ padding: 2rem;\n 91→ }\n 92→\n 93→ section {\n 94→ margin-bottom: 4rem;\n 95→ }\n 96→\n 97→ section h2 {\n 98→ font-size: 1.5rem;\n 99→ margin-bottom: 0.5rem;\n 100→ color: var(--text);\n 101→ }\n 102→\n 103→ section > p {\n 104→ color: var(--text-muted);\n 105→ margin-bottom: 1.5rem;\n 106→ }\n 107→\n 108→ pre {\n 109→ background: var(--surface);\n 110→ border: 1px solid var(--border);\n 111→ border-radius: 0.75rem;\n 112→ padding: 1.5rem;\n 113→ overflow-x: auto;\n 114→ font-family: 'Space Mono', monospace;\n 115→ font-size: 0.875rem;\n 116→ color: var(--accent-light);\n 117→ margin-bottom: 1.5rem;\n 118→ }\n 119→\n 120→ /* Demo 1: Basic Photo Gallery */\n 121→ .gallery {\n 122→ display: grid-lanes;\n 123→ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n 124→ gap: 16px;\n 125→ }\n 126→\n 127→ .gallery-item {\n 128→ border-radius: 12px;\n 129→ overflow: hidden;\n 130→ background: var(--surface);\n 131→ border: 1px solid var(--border);\n 132→ transition: transform 0.2s, box-shadow 0.2s;\n 133→ }\n 134→\n 135→ .gallery-item:hover {\n 136→ transform: translateY(-4px);\n 137→ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);\n 138→ }\n 139→\n 140→ .gallery-item img {\n 141→ width: 100%;\n 142→ height: auto;\n 143→ display: block;\n 144→ }\n 145→\n 146→ /* Demo 2: Varying Column Widths */\n 147→ .varying-cols {\n 148→ display: grid-lanes;\n 149→ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr) minmax(180px, 2fr)) minmax(120px, 1fr);\n 150→ gap: 12px;\n 151→ }\n 152→\n 153→ .card {\n 154→ background: var(--surface);\n 155→ border: 1px solid var(--border);\n 156→ border-radius: 12px;\n 157→ padding: 1.5rem;\n 158→ transition: border-color 0.2s;\n 159→ }\n 160→\n 161→ .card:hover {\n 162→ border-color: var(--accent);\n 163→ }\n 164→\n 165→ .card h3 {\n 166→ font-size: 1rem;\n 167→ margin-bottom: 0.5rem;\n 168→ color: var(--text);\n 169→ }\n 170→\n 171→ .card p {\n 172→ font-size: 0.875rem;\n 173→ color: var(--text-muted);\n 174→ }\n 175→\n 176→ /* Demo 3: Newspaper Layout with Spanning */\n 177→ .newspaper {\n 178→ display: grid-lanes;\n 179→ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n 180→ gap: 24px;\n 181→ --item-tolerance: 1em;\n 182→ }\n 183→\n 184→ .article {\n 185→ background: var(--surface);\n 186→ border: 1px solid var(--border);\n 187→ border-radius: 12px;\n 188→ padding: 1.5rem;\n 189→ }\n 190→\n 191→ .article.hero {\n 192→ grid-column: span 3;\n 193→ background: linear-gradient(135deg, var(--surface) 0%, #1a1a2e 100%);\n 194→ border-color: var(--accent);\n 195→ }\n 196→\n 197→ .article.featured {\n 198→ grid-column: span 2;\n 199→ }\n 200→\n 201→ .article h3 {\n 202→ font-size: 1.125rem;\n 203→ margin-bottom: 0.75rem;\n 204→ line-height: 1.3;\n 205→ }\n 206→\n 207→ .article.hero h3 {\n 208→ font-size: 1.75rem;\n 209→ }\n 210→\n 211→ .article p {\n 212→ color: var(--text-muted);\n 213→ font-size: 0.875rem;\n 214→ }\n 215→\n 216→ .article .meta {\n 217→ font-size: 0.75rem;\n 218→ color: var(--accent-light);\n 219→ margin-top: 1rem;\n 220→ text-transform: uppercase;\n 221→ letter-spacing: 0.05em;\n 222→ }\n 223→\n 224→ /* Demo 4: Explicit Placement */\n 225→ .placed {\n 226→ display: grid-lanes;\n 227→ grid-template-columns: repeat(5, 1fr);\n 228→ gap: 16px;\n 229→ }\n 230→\n 231→ .placed-item {\n 232→ background: var(--surface);\n 233→ border: 1px solid var(--border);\n 234→ border-radius: 8px;\n 235→ padding: 1rem;\n 236→ font-family: 'Space Mono', monospace;\n 237→ font-size: 0.875rem;\n 238→ text-align: center;\n 239→ }\n 240→\n 241→ .placed-item.special {\n 242→ grid-column: -2 / -1;\n 243→ background: linear-gradient(135deg, var(--accent) 0%, #4f46e5 100%);\n 244→ border-color: var(--accent-light);\n 245→ color: white;\n 246→ }\n 247→\n 248→ /* Demo 5: Brick Layout (Horizontal) */\n 249→ .brick {\n 250→ display: grid-lanes;\n 251→ grid-template-rows: repeat(3, 100px);\n 252→ gap: 12px;\n 253→ height: 350px;\n 254→ overflow-x: auto;\n 255→ }\n 256→\n 257→ .brick-item {\n 258→ background: var(--surface);\n 259→ border: 1px solid var(--border);\n 260→ border-radius: 8px;\n 261→ padding: 1rem;\n 262→ display: flex;\n 263→ align-items: center;\n 264→ justify-content: center;\n 265→ font-size: 0.875rem;\n 266→ white-space: nowrap;\n 267→ }\n 268→\n 269→ /* Demo 6: Mega Menu */\n 270→ .mega-menu {\n 271→ display: grid-lanes;\n 272→ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n 273→ gap: 32px 24px;\n 274→ background: var(--surface);\n 275→ border: 1px solid var(--border);\n 276→ border-radius: 16px;\n 277→ padding: 2rem;\n 278→ }\n 279→\n 280→ .menu-group h4 {\n 281→ font-size: 0.75rem;\n 282→ text-transform: uppercase;\n 283→ letter-spacing: 0.1em;\n 284→ color: var(--accent-light);\n 285→ margin-bottom: 1rem;\n 286→ padding-bottom: 0.5rem;\n 287→ border-bottom: 1px solid var(--border);\n 288→ }\n 289→\n 290→ .menu-group ul {\n 291→ list-style: none;\n 292→ }\n 293→\n 294→ .menu-group li {\n 295→ margin-bottom: 0.5rem;\n 296→ }\n 297→\n 298→ .menu-group a {\n 299→ color: var(--text-muted);\n 300→ text-decoration: none;\n 301→ font-size: 0.875rem;\n 302→ transition: color 0.2s;\n 303→ }\n 304→\n 305→ .menu-group a:hover {\n 306→ color: var(--text);\n 307→ }\n 308→\n 309→ /* Utility */\n 310→ .demo-container {\n 311→ background: var(--bg);\n 312→ border: 1px solid var(--border);\n 313→ border-radius: 16px;\n 314→ padding: 1.5rem;\n 315→ }\n 316→\n 317→ footer {\n 318→ text-align: center;\n 319→ padding: 3rem 2rem;\n 320→ border-top: 1px solid var(--border);\n 321→ color: var(--text-muted);\n 322→ }\n 323→\n 324→ footer a {\n 325→ color: var(--accent-light);\n 326→ text-decoration: none;\n 327→ }\n 328→\n 329→ footer a:hover {\n 330→ text-decoration: underline;\n 331→ }\n 332→ </style>\n 333→</head>\n 334→<body>\n 335→ <header>\n 336→ <h1>CSS Grid Lanes Polyfill</h1>\n 337→ <p>A polyfill for the new <code>display: grid-lanes</code> CSS feature, enabling masonry-style layouts in all browsers.</p>\n 338→ <div class=\"status\" id=\"status\">Checking support...</div>\n 339→ </header>\n 340→\n 341→ <main>\n 342→ <!-- Demo 1: Basic Gallery -->\n 343→ <section>\n 344→ <h2>Basic Photo Gallery</h2>\n 345→ <p>The classic masonry layout with auto-fill columns. Items flow into whichever column gets them closest to the top.</p>\n 346→ <pre><code>.gallery {\n 347→ display: grid-lanes;\n 348→ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n 349→ gap: 16px;\n 350→}</code></pre>\n 351→ <div class=\"demo-container\">\n 352→ <div class=\"gallery\">\n 353→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/300?random=1\" alt=\"Photo 1\"></div>\n 354→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/500?random=2\" alt=\"Photo 2\"></div>\n 355→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/350?random=3\" alt=\"Photo 3\"></div>\n 356→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/280?random=4\" alt=\"Photo 4\"></div>\n 357→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/420?random=5\" alt=\"Photo 5\"></div>\n 358→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/320?random=6\" alt=\"Photo 6\"></div>\n 359→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/450?random=7\" alt=\"Photo 7\"></div>\n 360→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/380?random=8\" alt=\"Photo 8\"></div>\n 361→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/340?random=9\" alt=\"Photo 9\"></div>\n 362→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/290?random=10\" alt=\"Photo 10\"></div>\n 363→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/400?random=11\" alt=\"Photo 11\"></div>\n 364→ <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/360?random=12\" alt=\"Photo 12\"></div>\n 365→ </div>\n 366→ </div>\n 367→ </section>\n 368→\n 369→ <!-- Demo 2: Varying Column Widths -->\n 370→ <section>\n 371→ <h2>Varying Column Widths</h2>\n 372→ <p>Alternating narrow and wide columns using complex repeat patterns.</p>\n 373→ <pre><code>.varying-cols {\n 374→ display: grid-lanes;\n 375→ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr) minmax(180px, 2fr)) minmax(120px, 1fr);\n 376→ gap: 12px;\n 377→}</code></pre>\n 378→ <div class=\"demo-container\">\n 379→ <div class=\"varying-cols\">\n 380→ <div class=\"card\"><h3>Short</h3><p>Brief content.</p></div>\n 381→ <div class=\"card\"><h3>Medium Card</h3><p>This card has a moderate amount of content that takes up more vertical space.</p></div>\n 382→ <div class=\"card\"><h3>Tiny</h3><p>Minimal.</p></div>\n 383→ <div class=\"card\"><h3>Longer Content</h3><p>This card contains significantly more text content that will cause it to be taller than some of its neighbors.</p></div>\n 384→ <div class=\"card\"><h3>Quick</h3><p>Fast read.</p></div>\n 385→ <div class=\"card\"><h3>Extended</h3><p>A more detailed description that spans multiple lines and creates visual variety.</p></div>\n 386→ <div class=\"card\"><h3>Brief</h3><p>Short.</p></div>\n 387→ <div class=\"card\"><h3>Standard</h3><p>Average length content for demonstration purposes.</p></div>\n 388→ </div>\n 389→ </div>\n 390→ </section>\n 391→\n 392→ <!-- Demo 3: Newspaper Layout -->\n 393→ <section>\n 394→ <h2>Newspaper Layout with Spanning</h2>\n 395→ <p>Using <code>grid-column: span N</code> to create hero and featured articles.</p>\n 396→ <pre><code>.newspaper {\n 397→ display: grid-lanes;\n 398→ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n 399→ gap: 24px;\n 400→}\n 401→.article.hero { grid-column: span 3; }\n 402→.article.featured { grid-column: span 2; }</code></pre>\n 403→ <div class=\"demo-container\">\n 404→ <div class=\"newspaper\">\n 405→ <article class=\"article hero\">\n 406→ <h3>Breaking: CSS Grid Lanes Revolutionizes Web Layout</h3>\n 407→ <p>The long-awaited masonry layout feature has finally arrived, bringing native support for waterfall-style layouts without JavaScript.</p>\n 408→ <div class=\"meta\">Technology • 5 min read</div>\n 409→ </article>\n 410→ <article class=\"article featured\">\n 411→ <h3>The Future of Responsive Design</h3>\n 412→ <p>How Grid Lanes changes everything we know about fluid layouts.</p>\n 413→ <div class=\"meta\">Design • 3 min read</div>\n 414→ </article>\n 415→ <article class=\"article featured\">\n 416→ <h3>Performance Gains with Native Masonry</h3>\n 417→ <p>Benchmarks show significant improvements over JavaScript solutions.</p>\n 418→ <div class=\"meta\">Performance • 4 min read</div>\n 419→ </article>\n 420→ <article class=\"article\">\n 421→ <h3>Quick Start Guide</h3>\n 422→ <p>Get started in minutes.</p>\n 423→ <div class=\"meta\">Tutorial</div>\n 424→ </article>\n 425→ <article class=\"article\">\n 426→ <h3>Browser Support Matrix</h3>\n 427→ <p>Current implementation status across browsers.</p>\n 428→ <div class=\"meta\">Compatibility</div>\n 429→ </article>\n 430→ <article class=\"article\">\n 431→ <h3>Migration Tips</h3>\n 432→ <p>Moving from JS masonry libraries to native CSS.</p>\n 433→ <div class=\"meta\">Guide</div>\n 434→ </article>\n 435→ <article class=\"article\">\n 436→ <h3>Accessibility Considerations</h3>\n 437→ <p>Ensuring your masonry layouts work for everyone.</p>\n 438→ <div class=\"meta\">A11y</div>\n 439→ </article>\n 440→ <article class=\"article\">\n 441→ <h3>Advanced Patterns</h3>\n 442→ <p>Complex layouts with explicit placement.</p>\n 443→ <div class=\"meta\">Advanced</div>\n 444→ </article>\n 445→ </div>\n 446→ </div>\n 447→ </section>\n 448→\n 449→ <!-- Demo 4: Explicit Placement -->\n 450→ <section>\n 451→ <h2>Explicit Placement</h2>\n 452→ <p>Using negative indices to place items in specific columns (the \"Special\" item is placed in the last column).</p>\n 453→ <pre><code>.placed {\n 454→ display: grid-lanes;\n 455→ grid-template-columns: repeat(5, 1fr);\n 456→ gap: 16px;\n 457→}\n 458→.special { grid-column: -2 / -1; }</code></pre>\n 459→ <div class=\"demo-container\">\n 460→ <div class=\"placed\">\n 461→ <div class=\"placed-item special\">Special<br>(last column)</div>\n 462→ <div class=\"placed-item\">Item 1</div>\n 463→ <div class=\"placed-item\">Item 2<br>+more</div>\n 464→ <div class=\"placed-item\">Item 3</div>\n 465→ <div class=\"placed-item\">Item 4<br>+extra<br>+content</div>\n 466→ <div class=\"placed-item\">Item 5</div>\n 467→ <div class=\"placed-item\">Item 6<br>+more</div>\n 468→ <div class=\"placed-item\">Item 7</div>\n 469→ <div class=\"placed-item\">Item 8</div>\n 470→ </div>\n 471→ </div>\n 472→ </section>\n 473→\n 474→ <!-- Demo 5: Brick Layout -->\n 475→ <section>\n 476→ <h2>Brick Layout (Horizontal)</h2>\n 477→ <p>Define rows instead of columns to create horizontal masonry flow.</p>\n 478→ <pre><code>.brick {\n 479→ display: grid-lanes;\n 480→ grid-template-rows: repeat(3, 100px);\n 481→ gap: 12px;\n 482→}</code></pre>\n 483→ <div class=\"demo-container\">\n 484→ <div class=\"brick\">\n 485→ <div class=\"brick-item\" style=\"width: 120px;\">Brick 1</div>\n 486→ <div class=\"brick-item\" style=\"width: 180px;\">Brick 2 (wider)</div>\n 487→ <div class=\"brick-item\" style=\"width: 100px;\">Brick 3</div>\n 488→ <div class=\"brick-item\" style=\"width: 150px;\">Brick 4</div>\n 489→ <div class=\"brick-item\" style=\"width: 200px;\">Brick 5 (widest)</div>\n 490→ <div class=\"brick-item\" style=\"width: 130px;\">Brick 6</div>\n 491→ <div class=\"brick-item\" style=\"width: 110px;\">Brick 7</div>\n 492→ <div class=\"brick-item\" style=\"width: 160px;\">Brick 8</div>\n 493→ <div class=\"brick-item\" style=\"width: 140px;\">Brick 9</div>\n 494→ </div>\n 495→ </div>\n 496→ </section>\n 497→\n 498→ <!-- Demo 6: Mega Menu -->\n 499→ <section>\n 500→ <h2>Mega Menu Footer</h2>\n 501→ <p>Perfect for navigation footers with variable-length link groups.</p>\n 502→ <pre><code>.mega-menu {\n 503→ display: grid-lanes;\n 504→ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n 505→ gap: 32px 24px;\n 506→}</code></pre>\n 507→ <div class=\"demo-container\">\n 508→ <nav class=\"mega-menu\">\n 509→ <div class=\"menu-group\">\n 510→ <h4>Products</h4>\n 511→ <ul>\n 512→ <li><a href=\"#\">Overview</a></li>\n 513→ <li><a href=\"#\">Features</a></li>\n 514→ <li><a href=\"#\">Pricing</a></li>\n 515→ <li><a href=\"#\">Enterprise</a></li>\n 516→ </ul>\n 517→ </div>\n 518→ <div class=\"menu-group\">\n 519→ <h4>Resources</h4>\n 520→ <ul>\n 521→ <li><a href=\"#\">Documentation</a></li>\n 522→ <li><a href=\"#\">API Reference</a></li>\n 523→ <li><a href=\"#\">Tutorials</a></li>\n 524→ <li><a href=\"#\">Blog</a></li>\n 525→ <li><a href=\"#\">Community</a></li>\n 526→ <li><a href=\"#\">Support</a></li>\n 527→ </ul>\n 528→ </div>\n 529→ <div class=\"menu-group\">\n 530→ <h4>Company</h4>\n 531→ <ul>\n 532→ <li><a href=\"#\">About</a></li>\n 533→ <li><a href=\"#\">Careers</a></li>\n 534→ <li><a href=\"#\">Press</a></li>\n 535→ </ul>\n 536→ </div>\n 537→ <div class=\"menu-group\">\n 538→ <h4>Legal</h4>\n 539→ <ul>\n 540→ <li><a href=\"#\">Privacy</a></li>\n 541→ <li><a href=\"#\">Terms</a></li>\n 542→ <li><a href=\"#\">Security</a></li>\n 543→ <li><a href=\"#\">Compliance</a></li>\n 544→ <li><a href=\"#\">GDPR</a></li>\n 545→ </ul>\n 546→ </div>\n 547→ <div class=\"menu-group\">\n 548→ <h4>Connect</h4>\n 549→ <ul>\n 550→ <li><a href=\"#\">Twitter</a></li>\n 551→ <li><a href=\"#\">GitHub</a></li>\n 552→ <li><a href=\"#\">Discord</a></li>\n 553→ <li><a href=\"#\">LinkedIn</a></li>\n 554→ <li><a href=\"#\">YouTube</a></li>\n 555→ <li><a href=\"#\">Newsletter</a></li>\n 556→ <li><a href=\"#\">RSS</a></li>\n 557→ </ul>\n 558→ </div>\n 559→ <div class=\"menu-group\">\n 560→ <h4>More</h4>\n 561→ <ul>\n 562→ <li><a href=\"#\">Status</a></li>\n 563→ <li><a href=\"#\">Changelog</a></li>\n 564→ </ul>\n 565→ </div>\n 566→ </nav>\n 567→ </div>\n 568→ </section>\n 569→ </main>\n 570→\n 571→ <footer>\n 572→ <p>CSS Grid Lanes Polyfill • <a href=\"https://webkit.org/blog/17660/introducing-css-grid-lanes/\">Learn about the native feature</a></p>\n 573→ </footer>\n 574→\n 575→ <script src=\"grid-lanes-polyfill.js\"></script>\n 576→ <script>\n 577→ document.addEventListener('DOMContentLoaded', function() {\n 578→ const statusEl = document.getElementById('status');\n 579→ \n 580→ if (GridLanesPolyfill.supportsGridLanes()) {\n 581→ statusEl.textContent = 'Native support detected ✓';\n 582→ statusEl.style.setProperty('--status-color', '#22c55e');\n 583→ } else {\n 584→ // Initialize polyfill\n 585→ const result = GridLanesPolyfill.init({ force: true });\n 586→ statusEl.textContent = `Polyfill active (${result.instances.size} containers)`;\n 587→ }\n 588→\n 589→ // Handle images loading (re-layout after images load)\n 590→ const images = document.querySelectorAll('.gallery img');\n 591→ let loadedCount = 0;\n 592→ \n 593→ images.forEach(img => {\n 594→ if (img.complete) {\n 595→ loadedCount++;\n 596→ } else {\n 597→ img.addEventListener('load', () => {\n 598→ loadedCount++;\n 599→ if (loadedCount === images.length) {\n 600→ // Refresh all layouts after all images loaded\n 601→ GridLanesPolyfill.init({ force: true });\n 602→ }\n 603→ });\n 604→ }\n 605→ });\n 606→ });\n 607→ </script>\n 608→</body>\n 609→</html>\n 610→\n\n<system-reminder>\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n</system-reminder>\n"}]},"uuid":"cd8a85fc-0bc3-440c-a466-6cf29020f291","timestamp":"2025-12-20T05:57:41.056Z","toolUseResult":{"type":"text","file":{"filePath":"/private/tmp/files/demo.html","content":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>CSS Grid Lanes Polyfill Demo</title>\n <style>\n @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Space+Mono&display=swap');\n\n * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n :root {\n --bg: #0a0a0f;\n --surface: #16161d;\n --surface-hover: #1e1e28;\n --border: #2a2a35;\n --text: #e8e8ed;\n --text-muted: #8888a0;\n --accent: #6366f1;\n --accent-light: #818cf8;\n --success: #22c55e;\n --warning: #f59e0b;\n }\n\n body {\n font-family: 'DM Sans', system-ui, sans-serif;\n background: var(--bg);\n color: var(--text);\n line-height: 1.6;\n min-height: 100vh;\n }\n\n header {\n padding: 3rem 2rem;\n text-align: center;\n border-bottom: 1px solid var(--border);\n background: linear-gradient(180deg, #12121a 0%, var(--bg) 100%);\n }\n\n header h1 {\n font-size: clamp(2rem, 5vw, 3.5rem);\n font-weight: 700;\n background: linear-gradient(135deg, var(--text) 0%, var(--accent-light) 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin-bottom: 1rem;\n }\n\n header p {\n color: var(--text-muted);\n font-size: 1.125rem;\n max-width: 600px;\n margin: 0 auto 1.5rem;\n }\n\n .status {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 2rem;\n font-family: 'Space Mono', monospace;\n font-size: 0.875rem;\n }\n\n .status::before {\n content: '';\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--success);\n animation: pulse 2s infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n main {\n max-width: 1400px;\n margin: 0 auto;\n padding: 2rem;\n }\n\n section {\n margin-bottom: 4rem;\n }\n\n section h2 {\n font-size: 1.5rem;\n margin-bottom: 0.5rem;\n color: var(--text);\n }\n\n section > p {\n color: var(--text-muted);\n margin-bottom: 1.5rem;\n }\n\n pre {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 0.75rem;\n padding: 1.5rem;\n overflow-x: auto;\n font-family: 'Space Mono', monospace;\n font-size: 0.875rem;\n color: var(--accent-light);\n margin-bottom: 1.5rem;\n }\n\n /* Demo 1: Basic Photo Gallery */\n .gallery {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 16px;\n }\n\n .gallery-item {\n border-radius: 12px;\n overflow: hidden;\n background: var(--surface);\n border: 1px solid var(--border);\n transition: transform 0.2s, box-shadow 0.2s;\n }\n\n .gallery-item:hover {\n transform: translateY(-4px);\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);\n }\n\n .gallery-item img {\n width: 100%;\n height: auto;\n display: block;\n }\n\n /* Demo 2: Varying Column Widths */\n .varying-cols {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(120px, 1fr) minmax(180px, 2fr)) minmax(120px, 1fr);\n gap: 12px;\n }\n\n .card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 1.5rem;\n transition: border-color 0.2s;\n }\n\n .card:hover {\n border-color: var(--accent);\n }\n\n .card h3 {\n font-size: 1rem;\n margin-bottom: 0.5rem;\n color: var(--text);\n }\n\n .card p {\n font-size: 0.875rem;\n color: var(--text-muted);\n }\n\n /* Demo 3: Newspaper Layout with Spanning */\n .newspaper {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 24px;\n --item-tolerance: 1em;\n }\n\n .article {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 1.5rem;\n }\n\n .article.hero {\n grid-column: span 3;\n background: linear-gradient(135deg, var(--surface) 0%, #1a1a2e 100%);\n border-color: var(--accent);\n }\n\n .article.featured {\n grid-column: span 2;\n }\n\n .article h3 {\n font-size: 1.125rem;\n margin-bottom: 0.75rem;\n line-height: 1.3;\n }\n\n .article.hero h3 {\n font-size: 1.75rem;\n }\n\n .article p {\n color: var(--text-muted);\n font-size: 0.875rem;\n }\n\n .article .meta {\n font-size: 0.75rem;\n color: var(--accent-light);\n margin-top: 1rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n /* Demo 4: Explicit Placement */\n .placed {\n display: grid-lanes;\n grid-template-columns: repeat(5, 1fr);\n gap: 16px;\n }\n\n .placed-item {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 1rem;\n font-family: 'Space Mono', monospace;\n font-size: 0.875rem;\n text-align: center;\n }\n\n .placed-item.special {\n grid-column: -2 / -1;\n background: linear-gradient(135deg, var(--accent) 0%, #4f46e5 100%);\n border-color: var(--accent-light);\n color: white;\n }\n\n /* Demo 5: Brick Layout (Horizontal) */\n .brick {\n display: grid-lanes;\n grid-template-rows: repeat(3, 100px);\n gap: 12px;\n height: 350px;\n overflow-x: auto;\n }\n\n .brick-item {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n white-space: nowrap;\n }\n\n /* Demo 6: Mega Menu */\n .mega-menu {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n gap: 32px 24px;\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 16px;\n padding: 2rem;\n }\n\n .menu-group h4 {\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n color: var(--accent-light);\n margin-bottom: 1rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid var(--border);\n }\n\n .menu-group ul {\n list-style: none;\n }\n\n .menu-group li {\n margin-bottom: 0.5rem;\n }\n\n .menu-group a {\n color: var(--text-muted);\n text-decoration: none;\n font-size: 0.875rem;\n transition: color 0.2s;\n }\n\n .menu-group a:hover {\n color: var(--text);\n }\n\n /* Utility */\n .demo-container {\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 16px;\n padding: 1.5rem;\n }\n\n footer {\n text-align: center;\n padding: 3rem 2rem;\n border-top: 1px solid var(--border);\n color: var(--text-muted);\n }\n\n footer a {\n color: var(--accent-light);\n text-decoration: none;\n }\n\n footer a:hover {\n text-decoration: underline;\n }\n </style>\n</head>\n<body>\n <header>\n <h1>CSS Grid Lanes Polyfill</h1>\n <p>A polyfill for the new <code>display: grid-lanes</code> CSS feature, enabling masonry-style layouts in all browsers.</p>\n <div class=\"status\" id=\"status\">Checking support...</div>\n </header>\n\n <main>\n <!-- Demo 1: Basic Gallery -->\n <section>\n <h2>Basic Photo Gallery</h2>\n <p>The classic masonry layout with auto-fill columns. Items flow into whichever column gets them closest to the top.</p>\n <pre><code>.gallery {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 16px;\n}</code></pre>\n <div class=\"demo-container\">\n <div class=\"gallery\">\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/300?random=1\" alt=\"Photo 1\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/500?random=2\" alt=\"Photo 2\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/350?random=3\" alt=\"Photo 3\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/280?random=4\" alt=\"Photo 4\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/420?random=5\" alt=\"Photo 5\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/320?random=6\" alt=\"Photo 6\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/450?random=7\" alt=\"Photo 7\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/380?random=8\" alt=\"Photo 8\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/340?random=9\" alt=\"Photo 9\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/290?random=10\" alt=\"Photo 10\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/400?random=11\" alt=\"Photo 11\"></div>\n <div class=\"gallery-item\"><img src=\"https://picsum.photos/400/360?random=12\" alt=\"Photo 12\"></div>\n </div>\n </div>\n </section>\n\n <!-- Demo 2: Varying Column Widths -->\n <section>\n <h2>Varying Column Widths</h2>\n <p>Alternating narrow and wide columns using complex repeat patterns.</p>\n <pre><code>.varying-cols {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(120px, 1fr) minmax(180px, 2fr)) minmax(120px, 1fr);\n gap: 12px;\n}</code></pre>\n <div class=\"demo-container\">\n <div class=\"varying-cols\">\n <div class=\"card\"><h3>Short</h3><p>Brief content.</p></div>\n <div class=\"card\"><h3>Medium Card</h3><p>This card has a moderate amount of content that takes up more vertical space.</p></div>\n <div class=\"card\"><h3>Tiny</h3><p>Minimal.</p></div>\n <div class=\"card\"><h3>Longer Content</h3><p>This card contains significantly more text content that will cause it to be taller than some of its neighbors.</p></div>\n <div class=\"card\"><h3>Quick</h3><p>Fast read.</p></div>\n <div class=\"card\"><h3>Extended</h3><p>A more detailed description that spans multiple lines and creates visual variety.</p></div>\n <div class=\"card\"><h3>Brief</h3><p>Short.</p></div>\n <div class=\"card\"><h3>Standard</h3><p>Average length content for demonstration purposes.</p></div>\n </div>\n </div>\n </section>\n\n <!-- Demo 3: Newspaper Layout -->\n <section>\n <h2>Newspaper Layout with Spanning</h2>\n <p>Using <code>grid-column: span N</code> to create hero and featured articles.</p>\n <pre><code>.newspaper {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 24px;\n}\n.article.hero { grid-column: span 3; }\n.article.featured { grid-column: span 2; }</code></pre>\n <div class=\"demo-container\">\n <div class=\"newspaper\">\n <article class=\"article hero\">\n <h3>Breaking: CSS Grid Lanes Revolutionizes Web Layout</h3>\n <p>The long-awaited masonry layout feature has finally arrived, bringing native support for waterfall-style layouts without JavaScript.</p>\n <div class=\"meta\">Technology • 5 min read</div>\n </article>\n <article class=\"article featured\">\n <h3>The Future of Responsive Design</h3>\n <p>How Grid Lanes changes everything we know about fluid layouts.</p>\n <div class=\"meta\">Design • 3 min read</div>\n </article>\n <article class=\"article featured\">\n <h3>Performance Gains with Native Masonry</h3>\n <p>Benchmarks show significant improvements over JavaScript solutions.</p>\n <div class=\"meta\">Performance • 4 min read</div>\n </article>\n <article class=\"article\">\n <h3>Quick Start Guide</h3>\n <p>Get started in minutes.</p>\n <div class=\"meta\">Tutorial</div>\n </article>\n <article class=\"article\">\n <h3>Browser Support Matrix</h3>\n <p>Current implementation status across browsers.</p>\n <div class=\"meta\">Compatibility</div>\n </article>\n <article class=\"article\">\n <h3>Migration Tips</h3>\n <p>Moving from JS masonry libraries to native CSS.</p>\n <div class=\"meta\">Guide</div>\n </article>\n <article class=\"article\">\n <h3>Accessibility Considerations</h3>\n <p>Ensuring your masonry layouts work for everyone.</p>\n <div class=\"meta\">A11y</div>\n </article>\n <article class=\"article\">\n <h3>Advanced Patterns</h3>\n <p>Complex layouts with explicit placement.</p>\n <div class=\"meta\">Advanced</div>\n </article>\n </div>\n </div>\n </section>\n\n <!-- Demo 4: Explicit Placement -->\n <section>\n <h2>Explicit Placement</h2>\n <p>Using negative indices to place items in specific columns (the \"Special\" item is placed in the last column).</p>\n <pre><code>.placed {\n display: grid-lanes;\n grid-template-columns: repeat(5, 1fr);\n gap: 16px;\n}\n.special { grid-column: -2 / -1; }</code></pre>\n <div class=\"demo-container\">\n <div class=\"placed\">\n <div class=\"placed-item special\">Special<br>(last column)</div>\n <div class=\"placed-item\">Item 1</div>\n <div class=\"placed-item\">Item 2<br>+more</div>\n <div class=\"placed-item\">Item 3</div>\n <div class=\"placed-item\">Item 4<br>+extra<br>+content</div>\n <div class=\"placed-item\">Item 5</div>\n <div class=\"placed-item\">Item 6<br>+more</div>\n <div class=\"placed-item\">Item 7</div>\n <div class=\"placed-item\">Item 8</div>\n </div>\n </div>\n </section>\n\n <!-- Demo 5: Brick Layout -->\n <section>\n <h2>Brick Layout (Horizontal)</h2>\n <p>Define rows instead of columns to create horizontal masonry flow.</p>\n <pre><code>.brick {\n display: grid-lanes;\n grid-template-rows: repeat(3, 100px);\n gap: 12px;\n}</code></pre>\n <div class=\"demo-container\">\n <div class=\"brick\">\n <div class=\"brick-item\" style=\"width: 120px;\">Brick 1</div>\n <div class=\"brick-item\" style=\"width: 180px;\">Brick 2 (wider)</div>\n <div class=\"brick-item\" style=\"width: 100px;\">Brick 3</div>\n <div class=\"brick-item\" style=\"width: 150px;\">Brick 4</div>\n <div class=\"brick-item\" style=\"width: 200px;\">Brick 5 (widest)</div>\n <div class=\"brick-item\" style=\"width: 130px;\">Brick 6</div>\n <div class=\"brick-item\" style=\"width: 110px;\">Brick 7</div>\n <div class=\"brick-item\" style=\"width: 160px;\">Brick 8</div>\n <div class=\"brick-item\" style=\"width: 140px;\">Brick 9</div>\n </div>\n </div>\n </section>\n\n <!-- Demo 6: Mega Menu -->\n <section>\n <h2>Mega Menu Footer</h2>\n <p>Perfect for navigation footers with variable-length link groups.</p>\n <pre><code>.mega-menu {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n gap: 32px 24px;\n}</code></pre>\n <div class=\"demo-container\">\n <nav class=\"mega-menu\">\n <div class=\"menu-group\">\n <h4>Products</h4>\n <ul>\n <li><a href=\"#\">Overview</a></li>\n <li><a href=\"#\">Features</a></li>\n <li><a href=\"#\">Pricing</a></li>\n <li><a href=\"#\">Enterprise</a></li>\n </ul>\n </div>\n <div class=\"menu-group\">\n <h4>Resources</h4>\n <ul>\n <li><a href=\"#\">Documentation</a></li>\n <li><a href=\"#\">API Reference</a></li>\n <li><a href=\"#\">Tutorials</a></li>\n <li><a href=\"#\">Blog</a></li>\n <li><a href=\"#\">Community</a></li>\n <li><a href=\"#\">Support</a></li>\n </ul>\n </div>\n <div class=\"menu-group\">\n <h4>Company</h4>\n <ul>\n <li><a href=\"#\">About</a></li>\n <li><a href=\"#\">Careers</a></li>\n <li><a href=\"#\">Press</a></li>\n </ul>\n </div>\n <div class=\"menu-group\">\n <h4>Legal</h4>\n <ul>\n <li><a href=\"#\">Privacy</a></li>\n <li><a href=\"#\">Terms</a></li>\n <li><a href=\"#\">Security</a></li>\n <li><a href=\"#\">Compliance</a></li>\n <li><a href=\"#\">GDPR</a></li>\n </ul>\n </div>\n <div class=\"menu-group\">\n <h4>Connect</h4>\n <ul>\n <li><a href=\"#\">Twitter</a></li>\n <li><a href=\"#\">GitHub</a></li>\n <li><a href=\"#\">Discord</a></li>\n <li><a href=\"#\">LinkedIn</a></li>\n <li><a href=\"#\">YouTube</a></li>\n <li><a href=\"#\">Newsletter</a></li>\n <li><a href=\"#\">RSS</a></li>\n </ul>\n </div>\n <div class=\"menu-group\">\n <h4>More</h4>\n <ul>\n <li><a href=\"#\">Status</a></li>\n <li><a href=\"#\">Changelog</a></li>\n </ul>\n </div>\n </nav>\n </div>\n </section>\n </main>\n\n <footer>\n <p>CSS Grid Lanes Polyfill • <a href=\"https://webkit.org/blog/17660/introducing-css-grid-lanes/\">Learn about the native feature</a></p>\n </footer>\n\n <script src=\"grid-lanes-polyfill.js\"></script>\n <script>\n document.addEventListener('DOMContentLoaded', function() {\n const statusEl = document.getElementById('status');\n \n if (GridLanesPolyfill.supportsGridLanes()) {\n statusEl.textContent = 'Native support detected ✓';\n statusEl.style.setProperty('--status-color', '#22c55e');\n } else {\n // Initialize polyfill\n const result = GridLanesPolyfill.init({ force: true });\n statusEl.textContent = `Polyfill active (${result.instances.size} containers)`;\n }\n\n // Handle images loading (re-layout after images load)\n const images = document.querySelectorAll('.gallery img');\n let loadedCount = 0;\n \n images.forEach(img => {\n if (img.complete) {\n loadedCount++;\n } else {\n img.addEventListener('load', () => {\n loadedCount++;\n if (loadedCount === images.length) {\n // Refresh all layouts after all images loaded\n GridLanesPolyfill.init({ force: true });\n }\n });\n }\n });\n });\n </script>\n</body>\n</html>\n","numLines":610,"startLine":1,"totalLines":610}}} | |
| {"parentUuid":"cd8a85fc-0bc3-440c-a466-6cf29020f291","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01QFxhkeXtKXdHNdceDpKSXw","type":"tool_result","content":" 1→/**\n 2→ * CSS Grid Lanes Polyfill\n 3→ * \n 4→ * Polyfills the new `display: grid-lanes` CSS feature for browsers\n 5→ * that don't support it natively. Based on the WebKit implementation\n 6→ * described at: https://webkit.org/blog/17660/introducing-css-grid-lanes/\n 7→ * \n 8→ * Features supported:\n 9→ * - display: grid-lanes\n 10→ * - grid-template-columns / grid-template-rows for lane definition\n 11→ * - gap, column-gap, row-gap\n 12→ * - item-tolerance for placement sensitivity\n 13→ * - Spanning items (grid-column: span N)\n 14→ * - Explicit placement (grid-column: N / M)\n 15→ * - Responsive auto-fill/auto-fit with minmax()\n 16→ * - Both waterfall (columns) and brick (rows) layouts\n 17→ * \n 18→ * @version 1.0.0\n 19→ * @license MIT\n 20→ */\n 21→\n 22→(function(global) {\n 23→ 'use strict';\n 24→\n 25→ const POLYFILL_NAME = 'GridLanesPolyfill';\n 26→ const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n 27→ const DEFAULT_TOLERANCE = 16; // ~1em in pixels\n 28→\n 29→ /**\n 30→ * Check if the browser natively supports display: grid-lanes\n 31→ */\n 32→ function supportsGridLanes() {\n 33→ if (typeof CSS === 'undefined' || !CSS.supports) {\n 34→ return false;\n 35→ }\n 36→ return CSS.supports('display', 'grid-lanes');\n 37→ }\n 38→\n 39→ /**\n 40→ * Parse a CSS length value to pixels\n 41→ */\n 42→ function parseLengthToPixels(value, containerSize, fontSize = 16, rootFontSize = 16) {\n 43→ if (!value || value === 'auto' || value === 'none') return null;\n 44→ \n 45→ const num = parseFloat(value);\n 46→ if (isNaN(num)) return null;\n 47→\n 48→ if (value.endsWith('px')) return num;\n 49→ if (value.endsWith('rem')) return num * rootFontSize;\n 50→ if (value.endsWith('em')) return num * fontSize;\n 51→ if (value.endsWith('ch')) return num * fontSize * 0.5; // Approximate\n 52→ if (value.endsWith('lh')) return num * fontSize * 1.2; // Approximate line-height\n 53→ if (value.endsWith('%')) return (num / 100) * containerSize;\n 54→ if (value.endsWith('vw')) return (num / 100) * window.innerWidth;\n 55→ if (value.endsWith('vh')) return (num / 100) * window.innerHeight;\n 56→ if (value.endsWith('vmin')) return (num / 100) * Math.min(window.innerWidth, window.innerHeight);\n 57→ if (value.endsWith('vmax')) return (num / 100) * Math.max(window.innerWidth, window.innerHeight);\n 58→ if (value.endsWith('fr')) return null; // Handled separately\n 59→ \n 60→ // Unitless number treated as pixels\n 61→ if (!isNaN(num) && value === String(num)) return num;\n 62→ \n 63→ return null;\n 64→ }\n 65→\n 66→ /**\n 67→ * Parse minmax() function\n 68→ */\n 69→ function parseMinMax(value) {\n 70→ const match = value.match(/minmax\\(\\s*([^,]+)\\s*,\\s*([^)]+)\\s*\\)/);\n 71→ if (!match) return null;\n 72→ return {\n 73→ min: match[1].trim(),\n 74→ max: match[2].trim()\n 75→ };\n 76→ }\n 77→\n 78→ /**\n 79→ * Parse repeat() function\n 80→ */\n 81→ function parseRepeat(value) {\n 82→ const match = value.match(/repeat\\(\\s*([^,]+)\\s*,\\s*(.+)\\s*\\)/);\n 83→ if (!match) return null;\n 84→ return {\n 85→ count: match[1].trim(),\n 86→ pattern: match[2].trim()\n 87→ };\n 88→ }\n 89→\n 90→ /**\n 91→ * Calculate lane sizes from grid-template-columns/rows\n 92→ */\n 93→ function calculateLaneSizes(template, containerSize, gap, fontSize, rootFontSize) {\n 94→ if (!template || template === 'none' || template === 'auto') {\n 95→ return null;\n 96→ }\n 97→\n 98→ const availableSpace = containerSize;\n 99→ let lanes = [];\n 100→ let totalFr = 0;\n 101→ let fixedSpace = 0;\n 102→\n 103→ // Parse the template\n 104→ const tokens = tokenizeTemplate(template);\n 105→ \n 106→ for (const token of tokens) {\n 107→ // Handle repeat()\n 108→ const repeatInfo = parseRepeat(token);\n 109→ if (repeatInfo) {\n 110→ const { count, pattern } = repeatInfo;\n 111→ const patternTokens = tokenizeTemplate(pattern);\n 112→ \n 113→ if (count === 'auto-fill' || count === 'auto-fit') {\n 114→ // Calculate how many repetitions fit\n 115→ let minSize = 0;\n 116→ let hasFlexible = false;\n 117→ \n 118→ for (const pt of patternTokens) {\n 119→ const minmax = parseMinMax(pt);\n 120→ if (minmax) {\n 121→ const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n 122→ if (minmax.min === 'max-content' || minmax.min === 'min-content') {\n 123→ minSize += 100; // Fallback estimate\n 124→ } else if (minVal !== null) {\n 125→ minSize += minVal;\n 126→ }\n 127→ if (minmax.max.endsWith('fr')) {\n 128→ hasFlexible = true;\n 129→ }\n 130→ } else {\n 131→ const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n 132→ if (size !== null) {\n 133→ minSize += size;\n 134→ } else if (pt.endsWith('fr')) {\n 135→ hasFlexible = true;\n 136→ minSize += 100; // Minimum fallback for fr units\n 137→ }\n 138→ }\n 139→ }\n 140→ \n 141→ // Calculate repetitions\n 142→ const patternCount = patternTokens.length;\n 143→ const gapCount = patternCount - 1;\n 144→ const minPatternSize = minSize + (gapCount * gap);\n 145→ \n 146→ let reps = Math.max(1, Math.floor((availableSpace + gap) / (minPatternSize + gap)));\n 147→ \n 148→ // Expand pattern\n 149→ for (let i = 0; i < reps; i++) {\n 150→ for (const pt of patternTokens) {\n 151→ const minmax = parseMinMax(pt);\n 152→ if (minmax) {\n 153→ const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n 154→ const maxVal = minmax.max.endsWith('fr') \n 155→ ? { fr: parseFloat(minmax.max) }\n 156→ : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n 157→ \n 158→ lanes.push({\n 159→ min: minVal || 0,\n 160→ max: maxVal,\n 161→ size: 0\n 162→ });\n 163→ \n 164→ if (typeof maxVal === 'object' && maxVal.fr) {\n 165→ totalFr += maxVal.fr;\n 166→ }\n 167→ fixedSpace += minVal || 0;\n 168→ } else if (pt.endsWith('fr')) {\n 169→ const fr = parseFloat(pt);\n 170→ lanes.push({ min: 0, max: { fr }, size: 0 });\n 171→ totalFr += fr;\n 172→ } else {\n 173→ const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize) || 0;\n 174→ lanes.push({ min: size, max: size, size });\n 175→ fixedSpace += size;\n 176→ }\n 177→ }\n 178→ }\n 179→ } else {\n 180→ // Fixed repeat count\n 181→ const reps = parseInt(count, 10);\n 182→ for (let i = 0; i < reps; i++) {\n 183→ for (const pt of patternTokens) {\n 184→ const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n 185→ if (pt.endsWith('fr')) {\n 186→ const fr = parseFloat(pt);\n 187→ lanes.push({ min: 0, max: { fr }, size: 0 });\n 188→ totalFr += fr;\n 189→ } else if (size !== null) {\n 190→ lanes.push({ min: size, max: size, size });\n 191→ fixedSpace += size;\n 192→ }\n 193→ }\n 194→ }\n 195→ }\n 196→ continue;\n 197→ }\n 198→\n 199→ // Handle minmax()\n 200→ const minmax = parseMinMax(token);\n 201→ if (minmax) {\n 202→ const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n 203→ const maxVal = minmax.max.endsWith('fr')\n 204→ ? { fr: parseFloat(minmax.max) }\n 205→ : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n 206→ \n 207→ lanes.push({ min: minVal || 0, max: maxVal, size: 0 });\n 208→ if (typeof maxVal === 'object' && maxVal.fr) {\n 209→ totalFr += maxVal.fr;\n 210→ }\n 211→ fixedSpace += minVal || 0;\n 212→ continue;\n 213→ }\n 214→\n 215→ // Handle fr units\n 216→ if (token.endsWith('fr')) {\n 217→ const fr = parseFloat(token);\n 218→ lanes.push({ min: 0, max: { fr }, size: 0 });\n 219→ totalFr += fr;\n 220→ continue;\n 221→ }\n 222→\n 223→ // Handle fixed sizes\n 224→ const size = parseLengthToPixels(token, containerSize, fontSize, rootFontSize);\n 225→ if (size !== null) {\n 226→ lanes.push({ min: size, max: size, size });\n 227→ fixedSpace += size;\n 228→ }\n 229→ }\n 230→\n 231→ // Calculate final sizes\n 232→ const totalGaps = Math.max(0, lanes.length - 1) * gap;\n 233→ const flexSpace = Math.max(0, availableSpace - fixedSpace - totalGaps);\n 234→ const frUnit = totalFr > 0 ? flexSpace / totalFr : 0;\n 235→\n 236→ for (const lane of lanes) {\n 237→ if (typeof lane.max === 'object' && lane.max.fr) {\n 238→ lane.size = Math.max(lane.min, frUnit * lane.max.fr);\n 239→ } else if (typeof lane.max === 'number') {\n 240→ lane.size = Math.min(lane.max, Math.max(lane.min, lane.min));\n 241→ } else {\n 242→ lane.size = lane.min;\n 243→ }\n 244→ }\n 245→\n 246→ return lanes.map(l => l.size);\n 247→ }\n 248→\n 249→ /**\n 250→ * Tokenize a grid template string\n 251→ */\n 252→ function tokenizeTemplate(template) {\n 253→ const tokens = [];\n 254→ let current = '';\n 255→ let parenDepth = 0;\n 256→\n 257→ for (let i = 0; i < template.length; i++) {\n 258→ const char = template[i];\n 259→ \n 260→ if (char === '(') {\n 261→ parenDepth++;\n 262→ current += char;\n 263→ } else if (char === ')') {\n 264→ parenDepth--;\n 265→ current += char;\n 266→ } else if (char === ' ' && parenDepth === 0) {\n 267→ if (current.trim()) {\n 268→ tokens.push(current.trim());\n 269→ }\n 270→ current = '';\n 271→ } else {\n 272→ current += char;\n 273→ }\n 274→ }\n 275→\n 276→ if (current.trim()) {\n 277→ tokens.push(current.trim());\n 278→ }\n 279→\n 280→ return tokens;\n 281→ }\n 282→\n 283→ /**\n 284→ * Get computed styles for grid-lanes properties\n 285→ */\n 286→ function getGridLanesStyles(element) {\n 287→ const computed = window.getComputedStyle(element);\n 288→ const fontSize = parseFloat(computed.fontSize) || 16;\n 289→ const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n 290→\n 291→ // Get gap values\n 292→ const gap = computed.gap || computed.gridGap || '0px';\n 293→ const columnGap = computed.columnGap || computed.gridColumnGap || gap;\n 294→ const rowGap = computed.rowGap || computed.gridRowGap || gap;\n 295→\n 296→ // Parse item-tolerance (custom property or default)\n 297→ let tolerance = DEFAULT_TOLERANCE;\n 298→ const toleranceValue = computed.getPropertyValue('--item-tolerance').trim() ||\n 299→ computed.getPropertyValue('item-tolerance').trim();\n 300→ if (toleranceValue) {\n 301→ const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n 302→ if (parsed !== null) tolerance = parsed;\n 303→ }\n 304→\n 305→ return {\n 306→ gridTemplateColumns: computed.gridTemplateColumns,\n 307→ gridTemplateRows: computed.gridTemplateRows,\n 308→ columnGap: parseLengthToPixels(columnGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n 309→ rowGap: parseLengthToPixels(rowGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n 310→ fontSize,\n 311→ rootFontSize,\n 312→ tolerance\n 313→ };\n 314→ }\n 315→\n 316→ /**\n 317→ * Get item placement properties\n 318→ */\n 319→ function getItemStyles(element) {\n 320→ const computed = window.getComputedStyle(element);\n 321→ const gridColumn = computed.gridColumn || computed.gridColumnStart;\n 322→ const gridRow = computed.gridRow || computed.gridRowStart;\n 323→\n 324→ let columnSpan = 1;\n 325→ let columnStart = null;\n 326→ let columnEnd = null;\n 327→ let rowSpan = 1;\n 328→ let rowStart = null;\n 329→ let rowEnd = null;\n 330→\n 331→ // Parse grid-column\n 332→ if (gridColumn && gridColumn !== 'auto') {\n 333→ const spanMatch = gridColumn.match(/span\\s+(\\d+)/);\n 334→ if (spanMatch) {\n 335→ columnSpan = parseInt(spanMatch[1], 10);\n 336→ } else if (gridColumn.includes('/')) {\n 337→ const [start, end] = gridColumn.split('/').map(s => s.trim());\n 338→ columnStart = parseInt(start, 10);\n 339→ columnEnd = parseInt(end, 10);\n 340→ if (!isNaN(columnStart) && !isNaN(columnEnd)) {\n 341→ columnSpan = Math.abs(columnEnd - columnStart);\n 342→ }\n 343→ } else {\n 344→ const num = parseInt(gridColumn, 10);\n 345→ if (!isNaN(num)) {\n 346→ columnStart = num;\n 347→ }\n 348→ }\n 349→ }\n 350→\n 351→ // Parse grid-row\n 352→ if (gridRow && gridRow !== 'auto') {\n 353→ const spanMatch = gridRow.match(/span\\s+(\\d+)/);\n 354→ if (spanMatch) {\n 355→ rowSpan = parseInt(spanMatch[1], 10);\n 356→ } else if (gridRow.includes('/')) {\n 357→ const [start, end] = gridRow.split('/').map(s => s.trim());\n 358→ rowStart = parseInt(start, 10);\n 359→ rowEnd = parseInt(end, 10);\n 360→ if (!isNaN(rowStart) && !isNaN(rowEnd)) {\n 361→ rowSpan = Math.abs(rowEnd - rowStart);\n 362→ }\n 363→ } else {\n 364→ const num = parseInt(gridRow, 10);\n 365→ if (!isNaN(num)) {\n 366→ rowStart = num;\n 367→ }\n 368→ }\n 369→ }\n 370→\n 371→ return {\n 372→ columnSpan,\n 373→ columnStart,\n 374→ columnEnd,\n 375→ rowSpan,\n 376→ rowStart,\n 377→ rowEnd\n 378→ };\n 379→ }\n 380→\n 381→ /**\n 382→ * Main Grid Lanes layout class\n 383→ */\n 384→ class GridLanesLayout {\n 385→ constructor(container, options = {}) {\n 386→ this.container = container;\n 387→ this.options = options;\n 388→ this.isVertical = true; // true = waterfall (columns), false = brick (rows)\n 389→ this.lanes = [];\n 390→ this.laneHeights = [];\n 391→ this.resizeObserver = null;\n 392→ this.mutationObserver = null;\n 393→ \n 394→ this.init();\n 395→ }\n 396→\n 397→ init() {\n 398→ // Mark as polyfilled\n 399→ this.container.setAttribute(POLYFILL_ATTR, 'true');\n 400→ \n 401→ // Set up container styles\n 402→ this.container.style.position = 'relative';\n 403→ this.container.style.display = 'block';\n 404→ \n 405→ // Initial layout\n 406→ this.layout();\n 407→ \n 408→ // Set up observers\n 409→ this.setupObservers();\n 410→ }\n 411→\n 412→ setupObservers() {\n 413→ // Resize observer for responsive layouts\n 414→ this.resizeObserver = new ResizeObserver(() => {\n 415→ this.layout();\n 416→ });\n 417→ this.resizeObserver.observe(this.container);\n 418→\n 419→ // Mutation observer for dynamic content\n 420→ this.mutationObserver = new MutationObserver((mutations) => {\n 421→ let shouldRelayout = false;\n 422→ for (const mutation of mutations) {\n 423→ if (mutation.type === 'childList' || \n 424→ (mutation.type === 'attributes' && mutation.attributeName === 'style')) {\n 425→ shouldRelayout = true;\n 426→ break;\n 427→ }\n 428→ }\n 429→ if (shouldRelayout) {\n 430→ this.layout();\n 431→ }\n 432→ });\n 433→ this.mutationObserver.observe(this.container, {\n 434→ childList: true,\n 435→ subtree: false,\n 436→ attributes: true,\n 437→ attributeFilter: ['style', 'class']\n 438→ });\n 439→ }\n 440→\n 441→ layout() {\n 442→ const styles = getGridLanesStyles(this.container);\n 443→ const containerRect = this.container.getBoundingClientRect();\n 444→ \n 445→ // Determine direction based on which template is defined\n 446→ const hasColumns = styles.gridTemplateColumns && \n 447→ styles.gridTemplateColumns !== 'none' &&\n 448→ !styles.gridTemplateColumns.startsWith('auto');\n 449→ const hasRows = styles.gridTemplateRows && \n 450→ styles.gridTemplateRows !== 'none' &&\n 451→ !styles.gridTemplateRows.startsWith('auto');\n 452→ \n 453→ this.isVertical = hasColumns || !hasRows;\n 454→ \n 455→ // Calculate lane sizes\n 456→ if (this.isVertical) {\n 457→ this.lanes = calculateLaneSizes(\n 458→ styles.gridTemplateColumns,\n 459→ containerRect.width,\n 460→ styles.columnGap,\n 461→ styles.fontSize,\n 462→ styles.rootFontSize\n 463→ ) || [containerRect.width];\n 464→ } else {\n 465→ this.lanes = calculateLaneSizes(\n 466→ styles.gridTemplateRows,\n 467→ containerRect.height,\n 468→ styles.rowGap,\n 469→ styles.fontSize,\n 470→ styles.rootFontSize\n 471→ ) || [containerRect.height];\n 472→ }\n 473→\n 474→ // Initialize lane positions (heights for vertical, widths for horizontal)\n 475→ this.laneHeights = new Array(this.lanes.length).fill(0);\n 476→ \n 477→ // Get all direct children\n 478→ const items = Array.from(this.container.children).filter(\n 479→ el => el.nodeType === Node.ELEMENT_NODE && \n 480→ window.getComputedStyle(el).display !== 'none'\n 481→ );\n 482→\n 483→ // Separate explicitly placed items from auto-placed items\n 484→ const explicitItems = [];\n 485→ const autoItems = [];\n 486→ \n 487→ for (const item of items) {\n 488→ const itemStyles = getItemStyles(item);\n 489→ if (this.isVertical && itemStyles.columnStart !== null) {\n 490→ explicitItems.push({ element: item, styles: itemStyles });\n 491→ } else if (!this.isVertical && itemStyles.rowStart !== null) {\n 492→ explicitItems.push({ element: item, styles: itemStyles });\n 493→ } else {\n 494→ autoItems.push({ element: item, styles: itemStyles });\n 495→ }\n 496→ }\n 497→\n 498→ // Place explicitly positioned items first\n 499→ for (const { element, styles: itemStyles } of explicitItems) {\n 500→ this.placeExplicitItem(element, itemStyles, styles);\n 501→ }\n 502→\n 503→ // Place auto-positioned items\n 504→ for (const { element, styles: itemStyles } of autoItems) {\n 505→ this.placeAutoItem(element, itemStyles, styles);\n 506→ }\n 507→\n 508→ // Set container height\n 509→ const containerHeight = Math.max(...this.laneHeights);\n 510→ this.container.style.minHeight = `${containerHeight}px`;\n 511→ }\n 512→\n 513→ placeExplicitItem(element, itemStyles, containerStyles) {\n 514→ const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n 515→ const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n 516→ \n 517→ let laneIndex;\n 518→ let span;\n 519→ \n 520→ if (this.isVertical) {\n 521→ // Handle negative indices\n 522→ laneIndex = itemStyles.columnStart;\n 523→ if (laneIndex < 0) {\n 524→ laneIndex = this.lanes.length + laneIndex + 1;\n 525→ }\n 526→ laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n 527→ span = itemStyles.columnSpan;\n 528→ } else {\n 529→ laneIndex = itemStyles.rowStart;\n 530→ if (laneIndex < 0) {\n 531→ laneIndex = this.lanes.length + laneIndex + 1;\n 532→ }\n 533→ laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n 534→ span = itemStyles.rowSpan;\n 535→ }\n 536→\n 537→ // Calculate position\n 538→ let position = 0;\n 539→ for (let i = 0; i < laneIndex; i++) {\n 540→ position += this.lanes[i] + gap;\n 541→ }\n 542→\n 543→ // Calculate width (for spanning)\n 544→ let size = 0;\n 545→ const endLane = Math.min(laneIndex + span, this.lanes.length);\n 546→ for (let i = laneIndex; i < endLane; i++) {\n 547→ size += this.lanes[i];\n 548→ if (i < endLane - 1) size += gap;\n 549→ }\n 550→\n 551→ // Get the tallest lane in the span\n 552→ let maxHeight = 0;\n 553→ for (let i = laneIndex; i < endLane; i++) {\n 554→ maxHeight = Math.max(maxHeight, this.laneHeights[i]);\n 555→ }\n 556→\n 557→ // Position the element\n 558→ element.style.position = 'absolute';\n 559→ \n 560→ if (this.isVertical) {\n 561→ element.style.left = `${position}px`;\n 562→ element.style.top = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n 563→ element.style.width = `${size}px`;\n 564→ element.style.height = '';\n 565→ } else {\n 566→ element.style.top = `${position}px`;\n 567→ element.style.left = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n 568→ element.style.height = `${size}px`;\n 569→ element.style.width = '';\n 570→ }\n 571→\n 572→ // Update lane heights\n 573→ const itemRect = element.getBoundingClientRect();\n 574→ const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n 575→ const newHeight = maxHeight + (maxHeight > 0 ? crossGap : 0) + itemSize;\n 576→ \n 577→ for (let i = laneIndex; i < endLane; i++) {\n 578→ this.laneHeights[i] = newHeight;\n 579→ }\n 580→ }\n 581→\n 582→ placeAutoItem(element, itemStyles, containerStyles) {\n 583→ const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n 584→ const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n 585→ const tolerance = containerStyles.tolerance;\n 586→ const span = this.isVertical ? itemStyles.columnSpan : itemStyles.rowSpan;\n 587→\n 588→ // Find the best lane(s) considering tolerance\n 589→ let bestLane = 0;\n 590→ let bestHeight = Infinity;\n 591→\n 592→ for (let i = 0; i <= this.lanes.length - span; i++) {\n 593→ // Get the max height across the span\n 594→ let maxHeight = 0;\n 595→ for (let j = i; j < i + span; j++) {\n 596→ maxHeight = Math.max(maxHeight, this.laneHeights[j]);\n 597→ }\n 598→\n 599→ // Use tolerance to determine if this is meaningfully better\n 600→ if (bestHeight - maxHeight > tolerance) {\n 601→ bestHeight = maxHeight;\n 602→ bestLane = i;\n 603→ } else if (Math.abs(maxHeight - bestHeight) <= tolerance && i < bestLane) {\n 604→ // Within tolerance, prefer earlier lane for reading order\n 605→ bestHeight = maxHeight;\n 606→ bestLane = i;\n 607→ }\n 608→ }\n 609→\n 610→ // Calculate position\n 611→ let position = 0;\n 612→ for (let i = 0; i < bestLane; i++) {\n 613→ position += this.lanes[i] + gap;\n 614→ }\n 615→\n 616→ // Calculate size (for spanning)\n 617→ let size = 0;\n 618→ const endLane = Math.min(bestLane + span, this.lanes.length);\n 619→ for (let i = bestLane; i < endLane; i++) {\n 620→ size += this.lanes[i];\n 621→ if (i < endLane - 1) size += gap;\n 622→ }\n 623→\n 624→ // Position the element\n 625→ element.style.position = 'absolute';\n 626→ \n 627→ if (this.isVertical) {\n 628→ element.style.left = `${position}px`;\n 629→ element.style.top = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n 630→ element.style.width = `${size}px`;\n 631→ element.style.height = '';\n 632→ } else {\n 633→ element.style.top = `${position}px`;\n 634→ element.style.left = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n 635→ element.style.height = `${size}px`;\n 636→ element.style.width = '';\n 637→ }\n 638→\n 639→ // Update lane heights\n 640→ const itemRect = element.getBoundingClientRect();\n 641→ const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n 642→ const newHeight = bestHeight + (bestHeight > 0 ? crossGap : 0) + itemSize;\n 643→ \n 644→ for (let i = bestLane; i < endLane; i++) {\n 645→ this.laneHeights[i] = newHeight;\n 646→ }\n 647→ }\n 648→\n 649→ destroy() {\n 650→ if (this.resizeObserver) {\n 651→ this.resizeObserver.disconnect();\n 652→ }\n 653→ if (this.mutationObserver) {\n 654→ this.mutationObserver.disconnect();\n 655→ }\n 656→ \n 657→ this.container.removeAttribute(POLYFILL_ATTR);\n 658→ this.container.style.position = '';\n 659→ this.container.style.display = '';\n 660→ this.container.style.minHeight = '';\n 661→ \n 662→ // Reset item styles\n 663→ for (const item of this.container.children) {\n 664→ if (item.nodeType === Node.ELEMENT_NODE) {\n 665→ item.style.position = '';\n 666→ item.style.left = '';\n 667→ item.style.top = '';\n 668→ item.style.width = '';\n 669→ item.style.height = '';\n 670→ }\n 671→ }\n 672→ }\n 673→\n 674→ refresh() {\n 675→ this.layout();\n 676→ }\n 677→ }\n 678→\n 679→ /**\n 680→ * Find and process all grid-lanes containers\n 681→ */\n 682→ function processStyleSheets() {\n 683→ const containers = new Set();\n 684→\n 685→ // Check inline styles\n 686→ const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n 687→ for (const el of allElements) {\n 688→ if (el.style.display === 'grid-lanes') {\n 689→ containers.add(el);\n 690→ }\n 691→ }\n 692→\n 693→ // Check stylesheets\n 694→ for (const sheet of document.styleSheets) {\n 695→ try {\n 696→ const rules = sheet.cssRules || sheet.rules;\n 697→ if (!rules) continue;\n 698→\n 699→ for (const rule of rules) {\n 700→ if (rule.style && rule.style.display === 'grid-lanes') {\n 701→ const elements = document.querySelectorAll(rule.selectorText);\n 702→ for (const el of elements) {\n 703→ containers.add(el);\n 704→ }\n 705→ }\n 706→ }\n 707→ } catch (e) {\n 708→ // Cross-origin stylesheets will throw\n 709→ console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n 710→ }\n 711→ }\n 712→\n 713→ return containers;\n 714→ }\n 715→\n 716→ /**\n 717→ * Initialize the polyfill\n 718→ */\n 719→ function init(options = {}) {\n 720→ // Check if native support exists\n 721→ if (supportsGridLanes() && !options.force) {\n 722→ console.log(`${POLYFILL_NAME}: Native support detected, polyfill not needed.`);\n 723→ return { supported: true, instances: [] };\n 724→ }\n 725→\n 726→ const instances = new Map();\n 727→\n 728→ // Process existing containers\n 729→ const containers = processStyleSheets();\n 730→ for (const container of containers) {\n 731→ if (!container.hasAttribute(POLYFILL_ATTR)) {\n 732→ instances.set(container, new GridLanesLayout(container, options));\n 733→ }\n 734→ }\n 735→\n 736→ // Watch for new stylesheets and elements\n 737→ const observer = new MutationObserver((mutations) => {\n 738→ for (const mutation of mutations) {\n 739→ // Check for new style elements\n 740→ if (mutation.type === 'childList') {\n 741→ for (const node of mutation.addedNodes) {\n 742→ if (node.nodeType === Node.ELEMENT_NODE) {\n 743→ // Check if the added element is a grid-lanes container\n 744→ const style = window.getComputedStyle(node);\n 745→ if (node.style.display === 'grid-lanes' || \n 746→ style.getPropertyValue('display') === 'grid-lanes') {\n 747→ if (!instances.has(node)) {\n 748→ instances.set(node, new GridLanesLayout(node, options));\n 749→ }\n 750→ }\n 751→ \n 752→ // Check descendants\n 753→ const descendants = node.querySelectorAll('*');\n 754→ for (const desc of descendants) {\n 755→ const descStyle = window.getComputedStyle(desc);\n 756→ if (desc.style.display === 'grid-lanes' ||\n 757→ descStyle.getPropertyValue('display') === 'grid-lanes') {\n 758→ if (!instances.has(desc)) {\n 759→ instances.set(desc, new GridLanesLayout(desc, options));\n 760→ }\n 761→ }\n 762→ }\n 763→ }\n 764→ }\n 765→ }\n 766→ }\n 767→\n 768→ // Re-scan stylesheets for new rules\n 769→ const newContainers = processStyleSheets();\n 770→ for (const container of newContainers) {\n 771→ if (!instances.has(container)) {\n 772→ instances.set(container, new GridLanesLayout(container, options));\n 773→ }\n 774→ }\n 775→ });\n 776→\n 777→ observer.observe(document.documentElement, {\n 778→ childList: true,\n 779→ subtree: true\n 780→ });\n 781→\n 782→ console.log(`${POLYFILL_NAME}: Initialized, ${instances.size} container(s) found.`);\n 783→\n 784→ return {\n 785→ supported: false,\n 786→ instances,\n 787→ observer,\n 788→ refresh() {\n 789→ for (const instance of instances.values()) {\n 790→ instance.refresh();\n 791→ }\n 792→ },\n 793→ destroy() {\n 794→ observer.disconnect();\n 795→ for (const instance of instances.values()) {\n 796→ instance.destroy();\n 797→ }\n 798→ instances.clear();\n 799→ }\n 800→ };\n 801→ }\n 802→\n 803→ /**\n 804→ * Apply to a specific element\n 805→ */\n 806→ function apply(element, options = {}) {\n 807→ if (supportsGridLanes() && !options.force) {\n 808→ return null;\n 809→ }\n 810→ return new GridLanesLayout(element, options);\n 811→ }\n 812→\n 813→ // Export\n 814→ const GridLanesPolyfill = {\n 815→ supportsGridLanes,\n 816→ init,\n 817→ apply,\n 818→ GridLanesLayout,\n 819→ version: '1.0.0'\n 820→ };\n 821→\n 822→ // AMD\n 823→ if (typeof define === 'function' && define.amd) {\n 824→ define([], function() { return GridLanesPolyfill; });\n 825→ }\n 826→ // CommonJS\n 827→ else if (typeof module === 'object' && module.exports) {\n 828→ module.exports = GridLanesPolyfill;\n 829→ }\n 830→ // Global\n 831→ else {\n 832→ global.GridLanesPolyfill = GridLanesPolyfill;\n 833→ }\n 834→\n 835→})(typeof globalThis !== 'undefined' ? globalThis : \n 836→ typeof window !== 'undefined' ? window : \n 837→ typeof global !== 'undefined' ? global : this);\n 838→\n\n<system-reminder>\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n</system-reminder>\n"}]},"uuid":"1f5d1d9a-372e-4e99-bc23-ab4d5c18b2b0","timestamp":"2025-12-20T05:57:41.351Z","toolUseResult":{"type":"text","file":{"filePath":"/private/tmp/files/grid-lanes-polyfill.js","content":"/**\n * CSS Grid Lanes Polyfill\n * \n * Polyfills the new `display: grid-lanes` CSS feature for browsers\n * that don't support it natively. Based on the WebKit implementation\n * described at: https://webkit.org/blog/17660/introducing-css-grid-lanes/\n * \n * Features supported:\n * - display: grid-lanes\n * - grid-template-columns / grid-template-rows for lane definition\n * - gap, column-gap, row-gap\n * - item-tolerance for placement sensitivity\n * - Spanning items (grid-column: span N)\n * - Explicit placement (grid-column: N / M)\n * - Responsive auto-fill/auto-fit with minmax()\n * - Both waterfall (columns) and brick (rows) layouts\n * \n * @version 1.0.0\n * @license MIT\n */\n\n(function(global) {\n 'use strict';\n\n const POLYFILL_NAME = 'GridLanesPolyfill';\n const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n const DEFAULT_TOLERANCE = 16; // ~1em in pixels\n\n /**\n * Check if the browser natively supports display: grid-lanes\n */\n function supportsGridLanes() {\n if (typeof CSS === 'undefined' || !CSS.supports) {\n return false;\n }\n return CSS.supports('display', 'grid-lanes');\n }\n\n /**\n * Parse a CSS length value to pixels\n */\n function parseLengthToPixels(value, containerSize, fontSize = 16, rootFontSize = 16) {\n if (!value || value === 'auto' || value === 'none') return null;\n \n const num = parseFloat(value);\n if (isNaN(num)) return null;\n\n if (value.endsWith('px')) return num;\n if (value.endsWith('rem')) return num * rootFontSize;\n if (value.endsWith('em')) return num * fontSize;\n if (value.endsWith('ch')) return num * fontSize * 0.5; // Approximate\n if (value.endsWith('lh')) return num * fontSize * 1.2; // Approximate line-height\n if (value.endsWith('%')) return (num / 100) * containerSize;\n if (value.endsWith('vw')) return (num / 100) * window.innerWidth;\n if (value.endsWith('vh')) return (num / 100) * window.innerHeight;\n if (value.endsWith('vmin')) return (num / 100) * Math.min(window.innerWidth, window.innerHeight);\n if (value.endsWith('vmax')) return (num / 100) * Math.max(window.innerWidth, window.innerHeight);\n if (value.endsWith('fr')) return null; // Handled separately\n \n // Unitless number treated as pixels\n if (!isNaN(num) && value === String(num)) return num;\n \n return null;\n }\n\n /**\n * Parse minmax() function\n */\n function parseMinMax(value) {\n const match = value.match(/minmax\\(\\s*([^,]+)\\s*,\\s*([^)]+)\\s*\\)/);\n if (!match) return null;\n return {\n min: match[1].trim(),\n max: match[2].trim()\n };\n }\n\n /**\n * Parse repeat() function\n */\n function parseRepeat(value) {\n const match = value.match(/repeat\\(\\s*([^,]+)\\s*,\\s*(.+)\\s*\\)/);\n if (!match) return null;\n return {\n count: match[1].trim(),\n pattern: match[2].trim()\n };\n }\n\n /**\n * Calculate lane sizes from grid-template-columns/rows\n */\n function calculateLaneSizes(template, containerSize, gap, fontSize, rootFontSize) {\n if (!template || template === 'none' || template === 'auto') {\n return null;\n }\n\n const availableSpace = containerSize;\n let lanes = [];\n let totalFr = 0;\n let fixedSpace = 0;\n\n // Parse the template\n const tokens = tokenizeTemplate(template);\n \n for (const token of tokens) {\n // Handle repeat()\n const repeatInfo = parseRepeat(token);\n if (repeatInfo) {\n const { count, pattern } = repeatInfo;\n const patternTokens = tokenizeTemplate(pattern);\n \n if (count === 'auto-fill' || count === 'auto-fit') {\n // Calculate how many repetitions fit\n let minSize = 0;\n let hasFlexible = false;\n \n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n if (minmax.min === 'max-content' || minmax.min === 'min-content') {\n minSize += 100; // Fallback estimate\n } else if (minVal !== null) {\n minSize += minVal;\n }\n if (minmax.max.endsWith('fr')) {\n hasFlexible = true;\n }\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n minSize += size;\n } else if (pt.endsWith('fr')) {\n hasFlexible = true;\n minSize += 100; // Minimum fallback for fr units\n }\n }\n }\n \n // Calculate repetitions\n const patternCount = patternTokens.length;\n const gapCount = patternCount - 1;\n const minPatternSize = minSize + (gapCount * gap);\n \n let reps = Math.max(1, Math.floor((availableSpace + gap) / (minPatternSize + gap)));\n \n // Expand pattern\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr') \n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({\n min: minVal || 0,\n max: maxVal,\n size: 0\n });\n \n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n } else if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize) || 0;\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n } else {\n // Fixed repeat count\n const reps = parseInt(count, 10);\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n }\n continue;\n }\n\n // Handle minmax()\n const minmax = parseMinMax(token);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr')\n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({ min: minVal || 0, max: maxVal, size: 0 });\n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n continue;\n }\n\n // Handle fr units\n if (token.endsWith('fr')) {\n const fr = parseFloat(token);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n continue;\n }\n\n // Handle fixed sizes\n const size = parseLengthToPixels(token, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n\n // Calculate final sizes\n const totalGaps = Math.max(0, lanes.length - 1) * gap;\n const flexSpace = Math.max(0, availableSpace - fixedSpace - totalGaps);\n const frUnit = totalFr > 0 ? flexSpace / totalFr : 0;\n\n for (const lane of lanes) {\n if (typeof lane.max === 'object' && lane.max.fr) {\n lane.size = Math.max(lane.min, frUnit * lane.max.fr);\n } else if (typeof lane.max === 'number') {\n lane.size = Math.min(lane.max, Math.max(lane.min, lane.min));\n } else {\n lane.size = lane.min;\n }\n }\n\n return lanes.map(l => l.size);\n }\n\n /**\n * Tokenize a grid template string\n */\n function tokenizeTemplate(template) {\n const tokens = [];\n let current = '';\n let parenDepth = 0;\n\n for (let i = 0; i < template.length; i++) {\n const char = template[i];\n \n if (char === '(') {\n parenDepth++;\n current += char;\n } else if (char === ')') {\n parenDepth--;\n current += char;\n } else if (char === ' ' && parenDepth === 0) {\n if (current.trim()) {\n tokens.push(current.trim());\n }\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n tokens.push(current.trim());\n }\n\n return tokens;\n }\n\n /**\n * Get computed styles for grid-lanes properties\n */\n function getGridLanesStyles(element) {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n\n // Get gap values\n const gap = computed.gap || computed.gridGap || '0px';\n const columnGap = computed.columnGap || computed.gridColumnGap || gap;\n const rowGap = computed.rowGap || computed.gridRowGap || gap;\n\n // Parse item-tolerance (custom property or default)\n let tolerance = DEFAULT_TOLERANCE;\n const toleranceValue = computed.getPropertyValue('--item-tolerance').trim() ||\n computed.getPropertyValue('item-tolerance').trim();\n if (toleranceValue) {\n const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n if (parsed !== null) tolerance = parsed;\n }\n\n return {\n gridTemplateColumns: computed.gridTemplateColumns,\n gridTemplateRows: computed.gridTemplateRows,\n columnGap: parseLengthToPixels(columnGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n rowGap: parseLengthToPixels(rowGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n fontSize,\n rootFontSize,\n tolerance\n };\n }\n\n /**\n * Get item placement properties\n */\n function getItemStyles(element) {\n const computed = window.getComputedStyle(element);\n const gridColumn = computed.gridColumn || computed.gridColumnStart;\n const gridRow = computed.gridRow || computed.gridRowStart;\n\n let columnSpan = 1;\n let columnStart = null;\n let columnEnd = null;\n let rowSpan = 1;\n let rowStart = null;\n let rowEnd = null;\n\n // Parse grid-column\n if (gridColumn && gridColumn !== 'auto') {\n const spanMatch = gridColumn.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n columnSpan = parseInt(spanMatch[1], 10);\n } else if (gridColumn.includes('/')) {\n const [start, end] = gridColumn.split('/').map(s => s.trim());\n columnStart = parseInt(start, 10);\n columnEnd = parseInt(end, 10);\n if (!isNaN(columnStart) && !isNaN(columnEnd)) {\n columnSpan = Math.abs(columnEnd - columnStart);\n }\n } else {\n const num = parseInt(gridColumn, 10);\n if (!isNaN(num)) {\n columnStart = num;\n }\n }\n }\n\n // Parse grid-row\n if (gridRow && gridRow !== 'auto') {\n const spanMatch = gridRow.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n rowSpan = parseInt(spanMatch[1], 10);\n } else if (gridRow.includes('/')) {\n const [start, end] = gridRow.split('/').map(s => s.trim());\n rowStart = parseInt(start, 10);\n rowEnd = parseInt(end, 10);\n if (!isNaN(rowStart) && !isNaN(rowEnd)) {\n rowSpan = Math.abs(rowEnd - rowStart);\n }\n } else {\n const num = parseInt(gridRow, 10);\n if (!isNaN(num)) {\n rowStart = num;\n }\n }\n }\n\n return {\n columnSpan,\n columnStart,\n columnEnd,\n rowSpan,\n rowStart,\n rowEnd\n };\n }\n\n /**\n * Main Grid Lanes layout class\n */\n class GridLanesLayout {\n constructor(container, options = {}) {\n this.container = container;\n this.options = options;\n this.isVertical = true; // true = waterfall (columns), false = brick (rows)\n this.lanes = [];\n this.laneHeights = [];\n this.resizeObserver = null;\n this.mutationObserver = null;\n \n this.init();\n }\n\n init() {\n // Mark as polyfilled\n this.container.setAttribute(POLYFILL_ATTR, 'true');\n \n // Set up container styles\n this.container.style.position = 'relative';\n this.container.style.display = 'block';\n \n // Initial layout\n this.layout();\n \n // Set up observers\n this.setupObservers();\n }\n\n setupObservers() {\n // Resize observer for responsive layouts\n this.resizeObserver = new ResizeObserver(() => {\n this.layout();\n });\n this.resizeObserver.observe(this.container);\n\n // Mutation observer for dynamic content\n this.mutationObserver = new MutationObserver((mutations) => {\n let shouldRelayout = false;\n for (const mutation of mutations) {\n if (mutation.type === 'childList' || \n (mutation.type === 'attributes' && mutation.attributeName === 'style')) {\n shouldRelayout = true;\n break;\n }\n }\n if (shouldRelayout) {\n this.layout();\n }\n });\n this.mutationObserver.observe(this.container, {\n childList: true,\n subtree: false,\n attributes: true,\n attributeFilter: ['style', 'class']\n });\n }\n\n layout() {\n const styles = getGridLanesStyles(this.container);\n const containerRect = this.container.getBoundingClientRect();\n \n // Determine direction based on which template is defined\n const hasColumns = styles.gridTemplateColumns && \n styles.gridTemplateColumns !== 'none' &&\n !styles.gridTemplateColumns.startsWith('auto');\n const hasRows = styles.gridTemplateRows && \n styles.gridTemplateRows !== 'none' &&\n !styles.gridTemplateRows.startsWith('auto');\n \n this.isVertical = hasColumns || !hasRows;\n \n // Calculate lane sizes\n if (this.isVertical) {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateColumns,\n containerRect.width,\n styles.columnGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.width];\n } else {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateRows,\n containerRect.height,\n styles.rowGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.height];\n }\n\n // Initialize lane positions (heights for vertical, widths for horizontal)\n this.laneHeights = new Array(this.lanes.length).fill(0);\n \n // Get all direct children\n const items = Array.from(this.container.children).filter(\n el => el.nodeType === Node.ELEMENT_NODE && \n window.getComputedStyle(el).display !== 'none'\n );\n\n // Separate explicitly placed items from auto-placed items\n const explicitItems = [];\n const autoItems = [];\n \n for (const item of items) {\n const itemStyles = getItemStyles(item);\n if (this.isVertical && itemStyles.columnStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else if (!this.isVertical && itemStyles.rowStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else {\n autoItems.push({ element: item, styles: itemStyles });\n }\n }\n\n // Place explicitly positioned items first\n for (const { element, styles: itemStyles } of explicitItems) {\n this.placeExplicitItem(element, itemStyles, styles);\n }\n\n // Place auto-positioned items\n for (const { element, styles: itemStyles } of autoItems) {\n this.placeAutoItem(element, itemStyles, styles);\n }\n\n // Set container height\n const containerHeight = Math.max(...this.laneHeights);\n this.container.style.minHeight = `${containerHeight}px`;\n }\n\n placeExplicitItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n \n let laneIndex;\n let span;\n \n if (this.isVertical) {\n // Handle negative indices\n laneIndex = itemStyles.columnStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.columnSpan;\n } else {\n laneIndex = itemStyles.rowStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.rowSpan;\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < laneIndex; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate width (for spanning)\n let size = 0;\n const endLane = Math.min(laneIndex + span, this.lanes.length);\n for (let i = laneIndex; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Get the tallest lane in the span\n let maxHeight = 0;\n for (let i = laneIndex; i < endLane; i++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[i]);\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = maxHeight + (maxHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = laneIndex; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n placeAutoItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n const tolerance = containerStyles.tolerance;\n const span = this.isVertical ? itemStyles.columnSpan : itemStyles.rowSpan;\n\n // Find the best lane(s) considering tolerance\n let bestLane = 0;\n let bestHeight = Infinity;\n\n for (let i = 0; i <= this.lanes.length - span; i++) {\n // Get the max height across the span\n let maxHeight = 0;\n for (let j = i; j < i + span; j++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[j]);\n }\n\n // Use tolerance to determine if this is meaningfully better\n if (bestHeight - maxHeight > tolerance) {\n bestHeight = maxHeight;\n bestLane = i;\n } else if (Math.abs(maxHeight - bestHeight) <= tolerance && i < bestLane) {\n // Within tolerance, prefer earlier lane for reading order\n bestHeight = maxHeight;\n bestLane = i;\n }\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < bestLane; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate size (for spanning)\n let size = 0;\n const endLane = Math.min(bestLane + span, this.lanes.length);\n for (let i = bestLane; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = bestHeight + (bestHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = bestLane; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n destroy() {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n \n this.container.removeAttribute(POLYFILL_ATTR);\n this.container.style.position = '';\n this.container.style.display = '';\n this.container.style.minHeight = '';\n \n // Reset item styles\n for (const item of this.container.children) {\n if (item.nodeType === Node.ELEMENT_NODE) {\n item.style.position = '';\n item.style.left = '';\n item.style.top = '';\n item.style.width = '';\n item.style.height = '';\n }\n }\n }\n\n refresh() {\n this.layout();\n }\n }\n\n /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n\n // Check inline styles\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n if (el.style.display === 'grid-lanes') {\n containers.add(el);\n }\n }\n\n // Check stylesheets\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.style && rule.style.display === 'grid-lanes') {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n return containers;\n }\n\n /**\n * Initialize the polyfill\n */\n function init(options = {}) {\n // Check if native support exists\n if (supportsGridLanes() && !options.force) {\n console.log(`${POLYFILL_NAME}: Native support detected, polyfill not needed.`);\n return { supported: true, instances: [] };\n }\n\n const instances = new Map();\n\n // Process existing containers\n const containers = processStyleSheets();\n for (const container of containers) {\n if (!container.hasAttribute(POLYFILL_ATTR)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n\n // Watch for new stylesheets and elements\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n // Check for new style elements\n if (mutation.type === 'childList') {\n for (const node of mutation.addedNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n // Check if the added element is a grid-lanes container\n const style = window.getComputedStyle(node);\n if (node.style.display === 'grid-lanes' || \n style.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(node)) {\n instances.set(node, new GridLanesLayout(node, options));\n }\n }\n \n // Check descendants\n const descendants = node.querySelectorAll('*');\n for (const desc of descendants) {\n const descStyle = window.getComputedStyle(desc);\n if (desc.style.display === 'grid-lanes' ||\n descStyle.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(desc)) {\n instances.set(desc, new GridLanesLayout(desc, options));\n }\n }\n }\n }\n }\n }\n }\n\n // Re-scan stylesheets for new rules\n const newContainers = processStyleSheets();\n for (const container of newContainers) {\n if (!instances.has(container)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true\n });\n\n console.log(`${POLYFILL_NAME}: Initialized, ${instances.size} container(s) found.`);\n\n return {\n supported: false,\n instances,\n observer,\n refresh() {\n for (const instance of instances.values()) {\n instance.refresh();\n }\n },\n destroy() {\n observer.disconnect();\n for (const instance of instances.values()) {\n instance.destroy();\n }\n instances.clear();\n }\n };\n }\n\n /**\n * Apply to a specific element\n */\n function apply(element, options = {}) {\n if (supportsGridLanes() && !options.force) {\n return null;\n }\n return new GridLanesLayout(element, options);\n }\n\n // Export\n const GridLanesPolyfill = {\n supportsGridLanes,\n init,\n apply,\n GridLanesLayout,\n version: '1.0.0'\n };\n\n // AMD\n if (typeof define === 'function' && define.amd) {\n define([], function() { return GridLanesPolyfill; });\n }\n // CommonJS\n else if (typeof module === 'object' && module.exports) {\n module.exports = GridLanesPolyfill;\n }\n // Global\n else {\n global.GridLanesPolyfill = GridLanesPolyfill;\n }\n\n})(typeof globalThis !== 'undefined' ? globalThis : \n typeof window !== 'undefined' ? window : \n typeof global !== 'undefined' ? global : this);\n","numLines":838,"startLine":1,"totalLines":838}}} | |
| {"parentUuid":"1f5d1d9a-372e-4e99-bc23-ab4d5c18b2b0","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01SWW6gND4p4e7wNEKZ33hXE","type":"tool_result","content":"# CSS Grid Lanes Explained\n\n## Basic Syntax\n\nCSS Grid Lanes uses `display: grid-lanes` to create masonry-style layouts. The core properties are:\n\n- **`grid-template-columns`** or **`grid-template-rows`**: Define the lane structure using standard Grid syntax like `repeat(auto-fill, minmax(250px, 1fr))`\n- **`gap`**: Sets spacing between lanes and items\n\n```css\n.container {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 16px;\n}\n```\n\n## How the Algorithm Works\n\nThe layout functions like \"a highway of cars in bumper-to-bumper traffic.\" Each item is placed in whichever column/lane positions it closest to the top of the container—not filling columns sequentially. This enables users to tab across visible content rather than down to the page bottom.\n\n## Key Properties\n\n**`item-tolerance`**: Controls placement sensitivity. With a default of `1em`, only size differences greater than this threshold trigger lane changes. Higher values reduce layout shuffling; lower values increase it. The specification may rename this to `flow-tolerance` or `pack-tolerance`.\n\n**`grid-auto-flow`**: Uses a new `normal` default value that automatically determines waterfall (column-based) or brick (row-based) layouts depending on whether you define `grid-template-columns` or `grid-template-rows`.\n\n## Layout Directions\n\n- **Waterfall**: Items flow down columns (use `grid-template-columns`)\n- **Brick**: Items flow across rows (use `grid-template-rows`)\n\nThe feature also supports spanning items and explicit placement using standard Grid properties like `grid-column: span`."}]},"uuid":"f8fd63bc-a6b4-4458-aea0-86af8bbd211a","timestamp":"2025-12-20T05:57:47.555Z","toolUseResult":{"bytes":55929,"code":200,"codeText":"OK","result":"# CSS Grid Lanes Explained\n\n## Basic Syntax\n\nCSS Grid Lanes uses `display: grid-lanes` to create masonry-style layouts. The core properties are:\n\n- **`grid-template-columns`** or **`grid-template-rows`**: Define the lane structure using standard Grid syntax like `repeat(auto-fill, minmax(250px, 1fr))`\n- **`gap`**: Sets spacing between lanes and items\n\n```css\n.container {\n display: grid-lanes;\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n gap: 16px;\n}\n```\n\n## How the Algorithm Works\n\nThe layout functions like \"a highway of cars in bumper-to-bumper traffic.\" Each item is placed in whichever column/lane positions it closest to the top of the container—not filling columns sequentially. This enables users to tab across visible content rather than down to the page bottom.\n\n## Key Properties\n\n**`item-tolerance`**: Controls placement sensitivity. With a default of `1em`, only size differences greater than this threshold trigger lane changes. Higher values reduce layout shuffling; lower values increase it. The specification may rename this to `flow-tolerance` or `pack-tolerance`.\n\n**`grid-auto-flow`**: Uses a new `normal` default value that automatically determines waterfall (column-based) or brick (row-based) layouts depending on whether you define `grid-template-columns` or `grid-template-rows`.\n\n## Layout Directions\n\n- **Waterfall**: Items flow down columns (use `grid-template-columns`)\n- **Brick**: Items flow across rows (use `grid-template-rows`)\n\nThe feature also supports spanning items and explicit placement using standard Grid properties like `grid-column: span`.","durationMs":6505,"url":"https://webkit.org/blog/17660/introducing-css-grid-lanes/"}} | |
| {"parentUuid":"f8fd63bc-a6b4-4458-aea0-86af8bbd211a","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01PJgQctsMWA9h3LPfEuTQZj","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Now I understand the issue. Looking at the screenshot, the polyfill shows \"Polyfill active (0 containers)\" which means the polyfill is not finding any containers to apply the masonry layout to.\n\nLet me analyze the problem:\n\n1. The demo.html uses `display: grid-lanes` in CSS\n2. The polyfill's `processStyleSheets()` function tries to find elements with `display: grid-lanes`\n3. The issue is that browsers don't recognize `display: grid-lanes` as a valid value, so when you set `display: grid-lanes` in CSS, the browser likely ignores it or sets it to something else\n\nLooking at the polyfill code, there are issues:\n\n1. In `processStyleSheets()` it checks `rule.style.display === 'grid-lanes'` - but the browser may have already parsed and rejected this invalid value\n2. When we read the computed style, it won't show `grid-lanes` because it's not a valid display value\n\nThe fix needs to:\n1. Parse the raw CSS to find `display: grid-lanes` declarations (not rely on computed styles which won't show invalid values)\n2. Or use a different approach like a data attribute or class name\n\nActually, looking more carefully at the code:\n\n```javascript\n// Check stylesheets\nfor (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.style && rule.style.display === 'grid-lanes') {\n```\n\nThe problem is that `rule.style.display` will NOT equal `'grid-lanes'` because browsers don't recognize it as a valid value. When you set an invalid value, the browser ignores it, so the computed/parsed style won't have that value.\n\nI need to fix the polyfill to:\n1. Parse the raw cssText to find `display: grid-lanes`\n\n\n2. Identify and tag elements that should receive the masonry layout\n3. Implement a robust method to apply the layout to these specific elements\n\nI'll create a systematic approach to modify the polyfill's element detection and layout application mechanism. This will involve parsing raw CSS rules and creating a reliable selection process for masonry containers.","signature":"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"}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":19834,"cache_read_input_tokens":21704,"cache_creation":{"ephemeral_5m_input_tokens":19834,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRddzEGmTVnUrMrAJ87","type":"assistant","uuid":"7e3dd35d-ab97-434d-958c-b82a30c0368e","timestamp":"2025-12-20T05:58:01.972Z"} | |
| {"parentUuid":"7e3dd35d-ab97-434d-958c-b82a30c0368e","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01PJgQctsMWA9h3LPfEuTQZj","type":"message","role":"assistant","content":[{"type":"text","text":"I can see the problem. The polyfill shows \"0 containers\" because browsers don't recognize `display: grid-lanes` as a valid CSS value, so when the polyfill checks `rule.style.display === 'grid-lanes'`, it fails - the browser has already rejected the invalid value.\n\nLet me create a todo list and fix this."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":19834,"cache_read_input_tokens":21704,"cache_creation":{"ephemeral_5m_input_tokens":19834,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRddzEGmTVnUrMrAJ87","type":"assistant","uuid":"c4bcbdfc-46dd-4c9d-bc24-3df7cce0fa04","timestamp":"2025-12-20T05:58:02.005Z"} | |
| {"parentUuid":"c4bcbdfc-46dd-4c9d-bc24-3df7cce0fa04","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01PJgQctsMWA9h3LPfEuTQZj","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_018BPr8mrgyCkrQqWBH1KaEm","name":"TodoWrite","input":{"todos":[{"content":"Fix polyfill to detect grid-lanes from raw CSS text (not computed styles)","status":"in_progress","activeForm":"Fixing polyfill detection of grid-lanes from raw CSS"},{"content":"Test the fix by taking a new screenshot","status":"pending","activeForm":"Testing the fix with a new screenshot"}]}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":19834,"cache_read_input_tokens":21704,"cache_creation":{"ephemeral_5m_input_tokens":19834,"ephemeral_1h_input_tokens":0},"output_tokens":704,"service_tier":"standard"}},"requestId":"req_011CWHRddzEGmTVnUrMrAJ87","type":"assistant","uuid":"df03a711-740d-4d98-a551-8c5d5d400dca","timestamp":"2025-12-20T05:58:02.040Z"} | |
| {"parentUuid":"df03a711-740d-4d98-a551-8c5d5d400dca","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_018BPr8mrgyCkrQqWBH1KaEm","type":"tool_result","content":"Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable"}]},"uuid":"331c2449-3213-4c31-a404-6a95383145df","timestamp":"2025-12-20T05:58:02.059Z","toolUseResult":{"oldTodos":[],"newTodos":[{"content":"Fix polyfill to detect grid-lanes from raw CSS text (not computed styles)","status":"in_progress","activeForm":"Fixing polyfill detection of grid-lanes from raw CSS"},{"content":"Test the fix by taking a new screenshot","status":"pending","activeForm":"Testing the fix with a new screenshot"}]}} | |
| {"parentUuid":"331c2449-3213-4c31-a404-6a95383145df","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01KfUUe47FawP2EbpNaRUPQJ","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Now let me fix the polyfill. The key issue is that the polyfill checks `rule.style.display === 'grid-lanes'` but browsers reject invalid CSS values, so this check will never succeed.\n\nI need to:\n1. Parse the raw `cssText` of each rule to find `display:\\s*grid-lanes`\n2. Extract the selector and apply the polyfill to matching elements\n\nLet me edit the `processStyleSheets` function to use `rule.cssText` instead of `rule.style.display`.","signature":"EtoECkYIChgCKkD77V5JLT4BpK3vwfojdu2Ijw1X4wy5pgnMo7a8M3EX0GdNmDSmPV9QU4pISTeyxcSdh62CMMcFkPjCHmzJH92/EgxliMSzK0Q5Yj8e0QsaDE8QqvJRkraGH/l9PCIwgb1jAcVczQ75XI4q9jwZwjV7s6X0p5Xzik721KkcGTTJQ8Rw1zfbJFiBnMGhynHKKsEDVIjMFP6MSTZJFXvJHSVL9o7nS8gyvrUI+aj4hgyQvAuYsINfe7EzhT1vKg8HIaGYO6+2gm7Eh4LENyaUZGnQa3Eug+re0kzdLRZwbs81uxdpadhpLYtpl51faVeBRt6mlo6PhmMpamHsAZuTY/AaIAcAzesTuYAZMbS3SWdGVNdNCbx4bbe4VRP+mSlFZPYQCVRybJiek4IXYyPjDyCMIzkeEYM74/f9K1YknSZEPw4J40TuF4zp0uGw6V4MjG8b7f91TCc+QwwzUuawnPt+9p4Fwf0RwC3R/ZzX/9qXol8Exm9bBekb2gOLZ87J2ILSFBJVO3jrl3R1Q9Dp4sI8KBFssqDx6gBkVImSMpt3670QdNtPrm3EXOvIoMIycfn3i0Cn9cECTjLsQASEhsz9+h0etBntLOrN9Zr+wVLarHrTc1/9AR9zLONEdLX+XmMo4WF8ORX54ll+ICZUnrV+xeFcFJs23/7DFYT648KXoyTAsuqAhtwWpQazOpciBzXcG7cUpEOgqd+YnmpLMlipSK4ZxaDYdcWO1N6yAJnO6FuVqGLlov5DspIe8thyz6RA1Il6yzbmX4hjbqqATmCny88YAQ=="}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":737,"cache_read_input_tokens":41538,"cache_creation":{"ephemeral_5m_input_tokens":737,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRei5Kpb6aEctFfyBcP","type":"assistant","uuid":"0d5213bd-f9f6-403b-b9fe-a40f79fb2196","timestamp":"2025-12-20T05:58:06.382Z"} | |
| {"parentUuid":"0d5213bd-f9f6-403b-b9fe-a40f79fb2196","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01KfUUe47FawP2EbpNaRUPQJ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01NurqH4buKow6BvsRTuoLcG","name":"Edit","input":{"file_path":"/private/tmp/files/grid-lanes-polyfill.js","old_string":" /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n\n // Check inline styles\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n if (el.style.display === 'grid-lanes') {\n containers.add(el);\n }\n }\n\n // Check stylesheets\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.style && rule.style.display === 'grid-lanes') {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n return containers;\n }","new_string":" /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n const gridLanesSelectors = new Set();\n\n // Check inline styles (look at the raw style attribute)\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n const styleAttr = el.getAttribute('style') || '';\n if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n containers.add(el);\n }\n }\n\n // Check stylesheets - parse raw cssText since browsers reject invalid display values\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n // Extract selector and find matching elements\n if (rule.selectorText) {\n gridLanesSelectors.add(rule.selectorText);\n try {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n // Also check style elements directly for cases where browser strips the property\n const styleElements = document.querySelectorAll('style');\n for (const styleEl of styleElements) {\n const cssText = styleEl.textContent || '';\n const regex = /([^{}]+)\\{[^}]*display\\s*:\\s*grid-lanes[^}]*\\}/gi;\n let match;\n while ((match = regex.exec(cssText)) !== null) {\n const selector = match[1].trim();\n if (selector && !gridLanesSelectors.has(selector)) {\n gridLanesSelectors.add(selector);\n try {\n const elements = document.querySelectorAll(selector);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n\n return containers;\n }"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":737,"cache_read_input_tokens":41538,"cache_creation":{"ephemeral_5m_input_tokens":737,"ephemeral_1h_input_tokens":0},"output_tokens":1142,"service_tier":"standard"}},"requestId":"req_011CWHRei5Kpb6aEctFfyBcP","type":"assistant","uuid":"aa204e2d-93fb-48b4-954f-2cd0e823222e","timestamp":"2025-12-20T05:58:15.679Z"} | |
| {"type":"file-history-snapshot","messageId":"aa204e2d-93fb-48b4-954f-2cd0e823222e","snapshot":{"messageId":"9acfeb7e-d69d-45ff-8148-4cf63865d77c","trackedFileBackups":{"grid-lanes-polyfill.js":{"backupFileName":"cc9d1ca3a9030e74@v1","version":1,"backupTime":"2025-12-20T05:58:15.722Z"}},"timestamp":"2025-12-20T05:57:33.787Z"},"isSnapshotUpdate":true} | |
| {"parentUuid":"aa204e2d-93fb-48b4-954f-2cd0e823222e","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01NurqH4buKow6BvsRTuoLcG","type":"tool_result","content":"The file /private/tmp/files/grid-lanes-polyfill.js has been updated. Here's the result of running `cat -n` on a snippet of the edited file:\n 675→ this.layout();\n 676→ }\n 677→ }\n 678→\n 679→ /**\n 680→ * Find and process all grid-lanes containers\n 681→ */\n 682→ function processStyleSheets() {\n 683→ const containers = new Set();\n 684→ const gridLanesSelectors = new Set();\n 685→\n 686→ // Check inline styles (look at the raw style attribute)\n 687→ const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n 688→ for (const el of allElements) {\n 689→ const styleAttr = el.getAttribute('style') || '';\n 690→ if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n 691→ containers.add(el);\n 692→ }\n 693→ }\n 694→\n 695→ // Check stylesheets - parse raw cssText since browsers reject invalid display values\n 696→ for (const sheet of document.styleSheets) {\n 697→ try {\n 698→ const rules = sheet.cssRules || sheet.rules;\n 699→ if (!rules) continue;\n 700→\n 701→ for (const rule of rules) {\n 702→ if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n 703→ // Extract selector and find matching elements\n 704→ if (rule.selectorText) {\n 705→ gridLanesSelectors.add(rule.selectorText);\n 706→ try {\n 707→ const elements = document.querySelectorAll(rule.selectorText);\n 708→ for (const el of elements) {\n 709→ containers.add(el);\n 710→ }\n 711→ } catch (e) {\n 712→ // Invalid selector, skip\n 713→ }\n 714→ }\n 715→ }\n 716→ }\n 717→ } catch (e) {\n 718→ // Cross-origin stylesheets will throw\n 719→ console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n 720→ }\n 721→ }\n 722→\n 723→ // Also check style elements directly for cases where browser strips the property\n 724→ const styleElements = document.querySelectorAll('style');\n 725→ for (const styleEl of styleElements) {\n 726→ const cssText = styleEl.textContent || '';\n 727→ const regex = /([^{}]+)\\{[^}]*display\\s*:\\s*grid-lanes[^}]*\\}/gi;\n 728→ let match;\n 729→ while ((match = regex.exec(cssText)) !== null) {\n 730→ const selector = match[1].trim();\n 731→ if (selector && !gridLanesSelectors.has(selector)) {\n 732→ gridLanesSelectors.add(selector);\n 733→ try {\n 734→ const elements = document.querySelectorAll(selector);\n 735→ for (const el of elements) {\n 736→ containers.add(el);\n 737→ }\n 738→ } catch (e) {\n 739→ // Invalid selector, skip\n 740→ }\n 741→ }\n 742→ }\n 743→ }\n 744→\n 745→ return containers;\n 746→ }\n 747→\n 748→ /**\n 749→ * Initialize the polyfill\n 750→ */"}]},"uuid":"7f5d407e-d4fe-4b9b-bbc4-eda0cb5d8b77","timestamp":"2025-12-20T05:58:15.712Z","toolUseResult":{"filePath":"/private/tmp/files/grid-lanes-polyfill.js","oldString":" /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n\n // Check inline styles\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n if (el.style.display === 'grid-lanes') {\n containers.add(el);\n }\n }\n\n // Check stylesheets\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.style && rule.style.display === 'grid-lanes') {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n return containers;\n }","newString":" /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n const gridLanesSelectors = new Set();\n\n // Check inline styles (look at the raw style attribute)\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n const styleAttr = el.getAttribute('style') || '';\n if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n containers.add(el);\n }\n }\n\n // Check stylesheets - parse raw cssText since browsers reject invalid display values\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n // Extract selector and find matching elements\n if (rule.selectorText) {\n gridLanesSelectors.add(rule.selectorText);\n try {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n // Also check style elements directly for cases where browser strips the property\n const styleElements = document.querySelectorAll('style');\n for (const styleEl of styleElements) {\n const cssText = styleEl.textContent || '';\n const regex = /([^{}]+)\\{[^}]*display\\s*:\\s*grid-lanes[^}]*\\}/gi;\n let match;\n while ((match = regex.exec(cssText)) !== null) {\n const selector = match[1].trim();\n if (selector && !gridLanesSelectors.has(selector)) {\n gridLanesSelectors.add(selector);\n try {\n const elements = document.querySelectorAll(selector);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n\n return containers;\n }","originalFile":"/**\n * CSS Grid Lanes Polyfill\n * \n * Polyfills the new `display: grid-lanes` CSS feature for browsers\n * that don't support it natively. Based on the WebKit implementation\n * described at: https://webkit.org/blog/17660/introducing-css-grid-lanes/\n * \n * Features supported:\n * - display: grid-lanes\n * - grid-template-columns / grid-template-rows for lane definition\n * - gap, column-gap, row-gap\n * - item-tolerance for placement sensitivity\n * - Spanning items (grid-column: span N)\n * - Explicit placement (grid-column: N / M)\n * - Responsive auto-fill/auto-fit with minmax()\n * - Both waterfall (columns) and brick (rows) layouts\n * \n * @version 1.0.0\n * @license MIT\n */\n\n(function(global) {\n 'use strict';\n\n const POLYFILL_NAME = 'GridLanesPolyfill';\n const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n const DEFAULT_TOLERANCE = 16; // ~1em in pixels\n\n /**\n * Check if the browser natively supports display: grid-lanes\n */\n function supportsGridLanes() {\n if (typeof CSS === 'undefined' || !CSS.supports) {\n return false;\n }\n return CSS.supports('display', 'grid-lanes');\n }\n\n /**\n * Parse a CSS length value to pixels\n */\n function parseLengthToPixels(value, containerSize, fontSize = 16, rootFontSize = 16) {\n if (!value || value === 'auto' || value === 'none') return null;\n \n const num = parseFloat(value);\n if (isNaN(num)) return null;\n\n if (value.endsWith('px')) return num;\n if (value.endsWith('rem')) return num * rootFontSize;\n if (value.endsWith('em')) return num * fontSize;\n if (value.endsWith('ch')) return num * fontSize * 0.5; // Approximate\n if (value.endsWith('lh')) return num * fontSize * 1.2; // Approximate line-height\n if (value.endsWith('%')) return (num / 100) * containerSize;\n if (value.endsWith('vw')) return (num / 100) * window.innerWidth;\n if (value.endsWith('vh')) return (num / 100) * window.innerHeight;\n if (value.endsWith('vmin')) return (num / 100) * Math.min(window.innerWidth, window.innerHeight);\n if (value.endsWith('vmax')) return (num / 100) * Math.max(window.innerWidth, window.innerHeight);\n if (value.endsWith('fr')) return null; // Handled separately\n \n // Unitless number treated as pixels\n if (!isNaN(num) && value === String(num)) return num;\n \n return null;\n }\n\n /**\n * Parse minmax() function\n */\n function parseMinMax(value) {\n const match = value.match(/minmax\\(\\s*([^,]+)\\s*,\\s*([^)]+)\\s*\\)/);\n if (!match) return null;\n return {\n min: match[1].trim(),\n max: match[2].trim()\n };\n }\n\n /**\n * Parse repeat() function\n */\n function parseRepeat(value) {\n const match = value.match(/repeat\\(\\s*([^,]+)\\s*,\\s*(.+)\\s*\\)/);\n if (!match) return null;\n return {\n count: match[1].trim(),\n pattern: match[2].trim()\n };\n }\n\n /**\n * Calculate lane sizes from grid-template-columns/rows\n */\n function calculateLaneSizes(template, containerSize, gap, fontSize, rootFontSize) {\n if (!template || template === 'none' || template === 'auto') {\n return null;\n }\n\n const availableSpace = containerSize;\n let lanes = [];\n let totalFr = 0;\n let fixedSpace = 0;\n\n // Parse the template\n const tokens = tokenizeTemplate(template);\n \n for (const token of tokens) {\n // Handle repeat()\n const repeatInfo = parseRepeat(token);\n if (repeatInfo) {\n const { count, pattern } = repeatInfo;\n const patternTokens = tokenizeTemplate(pattern);\n \n if (count === 'auto-fill' || count === 'auto-fit') {\n // Calculate how many repetitions fit\n let minSize = 0;\n let hasFlexible = false;\n \n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n if (minmax.min === 'max-content' || minmax.min === 'min-content') {\n minSize += 100; // Fallback estimate\n } else if (minVal !== null) {\n minSize += minVal;\n }\n if (minmax.max.endsWith('fr')) {\n hasFlexible = true;\n }\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n minSize += size;\n } else if (pt.endsWith('fr')) {\n hasFlexible = true;\n minSize += 100; // Minimum fallback for fr units\n }\n }\n }\n \n // Calculate repetitions\n const patternCount = patternTokens.length;\n const gapCount = patternCount - 1;\n const minPatternSize = minSize + (gapCount * gap);\n \n let reps = Math.max(1, Math.floor((availableSpace + gap) / (minPatternSize + gap)));\n \n // Expand pattern\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr') \n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({\n min: minVal || 0,\n max: maxVal,\n size: 0\n });\n \n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n } else if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize) || 0;\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n } else {\n // Fixed repeat count\n const reps = parseInt(count, 10);\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n }\n continue;\n }\n\n // Handle minmax()\n const minmax = parseMinMax(token);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr')\n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({ min: minVal || 0, max: maxVal, size: 0 });\n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n continue;\n }\n\n // Handle fr units\n if (token.endsWith('fr')) {\n const fr = parseFloat(token);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n continue;\n }\n\n // Handle fixed sizes\n const size = parseLengthToPixels(token, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n\n // Calculate final sizes\n const totalGaps = Math.max(0, lanes.length - 1) * gap;\n const flexSpace = Math.max(0, availableSpace - fixedSpace - totalGaps);\n const frUnit = totalFr > 0 ? flexSpace / totalFr : 0;\n\n for (const lane of lanes) {\n if (typeof lane.max === 'object' && lane.max.fr) {\n lane.size = Math.max(lane.min, frUnit * lane.max.fr);\n } else if (typeof lane.max === 'number') {\n lane.size = Math.min(lane.max, Math.max(lane.min, lane.min));\n } else {\n lane.size = lane.min;\n }\n }\n\n return lanes.map(l => l.size);\n }\n\n /**\n * Tokenize a grid template string\n */\n function tokenizeTemplate(template) {\n const tokens = [];\n let current = '';\n let parenDepth = 0;\n\n for (let i = 0; i < template.length; i++) {\n const char = template[i];\n \n if (char === '(') {\n parenDepth++;\n current += char;\n } else if (char === ')') {\n parenDepth--;\n current += char;\n } else if (char === ' ' && parenDepth === 0) {\n if (current.trim()) {\n tokens.push(current.trim());\n }\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n tokens.push(current.trim());\n }\n\n return tokens;\n }\n\n /**\n * Get computed styles for grid-lanes properties\n */\n function getGridLanesStyles(element) {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n\n // Get gap values\n const gap = computed.gap || computed.gridGap || '0px';\n const columnGap = computed.columnGap || computed.gridColumnGap || gap;\n const rowGap = computed.rowGap || computed.gridRowGap || gap;\n\n // Parse item-tolerance (custom property or default)\n let tolerance = DEFAULT_TOLERANCE;\n const toleranceValue = computed.getPropertyValue('--item-tolerance').trim() ||\n computed.getPropertyValue('item-tolerance').trim();\n if (toleranceValue) {\n const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n if (parsed !== null) tolerance = parsed;\n }\n\n return {\n gridTemplateColumns: computed.gridTemplateColumns,\n gridTemplateRows: computed.gridTemplateRows,\n columnGap: parseLengthToPixels(columnGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n rowGap: parseLengthToPixels(rowGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n fontSize,\n rootFontSize,\n tolerance\n };\n }\n\n /**\n * Get item placement properties\n */\n function getItemStyles(element) {\n const computed = window.getComputedStyle(element);\n const gridColumn = computed.gridColumn || computed.gridColumnStart;\n const gridRow = computed.gridRow || computed.gridRowStart;\n\n let columnSpan = 1;\n let columnStart = null;\n let columnEnd = null;\n let rowSpan = 1;\n let rowStart = null;\n let rowEnd = null;\n\n // Parse grid-column\n if (gridColumn && gridColumn !== 'auto') {\n const spanMatch = gridColumn.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n columnSpan = parseInt(spanMatch[1], 10);\n } else if (gridColumn.includes('/')) {\n const [start, end] = gridColumn.split('/').map(s => s.trim());\n columnStart = parseInt(start, 10);\n columnEnd = parseInt(end, 10);\n if (!isNaN(columnStart) && !isNaN(columnEnd)) {\n columnSpan = Math.abs(columnEnd - columnStart);\n }\n } else {\n const num = parseInt(gridColumn, 10);\n if (!isNaN(num)) {\n columnStart = num;\n }\n }\n }\n\n // Parse grid-row\n if (gridRow && gridRow !== 'auto') {\n const spanMatch = gridRow.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n rowSpan = parseInt(spanMatch[1], 10);\n } else if (gridRow.includes('/')) {\n const [start, end] = gridRow.split('/').map(s => s.trim());\n rowStart = parseInt(start, 10);\n rowEnd = parseInt(end, 10);\n if (!isNaN(rowStart) && !isNaN(rowEnd)) {\n rowSpan = Math.abs(rowEnd - rowStart);\n }\n } else {\n const num = parseInt(gridRow, 10);\n if (!isNaN(num)) {\n rowStart = num;\n }\n }\n }\n\n return {\n columnSpan,\n columnStart,\n columnEnd,\n rowSpan,\n rowStart,\n rowEnd\n };\n }\n\n /**\n * Main Grid Lanes layout class\n */\n class GridLanesLayout {\n constructor(container, options = {}) {\n this.container = container;\n this.options = options;\n this.isVertical = true; // true = waterfall (columns), false = brick (rows)\n this.lanes = [];\n this.laneHeights = [];\n this.resizeObserver = null;\n this.mutationObserver = null;\n \n this.init();\n }\n\n init() {\n // Mark as polyfilled\n this.container.setAttribute(POLYFILL_ATTR, 'true');\n \n // Set up container styles\n this.container.style.position = 'relative';\n this.container.style.display = 'block';\n \n // Initial layout\n this.layout();\n \n // Set up observers\n this.setupObservers();\n }\n\n setupObservers() {\n // Resize observer for responsive layouts\n this.resizeObserver = new ResizeObserver(() => {\n this.layout();\n });\n this.resizeObserver.observe(this.container);\n\n // Mutation observer for dynamic content\n this.mutationObserver = new MutationObserver((mutations) => {\n let shouldRelayout = false;\n for (const mutation of mutations) {\n if (mutation.type === 'childList' || \n (mutation.type === 'attributes' && mutation.attributeName === 'style')) {\n shouldRelayout = true;\n break;\n }\n }\n if (shouldRelayout) {\n this.layout();\n }\n });\n this.mutationObserver.observe(this.container, {\n childList: true,\n subtree: false,\n attributes: true,\n attributeFilter: ['style', 'class']\n });\n }\n\n layout() {\n const styles = getGridLanesStyles(this.container);\n const containerRect = this.container.getBoundingClientRect();\n \n // Determine direction based on which template is defined\n const hasColumns = styles.gridTemplateColumns && \n styles.gridTemplateColumns !== 'none' &&\n !styles.gridTemplateColumns.startsWith('auto');\n const hasRows = styles.gridTemplateRows && \n styles.gridTemplateRows !== 'none' &&\n !styles.gridTemplateRows.startsWith('auto');\n \n this.isVertical = hasColumns || !hasRows;\n \n // Calculate lane sizes\n if (this.isVertical) {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateColumns,\n containerRect.width,\n styles.columnGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.width];\n } else {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateRows,\n containerRect.height,\n styles.rowGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.height];\n }\n\n // Initialize lane positions (heights for vertical, widths for horizontal)\n this.laneHeights = new Array(this.lanes.length).fill(0);\n \n // Get all direct children\n const items = Array.from(this.container.children).filter(\n el => el.nodeType === Node.ELEMENT_NODE && \n window.getComputedStyle(el).display !== 'none'\n );\n\n // Separate explicitly placed items from auto-placed items\n const explicitItems = [];\n const autoItems = [];\n \n for (const item of items) {\n const itemStyles = getItemStyles(item);\n if (this.isVertical && itemStyles.columnStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else if (!this.isVertical && itemStyles.rowStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else {\n autoItems.push({ element: item, styles: itemStyles });\n }\n }\n\n // Place explicitly positioned items first\n for (const { element, styles: itemStyles } of explicitItems) {\n this.placeExplicitItem(element, itemStyles, styles);\n }\n\n // Place auto-positioned items\n for (const { element, styles: itemStyles } of autoItems) {\n this.placeAutoItem(element, itemStyles, styles);\n }\n\n // Set container height\n const containerHeight = Math.max(...this.laneHeights);\n this.container.style.minHeight = `${containerHeight}px`;\n }\n\n placeExplicitItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n \n let laneIndex;\n let span;\n \n if (this.isVertical) {\n // Handle negative indices\n laneIndex = itemStyles.columnStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.columnSpan;\n } else {\n laneIndex = itemStyles.rowStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.rowSpan;\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < laneIndex; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate width (for spanning)\n let size = 0;\n const endLane = Math.min(laneIndex + span, this.lanes.length);\n for (let i = laneIndex; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Get the tallest lane in the span\n let maxHeight = 0;\n for (let i = laneIndex; i < endLane; i++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[i]);\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = maxHeight + (maxHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = laneIndex; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n placeAutoItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n const tolerance = containerStyles.tolerance;\n const span = this.isVertical ? itemStyles.columnSpan : itemStyles.rowSpan;\n\n // Find the best lane(s) considering tolerance\n let bestLane = 0;\n let bestHeight = Infinity;\n\n for (let i = 0; i <= this.lanes.length - span; i++) {\n // Get the max height across the span\n let maxHeight = 0;\n for (let j = i; j < i + span; j++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[j]);\n }\n\n // Use tolerance to determine if this is meaningfully better\n if (bestHeight - maxHeight > tolerance) {\n bestHeight = maxHeight;\n bestLane = i;\n } else if (Math.abs(maxHeight - bestHeight) <= tolerance && i < bestLane) {\n // Within tolerance, prefer earlier lane for reading order\n bestHeight = maxHeight;\n bestLane = i;\n }\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < bestLane; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate size (for spanning)\n let size = 0;\n const endLane = Math.min(bestLane + span, this.lanes.length);\n for (let i = bestLane; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = bestHeight + (bestHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = bestLane; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n destroy() {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n \n this.container.removeAttribute(POLYFILL_ATTR);\n this.container.style.position = '';\n this.container.style.display = '';\n this.container.style.minHeight = '';\n \n // Reset item styles\n for (const item of this.container.children) {\n if (item.nodeType === Node.ELEMENT_NODE) {\n item.style.position = '';\n item.style.left = '';\n item.style.top = '';\n item.style.width = '';\n item.style.height = '';\n }\n }\n }\n\n refresh() {\n this.layout();\n }\n }\n\n /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n\n // Check inline styles\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n if (el.style.display === 'grid-lanes') {\n containers.add(el);\n }\n }\n\n // Check stylesheets\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.style && rule.style.display === 'grid-lanes') {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n return containers;\n }\n\n /**\n * Initialize the polyfill\n */\n function init(options = {}) {\n // Check if native support exists\n if (supportsGridLanes() && !options.force) {\n console.log(`${POLYFILL_NAME}: Native support detected, polyfill not needed.`);\n return { supported: true, instances: [] };\n }\n\n const instances = new Map();\n\n // Process existing containers\n const containers = processStyleSheets();\n for (const container of containers) {\n if (!container.hasAttribute(POLYFILL_ATTR)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n\n // Watch for new stylesheets and elements\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n // Check for new style elements\n if (mutation.type === 'childList') {\n for (const node of mutation.addedNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n // Check if the added element is a grid-lanes container\n const style = window.getComputedStyle(node);\n if (node.style.display === 'grid-lanes' || \n style.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(node)) {\n instances.set(node, new GridLanesLayout(node, options));\n }\n }\n \n // Check descendants\n const descendants = node.querySelectorAll('*');\n for (const desc of descendants) {\n const descStyle = window.getComputedStyle(desc);\n if (desc.style.display === 'grid-lanes' ||\n descStyle.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(desc)) {\n instances.set(desc, new GridLanesLayout(desc, options));\n }\n }\n }\n }\n }\n }\n }\n\n // Re-scan stylesheets for new rules\n const newContainers = processStyleSheets();\n for (const container of newContainers) {\n if (!instances.has(container)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true\n });\n\n console.log(`${POLYFILL_NAME}: Initialized, ${instances.size} container(s) found.`);\n\n return {\n supported: false,\n instances,\n observer,\n refresh() {\n for (const instance of instances.values()) {\n instance.refresh();\n }\n },\n destroy() {\n observer.disconnect();\n for (const instance of instances.values()) {\n instance.destroy();\n }\n instances.clear();\n }\n };\n }\n\n /**\n * Apply to a specific element\n */\n function apply(element, options = {}) {\n if (supportsGridLanes() && !options.force) {\n return null;\n }\n return new GridLanesLayout(element, options);\n }\n\n // Export\n const GridLanesPolyfill = {\n supportsGridLanes,\n init,\n apply,\n GridLanesLayout,\n version: '1.0.0'\n };\n\n // AMD\n if (typeof define === 'function' && define.amd) {\n define([], function() { return GridLanesPolyfill; });\n }\n // CommonJS\n else if (typeof module === 'object' && module.exports) {\n module.exports = GridLanesPolyfill;\n }\n // Global\n else {\n global.GridLanesPolyfill = GridLanesPolyfill;\n }\n\n})(typeof globalThis !== 'undefined' ? globalThis : \n typeof window !== 'undefined' ? window : \n typeof global !== 'undefined' ? global : this);\n","structuredPatch":[{"oldStart":681,"oldLines":26,"newStart":681,"newLines":36,"lines":[" */"," function processStyleSheets() {"," const containers = new Set();","+ const gridLanesSelectors = new Set();"," ","- // Check inline styles","+ // Check inline styles (look at the raw style attribute)"," const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');"," for (const el of allElements) {","- if (el.style.display === 'grid-lanes') {","+ const styleAttr = el.getAttribute('style') || '';","+ if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {"," containers.add(el);"," }"," }"," ","- // Check stylesheets","+ // Check stylesheets - parse raw cssText since browsers reject invalid display values"," for (const sheet of document.styleSheets) {"," try {"," const rules = sheet.cssRules || sheet.rules;"," if (!rules) continue;"," "," for (const rule of rules) {","- if (rule.style && rule.style.display === 'grid-lanes') {","- const elements = document.querySelectorAll(rule.selectorText);","- for (const el of elements) {","- containers.add(el);","+ if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {","+ // Extract selector and find matching elements","+ if (rule.selectorText) {","+ gridLanesSelectors.add(rule.selectorText);","+ try {","+ const elements = document.querySelectorAll(rule.selectorText);","+ for (const el of elements) {","+ containers.add(el);","+ }","+ } catch (e) {","+ // Invalid selector, skip","+ }"," }"," }"," }"]},{"oldStart":710,"oldLines":6,"newStart":720,"newLines":28,"lines":[" }"," }"," ","+ // Also check style elements directly for cases where browser strips the property","+ const styleElements = document.querySelectorAll('style');","+ for (const styleEl of styleElements) {","+ const cssText = styleEl.textContent || '';","+ const regex = /([^{}]+)\\{[^}]*display\\s*:\\s*grid-lanes[^}]*\\}/gi;","+ let match;","+ while ((match = regex.exec(cssText)) !== null) {","+ const selector = match[1].trim();","+ if (selector && !gridLanesSelectors.has(selector)) {","+ gridLanesSelectors.add(selector);","+ try {","+ const elements = document.querySelectorAll(selector);","+ for (const el of elements) {","+ containers.add(el);","+ }","+ } catch (e) {","+ // Invalid selector, skip","+ }","+ }","+ }","+ }","+"," return containers;"," }"," "]}],"userModified":false,"replaceAll":false}} | |
| {"parentUuid":"7f5d407e-d4fe-4b9b-bbc4-eda0cb5d8b77","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01XkZ2pCieKJnvBuHWpcLSh8","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Good, I've fixed the stylesheet parsing. But there's another issue - when looking at the `getGridLanesStyles` function, it tries to read `gridTemplateColumns` from computed styles. However, browsers may not properly process these properties if `display: grid-lanes` is invalid.\n\nThe real issue is that the polyfill needs to:\n1. Read the original CSS template values from the raw CSS text (not computed styles) \n2. Store these values so the polyfill can use them\n\nLet me also check - when we do `this.container.style.display = 'block'` in the init(), we're overwriting the display. But the original CSS values like `grid-template-columns` may not be readable from computed styles if the display isn't grid.\n\nActually, looking at this more carefully - when `display: grid-lanes` is set in CSS and the browser rejects it, the element will have some fallback display (like `block`). And `grid-template-columns` only applies to grid containers, so if the element isn't a grid container, those properties won't be in the computed styles either!\n\nI need to:\n1. Parse the original CSS to extract grid-template-columns/rows along with display: grid-lanes\n2. Store these values for each selector\n3. Use these stored values in the layout calculation\n\nLet me enhance the polyfill to properly extract and use the CSS values.","signature":"ErwLCkYIChgCKkC+7XOUXA2lyKI4/XpMha/rg0XmWPRDXt7fwcmhwcyEgcsUQgKIu6BvWVMt7y3Ochav1Dc9JRIMXVnme59TjCa0EgxEb/M3hozRk0yO57UaDE5Lyl3XO8quPbmV7iIwRNO6PoQrYz8I28CvD3rzxpr6F5Fk8yrK6kdBflIpA4d3ZTzyuRVgd6wYKRiirjbpKqMKb/ecc2ZoSE2pMj8ro8pRv4q1Ui8B3MZfGgBGuQsFPaTFPwHObfL8vKKbFa4UnFVQI8ruHPBBhzeqZerzACooiK5qgq0kOFZt2Ylv+nxebI4ZCPi3aNceSkS9KF+U6xUoP632btVoRIB9p2Ggnjzvi9AyI9XQ/NpNo60Ki0kKqxQX6wdamY/Jgetiop9jOMfO7S2uZuU13QYxn1Gx31CCM8bA/oJMs2pNqfE4ZYXPIeWhPkhbkzLs278jyVD0kFjLcqwRBMsrAHJ99nm1l86aHBKrsiO5WYRNQ0yXkpx3WuOTNdvOFZGJoOsdJT+zE6h+4fjutHK18ZJ+Q0VRH2v5EbCt52tD5DAQeNCDUWMspUR4uMih4NoUbFXjK/EqvxHfZfAqA+TN2uqNhsIjOAZFvTuGgXqNNeaZoQFAfKSohfzzqh/wf6FKkni+jfmKyvySgTl3j4YgmKyZO1g1qhvnC7/xsir1fYisR9uk0DOzOTYTOm+DbpHo83Me/sepAq/o74AYeAufzJQEglJ0yv6Ttz2F94otDDPj8e6gsyglEy62ZN1OV342/Tkkh32WPwJDYccpWXgPbldEZ7BAdAkmZaFvnYq4YFMq/ncq2x3KWMUvzOlnTCok4MlJWBTjA8varMdM+rFcyBiqWTz9/bt7b/5P140UXuN/AHQ+NyeWfDIsEpCVG8TRqBZMHZnwmlIOpguDTPGZbhwP/+3Mo5toHndfuTMoTFnidu7donKxKAFUWeX35x4dZiV8TRPEOV2fSmNJ0A4qP1wwyMcdt9VEo4wqUsp+g9SZWhdmsRfGmhyokHAHbJa0jm/PNVAIoPhnmSwab2n5Nvpre+pN/hQCAejFqTS/IrcdQpRG7LS5pYJCGkw+kX9tJerR4XavY5i0BwXhMfDtIGRmFgKUCo5m2AsWsaqueGnZfvAFVPnBjqXPlWmtvGNJwXGUnfem6btbz5Ni700yi2ZBpeSY85gALky1T4GzmqrZXBq0yDIFJj6cQNfST7QfUNB5EhHeZVIQb6IVEft6hFnPyqWg3TypIXXIzMKnQdK9XfXGzWUqpxHX2VyVkfe/h1JpGsfjvdXVyzXcRTQhGyHBd8GHj+CTBRAAGqBA+gKpE1qd/34kWbhRzPTKHylbQCjfV8Ngso3TB57djZBjqGJ5UZxQi3f4uCxBe3VpqTXF21IEwZOgCXDMem7tPmrLNiGmBNNEmyZrVEE980+unZVP8MxREEnEtx3S4l9thNaDusCsl1FSxAAomMpU9UQUqhZHnAxaDQV9rjV8XwwqNmuVlZOFk1otz3S0B4FtNUBUyn6h/HTtZC43VeSAjTIHkR8hi/KmrI245M2DuO5ktBX76vgWRbQDb6C590I7RmVL2raQ6CG2JEQLRxb/FlnB7lwfas7FPSnVFmEDniCOSolKNeOVYNYjGUcduO5AqrlKf3OEH69Z3Wn6GxZtPVXKN22Ark3D+Yu0in3WzbI/24po2XeDEALwWAF8qfan0lYHaGShLeP7NCqgVvrI9FuehR/w81rcmkF3AvcIOpVpoLAJhcIcPwfRcIZPlwWZfHRmNdpHy21bqpo57BPqDKNCy1bR5ymgVAkxssJbFUauID6v9V+OuXvkZ9k5msExwX1hj7w46Wwxc4tOxnamwpluPNsO/HjZO9TRsPbVr5Jeft4sKVah+Q5XndYZU+2ZcDSys+hjpbm+R4nTkPCKU88JOH9TB2dz1qx7Lsj1N7H+0DLLhpPgV697ijjIwhgB"}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":2091,"cache_read_input_tokens":42275,"cache_creation":{"ephemeral_5m_input_tokens":2091,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRfiZ7wT4k5qRBvsPRm","type":"assistant","uuid":"fa2feb98-a3a8-4417-8b1a-892584acb691","timestamp":"2025-12-20T05:58:25.564Z"} | |
| {"parentUuid":"fa2feb98-a3a8-4417-8b1a-892584acb691","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01XkZ2pCieKJnvBuHWpcLSh8","type":"message","role":"assistant","content":[{"type":"text","text":"The detection should work now, but there's another issue. When the browser rejects `display: grid-lanes`, it also won't properly compute `grid-template-columns` since those only apply to grid containers. I need to parse the CSS values directly too."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":2091,"cache_read_input_tokens":42275,"cache_creation":{"ephemeral_5m_input_tokens":2091,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRfiZ7wT4k5qRBvsPRm","type":"assistant","uuid":"b7784821-36fc-4674-973f-fb175f152114","timestamp":"2025-12-20T05:58:26.672Z"} | |
| {"parentUuid":"b7784821-36fc-4674-973f-fb175f152114","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01XkZ2pCieKJnvBuHWpcLSh8","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01QFB6Bz4WGKmF96iY5xigen","name":"Edit","input":{"file_path":"/private/tmp/files/grid-lanes-polyfill.js","old_string":" const POLYFILL_NAME = 'GridLanesPolyfill';\n const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n const DEFAULT_TOLERANCE = 16; // ~1em in pixels","new_string":" const POLYFILL_NAME = 'GridLanesPolyfill';\n const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n const DEFAULT_TOLERANCE = 16; // ~1em in pixels\n\n // Store parsed CSS rules for grid-lanes containers\n const parsedGridLanesRules = new Map();"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":2091,"cache_read_input_tokens":42275,"cache_creation":{"ephemeral_5m_input_tokens":2091,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRfiZ7wT4k5qRBvsPRm","type":"assistant","uuid":"f65d4789-8c05-4dce-bf95-6a583a592abe","timestamp":"2025-12-20T05:58:29.122Z"} | |
| {"parentUuid":"f65d4789-8c05-4dce-bf95-6a583a592abe","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01QFB6Bz4WGKmF96iY5xigen","type":"tool_result","content":"The file /private/tmp/files/grid-lanes-polyfill.js has been updated. Here's the result of running `cat -n` on a snippet of the edited file:\n 21→\n 22→(function(global) {\n 23→ 'use strict';\n 24→\n 25→ const POLYFILL_NAME = 'GridLanesPolyfill';\n 26→ const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n 27→ const DEFAULT_TOLERANCE = 16; // ~1em in pixels\n 28→\n 29→ // Store parsed CSS rules for grid-lanes containers\n 30→ const parsedGridLanesRules = new Map();\n 31→\n 32→ /**\n 33→ * Check if the browser natively supports display: grid-lanes\n 34→ */"}]},"uuid":"1248fbf9-efad-490b-a606-b64f64679d4e","timestamp":"2025-12-20T05:58:29.162Z","toolUseResult":{"filePath":"/private/tmp/files/grid-lanes-polyfill.js","oldString":" const POLYFILL_NAME = 'GridLanesPolyfill';\n const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n const DEFAULT_TOLERANCE = 16; // ~1em in pixels","newString":" const POLYFILL_NAME = 'GridLanesPolyfill';\n const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n const DEFAULT_TOLERANCE = 16; // ~1em in pixels\n\n // Store parsed CSS rules for grid-lanes containers\n const parsedGridLanesRules = new Map();","originalFile":"/**\n * CSS Grid Lanes Polyfill\n * \n * Polyfills the new `display: grid-lanes` CSS feature for browsers\n * that don't support it natively. Based on the WebKit implementation\n * described at: https://webkit.org/blog/17660/introducing-css-grid-lanes/\n * \n * Features supported:\n * - display: grid-lanes\n * - grid-template-columns / grid-template-rows for lane definition\n * - gap, column-gap, row-gap\n * - item-tolerance for placement sensitivity\n * - Spanning items (grid-column: span N)\n * - Explicit placement (grid-column: N / M)\n * - Responsive auto-fill/auto-fit with minmax()\n * - Both waterfall (columns) and brick (rows) layouts\n * \n * @version 1.0.0\n * @license MIT\n */\n\n(function(global) {\n 'use strict';\n\n const POLYFILL_NAME = 'GridLanesPolyfill';\n const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n const DEFAULT_TOLERANCE = 16; // ~1em in pixels\n\n /**\n * Check if the browser natively supports display: grid-lanes\n */\n function supportsGridLanes() {\n if (typeof CSS === 'undefined' || !CSS.supports) {\n return false;\n }\n return CSS.supports('display', 'grid-lanes');\n }\n\n /**\n * Parse a CSS length value to pixels\n */\n function parseLengthToPixels(value, containerSize, fontSize = 16, rootFontSize = 16) {\n if (!value || value === 'auto' || value === 'none') return null;\n \n const num = parseFloat(value);\n if (isNaN(num)) return null;\n\n if (value.endsWith('px')) return num;\n if (value.endsWith('rem')) return num * rootFontSize;\n if (value.endsWith('em')) return num * fontSize;\n if (value.endsWith('ch')) return num * fontSize * 0.5; // Approximate\n if (value.endsWith('lh')) return num * fontSize * 1.2; // Approximate line-height\n if (value.endsWith('%')) return (num / 100) * containerSize;\n if (value.endsWith('vw')) return (num / 100) * window.innerWidth;\n if (value.endsWith('vh')) return (num / 100) * window.innerHeight;\n if (value.endsWith('vmin')) return (num / 100) * Math.min(window.innerWidth, window.innerHeight);\n if (value.endsWith('vmax')) return (num / 100) * Math.max(window.innerWidth, window.innerHeight);\n if (value.endsWith('fr')) return null; // Handled separately\n \n // Unitless number treated as pixels\n if (!isNaN(num) && value === String(num)) return num;\n \n return null;\n }\n\n /**\n * Parse minmax() function\n */\n function parseMinMax(value) {\n const match = value.match(/minmax\\(\\s*([^,]+)\\s*,\\s*([^)]+)\\s*\\)/);\n if (!match) return null;\n return {\n min: match[1].trim(),\n max: match[2].trim()\n };\n }\n\n /**\n * Parse repeat() function\n */\n function parseRepeat(value) {\n const match = value.match(/repeat\\(\\s*([^,]+)\\s*,\\s*(.+)\\s*\\)/);\n if (!match) return null;\n return {\n count: match[1].trim(),\n pattern: match[2].trim()\n };\n }\n\n /**\n * Calculate lane sizes from grid-template-columns/rows\n */\n function calculateLaneSizes(template, containerSize, gap, fontSize, rootFontSize) {\n if (!template || template === 'none' || template === 'auto') {\n return null;\n }\n\n const availableSpace = containerSize;\n let lanes = [];\n let totalFr = 0;\n let fixedSpace = 0;\n\n // Parse the template\n const tokens = tokenizeTemplate(template);\n \n for (const token of tokens) {\n // Handle repeat()\n const repeatInfo = parseRepeat(token);\n if (repeatInfo) {\n const { count, pattern } = repeatInfo;\n const patternTokens = tokenizeTemplate(pattern);\n \n if (count === 'auto-fill' || count === 'auto-fit') {\n // Calculate how many repetitions fit\n let minSize = 0;\n let hasFlexible = false;\n \n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n if (minmax.min === 'max-content' || minmax.min === 'min-content') {\n minSize += 100; // Fallback estimate\n } else if (minVal !== null) {\n minSize += minVal;\n }\n if (minmax.max.endsWith('fr')) {\n hasFlexible = true;\n }\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n minSize += size;\n } else if (pt.endsWith('fr')) {\n hasFlexible = true;\n minSize += 100; // Minimum fallback for fr units\n }\n }\n }\n \n // Calculate repetitions\n const patternCount = patternTokens.length;\n const gapCount = patternCount - 1;\n const minPatternSize = minSize + (gapCount * gap);\n \n let reps = Math.max(1, Math.floor((availableSpace + gap) / (minPatternSize + gap)));\n \n // Expand pattern\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr') \n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({\n min: minVal || 0,\n max: maxVal,\n size: 0\n });\n \n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n } else if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize) || 0;\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n } else {\n // Fixed repeat count\n const reps = parseInt(count, 10);\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n }\n continue;\n }\n\n // Handle minmax()\n const minmax = parseMinMax(token);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr')\n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({ min: minVal || 0, max: maxVal, size: 0 });\n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n continue;\n }\n\n // Handle fr units\n if (token.endsWith('fr')) {\n const fr = parseFloat(token);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n continue;\n }\n\n // Handle fixed sizes\n const size = parseLengthToPixels(token, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n\n // Calculate final sizes\n const totalGaps = Math.max(0, lanes.length - 1) * gap;\n const flexSpace = Math.max(0, availableSpace - fixedSpace - totalGaps);\n const frUnit = totalFr > 0 ? flexSpace / totalFr : 0;\n\n for (const lane of lanes) {\n if (typeof lane.max === 'object' && lane.max.fr) {\n lane.size = Math.max(lane.min, frUnit * lane.max.fr);\n } else if (typeof lane.max === 'number') {\n lane.size = Math.min(lane.max, Math.max(lane.min, lane.min));\n } else {\n lane.size = lane.min;\n }\n }\n\n return lanes.map(l => l.size);\n }\n\n /**\n * Tokenize a grid template string\n */\n function tokenizeTemplate(template) {\n const tokens = [];\n let current = '';\n let parenDepth = 0;\n\n for (let i = 0; i < template.length; i++) {\n const char = template[i];\n \n if (char === '(') {\n parenDepth++;\n current += char;\n } else if (char === ')') {\n parenDepth--;\n current += char;\n } else if (char === ' ' && parenDepth === 0) {\n if (current.trim()) {\n tokens.push(current.trim());\n }\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n tokens.push(current.trim());\n }\n\n return tokens;\n }\n\n /**\n * Get computed styles for grid-lanes properties\n */\n function getGridLanesStyles(element) {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n\n // Get gap values\n const gap = computed.gap || computed.gridGap || '0px';\n const columnGap = computed.columnGap || computed.gridColumnGap || gap;\n const rowGap = computed.rowGap || computed.gridRowGap || gap;\n\n // Parse item-tolerance (custom property or default)\n let tolerance = DEFAULT_TOLERANCE;\n const toleranceValue = computed.getPropertyValue('--item-tolerance').trim() ||\n computed.getPropertyValue('item-tolerance').trim();\n if (toleranceValue) {\n const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n if (parsed !== null) tolerance = parsed;\n }\n\n return {\n gridTemplateColumns: computed.gridTemplateColumns,\n gridTemplateRows: computed.gridTemplateRows,\n columnGap: parseLengthToPixels(columnGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n rowGap: parseLengthToPixels(rowGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n fontSize,\n rootFontSize,\n tolerance\n };\n }\n\n /**\n * Get item placement properties\n */\n function getItemStyles(element) {\n const computed = window.getComputedStyle(element);\n const gridColumn = computed.gridColumn || computed.gridColumnStart;\n const gridRow = computed.gridRow || computed.gridRowStart;\n\n let columnSpan = 1;\n let columnStart = null;\n let columnEnd = null;\n let rowSpan = 1;\n let rowStart = null;\n let rowEnd = null;\n\n // Parse grid-column\n if (gridColumn && gridColumn !== 'auto') {\n const spanMatch = gridColumn.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n columnSpan = parseInt(spanMatch[1], 10);\n } else if (gridColumn.includes('/')) {\n const [start, end] = gridColumn.split('/').map(s => s.trim());\n columnStart = parseInt(start, 10);\n columnEnd = parseInt(end, 10);\n if (!isNaN(columnStart) && !isNaN(columnEnd)) {\n columnSpan = Math.abs(columnEnd - columnStart);\n }\n } else {\n const num = parseInt(gridColumn, 10);\n if (!isNaN(num)) {\n columnStart = num;\n }\n }\n }\n\n // Parse grid-row\n if (gridRow && gridRow !== 'auto') {\n const spanMatch = gridRow.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n rowSpan = parseInt(spanMatch[1], 10);\n } else if (gridRow.includes('/')) {\n const [start, end] = gridRow.split('/').map(s => s.trim());\n rowStart = parseInt(start, 10);\n rowEnd = parseInt(end, 10);\n if (!isNaN(rowStart) && !isNaN(rowEnd)) {\n rowSpan = Math.abs(rowEnd - rowStart);\n }\n } else {\n const num = parseInt(gridRow, 10);\n if (!isNaN(num)) {\n rowStart = num;\n }\n }\n }\n\n return {\n columnSpan,\n columnStart,\n columnEnd,\n rowSpan,\n rowStart,\n rowEnd\n };\n }\n\n /**\n * Main Grid Lanes layout class\n */\n class GridLanesLayout {\n constructor(container, options = {}) {\n this.container = container;\n this.options = options;\n this.isVertical = true; // true = waterfall (columns), false = brick (rows)\n this.lanes = [];\n this.laneHeights = [];\n this.resizeObserver = null;\n this.mutationObserver = null;\n \n this.init();\n }\n\n init() {\n // Mark as polyfilled\n this.container.setAttribute(POLYFILL_ATTR, 'true');\n \n // Set up container styles\n this.container.style.position = 'relative';\n this.container.style.display = 'block';\n \n // Initial layout\n this.layout();\n \n // Set up observers\n this.setupObservers();\n }\n\n setupObservers() {\n // Resize observer for responsive layouts\n this.resizeObserver = new ResizeObserver(() => {\n this.layout();\n });\n this.resizeObserver.observe(this.container);\n\n // Mutation observer for dynamic content\n this.mutationObserver = new MutationObserver((mutations) => {\n let shouldRelayout = false;\n for (const mutation of mutations) {\n if (mutation.type === 'childList' || \n (mutation.type === 'attributes' && mutation.attributeName === 'style')) {\n shouldRelayout = true;\n break;\n }\n }\n if (shouldRelayout) {\n this.layout();\n }\n });\n this.mutationObserver.observe(this.container, {\n childList: true,\n subtree: false,\n attributes: true,\n attributeFilter: ['style', 'class']\n });\n }\n\n layout() {\n const styles = getGridLanesStyles(this.container);\n const containerRect = this.container.getBoundingClientRect();\n \n // Determine direction based on which template is defined\n const hasColumns = styles.gridTemplateColumns && \n styles.gridTemplateColumns !== 'none' &&\n !styles.gridTemplateColumns.startsWith('auto');\n const hasRows = styles.gridTemplateRows && \n styles.gridTemplateRows !== 'none' &&\n !styles.gridTemplateRows.startsWith('auto');\n \n this.isVertical = hasColumns || !hasRows;\n \n // Calculate lane sizes\n if (this.isVertical) {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateColumns,\n containerRect.width,\n styles.columnGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.width];\n } else {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateRows,\n containerRect.height,\n styles.rowGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.height];\n }\n\n // Initialize lane positions (heights for vertical, widths for horizontal)\n this.laneHeights = new Array(this.lanes.length).fill(0);\n \n // Get all direct children\n const items = Array.from(this.container.children).filter(\n el => el.nodeType === Node.ELEMENT_NODE && \n window.getComputedStyle(el).display !== 'none'\n );\n\n // Separate explicitly placed items from auto-placed items\n const explicitItems = [];\n const autoItems = [];\n \n for (const item of items) {\n const itemStyles = getItemStyles(item);\n if (this.isVertical && itemStyles.columnStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else if (!this.isVertical && itemStyles.rowStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else {\n autoItems.push({ element: item, styles: itemStyles });\n }\n }\n\n // Place explicitly positioned items first\n for (const { element, styles: itemStyles } of explicitItems) {\n this.placeExplicitItem(element, itemStyles, styles);\n }\n\n // Place auto-positioned items\n for (const { element, styles: itemStyles } of autoItems) {\n this.placeAutoItem(element, itemStyles, styles);\n }\n\n // Set container height\n const containerHeight = Math.max(...this.laneHeights);\n this.container.style.minHeight = `${containerHeight}px`;\n }\n\n placeExplicitItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n \n let laneIndex;\n let span;\n \n if (this.isVertical) {\n // Handle negative indices\n laneIndex = itemStyles.columnStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.columnSpan;\n } else {\n laneIndex = itemStyles.rowStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.rowSpan;\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < laneIndex; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate width (for spanning)\n let size = 0;\n const endLane = Math.min(laneIndex + span, this.lanes.length);\n for (let i = laneIndex; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Get the tallest lane in the span\n let maxHeight = 0;\n for (let i = laneIndex; i < endLane; i++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[i]);\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = maxHeight + (maxHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = laneIndex; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n placeAutoItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n const tolerance = containerStyles.tolerance;\n const span = this.isVertical ? itemStyles.columnSpan : itemStyles.rowSpan;\n\n // Find the best lane(s) considering tolerance\n let bestLane = 0;\n let bestHeight = Infinity;\n\n for (let i = 0; i <= this.lanes.length - span; i++) {\n // Get the max height across the span\n let maxHeight = 0;\n for (let j = i; j < i + span; j++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[j]);\n }\n\n // Use tolerance to determine if this is meaningfully better\n if (bestHeight - maxHeight > tolerance) {\n bestHeight = maxHeight;\n bestLane = i;\n } else if (Math.abs(maxHeight - bestHeight) <= tolerance && i < bestLane) {\n // Within tolerance, prefer earlier lane for reading order\n bestHeight = maxHeight;\n bestLane = i;\n }\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < bestLane; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate size (for spanning)\n let size = 0;\n const endLane = Math.min(bestLane + span, this.lanes.length);\n for (let i = bestLane; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = bestHeight + (bestHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = bestLane; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n destroy() {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n \n this.container.removeAttribute(POLYFILL_ATTR);\n this.container.style.position = '';\n this.container.style.display = '';\n this.container.style.minHeight = '';\n \n // Reset item styles\n for (const item of this.container.children) {\n if (item.nodeType === Node.ELEMENT_NODE) {\n item.style.position = '';\n item.style.left = '';\n item.style.top = '';\n item.style.width = '';\n item.style.height = '';\n }\n }\n }\n\n refresh() {\n this.layout();\n }\n }\n\n /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n const gridLanesSelectors = new Set();\n\n // Check inline styles (look at the raw style attribute)\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n const styleAttr = el.getAttribute('style') || '';\n if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n containers.add(el);\n }\n }\n\n // Check stylesheets - parse raw cssText since browsers reject invalid display values\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n // Extract selector and find matching elements\n if (rule.selectorText) {\n gridLanesSelectors.add(rule.selectorText);\n try {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n // Also check style elements directly for cases where browser strips the property\n const styleElements = document.querySelectorAll('style');\n for (const styleEl of styleElements) {\n const cssText = styleEl.textContent || '';\n const regex = /([^{}]+)\\{[^}]*display\\s*:\\s*grid-lanes[^}]*\\}/gi;\n let match;\n while ((match = regex.exec(cssText)) !== null) {\n const selector = match[1].trim();\n if (selector && !gridLanesSelectors.has(selector)) {\n gridLanesSelectors.add(selector);\n try {\n const elements = document.querySelectorAll(selector);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n\n return containers;\n }\n\n /**\n * Initialize the polyfill\n */\n function init(options = {}) {\n // Check if native support exists\n if (supportsGridLanes() && !options.force) {\n console.log(`${POLYFILL_NAME}: Native support detected, polyfill not needed.`);\n return { supported: true, instances: [] };\n }\n\n const instances = new Map();\n\n // Process existing containers\n const containers = processStyleSheets();\n for (const container of containers) {\n if (!container.hasAttribute(POLYFILL_ATTR)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n\n // Watch for new stylesheets and elements\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n // Check for new style elements\n if (mutation.type === 'childList') {\n for (const node of mutation.addedNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n // Check if the added element is a grid-lanes container\n const style = window.getComputedStyle(node);\n if (node.style.display === 'grid-lanes' || \n style.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(node)) {\n instances.set(node, new GridLanesLayout(node, options));\n }\n }\n \n // Check descendants\n const descendants = node.querySelectorAll('*');\n for (const desc of descendants) {\n const descStyle = window.getComputedStyle(desc);\n if (desc.style.display === 'grid-lanes' ||\n descStyle.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(desc)) {\n instances.set(desc, new GridLanesLayout(desc, options));\n }\n }\n }\n }\n }\n }\n }\n\n // Re-scan stylesheets for new rules\n const newContainers = processStyleSheets();\n for (const container of newContainers) {\n if (!instances.has(container)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true\n });\n\n console.log(`${POLYFILL_NAME}: Initialized, ${instances.size} container(s) found.`);\n\n return {\n supported: false,\n instances,\n observer,\n refresh() {\n for (const instance of instances.values()) {\n instance.refresh();\n }\n },\n destroy() {\n observer.disconnect();\n for (const instance of instances.values()) {\n instance.destroy();\n }\n instances.clear();\n }\n };\n }\n\n /**\n * Apply to a specific element\n */\n function apply(element, options = {}) {\n if (supportsGridLanes() && !options.force) {\n return null;\n }\n return new GridLanesLayout(element, options);\n }\n\n // Export\n const GridLanesPolyfill = {\n supportsGridLanes,\n init,\n apply,\n GridLanesLayout,\n version: '1.0.0'\n };\n\n // AMD\n if (typeof define === 'function' && define.amd) {\n define([], function() { return GridLanesPolyfill; });\n }\n // CommonJS\n else if (typeof module === 'object' && module.exports) {\n module.exports = GridLanesPolyfill;\n }\n // Global\n else {\n global.GridLanesPolyfill = GridLanesPolyfill;\n }\n\n})(typeof globalThis !== 'undefined' ? globalThis : \n typeof window !== 'undefined' ? window : \n typeof global !== 'undefined' ? global : this);\n","structuredPatch":[{"oldStart":26,"oldLines":6,"newStart":26,"newLines":9,"lines":[" const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';"," const DEFAULT_TOLERANCE = 16; // ~1em in pixels"," ","+ // Store parsed CSS rules for grid-lanes containers","+ const parsedGridLanesRules = new Map();","+"," /**"," * Check if the browser natively supports display: grid-lanes"," */"]}],"userModified":false,"replaceAll":false}} | |
| {"parentUuid":"1248fbf9-efad-490b-a606-b64f64679d4e","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01Xe1zYa6fCYiPPSPwhcC5MH","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Now I need to update the processStyleSheets function to also extract and store the CSS property values (like grid-template-columns) from the raw CSS text, since browsers won't properly compute these for non-grid containers.","signature":"EogDCkYIChgCKkAK/MlBJQz9HW5vyVVRXcBeVWESP1Usw8tt+gOXI0XHJ9jzXw/uuLZmGtO/hHg5F/MPZeeYSNixTHONDNHGHdExEgywLEamjNiVFZcfl5oaDHc8y0Ubh9EUNYgO9iIwy8LyE5c3iuedMfI9BK3iVuGt/Hwjpu7M05SwxQmdVk8CTgvsbox+5oCAZ8++kALyKu8BYztsRV2NDRDv7YEktVPR+VcdeLaQ3CHZa5HgZznxzaommc2CXEESRhcUgBE4eTqCQbtdHle37EuC3t15l2uCWTQ68h2i3cdkzkr4fkBR/3FBUp2SirSIyA1xEGYia1rsiR54Rq5d475bmkFYjApqWC0XWMFZ8gs8SJlb2/g035OPQnm+uDx5yCd8eTLvm+1VzCewALM+dV/uvEfOCK3SppnFXg0GDuvcBX2Xfb32hii3614fN4lzEEwXkjrDPJK7sQpZI7sxFdcZuJ6aUPns2jvZpsA52G+J6MhSA19nEpDVfjxhn4Yr+2i/wFzCQWwYAQ=="}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":849,"cache_read_input_tokens":44366,"cache_creation":{"ephemeral_5m_input_tokens":849,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard"}},"requestId":"req_011CWHRghtiDUDBs5fdGt6DW","type":"assistant","uuid":"24704170-fbe0-40d1-b8f5-5c1089846374","timestamp":"2025-12-20T05:58:32.432Z"} | |
| {"parentUuid":"24704170-fbe0-40d1-b8f5-5c1089846374","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01Xe1zYa6fCYiPPSPwhcC5MH","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01TgSfAyPrwNr4mwZoD3j2VR","name":"Edit","input":{"file_path":"/private/tmp/files/grid-lanes-polyfill.js","old_string":" /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n const gridLanesSelectors = new Set();\n\n // Check inline styles (look at the raw style attribute)\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n const styleAttr = el.getAttribute('style') || '';\n if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n containers.add(el);\n }\n }\n\n // Check stylesheets - parse raw cssText since browsers reject invalid display values\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n // Extract selector and find matching elements\n if (rule.selectorText) {\n gridLanesSelectors.add(rule.selectorText);\n try {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n // Also check style elements directly for cases where browser strips the property\n const styleElements = document.querySelectorAll('style');\n for (const styleEl of styleElements) {\n const cssText = styleEl.textContent || '';\n const regex = /([^{}]+)\\{[^}]*display\\s*:\\s*grid-lanes[^}]*\\}/gi;\n let match;\n while ((match = regex.exec(cssText)) !== null) {\n const selector = match[1].trim();\n if (selector && !gridLanesSelectors.has(selector)) {\n gridLanesSelectors.add(selector);\n try {\n const elements = document.querySelectorAll(selector);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n\n return containers;\n }","new_string":" /**\n * Parse CSS properties from a CSS block text\n */\n function parseCSSProperties(cssBlock) {\n const props = {};\n // Extract property: value pairs\n const propRegex = /([\\w-]+)\\s*:\\s*([^;]+);?/g;\n let match;\n while ((match = propRegex.exec(cssBlock)) !== null) {\n props[match[1].trim()] = match[2].trim();\n }\n return props;\n }\n\n /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n const gridLanesSelectors = new Set();\n\n // Check inline styles (look at the raw style attribute)\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n const styleAttr = el.getAttribute('style') || '';\n if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n containers.add(el);\n // Parse and store inline style properties\n const props = parseCSSProperties(styleAttr);\n if (!parsedGridLanesRules.has(el)) {\n parsedGridLanesRules.set(el, props);\n }\n }\n }\n\n // Check style elements directly and parse raw CSS\n const styleElements = document.querySelectorAll('style');\n for (const styleEl of styleElements) {\n const cssText = styleEl.textContent || '';\n // Match selectors with display: grid-lanes and capture the full block\n const regex = /([^{}]+)\\{([^}]*display\\s*:\\s*grid-lanes[^}]*)\\}/gi;\n let match;\n while ((match = regex.exec(cssText)) !== null) {\n const selectorText = match[1].trim();\n const cssBlock = match[2];\n\n // Handle comma-separated selectors\n const selectors = selectorText.split(',').map(s => s.trim());\n\n for (const selector of selectors) {\n if (!selector) continue;\n gridLanesSelectors.add(selector);\n\n // Parse properties from the CSS block\n const props = parseCSSProperties(cssBlock);\n\n try {\n const elements = document.querySelectorAll(selector);\n for (const el of elements) {\n containers.add(el);\n // Store parsed rules for this element (merge if exists)\n if (parsedGridLanesRules.has(el)) {\n Object.assign(parsedGridLanesRules.get(el), props);\n } else {\n parsedGridLanesRules.set(el, { ...props });\n }\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n\n // Also check stylesheet rules (may work for some browsers)\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n if (rule.selectorText && !gridLanesSelectors.has(rule.selectorText)) {\n gridLanesSelectors.add(rule.selectorText);\n const props = parseCSSProperties(rule.cssText);\n try {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n if (!parsedGridLanesRules.has(el)) {\n parsedGridLanesRules.set(el, props);\n }\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n return containers;\n }"}}],"stop_reason":"tool_use","stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":849,"cache_read_input_tokens":44366,"cache_creation":{"ephemeral_5m_input_tokens":849,"ephemeral_1h_input_tokens":0},"output_tokens":1826,"service_tier":"standard"}},"requestId":"req_011CWHRghtiDUDBs5fdGt6DW","type":"assistant","uuid":"91d73da0-c6bc-4045-9e7e-f06899c629be","timestamp":"2025-12-20T05:58:47.055Z"} | |
| {"parentUuid":"91d73da0-c6bc-4045-9e7e-f06899c629be","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01TgSfAyPrwNr4mwZoD3j2VR","type":"tool_result","content":"The file /private/tmp/files/grid-lanes-polyfill.js has been updated. Here's the result of running `cat -n` on a snippet of the edited file:\n 678→ this.layout();\n 679→ }\n 680→ }\n 681→\n 682→ /**\n 683→ * Parse CSS properties from a CSS block text\n 684→ */\n 685→ function parseCSSProperties(cssBlock) {\n 686→ const props = {};\n 687→ // Extract property: value pairs\n 688→ const propRegex = /([\\w-]+)\\s*:\\s*([^;]+);?/g;\n 689→ let match;\n 690→ while ((match = propRegex.exec(cssBlock)) !== null) {\n 691→ props[match[1].trim()] = match[2].trim();\n 692→ }\n 693→ return props;\n 694→ }\n 695→\n 696→ /**\n 697→ * Find and process all grid-lanes containers\n 698→ */\n 699→ function processStyleSheets() {\n 700→ const containers = new Set();\n 701→ const gridLanesSelectors = new Set();\n 702→\n 703→ // Check inline styles (look at the raw style attribute)\n 704→ const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n 705→ for (const el of allElements) {\n 706→ const styleAttr = el.getAttribute('style') || '';\n 707→ if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n 708→ containers.add(el);\n 709→ // Parse and store inline style properties\n 710→ const props = parseCSSProperties(styleAttr);\n 711→ if (!parsedGridLanesRules.has(el)) {\n 712→ parsedGridLanesRules.set(el, props);\n 713→ }\n 714→ }\n 715→ }\n 716→\n 717→ // Check style elements directly and parse raw CSS\n 718→ const styleElements = document.querySelectorAll('style');\n 719→ for (const styleEl of styleElements) {\n 720→ const cssText = styleEl.textContent || '';\n 721→ // Match selectors with display: grid-lanes and capture the full block\n 722→ const regex = /([^{}]+)\\{([^}]*display\\s*:\\s*grid-lanes[^}]*)\\}/gi;\n 723→ let match;\n 724→ while ((match = regex.exec(cssText)) !== null) {\n 725→ const selectorText = match[1].trim();\n 726→ const cssBlock = match[2];\n 727→\n 728→ // Handle comma-separated selectors\n 729→ const selectors = selectorText.split(',').map(s => s.trim());\n 730→\n 731→ for (const selector of selectors) {\n 732→ if (!selector) continue;\n 733→ gridLanesSelectors.add(selector);\n 734→\n 735→ // Parse properties from the CSS block\n 736→ const props = parseCSSProperties(cssBlock);\n 737→\n 738→ try {\n 739→ const elements = document.querySelectorAll(selector);\n 740→ for (const el of elements) {\n 741→ containers.add(el);\n 742→ // Store parsed rules for this element (merge if exists)\n 743→ if (parsedGridLanesRules.has(el)) {\n 744→ Object.assign(parsedGridLanesRules.get(el), props);\n 745→ } else {\n 746→ parsedGridLanesRules.set(el, { ...props });\n 747→ }\n 748→ }\n 749→ } catch (e) {\n 750→ // Invalid selector, skip\n 751→ }\n 752→ }\n 753→ }\n 754→ }\n 755→\n 756→ // Also check stylesheet rules (may work for some browsers)\n 757→ for (const sheet of document.styleSheets) {\n 758→ try {\n 759→ const rules = sheet.cssRules || sheet.rules;\n 760→ if (!rules) continue;\n 761→\n 762→ for (const rule of rules) {\n 763→ if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n 764→ if (rule.selectorText && !gridLanesSelectors.has(rule.selectorText)) {\n 765→ gridLanesSelectors.add(rule.selectorText);\n 766→ const props = parseCSSProperties(rule.cssText);\n 767→ try {\n 768→ const elements = document.querySelectorAll(rule.selectorText);\n 769→ for (const el of elements) {\n 770→ containers.add(el);\n 771→ if (!parsedGridLanesRules.has(el)) {\n 772→ parsedGridLanesRules.set(el, props);\n 773→ }\n 774→ }\n 775→ } catch (e) {\n 776→ // Invalid selector, skip\n 777→ }\n 778→ }\n 779→ }\n 780→ }\n 781→ } catch (e) {\n 782→ // Cross-origin stylesheets will throw\n 783→ console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n 784→ }\n 785→ }\n 786→\n 787→ return containers;\n 788→ }\n 789→\n 790→ /**\n 791→ * Initialize the polyfill\n 792→ */"}]},"uuid":"8c45cef0-fca1-42ca-9db4-1c3cf3941e53","timestamp":"2025-12-20T05:58:47.087Z","toolUseResult":{"filePath":"/private/tmp/files/grid-lanes-polyfill.js","oldString":" /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n const gridLanesSelectors = new Set();\n\n // Check inline styles (look at the raw style attribute)\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n const styleAttr = el.getAttribute('style') || '';\n if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n containers.add(el);\n }\n }\n\n // Check stylesheets - parse raw cssText since browsers reject invalid display values\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n // Extract selector and find matching elements\n if (rule.selectorText) {\n gridLanesSelectors.add(rule.selectorText);\n try {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n // Also check style elements directly for cases where browser strips the property\n const styleElements = document.querySelectorAll('style');\n for (const styleEl of styleElements) {\n const cssText = styleEl.textContent || '';\n const regex = /([^{}]+)\\{[^}]*display\\s*:\\s*grid-lanes[^}]*\\}/gi;\n let match;\n while ((match = regex.exec(cssText)) !== null) {\n const selector = match[1].trim();\n if (selector && !gridLanesSelectors.has(selector)) {\n gridLanesSelectors.add(selector);\n try {\n const elements = document.querySelectorAll(selector);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n\n return containers;\n }","newString":" /**\n * Parse CSS properties from a CSS block text\n */\n function parseCSSProperties(cssBlock) {\n const props = {};\n // Extract property: value pairs\n const propRegex = /([\\w-]+)\\s*:\\s*([^;]+);?/g;\n let match;\n while ((match = propRegex.exec(cssBlock)) !== null) {\n props[match[1].trim()] = match[2].trim();\n }\n return props;\n }\n\n /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n const gridLanesSelectors = new Set();\n\n // Check inline styles (look at the raw style attribute)\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n const styleAttr = el.getAttribute('style') || '';\n if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n containers.add(el);\n // Parse and store inline style properties\n const props = parseCSSProperties(styleAttr);\n if (!parsedGridLanesRules.has(el)) {\n parsedGridLanesRules.set(el, props);\n }\n }\n }\n\n // Check style elements directly and parse raw CSS\n const styleElements = document.querySelectorAll('style');\n for (const styleEl of styleElements) {\n const cssText = styleEl.textContent || '';\n // Match selectors with display: grid-lanes and capture the full block\n const regex = /([^{}]+)\\{([^}]*display\\s*:\\s*grid-lanes[^}]*)\\}/gi;\n let match;\n while ((match = regex.exec(cssText)) !== null) {\n const selectorText = match[1].trim();\n const cssBlock = match[2];\n\n // Handle comma-separated selectors\n const selectors = selectorText.split(',').map(s => s.trim());\n\n for (const selector of selectors) {\n if (!selector) continue;\n gridLanesSelectors.add(selector);\n\n // Parse properties from the CSS block\n const props = parseCSSProperties(cssBlock);\n\n try {\n const elements = document.querySelectorAll(selector);\n for (const el of elements) {\n containers.add(el);\n // Store parsed rules for this element (merge if exists)\n if (parsedGridLanesRules.has(el)) {\n Object.assign(parsedGridLanesRules.get(el), props);\n } else {\n parsedGridLanesRules.set(el, { ...props });\n }\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n\n // Also check stylesheet rules (may work for some browsers)\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n if (rule.selectorText && !gridLanesSelectors.has(rule.selectorText)) {\n gridLanesSelectors.add(rule.selectorText);\n const props = parseCSSProperties(rule.cssText);\n try {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n if (!parsedGridLanesRules.has(el)) {\n parsedGridLanesRules.set(el, props);\n }\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n return containers;\n }","originalFile":"/**\n * CSS Grid Lanes Polyfill\n * \n * Polyfills the new `display: grid-lanes` CSS feature for browsers\n * that don't support it natively. Based on the WebKit implementation\n * described at: https://webkit.org/blog/17660/introducing-css-grid-lanes/\n * \n * Features supported:\n * - display: grid-lanes\n * - grid-template-columns / grid-template-rows for lane definition\n * - gap, column-gap, row-gap\n * - item-tolerance for placement sensitivity\n * - Spanning items (grid-column: span N)\n * - Explicit placement (grid-column: N / M)\n * - Responsive auto-fill/auto-fit with minmax()\n * - Both waterfall (columns) and brick (rows) layouts\n * \n * @version 1.0.0\n * @license MIT\n */\n\n(function(global) {\n 'use strict';\n\n const POLYFILL_NAME = 'GridLanesPolyfill';\n const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n const DEFAULT_TOLERANCE = 16; // ~1em in pixels\n\n // Store parsed CSS rules for grid-lanes containers\n const parsedGridLanesRules = new Map();\n\n /**\n * Check if the browser natively supports display: grid-lanes\n */\n function supportsGridLanes() {\n if (typeof CSS === 'undefined' || !CSS.supports) {\n return false;\n }\n return CSS.supports('display', 'grid-lanes');\n }\n\n /**\n * Parse a CSS length value to pixels\n */\n function parseLengthToPixels(value, containerSize, fontSize = 16, rootFontSize = 16) {\n if (!value || value === 'auto' || value === 'none') return null;\n \n const num = parseFloat(value);\n if (isNaN(num)) return null;\n\n if (value.endsWith('px')) return num;\n if (value.endsWith('rem')) return num * rootFontSize;\n if (value.endsWith('em')) return num * fontSize;\n if (value.endsWith('ch')) return num * fontSize * 0.5; // Approximate\n if (value.endsWith('lh')) return num * fontSize * 1.2; // Approximate line-height\n if (value.endsWith('%')) return (num / 100) * containerSize;\n if (value.endsWith('vw')) return (num / 100) * window.innerWidth;\n if (value.endsWith('vh')) return (num / 100) * window.innerHeight;\n if (value.endsWith('vmin')) return (num / 100) * Math.min(window.innerWidth, window.innerHeight);\n if (value.endsWith('vmax')) return (num / 100) * Math.max(window.innerWidth, window.innerHeight);\n if (value.endsWith('fr')) return null; // Handled separately\n \n // Unitless number treated as pixels\n if (!isNaN(num) && value === String(num)) return num;\n \n return null;\n }\n\n /**\n * Parse minmax() function\n */\n function parseMinMax(value) {\n const match = value.match(/minmax\\(\\s*([^,]+)\\s*,\\s*([^)]+)\\s*\\)/);\n if (!match) return null;\n return {\n min: match[1].trim(),\n max: match[2].trim()\n };\n }\n\n /**\n * Parse repeat() function\n */\n function parseRepeat(value) {\n const match = value.match(/repeat\\(\\s*([^,]+)\\s*,\\s*(.+)\\s*\\)/);\n if (!match) return null;\n return {\n count: match[1].trim(),\n pattern: match[2].trim()\n };\n }\n\n /**\n * Calculate lane sizes from grid-template-columns/rows\n */\n function calculateLaneSizes(template, containerSize, gap, fontSize, rootFontSize) {\n if (!template || template === 'none' || template === 'auto') {\n return null;\n }\n\n const availableSpace = containerSize;\n let lanes = [];\n let totalFr = 0;\n let fixedSpace = 0;\n\n // Parse the template\n const tokens = tokenizeTemplate(template);\n \n for (const token of tokens) {\n // Handle repeat()\n const repeatInfo = parseRepeat(token);\n if (repeatInfo) {\n const { count, pattern } = repeatInfo;\n const patternTokens = tokenizeTemplate(pattern);\n \n if (count === 'auto-fill' || count === 'auto-fit') {\n // Calculate how many repetitions fit\n let minSize = 0;\n let hasFlexible = false;\n \n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n if (minmax.min === 'max-content' || minmax.min === 'min-content') {\n minSize += 100; // Fallback estimate\n } else if (minVal !== null) {\n minSize += minVal;\n }\n if (minmax.max.endsWith('fr')) {\n hasFlexible = true;\n }\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n minSize += size;\n } else if (pt.endsWith('fr')) {\n hasFlexible = true;\n minSize += 100; // Minimum fallback for fr units\n }\n }\n }\n \n // Calculate repetitions\n const patternCount = patternTokens.length;\n const gapCount = patternCount - 1;\n const minPatternSize = minSize + (gapCount * gap);\n \n let reps = Math.max(1, Math.floor((availableSpace + gap) / (minPatternSize + gap)));\n \n // Expand pattern\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr') \n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({\n min: minVal || 0,\n max: maxVal,\n size: 0\n });\n \n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n } else if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize) || 0;\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n } else {\n // Fixed repeat count\n const reps = parseInt(count, 10);\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n }\n continue;\n }\n\n // Handle minmax()\n const minmax = parseMinMax(token);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr')\n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({ min: minVal || 0, max: maxVal, size: 0 });\n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n continue;\n }\n\n // Handle fr units\n if (token.endsWith('fr')) {\n const fr = parseFloat(token);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n continue;\n }\n\n // Handle fixed sizes\n const size = parseLengthToPixels(token, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n\n // Calculate final sizes\n const totalGaps = Math.max(0, lanes.length - 1) * gap;\n const flexSpace = Math.max(0, availableSpace - fixedSpace - totalGaps);\n const frUnit = totalFr > 0 ? flexSpace / totalFr : 0;\n\n for (const lane of lanes) {\n if (typeof lane.max === 'object' && lane.max.fr) {\n lane.size = Math.max(lane.min, frUnit * lane.max.fr);\n } else if (typeof lane.max === 'number') {\n lane.size = Math.min(lane.max, Math.max(lane.min, lane.min));\n } else {\n lane.size = lane.min;\n }\n }\n\n return lanes.map(l => l.size);\n }\n\n /**\n * Tokenize a grid template string\n */\n function tokenizeTemplate(template) {\n const tokens = [];\n let current = '';\n let parenDepth = 0;\n\n for (let i = 0; i < template.length; i++) {\n const char = template[i];\n \n if (char === '(') {\n parenDepth++;\n current += char;\n } else if (char === ')') {\n parenDepth--;\n current += char;\n } else if (char === ' ' && parenDepth === 0) {\n if (current.trim()) {\n tokens.push(current.trim());\n }\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n tokens.push(current.trim());\n }\n\n return tokens;\n }\n\n /**\n * Get computed styles for grid-lanes properties\n */\n function getGridLanesStyles(element) {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n\n // Get gap values\n const gap = computed.gap || computed.gridGap || '0px';\n const columnGap = computed.columnGap || computed.gridColumnGap || gap;\n const rowGap = computed.rowGap || computed.gridRowGap || gap;\n\n // Parse item-tolerance (custom property or default)\n let tolerance = DEFAULT_TOLERANCE;\n const toleranceValue = computed.getPropertyValue('--item-tolerance').trim() ||\n computed.getPropertyValue('item-tolerance').trim();\n if (toleranceValue) {\n const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n if (parsed !== null) tolerance = parsed;\n }\n\n return {\n gridTemplateColumns: computed.gridTemplateColumns,\n gridTemplateRows: computed.gridTemplateRows,\n columnGap: parseLengthToPixels(columnGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n rowGap: parseLengthToPixels(rowGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n fontSize,\n rootFontSize,\n tolerance\n };\n }\n\n /**\n * Get item placement properties\n */\n function getItemStyles(element) {\n const computed = window.getComputedStyle(element);\n const gridColumn = computed.gridColumn || computed.gridColumnStart;\n const gridRow = computed.gridRow || computed.gridRowStart;\n\n let columnSpan = 1;\n let columnStart = null;\n let columnEnd = null;\n let rowSpan = 1;\n let rowStart = null;\n let rowEnd = null;\n\n // Parse grid-column\n if (gridColumn && gridColumn !== 'auto') {\n const spanMatch = gridColumn.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n columnSpan = parseInt(spanMatch[1], 10);\n } else if (gridColumn.includes('/')) {\n const [start, end] = gridColumn.split('/').map(s => s.trim());\n columnStart = parseInt(start, 10);\n columnEnd = parseInt(end, 10);\n if (!isNaN(columnStart) && !isNaN(columnEnd)) {\n columnSpan = Math.abs(columnEnd - columnStart);\n }\n } else {\n const num = parseInt(gridColumn, 10);\n if (!isNaN(num)) {\n columnStart = num;\n }\n }\n }\n\n // Parse grid-row\n if (gridRow && gridRow !== 'auto') {\n const spanMatch = gridRow.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n rowSpan = parseInt(spanMatch[1], 10);\n } else if (gridRow.includes('/')) {\n const [start, end] = gridRow.split('/').map(s => s.trim());\n rowStart = parseInt(start, 10);\n rowEnd = parseInt(end, 10);\n if (!isNaN(rowStart) && !isNaN(rowEnd)) {\n rowSpan = Math.abs(rowEnd - rowStart);\n }\n } else {\n const num = parseInt(gridRow, 10);\n if (!isNaN(num)) {\n rowStart = num;\n }\n }\n }\n\n return {\n columnSpan,\n columnStart,\n columnEnd,\n rowSpan,\n rowStart,\n rowEnd\n };\n }\n\n /**\n * Main Grid Lanes layout class\n */\n class GridLanesLayout {\n constructor(container, options = {}) {\n this.container = container;\n this.options = options;\n this.isVertical = true; // true = waterfall (columns), false = brick (rows)\n this.lanes = [];\n this.laneHeights = [];\n this.resizeObserver = null;\n this.mutationObserver = null;\n \n this.init();\n }\n\n init() {\n // Mark as polyfilled\n this.container.setAttribute(POLYFILL_ATTR, 'true');\n \n // Set up container styles\n this.container.style.position = 'relative';\n this.container.style.display = 'block';\n \n // Initial layout\n this.layout();\n \n // Set up observers\n this.setupObservers();\n }\n\n setupObservers() {\n // Resize observer for responsive layouts\n this.resizeObserver = new ResizeObserver(() => {\n this.layout();\n });\n this.resizeObserver.observe(this.container);\n\n // Mutation observer for dynamic content\n this.mutationObserver = new MutationObserver((mutations) => {\n let shouldRelayout = false;\n for (const mutation of mutations) {\n if (mutation.type === 'childList' || \n (mutation.type === 'attributes' && mutation.attributeName === 'style')) {\n shouldRelayout = true;\n break;\n }\n }\n if (shouldRelayout) {\n this.layout();\n }\n });\n this.mutationObserver.observe(this.container, {\n childList: true,\n subtree: false,\n attributes: true,\n attributeFilter: ['style', 'class']\n });\n }\n\n layout() {\n const styles = getGridLanesStyles(this.container);\n const containerRect = this.container.getBoundingClientRect();\n \n // Determine direction based on which template is defined\n const hasColumns = styles.gridTemplateColumns && \n styles.gridTemplateColumns !== 'none' &&\n !styles.gridTemplateColumns.startsWith('auto');\n const hasRows = styles.gridTemplateRows && \n styles.gridTemplateRows !== 'none' &&\n !styles.gridTemplateRows.startsWith('auto');\n \n this.isVertical = hasColumns || !hasRows;\n \n // Calculate lane sizes\n if (this.isVertical) {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateColumns,\n containerRect.width,\n styles.columnGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.width];\n } else {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateRows,\n containerRect.height,\n styles.rowGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.height];\n }\n\n // Initialize lane positions (heights for vertical, widths for horizontal)\n this.laneHeights = new Array(this.lanes.length).fill(0);\n \n // Get all direct children\n const items = Array.from(this.container.children).filter(\n el => el.nodeType === Node.ELEMENT_NODE && \n window.getComputedStyle(el).display !== 'none'\n );\n\n // Separate explicitly placed items from auto-placed items\n const explicitItems = [];\n const autoItems = [];\n \n for (const item of items) {\n const itemStyles = getItemStyles(item);\n if (this.isVertical && itemStyles.columnStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else if (!this.isVertical && itemStyles.rowStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else {\n autoItems.push({ element: item, styles: itemStyles });\n }\n }\n\n // Place explicitly positioned items first\n for (const { element, styles: itemStyles } of explicitItems) {\n this.placeExplicitItem(element, itemStyles, styles);\n }\n\n // Place auto-positioned items\n for (const { element, styles: itemStyles } of autoItems) {\n this.placeAutoItem(element, itemStyles, styles);\n }\n\n // Set container height\n const containerHeight = Math.max(...this.laneHeights);\n this.container.style.minHeight = `${containerHeight}px`;\n }\n\n placeExplicitItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n \n let laneIndex;\n let span;\n \n if (this.isVertical) {\n // Handle negative indices\n laneIndex = itemStyles.columnStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.columnSpan;\n } else {\n laneIndex = itemStyles.rowStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.rowSpan;\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < laneIndex; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate width (for spanning)\n let size = 0;\n const endLane = Math.min(laneIndex + span, this.lanes.length);\n for (let i = laneIndex; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Get the tallest lane in the span\n let maxHeight = 0;\n for (let i = laneIndex; i < endLane; i++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[i]);\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = maxHeight + (maxHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = laneIndex; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n placeAutoItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n const tolerance = containerStyles.tolerance;\n const span = this.isVertical ? itemStyles.columnSpan : itemStyles.rowSpan;\n\n // Find the best lane(s) considering tolerance\n let bestLane = 0;\n let bestHeight = Infinity;\n\n for (let i = 0; i <= this.lanes.length - span; i++) {\n // Get the max height across the span\n let maxHeight = 0;\n for (let j = i; j < i + span; j++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[j]);\n }\n\n // Use tolerance to determine if this is meaningfully better\n if (bestHeight - maxHeight > tolerance) {\n bestHeight = maxHeight;\n bestLane = i;\n } else if (Math.abs(maxHeight - bestHeight) <= tolerance && i < bestLane) {\n // Within tolerance, prefer earlier lane for reading order\n bestHeight = maxHeight;\n bestLane = i;\n }\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < bestLane; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate size (for spanning)\n let size = 0;\n const endLane = Math.min(bestLane + span, this.lanes.length);\n for (let i = bestLane; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = bestHeight + (bestHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = bestLane; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n destroy() {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n \n this.container.removeAttribute(POLYFILL_ATTR);\n this.container.style.position = '';\n this.container.style.display = '';\n this.container.style.minHeight = '';\n \n // Reset item styles\n for (const item of this.container.children) {\n if (item.nodeType === Node.ELEMENT_NODE) {\n item.style.position = '';\n item.style.left = '';\n item.style.top = '';\n item.style.width = '';\n item.style.height = '';\n }\n }\n }\n\n refresh() {\n this.layout();\n }\n }\n\n /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n const gridLanesSelectors = new Set();\n\n // Check inline styles (look at the raw style attribute)\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n const styleAttr = el.getAttribute('style') || '';\n if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n containers.add(el);\n }\n }\n\n // Check stylesheets - parse raw cssText since browsers reject invalid display values\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n // Extract selector and find matching elements\n if (rule.selectorText) {\n gridLanesSelectors.add(rule.selectorText);\n try {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n // Also check style elements directly for cases where browser strips the property\n const styleElements = document.querySelectorAll('style');\n for (const styleEl of styleElements) {\n const cssText = styleEl.textContent || '';\n const regex = /([^{}]+)\\{[^}]*display\\s*:\\s*grid-lanes[^}]*\\}/gi;\n let match;\n while ((match = regex.exec(cssText)) !== null) {\n const selector = match[1].trim();\n if (selector && !gridLanesSelectors.has(selector)) {\n gridLanesSelectors.add(selector);\n try {\n const elements = document.querySelectorAll(selector);\n for (const el of elements) {\n containers.add(el);\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n\n return containers;\n }\n\n /**\n * Initialize the polyfill\n */\n function init(options = {}) {\n // Check if native support exists\n if (supportsGridLanes() && !options.force) {\n console.log(`${POLYFILL_NAME}: Native support detected, polyfill not needed.`);\n return { supported: true, instances: [] };\n }\n\n const instances = new Map();\n\n // Process existing containers\n const containers = processStyleSheets();\n for (const container of containers) {\n if (!container.hasAttribute(POLYFILL_ATTR)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n\n // Watch for new stylesheets and elements\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n // Check for new style elements\n if (mutation.type === 'childList') {\n for (const node of mutation.addedNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n // Check if the added element is a grid-lanes container\n const style = window.getComputedStyle(node);\n if (node.style.display === 'grid-lanes' || \n style.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(node)) {\n instances.set(node, new GridLanesLayout(node, options));\n }\n }\n \n // Check descendants\n const descendants = node.querySelectorAll('*');\n for (const desc of descendants) {\n const descStyle = window.getComputedStyle(desc);\n if (desc.style.display === 'grid-lanes' ||\n descStyle.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(desc)) {\n instances.set(desc, new GridLanesLayout(desc, options));\n }\n }\n }\n }\n }\n }\n }\n\n // Re-scan stylesheets for new rules\n const newContainers = processStyleSheets();\n for (const container of newContainers) {\n if (!instances.has(container)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true\n });\n\n console.log(`${POLYFILL_NAME}: Initialized, ${instances.size} container(s) found.`);\n\n return {\n supported: false,\n instances,\n observer,\n refresh() {\n for (const instance of instances.values()) {\n instance.refresh();\n }\n },\n destroy() {\n observer.disconnect();\n for (const instance of instances.values()) {\n instance.destroy();\n }\n instances.clear();\n }\n };\n }\n\n /**\n * Apply to a specific element\n */\n function apply(element, options = {}) {\n if (supportsGridLanes() && !options.force) {\n return null;\n }\n return new GridLanesLayout(element, options);\n }\n\n // Export\n const GridLanesPolyfill = {\n supportsGridLanes,\n init,\n apply,\n GridLanesLayout,\n version: '1.0.0'\n };\n\n // AMD\n if (typeof define === 'function' && define.amd) {\n define([], function() { return GridLanesPolyfill; });\n }\n // CommonJS\n else if (typeof module === 'object' && module.exports) {\n module.exports = GridLanesPolyfill;\n }\n // Global\n else {\n global.GridLanesPolyfill = GridLanesPolyfill;\n }\n\n})(typeof globalThis !== 'undefined' ? globalThis : \n typeof window !== 'undefined' ? window : \n typeof global !== 'undefined' ? global : this);\n","structuredPatch":[{"oldStart":680,"oldLines":6,"newStart":680,"newLines":20,"lines":[" }"," "," /**","+ * Parse CSS properties from a CSS block text","+ */","+ function parseCSSProperties(cssBlock) {","+ const props = {};","+ // Extract property: value pairs","+ const propRegex = /([\\w-]+)\\s*:\\s*([^;]+);?/g;","+ let match;","+ while ((match = propRegex.exec(cssBlock)) !== null) {","+ props[match[1].trim()] = match[2].trim();","+ }","+ return props;","+ }","+","+ /**"," * Find and process all grid-lanes containers"," */"," function processStyleSheets() {"]},{"oldStart":692,"oldLines":10,"newStart":706,"newLines":54,"lines":[" const styleAttr = el.getAttribute('style') || '';"," if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {"," containers.add(el);","+ // Parse and store inline style properties","+ const props = parseCSSProperties(styleAttr);","+ if (!parsedGridLanesRules.has(el)) {","+ parsedGridLanesRules.set(el, props);","+ }"," }"," }"," ","- // Check stylesheets - parse raw cssText since browsers reject invalid display values","+ // Check style elements directly and parse raw CSS","+ const styleElements = document.querySelectorAll('style');","+ for (const styleEl of styleElements) {","+ const cssText = styleEl.textContent || '';","+ // Match selectors with display: grid-lanes and capture the full block","+ const regex = /([^{}]+)\\{([^}]*display\\s*:\\s*grid-lanes[^}]*)\\}/gi;","+ let match;","+ while ((match = regex.exec(cssText)) !== null) {","+ const selectorText = match[1].trim();","+ const cssBlock = match[2];","+","+ // Handle comma-separated selectors","+ const selectors = selectorText.split(',').map(s => s.trim());","+","+ for (const selector of selectors) {","+ if (!selector) continue;","+ gridLanesSelectors.add(selector);","+","+ // Parse properties from the CSS block","+ const props = parseCSSProperties(cssBlock);","+","+ try {","+ const elements = document.querySelectorAll(selector);","+ for (const el of elements) {","+ containers.add(el);","+ // Store parsed rules for this element (merge if exists)","+ if (parsedGridLanesRules.has(el)) {","+ Object.assign(parsedGridLanesRules.get(el), props);","+ } else {","+ parsedGridLanesRules.set(el, { ...props });","+ }","+ }","+ } catch (e) {","+ // Invalid selector, skip","+ }","+ }","+ }","+ }","+","+ // Also check stylesheet rules (may work for some browsers)"," for (const sheet of document.styleSheets) {"," try {"," const rules = sheet.cssRules || sheet.rules;"]},{"oldStart":703,"oldLines":13,"newStart":761,"newLines":16,"lines":[" "," for (const rule of rules) {"," if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {","- // Extract selector and find matching elements","- if (rule.selectorText) {","+ if (rule.selectorText && !gridLanesSelectors.has(rule.selectorText)) {"," gridLanesSelectors.add(rule.selectorText);","+ const props = parseCSSProperties(rule.cssText);"," try {"," const elements = document.querySelectorAll(rule.selectorText);"," for (const el of elements) {"," containers.add(el);","+ if (!parsedGridLanesRules.has(el)) {","+ parsedGridLanesRules.set(el, props);","+ }"," }"," } catch (e) {"," // Invalid selector, skip"]},{"oldStart":723,"oldLines":28,"newStart":784,"newLines":6,"lines":[" }"," }"," ","- // Also check style elements directly for cases where browser strips the property","- const styleElements = document.querySelectorAll('style');","- for (const styleEl of styleElements) {","- const cssText = styleEl.textContent || '';","- const regex = /([^{}]+)\\{[^}]*display\\s*:\\s*grid-lanes[^}]*\\}/gi;","- let match;","- while ((match = regex.exec(cssText)) !== null) {","- const selector = match[1].trim();","- if (selector && !gridLanesSelectors.has(selector)) {","- gridLanesSelectors.add(selector);","- try {","- const elements = document.querySelectorAll(selector);","- for (const el of elements) {","- containers.add(el);","- }","- } catch (e) {","- // Invalid selector, skip","- }","- }","- }","- }","-"," return containers;"," }"," "]}],"userModified":false,"replaceAll":false}} | |
| {"parentUuid":"8c45cef0-fca1-42ca-9db4-1c3cf3941e53","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01Jynipxqeor2F7beW9ececp","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Now I need to update the `getGridLanesStyles` function to use the parsed CSS rules instead of (or in addition to) computed styles, since the computed styles won't have the grid-template-columns value for non-grid elements.","signature":"EocDCkYIChgCKkC9OmOEXJN7Oq69V79dX6QtagPh7O3XkLQSYEJNRiftkPOkw37QMDbHcHQQRbH4cvDw0aGEXNsIhlOpFJRz3H7EEgw6cHPU6729Da+tBvUaDOhM/Znp50rxwiIMcyIw2PgYm69aBRzZBy80WB/IH/SWiGL7xiZL1N7shsXVqZNOPKOCZChln3qMikcH5VipKu4BjYaxoajptrAEbZlnlPoyZ9+mZ7MhC8PaY+GDKCHq6ZV5fgeas7nVSu2oy8CDBL5H0zrvs3fRF78IWbCye1x5JUG4I456wQPiuaAx9+oVECOXnpWdfjKF/1LHMz7I1NZOd+oNVxghbgknTzGbTVMoPjMXKsmNW0Iea9OM0hUPZquZ+4iCXD7UoLBZEeRnqQDy2ixJuG9lPr7s79Q3Fc34dfnn6Va40LwwwufP9gV2ueLz50RbPfnoTaLNeBKITS86mSAhcGH048HsgIspw+OjYdIVjhQXo5at6jnFWLQqRzHhobWdivYr4jC4j2BcExgB"}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":3292,"cache_read_input_tokens":45215,"cache_creation":{"ephemeral_5m_input_tokens":3292,"ephemeral_1h_input_tokens":0},"output_tokens":7,"service_tier":"standard"}},"requestId":"req_011CWHRi2fqtWhcv7JKLhN3h","type":"assistant","uuid":"b621fc7a-7247-4e25-b8ab-9b038e5aee14","timestamp":"2025-12-20T05:58:50.478Z"} | |
| {"parentUuid":"b621fc7a-7247-4e25-b8ab-9b038e5aee14","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01Jynipxqeor2F7beW9ececp","type":"message","role":"assistant","content":[{"type":"text","text":"Now I need to update `getGridLanesStyles` to use the parsed CSS rules."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":3292,"cache_read_input_tokens":45215,"cache_creation":{"ephemeral_5m_input_tokens":3292,"ephemeral_1h_input_tokens":0},"output_tokens":7,"service_tier":"standard"}},"requestId":"req_011CWHRi2fqtWhcv7JKLhN3h","type":"assistant","uuid":"78e30731-d233-450f-af97-326ac8dca090","timestamp":"2025-12-20T05:58:50.815Z"} | |
| {"parentUuid":"78e30731-d233-450f-af97-326ac8dca090","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01Jynipxqeor2F7beW9ececp","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01GH8p4S27fTKu1XYrjCqf8q","name":"Edit","input":{"file_path":"/private/tmp/files/grid-lanes-polyfill.js","old_string":" /**\n * Get computed styles for grid-lanes properties\n */\n function getGridLanesStyles(element) {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n\n // Get gap values\n const gap = computed.gap || computed.gridGap || '0px';\n const columnGap = computed.columnGap || computed.gridColumnGap || gap;\n const rowGap = computed.rowGap || computed.gridRowGap || gap;\n\n // Parse item-tolerance (custom property or default)\n let tolerance = DEFAULT_TOLERANCE;\n const toleranceValue = computed.getPropertyValue('--item-tolerance').trim() ||\n computed.getPropertyValue('item-tolerance').trim();\n if (toleranceValue) {\n const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n if (parsed !== null) tolerance = parsed;\n }\n\n return {\n gridTemplateColumns: computed.gridTemplateColumns,\n gridTemplateRows: computed.gridTemplateRows,\n columnGap: parseLengthToPixels(columnGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n rowGap: parseLengthToPixels(rowGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n fontSize,\n rootFontSize,\n tolerance\n };\n }","new_string":" /**\n * Get computed styles for grid-lanes properties\n */\n function getGridLanesStyles(element) {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n\n // Get parsed CSS rules for this element (from raw CSS parsing)\n const parsedRules = parsedGridLanesRules.get(element) || {};\n\n // Get gap values - prefer parsed rules, fall back to computed\n let gap = parsedRules['gap'] || computed.gap || computed.gridGap || '0px';\n let columnGap = parsedRules['column-gap'] || computed.columnGap || computed.gridColumnGap || gap;\n let rowGap = parsedRules['row-gap'] || computed.rowGap || computed.gridRowGap || gap;\n\n // Handle combined gap values like \"24px 16px\"\n if (gap.includes(' ')) {\n const [rg, cg] = gap.split(/\\s+/);\n if (!parsedRules['row-gap']) rowGap = rg;\n if (!parsedRules['column-gap']) columnGap = cg;\n }\n\n // Parse item-tolerance (custom property or default)\n let tolerance = DEFAULT_TOLERANCE;\n const toleranceValue = parsedRules['--item-tolerance'] ||\n computed.getPropertyValue('--item-tolerance').trim() ||\n computed.getPropertyValue('item-tolerance').trim();\n if (toleranceValue) {\n const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n if (parsed !== null) tolerance = parsed;\n }\n\n // Get grid template - prefer parsed rules since computed styles won't work for non-grid elements\n const gridTemplateColumns = parsedRules['grid-template-columns'] || computed.gridTemplateColumns;\n const gridTemplateRows = parsedRules['grid-template-rows'] || computed.gridTemplateRows;\n\n return {\n gridTemplateColumns,\n gridTemplateRows,\n columnGap: parseLengthToPixels(String(columnGap).split(' ')[0], 0, fontSize, rootFontSize) || 0,\n rowGap: parseLengthToPixels(String(rowGap).split(' ')[0], 0, fontSize, rootFontSize) || 0,\n fontSize,\n rootFontSize,\n tolerance\n };\n }"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":3292,"cache_read_input_tokens":45215,"cache_creation":{"ephemeral_5m_input_tokens":3292,"ephemeral_1h_input_tokens":0},"output_tokens":1223,"service_tier":"standard"}},"requestId":"req_011CWHRi2fqtWhcv7JKLhN3h","type":"assistant","uuid":"d56ec1ca-bdf7-4af9-8cb2-91f15992fbb4","timestamp":"2025-12-20T05:59:02.346Z"} | |
| {"parentUuid":"d56ec1ca-bdf7-4af9-8cb2-91f15992fbb4","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01GH8p4S27fTKu1XYrjCqf8q","type":"tool_result","content":"The file /private/tmp/files/grid-lanes-polyfill.js has been updated. Here's the result of running `cat -n` on a snippet of the edited file:\n 282→\n 283→ return tokens;\n 284→ }\n 285→\n 286→ /**\n 287→ * Get computed styles for grid-lanes properties\n 288→ */\n 289→ function getGridLanesStyles(element) {\n 290→ const computed = window.getComputedStyle(element);\n 291→ const fontSize = parseFloat(computed.fontSize) || 16;\n 292→ const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n 293→\n 294→ // Get parsed CSS rules for this element (from raw CSS parsing)\n 295→ const parsedRules = parsedGridLanesRules.get(element) || {};\n 296→\n 297→ // Get gap values - prefer parsed rules, fall back to computed\n 298→ let gap = parsedRules['gap'] || computed.gap || computed.gridGap || '0px';\n 299→ let columnGap = parsedRules['column-gap'] || computed.columnGap || computed.gridColumnGap || gap;\n 300→ let rowGap = parsedRules['row-gap'] || computed.rowGap || computed.gridRowGap || gap;\n 301→\n 302→ // Handle combined gap values like \"24px 16px\"\n 303→ if (gap.includes(' ')) {\n 304→ const [rg, cg] = gap.split(/\\s+/);\n 305→ if (!parsedRules['row-gap']) rowGap = rg;\n 306→ if (!parsedRules['column-gap']) columnGap = cg;\n 307→ }\n 308→\n 309→ // Parse item-tolerance (custom property or default)\n 310→ let tolerance = DEFAULT_TOLERANCE;\n 311→ const toleranceValue = parsedRules['--item-tolerance'] ||\n 312→ computed.getPropertyValue('--item-tolerance').trim() ||\n 313→ computed.getPropertyValue('item-tolerance').trim();\n 314→ if (toleranceValue) {\n 315→ const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n 316→ if (parsed !== null) tolerance = parsed;\n 317→ }\n 318→\n 319→ // Get grid template - prefer parsed rules since computed styles won't work for non-grid elements\n 320→ const gridTemplateColumns = parsedRules['grid-template-columns'] || computed.gridTemplateColumns;\n 321→ const gridTemplateRows = parsedRules['grid-template-rows'] || computed.gridTemplateRows;\n 322→\n 323→ return {\n 324→ gridTemplateColumns,\n 325→ gridTemplateRows,\n 326→ columnGap: parseLengthToPixels(String(columnGap).split(' ')[0], 0, fontSize, rootFontSize) || 0,\n 327→ rowGap: parseLengthToPixels(String(rowGap).split(' ')[0], 0, fontSize, rootFontSize) || 0,\n 328→ fontSize,\n 329→ rootFontSize,\n 330→ tolerance\n 331→ };\n 332→ }\n 333→\n 334→ /**\n 335→ * Get item placement properties\n 336→ */"}]},"uuid":"fe591701-eab5-4d72-addd-8b06d250f3b4","timestamp":"2025-12-20T05:59:02.382Z","toolUseResult":{"filePath":"/private/tmp/files/grid-lanes-polyfill.js","oldString":" /**\n * Get computed styles for grid-lanes properties\n */\n function getGridLanesStyles(element) {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n\n // Get gap values\n const gap = computed.gap || computed.gridGap || '0px';\n const columnGap = computed.columnGap || computed.gridColumnGap || gap;\n const rowGap = computed.rowGap || computed.gridRowGap || gap;\n\n // Parse item-tolerance (custom property or default)\n let tolerance = DEFAULT_TOLERANCE;\n const toleranceValue = computed.getPropertyValue('--item-tolerance').trim() ||\n computed.getPropertyValue('item-tolerance').trim();\n if (toleranceValue) {\n const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n if (parsed !== null) tolerance = parsed;\n }\n\n return {\n gridTemplateColumns: computed.gridTemplateColumns,\n gridTemplateRows: computed.gridTemplateRows,\n columnGap: parseLengthToPixels(columnGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n rowGap: parseLengthToPixels(rowGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n fontSize,\n rootFontSize,\n tolerance\n };\n }","newString":" /**\n * Get computed styles for grid-lanes properties\n */\n function getGridLanesStyles(element) {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n\n // Get parsed CSS rules for this element (from raw CSS parsing)\n const parsedRules = parsedGridLanesRules.get(element) || {};\n\n // Get gap values - prefer parsed rules, fall back to computed\n let gap = parsedRules['gap'] || computed.gap || computed.gridGap || '0px';\n let columnGap = parsedRules['column-gap'] || computed.columnGap || computed.gridColumnGap || gap;\n let rowGap = parsedRules['row-gap'] || computed.rowGap || computed.gridRowGap || gap;\n\n // Handle combined gap values like \"24px 16px\"\n if (gap.includes(' ')) {\n const [rg, cg] = gap.split(/\\s+/);\n if (!parsedRules['row-gap']) rowGap = rg;\n if (!parsedRules['column-gap']) columnGap = cg;\n }\n\n // Parse item-tolerance (custom property or default)\n let tolerance = DEFAULT_TOLERANCE;\n const toleranceValue = parsedRules['--item-tolerance'] ||\n computed.getPropertyValue('--item-tolerance').trim() ||\n computed.getPropertyValue('item-tolerance').trim();\n if (toleranceValue) {\n const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n if (parsed !== null) tolerance = parsed;\n }\n\n // Get grid template - prefer parsed rules since computed styles won't work for non-grid elements\n const gridTemplateColumns = parsedRules['grid-template-columns'] || computed.gridTemplateColumns;\n const gridTemplateRows = parsedRules['grid-template-rows'] || computed.gridTemplateRows;\n\n return {\n gridTemplateColumns,\n gridTemplateRows,\n columnGap: parseLengthToPixels(String(columnGap).split(' ')[0], 0, fontSize, rootFontSize) || 0,\n rowGap: parseLengthToPixels(String(rowGap).split(' ')[0], 0, fontSize, rootFontSize) || 0,\n fontSize,\n rootFontSize,\n tolerance\n };\n }","originalFile":"/**\n * CSS Grid Lanes Polyfill\n * \n * Polyfills the new `display: grid-lanes` CSS feature for browsers\n * that don't support it natively. Based on the WebKit implementation\n * described at: https://webkit.org/blog/17660/introducing-css-grid-lanes/\n * \n * Features supported:\n * - display: grid-lanes\n * - grid-template-columns / grid-template-rows for lane definition\n * - gap, column-gap, row-gap\n * - item-tolerance for placement sensitivity\n * - Spanning items (grid-column: span N)\n * - Explicit placement (grid-column: N / M)\n * - Responsive auto-fill/auto-fit with minmax()\n * - Both waterfall (columns) and brick (rows) layouts\n * \n * @version 1.0.0\n * @license MIT\n */\n\n(function(global) {\n 'use strict';\n\n const POLYFILL_NAME = 'GridLanesPolyfill';\n const POLYFILL_ATTR = 'data-grid-lanes-polyfilled';\n const DEFAULT_TOLERANCE = 16; // ~1em in pixels\n\n // Store parsed CSS rules for grid-lanes containers\n const parsedGridLanesRules = new Map();\n\n /**\n * Check if the browser natively supports display: grid-lanes\n */\n function supportsGridLanes() {\n if (typeof CSS === 'undefined' || !CSS.supports) {\n return false;\n }\n return CSS.supports('display', 'grid-lanes');\n }\n\n /**\n * Parse a CSS length value to pixels\n */\n function parseLengthToPixels(value, containerSize, fontSize = 16, rootFontSize = 16) {\n if (!value || value === 'auto' || value === 'none') return null;\n \n const num = parseFloat(value);\n if (isNaN(num)) return null;\n\n if (value.endsWith('px')) return num;\n if (value.endsWith('rem')) return num * rootFontSize;\n if (value.endsWith('em')) return num * fontSize;\n if (value.endsWith('ch')) return num * fontSize * 0.5; // Approximate\n if (value.endsWith('lh')) return num * fontSize * 1.2; // Approximate line-height\n if (value.endsWith('%')) return (num / 100) * containerSize;\n if (value.endsWith('vw')) return (num / 100) * window.innerWidth;\n if (value.endsWith('vh')) return (num / 100) * window.innerHeight;\n if (value.endsWith('vmin')) return (num / 100) * Math.min(window.innerWidth, window.innerHeight);\n if (value.endsWith('vmax')) return (num / 100) * Math.max(window.innerWidth, window.innerHeight);\n if (value.endsWith('fr')) return null; // Handled separately\n \n // Unitless number treated as pixels\n if (!isNaN(num) && value === String(num)) return num;\n \n return null;\n }\n\n /**\n * Parse minmax() function\n */\n function parseMinMax(value) {\n const match = value.match(/minmax\\(\\s*([^,]+)\\s*,\\s*([^)]+)\\s*\\)/);\n if (!match) return null;\n return {\n min: match[1].trim(),\n max: match[2].trim()\n };\n }\n\n /**\n * Parse repeat() function\n */\n function parseRepeat(value) {\n const match = value.match(/repeat\\(\\s*([^,]+)\\s*,\\s*(.+)\\s*\\)/);\n if (!match) return null;\n return {\n count: match[1].trim(),\n pattern: match[2].trim()\n };\n }\n\n /**\n * Calculate lane sizes from grid-template-columns/rows\n */\n function calculateLaneSizes(template, containerSize, gap, fontSize, rootFontSize) {\n if (!template || template === 'none' || template === 'auto') {\n return null;\n }\n\n const availableSpace = containerSize;\n let lanes = [];\n let totalFr = 0;\n let fixedSpace = 0;\n\n // Parse the template\n const tokens = tokenizeTemplate(template);\n \n for (const token of tokens) {\n // Handle repeat()\n const repeatInfo = parseRepeat(token);\n if (repeatInfo) {\n const { count, pattern } = repeatInfo;\n const patternTokens = tokenizeTemplate(pattern);\n \n if (count === 'auto-fill' || count === 'auto-fit') {\n // Calculate how many repetitions fit\n let minSize = 0;\n let hasFlexible = false;\n \n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n if (minmax.min === 'max-content' || minmax.min === 'min-content') {\n minSize += 100; // Fallback estimate\n } else if (minVal !== null) {\n minSize += minVal;\n }\n if (minmax.max.endsWith('fr')) {\n hasFlexible = true;\n }\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n minSize += size;\n } else if (pt.endsWith('fr')) {\n hasFlexible = true;\n minSize += 100; // Minimum fallback for fr units\n }\n }\n }\n \n // Calculate repetitions\n const patternCount = patternTokens.length;\n const gapCount = patternCount - 1;\n const minPatternSize = minSize + (gapCount * gap);\n \n let reps = Math.max(1, Math.floor((availableSpace + gap) / (minPatternSize + gap)));\n \n // Expand pattern\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const minmax = parseMinMax(pt);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr') \n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({\n min: minVal || 0,\n max: maxVal,\n size: 0\n });\n \n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n } else if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize) || 0;\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n } else {\n // Fixed repeat count\n const reps = parseInt(count, 10);\n for (let i = 0; i < reps; i++) {\n for (const pt of patternTokens) {\n const size = parseLengthToPixels(pt, containerSize, fontSize, rootFontSize);\n if (pt.endsWith('fr')) {\n const fr = parseFloat(pt);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n } else if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n }\n }\n continue;\n }\n\n // Handle minmax()\n const minmax = parseMinMax(token);\n if (minmax) {\n const minVal = parseLengthToPixels(minmax.min, containerSize, fontSize, rootFontSize);\n const maxVal = minmax.max.endsWith('fr')\n ? { fr: parseFloat(minmax.max) }\n : parseLengthToPixels(minmax.max, containerSize, fontSize, rootFontSize);\n \n lanes.push({ min: minVal || 0, max: maxVal, size: 0 });\n if (typeof maxVal === 'object' && maxVal.fr) {\n totalFr += maxVal.fr;\n }\n fixedSpace += minVal || 0;\n continue;\n }\n\n // Handle fr units\n if (token.endsWith('fr')) {\n const fr = parseFloat(token);\n lanes.push({ min: 0, max: { fr }, size: 0 });\n totalFr += fr;\n continue;\n }\n\n // Handle fixed sizes\n const size = parseLengthToPixels(token, containerSize, fontSize, rootFontSize);\n if (size !== null) {\n lanes.push({ min: size, max: size, size });\n fixedSpace += size;\n }\n }\n\n // Calculate final sizes\n const totalGaps = Math.max(0, lanes.length - 1) * gap;\n const flexSpace = Math.max(0, availableSpace - fixedSpace - totalGaps);\n const frUnit = totalFr > 0 ? flexSpace / totalFr : 0;\n\n for (const lane of lanes) {\n if (typeof lane.max === 'object' && lane.max.fr) {\n lane.size = Math.max(lane.min, frUnit * lane.max.fr);\n } else if (typeof lane.max === 'number') {\n lane.size = Math.min(lane.max, Math.max(lane.min, lane.min));\n } else {\n lane.size = lane.min;\n }\n }\n\n return lanes.map(l => l.size);\n }\n\n /**\n * Tokenize a grid template string\n */\n function tokenizeTemplate(template) {\n const tokens = [];\n let current = '';\n let parenDepth = 0;\n\n for (let i = 0; i < template.length; i++) {\n const char = template[i];\n \n if (char === '(') {\n parenDepth++;\n current += char;\n } else if (char === ')') {\n parenDepth--;\n current += char;\n } else if (char === ' ' && parenDepth === 0) {\n if (current.trim()) {\n tokens.push(current.trim());\n }\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n tokens.push(current.trim());\n }\n\n return tokens;\n }\n\n /**\n * Get computed styles for grid-lanes properties\n */\n function getGridLanesStyles(element) {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;\n\n // Get gap values\n const gap = computed.gap || computed.gridGap || '0px';\n const columnGap = computed.columnGap || computed.gridColumnGap || gap;\n const rowGap = computed.rowGap || computed.gridRowGap || gap;\n\n // Parse item-tolerance (custom property or default)\n let tolerance = DEFAULT_TOLERANCE;\n const toleranceValue = computed.getPropertyValue('--item-tolerance').trim() ||\n computed.getPropertyValue('item-tolerance').trim();\n if (toleranceValue) {\n const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);\n if (parsed !== null) tolerance = parsed;\n }\n\n return {\n gridTemplateColumns: computed.gridTemplateColumns,\n gridTemplateRows: computed.gridTemplateRows,\n columnGap: parseLengthToPixels(columnGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n rowGap: parseLengthToPixels(rowGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,\n fontSize,\n rootFontSize,\n tolerance\n };\n }\n\n /**\n * Get item placement properties\n */\n function getItemStyles(element) {\n const computed = window.getComputedStyle(element);\n const gridColumn = computed.gridColumn || computed.gridColumnStart;\n const gridRow = computed.gridRow || computed.gridRowStart;\n\n let columnSpan = 1;\n let columnStart = null;\n let columnEnd = null;\n let rowSpan = 1;\n let rowStart = null;\n let rowEnd = null;\n\n // Parse grid-column\n if (gridColumn && gridColumn !== 'auto') {\n const spanMatch = gridColumn.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n columnSpan = parseInt(spanMatch[1], 10);\n } else if (gridColumn.includes('/')) {\n const [start, end] = gridColumn.split('/').map(s => s.trim());\n columnStart = parseInt(start, 10);\n columnEnd = parseInt(end, 10);\n if (!isNaN(columnStart) && !isNaN(columnEnd)) {\n columnSpan = Math.abs(columnEnd - columnStart);\n }\n } else {\n const num = parseInt(gridColumn, 10);\n if (!isNaN(num)) {\n columnStart = num;\n }\n }\n }\n\n // Parse grid-row\n if (gridRow && gridRow !== 'auto') {\n const spanMatch = gridRow.match(/span\\s+(\\d+)/);\n if (spanMatch) {\n rowSpan = parseInt(spanMatch[1], 10);\n } else if (gridRow.includes('/')) {\n const [start, end] = gridRow.split('/').map(s => s.trim());\n rowStart = parseInt(start, 10);\n rowEnd = parseInt(end, 10);\n if (!isNaN(rowStart) && !isNaN(rowEnd)) {\n rowSpan = Math.abs(rowEnd - rowStart);\n }\n } else {\n const num = parseInt(gridRow, 10);\n if (!isNaN(num)) {\n rowStart = num;\n }\n }\n }\n\n return {\n columnSpan,\n columnStart,\n columnEnd,\n rowSpan,\n rowStart,\n rowEnd\n };\n }\n\n /**\n * Main Grid Lanes layout class\n */\n class GridLanesLayout {\n constructor(container, options = {}) {\n this.container = container;\n this.options = options;\n this.isVertical = true; // true = waterfall (columns), false = brick (rows)\n this.lanes = [];\n this.laneHeights = [];\n this.resizeObserver = null;\n this.mutationObserver = null;\n \n this.init();\n }\n\n init() {\n // Mark as polyfilled\n this.container.setAttribute(POLYFILL_ATTR, 'true');\n \n // Set up container styles\n this.container.style.position = 'relative';\n this.container.style.display = 'block';\n \n // Initial layout\n this.layout();\n \n // Set up observers\n this.setupObservers();\n }\n\n setupObservers() {\n // Resize observer for responsive layouts\n this.resizeObserver = new ResizeObserver(() => {\n this.layout();\n });\n this.resizeObserver.observe(this.container);\n\n // Mutation observer for dynamic content\n this.mutationObserver = new MutationObserver((mutations) => {\n let shouldRelayout = false;\n for (const mutation of mutations) {\n if (mutation.type === 'childList' || \n (mutation.type === 'attributes' && mutation.attributeName === 'style')) {\n shouldRelayout = true;\n break;\n }\n }\n if (shouldRelayout) {\n this.layout();\n }\n });\n this.mutationObserver.observe(this.container, {\n childList: true,\n subtree: false,\n attributes: true,\n attributeFilter: ['style', 'class']\n });\n }\n\n layout() {\n const styles = getGridLanesStyles(this.container);\n const containerRect = this.container.getBoundingClientRect();\n \n // Determine direction based on which template is defined\n const hasColumns = styles.gridTemplateColumns && \n styles.gridTemplateColumns !== 'none' &&\n !styles.gridTemplateColumns.startsWith('auto');\n const hasRows = styles.gridTemplateRows && \n styles.gridTemplateRows !== 'none' &&\n !styles.gridTemplateRows.startsWith('auto');\n \n this.isVertical = hasColumns || !hasRows;\n \n // Calculate lane sizes\n if (this.isVertical) {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateColumns,\n containerRect.width,\n styles.columnGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.width];\n } else {\n this.lanes = calculateLaneSizes(\n styles.gridTemplateRows,\n containerRect.height,\n styles.rowGap,\n styles.fontSize,\n styles.rootFontSize\n ) || [containerRect.height];\n }\n\n // Initialize lane positions (heights for vertical, widths for horizontal)\n this.laneHeights = new Array(this.lanes.length).fill(0);\n \n // Get all direct children\n const items = Array.from(this.container.children).filter(\n el => el.nodeType === Node.ELEMENT_NODE && \n window.getComputedStyle(el).display !== 'none'\n );\n\n // Separate explicitly placed items from auto-placed items\n const explicitItems = [];\n const autoItems = [];\n \n for (const item of items) {\n const itemStyles = getItemStyles(item);\n if (this.isVertical && itemStyles.columnStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else if (!this.isVertical && itemStyles.rowStart !== null) {\n explicitItems.push({ element: item, styles: itemStyles });\n } else {\n autoItems.push({ element: item, styles: itemStyles });\n }\n }\n\n // Place explicitly positioned items first\n for (const { element, styles: itemStyles } of explicitItems) {\n this.placeExplicitItem(element, itemStyles, styles);\n }\n\n // Place auto-positioned items\n for (const { element, styles: itemStyles } of autoItems) {\n this.placeAutoItem(element, itemStyles, styles);\n }\n\n // Set container height\n const containerHeight = Math.max(...this.laneHeights);\n this.container.style.minHeight = `${containerHeight}px`;\n }\n\n placeExplicitItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n \n let laneIndex;\n let span;\n \n if (this.isVertical) {\n // Handle negative indices\n laneIndex = itemStyles.columnStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.columnSpan;\n } else {\n laneIndex = itemStyles.rowStart;\n if (laneIndex < 0) {\n laneIndex = this.lanes.length + laneIndex + 1;\n }\n laneIndex = Math.max(0, Math.min(laneIndex - 1, this.lanes.length - 1));\n span = itemStyles.rowSpan;\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < laneIndex; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate width (for spanning)\n let size = 0;\n const endLane = Math.min(laneIndex + span, this.lanes.length);\n for (let i = laneIndex; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Get the tallest lane in the span\n let maxHeight = 0;\n for (let i = laneIndex; i < endLane; i++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[i]);\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${maxHeight > 0 ? maxHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = maxHeight + (maxHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = laneIndex; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n placeAutoItem(element, itemStyles, containerStyles) {\n const gap = this.isVertical ? containerStyles.columnGap : containerStyles.rowGap;\n const crossGap = this.isVertical ? containerStyles.rowGap : containerStyles.columnGap;\n const tolerance = containerStyles.tolerance;\n const span = this.isVertical ? itemStyles.columnSpan : itemStyles.rowSpan;\n\n // Find the best lane(s) considering tolerance\n let bestLane = 0;\n let bestHeight = Infinity;\n\n for (let i = 0; i <= this.lanes.length - span; i++) {\n // Get the max height across the span\n let maxHeight = 0;\n for (let j = i; j < i + span; j++) {\n maxHeight = Math.max(maxHeight, this.laneHeights[j]);\n }\n\n // Use tolerance to determine if this is meaningfully better\n if (bestHeight - maxHeight > tolerance) {\n bestHeight = maxHeight;\n bestLane = i;\n } else if (Math.abs(maxHeight - bestHeight) <= tolerance && i < bestLane) {\n // Within tolerance, prefer earlier lane for reading order\n bestHeight = maxHeight;\n bestLane = i;\n }\n }\n\n // Calculate position\n let position = 0;\n for (let i = 0; i < bestLane; i++) {\n position += this.lanes[i] + gap;\n }\n\n // Calculate size (for spanning)\n let size = 0;\n const endLane = Math.min(bestLane + span, this.lanes.length);\n for (let i = bestLane; i < endLane; i++) {\n size += this.lanes[i];\n if (i < endLane - 1) size += gap;\n }\n\n // Position the element\n element.style.position = 'absolute';\n \n if (this.isVertical) {\n element.style.left = `${position}px`;\n element.style.top = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.width = `${size}px`;\n element.style.height = '';\n } else {\n element.style.top = `${position}px`;\n element.style.left = `${bestHeight > 0 ? bestHeight + crossGap : 0}px`;\n element.style.height = `${size}px`;\n element.style.width = '';\n }\n\n // Update lane heights\n const itemRect = element.getBoundingClientRect();\n const itemSize = this.isVertical ? itemRect.height : itemRect.width;\n const newHeight = bestHeight + (bestHeight > 0 ? crossGap : 0) + itemSize;\n \n for (let i = bestLane; i < endLane; i++) {\n this.laneHeights[i] = newHeight;\n }\n }\n\n destroy() {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n }\n \n this.container.removeAttribute(POLYFILL_ATTR);\n this.container.style.position = '';\n this.container.style.display = '';\n this.container.style.minHeight = '';\n \n // Reset item styles\n for (const item of this.container.children) {\n if (item.nodeType === Node.ELEMENT_NODE) {\n item.style.position = '';\n item.style.left = '';\n item.style.top = '';\n item.style.width = '';\n item.style.height = '';\n }\n }\n }\n\n refresh() {\n this.layout();\n }\n }\n\n /**\n * Parse CSS properties from a CSS block text\n */\n function parseCSSProperties(cssBlock) {\n const props = {};\n // Extract property: value pairs\n const propRegex = /([\\w-]+)\\s*:\\s*([^;]+);?/g;\n let match;\n while ((match = propRegex.exec(cssBlock)) !== null) {\n props[match[1].trim()] = match[2].trim();\n }\n return props;\n }\n\n /**\n * Find and process all grid-lanes containers\n */\n function processStyleSheets() {\n const containers = new Set();\n const gridLanesSelectors = new Set();\n\n // Check inline styles (look at the raw style attribute)\n const allElements = document.querySelectorAll('[style*=\"grid-lanes\"]');\n for (const el of allElements) {\n const styleAttr = el.getAttribute('style') || '';\n if (/display\\s*:\\s*grid-lanes/i.test(styleAttr)) {\n containers.add(el);\n // Parse and store inline style properties\n const props = parseCSSProperties(styleAttr);\n if (!parsedGridLanesRules.has(el)) {\n parsedGridLanesRules.set(el, props);\n }\n }\n }\n\n // Check style elements directly and parse raw CSS\n const styleElements = document.querySelectorAll('style');\n for (const styleEl of styleElements) {\n const cssText = styleEl.textContent || '';\n // Match selectors with display: grid-lanes and capture the full block\n const regex = /([^{}]+)\\{([^}]*display\\s*:\\s*grid-lanes[^}]*)\\}/gi;\n let match;\n while ((match = regex.exec(cssText)) !== null) {\n const selectorText = match[1].trim();\n const cssBlock = match[2];\n\n // Handle comma-separated selectors\n const selectors = selectorText.split(',').map(s => s.trim());\n\n for (const selector of selectors) {\n if (!selector) continue;\n gridLanesSelectors.add(selector);\n\n // Parse properties from the CSS block\n const props = parseCSSProperties(cssBlock);\n\n try {\n const elements = document.querySelectorAll(selector);\n for (const el of elements) {\n containers.add(el);\n // Store parsed rules for this element (merge if exists)\n if (parsedGridLanesRules.has(el)) {\n Object.assign(parsedGridLanesRules.get(el), props);\n } else {\n parsedGridLanesRules.set(el, { ...props });\n }\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n\n // Also check stylesheet rules (may work for some browsers)\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (!rules) continue;\n\n for (const rule of rules) {\n if (rule.cssText && /display\\s*:\\s*grid-lanes/i.test(rule.cssText)) {\n if (rule.selectorText && !gridLanesSelectors.has(rule.selectorText)) {\n gridLanesSelectors.add(rule.selectorText);\n const props = parseCSSProperties(rule.cssText);\n try {\n const elements = document.querySelectorAll(rule.selectorText);\n for (const el of elements) {\n containers.add(el);\n if (!parsedGridLanesRules.has(el)) {\n parsedGridLanesRules.set(el, props);\n }\n }\n } catch (e) {\n // Invalid selector, skip\n }\n }\n }\n }\n } catch (e) {\n // Cross-origin stylesheets will throw\n console.warn(`${POLYFILL_NAME}: Could not access stylesheet:`, e);\n }\n }\n\n return containers;\n }\n\n /**\n * Initialize the polyfill\n */\n function init(options = {}) {\n // Check if native support exists\n if (supportsGridLanes() && !options.force) {\n console.log(`${POLYFILL_NAME}: Native support detected, polyfill not needed.`);\n return { supported: true, instances: [] };\n }\n\n const instances = new Map();\n\n // Process existing containers\n const containers = processStyleSheets();\n for (const container of containers) {\n if (!container.hasAttribute(POLYFILL_ATTR)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n\n // Watch for new stylesheets and elements\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n // Check for new style elements\n if (mutation.type === 'childList') {\n for (const node of mutation.addedNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n // Check if the added element is a grid-lanes container\n const style = window.getComputedStyle(node);\n if (node.style.display === 'grid-lanes' || \n style.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(node)) {\n instances.set(node, new GridLanesLayout(node, options));\n }\n }\n \n // Check descendants\n const descendants = node.querySelectorAll('*');\n for (const desc of descendants) {\n const descStyle = window.getComputedStyle(desc);\n if (desc.style.display === 'grid-lanes' ||\n descStyle.getPropertyValue('display') === 'grid-lanes') {\n if (!instances.has(desc)) {\n instances.set(desc, new GridLanesLayout(desc, options));\n }\n }\n }\n }\n }\n }\n }\n\n // Re-scan stylesheets for new rules\n const newContainers = processStyleSheets();\n for (const container of newContainers) {\n if (!instances.has(container)) {\n instances.set(container, new GridLanesLayout(container, options));\n }\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true\n });\n\n console.log(`${POLYFILL_NAME}: Initialized, ${instances.size} container(s) found.`);\n\n return {\n supported: false,\n instances,\n observer,\n refresh() {\n for (const instance of instances.values()) {\n instance.refresh();\n }\n },\n destroy() {\n observer.disconnect();\n for (const instance of instances.values()) {\n instance.destroy();\n }\n instances.clear();\n }\n };\n }\n\n /**\n * Apply to a specific element\n */\n function apply(element, options = {}) {\n if (supportsGridLanes() && !options.force) {\n return null;\n }\n return new GridLanesLayout(element, options);\n }\n\n // Export\n const GridLanesPolyfill = {\n supportsGridLanes,\n init,\n apply,\n GridLanesLayout,\n version: '1.0.0'\n };\n\n // AMD\n if (typeof define === 'function' && define.amd) {\n define([], function() { return GridLanesPolyfill; });\n }\n // CommonJS\n else if (typeof module === 'object' && module.exports) {\n module.exports = GridLanesPolyfill;\n }\n // Global\n else {\n global.GridLanesPolyfill = GridLanesPolyfill;\n }\n\n})(typeof globalThis !== 'undefined' ? globalThis : \n typeof window !== 'undefined' ? window : \n typeof global !== 'undefined' ? global : this);\n","structuredPatch":[{"oldStart":291,"oldLines":25,"newStart":291,"newLines":40,"lines":[" const fontSize = parseFloat(computed.fontSize) || 16;"," const rootFontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16;"," ","- // Get gap values","- const gap = computed.gap || computed.gridGap || '0px';","- const columnGap = computed.columnGap || computed.gridColumnGap || gap;","- const rowGap = computed.rowGap || computed.gridRowGap || gap;","+ // Get parsed CSS rules for this element (from raw CSS parsing)","+ const parsedRules = parsedGridLanesRules.get(element) || {};"," ","+ // Get gap values - prefer parsed rules, fall back to computed","+ let gap = parsedRules['gap'] || computed.gap || computed.gridGap || '0px';","+ let columnGap = parsedRules['column-gap'] || computed.columnGap || computed.gridColumnGap || gap;","+ let rowGap = parsedRules['row-gap'] || computed.rowGap || computed.gridRowGap || gap;","+","+ // Handle combined gap values like \"24px 16px\"","+ if (gap.includes(' ')) {","+ const [rg, cg] = gap.split(/\\s+/);","+ if (!parsedRules['row-gap']) rowGap = rg;","+ if (!parsedRules['column-gap']) columnGap = cg;","+ }","+"," // Parse item-tolerance (custom property or default)"," let tolerance = DEFAULT_TOLERANCE;","- const toleranceValue = computed.getPropertyValue('--item-tolerance').trim() ||","+ const toleranceValue = parsedRules['--item-tolerance'] ||","+ computed.getPropertyValue('--item-tolerance').trim() ||"," computed.getPropertyValue('item-tolerance').trim();"," if (toleranceValue) {"," const parsed = parseLengthToPixels(toleranceValue, 0, fontSize, rootFontSize);"," if (parsed !== null) tolerance = parsed;"," }"," ","+ // Get grid template - prefer parsed rules since computed styles won't work for non-grid elements","+ const gridTemplateColumns = parsedRules['grid-template-columns'] || computed.gridTemplateColumns;","+ const gridTemplateRows = parsedRules['grid-template-rows'] || computed.gridTemplateRows;","+"," return {","- gridTemplateColumns: computed.gridTemplateColumns,","- gridTemplateRows: computed.gridTemplateRows,","- columnGap: parseLengthToPixels(columnGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,","- rowGap: parseLengthToPixels(rowGap.split(' ')[0], 0, fontSize, rootFontSize) || 0,","+ gridTemplateColumns,","+ gridTemplateRows,","+ columnGap: parseLengthToPixels(String(columnGap).split(' ')[0], 0, fontSize, rootFontSize) || 0,","+ rowGap: parseLengthToPixels(String(rowGap).split(' ')[0], 0, fontSize, rootFontSize) || 0,"," fontSize,"," rootFontSize,"," tolerance"]}],"userModified":false,"replaceAll":false}} | |
| {"parentUuid":"fe591701-eab5-4d72-addd-8b06d250f3b4","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01P7PukCC2uiQQqCs85L5AFt","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Good progress! Now let me take a new screenshot to test the fix. Let me update the todo list and take a new screenshot.","signature":"EqACCkYIChgCKkAItSK9mMEUyHT7p2Ov1zqkG3uDVHwtjQ/BiNc3HgODuSSRITDGW+s+p7LazBberddCUjLIPo95SrJMRoRvCSBsEgxXP5HVfCHN5CBYw5saDPJnAn5OvmARwn9/lyIwF2O0ukvSZdiapR9rQ5HurjV3OSBfDealuFyo11FcoRHmPgx/jJQbEDxZtG1Xxw3RKocB6+kH3h87S2tmDw3mqG4g0m1xgF5pEcXOFdgC6oBEnJSb7jygklp8Jn03kSNfk+n1vEuHPPbSOSZvBbj7v9C/bODmoUFsruO47cTakfcmsNB8iKIPHwScU2luAv0+O6vwtlfL1jpBC/7j7+gAvVvoN7jDj2klVMRqykuhctlkfOSvL6farlhMGAE="}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":2276,"cache_read_input_tokens":48507,"cache_creation":{"ephemeral_5m_input_tokens":2276,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRjA29HpM3BG5ZEnczM","type":"assistant","uuid":"c7358210-77d9-4411-baa6-93abc385bc39","timestamp":"2025-12-20T05:59:05.820Z"} | |
| {"parentUuid":"c7358210-77d9-4411-baa6-93abc385bc39","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01P7PukCC2uiQQqCs85L5AFt","type":"message","role":"assistant","content":[{"type":"text","text":"Now let me take a new screenshot to test the fix."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":2276,"cache_read_input_tokens":48507,"cache_creation":{"ephemeral_5m_input_tokens":2276,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRjA29HpM3BG5ZEnczM","type":"assistant","uuid":"8c8e1393-7900-4b0b-9d6d-60b0e246759e","timestamp":"2025-12-20T05:59:06.029Z"} | |
| {"parentUuid":"8c8e1393-7900-4b0b-9d6d-60b0e246759e","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01P7PukCC2uiQQqCs85L5AFt","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01CXCbT9Rpp4CqKo8WNueota","name":"TodoWrite","input":{"todos":[{"content":"Fix polyfill to detect grid-lanes from raw CSS text (not computed styles)","status":"completed","activeForm":"Fixing polyfill detection of grid-lanes from raw CSS"},{"content":"Test the fix by taking a new screenshot","status":"in_progress","activeForm":"Testing the fix with a new screenshot"}]}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":2276,"cache_read_input_tokens":48507,"cache_creation":{"ephemeral_5m_input_tokens":2276,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRjA29HpM3BG5ZEnczM","type":"assistant","uuid":"90f1c948-eac9-4e34-8e3a-2781e39b7b38","timestamp":"2025-12-20T05:59:07.611Z"} | |
| {"parentUuid":"90f1c948-eac9-4e34-8e3a-2781e39b7b38","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_01P7PukCC2uiQQqCs85L5AFt","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01BvC4rVEXmTwyU43WfZi6pZ","name":"Bash","input":{"command":"npx playwright screenshot --browser chromium \"http://localhost:8042/demo.html\" screenshot2.png 2>&1","description":"Take new screenshot to test the fix","timeout":120000}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":2276,"cache_read_input_tokens":48507,"cache_creation":{"ephemeral_5m_input_tokens":2276,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRjA29HpM3BG5ZEnczM","type":"assistant","uuid":"6e8dbb62-8fe8-4aca-9024-4ef6efc10121","timestamp":"2025-12-20T05:59:09.071Z"} | |
| {"parentUuid":"6e8dbb62-8fe8-4aca-9024-4ef6efc10121","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01CXCbT9Rpp4CqKo8WNueota","type":"tool_result","content":"Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable"}]},"uuid":"17b6bff5-28cb-425f-ac15-fabf7932c703","timestamp":"2025-12-20T05:59:09.110Z","toolUseResult":{"oldTodos":[{"content":"Fix polyfill to detect grid-lanes from raw CSS text (not computed styles)","status":"in_progress","activeForm":"Fixing polyfill detection of grid-lanes from raw CSS"},{"content":"Test the fix by taking a new screenshot","status":"pending","activeForm":"Testing the fix with a new screenshot"}],"newTodos":[{"content":"Fix polyfill to detect grid-lanes from raw CSS text (not computed styles)","status":"completed","activeForm":"Fixing polyfill detection of grid-lanes from raw CSS"},{"content":"Test the fix by taking a new screenshot","status":"in_progress","activeForm":"Testing the fix with a new screenshot"}]}} | |
| {"parentUuid":"17b6bff5-28cb-425f-ac15-fabf7932c703","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01BvC4rVEXmTwyU43WfZi6pZ","type":"tool_result","content":"Navigating to http://localhost:8042/demo.html\nCapturing screenshot into screenshot2.png","is_error":false}]},"uuid":"cb6c265b-83d4-4257-847e-111c859c6735","timestamp":"2025-12-20T05:59:13.719Z","toolUseResult":{"stdout":"Navigating to http://localhost:8042/demo.html\nCapturing screenshot into screenshot2.png","stderr":"","interrupted":false,"isImage":false}} | |
| {"parentUuid":"cb6c265b-83d4-4257-847e-111c859c6735","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_016Angq7Pw7ccZkomQaC6ikN","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Let me view the screenshot to see if the fix worked.","signature":"EtwBCkYIChgCKkC4QfhfjIgLgF0mjnXytBPXGOrjA90ytU/1Ea5Z6wyukyEalXu7gDDTP47Nk7QCFvC/n9fg8WchuscspP2EbYbNEgyo9F8QgXztgtYynywaDKVimkJJNYWvmyJDpCIwI8zU0m2dqdtrsBxz8uvqZLU8sP7C4rhUmwEH87Q489Uz22UK0s3kwOxQ49XrlooKKkSa8hp2n1Xzl8OhTnHLqSOVIBqaaLGhIAAJRcEjbkSgE53riA5yloCqtk9i7Vga6XVXhotPZDCgI/fdZoHhfjIQdAz+LhgB"}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":407,"cache_read_input_tokens":50783,"cache_creation":{"ephemeral_5m_input_tokens":407,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRjzp2yVSJTgD8XUspH","type":"assistant","uuid":"bd82c108-3e4c-44c3-a8df-1020700986f8","timestamp":"2025-12-20T05:59:17.030Z"} | |
| {"parentUuid":"bd82c108-3e4c-44c3-a8df-1020700986f8","isSidechain":false,"userType":"external","cwd":"/private/tmp/files","sessionId":"16c4b025-7b6e-43f0-854e-ca7363f2fee9","version":"2.0.74","gitBranch":"","slug":"joyful-baking-knuth","message":{"model":"claude-opus-4-5-20251101","id":"msg_016Angq7Pw7ccZkomQaC6ikN","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01K3uAGDMiLqnFZ3GW6vuAAT","name":"Read","input":{"file_path":"/private/tmp/files/screenshot2.png"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":407,"cache_read_input_tokens":50783,"cache_creation":{"ephemeral_5m_input_tokens":407,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}},"requestId":"req_011CWHRjzp2yVSJTgD8XUspH","type":"assistant","uuid":"5161df6d-098c-4939-aa5c-68c9dd5de341","timestamp":"2025-12-20T05:59:17.327Z"} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment