/* Developer tools (Lee t87u, 30 Oct 2026). Builds on projects.css; colours come from the site variables so light and dark both work. */
.tl-promise{display:flex;flex-wrap:wrap;gap:.5rem;list-style:none;margin:1.1rem 0 0;padding:0}
.tl-promise li{font-family:var(--mono);font-size:.78rem;padding:.35rem .7rem;border-radius:999px;border:1px solid var(--line);background:var(--card);color:var(--soft-ink)}
.tl-promise li::before{content:"✓ ";color:var(--g)}
.tl-free{color:var(--g);border:1px solid color-mix(in srgb,var(--g) 45%,transparent);background:color-mix(in srgb,var(--g) 10%,transparent)}
.tl-private{font-size:.78rem;color:var(--mut)}
.tl-card .pc-media a{display:block}
.tl-hero .pp-lede{max-width:46rem}
.tl-tool{margin-top:1.5rem;margin-bottom:2.5rem;scroll-margin-top:84px}
.tl-app{display:grid;gap:1.1rem;min-width:0}
.tl-app>*,.tl-grid2>*,.tl-row>*,.tl-panel>*{min-width:0}
.tl-app [hidden]{display:none!important}
.tl-grid2{display:grid;gap:1.1rem;grid-template-columns:minmax(0,1fr)}
@media (min-width:900px){.tl-grid2{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}
.tl-panel{background:var(--card);border:1px solid var(--line);border-radius:18px;padding:1.1rem;display:grid;gap:.85rem;align-content:start;min-width:0}
@media (min-width:700px){.tl-panel{padding:1.4rem}}
.tl-panel h3{margin:0;font-family:var(--display);font-size:1.08rem}
.tl-h4{margin:.4rem 0 0;font-family:var(--display);font-size:.95rem}
.tl-row{display:grid;gap:.85rem;grid-template-columns:minmax(0,1fr)}
@media (min-width:520px){.tl-row{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}}
.tl-f{display:grid;gap:.35rem;min-width:0;align-content:start}
.tl-f>label,.tl-fs legend{font-size:.86rem;font-weight:600;color:var(--ink)}
.tl-hint{font-size:.76rem;color:var(--mut)}
.tl-mut{color:var(--mut);margin:0}
.tl-small{font-size:.82rem}
.tl-app input[type=text],.tl-app input[type=url],.tl-app input[type=number],.tl-app select,.tl-app textarea{width:100%;min-width:0;box-sizing:border-box;font:inherit;font-size:16px;color:var(--ink);background:var(--bg);border:1px solid var(--line);border-radius:10px;padding:.6rem .7rem;min-height:44px}
.tl-app textarea{font-family:var(--mono);font-size:.86rem;line-height:1.5;resize:vertical}
.tl-app input[type=number].tl-num{width:5.2rem;flex:none}
.tl-app input:focus-visible,.tl-app select:focus-visible,.tl-app textarea:focus-visible,.tl-app button:focus-visible,.tl-app summary:focus-visible,.tl-drop:focus-within,.tl-chip:focus-within{outline:2px solid var(--b);outline-offset:2px}
.tl-app [aria-invalid=true]{border-color:var(--r)}
.tl-app input[type=color]{width:48px;height:44px;flex:none;padding:3px;border:1px solid var(--line);border-radius:10px;background:var(--bg);cursor:pointer}
.tl-app input[type=range]{width:100%;min-width:0;accent-color:var(--b);height:28px}
.tl-cin{display:flex;gap:.5rem;align-items:center;min-width:0}
.tl-rn{display:flex;gap:.6rem;align-items:center;min-width:0}
.tl-rn output{font-family:var(--mono);font-size:.82rem;color:var(--mut);white-space:nowrap}
.tl-check{display:flex;gap:.55rem;align-items:flex-start;font-size:.88rem}
.tl-check input{width:20px;height:20px;margin:.1rem 0 0;accent-color:var(--b);flex:none}
.tl-check label{font-weight:500}
.tl-fs{border:1px solid var(--line);border-radius:12px;padding:.6rem .8rem .8rem;margin:0;display:flex;flex-wrap:wrap;gap:.45rem;min-width:0}
.tl-fs legend{padding:0 .3rem}
.tl-chip{display:inline-flex;align-items:center;gap:.4rem;font-size:.84rem;padding:.4rem .65rem;border:1px solid var(--line);border-radius:999px;background:var(--bg);cursor:pointer;min-height:36px}
.tl-chip input{accent-color:var(--b);width:18px;height:18px;margin:0}
.tl-btn{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;font:inherit;font-size:.9rem;font-weight:600;color:var(--ink);background:var(--bg);border:1px solid var(--line);border-radius:10px;padding:.55rem .9rem;min-height:44px;cursor:pointer;justify-self:start}
.tl-btn:hover{border-color:var(--b)}
.tl-btn-sm{font-size:.8rem;padding:.35rem .7rem;min-height:36px}
.tl-btn-quiet{color:var(--mut)}
.tl-btn-dl{color:var(--b-soft)}
[data-theme="light"] .tl-btn-dl{color:var(--b)}
.tl-btn[disabled],.btn[disabled]{opacity:.5;cursor:not-allowed}
.tl-file{position:relative;overflow:hidden}
.tl-file input{position:absolute;inset:0;opacity:0;cursor:pointer;font-size:0}
.tl-actions,.tl-presets{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center}
.tl-big-btn{justify-self:stretch;justify-content:center}
.tl-msg{margin:0;font-size:.86rem;color:var(--mut);min-height:0}
.tl-msg:empty{display:none}
.tl-msg.fail,.mp-meter.fail{color:var(--r)}
.tl-msg.mid,.mp-meter.mid{color:var(--y)}
.mp-meter.pass{color:var(--g)}
[data-theme="light"] .tl-msg.mid,[data-theme="light"] .mp-meter.mid{color:#946200}
[data-theme="light"] .tl-msg.fail,[data-theme="light"] .mp-meter.fail{color:#c01c43}
[data-theme="light"] .mp-meter.pass{color:#0a7a56}
.mp-meter{font-size:.78rem;color:var(--mut)}
.tl-drop{position:relative;display:grid;gap:.25rem;justify-items:center;text-align:center;padding:1.1rem;border:2px dashed var(--line);border-radius:14px;background:var(--bg);cursor:pointer}
.tl-drop-big{padding:2rem 1rem}
.tl-drop.on{border-color:var(--b);background:color-mix(in srgb,var(--b) 10%,var(--bg))}
.tl-drop input{position:absolute;inset:0;opacity:0;cursor:pointer;width:100%;font-size:0}
.tl-drop-t{font-size:.95rem}.tl-drop-t b{color:var(--b-soft)}
[data-theme="light"] .tl-drop-t b{color:var(--b)}
.tl-drop-s{font-size:.78rem;color:var(--mut)}
.tl-out{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--bg);min-width:0}
.tl-out-bar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;padding:.45rem .55rem .45rem .8rem;border-bottom:1px solid var(--line)}
.tl-out-k{font-family:var(--mono);font-size:.78rem;color:var(--mut)}
.tl-out-b{display:flex;gap:.4rem}
.tl-pre{margin:0;padding:.8rem;max-height:340px;overflow:auto;font-family:var(--mono);font-size:.8rem;line-height:1.55;color:var(--code-ink);white-space:pre;tab-size:2}
textarea.tl-pre{border:0;border-radius:0;display:block;white-space:pre-wrap;word-break:break-all;background:transparent}
.tl-pre code{font:inherit;color:inherit;background:none;padding:0}
.tl-table-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:12px}
.tl-table-wrap table{width:100%;border-collapse:collapse;font-size:.84rem}
.tl-table-wrap th,.tl-table-wrap td{padding:.5rem .6rem;border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
.tl-table-wrap tr:last-child>*{border-bottom:0}
.tl-table-wrap thead th{font-size:.75rem;color:var(--mut);font-weight:600}
.tl-table-wrap td.pass{color:var(--g)}.tl-table-wrap td.mid{color:var(--y)}.tl-table-wrap td.fail{color:var(--mut)}
[data-theme="light"] .tl-table-wrap td.pass{color:#0a7a56}[data-theme="light"] .tl-table-wrap td.mid{color:#946200}
.tl-sw{display:inline-block;width:22px;height:22px;border-radius:6px;border:1px solid var(--line);vertical-align:middle;flex:none}
.tl-tabs{display:flex;gap:.35rem;padding:.25rem;border:1px solid var(--line);border-radius:12px;background:var(--bg);justify-self:start;max-width:100%;overflow-x:auto}
.tl-tabs [role=tab]{font:inherit;font-size:.88rem;font-weight:600;color:var(--mut);background:transparent;border:0;border-radius:9px;padding:.5rem .9rem;min-height:40px;cursor:pointer;white-space:nowrap}
.tl-tabs [role=tab][aria-selected=true]{background:var(--card);color:var(--ink);box-shadow:0 1px 3px rgba(0,0,0,.25)}
.tl-more{border:1px solid var(--line);border-radius:12px;padding:0 .8rem}
.tl-more summary{cursor:pointer;padding:.7rem 0;font-weight:600;font-size:.9rem}
.tl-more[open]{padding-bottom:.8rem}.tl-more[open]>*+*{margin-top:.6rem}
.tl-offscreen{position:fixed;left:-9999px;top:0;opacity:0}
/* contrast */
.cc-sample{border-radius:14px;border:1px solid var(--line);padding:1rem 1.1rem;display:grid;gap:.4rem}
.cc-sample p{margin:0}.cc-s1{font-size:16px}.cc-s2{font-size:24px;font-weight:700;line-height:1.2}
.cc-s3{display:flex;gap:.8rem;align-items:center}
.cc-ui{border:2px solid var(--cc-fg,currentColor);border-radius:8px;padding:.25rem .7rem;font-weight:600;font-size:.9rem}
.cc-icon{font-size:1.5rem}
.cc-ratio{margin:0;font-family:var(--display);font-size:clamp(2.4rem,9vw,3.4rem);font-weight:800;line-height:1;letter-spacing:-.02em}
.cc-checks{list-style:none;margin:0;padding:0;display:grid;gap:.4rem}
.cc-checks li{display:grid;grid-template-columns:3.4rem 1fr;gap:.1rem .6rem;align-items:center;font-size:.88rem;padding:.45rem .6rem;border-radius:10px;background:var(--bg);border:1px solid var(--line)}
.cc-checks b{grid-row:span 2;text-align:center;border-radius:7px;padding:.2rem 0;font-size:.78rem}
.cc-checks .pass b{background:color-mix(in srgb,var(--g) 18%,transparent);color:var(--g)}
.cc-checks .fail b{background:color-mix(in srgb,var(--r) 16%,transparent);color:var(--r)}
[data-theme="light"] .cc-checks .pass b{color:#0a7a56}[data-theme="light"] .cc-checks .fail b{color:#c01c43}
.cc-checks small{color:var(--mut);font-size:.74rem}
.cc-apca{margin:0;font-size:.88rem;color:var(--soft-ink)}
.cc-apca output{font-family:var(--mono);font-weight:700}
.cc-sugg{display:grid;gap:.45rem}
.tl-sg{display:flex;flex-wrap:wrap;align-items:center;gap:.55rem;font-size:.88rem}
.tl-sg code{font-family:var(--mono)}
.tl-sg-k{font-family:var(--mono);font-size:.75rem;font-weight:700;padding:.15rem .45rem;border-radius:6px;border:1px solid var(--line)}
/* fluid type */
.ft-prev{border:1px solid var(--line);border-radius:12px;padding:.9rem;background:var(--bg);overflow:hidden;display:grid;gap:.5rem}
.ft-line{margin:0;line-height:1.15;overflow-wrap:anywhere;font-family:var(--display);font-weight:650}
.ft-k{display:block;font-family:var(--mono);font-size:.7rem;font-weight:400;color:var(--mut);letter-spacing:0}
.ft-space{display:grid;gap:.35rem}
.ft-sp{display:flex;align-items:center;gap:.6rem;font-family:var(--mono);font-size:.74rem;color:var(--mut)}
.ft-bar{display:block;height:12px;border-radius:4px;background:linear-gradient(90deg,var(--b),var(--g));flex:none;max-width:70%}
/* favicon */
.fv-mocks{display:grid;gap:.8rem;grid-template-columns:minmax(0,1fr) auto;align-items:center}
.fv-tab{display:flex;align-items:center;gap:.55rem;padding:.55rem .8rem;border-radius:10px 10px 0 0;background:var(--bg);border:1px solid var(--line);border-bottom:0;font-size:.85rem;min-width:0}
.fv-tab canvas{width:16px;height:16px;flex:none}
.fv-tab span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.fv-tab i{font-style:normal;color:var(--mut)}
.fv-ios{display:grid;justify-items:center;gap:.3rem;padding:.8rem;border-radius:16px;background:linear-gradient(160deg,#2b3a67,#6b4f8f);color:#fff;font-size:.72rem}
.fv-ios canvas{width:60px;height:60px;border-radius:14px}
.fv-sizes{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:.9rem;align-items:flex-end}
.fv-sizes li{display:grid;justify-items:center;gap:.3rem;font-family:var(--mono);font-size:.7rem;color:var(--mut)}
#fv-c16{width:32px;height:32px;image-rendering:pixelated}
#fv-c32{width:32px;height:32px}
#fv-c180{width:90px;height:90px;border-radius:20px}
#fv-c512{width:110px;height:110px}
.fv-files{list-style:none;margin:0;padding:0;display:grid;gap:.35rem}
.fv-files li{display:flex;justify-content:space-between;align-items:center;gap:.6rem;font-family:var(--mono);font-size:.8rem;padding:.35rem 0;border-bottom:1px solid var(--line)}
.fv-files small{color:var(--mut)}
/* meta preview (fixed platform colours, like the real thing) */
.mp-k{margin:.2rem 0 -.4rem;font-family:var(--mono);font-size:.74rem;color:var(--mut)}
.mp-g{background:#fff;color:#202124;border-radius:12px;padding:.9rem 1rem;font-family:Arial,sans-serif;border:1px solid var(--line)}
.mp-g-site{display:flex;gap:.6rem;align-items:center;font-size:14px;line-height:1.3}
.mp-g-site span:last-child{display:grid;min-width:0}
.mp-g-site b{font-weight:400;color:#202124}
.mp-g-site cite{font-style:normal;color:#4d5156;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mp-g-fav{width:26px;height:26px;border-radius:50%;background:#e8eaf6;color:#3c4043;display:grid;place-items:center;font-size:12px;font-weight:700;flex:none}
.mp-g-t{margin:.35rem 0 .2rem;color:#1a0dab;font-size:20px;line-height:1.3;overflow-wrap:anywhere}
.mp-g-d{margin:0;color:#4d5156;font-size:14px;line-height:1.58;overflow-wrap:anywhere}
.mp-img{aspect-ratio:1.91/1;background:#cfd5e4;display:grid;place-items:center;overflow:hidden}
.mp-img img{width:100%;height:100%;object-fit:cover;display:block}
.mp-noimg{font-family:var(--mono);font-size:.75rem;color:#5b6377}
.mp-x{position:relative;border-radius:16px;overflow:hidden;border:1px solid #cfd9de;background:#fff;color:#0f1419;font-family:system-ui,sans-serif}
.mp-x-t{position:absolute;left:12px;bottom:40px;max-width:calc(100% - 24px);background:rgba(0,0,0,.77);color:#fff;font-size:13px;padding:2px 6px;border-radius:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mp-x-d{margin:0;padding:.45rem .8rem;color:#536471;font-size:13px}
.mp-l{border-radius:8px;overflow:hidden;border:1px solid #e0dfdc;background:#fff;color:rgba(0,0,0,.9);font-family:system-ui,sans-serif}
.mp-l-t{margin:0;padding:.6rem .8rem 0;font-size:14px;font-weight:600;line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.mp-l-d{margin:0;padding:.15rem .8rem .65rem;font-size:12px;color:rgba(0,0,0,.6)}
.mp-i{max-width:290px;border-radius:18px;overflow:hidden;background:#e9e9eb;color:#000;font-family:-apple-system,system-ui,sans-serif}
.mp-i-b{padding:.55rem .8rem .65rem}
.mp-i-t{margin:0;font-size:14px;font-weight:600;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.mp-i-d{margin:.1rem 0 0;font-size:12px;color:#6e6e73}
/* image compressor */
.ic-list{list-style:none;margin:0;padding:0;display:grid;gap:.6rem}
.ic-list:empty{display:none}
.ic-item{display:flex;gap:.8rem;align-items:flex-start;padding:.7rem;border:1px solid var(--line);border-radius:12px;background:var(--bg);font-size:.86rem;min-width:0}
.ic-thumb{width:96px;height:auto;border-radius:8px;flex:none;background:var(--line)}
.ic-body{min-width:0;flex:1;display:grid;gap:.4rem}
.ic-name{margin:0;font-weight:600;overflow-wrap:anywhere}
.ic-outs{list-style:none;margin:0;padding:0;display:grid;gap:.3rem}
.ic-outs li{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.4rem;font-family:var(--mono);font-size:.78rem}
#ic-qo{font-family:var(--mono);color:var(--mut);font-weight:400}
/* shadow + gradient */
.sg-stage{border-radius:14px;min-height:220px;display:grid;place-items:center;padding:2rem;border:1px solid var(--line)}
.sg-box{width:min(220px,70%);aspect-ratio:3/2;display:grid;place-items:center;font-family:var(--display);font-weight:700;color:#3a4157}
.sg-layer{border:1px solid var(--line);border-radius:12px;padding:.7rem .8rem .8rem;margin:0 0 .6rem;display:grid;gap:.55rem;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));align-items:end;min-width:0}
.sg-layer legend{font-size:.82rem;font-weight:700;padding:0 .3rem}
.sg-layer .tl-btn{justify-self:start}
.gr-prev{border-radius:14px;min-height:220px;border:1px solid var(--line)}
.gr-stop{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:.6rem;align-items:end;margin-bottom:.5rem}
/* svg */
.so-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.5rem;margin:0}
.so-stats div{background:var(--bg);border:1px solid var(--line);border-radius:10px;padding:.5rem .6rem;min-width:0}
.so-stats dt{font-size:.72rem;color:var(--mut)}.so-stats dd{margin:0;font-family:var(--mono);font-weight:700;font-size:.92rem}
.so-prev{display:grid;grid-template-columns:1fr 1fr;gap:.6rem}
.so-prev figure{margin:0;display:grid;gap:.3rem;justify-items:center;padding:.8rem;border-radius:12px;border:1px solid var(--line);background:repeating-conic-gradient(#d9dde8 0 25%,#fff 0 50%) 0 0/16px 16px}
.so-prev img{width:100%;max-width:160px;height:auto;aspect-ratio:1}
.so-prev figcaption{font-size:.74rem;color:#3a4157;background:#fff;padding:0 .4rem;border-radius:4px}
.so-out{min-height:150px}
/* robots */
.rl-table td,.rl-table th{white-space:normal!important;vertical-align:top}
.rl-table th small{display:block;font-weight:400;color:var(--mut);font-size:.72rem}
.rl-table td:nth-child(3){min-width:220px}
.rl-table select{min-width:150px}
/* page parts */
.tl-steps li{margin-bottom:.45rem}
.tl-rel{list-style:none;margin:0;padding:0;display:grid;gap:.6rem;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}
.tl-rel a{display:flex;gap:.7rem;align-items:center;padding:.75rem .85rem;border:1px solid var(--line);border-radius:14px;background:var(--card);color:var(--ink);text-decoration:none}
.tl-rel a:hover{border-color:var(--b)}
.tl-rel span{display:grid}.tl-rel small{color:var(--mut);font-size:.76rem}
.tl-body .pp-sec code{font-family:var(--mono);font-size:.88em}
@media (max-width:520px){.so-stats{grid-template-columns:repeat(2,minmax(0,1fr))}.fv-mocks{grid-template-columns:minmax(0,1fr)}.fv-ios{justify-self:start}}
.tl-app [role=tabpanel]{display:grid;gap:.85rem;min-width:0}
.tl-card .pc-media a{text-decoration:none;color:inherit}
.tl-card .pc-top{flex-wrap:wrap}
