PageSourceSearch

https://kaitorix.app/login

html kaitorix.app collected 2026-10-01 13:06:57 UTC 30,792 bytes, 325 lines download raw bytes

1<!DOCTYPE html>
2<html lang="ja"><head>
3<meta charset="UTF-8">
4<meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
5<meta name="robots" content="noindex,nofollow">
6<meta name="theme-color" content="#0a0e27">
7<title>ログイン - 買取X</title>
8<link rel="icon" type="image/svg+xml" href="/images/kaitorix-icon.svg">
9<link rel="preload" href="/fonts/css2.css?family=Noto+Sans+JP:wght@400;500;700;800&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'">
10<noscript><link rel="stylesheet" href="/fonts/css2.css?family=Noto+Sans+JP:wght@400;500;700;800&display=swap"></noscript>
11<style>
12*{margin:0;padding:0;box-sizing:border-box;}
13html,body{height:100%;}
14body{font-family:'Noto Sans JP','-apple-system',BlinkMacSystemFont,sans-serif;color:#0F172A;background:#F8FAFC;overflow-x:hidden;}
15.split{display:grid;grid-template-columns:minmax(440px,46%) 1fr;min-height:100vh;min-height:100dvh;}
16
17
18.bp{position:relative;overflow:hidden;background:#0a0e27;color:#fff;display:flex;flex-direction:column;padding:40px 56px 44px;}
19.bp::before{content:'';position:absolute;inset:0;background:
20  radial-gradient(ellipse 720px 520px at 18% 8%, rgba(37,99,235,0.38) 0%, transparent 62%),
21  radial-gradient(ellipse 640px 520px at 88% 96%, rgba(14,165,233,0.26) 0%, transparent 62%);}
22.bp::after{content:'';position:absolute;inset:0;background-image:radial-gradient(rgba(255,255,255,0.05) 1px, transparent 1px);background-size:26px 26px;}
23.bp>*{position:relative;z-index:1;}
24.bp-brand{display:inline-flex;align-items:center;gap:11px;text-decoration:none;color:#fff;font-weight:800;font-size:19px;letter-spacing:-.01em;width:fit-content;}
25.bp-brand img{width:36px;height:36px;border-radius:9px;box-shadow:0 4px 16px rgba(37,99,235,.45);}
26.bp-body{flex:1;display:flex;flex-direction:column;justify-content:center;max-width:460px;padding:48px 0;}
27.bp h2{font-size:clamp(26px,2.6vw,36px);font-weight:800;line-height:1.4;letter-spacing:-.02em;margin-bottom:14px;}
28.bp h2 em{font-style:normal;background:linear-gradient(90deg,#7DD3FC,#60A5FA);-webkit-background-clip:text;background-clip:text;color:transparent;}
29.bp-sub{font-size:14.5px;line-height:1.9;color:rgba(226,232,240,.78);margin-bottom:34px;}
30.feat{display:flex;align-items:flex-start;gap:14px;padding:13px 0;}
31.feat+.feat{border-top:1px solid rgba(148,163,184,.14);}
32.feat-ic{flex:0 0 auto;width:40px;height:40px;border-radius:11px;background:rgba(56,132,255,.16);border:1px solid rgba(96,165,250,.25);display:flex;align-items:center;justify-content:center;color:#7DD3FC;}
33.feat b{display:block;font-size:14.5px;font-weight:700;margin-bottom:2px;}
34.feat span{font-size:12.5px;color:rgba(203,213,225,.68);line-height:1.65;}
35.bp-stats{display:flex;gap:36px;padding-top:26px;border-top:1px solid rgba(148,163,184,.16);}
36.stat b{display:block;font-size:24px;font-weight:800;font-variant-numeric:tabular-nums;letter-spacing:-.01em;}
37.stat b i{font-style:normal;font-size:13px;font-weight:700;color:#7DD3FC;margin-left:2px;}
38.stat span{font-size:11.5px;color:rgba(203,213,225,.62);}
39
40
41.ap{position:relative;display:flex;flex-direction:column;background:#F8FAFC;}
42.ap::before{content:'';position:absolute;inset:0;background-image:radial-gradient(rgba(15,23,42,0.04) 1px, transparent 1px);background-size:22px 22px;mask-image:radial-gradient(ellipse at 50% 45%, black 0%, transparent 75%);-webkit-mask-image:radial-gradient(ellipse at 50% 45%, black 0%, transparent 75%);pointer-events:none;}
43.ap-top{display:flex;justify-content:flex-end;padding:20px 28px 0;}
44.back{position:relative;z-index:1;font-size:13px;color:#64748B;text-decoration:none;display:inline-flex;align-items:center;gap:6px;padding:9px 14px;border-radius:9px;transition:background-color .15s ease,color .15s ease;}
45.back:hover{background:#EFF6FF;color:#2563EB;}
46.ap-main{flex:1;display:flex;align-items:center;justify-content:center;padding:20px 24px 32px;}
47.box{position:relative;z-index:1;width:100%;max-width:400px;animation:boxIn .4s cubic-bezier(.16,1,.3,1) both;}
48@keyframes boxIn{from{opacity:0;transform:translateY(14px);}to{opacity:1;transform:none;}}
49@media (prefers-reduced-motion: reduce){.box{animation:none;}}
50h1{font-size:24px;font-weight:800;letter-spacing:-.015em;margin-bottom:8px;}
51.lead{font-size:14px;line-height:1.8;color:#64748B;margin-bottom:28px;}
52.btn{display:flex;align-items:center;justify-content:center;gap:12px;width:100%;min-height:52px;padding:14px 20px;border-radius:13px;font-weight:700;font-size:15px;text-decoration:none;margin-bottom:13px;border:1px solid transparent;
52transition:box-shadow .18s ease,background-color .18s ease,filter .18s ease,transform .18s ease;cursor:pointer;}
53.btn:active{transform:scale(.985);}
54.btn svg{flex:0 0 auto;display:block;}
55.btn:focus-visible{outline:2px solid #2563EB;outline-offset:2px;}
56.btn-google{background:#fff;color:#3C4043;border-color:#DADCE0;box-shadow:0 1px 2px rgba(15,23,42,.05);}
57.btn-google:hover{background:#FDFDFE;box-shadow:0 3px 10px rgba(60,64,67,.14);}
58.btn-pk{background:#fff;color:#0F172A;border-color:#CBD5E1;box-shadow:0 1px 2px rgba(15,23,42,.05);}
59.btn-pk:hover{background:#F8FAFC;box-shadow:0 3px 10px rgba(15,23,42,.10);}
60.btn-pk:disabled{opacity:.55;cursor:default;transform:none;}
61.pk-err{margin:-4px 0 12px;font-size:13px;line-height:1.7;color:#DC2626;}
62.btn-line{background:#06C755;color:#fff;border-color:#06C755;box-shadow:0 1px 2px rgba(6,199,85,.25);}
63.btn-line:hover{filter:brightness(1.05);box-shadow:0 3px 12px rgba(6,199,85,.32);}
64.alt{display:flex;align-items:center;justify-content:center;width:fit-content;min-height:44px;margin:-5px auto 0;padding:0 12px;border-radius:8px;font-size:13px;color:#64748B;text-decoration:underline;text-decoration-color:#CBD5E1;text-underline-offset:3px;transition:color .15s ease,text-decoration-color .15s ease;}
65.alt:hover{color:#2563EB;text-decoration-color:currentColor;}
66.alt:focus-visible{outline:2px solid #2563EB;outline-offset:2px;}
67.perks{display:flex;justify-content:center;flex-wrap:wrap;column-gap:20px;row-gap:8px;margin-top:22px;padding-top:20px;border-top:1px solid #E8EEF5;}
68.perk{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:#64748B;white-space:nowrap;}
69.perk svg{color:#059669;flex:0 0 auto;}
70.note{font-size:11.5px;color:#94A3B8;line-height:1.8;margin-top:18px;text-align:center;}
71
72.line-note{font-size:12px;color:#64748B;line-height:1.75;margin:4px 0 0;text-align:left;}
73.btn-sm{min-height:46px;padding:11px 18px;margin-bottom:10px;font-size:14.5px;border-radius:12px;}
74.kx-or{display:flex;align-items:center;gap:12px;margin:22px 0 16px;color:#94A3B8;font-size:12px;}
75.kx-or::before,.kx-or::after{content:'';flex:1;height:1px;background:#E2E8F0;}
76.switch{margin-top:18px;text-align:center;font-size:13px;color:#64748B;}
77.note a{color:#0284C7;}
78.ap-foot{position:relative;z-index:1;text-align:center;padding:0 16px 24px;font-size:12px;color:#94A3B8;}
79.ap-foot a{color:#94A3B8;text-decoration:none;margin:0 9px;white-space:nowrap;}
80.ap-foot a:hover{color:#2563EB;}
81
82
83@media (max-width:1023px){
84  .split{grid-template-columns:1fr;min-height:100dvh;}
85  .bp{padding:calc(16px + env(safe-area-inset-top)) 22px 22px;}
86  .bp-body{padding:22px 0 2px;max-width:none;}
87  .bp h2{font-size:22px;line-height:1.45;margin-bottom:8px;}
88  .bp-sub{font-size:13px;margin-bottom:0;}
89  .feat,.bp-stats{display:none;}
90  .email-mode .bp-body{display:none;}
91  .email-mode .bp{padding-bottom:14px;}
92  .split.email-mode{grid-template-rows:auto 1fr;}  
93  .ap-top{padding:14px 16px 0;}
94  .ap-main{align-items:flex-start;padding:8px 20px 24px;}
95  .box{max-width:440px;margin:0 auto;}
96  h1{font-size:21px;}
97  .lead{font-size:13.5px;margin-bottom:22px;}
98  .ap-foot{padding-bottom:calc(20px + env(safe-area-inset-bottom));}
99}
100</style>
101</head><body>
102<div class="split email-mode">
103  <aside class="bp">
104    <a class="bp-brand" href="/"><img src="/images/kaitorix-icon.svg" alt="">買取X</a>
105    <div class="bp-body">
106      <h2>買取価格を、<em>賢く比較</em>。</h2>
107      <p class="bp-sub">38店舗の買取価格を24時間自動で更新。最高値で売れるお店がひと目でわかります。</p>
108      <div class="feat">
109        <div class="feat-ic"><svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg></div>
110        <div><b>38店舗を横断比較</b><span>JANコード検索・バーコードスキャンで最高買取価格を即チェック</span></div>
111      </div>
112      <div class="feat">
113        <div class="feat-ic"><svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg></div>
114        <div><b>お気に入り &amp; 在庫速報</b><span>気になる商品をフォローして値動き・入荷をいち早くキャッチ</span></div>
115      </div>
116      <div class="feat">
117        <div class="feat-ic"><svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><line x1="3" y1="9" x2="21" y2="9"/><line x1="9" y1="21" x2="9" y2="9"/></svg></div>
118        <div><b>売買管理・Open API</b><span>仕入れ・売却の記録から利益計算、データ活用までç„
118¡æ–™ã§</span></div>
119      </div>
120      <div class="bp-stats" style="margin-top:30px">
121        <div class="stat"><b>38</b><span>買取店舗</span></div>
122        <div class="stat"><b>270,528<i>+</i></b><span>掲載商品</span></div>
123        <div class="stat"><b>24時間</b><span>自動で価格更新</span></div>
124      </div>
125    </div>
126  </aside>
127  <section class="ap">
128    <div class="ap-top">
129      <a class="back" href="/"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 18 9 12 15 6"/></svg>サイトに戻る</a>
130    </div>
131    <div class="ap-main">
132      <div class="box">
133        
133<script src="/js/kx-passkey.js?v=2"></script>
133
134<style>
135.kx-em{display:flex;flex-direction:column}
136.kx-em h1{margin-bottom:18px}
137.kx-em h1+.kx-lede{margin-top:-12px}
138.kx-em .kx-lede{margin:0 0 18px;font-size:13.5px;line-height:1.75;color:#64748B}
139.kx-em .kx-f{display:flex;flex-direction:column;gap:6px}
140.kx-em label{font-size:13px;font-weight:600;color:#334155}
141.kx-lrow{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-top:10px}
142.kx-in{width:100%;min-height:48px;padding:12px 14px;border:1px solid #CBD5E1;border-radius:11px;background:#fff;
143  color:#0F172A;font:inherit;font-size:16px}  
144.kx-in:focus-visible{outline:2px solid #2563EB;outline-offset:1px;border-color:transparent}
145.kx-in[aria-invalid="true"]{border-color:#DC2626}
146.kx-code{font-family:ui-monospace,Menlo,monospace;font-size:20px;letter-spacing:.3em}
147.kx-pw{position:relative}.kx-pw .kx-in{padding-right:52px}
148.kx-eye{position:absolute;top:0;bottom:0;right:0;width:48px;display:flex;align-items:center;justify-content:center;
149  background:none;border:0;color:#64748B;cursor:pointer;border-radius:0 11px 11px 0}
150.kx-eye:hover,.kx-eye[aria-pressed="true"]{color:#0F172A}
151.kx-eye:focus-visible{outline:2px solid #2563EB;outline-offset:-2px}
152.kx-hint{margin:0;font-size:12px;color:#64748B}.kx-hint.bad{color:#DC2626}
153.kx-err{margin:4px 0 0;font-size:13px;line-height:1.7;color:#DC2626}
154.btn-mail{background:#0F172A;color:#fff;border-color:#0F172A;margin:14px 0 0}
155.btn-mail:hover{filter:brightness(1.15)}
156.btn-mail:disabled{opacity:.5;cursor:default;transform:none}
157.kx-lnk{background:none;border:0;padding:0;min-height:32px;font:inherit;font-size:13px;color:#2563EB;cursor:pointer;
158  text-decoration:none}
159.kx-lnk:hover{text-decoration:underline;text-underline-offset:3px}
160.kx-lnk:disabled{color:#94A3B8;cursor:default;text-decoration:none}
161.kx-lnk:focus-visible{outline:2px solid #2563EB;outline-offset:2px;border-radius:4px}
162.kx-sub{display:flex;flex-wrap:wrap;justify-content:space-between;gap:4px 16px;margin-top:6px}
163</style>
164<div id="kx-email" class="kx-em" data-next="/"></div>
165<script>
166(function(){
167  var root=document.getElementById('kx-email'), NEXT=root.getAttribute('data-next')||'/mypage';
168  var t0=Date.now(), S={mode:'login',step:'email',email:'',hp:'',wait:0,timer:null,state:'sent'};
169  var T={
170    emailLabel:'メールアドレス', pwLabel:'パスワード', newPwLabel:'新しいパスワード', codeLabel:'確認コード(6桁)',
171    show:'パスワードを表示', hide:'パスワードを隠す',
172    loginH:'ログイン', signIn:'ログイン', signingIn:'ログインしています…', forgot:'パスワードをお忘れの方',
173    createH:'新規登録', createLede:'メールアドレスに6桁の確認コードを送ります。',
174    forgotH:'パスワードの再設定', forgotLede:'登録したメールアドレスに、再設定用の確認コードを送ります。',
175    send:'確認コードを送る', sending:'送信しています…',
176    codeH:'確認コードを入力', codeSub:'{e} 宛てに6桁のコードを送りました。有効期限は10分です。届かない場合は迷惑メールフォルダもご確認ください。',
177    cdH:'コードは送信済みです', cdSub:'少し前にこのアドレスへ送りました。受信箱と迷惑メールフォルダをご確認ください。',
178    laterH:'しばらく送れません', laterSub:'短い間に何度も依頼がありました。いちばん新しいメールのコードを使うか、時間をおいてからお試しください。',
179    rule:'8文字以上', saveCreate:'登録する', saveForgot:'再設定してログイン', saving:'保存しています…',
180    resend:'コードを再送', resendIn:'{s}秒後に再送できます', again:'別のアドレスにする',
181    noAcct:'アカウントをお持ちでない方', signUp:'新規登録', haveAcct:'アカウントをお持ちの方', toLogin:'ログイン', back:'ログインに戻る',
182    bad:'メールアドレスまたはパスワードが違います。Google・LINE で登録した方は、下のボタンからログインしてください。',
183    locked:'間違いが続いたため、しばらく止めています。{m}分ほどしてからもう一度お試しいただくか、パスワードを再設定してください。',
184    later:'試行回数が多すぎます。少し時間をおいてからお試しください。',
185    net:'通信に失敗しました。接続を確認して、もう一度お試しください。',
186    badCode:'コードが違うか、期限が切れています。いちばん新しいメールのコードを入力するか、コードを再送してください。',
187    pwLong:'パスワードは128文字以内にしてください。', pwSame:'メールアドレスをそのままパスワードにはできません。'
188  };
189  function esc(s){return String(s).replace(/[&<>"']/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c];});}
190  function el(id){return document.getElementById(id);}
191  // 🔴 守衛は「描画から 3 秒未満の送信」を bot として黙って落とす。自動入力で埋まった欄を 1 秒で押す人を落とさないよう、足りない分だけ待つ
192  function guard(){var short=3.3-(Date.now()-t0)/1000;return new Promise(function(r){setTimeout(function(){r({kx_j:String(Date.now()),kx_d:String((Date.now()-t0)/1000)});},Math.max(0,short*1000));});}
193  function post(url,body){return fetch(url,{method:'POST',credentials:'include',headers:{'content-type':'application/json'},body:JSON.stringify(body)}).then(function(r){return r.json().catch(function(){return {};}).then(function(j){j._status=r.status;return j;});});}
194  function done(j){try{localStorage.setItem('kaitorix_token',j.token);}catch(e){} location.replace(j.next||NEXT);}
195  // 🔴 ログインの段だけ autocomplete に webauthn を足す=メール欄の自動入力候補にパスキーが並ぶ(KXPK は /js/kx-passkey.js。開関 off なら居ない)
196  function emailField(){return '<label for="kx-e">'+T.emailLabel+'</label><input class="kx-in" id="kx-e" type="email" autocomplete="'+(S.mode==='login'&&window.KXPK&&KXPK.cond?'username webauthn':'username')+'" inputmode="email" autocapitalize="none" spellcheck="false" placeholder="[email protected]" required value="'+esc(S.email)+'">';}
197  function pwInput(id,label,auto){
198    return '<div class="kx-pw"><input class="kx-in" id="'+id+'" type="password" autocomplete="'+auto+'" maxlength="128" autocapitalize="none" spellcheck="false" required aria-label="'+label
198+'">'
199      +'<button type="button" class="kx-eye" aria-pressed="false" aria-controls="'+id+'" aria-label="'+T.show+'" data-eye="'+id+'"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M2.5 12S6 5.5 12 5.5 21.5 12 21.5 12 18 18.5 12 18.5 2.5 12 2.5 12Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/><circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="1.6"/></svg></button></div>';
200  }
201  function bindEyes(){[].forEach.call(root.querySelectorAll('[data-eye]'),function(b){b.onclick=function(){var i=el(b.getAttribute('data-eye'));var v=i.type==='password';i.type=v?'text':'password';b.setAttribute('aria-pressed',String(v));b.setAttribute('aria-label',v?T.hide:T.show);};});}
202  function tick(){clearTimeout(S.timer);if(S.wait>0){S.timer=setTimeout(function(){S.wait--;var b=el('kx-resend');if(b){b.disabled=S.wait>0;b.textContent=S.wait>0?T.resendIn.replace('{s}',S.wait):T.resend;}tick();},1000);}}
203  function go(mode){S.mode=mode;S.step='email';S.hp='';render();}
204  // ページ側の Google/LINE(#kx-social)と切替行(#kx-switch)。🔴 コード入力中とパスワード再設定では出さない(その段の用だけにする)
205  // 🔴 この script は #kx-social / #kx-switch より**前**にある=初回の実行時点ではまだ DOM に無い。毎回引き直し、読み込み後にもう一度呼ぶ
206  function chrome(){
207    var social=el('kx-social'), sw=el('kx-switch');
208    if(social)social.hidden=!(S.step==='email'&&S.mode!=='forgot');
209    if(!sw)return;
210    var h=S.step==='code'?'':S.mode==='login'?T.noAcct+' <button type="button" class="kx-lnk" data-go="create">'+T.signUp+'</button>'
211      :S.mode==='create'?T.haveAcct+' <button type="button" class="kx-lnk" data-go="login">'+T.toLogin+'</button>'
212      :'<button type="button" class="kx-lnk" data-go="login">'+T.back+'</button>';
213    sw.innerHTML=h;sw.hidden=!h;
214    [].forEach.call(sw.querySelectorAll('[data-go]'),function(b){b.onclick=function(){go(b.getAttribute('data-go'));};});
215  }
216
217  function render(){
218    chrome();
219    if(window.KXPK)KXPK.disarm();
220    if(S.mode==='login'){
221      root.innerHTML='<h1>'+T.loginH+'</h1><form id="kx-f" class="kx-f" novalidate>'+emailField()
222        +'<div class="kx-lrow"><label for="kx-p">'+T.pwLabel+'</label><button type="button" class="kx-lnk" data-go="forgot">'+T.forgot+'</button></div>'
223        +pwInput('kx-p',T.pwLabel,'current-password')
224        +'<p class="kx-err" id="kx-err" role="alert" hidden></p>'
225        +'<button class="btn btn-mail" id="kx-go" type="submit">'+T.signIn+'</button></form>';
226      bindEyes();bindGo();
227      el('kx-f').onsubmit=function(e){e.preventDefault();signIn();};
228      if(window.KXPK)KXPK.arm(NEXT);
229      return;
230    }
231    if(S.step==='email'){
232      root.innerHTML='<h1>'+(S.mode==='create'?T.createH:T.forgotH)+'</h1><p class="kx-lede">'+(S.mode==='create'?T.createLede:T.forgotLede)+'</p>'
233        +'<form id="kx-f" class="kx-f" novalidate>'
234        // 🔴 見えない・読み上げない・Tab で来ない。パスワード管理ソフトの「触るな」印つき
235        +'<input name="kx_hollow" id="kx-hollow" tabindex="-1" autocomplete="off" aria-hidden="true" data-lpignore="true" data-1p-ignore="true" data-bwignore="true" data-form-type="other" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;border:0;overflow:hidden;clip-path:inset(50%);opacity:0;pointer-events:none">'
236        +emailField()
237        +'<button class="btn btn-mail" id="kx-go" type="submit">'+T.send+'</button></form>';
238      el('kx-hollow').oninput=function(){S.hp=this.value;};
239      bindGo();
240      el('kx-f').onsubmit=function(e){e.preventDefault();sendCode();};
241      return;
242    }
243    var head=S.state==='cooldown'?T.cdH:S.state==='later'?T.laterH:T.codeH;
244    var sub=S.state==='cooldown'?T.cdSub:S.state==='later'?T.laterSub:T.codeSub.replace('{e}',S.email);
245    root.innerHTML='<h1>'+head+'</h1><p class="kx-lede" role="status" aria-live="polite">'+esc(sub)+'</p>'
246      +'<form id="kx-f" class="kx-f" novalidate>'
247      +'<input type="email" name="username" autocomplete="username" value="'+esc(S.email)+'" hidden readonly>'
248      +'<label for="kx-c">'+T.codeLabel+'</label><input class="kx-in kx-code" id="kx-c" inputmode="numeric" autocomplete="one-time-code" maxlength="8" required>'
249      +'<div class="kx-lrow"><label for="kx-np">'+T.newPwLabel+'</label><p class="kx-hint" id="kx-np-h">'+T.rule+'</p></div>'
250      +pwInput('kx-np',T.newPwLabel,'new-password')
251      +'<p class="kx-err" id="kx-err" role="alert" hidden></p>'
252      +'<button class="btn btn-mail" id="kx-go" type="submit" disabled>'+(S.mode==='create'?T.saveCreate:T.saveForgot)+'</button>'
253      +'<div class="kx-sub">'+(S.state!=='later'?'<button type="button" class="kx-lnk" id="kx-resend"'+(S.wait>0?' disabled':'')+'>'+(S.wait>0?T.resendIn.replace('{s}',S.wait):T.resend)+'</button>':'<span></span>')
254      +'<button type="button" class="kx-lnk" data-go="again">'+T.again+'</button></div></form>';
255    el('kx-np').setAttribute('aria-describedby','kx-np-h');
256    bindEyes();bindGo();
257    var c=el('kx-c'),p=el('kx-np'),g=el('kx-go');
258    var ready=function(){c.value=c.value.replace(/[^\d ]/g,'');g.disabled=!(c.value.replace(/\D/g,'').length===6&&p.value);};
259    c.oninput=ready;p.oninput=ready;
260    if(el('kx-resend'))el('kx-resend').onclick=function(){sendCode(true);};
261    el('kx-f').onsubmit=function(e){e.preventDefault();savePw();};
262    tick();
263  }
264  function bindGo(){[].forEach.call(root.querySelectorAll('[data-go]'),function(b){b.oncl
264ick=function(){var m=b.getAttribute('data-go');if(m==='again'){S.step='email';render();}else go(m);};});}
265  function err(msg){var e=el('kx-err');if(!e)return;e.textContent=msg;e.hidden=!msg;}
266  function busy(on,label){var g=el('kx-go');if(g){g.disabled=on;if(label)g.textContent=label;}}
267
268  function signIn(){
269    var em=el('kx-e').value.trim(),pw=el('kx-p').value;if(!em||!pw)return;S.email=em;
270    busy(true,T.signingIn);err('');
271    guard().then(function(gf){return post('/api/auth/email/login',Object.assign({email:em,password:pw,next:NEXT},gf));}).then(function(j){
272      if(j.ok)return done(j);
273      err(j.reason==='locked'?T.locked.replace('{m}',Math.max(1,Math.ceil((j.wait||900)/60))):j.reason==='later'?T.later:T.bad);
274      busy(false,T.signIn);
275    }).catch(function(){err(T.net);busy(false,T.signIn);});
276  }
277  function sendCode(isResend){
278    // 🔴 再送で描き直しても、打ったパスワードは残す。コードは「新しいのを送った」時だけ消す(古いのは失効する)。
279    //    送っていない(cooldown / later)なら手元のコードはまだ有効=残す
280    var keep=null;
281    if(isResend){keep={c:(el('kx-c')||{}).value||'',p:(el('kx-np')||{}).value||''};var rb=el('kx-resend');if(rb)rb.disabled=true;}
282    else{var em=el('kx-e').value.trim();if(!em)return;S.email=em;busy(true,T.sending);}
283    var after=function(){S.step='code';render();if(!keep)return;el('kx-np').value=keep.p;if(S.state!=='sent')el('kx-c').value=keep.c;el('kx-c').dispatchEvent(new Event('input'));};
284    guard().then(function(gf){var b=Object.assign({email:S.email,purpose:'pw'},gf);b.kx_website=S.hp;return post('/api/auth/email/code',b);})
285      .then(function(j){
286        // 🔴 サーバが「受けた」と言っていない(通信断・5xx・HTML のエラー頁)のに「送りました」の画面へ進めã
286ªã„。
287        //    以前は catch も非 JSON も黙って 'sent' 扱い=届かないコードを 2 分待たせた(2026-10-01 May「一直没收到」)。
288        if(j.ok!==true||typeof j.state!=='string')throw new Error('send_not_accepted');
289        S.state=(j.state==='cooldown'||j.state==='later')?j.state:'sent';S.wait=S.state==='later'?0:Math.max(0,j.wait||120);after();})
290      .catch(function(){err(T.net);if(isResend){var rb2=el('kx-resend');if(rb2)rb2.disabled=false;}else busy(false,T.send);});
291  }
292  function savePw(){
293    var c=el('kx-c').value,p=el('kx-np').value,label=S.mode==='create'?T.saveCreate:T.saveForgot;busy(true,T.saving);err('');el('kx-np-h').className='kx-hint';el('kx-np').removeAttribute('aria-invalid');
294    post('/api/auth/email/password',{email:S.email,code:c,password:p,next:NEXT}).then(function(j){
295      if(j.ok)return done(j);
296      if(j.reason==='short'){el('kx-np-h').className='kx-hint bad';el('kx-np').setAttribute('aria-invalid','true');}
297      else err(j.reason==='long'?T.pwLong:j.reason==='same_as_email'?T.pwSame:j.reason==='later'?T.later:T.badCode);
298      busy(false,label);
299    }).catch(function(){err(T.net);busy(false,label);});
300  }
301  render();
302  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',chrome);
303})();
304</script>
304
305
306        <div id="kx-social">
307          <div class="kx-or" aria-hidden="true">または</div>
308          <button type="button" class="btn btn-pk btn-sm" id="kx-pk-btn" hidden><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z"/><circle cx="16.5" cy="7.5" r=".5" fill="currentColor"/></svg>パスキーでログイン</button><p class="pk-err" id="kx-pk-err" role="alert" hidden></p>
308<script>(function(){var b=document.getElementById("kx-pk-btn");if(window.KXPK&&KXPK.ok){b.hidden=false;b.onclick=function(){KXPK.login("/");};}})();</script>
308
309          <a class="btn btn-google btn-sm" href="/auth/google?next=%2F"><svg width="20" height="20" viewBox="0 0 48 48" aria-hidden="true"><path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"/><path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"/><path fill="#FBBC05" d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"/><path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"/></svg>Google で続ける</a>
310          <a class="btn btn-line btn-sm" href="/auth/line?next=%2F"><svg width="22" height="22" viewBox="0 0 24 24" fill="#fff" aria-hidden="true"><path d="M19.365 9.863c.349 0 .63.285.63.631 0 .345-.281.63-.63.63H17.61v1.125h1.755c.349 0 .63.283.63.63 0 .344-.281.629-.63.629h-2.386c-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63h2.386c.346 0 .627.285.627.63 0 .349-.281.63-.63.63H17.61v1.125h1.755zm-3.855 3.016c0 .27-.174.51-.432.596-.064.021-.133.031-.199.031-.211 0-.391-.09-.51-.25l-2.443-3.317v2.94c0 .344-.279.629-.631.629-.346 0-.626-.285-.626-.629V8.108c0-.27.173-.51.43-.595.06-.023.136-.033.194-.033.195 0 .375.104.495.254l2.462 3.33V8.108c0-.345.282-.63.63-.63.345 0 .63.285.63.63v4.771zm-5.741 0c0 .344-.282.629-.631.629-.345 0-.627-.285-.627-.629V8.108c0-.345.282-.63.63-.63.346 0 .628.285.628.63v4.771zm-2.466.629H4.917c-.345 0-.63-.285-.63-.629V8.108c0-.345.285-.63.63-.63.348 0 .63.285.63.63v4.141h1.756c.348 0 .629.283.629.63 0 .344-.282.629-.629.629M24 10.314C24 4.943 18.615.572 12 .572S0 4.943 0 10.314c0 4.811 4.27 8.842 10.035 9.608.391.082.923.258 1.058.59.12.301.079.766.038 1.08l-.164 1.02c-.045.301-.24 1.186 1.049.645 1.291-.539 6.916-4.078 9.436-6.975C23.176 14.393 24 12.458 24 10.314"/></svg>LINE で続ける</a>
311          <a class="alt" href="/auth/line?switch=1&amp;next=%2F">別の LINE アカウントを使う</a>
312          <p class="line-note">LINEでログインする際、LINEに登録しているメールアドレスのご提供をお願いする場合があります。ご提供いただいたアドレスは、大口案件のお知らせ(キャンセル待ちの確定・受付の締切・納期の前日など)をお送りするためにのみ使用します。</p>
313        </div>
314        <p id="kx-switch" class="switch" hidden></p>
315        <p class="note">ログインまたは登録すると、<a href="/terms">利用規約</a>と<a href="/privacy">プライバシーポリシー</a>に同意したものとみなされます。</p>
316
317      </div>
318    </div>
319    <div class="ap-foot">
320      <a href="/guide">ご利用ガイド</a>·<a href="/privacy">プライバシー</a>·<a href="/contact">お問い合わせ</a>
321    </div>
322  </section>
323</div>
324<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"73758e61f8a943ceb8dacf6a8bd41d58","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 324
324
325<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a43baffa8d862af4',t:'MTc5MDg2MDAxNQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
325</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.