:root{--green: #1F7A3D;--green-deep: #15532A;--green-darker: #0F3D1F;--green-soft: #E6EFE7;--ink: #1A1A1A;--ink-soft: #2D2D2A;--cream: #ECEAE3;--cream-deep: #E4E1D7;--card: #FFFFFF;--surface-2: #FBFAF5;--muted: #6B6862;--hair: #DDD8CB;--hair-strong: #C7C1B0;--red: #B23A2F;--amber: #B68B1E;--blue: #2A6FDB;--serif: "Instrument Serif", Georgia, serif;--sans: "Manrope", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, sans-serif;--mono: "JetBrains Mono", ui-monospace, Menlo, monospace;--radius: 12px;--radius-lg: 18px;--shadow-card: 0 1px 0 rgba(20,20,20,.04), 0 22px 60px -28px rgba(20,20,20,.28);--shadow-soft: 0 1px 0 rgba(20,20,20,.03), 0 10px 30px -18px rgba(20,20,20,.2);--maxw: 1140px}*{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{font-family:var(--sans);color:var(--ink);background:var(--cream);font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden}a{color:inherit;text-decoration:none}img{max-width:100%;display:block}.wrap{max-width:var(--maxw);margin:0 auto;padding:0 28px}.it{font-family:var(--serif);font-style:italic;font-weight:400}.mono{font-family:var(--mono)}.kicker{font-family:var(--mono);font-size:11.5px;letter-spacing:.22em;text-transform:uppercase;color:var(--green-deep)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;border:0;border-radius:11px;font:inherit;font-weight:700;cursor:pointer;padding:13px 22px;font-size:15px;transition:background .15s,transform .05s,box-shadow .15s,border-color .15s}.btn-primary{background:var(--green);color:#fff;box-shadow:0 10px 24px -12px #1f7a3dbf}.btn-primary:hover{background:var(--green-deep)}.btn-ghost{background:transparent;color:var(--ink);border:1px solid var(--hair-strong)}.btn-ghost:hover{background:#fff;border-color:var(--ink)}.nav{position:sticky;top:0;z-index:50;background:#eceae3d1;backdrop-filter:blur(12px);border-bottom:1px solid var(--hair)}.nav .wrap{display:flex;align-items:center;justify-content:space-between;height:66px}.nav-logo{display:flex;align-items:center;gap:10px}.nav-logo .logo-img{height:25px;width:auto;display:block;transition:transform .3s cubic-bezier(.2,.8,.2,1)}.nav-logo:hover .logo-img{transform:translateY(-1px)}.nav-links{display:flex;align-items:center;gap:30px}.nav-links a.lnk{font-size:14px;font-weight:600;color:var(--ink-soft)}.nav-links a.lnk:hover,.nav-links a.lnk.on{color:var(--green-deep)}.nav-dd{position:relative;display:inline-flex;align-items:center}.nav-dd-btn{font-family:inherit;font-size:14px;font-weight:600;color:var(--ink-soft);background:transparent;border:0;padding:0;cursor:pointer;display:inline-flex;align-items:center;gap:5px}.nav-dd:hover .nav-dd-btn,.nav-dd:focus-within .nav-dd-btn{color:var(--green-deep)}.nav-dd-btn.on{color:var(--green-deep)}.nav-dd-btn .cr{width:13px;height:13px;transition:transform .2s cubic-bezier(.2,.8,.2,1)}.nav-dd:hover .nav-dd-btn .cr,.nav-dd:focus-within .nav-dd-btn .cr{transform:rotate(180deg)}.nav-dd:after{content:"";position:absolute;top:100%;right:0;width:100%;height:14px}.nav-dd-menu{position:absolute;top:calc(100% + 12px);right:0;min-width:186px;display:flex;flex-direction:column;padding:7px;background:var(--card);border:1px solid var(--hair);border-radius:12px;box-shadow:var(--shadow-card);opacity:0;visibility:hidden;transform:translateY(-6px);transition:opacity .18s ease,transform .18s cubic-bezier(.2,.8,.2,1),visibility .18s;z-index:60}.nav-dd:hover .nav-dd-menu,.nav-dd:focus-within .nav-dd-menu{opacity:1;visibility:visible;transform:translateY(0)}.nav-dd-menu a{font-size:14px;font-weight:600;color:var(--ink-soft);padding:9px 12px;border-radius:8px;white-space:nowrap}.nav-dd-menu a:hover{color:var(--green-deep);background:var(--green-soft)}.nav-dd-menu a.on{color:var(--green-deep)}.dev-notice{position:fixed;top:78px;left:50%;transform:translate(-50%);z-index:40;width:calc(100% - 28px);max-width:660px;padding:14px 46px 14px 18px;background:var(--card);border:1px solid var(--hair);border-left:3px solid var(--green);border-radius:12px;box-shadow:var(--shadow-card)}.dev-notice .eb{display:block;font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--green-deep);font-weight:600;margin-bottom:4px}.dev-notice p{margin:0;font-size:13px;line-height:1.5;color:var(--ink-soft)}.dev-notice p b{color:var(--ink);font-weight:700}.dev-notice .dn-x{position:absolute;top:9px;right:9px;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;padding:0;border:0;background:transparent;color:var(--muted);border-radius:7px;cursor:pointer}.dev-notice .dn-x:hover{color:var(--ink);background:var(--green-soft)}.dev-notice .dn-x svg{width:15px;height:15px}@media (max-width: 600px){.dev-notice{top:72px}}.nav-cta{display:flex;align-items:center;gap:14px}@media (max-width: 860px){.nav-links{display:none}}.foot{border-top:1px solid var(--hair);padding:44px 0 50px;margin-top:90px}.foot .wrap{display:flex;justify-content:space-between;gap:30px;flex-wrap:wrap;align-items:flex-start}.foot-brand{max-width:320px}.foot-brand .nav-logo{margin-bottom:12px}.foot-brand .nav-logo .logo-img{height:30px}.foot-brand p{font-size:13px;color:var(--muted)}.foot-cols{display:flex;gap:60px;flex-wrap:wrap}.foot-col h5{font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-bottom:14px}.foot-col a{display:block;font-size:13.5px;color:var(--ink-soft);padding:4px 0}.foot-col a:hover{color:var(--green-deep)}.foot-base{border-top:1px solid var(--hair);margin-top:38px;padding-top:22px;display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;font-size:12.5px;color:var(--muted)}@media (max-width: 600px){.foot .wrap{flex-direction:column;gap:28px}.foot-cols{gap:36px}}.tut-hero{padding:70px 0 22px;position:relative;overflow:hidden}.tut-hero .blueprint{position:absolute;inset:0;z-index:0;pointer-events:none;background-image:url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='44'%20height='76.2'%20viewBox='0%200%2044%2076.2'%3E%3Cg%20fill='none'%20stroke='%231F7A3D'%20stroke-width='1'%3E%3Cpath%20d='M0%200%20H44%20M0%2038.1%20H44%20M0%2076.2%20H44'/%3E%3Cpath%20d='M0%200%20L22%2038.1%20L44%200%20M0%2076.2%20L22%2038.1%20L44%2076.2'/%3E%3C/g%3E%3C/svg%3E");background-size:44px 76.2px;background-position:center top;opacity:.12;-webkit-mask-image:radial-gradient(ellipse 72% 64% at 50% 22%,#000 0%,transparent 78%);mask-image:radial-gradient(ellipse 72% 64% at 50% 22%,#000 0%,transparent 78%)}.tut-hero .wrap{position:relative;z-index:1}.tut-hero h1{font-size:clamp(38px,5.4vw,64px);line-height:1.04;letter-spacing:-.03em;font-weight:800;max-width:18ch;margin:14px 0 18px;text-wrap:balance}.tut-hero h1 .it{color:var(--green-deep);letter-spacing:-.01em}.tut-hero .sub{font-size:clamp(16px,1.9vw,19px);color:var(--ink-soft);max-width:62ch;text-wrap:pretty}.tut-hero .meta{display:flex;flex-wrap:wrap;gap:9px;margin-top:24px}.tut-hero .meta .m{background:var(--card);border:1px solid var(--hair);border-radius:999px;padding:6px 13px;font-family:var(--mono);font-size:11.5px;color:var(--muted)}.tut-hero .meta .m b{color:var(--green-deep);font-weight:600}.jumpbar{position:sticky;top:66px;z-index:40;background:#eceae3eb;backdrop-filter:blur(10px);border-bottom:1px solid var(--hair)}.jumpbar .wrap{display:flex;gap:4px;overflow-x:auto;padding-top:9px;padding-bottom:9px;scrollbar-width:none}.jumpbar .wrap::-webkit-scrollbar{display:none}.jumpbar a{flex:0 0 auto;font-size:12.5px;font-weight:600;color:var(--ink-soft);padding:6px 13px;border-radius:999px;border:1px solid transparent;white-space:nowrap}.jumpbar a:hover{background:var(--card);border-color:var(--hair);color:var(--green-deep)}.fsec{padding:58px 0 6px;scroll-margin-top:122px}.fsec-head{max-width:820px;margin-bottom:30px}.fsec-head .kicker{display:inline-flex;align-items:center;gap:9px}.fsec-head .kicker .n{color:var(--hair-strong);letter-spacing:.08em}.fsec-head h2{font-size:clamp(26px,3.4vw,38px);line-height:1.08;letter-spacing:-.025em;font-weight:800;margin:12px 0 8px;text-wrap:balance}.fsec-head h2 .it{color:var(--green-deep)}.fsec-head .lnk-tut{display:inline-flex;align-items:center;gap:7px;font-size:13.5px;font-weight:700;color:var(--green-deep);margin-top:4px}.fsec-head .lnk-tut svg{width:13px;height:13px}.fsec-head .lnk-tut:hover{color:var(--green)}.fgrid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.feat{display:flex;flex-direction:column;background:var(--card);border:1px solid var(--hair);border-radius:var(--radius-lg);overflow:hidden;transition:transform .18s,box-shadow .18s,border-color .18s}.feat:hover{transform:translateY(-3px);box-shadow:var(--shadow-soft);border-color:var(--hair-strong)}.feat-shot{border-bottom:1px solid var(--hair);background:var(--surface-2)}.feat-shot img{width:100%;aspect-ratio:16 / 9.4;object-fit:cover;object-position:top left}.feat-body{padding:20px 22px 18px;display:flex;flex-direction:column;flex:1}.feat-body h3{font-size:17.5px;font-weight:800;letter-spacing:-.015em}.feat-body .tag{font-size:13.5px;font-weight:600;color:var(--green-deep);margin:3px 0 8px}.feat-body p{font-size:13.5px;color:var(--muted);line-height:1.55}.feat-foot{display:flex;align-items:center;gap:12px;margin-top:16px;padding-top:14px;border-top:1px dashed var(--hair)}.feat-foot .learn{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:700;color:var(--green-deep)}.feat-foot .learn svg{width:12px;height:12px}.feat-foot .learn:hover{color:var(--green)}.feat-foot .route{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--muted);background:var(--surface-2);border:1px solid var(--hair);border-radius:6px;padding:3px 9px}@media (max-width: 800px){.fgrid{grid-template-columns:1fr}}@media (max-width: 600px){.feat-shot img{aspect-ratio:9 / 16;object-fit:cover;object-position:top center}}.shot-ph{width:100%;aspect-ratio:16 / 9.4;display:grid;place-items:center;text-align:center;padding:18px;background:repeating-linear-gradient(-45deg,var(--surface-2) 0 14px,#F4F2EA 14px 28px);color:var(--muted)}.shot-ph .ph-in{display:grid;gap:6px;justify-items:center}.shot-ph .ph-cam{width:26px;height:26px;border:1.5px solid var(--hair-strong);border-radius:7px;position:relative}.shot-ph .ph-cam:after{content:"";position:absolute;inset:6px;border-radius:50%;border:1.5px solid var(--hair-strong)}.shot-ph .ph-label{font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;line-height:1.5;max-width:30ch}.shot-ph .ph-label b{color:var(--ink-soft);font-weight:500}.tut-shell{display:grid;grid-template-columns:230px minmax(0,1fr);gap:56px;align-items:start;padding-top:44px}.tut-nav{position:sticky;top:92px}.tut-nav .h{font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);padding:0 12px 10px}.tut-nav .secs{display:grid;gap:1px}.tut-nav a.sec-lnk{display:flex;align-items:center;gap:9px;font-size:13.5px;font-weight:600;color:var(--ink-soft);padding:8px 12px;border-radius:9px;border:1px solid transparent}.tut-nav a.sec-lnk:hover{background:var(--card);color:var(--green-deep)}.tut-nav a.sec-lnk.on{background:var(--green-soft);color:var(--green-deep);border-color:#1f7a3d2e}.tut-nav a.sec-lnk .dot{width:6px;height:6px;border-radius:2px;background:var(--hair-strong);flex:0 0 auto}.tut-nav a.sec-lnk.on .dot{background:var(--green)}.tut-nav .subs{display:grid;gap:1px;margin:2px 0 4px;padding-left:15px;border-left:0}.tut-nav .subs a{font-size:12.5px;font-weight:500;color:var(--muted);padding:5px 12px;border-left:2px solid var(--hair)}.tut-nav .subs a:hover{color:var(--green-deep);border-left-color:var(--green)}.tut-nav .back{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;font-weight:700;color:var(--green-deep);margin-top:18px;padding:0 12px}.tut-nav .back svg{width:12px;height:12px}.tut-art{max-width:720px;padding-bottom:30px}.tut-art .crumb{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}.tut-art .crumb a{color:var(--green-deep)}.tut-art h1{font-size:clamp(32px,4.4vw,46px);line-height:1.05;letter-spacing:-.028em;font-weight:800;margin:12px 0 14px}.tut-art h1 .it{color:var(--green-deep);letter-spacing:-.01em}.tut-art .lede{font-size:17px;color:var(--ink-soft);text-wrap:pretty;margin-bottom:8px}.tut-art h2{font-size:25px;letter-spacing:-.02em;font-weight:800;margin:52px 0 6px;padding-top:26px;border-top:1px solid var(--hair);scroll-margin-top:92px}.tut-art h2:first-of-type{border-top:0;padding-top:8px;margin-top:30px}.tut-art h3{font-size:17px;font-weight:800;letter-spacing:-.01em;margin:30px 0 8px;scroll-margin-top:92px}.tut-art p{font-size:15px;color:var(--ink-soft);margin:10px 0;max-width:68ch}.tut-art p.feat-tagline{font-size:15.5px;font-weight:600;color:var(--green-deep);margin-top:4px}.tut-art code{font-family:var(--mono);font-size:.86em;color:var(--green-deep);background:var(--green-soft);border:1px solid rgba(31,122,61,.16);border-radius:5px;padding:1px 6px}.tut-art strong{font-weight:700;color:var(--ink)}.tut-art ol,.tut-art ul{margin:12px 0 16px;padding-left:24px}.tut-art li{font-size:14.5px;color:var(--ink-soft);margin:7px 0}.tut-art li::marker{font-family:var(--mono);font-size:12.5px;color:var(--green-deep);font-weight:600}.tut-art ul li::marker{color:var(--hair-strong)}.tut-art li ul{margin:7px 0}.tut-art li ul li{margin:4px 0;font-size:14px}.tut-fig{margin:18px 0 26px}.tut-fig .frame{border:1px solid var(--hair);border-radius:14px;overflow:hidden;background:var(--card);box-shadow:var(--shadow-soft)}.tut-fig img{width:100%;display:block}.tut-fig .shot-ph{aspect-ratio:16 / 8.6}.tut-fig figcaption{font-family:var(--mono);font-size:11px;color:var(--muted);letter-spacing:.04em;margin-top:10px}.tut-fig figcaption b{color:var(--ink-soft);font-weight:500}.tut-tbl{border:1px solid var(--hair);border-radius:10px;overflow:hidden;background:var(--card);margin:14px 0 22px;max-width:68ch}.tut-tbl table{width:100%;border-collapse:collapse;font-size:13.5px}.tut-tbl th{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:500;text-align:left;padding:9px 14px;background:var(--surface-2);border-bottom:1px solid var(--hair)}.tut-tbl td{padding:9px 14px;border-bottom:1px solid var(--hair);color:var(--ink-soft);vertical-align:top}.tut-tbl tr:last-child td{border-bottom:0}.tut-tbl td:first-child{font-weight:700;color:var(--ink);white-space:nowrap}.tut-note{background:var(--surface-2);border:1px solid var(--hair);border-radius:10px;padding:12px 16px;margin:14px 0;max-width:68ch;font-size:14px;color:var(--ink-soft)}.tut-note .nl{display:block;font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--amber);margin-bottom:4px}.route-line{display:flex;align-items:center;gap:9px;margin:4px 0 10px}.route-line .lab{font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}.route-line .route{font-family:var(--mono);font-size:11.5px;color:var(--green-deep);background:var(--surface-2);border:1px solid var(--hair);border-radius:6px;padding:3px 9px}.pager{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:60px}.pager a{display:block;background:var(--card);border:1px solid var(--hair);border-radius:var(--radius);padding:16px 18px;transition:border-color .15s,box-shadow .15s,transform .15s}.pager a:hover{border-color:var(--hair-strong);box-shadow:var(--shadow-soft);transform:translateY(-2px)}.pager a.next{text-align:right;grid-column:2}.pager a.prev{grid-column:1}.pager .pl{font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}.pager .pn{font-size:15.5px;font-weight:800;color:var(--ink);margin-top:3px}.pager a:hover .pn{color:var(--green-deep)}@media (max-width: 920px){.tut-shell{grid-template-columns:1fr;gap:26px}.tut-nav{position:static}.tut-nav .secs{display:flex;flex-wrap:wrap;gap:6px}.tut-nav a.sec-lnk{border:1px solid var(--hair);background:var(--card);border-radius:999px;padding:6px 13px;font-size:12.5px}.tut-nav .subs,.tut-nav .h,.tut-nav .back{display:none}}@media (max-width: 600px){.wrap{padding:0 18px}.tut-hero{padding:44px 0 14px}.fsec{padding:40px 0 4px}.jumpbar{top:0}}a:focus-visible,button:focus-visible{outline:2px solid var(--green);outline-offset:2px;border-radius:6px}@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}.feat,.pager a,.nav-logo .logo-img{transition:none}}
