:root{--bg:#fbfbfa;--surface:#fff;--hover:#f2f2f0;--line:#e6e6e3;--line-2:#d4d4d0;--text:#1c1c1b;--body:#3d3d3b;--muted:#8a8a87;--muted-2:#b0b0ac;--ink:#161616;--font:"LXGW WenKai", "PingFang SC", "HarmonyOS Sans SC", "Microsoft YaHei", system-ui, sans-serif;--mono:ui-monospace, Menlo, monospace;--numbers:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--radius:8px}*{box-sizing:border-box}[hidden]{display:none!important}html{scrollbar-gutter:stable}body{background:var(--bg);color:var(--text);font-family:var(--font);-webkit-font-smoothing:antialiased;margin:0;font-size:15px;line-height:1.6}:where(a){color:var(--text);text-decoration:none}:where(a:hover){text-underline-offset:3px;text-decoration:underline}h1{margin:0;font-size:1.3rem;font-weight:700}h2{margin:0;font-size:.95rem;font-weight:700}button,input,select,textarea{font:inherit;color:inherit}::placeholder{color:var(--muted-2)}.muted{color:var(--muted)}.hint{color:var(--muted);margin:.4rem 0 0;font-size:.85rem}.note{color:var(--ink);font-size:.82rem}.est{color:var(--muted)}.layout{min-height:100vh;display:flex}.sidebar{border-right:1px solid var(--line);flex-direction:column;flex-shrink:0;gap:1.5rem;width:176px;height:100vh;padding:1.4rem 1rem;display:flex;position:sticky;top:0}.sidebar .brand{align-items:center;gap:.5rem;padding:0 .6rem;font-size:1.05rem;font-weight:700;display:flex}.sidebar .brand .logo{flex-shrink:0;width:24px;height:auto}.sidebar .brand:hover{text-decoration:none}.sidebar nav{flex-direction:column;flex:1;gap:.15rem;display:flex}.sidebar nav a{color:var(--body);border-radius:6px;align-items:center;gap:.6rem;padding:.5rem .6rem;display:flex}.sidebar nav a:hover{background:var(--hover);text-decoration:none}.sidebar nav a.active{background:var(--hover);color:var(--ink);font-weight:700}.sidebar nav svg{flex-shrink:0;width:18px;height:18px}.sidebar .user{color:var(--muted);justify-content:space-between;align-items:center;padding:0 .6rem;font-size:.88rem;display:flex}.link{cursor:pointer;color:var(--muted);background:0 0;border:0;padding:0}.link:hover{color:var(--ink)}main{flex:1;min-width:0;max-width:1680px;padding:1.5rem 1.5rem 3rem}.page-head{border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1rem;padding-bottom:1rem;display:flex}.page-head .sub{color:var(--muted);margin-top:.15rem;font-size:.88rem}.section{border-bottom:1px solid var(--line);padding:1.2rem 0}.section:last-child{border-bottom:0}.row{flex-wrap:wrap;align-items:center;gap:.6rem;display:flex}.btn{border:1px solid var(--line-2);background:var(--surface);color:var(--text);cursor:pointer;white-space:nowrap;border-radius:999px;align-items:center;gap:.35rem;padding:.42rem .95rem;font-size:.9rem;line-height:1.4;display:inline-flex}.btn:hover{border-color:var(--ink);text-decoration:none}.btn:disabled{opacity:.4;cursor:not-allowed}.btn-primary{background:var(--ink);border-color:var(--ink);color:#fff}.btn-primary:hover{background:#333}.btn-sm{padding:.2rem .65rem;font-size:.85rem}.btn-quiet{color:var(--muted);background:0 0;border-color:#0000}.btn-quiet:hover{color:var(--ink);border-color:#0000}input[type=text],input[type=number],input[type=password],input[type=search],input[type=date],input[type=datetime-local],select,textarea{border:1px solid var(--line-2);background:var(--surface);color:var(--text);border-radius:6px;padding:.4rem .65rem}input:focus,select:focus,textarea:focus{border-color:var(--ink);outline:none}label.field{color:var(--muted);flex-direction:column;gap:.3rem;font-size:.88rem;display:flex}label.field+label.field{margin-top:.75rem}.row:has(>.menu){position:relative}.menu{position:static}.menu>summary{cursor:pointer;color:var(--muted);letter-spacing:.1em;border-radius:6px;padding:.2rem .55rem;list-style:none}.menu>summary::-webkit-details-marker{display:none}.menu>summary:hover,.menu[open]>summary{background:var(--hover);color:var(--ink)}.menu-body{z-index:5;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);width:280px;padding:.8rem;position:absolute;top:calc(100% + 4px);right:0;box-shadow:0 6px 24px #0000000f}.menu-body p{margin:0 0 .5rem;font-size:.88rem}.table-wrap{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:.9rem}th,td{border-bottom:1px solid var(--line);text-align:left;white-space:nowrap;padding:.5rem .6rem}th{color:var(--muted);font-size:.82rem;font-weight:400}tbody tr:hover{background:var(--hover)}td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}td.num,dl.meas dd,.stats b{font-family:var(--numbers)}td.thumb{width:80px;padding:.3rem .6rem .3rem 0}td.thumb img{object-fit:cover;background:var(--hover);border-radius:4px;width:68px;height:40px;display:block}table.list{table-layout:fixed}table.list th,table.list td{text-overflow:ellipsis;overflow:hidden}table.list td.fish-tag{white-space:normal}table.list td.fish-tag .note{white-space:nowrap}.page-head:has(+.list-section){border-bottom:0;padding-bottom:1.25rem}.list-section{border-bottom:0;padding:0}.list-section .table-wrap{border-top:1px solid var(--line);scrollbar-width:thin;scrollbar-color:var(--line-2) transparent;max-height:calc(100dvh - 176px);overflow:auto}.list-section .table-wrap:focus-visible{outline:1px solid var(--ink);outline-offset:3px}table.list{font-size:.85rem}table.list th{z-index:3;background:var(--bg);color:var(--body);box-shadow:inset 0 -1px var(--line);border-bottom:0;padding:.65rem .5rem;font-size:.75rem;position:sticky;top:0}table.list td{vertical-align:middle;height:50px;padding:.45rem .5rem}table.list td.num{letter-spacing:.01em;padding-left:.375rem;padding-right:.375rem;font-size:.8rem}table.fish-list{min-width:1024px}table.fish-list td.thumb{padding:.45rem .5rem}table.fish-list td.thumb img{width:40px;height:30px}table.fish-list td.fish-tag,table.fish-list th:nth-child(2){z-index:1;background:var(--bg);border-right:1px solid var(--line);position:sticky;left:0}table.fish-list th:nth-child(2){z-index:4}table.fish-list tr:hover td.fish-tag{background:var(--hover)}table.fish-list td.fish-tag a{text-overflow:ellipsis;white-space:nowrap;font-family:var(--mono);letter-spacing:-.02em;font-size:.79rem;display:block;overflow:hidden}table.fish-list td.fish-tag .note{font-size:.72rem}table.fish-list th:nth-child(6),table.fish-list td:nth-child(6){border-left:1px solid var(--line)}table.environment-list{min-width:902px}table.environment-list td:nth-child(3){font-family:var(--numbers);font-size:.8rem}.list-section>.hint{margin-top:.75rem;font-size:.75rem}.empty{text-align:center;color:var(--muted);padding:2.5rem 0}.messages{margin:0 0 1rem;padding:0;list-style:none}.messages li{color:var(--body);padding:.1rem 0;font-size:.9rem}.messages .error{color:var(--ink);font-weight:700}.messages:empty{display:none}.toasts{z-index:50;pointer-events:none;flex-direction:column;align-items:center;gap:.4rem;display:flex;position:fixed;bottom:1.5rem;left:50%;transform:translate(-50%)}.toast{background:var(--ink);color:#fff;text-align:center;border-radius:999px;width:max-content;max-width:calc(100vw - 2rem);padding:.5rem 1.1rem;font-size:.9rem;animation:2.4s forwards toast}@keyframes toast{0%{opacity:0;transform:translateY(8px)}10%,80%{opacity:1;transform:none}to{opacity:0;visibility:hidden}}@media (prefers-reduced-motion:reduce){.toast{animation-name:toast-plain}}@keyframes toast-plain{0%,85%{opacity:1}to{opacity:0;visibility:hidden}}.pagination{align-items:center;gap:.6rem;padding-top:1rem;display:flex}.modal{border:1px solid var(--line-2);border-radius:var(--radius);background:var(--bg);width:min(640px,100vw - 2rem);max-height:calc(100vh - 4rem);color:var(--text);padding:1.4rem 1.6rem;overflow:auto}.modal::backdrop{background:#1616162e}.modal-head{justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:1.2rem;display:flex}.modal-head h2{font-size:1.1rem}.modal-head .sub{color:var(--muted);margin-top:.1rem;font-size:.85rem}.modal-close{color:var(--muted);cursor:pointer;background:0 0;border:0;padding:0 .2rem;font-size:1.4rem;line-height:1}.modal-close:hover{color:var(--ink)}.modal-close:disabled{color:var(--muted-2);cursor:default}.field-row{align-items:flex-end;gap:.6rem;margin-top:1rem;display:flex}.field-row .field{flex:1}.field-row .btn{margin-bottom:.4rem}.field-row-top{margin-top:0}.field-row-top select{min-width:9rem}.modal-results{border-top:1px solid var(--line);max-height:14rem;margin-top:1rem;overflow:auto}.modal-results td{padding:.35rem .2rem}.modal-foot{justify-content:space-between;align-items:center;gap:1rem;display:flex}.link-ink{color:var(--text);text-underline-offset:3px;text-decoration:underline}.dropzone{border:1px dashed var(--line-2);border-radius:var(--radius);text-align:center;color:var(--muted);cursor:pointer;margin-top:1rem;padding:1.8rem 1rem}.dropzone:hover,.dropzone.over{border-color:var(--ink);color:var(--ink)}.calib-wrap{border:1px solid var(--line);border-radius:6px;max-height:50vh;margin-top:.6rem;overflow:auto}.calib-wrap canvas{cursor:crosshair;max-width:100%;display:block}.progress{background:var(--line);height:2px;margin:.8rem 0}.progress>div{background:var(--ink);width:0;height:100%;transition:width .2s}.modal-fish{scrollbar-gutter:stable;width:min(1120px,100vw - 2rem);height:min(800px,100vh - 3rem);max-height:none;padding:0;overflow-y:auto}.fish-panel{padding:1.2rem 1.6rem 1.6rem}.fish-head{border-bottom:1px solid var(--line);align-items:center;gap:.9rem;padding-bottom:1rem;display:flex}.fish-thumb{border:1px solid var(--line);background:var(--hover);border-radius:12px;flex-shrink:0;width:56px;height:56px;overflow:hidden}.fish-thumb svg{width:100%;height:100%;display:block}.fish-title{flex:1;min-width:0}.fish-title h2{overflow-wrap:anywhere;font-size:1.25rem}.fish-title .sub{color:var(--muted);margin-top:.1rem;font-size:.85rem}.fish-actions{align-self:flex-start;align-items:center;gap:.5rem;display:flex}.fish-actions .modal-close{margin-left:.4rem}.fish-error{margin:.8rem 0 0}.fish-body{grid-template-columns:minmax(0,62fr) minmax(0,38fr);align-items:start;gap:1.6rem;padding-top:1.4rem;display:grid}.fish-photo{margin:0}.carousel{border:1px solid var(--line);border-radius:var(--radius);background:var(--hover);position:relative;overflow:hidden}.carousel .track{scroll-snap-type:x mandatory;scrollbar-width:none;outline:none;display:flex;overflow-x:auto}.carousel .track::-webkit-scrollbar{display:none}.carousel .slide{scroll-snap-align:start;flex:0 0 100%;height:280px}.carousel .slide svg{width:100%;height:100%;display:block}.chip{color:var(--ink);pointer-events:none;background:#ffffffd1;border-radius:999px;padding:.15rem .6rem;font-size:.8rem;position:absolute;top:.6rem}.chip-caption{left:.6rem}.chip-count{font-variant-numeric:tabular-nums;right:.6rem}.carousel-nav{width:34px;height:34px;color:var(--ink);cursor:pointer;opacity:0;background:#ffffffd1;border:0;border-radius:50%;font-size:1.3rem;line-height:1;transition:opacity .15s;position:absolute;top:50%;transform:translateY(-50%)}.carousel-nav.prev{left:.6rem}.carousel-nav.next{right:.6rem}.carousel:hover .carousel-nav,.carousel-nav:focus-visible{opacity:1}.carousel-nav:disabled{visibility:hidden}@media (hover:none){.carousel-nav{opacity:1}}.fish-photo-empty{aspect-ratio:16/9;background:var(--hover);border:1px solid var(--line);border-radius:var(--radius);color:var(--muted);justify-content:center;align-items:center;display:flex}.fish-info{margin-top:1.2rem}.seg{border:1px solid var(--line-2);border-radius:999px;gap:2px;margin-bottom:.8rem;padding:2px;display:inline-flex}.seg button{color:var(--body);cursor:pointer;white-space:nowrap;background:0 0;border:0;border-radius:999px;padding:.3rem .9rem;font-size:.9rem}.seg button:hover{color:var(--ink)}.seg button[aria-selected=true]{background:var(--ink);color:#fff}.seg-page{margin-bottom:0}.seg a{color:var(--body);white-space:nowrap;border-radius:999px;padding:.3rem 1rem;font-size:.95rem}.seg a:hover{color:var(--ink);text-decoration:none}.seg a[aria-current=page]{background:var(--ink);color:#fff;font-weight:700}.page-count{font-size:.88rem}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.muted-2{color:var(--muted-2)}dl.info{grid-template-columns:repeat(2,minmax(0,1fr));margin:0;display:grid;overflow:hidden}.info-cell{border-top:1px solid var(--line);min-width:0;margin-top:-1px;padding:.75rem 1rem}.info-cell.wide{grid-column:1/-1}dl.info dt{color:var(--muted);margin-bottom:.25rem;font-size:.82rem}dl.info dd{overflow-wrap:anywhere;min-height:1.5em;margin:0}dl.info input,dl.info select,dl.info textarea{width:100%}.table-wrap.card th:first-child,.table-wrap.card td:first-child{padding-left:1rem}.table-wrap.card th:last-child,.table-wrap.card td:last-child{padding-right:1rem}.table-wrap.card tbody tr:last-child td{border-bottom:0}.phenotypes tr[data-href]{cursor:pointer}.analysis-card{padding:1.2rem;position:sticky;top:0}.stats{text-align:center;border-bottom:1px solid var(--line);grid-template-columns:repeat(3,minmax(0,1fr));padding-bottom:1rem;display:grid}.stats b{font-variant-numeric:tabular-nums;font-size:1.45rem;font-weight:400;line-height:1.3;display:block}.stats span{color:var(--muted);font-size:.8rem}.stats b .est{color:var(--muted)}.analysis{padding-top:1rem}.analysis-title{margin:0;font-size:.95rem}.analysis-tag{margin-left:.3rem;font-size:.8rem;font-weight:400}.analysis .hint{margin:.5rem 0 .2rem}.analysis h4{margin:.9rem 0 .3rem;font-size:.85rem}.analysis ul{color:var(--body);margin:0;padding-left:1.1rem;font-size:.88rem}.analysis li+li{margin-top:.3rem}.analysis ul ul{color:var(--muted);margin-top:.2rem;padding-left:1rem;list-style:none}.analysis ul ul li+li{margin-top:.1rem}.modal-fish .toasts{position:fixed}.comments{border-top:1px solid var(--line);margin-top:1.6rem;padding-top:1.2rem}.comments-title{margin:0 0 .6rem;font-size:.95rem}.comments-title .muted{margin-left:.2rem;font-weight:400}.comment-list{margin:0;padding:0;list-style:none}.comment-list li{border-bottom:1px solid var(--line);padding:.6rem 0}.comment-list li:first-child{padding-top:0}.comment-meta{align-items:baseline;gap:.6rem;font-size:.82rem;display:flex}.comment-meta b{color:var(--text);overflow-wrap:anywhere;min-width:0;font-weight:700}.comment-meta>span,.comment-meta .link{white-space:nowrap;flex-shrink:0}.comment-meta .link{margin-left:auto;font-size:.8rem}.comment-text{color:var(--body);overflow-wrap:anywhere;margin-top:.2rem;font-size:.9rem}.comments .hint{margin:0 0 .2rem}.comment-box{gap:.5rem;margin-top:.9rem;display:flex}.comment-box input{border-radius:999px;flex:1;min-width:0;padding-left:1rem}.photo-layout{grid-template-columns:minmax(0,2.2fr) minmax(260px,1fr);align-items:start;gap:2rem;padding-top:1.2rem;display:grid}.side>.section:first-child{padding-top:0}.stage{background:var(--hover);border-radius:var(--radius);position:relative;overflow:hidden}.stage img{max-width:none;display:block;position:absolute}.stage svg{touch-action:none;width:100%;height:100%;position:absolute;inset:0}.stage .outline{fill:none;stroke:#c6f36b}.stage .mline{stroke:#c6f36b;stroke-opacity:.9}.stage .kp{fill:#fff;stroke:var(--ink);cursor:grab}.stage .kp.estimated{fill:#0000;stroke:#fff}.stage .kp.dragging{cursor:grabbing;fill:#c6f36b}.stage .kp-label{fill:#fff;paint-order:stroke;stroke:#000000a6;pointer-events:none}dl.meas{grid-template-columns:max-content 1fr;gap:.25rem 1.2rem;margin:.6rem 0 0;display:grid}dl.meas dt{color:var(--muted)}dl.meas dd{font-variant-numeric:tabular-nums;margin:0}.login-box{max-width:320px;margin:18vh auto 0;padding:0 1rem}.login-box h1{flex-direction:column;align-items:flex-start;gap:.9rem;margin-bottom:1.5rem;display:flex}.login-box h1 .logo{width:52px;height:auto}.login-box input{width:100%}@media (width<=760px){.layout{flex-direction:column}.sidebar{border-right:0;border-bottom:1px solid var(--line);flex-direction:row;align-items:center;gap:.5rem;width:auto;height:auto;padding:.6rem 1rem;position:static}.sidebar .brand{white-space:nowrap;gap:.4rem;padding:0;font-size:.95rem}.sidebar .brand .logo{width:20px}.sidebar nav{flex-direction:row;flex:1}.sidebar nav a{padding:.35rem .5rem}.sidebar nav a span,.sidebar .user span{display:none}main{width:100%;padding:1rem}.page-head:has(+.list-section){gap:.75rem;padding-bottom:1rem}.list-section .table-wrap{max-height:calc(100dvh - 196px)}table.environment-list{min-width:662px}table.environment-list col.wide-only{visibility:collapse}.photo-layout,.fish-body{grid-template-columns:minmax(0,1fr)}.fish-body{gap:1.2rem}.fish-panel{padding:1rem}.fish-thumb{border-radius:10px;width:44px;height:44px}.carousel .slide{height:200px}.fish-title h2{font-size:1.05rem}.analysis-card{position:static}dl.info{grid-template-columns:minmax(0,1fr)}.seg{display:flex}.seg button{flex:1;padding:.3rem .2rem;font-size:.85rem}.seg-page{display:inline-flex}.field-row-top{flex-direction:column;align-items:stretch}.reading-fields{grid-template-columns:repeat(3,minmax(0,1fr))}.reading-fields label:first-child{grid-column:1/-1}.reading-fields .btn{grid-column:1/-1;justify-content:center}.modal{border:0;border-radius:0;width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;margin:0;padding:1rem}.modal.modal-fish{padding:0}.modal.modal-env{width:100vw}.wide-only{display:none}.menu-body{max-width:calc(100vw - 2rem)}}.stay-list{margin:0;padding:0;list-style:none}.stay-list li{border-top:1px solid var(--line);padding:.75rem 1rem}.stay-list li:first-child{border-top:0}.stay-head{flex-wrap:wrap;align-items:baseline;gap:.6rem;display:flex}.stay-name{color:var(--text);overflow-wrap:anywhere;font-weight:700}.stay-head .link{margin-left:auto;font-size:.8rem}.stay-avg{color:var(--body);flex-wrap:wrap;gap:.2rem 1rem;margin-top:.3rem;font-size:.88rem;display:flex}.stay-add{flex-wrap:wrap;align-items:center;gap:.5rem;margin-top:.9rem;font-size:.9rem;display:flex}.stay-add select{min-width:8rem}.stay-error{margin:.5rem 0 0}.modal-env{width:min(720px,100vw - 2rem)}.env-notes{color:var(--body);overflow-wrap:anywhere;margin:-.4rem 0 1rem}.env-edit{border-bottom:1px solid var(--line);margin-bottom:1rem;padding-bottom:1rem}.env-edit input,.env-edit textarea{width:100%}.env-edit-actions{justify-content:flex-end;margin-top:.75rem}.reading-add{border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:1rem 0}.reading-add h3,.env-fish-title{margin:0 0 .6rem;font-size:.95rem}.reading-fields{grid-template-columns:minmax(0,1.6fr) repeat(3,minmax(0,1fr)) auto;align-items:end;gap:.6rem;display:grid}.reading-fields input{width:100%;min-width:0}.reading-fields .btn{margin-bottom:.25rem}.reading-error{margin:.5rem 0 0}table.readings{margin-top:.4rem}.env-fish-title{margin-top:1.4rem}.env-fish{overflow-wrap:anywhere;flex-wrap:wrap;gap:.3rem .9rem;margin:0;display:flex}.reading-fields label.field+label.field,.field-row label.field+label.field{margin-top:0}.modal-head>div:first-child{flex:1;min-width:0}.modal-head>.fish-actions{flex-shrink:0}.modal-head h2{overflow-wrap:anywhere}.field-row-top .field,.stay-add select{min-width:0}.field-row-top select,.stay-add select{text-overflow:ellipsis;max-width:100%}.env-fish a{overflow-wrap:anywhere;min-width:0}
