1/* tanoshimo-site ã¯ã©ã¤ã¢ã³ãæ©è½: ã¢ãã¤ã«ã¡ãã¥ã¼ / ããã¹ããµã¤ãºåæ¿ / ããã¯ãã¼ã¯ / å ±æ 2 éçãµã¤ã(èªè¨¼ãªã)ã®ãããããã¯ãã¼ã¯ã¯ localStorage(端æ«ãã¼ã«ã«)ãUTARã®UIãè¸è¥²ã */ 3(function () { 4 var LS_FS = 'tano:fs'; // ããã¹ããµã¤ãº 0/1/2/3ï¼å°ã»ä¸ã»å¤§ã»ç¹å¤§ï¼ 5 var LS_BM = 'tano:bm'; // ããã¯ãã¼ã¯ url é å 6 var ARTICLES = []; 7 var path = decodeURIComponent(location.pathname).replace(/\/$/, '') || '/'; 8 // è±èªãã¼ã¸ï¼/en é ä¸ï¼ãã©ãããæ¥æ¬èªåãã®å¨ï¼æåãµã¤ãºåæ¿ã»ããã¯ãã¼ã¯ã» 9 // ä¿å/å ±æãã¼ã»è¨äºæ¤ç´¢ã»æ¥æ¬èªã®ãåãåããFABï¼ã¯è±èªã®èªã¿æã«ã¯ä½¿ããªãã®ã§åºããã 10 // 代ããã«è±èªã®FABã ããç½®ããå¤å®ã« <html lang> ã使ãã®ã¯ããã¹ã®æã¡æ¹ 11 // ï¼/en, /en/..., trailingSlash:'never' ã§å®ä½ã¯ en.htmlï¼ã«ä¾åããªãããã 12 // 'en' 㨠'en-US' ã®ãããªå°åã¤ãã ããè±èªã¨ã¿ãªãï¼f.js ã® normalizeLang ã¨åãå¤å®ï¼ã 13 var htmlLang = (document.documentElement.getAttribute('lang') || '').toLowerCase(); 14 var IS_EN = htmlLang === 'en' || htmlLang.indexOf('en-') === 0; 15 16 function ls(k, d) { try { return JSON.parse(localStorage.getItem(k)) ?? d; } catch (e) { return d; } } 17 function save(k, v) { try { localStorage.setItem(k, JSON.stringify(v)); } catch (e) {} } 18 function esc(s) { return (s || '').replace(/[&<>"]/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"' }[c]; }); } 19 // GA4ã¸ã®ã¤ãã³ãéä¿¡ãgtagãç¡ãç°å¢(ãã¼ã«ã«ç)ã§ã¯é»ã£ã¦ä½ãããªãã 20 function track(name, params) { 21 if (typeof window.gtag === 'function') window.gtag('event', name, params || {}); 22 } 23 function bm() { return ls(LS_BM, []); } 24 function isBm(u) { return bm().indexOf(u) > -1; } 25 function toggleBm(u) { var a = bm(); var i = a.indexOf(u); if (i > -1) a.splice(i, 1); else a.unshift(u); save(LS_BM, a); updateBmCount(); return i === -1; } 26 // ãããåããã¯ãã¼ã¯ã¢ã¤ã³ã³ãon=ä¿åæ¸ã¿ã¯å¡ãã¤ã¶ããæªä¿åã¯è¼ªéã®ã¿ã 27 function bmIcon(on) { 28 return '<svg class="tano-bm-ico" width="15" height="15" viewBox="0 0 24 24" fill="' + (on ? 'currentColor' : 'none') + 29 '" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' + 30 '<path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"/></svg>'; 31 } 32 33 /* ---------- ããã¹ããµã¤ãº ---------- */ 34 var FS = ['s', 'm', 'l', 'xl']; 35 function applyFs(i) { document.documentElement.classList.remove('tano-fs-s', 'tano-fs-m', 'tano-fs-l', 'tano-fs-xl'); document.documentElement.classList.add('tano-fs-' + FS[i]); } 36 // æ¥æ¬èªãã¼ã¸ã§ä¿åããæåãµã¤ãºè¨å®ã¯è±èªãã¼ã¸ã«ã¯æã¡è¾¼ã¾ãªããè±èªãã¼ã¸ã«ã¯ 37 // åæ¿ã®UIèªä½ãç¡ããoverrides.css ã® .notion-root zoom ãæ¢å®(m=zoom:1)以å¤ã 㨠38 // èªã¿æãæ»ãææ®µãæããªããããè±èªãã¼ã¸ã¯å¸¸ã«æ¢å®ãµã¤ãºã§æç»ããã 39 var fsIdx = IS_EN ? 1 : Math.min(3, Math.max(0, ls(LS_FS, 1))); 40 applyFs(fsIdx); 41 42 /* ---------- navbar ã¸ã®æ³¨å ¥ ---------- */ 43 function injectNavbar() { 44 var actions = document.querySelector('.super-navbar__actions'); 45 if (!actions) return; 46 var wrap = document.createElement('div'); 47 wrap.className = 'tano-nav-tools'; 48 wrap.innerHTML = 49 '<div class="tano-fsswitch" role="group" aria-label="æåãµã¤ãº">' + 50 '<button data-fs="0">å°</button>' + 51 '<button data-fs="1">ä¸</button>' + 52 '<button data-fs="2">大</button>' + 53 '<button data-fs="3">ç¹å¤§</button>' + 54 '</div>' + 55 '<button class="tano-bm-open" aria-label="ä¿åããè¨äº">â <span class="tano-bm-count">0</span></button>'; 56 // è¨èªãã°ã«ã対訳ãã¼ã¸ãããå ´åã ã meta ãåºã¦ããã®ã§ããããè¦ã¦åºãã 57 // è±èªãã¼ã¸ã¯ EnNav ãèªåã§åºããããããã¯æ¥æ¬èªãã¼ã¸ç¨ã 58 // è±èªãã¼ã¸ã®ãããåæ¿ã¯ EnNav ããµã¼ãå´ã§æãã®ã§ãããã§ã¯ä½ããªãï¼äºé表示ã«ãªãï¼ã 59 var alt = IS_EN ? null : document.querySelector('meta[name="tano:alt-lang"]'); 60 if (alt && alt.content) { 61 var label = document.querySelector('meta[name="tano:alt-lang-label"]'); 62 // JP 㨠EN ã常ã«ä¸¡æ¹åºãããã¾è¦ã¦ããæ¹ãæ¿ããè¡ããæ¹ãæ·¡ãåºãã 63 // çæ¹ï¼è¡ãå ï¼ã ããåºãã¨ããããç¾å¨å°ãªã®ãè¡ãå ãªã®ãèªã¿åããªã
63 64 // ï¼2026-08-21 å¤§æ±ææï¼ã並ã³é ã¯æ¥è±ã©ã¡ãã®ãã¼ã¸ã§ã JP â EN ã§åºå®ãã 65 // åãã®ã¯æ¿æ·¡ã ãã«ãããç¾å¨å°ã¯ãªã³ã¯ã«ããªãï¼æ¼ãã¦ãä½ãèµ·ããªãå°ç·ãä½ããªãï¼ã 66 // å°çã®ã¢ã¤ã³ã³ã¯èªã¨å¯¾ã§ç½®ããè¨å·åä½ã§ã¯æå³ãéããªãã 67 var g = document.createElement('span'); 68 g.className = 'tano-lang'; 69 g.innerHTML = '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" ' + 70 'stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10"/>' + 71 '<path d="M2 12h20M12 2a15 15 0 0 1 0 20a15 15 0 0 1 0-20"/></svg>' + 72 '<span class="tano-lang__cur" aria-current="true">JP</span>' + 73 '<span class="tano-lang__sep" aria-hidden="true">/</span>' + 74 '<a class="tano-lang__alt"></a>'; 75 var altLink = g.querySelector('.tano-lang__alt'); 76 altLink.href = alt.content; 77 altLink.textContent = 'EN'; 78 altLink.setAttribute('aria-label', label && label.content ? label.content : 'English'); 79 wrap.appendChild(g); 80 } 81 // ãããã®å¸¸è¨CTAï¼2026-09-17 å¤§æ±æç¤ºãæ§ãµã¤ãã¯ãããã«ãLINE@ç§»ä½ç¸è«ããè³æè«æ±ãã 82 // 常è¨ãã¦ããï¼ãã¤ãªããç¶ããå ¥å£ï¼LINEã«1æ¬ã ãçµãã860px以ä¸ã¯ .super-navbar__actions 83 // ãã¨é表示ã«ãªãã®ã§ãã¢ãã¤ã«ã«ã¯åºãªãï¼èªäºæããã«ãæ ãï¼ã 84 // è¨æ¸¬ã¯æ¢åã®å§è²ãã³ãã©ï¼SuperLayoutï¼ã href ãã cta_click_line ãåºãã®ã§ã 85 // ç½®ãå ´æã ã data-cta-loc ã§æ¸¡ããæ°ããã¤ãã³ãã¯ä½ããªãã 86 var navcta = document.createElement('a'); 87 navcta.className = 'tano-navcta'; 88 navcta.href = 'https://line.me/R/ti/p/@371dzkvg'; 89 navcta.target = '_blank'; 90 navcta.rel = 'noopener'; 91 navcta.setAttribute('data-cta-loc', 'header'); 92 // ã©ãã«ã¯ããã¿ã¼ã§ä½¿ã£ã¦ãããå ¬å¼LINEç»é²ãã«æããï¼2026-09-17 大æ±ï¼ã 93 // ãLINEã§ç»é²ãã§ã¯ä½ã®ç»é²ãä¼ãããªãã¨ããææã¸ã®å¯¾å¿ã§ãæ°ããè¨ãæ¹ã¯ä½ããªãã 94 navcta.innerHTML = 95 '<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">' + 96 '<path d="M12 3C6.9 3 2.8 6.4 2.8 10.6c0 3.8 3.3 7 7.8 7.6.3.1.8.2.9.5.1.3.1.7 0 1l-.2.8c0 .2-.2.8.7.5.9-.4 5-3 6.7-5.1 1.2-1.3 1.8-2.7 1.8-4.3C20.5 6.4 16.4 3 12 3z"/></svg>' + 97 '<span>å ¬å¼LINEç»é²</span>'; 98 // 並ã³ã¯ãCTA â æåãµã¤ãºã»ä¿åã»è¨èª â æ¤ç´¢ããCTAãæä½åã®å é ï¼æåãµã¤ãºã®å·¦ï¼ã«ç½®ã 99 // ãããéå ·ï¼wrapï¼ãå ã«å ¥ãã¦ããCTAãå é ã¸å ¥ããï¼2026-09-17 å¤§æ±æç¤ºï¼ã 100 actions.insertBefore(wrap, actions.firstChild); 101 actions.insertBefore(navcta, actions.firstChild); 102 wrap.querySelectorAll('.tano-fsswitch button').forEach(function (b) { 103 b.addEventListener('click', function () { fsIdx = +b.getAttribute('data-fs'); save(LS_FS, fsIdx); applyFs(fsIdx); markFs(); }); 104 }); 105 wrap.querySelector('.tano-bm-open').addEventListener('click', openBmPanel); 106 markFs(); 107 updateBmCount(); 108 } 109 function markFs() { document.querySelectorAll('.tano-fsswitch button').forEach(function (b) { b.classList.toggle('on', +b.getAttribute('data-fs') === fsIdx); }); } 110 function updateBmCount() { var n = bm().length; document.querySelectorAll('.tano-bm-count').forEach(function (c) { c.textContent = n; c.style.display = n ? '' : 'none'; }); } 111 112 /* ---------- ããã¯ãã¼ã¯ ããã« ---------- */ 113 function openBmPanel() { 114 closeOverlays(); 115 var urls = bm(); 116 var items = urls.map(function (u) { 117 var a = ARTICLES.find(function (x) { return x.url === u; }); 118 var title = a ? a.title : u; 119 return '<li><a href="' + esc(u) + '">' + esc(title) + '</a>' + 120 '<button class="tano-bm-del" data-u="' + esc(u) + '" aria-label="åé¤">Ã</button></li>'; 121 }).join(''); 122 var ov = document.createElement('div'); 123 ov.className = 'tano-overlay tano-bm-panel'; 124 ov.innerHTML = '<div class="tano-panel"><div class="tano-panel-head"><span>ä¿åããè¨äº</span>' + 125 '<button class="tano-close" aria-label="éãã">Ã</button></div>' + 126 (urls.length ? '<ul class="tano-bm-list">' + items + '</ul>' : '<p class="tano-empty">ã¾ã ä¿åããè¨äºã¯ããã¾ãããè¨äºãã¼ã¸ã®ãä¿åããã追å ã§ãã¾ãã</p>') + 127 '</div>'; 128 document.body.appendChild(ov); 129 ov.addEventListener('click', function (e) { if (e.target === ov || e.target.closest('.tano-close')) ov.remove(); }); 130 ov.querySelectorAll('.tano-bm-del').forEach(function (b) { 131 b.addEventListener('click', function () { toggleBm(b.getAttribute('data-u')); b.closest('li').remove(); if (!bm().length) ov.remove(); }); 132 }); 133 } 134 // ãåãåããã¢ã¼ãã«(inquiryOverlay)ã ãã¯ç ´æ£ããªããHyperdashåãè¾¼ã¿(f.js)㯠135 // DOMContentLoadedæç¹ã§ä¸åº¦ã ã data-hd-form ãæ¢ãã¦æç»ãããããä»ã®ãªã¼ãã¼ã¬ã¤ã®ããã«
136 // æ¯åä½ãç´ãã¨äºåº¦ã¨è¦ã¤ãããªããªããéããã¨ãã¯é表示ã«ããã ãã«ããã 137 function closeOverlays() { document.querySelectorAll('.tano-overlay').forEach(function (o) { if (o === inquiryOverlay) { o.hidden = true; } else { o.remove(); } }); } 138 139 /* ---------- ã¢ãã¤ã«ã¡ãã¥ã¼ï¼èªåãã³ãã¼ã¬ã¼ãæ³¨å ¥ï¼ ---------- */ 140 function injectMobileMenu() { 141 var items = [].slice.call(document.querySelectorAll('.super-navbar__item')).map(function (a) { 142 return '<a href="' + a.getAttribute('href') + '">' + esc(a.textContent.trim()) + '</a>'; 143 }).join(''); 144 var btn = document.createElement('button'); 145 btn.className = 'tano-hamburger'; 146 btn.setAttribute('aria-label', IS_EN ? 'Menu' : 'ã¡ãã¥ã¼'); 147 btn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="#2A4D14" stroke-width="2.2" stroke-linecap="round"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>'; 148 // z-index ã¯ã¢ã¼ãã«(.tano-overlay = 10000)ããå¿ ãä¸ã«ããã 149 // 99999 ã«ãã¦ããããã¢ã¼ãã«ã®ä¸ã«ãã³ãã¼ã¬ã¼ãéãªã£ã¦è¡¨ç¤ºããã¦ããã 150 btn.style.cssText = 'position:fixed;top:10px;right:14px;z-index:600;width:40px;height:40px;background:none;border:0;cursor:pointer;align-items:center;justify-content:center;padding:0;'; 151 document.body.appendChild(btn); 152 // 表示/é表示㯠CSS ã® media query(.tano-hamburger)ã§å¶å¾¡ï¼display 㯠inline ã§æå®ããªãï¼ 153 btn.addEventListener('click', function (e) { 154 e.preventDefault(); 155 if (document.querySelector('.tano-drawer')) { closeOverlays(); return; } 156 closeOverlays(); 157 var ov = document.createElement('div'); 158 ov.className = 'tano-overlay tano-drawer'; 159 // è±èªãã¼ã¸ã®ããã¯ã¼ã¯ããã ããä¸ã®éå ·ï¼æåãµã¤ãºã»ä¿åããè¨äºã»è¨äºãæ¤ç´¢ï¼ã¯ 160 // ã©ããæ¥æ¬èªã®å¨ãªã®ã§ç½®ããªãï¼è¨äºæ¤ç´¢ãå¼ãã®ã¯æ¥æ¬èªè¨äºã®ä¸è¦§ï¼ã 161 // è¨èªåæ¿ã¯ããã¯ã¼ã«ãç½®ããã¢ãã¤ã«ã¯ãããã®éå ·ãå ¨é¨ããã«ç³ã¾ããã®ã§ã 162 // å ¥ããªãã¨è±èªçã¸ã®å ¥å£ãå°ããç»é¢ããæ¶ããï¼2026-08-21 å¤§æ±ææï¼ã 163 // æ¥è±ã©ã¡ãã®ãã¼ã¸ã§ãåºãããããã¨åãã JP â EN ã®é ã§ãæ¿æ·¡ã§ç¾å¨å°ã示ãã 164 var altMeta = document.querySelector('meta[name="tano:alt-lang"]'); 165 var langRow = ''; 166 if (altMeta && altMeta.content) { 167 var here = '<span class="tano-lang__cur" aria-current="true">' + (IS_EN ? 'EN' : 'JP') + '</span>'; 168 var there = '<a class="tano-lang__alt" href="' + esc(altMeta.content) + '">' + (IS_EN ? 'JP' : 'EN') + '</a>'; 169 langRow = 170 '<div class="tano-dt-row">' + (IS_EN ? 'Language' : 'è¨èª') + ' ' + 171 '<span class="tano-lang tano-lang--drawer">' + 172 '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M2 12h20M12 2a15 15 0 0 1 0 20a15 15 0 0 1 0-20"/></svg>' + 173 (IS_EN ? there : here) + 174 '<span class="tano-lang__sep" aria-hidden="true">/</span>' + 175 (IS_EN ? here : there) + 176 '</span>' + 177 '</div>'; 178 } 179 // è±èªãã¼ã¸ã®ããã¯ã¼ã¯è¨èªåæ¿ã ããä»ã®éå ·ï¼æåãµã¤ãºã»ä¿åããè¨äºã»è¨äºãæ¤ç´¢ï¼ã¯ 180 // ã©ããæ¥æ¬èªã®å¨ãªã®ã§ç½®ããªãï¼è¨äºæ¤ç´¢ãå¼ãã®ã¯æ¥æ¬èªè¨äºã®ä¸è¦§ï¼ã 181 var tools = IS_EN 182 ? (langRow ? '<div class="tano-drawer-tools">' + langRow + '</div>' : '') 183 : '<div class="tano-drawer-tools">' + 184 langRow + 185 '<div class="tano-dt-row">æåãµã¤ãº <div class="tano-fsswitch">' + 186 '<button data-fs="0">å°</button><button data-fs="1">ä¸</button><button data-fs="2">大</button><button data-fs="3">ç¹å¤§</button>' + 187 '</div></div>' + 188 '<button class="tano-dt-btn" data-act="bm">' + bmIcon(false) + ' ä¿åããè¨äº</button>' + 189 '<button class="tano-dt-btn" data-act="search">è¨äºãæ¤ç´¢</button>' + 190 '</div>'; 191 ov.innerHTML = '<div class="tano-drawer-inner"><button class="tano-close" aria-label="' + (IS_EN ? 'Close' : 'éãã') + '">Ã</button>' + 192 '<nav>' + items + '</nav>' + tools + '</div>'; 193 document.body.appendChild(ov); 194 if (!IS_EN) { 195 markFs(); 196 ov.querySelectorAll('.tano-fsswitch button').forEach(function (b) { 197 b.addEventListener('click', function () { fsIdx = +b.getAttribute('data-fs'); save(LS_FS, fsIdx); applyFs(fsIdx); markFs(); }); 198 }); 199 ov.querySelector('[data-act="bm"]').addEventListener('click', function () { openBmPanel(); }); 200 ov.querySelector('[data-act="search"]').addEventListener('click', function () { openSearch(); }); 201 } 202 ov.addEventListener('click', function (e2) { if (e2.target === ov || e2.target.closest('.tano-close') || e2.target.tagName === 'A') ov.remove(); }); 203 }); 204 } 205 206 /* ---------- è¨äºãã¼ã¸: ããã¯ãã¼ã¯ + å ±æãã¼ ---------- */ 207 function injectArticleBar() { 208 if (document.querySelector('.tano-artbar')) return; // äºéæ¿å ¥é²æ¢ 209 // TOP以å¤ã®å ¨ãã¼ã¸ã«åºããä¸å±¤ã¯ã©ããããã¨ã§è¦è¿ããã人ã«éãã対象ã«ãªããã 210 // ãã¼ã¸ç¨®å¥ã§åºãåããªãï¼åºãæ¡ä»¶ãèªããªãã¨å¦ç¿ã³ã¹ãã«ãªãï¼ã 211 // TOPã¯å ¥å£ã§ãã£ã¦ä¿åã»å ±æã®å¯¾è±¡ã§ã¯ãªãã®ã§é¤ãã 212 if (path === '/' || path === '/index.html') return; 213 var art = ARTICLES.find(function (x) { return x.url === path; }); 214 var header = document.querySelector('.tano-md__header') || document.querySelector('.notion-header__title-wrapper'); 215 var root = document.querySelector('.notion-root'); 216 if (!header && !root) return; 217 var canon = location.origin + location.pathname; 218 // å ±æã«ã¯ç縮URL(/s/xxxx)ã使ããé·ãURLã¯å£é ã»ç´ã§ä¼ããããã
219 // SNSã®æ¬æã§ãæãè¿ãã¦èªããªããªããããç¡ããã°é常URLã«è½ã¨ãã 220 var sm = document.querySelector('meta[name="tano:short-url"]'); 221 var url = (sm && sm.content) || canon; 222 var title = (art && art.title) || document.title; 223 // SNSå ±æããã¹ãã«ã¯ãµã¤ãåãæ·»ããï¼Xã¯textã使ããLINE/Facebookã¯OGããã¿ã¤ãã«ãæ¾ãï¼ã 224 var shareText = title + ' ï½ ã¿ãã·ã¢ãããããã'; 225 var xIco = '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>'; 226 var lineIco = '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z"/></svg>'; 227 var copyIco = '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>'; 228 var fbIco = '<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M24 12.07C24 5.4 18.63 0 12 0S0 5.4 0 12.07C0 18.1 4.39 23.1 10.13 24v-8.44H7.08v-3.49h3.05V9.41c0-3.02 1.79-4.69 4.53-4.69 1.31 0 2.68.24 2.68.24v2.97h-1.51c-1.49 0-1.95.93-1.95 1.88v2.26h3.32l-.53 3.49h-2.79V24C19.61 23.1 24 18.1 24 12.07z"/></svg>'; 229 var bar = document.createElement('div'); 230 bar.className = 'tano-artbar'; 231 bar.innerHTML = 232 '<button class="tano-ab-pill tano-bm-btn' + (isBm(path) ? ' on' : '') + '" type="button">' + bmIcon(isBm(path)) + '<span class="tano-act__lbl">' + (isBm(path) ? 'ä¿åæ¸ã¿' : 'ä¿å') + '</span></button>' + 233 '<a class="tano-ab-pill tano-ab-pill--icon tano-ab-sh x" target="_blank" rel="noopener" aria-label="Xã§å ±æ" title="Xã§å ±æ" href="https://twitter.com/intent/tweet?text=' + encodeURIComponent(shareText) + '&url=' + encodeURIComponent(url) + '">' + xIco + '</a>' + 234 '<a class="tano-ab-pill tano-ab-pill--icon tano-ab-sh line" target="_blank" rel="noopener" aria-label="LINEã§å ±æ" title="LINEã§å ±æ" href="https://social-plugins.line.me/lineit/share?url=' + encodeURIComponent(url) + '">' + lineIco + '</a>' + 235 '<a class="tano-ab-pill tano-ab-pill--icon tano-ab-sh fb" target="_blank" rel="noopener" aria-label="Facebookã§å ±æ" title="Facebookã§å ±æ" href="https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(url) + '">' + fbIco + '</a>' + 236 '<button class="tano-ab-pill tano-ab-sh copy" type="button" aria-label="URLãã³ãã¼">' + copyIco + '<span class="tano-copy-lbl">URLãã³ãã¼</span></button>'; 237 // å¿ å®ç§»æ¤ã®è¨äºãã¼ã¸ã¯ notion-header ãé表示(offsetParent=null)ã§ãæ¬æã¿ã¤ãã«ã¯ 238 // .notion-root å ã«ãããå¯è¦ãªããããããã°ãã®ç´å¾ãç¡ããã°æ¬æå é ã®è¦åºãç´å¾ã«ç½®ãã 239 if (header && header.offsetParent !== null) { 240 header.insertAdjacentElement('afterend', bar); 241 } else if (root) { 242 var h = root.querySelector('h1, h2, .notion-heading'); 243 if (h && h.offsetParent !== null) h.insertAdjacentElement('afterend', bar); 244 else root.insertAdjacentElement('afterbegin', bar); 245 } else { 246 header.insertAdjacentElement('afterend', bar); 247 } 248 var bmb = bar.querySelector('.tano-bm-btn'); 249 bmb.addEventListener('click', function () { 250 var on = toggleBm(path); 251 bmb.classList.toggle('on', on); 252 bmb.innerHTML = bmIcon(on) + '<span class="tano-act__lbl">' + (on ? 'ä¿åæ¸ã¿' : 'ä¿å') + '</span>'; 253 // ä¿åã¯ããã¨ã§èªã¿è¿ãææãã®æãç´æ¥çãªææ¨ãç¶ç¶å©ç¨ã®å è¡ææ¨ã¨ãã¦è¨æ¸¬ããã 254 track(on ? 'bookmark_add' : 'bookmark_remove', { page_path: path }); 255 }); 256 bar.querySelectorAll('.tano-ab-sh').forEach(function (b) { 257 b.addEventListener('click', function () { 258 var to = b.classList.contains('x') ? 'x' 259 : b.classList.contains('line') ? 'line' 260 : b.classList.contains('fb') ? 'facebook' 261 : b.classList.contains('copy') ? 'copy' : 'other'; 262 track('share_click', { method: to, page_path: path, shared_url: url }); 263 }); 264 }); 265 bar.querySelector('.copy').addEventListener('click', function (e) { 266 var lbl = e.currentTarget.querySelector('.tano-copy-lbl'); 267 navigator.clipboard.writeText(url).then(function () { 268 if (lbl) { lbl.textContent = 'ã³ãã¼ãã¾ãã'; setTimeout(function () { lbl.textContent = 'URLãã³ãã¼'; }, 1600); } 269 }); 270 }); 271 // ã¹ã¯ãã¼ã«ã§ãããç´ä¸ã«åºå®ãããããã¤ãºè¡¨ç¤ºã«åãæ¿ããã 272 var navbar = document.querySelector('.super-navbar'); 273 function updateStick() { 274 var nb = navbar ? Math.round(navbar.getBoundingClientRect().height) : 0; 275 bar.style.top = nb + 'px'; 276 bar.classList.toggle('is-stuck', bar.getBoundingClientRect().top <= nb + 1); 277 } 278 updateStick(); 279 window.addEventListener('scroll', updateStick, { passive: true }); 280 window.addEventListener('resize', updateStick); 281 } 282 283 /* ---------- è¨äºãã¼ã¸: æ«å°¾ã«é¢é£è¨äºï¼åéå¼·åï¼ ---------- 284 UMPè¨äºã¯ãµã¼ãå´(RelatedArticles.astro)ã§æ¢ã«æç»æ¸ã¿ãªã®ã§ããã®å ´åã¯ã¹ãããã 285 faithfulè¨äºã¯æ¬æ(.notion-root)ç´å¾ã«ãåã¿ã°ï¼æ°çããæå¤§3æ¬ãæ³¨å ¥ããã */
286 // ã©ãã«è¡¨ç¤ºï¼æ£å ¸é ã§ä¸¦ã¹ãåéã©ãã«ã¯ã«ãã´ãªpillã¨å¥è²ãarticle-index.js ã¨å仿§ï¼ãã®ä¸¦ã³ã¯åå¾ãããªãï¼ã 287 var THEME_LABELS = { 'ä»äº': 1, 'ä½ã¾ã': 1, 'åè²ã¦ã¨æè²': 1, 'ãé': 1, 'å»ç': 1, 'ã³ãã¥ããã£': 1, 'å¬ã®æ®ãã': 1 }; 288 var LABEL_ORDER = ['ä¸å·çºã®ãã', 'ä¸å·çºã®ã¢ã', 'ä¸å·çºã®ã³ã', 'ä»äº', 'ä½ã¾ã', 'åè²ã¦ã¨æè²', 'å¬ã®æ®ãã', 'ãé', 'å»ç', 'ã³ãã¥ããã£', 289 'ãããã人åé', 'ç§»ä½è ã®ç©èª', 'èµ·æ¥ã»äºæ¥æ¿ç¶', 'å°åãããååé', 'ä¸å·äººè²¡ãã³ã¯', 'ã¤ãã³ãéå¬ã®ãç¥ãã', 'ã¤ãã³ãã¬ãã¼ã', 'ãµããã¨ç´ç¨', 'ãããã', 'ã¤ãã´', 'ããã', 'ãããã¸ã¥ã¼ã¹']; 290 var PRIMARY_LABELS = { 'ä¸å·çºã®ãã': 1, 'ä¸å·çºã®ã¢ã': 1, 'ä¸å·çºã®ã³ã': 1 }; 291 function orderIdx(l) { var i = LABEL_ORDER.indexOf(l); return i < 0 ? LABEL_ORDER.length : i; } 292 function pillClass(l) { return THEME_LABELS[l] ? 'tix-pill tix-pill--theme' : (PRIMARY_LABELS[l] ? 'tix-pill' : 'tix-pill tix-pill--sub'); } 293 function pillsHtml(labels) { 294 labels = (labels || []).slice().sort(function (a, b) { return orderIdx(a) - orderIdx(b); }).slice(0, 4); 295 return labels.map(function (l) { return '<span class="' + pillClass(l) + '">' + esc(l) + '</span>'; }).join(''); 296 } 297 function relatedCard(a) { 298 return '<a class="tix-card" href="' + esc(a.url) + '">' + 299 '<span class="tix-cover"' + (a.cover ? ' style="background-image:url(' + esc(a.cover) + ')"' : '') + '></span>' + 300 '<span class="tix-tbody">' + 301 (a.date ? '<span class="tix-date">' + esc(a.date.replace(/-/g, '.')) + '</span>' : '') + 302 '<span class="tix-title">' + esc(a.title) + '</span>' + 303 '<span class="tix-pills">' + pillsHtml(a.labels) + '</span>' + 304 '</span></a>'; 305 } 306 function injectRelated() { 307 if (document.querySelector('.tano-related')) return; // UMPè¨äº(ãµã¼ãæç»æ¸ã¿) 308 var self = ARTICLES.find(function (x) { return x.url === path; }); 309 var isUmp = !!document.querySelector('.tano-md'); 310 if (!self && !isUmp) return; // è¨äºãã¼ã¸ã®ã¿ 311 var anchor = document.querySelector('.notion-root'); 312 if (!anchor) return; 313 // ç§»è¡åã®é¢é£ã³ã¬ã¯ã·ã§ã³ï¼ã®ã£ã©ãªã¼ï¼ã¨ããã®ä¸ã®ã¤ã³ãã 314 // ï¼»ã«ãã´ãªè¦åºãï¼ä¸å·çºã®ããçï¼ï¼èª¬ææï¼½ï¼ä¸ã®ããã£ã¨èªãããªã³ã¯ãé ãã 315 // é¢é£ã¯ä¸ã®èªåçæ3æ¬ã«ä¸æ¬åããã 316 Array.prototype.forEach.call(anchor.querySelectorAll('.notion-collection'), function (col) { 317 col.style.display = 'none'; 318 // ç´åã®ã¤ã³ãããé¡ã£ã¦åéãè¦åºããè¦ã¤ãã£ãå ´åã®ã¿å®éã«é ãï¼æ¬æèª¤æ¤åºã®é²æ¢ï¼ã 319 var toHide = [], prev = col.previousElementSibling, sawDesc = false, sawHeading = false; 320 while (prev) { 321 var c = prev.className || ''; 322 if (/notion-(heading__anchor|divider)/.test(c)) { toHide.push(prev); prev = prev.previousElementSibling; continue; } 323 if (!sawDesc && /notion-text/.test(c) && !prev.querySelector('a')) { toHide.push(prev); sawDesc = true; prev = prev.previousElementSibling; continue; } 324 if (/notion-heading/.test(c)) { toHide.push(prev); sawHeading = true; } 325 break; 326 } 327 if (sawHeading) toHide.forEach(function (e) { e.style.display = 'none'; }); 328 // ç´å¾ã®ããã£ã¨èªãããªã³ã¯æ®µè½ 329 var next = col.nextElementSibling; 330 if (next && /notion-text/.test(next.className || '') && next.querySelector('a')) next.style.display = 'none'; 331 }); 332 if (!self) return; // articles.json æªæ²è¼(UMPç)ã¯èªåé¢é£ãçæããªã 333 var selfLabels = self.labels || []; 334 var list = ARTICLES.filter(function (a) { return a.url !== path; }) 335 .map(function (a) { 336 var score = (a.labels || []).reduce(function (s, l) { return s + (selfLabels.indexOf(l) > -1 ? 1 : 0); }, 0); 337 return { a: a, score: score, date: a.date || '' }; 338 }) 339 .sort(function (x, y) { return y.score - x.score || y.date.localeCompare(x.date); }) 340 .slice(0, 3).map(function (x) { return x.a; }); 341 if (!list.length) return; 342 var sec = document.createElement('section'); 343 sec.className = 'tano-related'; 344 sec.innerHTML = '<h2 class="tano-related__title">é¢é£è¨äº</h2><div class="tix-grid">' + 345 list.map(relatedCard).join('') + '</div>'; 346 // æ¬æ(.notion-root)å ã®æ«å°¾ã«å ¥ãã¦æ¬æã¨å·¦ç«¯ã»å¹ ãæããï¼å ±éãããã¯ã¯é ãæ¸ã¿ï¼ã 347 anchor.appendChild(sec); 348 } 349 350 /* ---------- æ¤ç´¢ï¼ãããå³ã®æ¤ç´¢ãã¿ã³ / ããã¯ã¼å ±éï¼ ---------- */ 351 function injectSearch() { 352 var btn = document.querySelector('.super-navbar__search'); 353 if (!btn) return; 354 btn.style.cursor = 'pointer'; 355 btn.addEventListener('click', function (e) { e.preventDefault(); openSearch(); }); 356 } 357 function openSearch() { 358 { 359 closeOverlays(); 360 var ov = document.createElement('div'); 361 ov.className = 'tano-overlay tano-search'; 362 ov.innerHTML = '<div class="tano-search-box"><div class="tano-search-head">' + 363 '<input type="search" class="tano-search-input" placeholder="è¨äºãæ¤ç´¢ï¼ã¿ã¤ãã«ã»ã¿ã°ï¼" autocomplete="off">' + 364 '<button class="tano-close" aria-label="éãã">Ã</button></div>' + 365 '<div class="tano-search-results"></div></div>'; 366 document.body.appendChild(ov); 367 var input = ov.querySelector('.tano-search-input'); 368 var results = ov.querySelector('.tano-search-results'); 369 input.focus(); 370 function run() { 371 var q = input.value.trim().toLowerCase(); 372 if (!q) { results.innerHTML = '<p class="tano-search-hint">ã¿ã¤ãã«ã»ã¿ã°ã§è¨äºãæ¤ç´¢ã§ãã¾ãã</p>'; return; } 373 var list = ARTICLES.filter(function (a) { 374 return (a.title || '').toLowerCase().indexOf(q) > -1 || 375 (a.labels || []).some(function (l) { return l.toLowerCase().indexOf(q) > -1; }); 376 }); 377 results.innerHTML = list.length ? list.slice(0, 40).map(function (a) { 378 return '<a href="' + esc(a.url) + '">' + 379 (a.cover ? '<span class="tano-sr-cover" style="background-image:url(' + esc(a.cover) + ')"></span>' : '<span class="tano-sr-cover"></span>') + 380 '<span class="tano-sr-t">' + esc(a.title) + '</span></a>'; 381 }).join('') : '<p class="tano-search-hint">該å½ããè¨äºãããã¾ããã</p>'; 382 } 383 input.addEventListener('input', run); 384 run(); 385 ov.addEventListener('click', function (e2) { if (e2.target === ov || e2.target.closest('.tano-close')) ov.remove(); }); 386 document.addEventListener('keydown', function esc2(ev) { if (ev.key === 'Escape') { ov.remove(); document.removeEventListener('keydown', esc2); } }); 387 } 388 } 389 390 /* ---------- ãåãåããã»ãç¸è«ï¼å³ä¸å¸¸è¨FAB â Hyperdashé ä¿¡ãã©ã¼ã ï¼ ---------- 391 å ¨ãã¼ã¸å³ä¸ã«å¸¸è¨ã®FABãåºããã¯ãªãã¯ã§ã¢ã¼ãã«ãéãããã©ã¼ã æ¬ä½ã¯ 392 Hyperdash ã®åãè¾¼ã¿ï¼f.js + data-hd-form="tano-inquiry-hd" ç¸å½ï¼ã 393 é ç®ã»å¿ é æ¡ä»¶ã»éä¿¡å ã»èªåè¿ä¿¡æã¯ Hyperdash å´ã® /formsï¼èå¥å tanoshimo-inquiryï¼ãæã¤ã 394 ããã¯FABã¨ã¢ã¼ãã«ã®æ ï¼ééã»ãªã¼ãã¼ã¬ã¤ã»è¦åºãã»äºç´å°ç·ï¼ã¨åãè¾¼ã¿ã®ç½®ãå ´æã ããæã¤ã 395 396 f.js 㯠data-hd-form ãæã¤è¦ç´ ã DOMContentLoaded æç¹ã§ä¸åº¦ããæ¢ãã«æ¥ãªãã 397 ãã®FABã¯ã¢ã¼ãã«ãã¯ãªãã¯æã«åççæãã¦ããããããã ã¨çæã¿ã¤ãã³ã°ã 398 DOMContentLoadedããå¾ã«ãªããf.jsããæ°¸é ã«è¦ã¤ãããªãããã®ãããã¢ã¼ãã«ã®æ 㯠399 ã¯ãªãã¯ãå¾ ãã init() ã®æç¹ã§ï¼é表示ã®ã
399¾ã¾ï¼DOMã«ä½ã£ã¦ãããSuperLayoutå´ã§ 400 f.js ã app.js ã®ç´å¾ã« defer èªã¿è¾¼ã¿ãã¦ããã®ã¯ãã®é åºï¼æ ãå ãf.jsã®ã¹ãã£ã³ãå¾ï¼ã 401 ä¿è¨¼ãããããééã¯è¦ç´ ã®ä½ãç´ãã§ã¯ãªã hidden ã®ä»ãå¤ãã§è¡ã 402 ï¼closeOverlays() å´ããã®ã¢ã¼ãã«ã ã㯠remove() ãã hidden ã«ããï¼ã */ 403 var HD_INQUIRY_SLUG = 'tanoshimo-inquiry'; 404 // è±èªãã¼ã¸ç¨ã¯å¥ãã©ã¼ã ãHyperdash ã®ãã©ã¼ã ã¯é ç®ã®ã©ãã«ã1è¨èªããæã¦ãªãããã 405 // 2è¨èªã®ãµã¤ãã¯ãè¨èªãã¨ã«ãã©ã¼ã ãä½ã£ã¦è²¼ãåãããéç¨ã«ãªãï¼f.js ã®ã³ã¡ã³ãã«åæ¨ï¼ã 406 // å±ããåãåãããã©ã¡ãã®è¨èªã§æ¸ããããããã¹ã©ãã°ã§åããã 407 // ãã®ã¹ã©ãã°ã Hyperdash å´ã«ã¾ã ç¡ãããã ã¯ãf.js ãæ ã®ä¸ã« 408 // ããã©ã¼ã ãèªã¿è¾¼ããªãã£ããæ¨ã¨ https://focaccia.dev/f/<slug> ã¸ã®ãªã³ã¯ãè±èªã§åºã 409 // ï¼f.js 㯠<html lang> ãè¦ã¦æè¨ãåãæ¿ããï¼ãJSãåããªãå ´åã®åãç¿ã¯æ ã®ä¸ã® noscriptã 410 var HD_INQUIRY_SLUG_EN = 'tanoshimo-inquiry-en'; 411 var inquiryOverlay = null; 412 var inquiryTriggersBound = false; 413 // éä¿¡æåã¤ãã³ãçºç«æã«ã¯ f.js ããã©ã¼ã DOMãæ¢ã«æ¶ãã¦ãããããtopicã®å¤ã¯ 414 // éä¿¡(submit)ã®ç¬éã«éé¿ãã¦ãããGA4è¨æ¸¬ã¯topicãåããªãã¦ãè½ã¨ããªã 415 // ï¼å¿ é ã§ã¯ãªããéä¿¡èªä½ãè¨æ¸¬ã§ããªããã¨ã®æ¹ãåé¡ãªããï¼ã 416 var inquiryLastTopic = ''; 417 // è±èªã®ã¢ã¼ãã«ãæ¥æ¬èªçã«ããé»è©±çªå·ã¨ãªã³ã©ã¤ã³ç§»ä½ç¸è«ã®äºç´ï¼ã©ã¡ããæ¥æ¬èªã®åãå£ï¼ã¯ 418 // ç½®ãããè±èªã®è¡ãå ã¯ãã®ãã©ã¼ã 1ã¤ã«ãããè¦ãç®ã®ã¯ã©ã¹ã¯æ¥æ¬èªçã¨åããã®ãåããã 419 function enInquiryHtml() { 420 return '<div class="tano-fb-modal" role="dialog" aria-modal="true" aria-label="Contact us">' + 421 '<div class="tano-fb-head">' + 422 '<h2 class="tano-fb-title">Contact us</h2>' + 423 '<button class="tano-fb-x tano-fb-cancel" type="button" aria-label="Close">×</button>' + 424 '</div>' + 425 '<div class="tano-fb-body">' + 426 '<p class="tano-fb-lede">Write in English about a visit, a stay, or moving here, and your message goes to the Shimokawa Regional Development Foundation, which publishes this site.</p>' + 427 '<div data-hd-form="' + HD_INQUIRY_SLUG_EN + '">' + 428 '<noscript><a href="https://focaccia.dev/f/' + HD_INQUIRY_SLUG_EN + '">Open the contact form</a></noscript>' + 429 '</div>' + 430 '</div></div>'; 431 } 432 function buildInquiryModal() { 433 if (inquiryOverlay) return inquiryOverlay; 434 var ov = document.createElement('div'); 435 ov.className = 'tano-overlay tano-fb-overlay'; 436 ov.hidden = true; 437 ov.innerHTML = IS_EN ? enInquiryHtml() : 438 '<div class="tano-fb-modal" role="dialog" aria-modal="true" aria-label="ãåãåããã»ãç¸è«">' + 439 '<div class="tano-fb-head">' + 440 '<h2 class="tano-fb-title">ãåãåããã»ãç¸è«</h2>' + 441 '<button class="tano-fb-x tano-fb-cancel" type="button" aria-label="éãã">×</button>' + 442 '</div>' + 443 '<div class="tano-fb-body">' + 444 '<p class="tano-fb-lede">ç§»ä½ãä¸å·çºã®ãã¨ãªã©ããæ°è»½ã«ãç¸è«ãã ããã</p>' + 445 // 話ããã»ããæ©ã人ã«ã¯äºç´ãå ã«åºãã宿¸¬(3/17-8/6)ã§äºç´ã¯45ã¦ã¼ã¶ã¼ã 446 // ãã®ãã©ã¼ã ãéããã®ã¯13ã¦ã¼ã¶ã¼ã§ãæ¸ããã«æ¸ãå°ç·ã®ã»ããé¸ã°ãã¦ããã 447 '<a class="tano-fb-book" href="https://timerex.net/s/shimokawa.town.smoutsoudan/41595f50/" ' + 448 'target="_blank" rel="noopener" data-cta-loc="fab">' + 449 // é¡ã¯ããªã³ã©ã¤ã³ç§»ä½ç¸è«ãã ãã«ããï¼2026-09-20 大æ±ããªã³ã©ã¤ã³ç§»ä½ç¸è«ã§çµ±ä¸ã 450 // ãªã«ãã¤ããªããï¼ã/support ã®ãã¿ã³ç»åãåãèªã«ãããããæä½ã®èª¬æã¯ä¸ã®è£è¶³ãæ ãã 451 '<span class="tano-fb-book__t">ãªã³ã©ã¤ã³ç§»ä½ç¸è«</span>' + 452 '<span class="tano-fb-book__s">æ¥ç¨ãé¸ã¶ã ããæ¸ããã«ç´æ¥è©±ãã¾ã</span></a>' + 453 '<p class="tano-fb-or">ã¾ãã¯ãã¡ãã»ã¼ã¸ãéã</p>' + 454 '<div data-hd-form="' + HD_INQUIRY_SLUG + '">' + 455 '<noscript><a href="https://focaccia.dev/f/' + HD_INQUIRY_SLUG + '">ãåãåãããã©ã¼ã ãéã</a></noscript>' + 456 '</div>' + 457 '</div>' + 458 '<div class="tano-fb-foot">' + 459 '<p class="tano-fb-note">ãæ¥ãã®å ´åã¯ãé»è©±ãã ããï¼01655-4-3511ï¼ã</p>' + 460 '</div></div>'; 461 document.body.appendChild(ov); 462 ov.addEventListener('click', function (e) { if (e.target === ov || e.target.closest('.tano-fb-cancel')) closeInquiry(); }); 463 document.addEventListener('keydown', function (ev) { if (ev.key === 'Escape' && !ov.hidden) closeInquiry(); }); 464 var hdContainer = ov.querySelector('[data-hd-form]'); 465 // capture: f.jsèªèº«ã®submitãã³ãã©ï¼preventDefaultâéåæfetchâDOMæ¸ãæãï¼ãã 466 // å ã«èªããbubbleã§å¾ããåããã¨ããã¨ããã®æç¹ã§DOMãå·®ãæ¿ãã£ã¦ããå ´åãããã 467 hdContainer.addEventListener('submit', function (e) { 468 var sel = e.target && e.target.querySelector && e.target.querySelector('[name="topic"]'); 469 inquiryLastTopic = sel ? sel.value : ''; 470 }, true); 471 hdContainer.addEventListener('hd-form-submitted', function () { 472 var params = { page_path: location.pathname }; 473 if (inquiryLastTopic) params.topic = inquiryLastTopic; 474 track('inquiry_send', params); 475 }); 476 inquiryOverlay = ov; 477 return ov; 478 } 479 function closeInquiry() { if (inquiryOverlay) inquiryOverlay.hidden = true; } 480 function openInquiry() { 481 closeOverlays(); 482 var ov = buildInquiryModal(); 483 ov.hidden = false;
484 } 485 function injectContactFab() { 486 if (document.querySelector('.tano-fab')) return; // äºéæ¿å ¥é²æ¢ 487 // ã¢ã¤ã³ã³ã¯å°çã以åã¯å¹ãåºã(message-circle)ã ã£ãããããã¯ãä»ãããã£ããã§è©±ãããã® 488 // æ £ç¨è¡¨ç¾ã§ãå®éã«éãã®ã¯æãè¿ãé£çµ¡ã®ãã©ã¼ã ãªã®ã§æå¾ ã¨ãããã 489 // 宿¸¬(3/17-8/6)ã§ãã¢ãã¤ã«845ã¦ã¼ã¶ã¼ã«å¯¾ãéããã®ã¯1人ã ã£ãã 490 var icon = '<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m2 7 10 6 10-6"/></svg>'; 491 var fab = document.createElement('button'); 492 fab.type = 'button'; 493 fab.className = 'tano-fab'; 494 fab.setAttribute('aria-label', IS_EN ? 'Contact us' : 'ãåãåããã»ãç¸è«'); 495 // ã¢ãã¤ã«ã¯å¹ ãè¶³ããªãã®ã§çãã©ãã«ã«å·®ãæ¿ããï¼CSSã§åºãåãï¼ã 496 // ã©ãã«ãå®å ¨ã«é ãã¨ä½ã®ãã¿ã³ãåããããæ¼ããã
496ªãã 497 // 2026-09-17: ã©ãã«ãããåãåããã»ãç¸è«ããããä¸å·ã®ãã¨ãç¸è«ãããã¸ã 498 // 宿¸¬(8/1ã9/15)ã§éããã®ã¯PC536人ä¸28人ã»ã¢ãã¤ã«681人ä¸4人ã§ãæ¼ããå ãæ³åãã«ãã 499 // ã®ãçç±ã§ã¯ãªããã¨ãã仮説ãã¢ã¼ãã«ã®ä¸ã®è¨èï¼ãç§»ä½ãä¸å·çºã®ãã¨ãªã©ããæ°è»½ã« 500 // ãç¸è«ãã ãããï¼ã«å¯ãã¦ãä½ãç¸è«ã§ãããããã¿ã³ã®å´ã§è¨ãã 501 fab.innerHTML = icon + (IS_EN 502 ? '<span class="tano-fab__lbl">Contact us</span>' + 503 '<span class="tano-fab__lbl-sm">Contact</span>' 504 : '<span class="tano-fab__lbl">ä¸å·ã®ãã¨ãç¸è«ãã</span>' + 505 '<span class="tano-fab__lbl-sm">ç¸è«ãã</span>'); 506 fab.addEventListener('click', function () { track('inquiry_open', { page_path: location.pathname }); openInquiry(); }); 507 document.body.appendChild(fab); 508 // ã¢ã¼ãã«ã®æ ã¯ããã§ï¼é表示ã®ã¾ã¾ï¼ä½ããçç±ã¯ä¸ã®ã³ã¡ã³ããåç §ã 509 buildInquiryModal(); 510 bindInquiryTriggers(); 511 } 512 513 // FAB以å¤ã®å ´æããã¢ã¼ãã«ãéãå£ãè±èªããã¿ã® Contact ã®ããã«ã 514 // è¡ãå ããã¼ã¸ã§ã¯ãªããã®ãã©ã¼ã ã§ããå°ç·ããã¿ã³ã¨ãã¦ç½®ãããã 515 // ã¢ã¼ãã«ã® markup ãåæã«è¤è£½ããã«æ¸ããããdata-tano-inquiry ãæã¤è¦ç´ ã® 516 // ã¯ãªãã¯ãå§è²ã§åããï¼å±æ§å¤ã¯è¨æ¸¬ä¸ã®ç½®ãå ´æåã¨ãã¦ä½¿ãï¼ã 517 function bindInquiryTriggers() { 518 if (inquiryTriggersBound) return; 519 inquiryTriggersBound = true; 520 document.addEventListener('click', function (e) { 521 var t = e.target && e.target.closest ? e.target.closest('[data-tano-inquiry]') : null; 522 if (!t) return; 523 e.preventDefault(); 524 track('inquiry_open', { 525 page_path: location.pathname, 526 cta_location: t.getAttribute('data-tano-inquiry') || 'trigger' 527 }); 528 openInquiry(); 529 }); 530 } 531 532 // å ±éããã¿ãããã¯ã ããç¯å²æå®ã§é ãï¼èª¤æ¤åºé²æ¢ï¼ã 533 function hideCommonFooterBlock(root) { 534 if (!root) return; 535 var NAV = ['/about', '/inquiry', '/termsofservice', '/privacypolicy', '/mediakit']; 536 var kids = Array.prototype.slice.call(root.children); 537 var anchorIdx = -1; 538 for (var i = 0; i < kids.length; i++) { 539 if (kids[i].querySelector && kids[i].querySelector('a[href="/termsofservice"]')) { anchorIdx = i; break; } 540 } 541 if (anchorIdx < 0) return; // å ±éãããã¯ãç¡ããã¼ã¸ã¯ä½ãããªã 542 function navLink(el) { var a = el.querySelector && el.querySelector('a[href]'); return a && NAV.indexOf(a.getAttribute('href')) > -1; } 543 function deco(el) { return /notion-(divider|image|heading__anchor)/.test(el.className || ''); } 544 function tanoH3(el) { return el.tagName === 'H3' && el.textContent.trim() === 'ã¿ãã·ã¢ãããããã'; } 545 function relH3(el) { return el.tagName === 'H3' && /é¢é£ãµã¤ã/.test(el.textContent); } 546 function extP(el) { return el.tagName === 'P' && el.querySelector && el.querySelector('a[href^="http"]'); } 547 var start = anchorIdx, end = anchorIdx; 548 while (start - 1 >= 0 && (navLink(kids[start - 1]) || deco(kids[start - 1]) || tanoH3(kids[start - 1]))) start--; 549 while (end + 1 < kids.length && (navLink(kids[end + 1]) || deco(kids[end + 1]) || relH3(kids[end + 1]) || extP(kids[end + 1]))) end++; 550 for (var j = start; j <= end; j++) kids[j].style.display = 'none'; 551 } 552 553 /* ---------- ããã¿ã¼çµ±å ---------- 554 è¨äºæ¬ææ«ã«ããå ±éãããã¯ï¼ã¿ãã·ã¢ããããããï¼ãµã¤ãããï¼é¢é£ãµã¤ãï¼ãé ãã 555 ãã®å 容ã財å£ã³ã³ã¿ã¯ãã»SNSã¨éè¤æé¤ãã¦ããã¿1ãããã¯ã«éç´ãããå ¨ãã¼ã¸å ±éã */ 556 function buildFooter() { 557 // 1) æ¬ææ«ã®å ±éãããã¯ï¼ã¿ãã·ã¢ããããããï¼ãµã¤ãããï¼é¢é£ãµã¤ãï¼ãé ãã 558 // ãã¼ãã¼è¦åºãçã®èª¤æ¤åºãé¿ããããããã®åºç»ã«ããç¡ã /termsofservice ãªã³ã¯ã 559 // èµ·ç¹ã«ãå ±éãããã¯æ§æè¦ç´ (ãã/è£ é£¾/é¢é£ãµã¤ãH3/å¤é¨ãªã³ã¯)ã ããåå¾ã¸æ¡å¼µãã¦é ãã 560 hideCommonFooterBlock(document.querySelector('.notion-root')); 561 // 2) çµ±åããã¿ãæç»ã
562 // é常㯠scripts/apply-footer.mjs ããã«ãæã«æãè¾¼ã¿æ¸ã¿ãªã®ã§ãããã¯ä½ãããªã 563 // ï¼ãªã³ã¯å®ç¾©ã®æ£å ¸ã¯ src/data/footer-links.jsonãJSãå®è¡ããªãã¯ãã¼ã©ã«ãå±ãï¼ã 564 // 以ä¸ã¯ããã®å¦çãéã£ã¦ããªãææç©ã«å¯¾ãããã©ã¼ã«ããã¯ã 565 // ãªã³ã¯ã墿¸ããã¨ã㯠footer-links.json ãç´ããã¨ãããã¯è§¦ããªãã¦ããã 566 var footer = document.querySelector('.super-footer__content') || document.querySelector('.super-footer'); 567 if (!footer || document.querySelector('.tano-footer-merged')) return; 568 var NAV = [ 569 ['ãã®Webãµã¤ãã«ã¤ãã¦', '/about'], ['ãåãåãã', '/inquiry'], ['å©ç¨è¦ç´', '/termsofservice'], 570 ['ãã©ã¤ãã·ã¼ããªã·ã¼', '/privacypolicy'], ['ã¡ãã£ã¢ããã', '/mediakit'] 571 ]; 572 var REL = [ 573 ['ä¸å·çº', 'https://www.town.shimokawa.hokkaido.jp/'], 574 ['ä¸è¬è²¡å£æ³äººããããå°åæ¯èæ©æ§', 'https://www.shimokawa-zaidan.jp/'], 575 ['ãããã財å£ã®note', 'https://note.com/bears_lab'], 576 ['ç§»ä½ãµãã¼ãYouTube', 'https://www.youtube.com/@%E5%8C%97%E6%B5%B7%E9%81%93%E4%B8%8B%E5%B7%9D%E7%94%BA%E7%A7%BB%E4%BD%8F%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88'], 577 ['ãããã空ãå®¶ãã³ã¯', 'https://shimokawa-akiyabank.net/'], 578 ['ä¸å·çºå ¬å¶ä½å® æ å ±WEB', 'https://shimokawa-housing.info/'], 579 ['ä¸å·äººè²¡ãã³ã¯', 'https://shimokawa-jinzai-bank.jp/'], 580 ['ç§»ä½ çæ´»è²»ã·ãã¥ã¬ã¼ã·ã§ã³', 'https://haj.kurashigoto.hokkaido.jp/simulation/shimokawa?district_id=3&family_id=2&quantity=150000'], 581 ['DOORS.hokkaido X', 'https://x.com/2q1ot9opq2azrh6'], 582 ['DOORS.hokkaido note', 'https://note.com/doors_hokkaido'] 583 ]; 584 function links(arr, ext) { 585 return arr.map(function (x) { 586 return '<a href="' + x[1] + '"' + (ext ? ' target="_blank" rel="noopener"' : '') + '>' + x[0] + '</a>'; 587 }).join(''); 588 } 589 var box = document.createElement('div'); 590 box.className = 'tano-footer-merged'; 591 box.innerHTML = 592 '<div class="tano-fm-col"><p class="tano-fm-h">ãµã¤ã</p>' + links(NAV, false) + '</div>' + 593 '<div class="tano-fm-col tano-fm-wide"><p class="tano-fm-h">é¢é£ãµã¤ã</p><div class="tano-fm-rel">' + links(REL, true) + '</div></div>' + 594 '<div class="tano-fm-col"><p class="tano-fm-h">ãåãåãã</p>' + 595 '<p class="tano-fm-org">ä¸è¬è²¡å£æ³äººããããå°åæ¯èæ©æ§ï¼ãããã財å£ï¼</p>' + 596 '<a href="tel:0165543511">é»è©± 01655-4-3511</a>' + 597 '<a href="mailto:[email protected]">[email protected]</a>' + 598 '<a href="https://line.me/R/ti/p/@371dzkvg?oat_content=url&ts=02171606" target="_blank" rel="noopener">å ¬å¼LINEç»é²</a>' + 599 '</div>'; 600 footer.appendChild(box); 601 } 602 603 /* ---------- æ±äººã«ã¼ã â 詳細ã¢ã¼ãã«ï¼/recruit ã®ä¸å·äººè²¡ãã³ã¯æ±äººï¼ ---------- */ 604 var JINZAI_LOGIN = 'https://shimokawa-jinzai-bank.jp/login.php'; 605 function injectJobModal() { 606 var grid = document.querySelector('.tano-jobs'); 607 if (!grid) return; // /recruit 以å¤ã§ã¯ä½ãããªã 608 grid.addEventListener('click', function (e) { 609 var card = e.target && e.target.closest ? e.target.closest('.tano-jobcard') : null; 610 if (!card) return; 611 var raw = card.querySelector('.tano-jobdata'); 612 if (!raw) return; 613 var j; 614 try { j = JSON.parse(raw.textContent); } catch (err) { return; } 615 openJobModal(j); 616 }); 617 } 618 function openJobModal(j) { 619 closeOverlays(); 620 function row(label, val) { 621 return val ? '<div class="tano-jobmodal__row"><span class="tano-jobmodal__k">' + esc(label) + '</span><span class="tano-jobmodal__v">' + esc(val) + '</span></div>' : ''; 622 } 623 // detail_url 㯠fetch-jobs.mjs ã https åºå®ã§çæããããä¸ä¸ javascript: çã® 624 // å±éºã¹ãã¼ã ãæ··ãã£ã¦ã href ã«æµããªããããhttp(s) 以å¤ã¯ç¡å¹åããï¼XSSé²å¾¡ï¼ã 625 var safeDetail = /^https?:\/\//i.test(j.detail_url || '') ? j.detail_url : '#'; 626 // thumb ã¯ãã¼ã«ã«è³ç£ã®ã¿è¨±å®¹ï¼å¤é¨URLã誤ã£ã¦æ··ãã¦ã img ã«æµããªãã»XSS/hotlinké²å¾¡ï¼ã 627 var safeThumb = /^\/assets\//.test(j.thumb || '') ? j.thumb : ''; 628 // å¤é¨ãµã¤ãé·ç§»ãæç¤ºããå¤é¨ãªã³ã¯ã¢ã¤ã³ã³ï¼CollectionLayout ã® tano-collextlink ã¨åãå½¢ï¼ã 629 var extIcon = '<svg class="tano-extico" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>'; 630 var ov = document.createElement('div'); 631 ov.className = 'tano-overlay tano-jobmodal-ov'; 632 ov.innerHTML = 633 '<div class="tano-jobmodal" role="dialog" aria-modal="true" aria-label="' + esc(j.title) + '">' + 634 '<button class="tano-close" aria-label="éãã">Ã</button>' + 635 (safeThumb ? '<img class="tano-jobmodal__thumb" src="' + esc(safeThumb) + '" alt="" loading="lazy">' : '') + 636 '<p class="tano-jobmodal__company">' + esc(j.company) + '</p>' + 637 '<h2 class="tano-jobmodal__title">' + esc(j.title) + '</h2>' + 638 (j.posted_date ? '<p class="tano-jobmodal__date">æ²è¼æ¥ ' + esc(j.posted_date) + '</p>' : '') + 639 '<div class="tano-jobmodal__info">' + 640 row('給ä¸', j.salary) + row('å¤åå°', j.location) + row('å¤åæé', j.hours) + row('éç¨å½¢æ ', j.employment_type) + 641 '</div>' + 642 '<div class="tano-jobmodal__desc">' + esc(j.description).replace(/\n/g, '<br>') + '</div>' + 643 '<div class="tano-jobmodal__actions">' + 644 '<a class="tano-jobmodal__detail" href="' + esc(safeDetail) + '" target="_blank" rel="noopener" data-job-detail="' + esc(j.job_id) + '">å ã®æ±äººãã¼ã¸ãè¦ã' + extIcon + '</a>' + 645 '<a class="tano-jobmodal__apply" href="' + JINZAI_LOGIN + '" target="_blank" rel="noopener" data-job-apply="' + esc(j.job_id) + '">ãã°ã¤ã³ãã¦å¿å' + extIcon + '</a>' + 646 '</div>' + 647 '</div>'; 648 document.body.appendChild(ov); 649 ov.addEventListener('click', function (e) { 650 if (e.target === ov || e.target.closest('.tano-close')) ov.remove(); 651 }); 652 document.addEventListener('keydown', function esc3(ev) { if (ev.key === 'Escape') { ov.remove(); document.removeEventListener('keydown', esc3); } }); 653 } 654 655 /* ---------- 空ãå®¶ãã³ã¯ç©ä»¶ã¢ã¼ãã«ï¼/akiyaï¼ ---------- */ 656 function injectAkiyaModal() { 657 var grid = document.querySelector('.tano-akiya'); 658 if (!grid) return; // /akiya 以å¤ã§ã¯ä½ãããªã 659 grid.addEventListener('click', function (e) { 660 var card = e.target && e.target.closest ? e.target.closest('.tano-propcard') : null; 661 if (!card) return; 662 var raw = card.querySelector('.tano-propdata'); 663 if (!raw) return; 664 var p;
665 try { p = JSON.parse(raw.textContent); } catch (err) { return; } 666 openPropModal(p); 667 }); 668 } 669 function openPropModal(p) { 670 closeOverlays(); 671 // detail_url 㯠fetch-akiya.mjs ã https åºå®ã§çæããããå±éºã¹ãã¼ã 㯠href ã«æµããªãï¼XSSé²å¾¡ï¼ã 672 var safeDetail = /^https?:\/\//i.test(p.detail_url || '') ? p.detail_url : '#'; 673 var safeThumb = /^\/assets\//.test(p.thumb || '') ? p.thumb : ''; 674 var extIcon = '<svg class="tano-extico" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>'; 675 var specRows = (p.specs || []).map(function (s) { 676 return '<div class="tano-jobmodal__row"><span class="tano-jobmodal__k">' + esc(s.label) + '</span><span class="tano-jobmodal__v">' + esc(s.value) + '</span></div>'; 677 }).join(''); 678 var badges = '<span class="tano-propbadge">' + (p.category === 'rent' ? 'è³è²¸' : '売買') + '</span>' + 679 (p.sold ? '<span class="tano-propbadge tano-propbadge--sold">æç´æ¸</span>' : ''); 680 // ã¢ã¯ã·ã§ã³ã¯1ã¤ã ãï¼é·ç§»å ã¯ç©ä»¶ãã¼ã¸ã§å ±éï¼ãåéä¸ã¯ãã¿ã³ãæç´æ¸ã¯ 681 // æ§ãããªããã¹ããªã³ã¯ã§åºãåãããã©ãã«ã¯ãç©ä»¶ã®è©³ç´°ãè¦ããã§çµ±ä¸ã 682 var actCls = p.sold ? 'tano-jobmodal__detail' : 'tano-jobmodal__apply'; 683 var actions = '<a class="' + actCls + '" href="' + esc(safeDetail) + '" target="_blank" rel="noopener" data-prop-detail="' + esc(p.prop_id) + '">ç©ä»¶ã®è©³ç´°ãè¦ã' + extIcon + '</a>'; 684 var ov = document.createElement('div'); 685 ov.className = 'tano-overlay tano-jobmodal-ov'; 686 ov.innerHTML = 687 '<div class="tano-jobmodal" role="dialog" aria-modal="true" aria-label="' + esc(p.title) + '">' + 688 '<button class="tano-close" aria-label="éãã">Ã</button>' + 689 (safeThumb ? '<img class="tano-jobmodal__thumb" src="' + esc(safeThumb) + '" alt="" loading="lazy">' : '') + 690 '<p class="tano-jobmodal__company tano-propmodal__badges">' + badges + '</p>' + 691 '<h2 class="tano-jobmodal__title">' + esc(p.title) + '</h2>' + 692 '<div class="tano-jobmodal__info">' + specRows + '</div>' + 693 (p.description ? '<div class="tano-jobmodal__desc">' + esc(p.description).replace(/\n/g, '<br>') + '</div>' : '') + 694 '<div class="tano-jobmodal__actions">' + actions + '</div>' + 695 '</div>'; 696 document.body.appendChild(ov); 697 ov.addEventListener('click', function (e) { 698 if (e.target === ov || e.target.closest('.tano-close')) ov.remove(); 699 }); 700 document.addEventListener('keydown', function esc4(ev) { if (ev.key === 'Escape') { ov.remove(); document.removeEventListener('keydown', esc4); } }); 701 } 702 703 /* ---------- init ---------- */ 704 // ããã¼ãããæ¢ããããã¼ã¯å¤§æ±æç¤ºã§æ¤å»ï¼2026-07-23ï¼ãå ¥å£ã¿ã¤ã«ã¨ããã»ã¢ãã»ã³ãã§ä»£æ¿ã 705 // å¼ã³åºãã ãå¤ãã¦é¢æ°ãæ®ã£ã¦ããã®ã§ã2026-09-02 ã«é¢æ°æ¬ä½ã¨CSSãæ¶ããã 706 function init() { 707 // è±èªãã¼ã¸ã¯æ¥æ¬èªã®å¨ãåºããªãï¼IS_EN ã®å®£è¨ã®ã¨ããã«çç±ï¼ãããã®éå · 708 // ï¼æåãµã¤ãºã»â ããã¯ãã¼ã¯ï¼ã»è¨äºæ¤ç´¢ã»ããã¿ã®çµã¿ç´ãã¯æ¥æ¬èªãã¼ã¸ã ãã 709 // è±èªã®ããã¿ã¯ EnFooter.astro ããã«ãæã«æãã¦ãããJSã§è¶³ããã®ã¯ç¡ãã 710 if (IS_EN) { injectMobileMenu(); injectContactFab(); return; } 711 injectNavbar(); injectMobileMenu(); injectSearch(); buildFooter(); injectJobModal(); injectAkiyaModal(); injectContactFab(); 712 initReadEnd(); 713 } 714 715 /* ---------- èªäºæã®ãã¤ãªããå ¥å£ãããã« ---------- */ 716 // ReadEndPanel.astro ãæ¬æã®ç´å¾ã«ç½®ãç®å°ï¼.tano-readend-markï¼ãç»é¢ã«å ¥ã£ããã 717 // åãã³ã³ãã¼ãã³ããæããããã«ï¼.tano-readendï¼ãåºããæè¨ã¨è¡ãå 㯠cta.mjs ãæ±ºãã 718 // ããã¯ãåºãï¼éããï¼é »åº¦ãã ããæã¤ã 719 // é »åº¦: 1åã®è¨ªåã§3åã¾ã§ï¼éããã3æ¥åºããªãï¼2026-09-14 å¤§æ±æå®ï¼ã 720 // ã訪åã㯠sessionStorageï¼ã¿ããéããã¾ã§ï¼ã§æ°ããã 721 // LINEãæ¼ãã人ã以å¾ãã£ã¨æ¢ããè¦å㯠2026-09-17 ã«æ¤åããï¼å¤§æ±ãæå¤§3åã®ã«ã¼ã«ã«åããããï¼ã 722 // æ¼ããåã1åã¨ãã¦æ°ãããã®ãã¼ã¸ã§ã¯éããã ãã«ããã 723 var RE_UNTIL_KEY = 'tano:readend:until'; 724 var RE_COUNT_KEY = 'tano:readend:count';
725 var RE_MAX_PER_VISIT = 3; 726 var RE_SNOOZE_MS = 3 * 24 * 60 * 60 * 1000; 727 var RE_PANEL_W = 300; // overrides.css ã® .tano-readend.is-side ã®å¹ ã¨ä¸è´ããã 728 function reStore(session) { try { return session ? window.sessionStorage : window.localStorage; } catch (e) { return null; } } 729 function reGet(session, k) { var s = reStore(session); try { return s ? s.getItem(k) : null; } catch (e) { return null; } } 730 function reSet(session, k, v) { var s = reStore(session); try { if (s) s.setItem(k, v); } catch (e) {} } 731 function readEndAllowed() { 732 var until = parseInt(reGet(false, RE_UNTIL_KEY), 10); 733 if (until && Date.now() < until) return false; 734 return (parseInt(reGet(true, RE_COUNT_KEY), 10) || 0) < RE_MAX_PER_VISIT; 735 } 736 function showReadEnd(panel, mark) { 737 // æ¬æã®å³ã«ãããã«å¹ ï¼å·¦å³ã®ä½ç½ãã空ãã¦ããã°å³ãããç¡ããã°ä¸ããåºãã 738 var side = window.innerWidth - mark.getBoundingClientRect().right >= RE_PANEL_W + 44; 739 panel.classList.toggle('is-side', side); 740 panel.classList.toggle('is-sheet', !side); 741 panel.hidden = false; 742 if (!side) document.body.classList.add('tano-readend-sheet'); 743 // hidden ãå¤ããã®ã¨åããã¬ã¼ã ã§ã¯ transition ãèµ°ããªãã®ã§ã2ãã¬ã¼ã å¾ ã£ã¦ããåããã 744 requestAnimationFrame(function () { requestAnimationFrame(function () { panel.classList.add('is-in'); }); }); 745 } 746 function hideReadEnd(panel) { 747 panel.classList.remove('is-in'); 748 document.body.classList.remove('tano-readend-sheet'); 749 setTimeout(function () { if (!panel.classList.contains('is-in')) panel.hidden = true; }, 360); 750 } 751 function initReadEnd() { 752 var mark = document.querySelector('.tano-readend-mark'); 753 var panel = document.querySelector('.tano-readend'); 754 if (!mark || !panel || !('IntersectionObserver' in window)) return; 755 // ç¥å ã« transform ãªã©ãä»ã㨠position:fixed ãç»é¢åºæºã§ãªããªãã®ã§ãbody ç´ä¸ã¸ç§»ãã 756 document.body.appendChild(panel); 757 var kind = panel.getAttribute('data-kind') || ''; 758 var closeBtn = panel.querySelector('.tano-readend__close'); 759 closeBtn.addEventListener('click', function () { 760 reSet(false, RE_UNTIL_KEY, String(Date.now() + RE_SNOOZE_MS)); 761 track('readend_panel_dismiss', { kind: kind }); 762 hideReadEnd(panel); 763 }); 764 // ããã«ã®ãªã³ã¯ï¼LINEã»ç§»ä½ç¸è«ï¼ãæ¼ããã¨ãã¯ããã®ãã¼ã¸ã§ã¯éããã 765 // 以å¾ã®åºãæ¹ã¯å¤ããªãï¼3åã¾ã§ã®è¦åã«å¾ãã2026-09-17 å¤§æ±æç¤ºã§LINEã®æ°¸ä¹ åæ¢ã¯æ¤åï¼ã 766 panel.addEventListener('click', function (e) { 767 if (e.target.closest('a')) hideReadEnd(panel); 768 }); 769 document.addEventListener('keydown', function (e) { 770 if (e.key === 'Escape' && !panel.hidden) closeBtn.click(); 771 }); 772 var seen = false; 773 var io = new IntersectionObserver(function (entries) { 774 if (seen || !entries.some(function (en) { return en.isIntersecting; })) return; 775 // éããæç¹ã§æ¬æã®çµããã¾ã§è¦ãã¦ããçããã¼ã¸ã¯ãèªã¿çµããã¨ã¯è¨ããªãã®ã§åºããªãã 776 if ((window.scrollY || document.documentElement.scrollTop) < window.innerHeight * 0.5) return; 777 seen = true; 778 io.disconnect(); 779 // æ¬æã®çµããã«å±ãããã¨èªä½ãè¨é²ããï¼article_scroll_75 ã¯ãã¼ã¸å ¨ä½ã®75%ã§ã 780 // è¨äºã«ãã£ã¦æ¬æã®éä¸ã§çºç«ãããããèªäºã®ææ¨ã¨ãã¦ã¯ãã¡ãã使ãï¼ã 781 track('article_read_end', { page: location.pathname }); 782 if (!readEndAllowed()) return; 783 reSet(true, RE_COUNT_KEY, String((parseInt(reGet(true, RE_COUNT_KEY), 10) || 0) + 1)); 784 showReadEnd(panel, mark); 785 track('readend_panel_view', { kind: kind }); 786 }); 787 io.observe(mark); 788 } 789 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init(); 790 791 // articles.json ã¯æ¥æ¬èªè¨äºã®ä¸è¦§ãè±èªãã¼ã¸ã§ã¯ä¿å/å ±æãã¼ãé¢é£è¨äºãåºããªãã®ã§åãã«è¡ããªãã 792 if (!IS_EN) { 793 fetch('/articles.json').then(function (r) { return r.json(); }).then(function (d) { 794 ARTICLES = d; updateBmCount(); injectArticleBar(); injectRelated(); 795 }).catch(function () { injectArticleBar(); }); 796 } 797})();
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.