atproto utils for zig zat.dev
atproto sdk zig

fix: clean mobile layout

- consistent gutter variable for all horizontal spacing
- proper CSS cascade (base styles before media query)
- flexbox layout instead of grid (simpler)
- cleaner hamburger icon using pseudo-elements
- one breakpoint at 768px
- removed hacky negative margins

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Changed files
+168 -148
site
-2
site/index.html
··· 13 <header class="header"> 14 <button class="menu-toggle" aria-label="Toggle navigation" aria-expanded="false"> 15 <span></span> 16 - <span></span> 17 - <span></span> 18 </button> 19 <a class="brand" href="./">zat.dev</a> 20 <a
··· 13 <header class="header"> 14 <button class="menu-toggle" aria-label="Toggle navigation" aria-expanded="false"> 15 <span></span> 16 </button> 17 <a class="brand" href="./">zat.dev</a> 18 <a
+168 -146
site/style.css
··· 10 --shadow: rgba(0, 0, 0, 0.35); 11 --max: 900px; 12 --radius: 12px; 13 --mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", 14 "Courier New", monospace; 15 --sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, ··· 27 --codebg: rgba(0, 0, 0, 0.04); 28 --shadow: rgba(0, 0, 0, 0.08); 29 } 30 } 31 32 html, ··· 49 text-decoration: underline; 50 } 51 52 .app { 53 min-height: 100%; 54 display: flex; 55 flex-direction: column; 56 } 57 58 .header { 59 position: sticky; 60 top: 0; 61 z-index: 20; 62 display: flex; 63 gap: 12px; 64 - align-items: center; 65 - padding: 12px 16px; 66 border-bottom: 1px solid var(--border); 67 background: color-mix(in srgb, var(--panel) 92%, transparent); 68 backdrop-filter: blur(10px); ··· 70 71 .menu-toggle { 72 display: none; 73 - flex-direction: column; 74 justify-content: center; 75 - gap: 5px; 76 - width: 40px; 77 - height: 40px; 78 - padding: 8px; 79 background: transparent; 80 border: 1px solid var(--border); 81 - border-radius: 10px; 82 cursor: pointer; 83 } 84 .menu-toggle span { 85 display: block; 86 - width: 100%; 87 height: 2px; 88 background: var(--text); 89 border-radius: 1px; 90 - transition: transform 0.2s, opacity 0.2s; 91 } 92 - .menu-toggle[aria-expanded="true"] span:nth-child(1) { 93 - transform: translateY(7px) rotate(45deg); 94 } 95 - .menu-toggle[aria-expanded="true"] span:nth-child(2) { 96 - opacity: 0; 97 } 98 - .menu-toggle[aria-expanded="true"] span:nth-child(3) { 99 - transform: translateY(-7px) rotate(-45deg); 100 } 101 102 .brand { 103 font-weight: 700; 104 - letter-spacing: 0.2px; 105 - padding: 6px 10px; 106 - border-radius: 10px; 107 } 108 .brand:hover { 109 - background: color-mix(in srgb, var(--codebg) 70%, transparent); 110 text-decoration: none; 111 } 112 113 .header-link { 114 margin-left: auto; 115 - padding: 8px 10px; 116 - border-radius: 10px; 117 border: 1px solid var(--border); 118 color: var(--text); 119 - opacity: 0.9; 120 } 121 .header-link:hover { 122 - background: color-mix(in srgb, var(--codebg) 70%, transparent); 123 text-decoration: none; 124 - opacity: 1; 125 } 126 127 .overlay { 128 display: none; 129 position: fixed; 130 inset: 0; 131 - z-index: 9; 132 background: rgba(0, 0, 0, 0.5); 133 - backdrop-filter: blur(2px); 134 } 135 .overlay.open { 136 display: block; 137 } 138 139 .layout { 140 - display: grid; 141 - grid-template-columns: 280px 1fr; 142 - gap: 16px; 143 - padding: 16px; 144 flex: 1; 145 - } 146 - 147 - @media (max-width: 768px) { 148 - .menu-toggle { 149 - display: flex; 150 - } 151 - 152 - .layout { 153 - grid-template-columns: 1fr; 154 - padding: 12px; 155 - gap: 12px; 156 - } 157 - 158 - .sidebar { 159 - position: fixed; 160 - top: 0; 161 - left: 0; 162 - right: 0; 163 - bottom: 0; 164 - z-index: 10; 165 - max-height: none; 166 - border: none; 167 - border-radius: 0; 168 - transform: translateX(-100%); 169 - transition: transform 0.25s ease; 170 - padding-top: 64px; 171 - } 172 - .sidebar.open { 173 - transform: translateX(0); 174 - } 175 - 176 - .nav { 177 - padding: 16px; 178 - } 179 - 180 - .nav a { 181 - padding: 14px 16px; 182 - font-size: 16px; 183 - } 184 - 185 - .content { 186 - padding: 16px; 187 - } 188 - 189 - .content h1 { 190 - font-size: 26px; 191 - } 192 - 193 - .content pre { 194 - padding: 12px; 195 - font-size: 13px; 196 - } 197 - } 198 - 199 - @media (max-width: 480px) { 200 - .header { 201 - padding: 10px 12px; 202 - } 203 - 204 - .layout { 205 - padding: 8px; 206 - } 207 - 208 - .content { 209 - padding: 14px; 210 - border-radius: 10px; 211 - } 212 - 213 - .content h1 { 214 - font-size: 22px; 215 - } 216 - 217 - .content h2 { 218 - font-size: 18px; 219 - } 220 - 221 - .content pre { 222 - margin-left: -14px; 223 - margin-right: -14px; 224 - border-radius: 0; 225 - border-left: none; 226 - border-right: none; 227 - } 228 } 229 230 .sidebar { 231 position: sticky; 232 - top: 64px; 233 - align-self: start; 234 - max-height: calc(100vh - 84px); 235 - overflow: auto; 236 border: 1px solid var(--border); 237 border-radius: var(--radius); 238 background: var(--panel); 239 - box-shadow: 0 12px 40px var(--shadow); 240 } 241 242 .nav { ··· 248 249 .nav a { 250 display: block; 251 - padding: 8px 10px; 252 - border-radius: 10px; 253 color: var(--text); 254 - opacity: 0.9; 255 } 256 .nav a:hover { 257 - background: color-mix(in srgb, var(--codebg) 70%, transparent); 258 text-decoration: none; 259 } 260 .nav a[aria-current="page"] { 261 - background: color-mix(in srgb, var(--link) 14%, var(--codebg)); 262 - border: 1px solid color-mix(in srgb, var(--link) 20%, var(--border)); 263 } 264 265 .main { 266 - display: flex; 267 - justify-content: center; 268 } 269 270 .content { 271 - width: min(var(--max), 100%); 272 border: 1px solid var(--border); 273 border-radius: var(--radius); 274 background: var(--panel); 275 - box-shadow: 0 12px 40px var(--shadow); 276 padding: 24px; 277 } 278 279 .site-footer { 280 - display: flex; 281 - justify-content: center; 282 - padding: 12px 16px; 283 border-top: 1px solid var(--border); 284 - background: var(--panel); 285 } 286 287 .footer-link { 288 font-size: 13px; 289 color: var(--muted); 290 - padding: 6px 10px; 291 - border-radius: 10px; 292 - border: 1px solid transparent; 293 } 294 .footer-link:hover { 295 color: var(--text); 296 - background: color-mix(in srgb, var(--codebg) 70%, transparent); 297 - border-color: var(--border); 298 text-decoration: none; 299 } 300 301 .content h1, 302 .content h2, 303 .content h3 { 304 - scroll-margin-top: 84px; 305 } 306 307 .content h1 { 308 margin-top: 0; 309 - font-size: 34px; 310 } 311 312 .content p, 313 .content li { 314 - line-height: 1.6; 315 } 316 317 .content code { 318 font-family: var(--mono); 319 - font-size: 0.95em; 320 background: var(--codebg); 321 padding: 2px 6px; 322 - border-radius: 8px; 323 } 324 325 .content pre { 326 - overflow: auto; 327 - padding: 14px 16px; 328 - border-radius: 12px; 329 background: var(--codebg); 330 border: 1px solid var(--border); 331 } 332 333 .content pre code { ··· 335 padding: 0; 336 } 337 338 .empty { 339 color: var(--muted); 340 }
··· 10 --shadow: rgba(0, 0, 0, 0.35); 11 --max: 900px; 12 --radius: 12px; 13 + --gutter: 16px; 14 --mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", 15 "Courier New", monospace; 16 --sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, ··· 28 --codebg: rgba(0, 0, 0, 0.04); 29 --shadow: rgba(0, 0, 0, 0.08); 30 } 31 + } 32 + 33 + * { 34 + box-sizing: border-box; 35 } 36 37 html, ··· 54 text-decoration: underline; 55 } 56 57 + /* App shell */ 58 .app { 59 min-height: 100%; 60 display: flex; 61 flex-direction: column; 62 } 63 64 + /* Header */ 65 .header { 66 position: sticky; 67 top: 0; 68 z-index: 20; 69 display: flex; 70 + align-items: center; 71 gap: 12px; 72 + padding: 12px var(--gutter); 73 border-bottom: 1px solid var(--border); 74 background: color-mix(in srgb, var(--panel) 92%, transparent); 75 backdrop-filter: blur(10px); ··· 77 78 .menu-toggle { 79 display: none; 80 + align-items: center; 81 justify-content: center; 82 + width: 36px; 83 + height: 36px; 84 + padding: 0; 85 background: transparent; 86 border: 1px solid var(--border); 87 + border-radius: 8px; 88 cursor: pointer; 89 + flex-shrink: 0; 90 } 91 .menu-toggle span { 92 display: block; 93 + width: 16px; 94 height: 2px; 95 background: var(--text); 96 border-radius: 1px; 97 + position: relative; 98 + } 99 + .menu-toggle span::before, 100 + .menu-toggle span::after { 101 + content: ""; 102 + position: absolute; 103 + left: 0; 104 + width: 16px; 105 + height: 2px; 106 + background: var(--text); 107 + border-radius: 1px; 108 + transition: transform 0.2s; 109 + } 110 + .menu-toggle span::before { 111 + top: -5px; 112 } 113 + .menu-toggle span::after { 114 + top: 5px; 115 } 116 + .menu-toggle[aria-expanded="true"] span { 117 + background: transparent; 118 } 119 + .menu-toggle[aria-expanded="true"] span::before { 120 + transform: translateY(5px) rotate(45deg); 121 + } 122 + .menu-toggle[aria-expanded="true"] span::after { 123 + transform: translateY(-5px) rotate(-45deg); 124 } 125 126 .brand { 127 font-weight: 700; 128 + font-size: 15px; 129 + color: var(--text); 130 + padding: 6px 0; 131 } 132 .brand:hover { 133 text-decoration: none; 134 + opacity: 0.8; 135 } 136 137 .header-link { 138 margin-left: auto; 139 + padding: 6px 12px; 140 + font-size: 14px; 141 + border-radius: 8px; 142 border: 1px solid var(--border); 143 color: var(--text); 144 } 145 .header-link:hover { 146 + background: var(--codebg); 147 text-decoration: none; 148 } 149 150 + /* Overlay */ 151 .overlay { 152 display: none; 153 position: fixed; 154 inset: 0; 155 + z-index: 15; 156 background: rgba(0, 0, 0, 0.5); 157 } 158 .overlay.open { 159 display: block; 160 } 161 162 + /* Layout */ 163 .layout { 164 + display: flex; 165 + gap: var(--gutter); 166 + padding: var(--gutter); 167 flex: 1; 168 + max-width: 1200px; 169 + margin: 0 auto; 170 + width: 100%; 171 } 172 173 + /* Sidebar */ 174 .sidebar { 175 + width: 240px; 176 + flex-shrink: 0; 177 position: sticky; 178 + top: 72px; 179 + align-self: flex-start; 180 + max-height: calc(100vh - 88px); 181 + overflow-y: auto; 182 border: 1px solid var(--border); 183 border-radius: var(--radius); 184 background: var(--panel); 185 } 186 187 .nav { ··· 193 194 .nav a { 195 display: block; 196 + padding: 10px 12px; 197 + border-radius: 8px; 198 color: var(--text); 199 + font-size: 14px; 200 } 201 .nav a:hover { 202 + background: var(--codebg); 203 text-decoration: none; 204 } 205 .nav a[aria-current="page"] { 206 + background: color-mix(in srgb, var(--link) 15%, transparent); 207 } 208 209 + /* Main content */ 210 .main { 211 + flex: 1; 212 + min-width: 0; 213 } 214 215 .content { 216 border: 1px solid var(--border); 217 border-radius: var(--radius); 218 background: var(--panel); 219 padding: 24px; 220 } 221 222 + /* Footer */ 223 .site-footer { 224 + padding: 16px var(--gutter); 225 + text-align: center; 226 border-top: 1px solid var(--border); 227 } 228 229 .footer-link { 230 font-size: 13px; 231 color: var(--muted); 232 } 233 .footer-link:hover { 234 color: var(--text); 235 text-decoration: none; 236 } 237 238 + /* Content typography */ 239 .content h1, 240 .content h2, 241 .content h3 { 242 + scroll-margin-top: 80px; 243 } 244 245 .content h1 { 246 margin-top: 0; 247 + font-size: 28px; 248 + } 249 + 250 + .content h2 { 251 + font-size: 20px; 252 + margin-top: 32px; 253 + } 254 + 255 + .content h3 { 256 + font-size: 16px; 257 + margin-top: 24px; 258 } 259 260 .content p, 261 .content li { 262 + line-height: 1.65; 263 } 264 265 .content code { 266 font-family: var(--mono); 267 + font-size: 0.9em; 268 background: var(--codebg); 269 padding: 2px 6px; 270 + border-radius: 6px; 271 } 272 273 .content pre { 274 + overflow-x: auto; 275 + padding: 16px; 276 + border-radius: 10px; 277 background: var(--codebg); 278 border: 1px solid var(--border); 279 + font-size: 14px; 280 + line-height: 1.5; 281 } 282 283 .content pre code { ··· 285 padding: 0; 286 } 287 288 + .content details { 289 + margin: 16px 0; 290 + } 291 + 292 + .content details summary { 293 + cursor: pointer; 294 + padding: 8px 0; 295 + } 296 + 297 .empty { 298 color: var(--muted); 299 } 300 + 301 + /* Mobile */ 302 + @media (max-width: 768px) { 303 + :root { 304 + --gutter: 16px; 305 + } 306 + 307 + .menu-toggle { 308 + display: flex; 309 + } 310 + 311 + .layout { 312 + flex-direction: column; 313 + } 314 + 315 + .sidebar { 316 + position: fixed; 317 + top: 0; 318 + left: 0; 319 + bottom: 0; 320 + width: 280px; 321 + max-width: 80vw; 322 + z-index: 16; 323 + border: none; 324 + border-radius: 0; 325 + border-right: 1px solid var(--border); 326 + max-height: none; 327 + padding-top: 60px; 328 + transform: translateX(-100%); 329 + transition: transform 0.2s ease-out; 330 + } 331 + 332 + .sidebar.open { 333 + transform: translateX(0); 334 + } 335 + 336 + .nav { 337 + padding: 12px; 338 + } 339 + 340 + .nav a { 341 + padding: 12px 14px; 342 + font-size: 15px; 343 + } 344 + 345 + .content { 346 + padding: 20px; 347 + border-radius: 10px; 348 + } 349 + 350 + .content h1 { 351 + font-size: 24px; 352 + } 353 + 354 + .content h2 { 355 + font-size: 18px; 356 + } 357 + 358 + .content pre { 359 + font-size: 13px; 360 + padding: 14px; 361 + } 362 + }