:root{--bg:#0f1115;--panel:#1a1d24;--panel-2:#232733;--border:#2d323e;--text:#e6e8ec;--muted:#9aa1ad;--accent:#22c55e;--danger:#ef4444}*{box-sizing:border-box}body,html{margin:0;padding:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Hiragino Sans,Noto Sans JP,sans-serif}a{color:inherit;text-decoration:none}.app-header{justify-content:space-between;padding:12px 20px;border-bottom:1px solid var(--border);background:var(--panel);position:-webkit-sticky;position:sticky;top:0;z-index:10}.app-header,.app-header .brand{display:flex;align-items:center}.app-header .brand{gap:10px;font-weight:700;font-size:18px}.app-header .brand-logo{height:40px;width:auto;border-radius:6px;display:block}.app-header nav{display:flex;gap:16px;align-items:center}.logo-manager{display:flex;flex-direction:column;gap:12px;align-items:flex-start}.logo-manager .logo-preview{max-height:60px;max-width:240px;width:auto;border-radius:8px;background:#fff;padding:6px 10px;display:block}.btn-nav{background:var(--panel-2);color:var(--text);border:1px solid var(--border);padding:8px 14px;border-radius:8px;font-weight:600}.btn-nav:hover{border-color:var(--muted)}.btn-nav-primary{background:var(--accent);color:#06210f;border-color:var(--accent)}.btn-nav-primary:hover{border-color:var(--accent);filter:brightness(1.08)}.btn-nav-disabled{color:var(--muted);cursor:not-allowed;pointer-events:none}.btn-nav-toggle.active{background:var(--accent);color:#06210f;border-color:var(--accent)}.app-main{padding:20px;max-width:1400px;margin:0 auto}.app-footer{margin-top:40px;padding:20px;border-top:1px solid var(--border);text-align:center}.app-footer .footer-login{display:inline-block;padding:10px 16px;color:var(--muted);font-size:13px}.app-footer .footer-login:hover{color:var(--text)}button{font:inherit;cursor:pointer}.btn{border:1px solid var(--border);background:var(--panel-2);color:var(--text);padding:8px 14px;border-radius:8px}.btn:hover{border-color:var(--muted)}.btn-sm{padding:4px 8px;font-size:12px;border-radius:6px}.btn-primary{background:var(--accent);color:#06210f;border:none;font-weight:600}.btn-danger{background:transparent;color:var(--danger);border-color:var(--danger)}.btn:disabled{opacity:.5;cursor:not-allowed}input,select,textarea{font:inherit;background:var(--panel-2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 10px;width:100%}textarea{resize:vertical;line-height:1.5}label{display:block;font-size:13px;color:var(--muted);margin-bottom:4px}.field{margin-bottom:12px}.field-row{display:flex;gap:10px}.field-row .field{flex:1 1;min-width:0}.field-add-trigger{display:block;width:100%;margin-bottom:8px;padding:8px 12px;background:transparent;border:1px dashed var(--border);border-radius:8px;color:var(--muted);font-size:13px;text-align:left;cursor:pointer}.field-add-trigger:hover{color:var(--text);border-color:var(--muted)}.checkbox-field{display:flex;align-items:center;gap:8px;margin-bottom:0;color:var(--text);cursor:pointer}.checkbox-field input[type=checkbox]{width:auto;margin:0;flex:0 0 auto}input[type=date],input[type=time]{min-width:0;max-width:100%}.field-label-row{display:flex;align-items:center;justify-content:space-between;gap:8px}.field-label-row label{margin-bottom:4px}.schedule-toggle{display:flex;align-items:center;gap:6px;color:var(--text);cursor:pointer}.schedule-toggle input[type=checkbox]{width:auto;margin:0;flex:0 0 auto}.date-time-row{display:flex;flex-wrap:wrap;gap:8px}.date-time-row input[type=date]{flex:1 1 55%}.date-time-row input[type=time]{flex:1 1 35%}.login-wrap{display:flex;justify-content:center;padding-top:10vh}.login-card{width:min(360px,100%);background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:24px}.login-card h2{margin:0 0 4px}.login-note{font-size:13px;color:var(--muted);margin:0 0 16px}.login-error{font-size:13px;color:#ff6b6b;margin:0 0 12px}.nav-user{font-size:13px;color:var(--muted);margin-left:auto;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gym-switcher{width:auto;padding:8px 10px;font-size:13px}.admin{max-width:720px;margin:0 auto}.admin-gyms{display:flex;flex-direction:column;gap:12px;margin-bottom:20px}.admin-gym-head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.admin-gym-actions,.admin-staff-actions{display:flex;gap:6px;flex-wrap:wrap}.admin-inactive{color:var(--muted);text-decoration:line-through}.admin-staff,.admin-walls{margin-top:12px;border-top:1px solid var(--border);padding-top:12px}.admin-section-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.admin-wall-list{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.admin-wall-chip{display:inline-flex;align-items:center;gap:6px;max-width:100%;background:var(--panel-2);border:1px solid var(--border);border-radius:8px;padding:4px 8px;font-size:13px}.admin-wall-chip button{border:none;background:transparent;color:var(--muted);padding:0;line-height:1}.admin-wall-add{display:grid;grid-template-columns:1fr auto;grid-gap:8px;gap:8px}.admin-staff-list{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}.tape-color-row{grid-template-columns:auto 1fr auto;align-items:center}.wall-name-row{grid-template-columns:1fr auto auto auto auto;align-items:center}.wall-angle-input{width:72px}.wall-area-input{width:110px}.wall-area-heading{font-weight:600;margin:8px 0 4px}.main-area-radio{display:inline-flex;align-items:center;gap:4px;margin-left:10px;font-size:12px;font-weight:400;white-space:nowrap;cursor:pointer}.main-area-radio input[type=radio]{width:14px;height:14px}.main-area-radio:has(input:disabled){opacity:.45;cursor:default}.grade-row{grid-template-columns:auto 1fr auto auto auto auto;align-items:center}.grade-tape-link{max-width:130px}.grade-foot-free{align-items:center;font-size:13px;white-space:nowrap;cursor:pointer}.grade-foot-free,.grade-move{display:inline-flex;gap:4px}.grade-move .tiny-btn:disabled{opacity:.35}.tape-color-picker{width:40px;height:40px;padding:2px;border:1px solid var(--border,#d1d5db);border-radius:8px;background:none;cursor:pointer}.tape-select{display:flex;align-items:center;gap:8px}.tape-select select{flex:1 1}.tape-select-swatch{flex:none;width:24px;height:24px;border-radius:6px;border:1px solid var(--border);background:repeating-conic-gradient(#ccc 0 25%,#fff 0 50%) 50% /10px 10px}.admin-staff-row{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.admin-staff-add{display:flex;flex-direction:column;gap:8px}.admin-gym-add h3{margin-top:0}.admin-invite{margin-bottom:12px}.admin-invite-url{margin-top:8px;word-break:break-all}.admin-invite-url code{background:var(--panel-2);padding:2px 6px;border-radius:6px}.gym-picker{max-width:640px;margin:0 auto;padding-top:4vh}.gym-picker h2{margin:0 0 16px}.gym-list{display:flex;flex-direction:column;gap:12px}.gym-card{display:flex;align-items:center;justify-content:space-between;background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:18px 20px}.gym-card:hover{border-color:var(--accent)}.gym-card-name{font-size:17px;font-weight:700}.gym-card-go{color:var(--accent);font-weight:600;font-size:14px}.public-gym-head h2{margin:4px 0 16px}.filter-bar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px;margin-bottom:16px;padding:12px 14px;background:var(--panel);border:1px solid var(--border);border-radius:12px}.filter-group{display:flex;flex-direction:column;gap:4px}.filter-label{font-size:11px;color:var(--muted);white-space:nowrap}.filter-bar-toggle{display:none}.filter-bar select{width:auto;padding:6px 8px}.filter-toggle{display:flex;align-items:center;gap:6px;margin:0;color:var(--text);font-size:14px;cursor:pointer;padding-bottom:6px}.filter-toggle input[type=checkbox]{width:auto;margin:0}.filter-spacer{flex:1 1 auto}.filter-count{color:var(--muted);font-size:13px;padding-bottom:7px}.filter-reset{padding:7px 12px;font-size:13px}.group-switch{display:flex;align-items:center;gap:8px}.group-switch .filter-label{margin:0}.view-switch{display:flex;border:1px solid var(--border);border-radius:8px;overflow:hidden}.view-switch button{border:none;background:transparent;color:var(--muted);padding:6px 12px;font-size:13px;white-space:nowrap}.view-switch button+button{border-left:1px solid var(--border)}.view-switch button.active{background:var(--panel-2);color:var(--text);font-weight:600}.problem-groups{display:flex;flex-direction:column;gap:28px}.problem-group-header{display:flex;align-items:baseline;gap:12px;margin-bottom:12px;padding-bottom:6px;border-bottom:1px solid var(--border)}.problem-group-header h3{margin:0;font-size:15px;font-weight:700}.problem-group-header span{color:var(--muted);font-size:12px;white-space:nowrap}.problem-list{display:flex;flex-direction:column;gap:18px}.problem-list-group{background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden}.problem-list-group-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;background:var(--panel-2);border-bottom:1px solid var(--border)}.problem-list-group-header h3{margin:0;font-size:15px;font-weight:700}.problem-list-group-header span{color:var(--muted);font-size:12px;white-space:nowrap}.problem-table-wrap{overflow-x:auto}.problem-table{width:100%;min-width:816px;border-collapse:collapse;table-layout:fixed}.problem-table td,.problem-table th{padding:10px 12px;border-bottom:1px solid var(--border);text-align:left;vertical-align:middle}.problem-table th{color:var(--muted);font-size:12px;font-weight:700;background:color-mix(in srgb,var(--panel-2) 55%,transparent)}.problem-table td:first-child,.problem-table th:first-child{width:232px}.problem-table td{font-size:13px}.problem-table tbody tr:last-child td{border-bottom:none}.problem-table tbody tr:hover{background:color-mix(in srgb,var(--panel-2) 55%,transparent)}.problem-table-test{box-shadow:inset 3px 0 0 #8b5cf6;background:color-mix(in srgb,#8b5cf6 10%,var(--panel))}.problem-table-link{display:block;min-height:28px;color:inherit;text-decoration:none;overflow-wrap:anywhere}.problem-table-tape-grade{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0;white-space:nowrap}.problem-table-tape-grade .problem-row-tape,.problem-table-tape-grade .symbol-badge{flex-shrink:0}.problem-table-badges{display:flex;align-items:center;flex-wrap:wrap;gap:4px}.problem-table-muted{color:var(--muted);font-size:12px}.problem-table-action{width:78px;text-align:center;white-space:nowrap}.problem-table-open{padding:6px 10px;font-size:12px}.problem-row-grade{flex-shrink:0;min-width:52px;text-align:center;background:var(--panel-2)}.problem-row-tape{display:inline-block;width:72px;max-width:72px;font-size:11px;padding:2px 10px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.problem-row-delete{padding:2px 8px;font-size:12px;opacity:.6;flex-shrink:0}@media (max-width:720px){.problem-table{min-width:676px}.problem-table td,.problem-table th{padding:8px 10px}.app-header{padding:10px 14px}.app-main{padding:12px}.filter-bar-toggle{display:inline-flex;align-items:center;gap:4px;min-height:44px}.filter-bar-collapsed .filter-group,.filter-bar-collapsed .filter-toggle,.filter-bar-collapsed .group-switch,.filter-bar-collapsed>.btn:not(.filter-bar-toggle){display:none}.group-switch,.group-switch .view-switch{flex-wrap:wrap}.filter-bar select{padding:10px 8px}.view-switch button{padding:10px 12px}.filter-toggle{min-height:44px;padding-bottom:0}.climb-box .btn,.viewer-back .btn{padding:11px 16px}}.problem-row{gap:8px;background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:10px 12px}.problem-row,.problem-row-main{display:flex;align-items:center}.problem-row-main{gap:12px;color:inherit;text-decoration:none}.problem-row-body,.problem-row-main{flex:1 1;min-width:0}.problem-row .title{font-weight:600;margin-bottom:2px;overflow-wrap:anywhere}.problem-row .meta{font-size:12px;color:var(--muted)}.problem-row-climb{margin-left:6px}.problem-row-chevron{color:var(--muted);font-size:20px;flex-shrink:0}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));grid-auto-rows:1fr;grid-gap:16px;gap:16px}.card{background:var(--panel);border:1px solid var(--border);border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.card-test{border-color:#8b5cf6;box-shadow:0 0 0 1px #8b5cf6;background:color-mix(in srgb,#8b5cf6 10%,var(--panel))}.card .thumb{aspect-ratio:4/3;background:#000;object-fit:cover;width:100%;display:block}.thumb-link{position:relative;display:block}.thumb-badges{position:absolute;top:8px;left:8px;display:flex;align-items:center;gap:6px}.grade-badge{padding:3px 10px;border:1.5px solid var(--muted);border-radius:8px;background:rgba(15,17,21,.82);font-size:15px;font-weight:800;line-height:1.2;letter-spacing:.02em;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.tape-badge{padding:3px 12px;border-radius:1px;font-size:13px;font-weight:700;line-height:1.2;letter-spacing:.04em;transform:rotate(-3deg);opacity:.95;filter:drop-shadow(0 1px 2px rgba(0,0,0,.4));-webkit-clip-path:polygon(0 0,100% 0,97% 25%,100% 50%,97% 75%,100% 100%,0 100%,3% 75%,0 50%,3% 25%);clip-path:polygon(0 0,100% 0,97% 25%,100% 50%,97% 75%,100% 100%,0 100%,3% 75%,0 50%,3% 25%)}.symbol-badge{padding:3px 10px;border:1.5px solid hsla(0,0%,100%,.85);border-radius:8px;background:rgba(15,17,21,.82);color:#f3f4f6;font-size:14px;font-weight:800;line-height:1.2;letter-spacing:.02em;white-space:nowrap;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.card .body{padding:12px;flex:1 1;display:flex;flex-direction:column}.card .title{font-weight:600;margin-bottom:6px}.badge-draft{background:#f59e0b;color:#3b2600;border-radius:6px}.badge-draft,.badge-unpublished{display:inline-block;font-size:11px;font-weight:700;padding:2px 6px;margin-right:6px;vertical-align:middle}.badge-unpublished{background:var(--panel-2);color:var(--muted);border:1px solid var(--border);border-radius:6px}.badge-scheduled{display:inline-block;background:#0ea5e9;color:#04283a;font-size:11px;font-weight:700;padding:2px 6px;border-radius:6px;margin-right:6px;vertical-align:middle}.card .meta{font-size:12px;color:var(--muted)}.card .meta-placeholder{opacity:.55}.rule-chips{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}.rule-chip{font-size:11px;color:var(--text);background:var(--panel-2);border:1px solid var(--border);border-radius:999px;padding:1px 8px}.badge-test{display:inline-block;background:#8b5cf6;color:#fff;font-size:11px;font-weight:700;padding:2px 6px;border-radius:6px;margin-right:6px;vertical-align:middle}.empty{color:var(--muted);padding:40px;text-align:center}.editor{display:grid;grid-template-columns:1fr 320px;grid-gap:20px;gap:20px;align-items:start}@media (max-width:900px){.editor{grid-template-columns:1fr}}.canvas-wrap{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:8px;overflow:hidden;display:flex;justify-content:center}.canvas-wrap canvas{display:block;max-width:100%;width:auto;height:auto;max-height:calc(100vh - 140px);border-radius:6px;cursor:crosshair;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-touch-callout:none}.canvas-wrap canvas.readonly{cursor:default}.viewer{display:grid;grid-template-columns:minmax(0,1fr) 320px;grid-gap:20px;gap:20px;align-items:start}@media (max-width:900px){.viewer{grid-template-columns:1fr}}.viewer-back{grid-column:1/-1;align-self:start;display:flex;gap:8px}.viewer-info{display:flex;flex-direction:column;gap:10px}.viewer-info-sub{margin:0;font-size:15px;font-weight:500;color:var(--text)}.viewer-info-meta{display:flex;flex-wrap:wrap;gap:4px 16px;font-size:14px}.viewer-info-meta .hint{font-size:14px}.viewer-legend{display:flex;flex-wrap:wrap;gap:8px 16px;font-size:13px}.viewer-legend-row{display:flex;align-items:center;gap:8px}@media (pointer:coarse){.canvas-wrap canvas{width:100%;max-height:none}}@media (pointer:coarse) and (min-width:901px){.viewer .canvas-wrap canvas{width:auto;max-width:100%;max-height:calc(100vh - 140px)}}.sidebar{display:flex;flex-direction:column;gap:16px}.panel{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:14px}.panel h3{margin:0 0 10px;font-size:14px}.role-buttons{display:flex;flex-wrap:wrap;gap:6px}.role-btn{border:1px solid var(--border);background:var(--panel-2);color:var(--text);border-radius:999px;padding:6px 12px;font-size:13px}.role-btn.active{border-width:2px;font-weight:700}.role-group{margin-bottom:10px}.role-group:last-child{margin-bottom:0}.role-group-toggles{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:8px}.role-group-open{margin-top:8px}.role-group-toggle{display:flex;align-items:center;gap:4px;width:auto;padding:2px 0;border:none;background:none;color:var(--muted);font-size:11px;font-weight:700;cursor:pointer}.role-group-caret{font-size:9px;line-height:1}.rule-checks{display:flex;flex-wrap:wrap;gap:4px 12px}.rule-check{display:inline-flex;align-items:center;gap:4px;font-size:13px;white-space:nowrap}.rule-check input[type=checkbox]{width:16px;height:16px}.hold-list{display:flex;flex-direction:column;gap:6px;max-height:180px;overflow-y:auto}.hold-row{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:6px 8px;border:1px solid var(--border);border-radius:8px;font-size:13px}.hold-cond{width:100%;display:flex;gap:6px;padding-left:30px}.hold-cond input[type=number]{width:80px;flex:0 0 auto}.hold-cond select{width:auto;flex:0 0 auto}.hold-badge{width:22px;height:22px;border-radius:6px;display:grid;place-items:center;font-size:11px;font-weight:700;color:#000;flex-shrink:0}.hold-row .grow{flex:1 1}.hold-row .count-select{width:auto;flex:0 0 auto;padding:6px}.hold-row .del{color:var(--muted);background:none;border:none;font-size:16px}.hint{font-size:12px;color:var(--muted);line-height:1.5}.danger-zone{display:flex;justify-content:space-between;margin-top:40px;padding-top:12px;border-top:1px dashed var(--border)}.tiny-btn{background:transparent;border:1px solid var(--border);color:var(--muted);font-size:12px;padding:4px 10px;border-radius:6px;opacity:.6}.tiny-btn:hover{opacity:1}.tiny-btn:disabled{opacity:.25;cursor:not-allowed}.tiny-danger{color:var(--danger);border-color:var(--danger)}.toolbar{display:flex;gap:8px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.status{font-size:13px;color:var(--muted)}.error{color:var(--danger);font-size:13px}.uploader{border:2px dashed var(--border);border-radius:12px;padding:48px 20px;text-align:center;color:var(--muted)}.past-images{margin-top:8px;text-align:left}.past-image-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));grid-gap:10px;gap:10px;margin-top:8px}.past-image-item{padding:0;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#000;cursor:pointer;transition:border-color .15s}.past-image-item:hover:not(:disabled){border-color:var(--accent,#4a9eff)}.past-image-item:disabled{opacity:.5;cursor:default}.past-image-item img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover}.past-image-date{display:block;padding:3px 6px;font-size:11px;line-height:1.3;color:#ccc;background:#000;text-align:center}.climb-card-badge{position:absolute;top:8px;right:8px;display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#06210f;font-size:14px;font-weight:700}.climb-summary-row{display:flex;align-items:center;flex-wrap:wrap;gap:8px 16px;margin:-8px 0 16px}.climb-summary{margin:0;color:var(--accent);font-weight:600}.climb-transfer-btn{padding:4px 10px;font-size:13px}.modal-overlay{position:fixed;inset:0;z-index:100;align-items:center;justify-content:center;padding:16px;background:rgba(0,0,0,.6)}.modal,.modal-overlay{display:flex;overscroll-behavior:contain}.modal{width:100%;max-width:520px;max-height:90vh;overflow-y:auto;flex-direction:column;gap:12px}.wall-region-modal{max-width:720px}.wall-region-toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.wall-region-canvas{display:flex;justify-content:center}.wall-region-stage{position:relative}.wall-region-stage img{display:block;max-width:100%;max-height:55vh;width:auto;height:auto;border-radius:8px;-moz-user-select:none;user-select:none;-webkit-user-select:none}.wall-region-stage svg{position:absolute;inset:0;width:100%;height:100%;touch-action:none;cursor:crosshair}.wall-region-shape{fill:rgba(59,130,246,.18);stroke:#3b82f6;stroke-width:3px;vector-effect:non-scaling-stroke}.wall-region-drag{fill:rgba(59,130,246,.3);stroke-dasharray:6 4}.wall-region-label{fill:#fff;font-weight:700;paint-order:stroke;stroke:rgba(0,0,0,.6);stroke-width:4px;pointer-events:none}.wall-region-chips{display:flex;flex-wrap:wrap;gap:6px}.wall-region-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 10px;border-radius:999px;background:var(--panel-2);border:1px solid var(--border);font-size:13px}.wall-region-chip button{border:none;background:none;color:var(--muted);cursor:pointer;font-size:14px;padding:0 2px}.measure-modal{max-width:min(1100px,96vw);width:min(1100px,96vw)}.measure-modal .wall-region-stage img{max-height:74vh}.measure-toolbar{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:8px}.measure-approx{color:var(--warning,#d97706)}.measure-calibrate-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px}.measure-calibrate-row label{display:inline-flex;align-items:center;gap:6px}.measure-calibrate-row input{width:90px}.measure-result{margin-top:10px;font-size:15px}.measure-result strong{font-size:18px}.measure-line{fill:#f97316;stroke:#f97316;vector-effect:non-scaling-stroke}.measure-calib{fill:#3b82f6}.measure-calib,.measure-quad{stroke:#3b82f6;stroke-dasharray:8 5;opacity:.85;vector-effect:non-scaling-stroke}.measure-quad{fill:rgba(59,130,246,.08)}.measure-label{fill:#fff;font-weight:700;paint-order:stroke;stroke:rgba(0,0,0,.7);stroke-width:4px;pointer-events:none}.wall-recog-row{display:flex;align-items:center;gap:8px;margin-top:6px;flex-wrap:wrap}.image-wall-card .image-wall-info{display:flex;align-items:center;gap:6px;padding:4px 6px;background:#000;text-align:left}.image-wall-source{flex:none;padding:1px 6px;border-radius:999px;font-size:10px;line-height:1.4;color:#fff;background:#555}.image-wall-source-manual{background:#2e7d32}.image-wall-source-auto{background:#1565c0}.image-wall-names{font-size:11px;line-height:1.3;color:#eee;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-nav-qr{opacity:.55;font-size:12px;padding-left:8px;padding-right:8px}.btn-nav-qr:hover{opacity:1}.qr-modal{max-width:420px;align-items:center;text-align:center}.qr-frame{background:#fff;padding:12px;border-radius:12px;box-shadow:0 1px 3px rgba(0,0,0,.2)}.qr-svg{display:block;width:min(70vw,260px);height:min(70vw,260px)}.qr-url{font-size:12px;color:var(--muted);word-break:break-all;max-width:100%}.transfer-section{gap:6px}.transfer-label,.transfer-section{display:flex;flex-direction:column}.transfer-label{font-size:13px;font-weight:600;gap:4px}.transfer-code-row{display:flex;align-items:stretch;gap:8px}.transfer-code-row input{flex:1 1;min-width:0}.transfer-code{flex:1 1;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--panel-2);font-size:13px;overflow-x:auto;white-space:nowrap}.transfer-close-row{display:flex;justify-content:flex-end;gap:8px}.merge-page,.settings-page{max-width:640px}.settings-page{display:flex;flex-direction:column;gap:16px}.settings-page h2{margin:0}.merge-form{display:flex;flex-direction:column;gap:14px}.merge-actions{display:flex;gap:8px}.merge-search-table{width:100%;border-collapse:collapse;font-size:13px}.merge-search-table td,.merge-search-table th{padding:6px 8px;border-bottom:1px solid var(--border);text-align:left;white-space:nowrap}.merge-search-table .transfer-code{display:block;max-width:180px}.merge-pager{display:flex;gap:8px;align-items:center;margin-top:8px}.climb-panel{display:flex;flex-direction:column;gap:10px}.climb-box{display:flex;align-items:center;flex-wrap:wrap;gap:8px 12px}.viewer-climbers{grid-column:1/-1}.viewer-climbers h3{margin:0 0 10px}.viewer-climbers ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.viewer-climbers li{display:flex;align-items:center;flex-wrap:wrap;gap:4px 12px;padding:8px 4px;border-top:1px solid var(--border)}.viewer-climbers-name{font-weight:600}.viewer-climbers-flash{color:var(--accent);font-size:13px}.climb-done{font-weight:600;color:var(--accent)}.climb-flash-btn.active{border-color:var(--accent);color:var(--accent)}.climb-error{color:var(--danger)}.canvas-stack{position:relative}.canvas-stack .annotation-canvas{position:absolute;left:0;top:0;width:100%;height:100%;max-width:none;max-height:none}.canvas-stack .annotation-canvas.drawing{touch-action:none;cursor:crosshair;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-touch-callout:none}.canvas-stack .annotation-canvas.viewing{pointer-events:none}.canvas-stack .annotation-text-input{position:absolute;z-index:5;margin:0;padding:0;border:1px dashed hsla(0,0%,100%,.7);border-radius:2px;background:rgba(0,0,0,.25);font-family:sans-serif;white-space:pre;overflow:hidden;resize:none;min-width:3em;min-height:1.2em;outline:none;caret-color:currentColor}.annotation-bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:10px 14px}.annotation-bar .tiny-btn.active{opacity:1;color:var(--text);border-color:var(--accent)}.annotation-title-input{width:160px;flex:0 1 auto;padding:6px 10px}.color-swatch{width:26px;height:26px;border-radius:50%;border:2px solid hsla(0,0%,100%,.25);padding:0}.color-swatch.active{border-color:var(--text);box-shadow:0 0 0 2px var(--accent)}.annotation-history{display:flex;flex-direction:column;gap:6px}.annotation-history-row{display:flex;align-items:center;gap:8px}.annotation-history-row .hint{flex:1 1}.staff-comment-panel{display:flex;flex-direction:column;gap:6px}.staff-comment-head{font-weight:600;font-size:14px}.staff-comment-body{margin:0;white-space:pre-wrap;word-break:break-word;line-height:1.6}.internal-comment-panel{border-left:3px solid var(--warning,#d99a00);padding-left:10px}.video-panel{display:flex;flex-direction:column;gap:12px}.video-panel-head{justify-content:space-between}.video-add,.video-panel-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.video-add{flex:1 1;justify-content:flex-end}.video-add input{flex:1 1 220px;max-width:420px;padding:6px 10px}.video-embeds{display:flex;flex-wrap:wrap;gap:16px}.video-embed-item{display:flex;flex-direction:column;gap:6px}.video-embed-item iframe{width:min(340px,calc(100vw - 64px));height:600px;border:1px solid var(--border);border-radius:10px;background:#fff}.video-embed-actions{display:flex;align-items:center;justify-content:space-between;gap:8px}.video-url-list{display:flex;flex-direction:column;gap:4px;margin-bottom:6px}.video-url-item{display:flex;align-items:center;gap:6px;font-size:12px}.video-url-item a{flex:1 1;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tag-list{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}.tag-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;border:1px solid var(--border);background:rgba(26,29,36,.6);font-size:12px;color:var(--text)}.tag-chip-remove{border:none;background:none;color:var(--muted);font-size:14px;line-height:1;padding:0;cursor:pointer}.tag-chip-remove:hover{color:var(--text)}.video-url-row{display:flex;align-items:center;gap:6px}.video-url-row input{flex:1 1;min-width:0}.canvas-tools{position:fixed;right:10px;bottom:calc(10px + env(safe-area-inset-bottom, 0px));display:flex;gap:8px;z-index:20;padding:6px;border:1px solid var(--border);border-radius:999px;background:rgba(15,17,21,.75);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.canvas-tool{width:44px;height:44px;border-radius:50%;border:1px solid var(--border);background:rgba(26,29,36,.85);font-size:20px;line-height:1;display:flex;align-items:center;justify-content:center;color:var(--text);box-shadow:0 2px 8px rgba(0,0,0,.35)}.canvas-tool.active{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 45%,transparent)}.canvas-tool:disabled{opacity:.35;cursor:not-allowed}.canvas-tools.hidden{display:none}.canvas-tool-save{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 30%,rgba(26,29,36,.85))}.canvas-wrap.fullscreen{position:fixed;inset:0;height:100dvh;z-index:40;padding:0;border:none;border-radius:0;background:#000;align-items:center}.canvas-wrap.fullscreen canvas:not(.annotation-canvas){width:auto;max-width:100vw;max-height:100vh;max-height:100dvh;border-radius:0}.canvas-wrap.fullscreen .canvas-tools{flex-direction:column;align-items:flex-end}.annotation-bar-float{position:fixed;left:12px;right:auto;bottom:calc(12px + env(safe-area-inset-bottom, 0px));width:max-content;max-width:min(88vw,420px);padding:8px 10px;gap:6px;z-index:45}.annotation-drag-handle{display:inline-flex;align-items:center;justify-content:center;align-self:stretch;min-width:22px;margin-right:2px;color:var(--muted,#9aa4b2);font-size:18px;line-height:1;cursor:-webkit-grab;cursor:grab;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.annotation-drag-handle:active{cursor:-webkit-grabbing;cursor:grabbing}.annotation-bar-float .annotation-title-input{width:110px}.sidebar .video-embed-item{flex:1 1 100%}.sidebar .video-embed-item iframe{width:100%}.print-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0 auto 16px;max-width:210mm}.print-toolbar .print-title-input{width:auto;flex:1 1 12em;max-width:20em;padding:6px 10px}.print-page{width:210mm;min-height:296mm;margin:0 auto 16px;padding:10mm;background:#fff;color:#111;display:flex;flex-direction:column;gap:5mm;box-shadow:0 2px 12px rgba(0,0,0,.45)}.print-head{display:flex;align-items:center;gap:6mm;border-bottom:.6mm solid #111;padding-bottom:3mm}.print-head-main{flex:1 1;min-width:0}.print-title{margin:0;font-size:26px;line-height:1.25}.print-head-sub{display:flex;flex-wrap:wrap;align-items:center;gap:4mm;margin-top:2mm;font-size:16px;font-weight:600}.print-symbol{justify-content:center;min-width:16mm;padding:1.5mm 3mm;border:.8mm solid #111;border-radius:3mm;font-size:24px;white-space:nowrap}.print-grade,.print-symbol{display:inline-flex;align-items:center;font-weight:800}.print-grade{padding:.5mm 2.5mm;border:.5mm solid #111;border-radius:2mm}.print-tape{display:inline-flex;align-items:center;gap:1.5mm}.print-tape-chip{width:4.5mm;height:4.5mm;border-radius:50%;border:.4mm solid #111;display:inline-block}.print-gym-name{font-size:13px;color:#444;white-space:nowrap;align-self:flex-start}.print-logo{height:12mm;width:auto;flex:0 0 auto}.print-photo{flex:1 1;min-height:0;display:flex;align-items:center;justify-content:center}.print-photo canvas{max-width:100%;max-height:200mm;width:auto;height:auto}.print-foot{display:flex;align-items:flex-end;justify-content:space-between;gap:6mm;border-top:.3mm solid #999;padding-top:3mm}.print-meta{display:flex;flex-direction:column;gap:1.5mm;font-size:13px}.print-staff-comment{white-space:pre-wrap;word-break:break-word}.print-legend{display:flex;flex-wrap:wrap;gap:3mm;margin-top:1mm}.print-legend-item{display:inline-flex;align-items:center;gap:1.5mm;font-size:12px}.print-legend-badge{display:inline-flex;align-items:center;justify-content:center;min-width:6mm;height:6mm;padding:0 1mm;border-radius:3mm;border:.6mm solid #111;background:#fff;color:#111;font-size:11px;font-weight:800}.print-qr{display:flex;flex-direction:column;align-items:center}.print-qr-svg{width:26mm;height:26mm}.print-sheet-page{min-height:auto}.print-sheet-head{display:flex;align-items:center;gap:3mm;border-bottom:.6mm solid #111;padding-bottom:2mm;font-size:15px;font-weight:700}.print-sheet-head .print-sheet-count{margin-left:auto}.print-sheet-head .print-logo{height:9mm}.print-sheet-list-qr .print-qr-svg{display:block;width:16mm;height:16mm}.print-sheet{display:table;table-layout:fixed;border-spacing:4mm;margin:-4mm;width:calc(100% + 8mm)}.print-sheet-row{display:table-row}.print-cell,.print-sheet-row{break-inside:avoid;page-break-inside:avoid}.print-cell{display:table-cell;vertical-align:top;border:.4mm solid #999;border-radius:2mm;padding:3mm}.print-cell-empty{border:none;padding:0}.print-cell-photo{text-align:center;margin-bottom:2mm}.print-cell-photo canvas{max-width:100%;max-height:88mm;width:auto;height:auto;display:inline-block}.print-cell-body{display:flex;align-items:flex-start;gap:2mm}.print-cell-body .print-cell-info{flex:1 1;min-width:0}.print-cell-qr .print-qr-svg{width:15mm;height:15mm}.print-cell-info{display:flex;flex-direction:column;gap:1mm}.print-cell-title{display:flex;flex-wrap:wrap;align-items:center;gap:2.5mm;font-size:14px;font-weight:700}.print-cell-title .print-symbol{min-width:9mm;padding:.5mm 2mm;font-size:15px;border-width:.5mm}.print-cell-sub{font-size:12px;color:#333}.grade-table{width:100%;border-collapse:collapse;margin-top:16px;color:#111}.grade-table td,.grade-table th{border:1px solid #111;padding:10px 14px;font-size:18px}.grade-table th{background:#f3f4f6;font-weight:700;text-align:center;font-size:15px}.grade-table-name{font-weight:700}.grade-table-num{text-align:center;width:1%;white-space:nowrap}.grade-table-color-col{width:72px;text-align:center}.grade-table-swatch{display:inline-block;width:44px;height:24px;border-radius:4px;border:1px solid rgba(0,0,0,.3);vertical-align:middle}.grade-table-note{margin-top:10px;font-size:12px;color:#555}@media print{@page{size:A4 portrait;margin:8mm}.app-header,.print-toolbar{display:none!important}body{background:#fff}.app-main{padding:0;max-width:none}.print-page{width:auto;min-height:auto;margin:0;padding:0;box-shadow:none;page-break-after:always;break-after:page;display:block}.print-head,.print-sheet-head{margin-bottom:4mm}.print-foot{margin-top:4mm}.print-page:last-child{page-break-after:auto;break-after:auto}.print-photo canvas{max-height:195mm}.grade-table tr{page-break-inside:avoid;break-inside:avoid}.print-root *{-webkit-print-color-adjust:exact;print-color-adjust:exact}}.card{position:relative}.card-select{position:absolute;top:8px;left:8px;z-index:3;display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:8px;background:rgba(15,17,21,.72);border:1px solid var(--border);cursor:pointer}.card-select input{width:20px;height:20px;cursor:pointer;accent-color:var(--accent)}.card-selected{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent)}.problem-table-check{width:32px;text-align:center}.problem-table-check input{width:18px;height:18px;accent-color:var(--accent)}.problem-table-selected{background:color-mix(in srgb,var(--accent) 12%,transparent)}.card-viewed{box-shadow:0 0 0 2px color-mix(in srgb,#f59e0b 50%,transparent)}.problem-table-viewed{background:color-mix(in srgb,#f59e0b 12%,transparent)}.social-actionbar{position:-webkit-sticky;position:sticky;bottom:12px;z-index:20;margin-top:20px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:12px 16px;border-radius:12px;background:var(--panel-2);border:1px solid var(--border);box-shadow:0 8px 24px rgba(0,0,0,.4)}.social-actionbar-count{font-weight:700;margin-right:auto}.social-modal{max-width:900px}.social-modal-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.social-modal-head h3{margin:0}.social-modal-close{padding:4px 10px}.social-modal-body{display:flex;gap:20px;flex-wrap:wrap}.social-modal-controls{flex:1 1 300px;min-width:260px;display:flex;flex-direction:column;gap:16px}.social-field{display:flex;flex-direction:column;gap:8px}.social-field>label{font-size:13px;color:var(--muted);font-weight:600}.social-format-grid{display:grid;grid-template-columns:1fr 1fr;grid-gap:8px;gap:8px}.social-format{display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:10px 12px;border-radius:10px;border:1px solid var(--border);background:var(--panel-2);cursor:pointer;text-align:left}.social-format.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.social-format-label{font-weight:700}.social-format-note{font-size:12px;color:var(--muted)}.social-title-input{padding:10px 12px;border-radius:8px;border:1px solid var(--border);background:var(--panel-2);color:var(--text);font-size:15px}.social-selected-note{margin:0;color:var(--muted);font-size:14px}.social-error{margin:0;color:#f87171;font-size:14px}.social-download{margin-top:auto;padding:12px 16px;font-size:16px;font-weight:700}.social-preview-wrap{flex:1 1 300px;min-width:240px;display:flex;flex-direction:column;align-items:center;gap:8px}.social-preview-box{position:relative;width:100%;min-height:200px;display:flex;align-items:center;justify-content:center;background:repeating-conic-gradient(#1a1d24 0 25%,#15181f 0 50%) 50% /24px 24px;border-radius:12px;border:1px solid var(--border);padding:12px}.social-preview-canvas{max-width:100%;max-height:62vh;border-radius:8px;box-shadow:0 6px 20px rgba(0,0,0,.5)}.social-preview-loading{position:absolute;color:var(--muted);font-size:14px}.social-preview-caption{margin:0;color:var(--muted);font-size:12px}