:root{font-family:Noto Sans TC,system-ui,sans-serif;color:#202936;background:#fafcfd;font-synthesis:none;font-weight:400;--navy: #00538a;--accent: #00979d;--accent-dark: #007b80;--accent-light: #e7f6f6}*{box-sizing:border-box}body{margin:0;min-width:320px;background-image:radial-gradient(circle,#dce3e8 1px,transparent 1px);background-size:24px 24px}button,input,select{font:inherit}button,.file-button{display:inline-flex;align-items:center;justify-content:center;gap:7px;cursor:pointer;border:1px solid #dce2ea;border-radius:7px;padding:9px 13px;background:#fff;color:#435065;font-size:13px;transition:background .15s}button:hover{background:#f2f6fc}button:disabled,.disabled{opacity:.45;cursor:not-allowed}button:focus-visible,input:focus-visible,select:focus-visible{outline:3px solid #84d5d7;outline-offset:2px}.icon{border:0;background:transparent;padding:6px}.icon svg{width:21px;height:21px}header{height:78px;display:flex;align-items:center;justify-content:space-between;padding:0 32px;background:var(--navy);color:#fff;box-shadow:0 2px 6px #003c6426}.brand{display:flex;align-items:center;gap:14px}.brand strong{font-size:25px;color:#fff;letter-spacing:0;background:var(--accent);padding:9px 16px;border-radius:8px;white-space:nowrap}.brand-logo{width:48px;height:48px;object-fit:contain}.brand-edition{font-size:23px;font-weight:700;white-space:nowrap}header button{color:#d6e9f4;background:transparent;border-color:#ffffff40}header button:hover{background:#ffffff1a;color:#fff}header .icon{color:#d6e9f4}.header-actions{display:flex;gap:12px;align-items:center}.save-state{font-size:12px;color:#c3dce9;display:flex;align-items:center;gap:5px}main{max-width:1440px;padding:42px 44px 0;margin:auto}.project-heading{display:flex;justify-content:space-between;align-items:center;margin-bottom:26px;gap:20px}.eyebrow{font-size:12px;letter-spacing:2px;color:#718096;margin-bottom:6px}.project-name{font-size:28px;letter-spacing:-.8px;font-weight:700;border:0;outline:0;background:none;width:420px;max-width:100%;padding:0;color:#26344b}.project-heading p{font-size:13px;color:#7f8b9b;margin:9px 0 0}.project-meta{display:flex;gap:9px;align-items:center}.pill{font-size:12px;border:1px solid #dbe2ec;border-radius:20px;background:#f7f9fc;padding:7px 12px;color:#67768b}.steps{display:flex;gap:18px;align-items:center;font-size:12px;color:#96a0af;margin-bottom:36px}.steps span{display:flex;gap:9px;align-items:center}.steps b{display:flex;align-items:center;justify-content:center;border:1px solid #d4dce6;border-radius:50%;width:23px;height:23px;font-size:11px}.steps .current{color:var(--accent)}.steps .current b{background:var(--accent);color:#fff;border-color:var(--accent)}.workspace{display:grid;grid-template-columns:minmax(350px,1.5fr) minmax(230px,.82fr) minmax(290px,1fr);gap:30px;align-items:start}.column-label{font-size:12px;font-weight:500;color:#8590a0;margin:0 3px 12px;display:flex;justify-content:space-between}.column-label small{font-size:11px;font-weight:400}.batch-bar{display:flex;gap:8px;align-items:center;margin-bottom:14px}.batch-bar label{display:flex;gap:8px;align-items:center;font-size:11px;color:#8792a1;flex:1}.batch-bar input{min-width:0;width:100%;font-size:11px;background:transparent;padding:5px;border:1px solid #d5dde9;border-radius:5px;color:#8792a1}.batch-bar button{font-size:11px;padding:5px 8px}.class-card,.training-card,.preview-card,.evaluation{background:#fff;border-radius:8px;box-shadow:0 2px 6px #003c6410;overflow:hidden;border:1px solid #e2e7ee}.class-card{margin-bottom:19px;overflow:visible}.class-header{padding:16px 19px;display:flex;align-items:center;gap:10px;border-bottom:1px solid #e9edf2;border-left:5px solid var(--accent);border-radius:8px 0 0}.class-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.class-header input{font-size:17px;font-weight:500;border:0;outline:0;width:100%;min-width:0;color:#253249}.class-header small{white-space:nowrap;font-size:11px;color:#8b96a6}.class-files{position:relative;flex-shrink:0}.class-files-trigger{padding:6px 7px;font-size:11px;gap:3px;white-space:nowrap}.class-files-options{position:absolute;top:calc(100% + 6px);right:0;z-index:25;width:190px;max-width:calc(100vw - 24px);padding:5px;border:1px solid #e2e7ee;border-radius:8px;background:#fff;box-shadow:0 5px 20px #15243924}.class-files-options button{width:100%;justify-content:flex-start;padding:10px;border:0;font-size:12px}.class-files-options button:hover{background:var(--accent-light)}.class-files-chooser{width:220px;padding:10px}.class-files-chooser fieldset{margin:0 0 10px;padding:0;border:0;min-width:0}.class-files-chooser legend{padding:0;margin-bottom:6px;font-size:12px;color:#6a788d}.class-files-chooser label{display:flex;align-items:center;justify-content:flex-start;gap:8px;padding:8px 4px;font-size:12px;white-space:nowrap;cursor:pointer}.class-files-chooser label input[type=radio]{flex:none;width:14px;height:14px;min-width:14px;margin:0;padding:0;font-size:12px}.class-files-chooser-actions{display:flex;flex-wrap:nowrap;gap:6px}.class-files-options .class-files-chooser-actions button{width:auto;flex:none;justify-content:center;min-width:52px;padding:8px 10px;white-space:nowrap;border:1px solid #dce2ea}.class-files-options .class-files-chooser-actions .primary{flex:1 1 auto;border-color:var(--accent)}.class-files-options .class-files-chooser-actions .primary:hover{background:var(--accent-dark)}@media(max-width:1100px){.class-header{gap:6px;padding:16px 12px}}.class-body{padding:19px}.class-body>p{font-size:13px;color:#6a788d;margin:0 0 13px}.sample-actions{display:flex;gap:9px}.sample-actions button,.sample-actions label{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:7px;background:var(--accent-light);color:var(--accent);border:0;border-radius:7px;min-width:77px;padding:14px 12px;cursor:pointer;font-size:12px;font-weight:500}.sample-actions button:hover,.sample-actions label:hover{background:#d2eeee}.sample-actions svg{width:22px;height:22px}.sample-actions input,.file-button input{display:none}.empty-samples{font-size:11px;color:#a3adba;margin-top:19px}.sample-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:6px;margin-top:16px;max-height:240px;overflow:auto}.sample-tile{position:relative;padding:0;aspect-ratio:1;border:2px solid transparent;overflow:hidden;background:#ecf4ff;border-radius:5px}.sample-tile img{width:100%;height:100%;object-fit:cover}.sample-tile svg:not(:first-child){position:absolute;right:2px;bottom:2px;background:var(--accent);color:#fff;border-radius:50%}.sample-tile.selected{border-color:var(--accent)}.sample-tile polyline{fill:none}.text-danger{color:#dc4661;background:transparent;border:0;padding:10px 0 0;font-size:11px}.add-class{width:100%;height:63px;border:1.5px dashed #c1cbd9;background:none;color:#8290a4;border-radius:10px;font-size:14px}.hint{font-size:11px;color:#929faf;line-height:1.8}.training-card{border-top:4px solid var(--accent)}.preview-card{border-top:4px solid var(--navy)}.training-card h2{margin:0;padding:20px;font-size:18px;font-weight:600;display:flex;align-items:center;gap:9px}.training-card h2 svg{color:var(--accent)}.training-content{padding:0 20px 22px}.segmented{display:flex;border:1px solid #e2e8f0;background:#f5f7fa;border-radius:7px;padding:3px}.segmented button{flex:1;padding:7px 4px;font-size:11px;border:0;background:transparent;color:#7c899a;white-space:nowrap}.segmented .active{background:#fff;color:var(--accent);box-shadow:0 1px 4px #142e5320}.mode-info{font-size:11px;color:#8390a3;line-height:1.8;margin:14px 0 19px}.primary{background:var(--accent);color:#fff;border-color:var(--accent)}.primary:hover{background:var(--accent-dark)}.primary:disabled{background:#e8edf3;color:#8592a6;border-color:#e8edf3;opacity:1}.train-button{width:100%;font-size:13px;padding:13px 8px}.training-hint{display:block;text-align:center;font-size:10px;color:#9aa5b5;margin-top:12px}.advanced-toggle{width:100%;justify-content:space-between;padding:17px 20px;border:0;border-top:1px solid #e9edf2;border-radius:0;color:#7f8c9f}.settings{border:0;padding:0 20px 20px;margin:0}.settings label{display:flex;justify-content:space-between;align-items:center;font-size:12px;margin-top:12px}.settings input{width:85px;padding:5px;border:1px solid #d9e2ec;border-radius:5px}.cancel{margin-top:10px;width:100%}.progress{margin-top:14px;font-size:11px}.progress strong,.progress small{display:block;margin-bottom:7px}.progress progress{width:100%;height:6px;accent-color:var(--accent)}.progress span{display:block;text-align:right;color:#8291a6}.metrics-mini{display:flex;flex-wrap:wrap;margin-top:18px;gap:20px}.metrics-mini small{font-size:10px;color:#8090a5;display:block}.metrics-mini strong{font-size:16px}.metrics-mini svg{width:100%;background:#f8faff;border-radius:5px}.preview-header{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:20px 18px;border-bottom:1px solid #e9edf2}.preview-header h2{font-size:18px;font-weight:600;margin:0}.preview-title{display:flex;align-items:center;gap:8px;white-space:nowrap}.preview-fps{font-size:11px;font-variant-numeric:tabular-nums;color:#6a788d}.preview-header button{padding:7px 11px;font-size:11px;background:#f5f7fa;border:0}.preview-content{padding:20px}.preview-empty{padding:27px 0 32px;text-align:center}.preview-symbol{margin:0 auto 17px;background:#f0f4fa;color:#9eadc0;display:flex;align-items:center;justify-content:center;width:68px;height:68px;border-radius:50%}.preview-empty h3{font-size:14px;font-weight:500;color:#63758d}.preview-empty p{font-size:12px;color:#929faf;line-height:1.9;margin-bottom:0}.preview-source{display:flex;align-items:center;justify-content:center;background:#f4f7fb;border-radius:8px;min-height:160px;position:relative;color:#b0bdcd;overflow:hidden}.preview-source video,.preview-source img{max-width:100%;max-height:240px}.preview-source canvas:not([hidden]){max-width:100%}.preview-controls{display:flex;gap:5px;flex-wrap:wrap;margin:12px 0 20px}.preview-controls button,.file-button{font-size:10px;padding:7px}.score-row{margin-top:15px;font-size:12px}.score-row>div:first-child{display:flex;justify-content:space-between;margin-bottom:8px}.score-row b{font-weight:500;color:#697e99}.score-track{height:9px;border-radius:5px;background:#eef2f7;overflow:hidden}.score-track i{display:block;height:100%;border-radius:5px;transition:width .12s}.threshold{display:block;font-size:11px;margin-top:25px;color:#8a97a9}.threshold b{float:right}.threshold input{display:block;width:100%;accent-color:var(--accent);margin:10px 0}.stale{font-size:11px;color:#b77919;background:#fffaed;padding:8px;border-radius:5px}.learning-note{display:flex;gap:13px;padding:22px 14px;color:#8696ad}.learning-note>svg{flex-shrink:0;color:#93a8c6}.learning-note strong{font-size:12px;font-weight:500;color:#75869e}.learning-note p{font-size:11px;margin:7px 0}.learning-note button{padding:0;background:none;border:0;color:var(--accent);font-size:11px}.evaluation{margin-top:18px;padding:18px}.evaluation h3{font-size:13px;margin:0}.evaluation p,.evaluation small{font-size:10px;color:#8795a8;line-height:1.7}.evaluation strong{font-size:22px;color:var(--accent)}.evaluation table{font-size:10px;margin:12px 0;border-collapse:collapse;width:100%;overflow:auto}.evaluation td,.evaluation th{padding:5px;border:1px solid #e2e8f0;font-weight:400}.device-result{text-align:center;padding:10px 0}.device-result>svg{color:#8fa6c8}.device-result h3{font-size:15px}.device-result p{font-size:12px;color:#8392a8;line-height:1.8}.device-result button{margin-top:10px;width:100%}footer{margin-top:44px;padding:22px 0;color:#8c98ab;border-top:1px solid #dce3ed;display:flex;justify-content:space-between;gap:20px;font-size:11px;word-break:break-word}footer span{max-width:85%}.alert{display:flex;justify-content:space-between;align-items:center;background:#fff0f1;color:#bf3852;padding:12px 16px;border-radius:8px;font-size:12px;margin-bottom:20px;overflow-wrap:anywhere}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#182b4650;display:flex;align-items:center;justify-content:center;padding:20px;z-index:10;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.modal{background:#fff;border-radius:16px;box-shadow:0 24px 80px #10254430;padding:26px;max-width:560px;width:100%;max-height:90vh;overflow:auto}.modal-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:22px}.modal-header h2{font-size:20px;margin:0}.modal>label{display:block;font-size:13px;margin:18px 0;color:#63758c}.modal>label>input,.modal select{display:block;width:100%;border:1px solid #d9e1ec;border-radius:6px;padding:10px;margin-top:8px}.modal p{font-size:12px;color:#7d8da3;line-height:1.9}.project-item{display:flex;justify-content:flex-start;text-align:left;width:100%;margin-top:12px;padding:14px}.project-item small{display:block;margin-top:5px;font-size:10px;color:#8c9db3}.tutorial{font-size:13px;line-height:1.9;color:#6b7d94}.tutorial ol{padding-left:20px}.tutorial li{margin-bottom:15px}.camera-view{background:#172332;border-radius:9px;min-height:200px;display:flex;justify-content:center;overflow:hidden}.camera-view img,.camera-view video{max-width:100%;max-height:320px}.camera-view canvas{max-width:40%}.capture-controls{display:flex;gap:7px;flex-wrap:wrap;margin-top:15px}.spin{animation:spin 1.5s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:1100px){main{padding:30px 24px 0}.workspace{gap:18px;grid-template-columns:minmax(300px,1.4fr) minmax(220px,.85fr) minmax(260px,1fr)}.save-state{display:none}header{padding:0 20px}.project-meta{flex-wrap:wrap;justify-content:flex-end}.sample-actions button,.sample-actions label{min-width:69px}}@media(max-width:900px){.workspace{grid-template-columns:minmax(300px,1.2fr) minmax(250px,1fr)}.training-column{grid-column:2;grid-row:1}.preview-column{grid-column:2;grid-row:2}.samples-column{grid-row:1 / span 2}.brand strong{font-size:21px}.project-heading{align-items:flex-start}.project-meta{max-width:250px}.header-actions{gap:5px}.header-actions button{font-size:11px}.project-name{width:320px}}@media(max-width:640px){header{padding:0 13px;min-height:65px}.brand{gap:6px}.brand strong{font-size:18px}.header-actions>button:not(.icon){padding:7px;font-size:0;gap:0}.header-actions>button svg{width:18px;height:18px}.project-heading{display:block;margin-bottom:22px}.project-name{font-size:24px;width:100%}.project-meta{justify-content:flex-start;max-width:none;margin-top:18px}.workspace{display:flex;flex-direction:column;gap:24px}.workspace>section{width:100%}main{padding:24px 16px 0}.steps{gap:10px;font-size:10px;margin-bottom:26px}.steps b{width:19px;height:19px}.steps span{gap:5px}.sample-actions button,.sample-actions label{min-width:84px}.preview-empty{padding:15px 0}footer{margin-top:26px}.modal{padding:20px}.batch-bar input{max-width:220px}}.batch-bar label{white-space:nowrap}.timings{font-size:11px;color:#667d9a;margin-top:15px}.timings div{display:flex;justify-content:space-between;margin-top:6px}.timings b{font-weight:500}.capture-hold-button{touch-action:none;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.capture-hold-button[aria-pressed=true]{background:var(--accent-dark)}.device-button.is-connected,.device-button.is-connected:hover{color:#166534;border-color:#86c99b;background:#dcfce7}.device-button:not(.is-connected),.device-button:not(.is-connected):hover{background:#edf0f4;color:#8190a3}.capture-modal{max-width:760px}.capture-controls{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px}.capture-controls button{flex:0 0 auto;white-space:nowrap}.camera-view .transformed-media{width:min(100%,320px);aspect-ratio:1;object-fit:cover;align-self:center}.preview-source .transformed-media{width:min(100%,240px);aspect-ratio:1;object-fit:cover}.media-status{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:12px;padding:20px;width:100%;min-height:200px;color:#b9c6d8}.media-status p{color:inherit;text-align:center}.media-status>div{display:flex;flex-wrap:wrap;gap:7px;justify-content:center}.sample-actions .device-sample.is-offline,.sample-actions .device-sample.is-offline:hover{background:#edf0f4;color:#8190a3}.preview-source .media-status{min-height:160px;color:#667d9a}@media(max-width:1000px){header{height:auto;min-height:78px;flex-wrap:wrap;gap:12px;padding:14px 20px}.header-actions{margin-left:auto}}@media(max-width:640px){header{gap:10px;padding:12px}.brand{gap:7px;width:100%}.brand-logo{width:32px;height:32px}.brand-edition{font-size:16px}.brand strong{font-size:18px;padding:7px 10px;margin-left:auto}.header-actions{width:100%;justify-content:flex-end;gap:8px}.header-actions>button:not(.icon){font-size:12px;gap:6px}.steps{flex-wrap:wrap}}@media(max-width:360px){.brand strong{font-size:16px;padding:7px}.brand-edition{font-size:14px}}
