`; document.body.appendChild(el); return el; } const bubble = ensureBubble(); const elH = bubble.querySelector("#tt-title"); const elB = bubble.querySelector("#tt-body"); const elClose = bubble.querySelector(".tt-close"); // ---------------- Parse [[term|heading|body]] anywhere ---------------- const TOKEN_RE = /\[\[([^|\]]+)\|([^|\]]+)\|([^\]]+)\]\]/g; const BLOCK_SKIP = new Set(["SCRIPT","STYLE","NOSCRIPT","TEXTAREA","INPUT","SELECT","CODE","PRE","TEMPLATE","IFRAME"]); function shouldSkipTextNode(n){ let el = n.parentElement; while (el){ if (BLOCK_SKIP.has(el.tagName) || el.isContentEditable) return true; el = el.parentElement; } return false; } const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT); const textNodes = []; while (walker.nextNode()){ const n = walker.currentNode; if (!n.nodeValue || shouldSkipTextNode(n)) continue; if (TOKEN_RE.test(n.nodeValue)) textNodes.push(n); TOKEN_RE.lastIndex = 0; } textNodes.forEach(node => { const frag = document.createDocumentFragment(); const insideLink = !!node.parentElement.closest("a"); let text = node.nodeValue, last = 0; TOKEN_RE.lastIndex = 0; let m; while ((m = TOKEN_RE.exec(text))){ if (m.index > last) frag.appendChild(document.createTextNode(text.slice(last, m.index))); const term=m[1].trim(), heading=m[2].trim(), body=m[3].trim(); const t = insideLink ? document.createElement("span") : document.createElement("button"); if (insideLink){ t.setAttribute("role","button"); t.setAttribute("tabindex","0"); } else { t.type="button"; } t.className="tt-trigger"; t.textContent=term; t.setAttribute("data-tt-h", heading); t.setAttribute("data-tt-b", body); t.setAttribute("aria-haspopup","dialog"); t.setAttribute("aria-expanded","false"); frag.appendChild(t); last = TOKEN_RE.lastIndex; } if (last = 2) return el; el = el.parentElement; } // Fallback: nearest non-inline container el = trigger.parentElement || document.body; while (el && el !== document.body){ const d = getComputedStyle(el).display; if (d !== "inline" && d !== "contents") return el; el = el.parentElement; } return document.body; } // Utility: child of `ancestor` that contains `target` (direct child) function directChildContaining(ancestor, target){ for (const ch of ancestor.children){ if (ch === target || ch.contains(target)) return ch; } return null; } function getElementTarget(e) { // If target is already an Element, use it if (e.target instanceof Element) return e.target; // Otherwise, walk the composed/path for the first Element const path = (typeof e.composedPath === 'function') ? e.composedPath() : []; for (const n of path) if (n instanceof Element) return n; return null; } // ---------------- Dim everything except the trigger branch (sibling branches only) ---------------- function dimAllOtherBranches(container, trigger){ undim(); // clear previous const dimEls = []; const wrappedTexts = []; const pathEls = []; // Build ELEMENT-only path [container -> ... -> trigger] const path = []; for (let el = trigger; el && el !== container; el = el.parentElement) path.push(el); path.push(container); path.reverse(); // At each ancestor level, find the *direct* child that leads to the trigger for (let i = 0; i { if (node.nodeType !== 3) return; // text only if (!node.nodeValue || !node.nodeValue.trim()) return; // If this text node sits inside branchChild, skip if (branchChild && branchChild.contains && branchChild.contains(node)) return; const span = document.createElement("span"); span.style.transition = `opacity ${DIM_EASE_MS}ms ease`; span.style.opacity = String(DIM_OPACITY); span.textContent = node.nodeValue; node.parentNode.replaceChild(span, node); wrappedTexts.push(span); }); // Keep a reference to the path elements (so we can explicitly restore opacity if needed) if (anc && anc.nodeType === 1) pathEls.push(anc); } // Hard-guard: explicitly set opacity:1 on the entire path to neutralize any inherited fade pathEls.forEach(el => { el.style.opacity = "1"; }); dimCtx = { container, dimEls, wrappedTexts, pathEls }; } function undim(){ if (!dimCtx) return; const { dimEls, wrappedTexts, pathEls } = dimCtx; // Animate back dimEls.forEach(el => { el.style.transition = `opacity ${DIM_EASE_MS}ms ease`; el.style.opacity = "1"; // remove inline style after the animation so we don't override site CSS setTimeout(() => { if (el) el.style.opacity = ""; }, DIM_EASE_MS + 50); }); wrappedTexts.forEach(span => { span.style.transition = `opacity ${DIM_EASE_MS}ms ease`; span.style.opacity = "1"; span.addEventListener("transitionend", () => { if (!span.parentNode) return; span.parentNode.replaceChild(document.createTextNode(span.textContent || ""), span); }, { once:true }); }); // Clear hard-guard on path pathEls.forEach(el => { if (el) el.style.opacity = ""; }); dimCtx = null; } // ---------------- Positioning (centered, edge-aware, flip) ---------------- function clamp(v,min,max){ return Math.max(min,Math.min(max,v)); } function measureBubbleForPlacement(){ const wasOpen = bubble.classList.contains("is-open"); if (!wasOpen){ bubble.style.visibility="hidden"; bubble.classList.add("is-open"); } const rect = bubble.getBoundingClientRect(); if (!wasOpen){ bubble.classList.remove("is-open"); bubble.style.visibility=""; } return { w: rect.width, h: rect.height }; } function placeAnchored(trigger){ const vw=innerWidth, vh=innerHeight; const r = trigger.getBoundingClientRect(); const { w, h } = measureBubbleForPlacement(); let left = r.left + (r.width/2) - (w/2); left = clamp(left, EDGE_PADDING, Math.max(EDGE_PADDING, vw - EDGE_PADDING - w)); const topBelow = r.bottom + OFFSET_Y; const spaceBelow = vh - topBelow - EDGE_PADDING; const placeBelow = spaceBelow >= h; let top = placeBelow ? topBelow : (r.top - h - OFFSET_Y); top = clamp(top, EDGE_PADDING, Math.max(EDGE_PADDING, vh - EDGE_PADDING - h)); bubble.style.left = left + "px"; bubble.style.top = top + "px"; const br = bubble.getBoundingClientRect(); if (br.bottom > vh - EDGE_PADDING){ bubble.style.maxHeight = (vh - 2*EDGE_PADDING) + "px"; bubble.style.overflowY = "auto"; } else { bubble.style.maxHeight = "none"; bubble.style.overflowY = "visible"; } } // ---------------- Open / Close (place → fade/scale) ---------------- function animateIn(){ bubble.style.transition = "none"; bubble.style.opacity = "0"; bubble.style.transform = "scale(0.95)"; void bubble.offsetWidth; bubble.style.transition = "opacity .18s ease, transform .18s ease"; bubble.style.opacity = "1"; bubble.style.transform = "scale(1)"; } function animateOut(done){ bubble.style.transition = "opacity .16s ease, transform .16s ease"; bubble.style.opacity = "0"; bubble.style.transform = "scale(0.95)"; const end = () => { bubble.removeEventListener("transitionend", end); done && done(); }; bubble.addEventListener("transitionend", end); setTimeout(end, 260); } function openFromTrigger(trigger){ if (current && current !== trigger) forceClose(); current = trigger; trigger.setAttribute("aria-expanded","true"); elH.textContent = trigger.getAttribute("data-tt-h") || ""; elB.textContent = trigger.getAttribute("data-tt-b") || ""; bubble.classList.add("is-open"); bubble.setAttribute("aria-hidden","false"); placeAnchored(trigger); animateIn(); const container = findTextContainer(trigger); dimAllOtherBranches(container, trigger); hoverCount = 0; cancelCloseTimer(); } function forceClose(){ if (!current) return; bubble.classList.remove("is-open"); bubble.setAttribute("aria-hidden","true"); current.setAttribute("aria-expanded","false"); current = null; undim(); hoverCount = 0; cancelCloseTimer(); } function closeWithAnim(){ if (!current) return; const t = current; animateOut(() => { bubble.classList.remove("is-open"); bubble.setAttribute("aria-hidden","true"); t.setAttribute("aria-expanded","false"); current = null; undim(); }); } function scheduleClose(){ cancelCloseTimer(); closeTimer = setTimeout(() => { if (hoverCount { if (isCoarse()) return; const target = getElementTarget(e); if (!target) return; const t = target.closest(".tt-trigger"); if (!t) return; onZoneEnter(); if (!current || current !== t) openFromTrigger(t); }; const handleLeave = (e) => { if (isCoarse()) return; const target = getElementTarget(e); if (!target) return; const t = target.closest(".tt-trigger"); if (!t) return; onZoneLeave(); }; document.addEventListener("pointerenter", handleEnter, true); document.addEventListener("mouseenter", handleEnter, true); document.addEventListener("pointerleave", handleLeave, true); document.addEventListener("mouseleave", handleLeave, true); // ---------------- Keyboard ---------------- document.addEventListener("focusin", (e) => { if (!e.target) return; const t = e.target.closest(".tt-trigger"); if (t) openFromTrigger(t); }); document.addEventListener("focusout", (e) => { if (!e.target) return; const t = e.target.closest(".tt-trigger"); if (t && current === t) closeWithAnim(); }); // ---------------- Mobile / coarse ---------------- document.addEventListener("pointerdown", (e) => { if (!isCoarse()) return; const t = e.target.closest(".tt-trigger"); if (!t) return; e.preventDefault(); e.stopPropagation(); if (current === t && bubble.classList.contains("is-open")) { closeWithAnim(); return; } openFromTrigger(t); }, true); document.addEventListener("click", (e) => { if (!isCoarse()) return; if (!bubble.classList.contains("is-open")) return; const inBubble = !!e.target.closest(".tt-bubble"); const onTrigger = !!e.target.closest(".tt-trigger"); if (!inBubble && !onTrigger) closeWithAnim(); }, true); // Close button + ESC elClose.addEventListener("click", closeWithAnim); document.addEventListener("keydown", (e) => { if (e.key === "Escape") closeWithAnim(); }); // Reposition on resize/scroll while open const reposition = () => { if (!current) return; placeAnchored(current); }; addEventListener("resize", reposition, { passive: true }); addEventListener("scroll", reposition, { passive: true }); });

ブログ

Claude を活用して構築を行うチーム向けの製品ニュースとベストプラクティス。

Claude を試す

New in Claude Managed Agents: self-hosted sandboxes and MCP tunnels

May 19, 2026
詳細を読む

Built-in memory for Claude Managed Agents

April 23, 2026
詳細を読む

Harnessing Claude’s intelligence

April 2, 2026
詳細を読む

Claude now creates interactive charts, diagrams and visualizations

March 12, 2026
詳細を読む

2026年、企業における AI エージェント構築の現状

December 9, 2025
詳細を読む

スキルを通じたフロントエンドデザインの改善

November 12, 2025
詳細を読む

ウェブ上のClaude Code

October 20, 2025
詳細を読む

Claude in Chrome のパイロット試験

August 25, 2025
詳細を読む

AnthropicチームによるClaude Codeの活用方法

July 24, 2025
詳細を読む

Max planの紹介

April 9, 2025
詳細を読む

New in Claude Managed Agents: self-hosted sandboxes and MCP tunnels

May 19, 2026
詳細を読む

Built-in memory for Claude Managed Agents

April 23, 2026
詳細を読む

Harnessing Claude’s intelligence

April 2, 2026
詳細を読む

Claude now creates interactive charts, diagrams and visualizations

March 12, 2026
詳細を読む

2026年、企業における AI エージェント構築の現状

December 9, 2025
詳細を読む

スキルを通じたフロントエンドデザインの改善

November 12, 2025
詳細を読む

ウェブ上のClaude Code

October 20, 2025
詳細を読む

Claude in Chrome のパイロット試験

August 25, 2025
詳細を読む

AnthropicチームによるClaude Codeの活用方法

July 24, 2025
詳細を読む

Max planの紹介

April 9, 2025
詳細を読む
フィルターと並べ替え
ありがとうございます。フォームが受理されました。
申し訳ございません。フォームを送信中にエラーが発生しました。
ありがとうございます。フォームが受理されました。
申し訳ございません。フォームを送信中にエラーが発生しました。
Jun 8, 2026
Observability for developers building connectors
Observability for developers building connectors
June 8, 2026
Observability for developers building connectors
Observability for developers building connectors
May 19, 2026
New in Claude Managed Agents: self-hosted sandboxes and MCP tunnels
製品発表
New in Claude Managed Agents: self-hosted sandboxes and MCP tunnels
May 19, 2026
New in Claude Managed Agents: self-hosted sandboxes and MCP tunnels
New in Claude Managed Agents: self-hosted sandboxes and MCP tunnels
May 15, 2026
Deploying Claude across the legal industry
エンタープライズ AI
Deploying Claude across the legal industry
May 15, 2026
Deploying Claude across the legal industry
Deploying Claude across the legal industry
May 14, 2026
The founder's playbook: Building an AI-native startup
コーディング
The founder's playbook: Building an AI-native startup
May 14, 2026
The founder's playbook: Building an AI-native startup
The founder's playbook: Building an AI-native startup
May 13, 2026
Best practices for computer and browser use with Claude
Best practices for computer and browser use with Claude
May 13, 2026
Best practices for computer and browser use with Claude
Best practices for computer and browser use with Claude
May 12, 2026
Code w/ Claude SF 2026 recap: Building on the AI exponential
製品発表
Code w/ Claude SF 2026 recap: Building on the AI exponential
May 12, 2026
Code w/ Claude SF 2026 recap: Building on the AI exponential
Code w/ Claude SF 2026 recap: Building on the AI exponential
May 12, 2026
法務業界向けの Claude
製品発表
法務業界向けの Claude
May 12, 2026
法務業界向けの Claude
法務業界向けの Claude
Apr 30, 2026
Claude Security is now in public beta
製品発表
Claude Security is now in public beta
April 30, 2026
Claude Security is now in public beta
Claude Security is now in public beta
Apr 23, 2026
Built-in memory for Claude Managed Agents
製品発表
Built-in memory for Claude Managed Agents
April 23, 2026
Built-in memory for Claude Managed Agents
Built-in memory for Claude Managed Agents
Apr 22, 2026
Building agents that reach production systems with MCP
エージェント
Building agents that reach production systems with MCP
April 22, 2026
Building agents that reach production systems with MCP
Building agents that reach production systems with MCP
Apr 2, 2026
Harnessing Claude’s intelligence
エージェント
Harnessing Claude’s intelligence
April 2, 2026
Harnessing Claude’s intelligence
Harnessing Claude’s intelligence
Mar 24, 2026
Auto mode for Claude Code
コーディング
Auto mode for Claude Code
March 24, 2026
Auto mode for Claude Code
Auto mode for Claude Code
Mar 23, 2026
Put Claude to work on your computer
Put Claude to work on your computer
March 23, 2026
Put Claude to work on your computer
Put Claude to work on your computer
Mar 19, 2026
Product management on the AI exponential
コーディング
Product management on the AI exponential
March 19, 2026
Product management on the AI exponential
Product management on the AI exponential
Mar 13, 2026
1M context is now generally available for Opus 4.6 and Sonnet 4.6
製品発表
1M context is now generally available for Opus 4.6 and Sonnet 4.6
March 13, 2026
1M context is now generally available for Opus 4.6 and Sonnet 4.6
1M context is now generally available for Opus 4.6 and Sonnet 4.6
カテゴリ
製品
ユースケース

これらのフィルター条件に該当する投稿はありません

別の検索を試すか、フィルターのいくつかを解除してください。

すべてのフィルターを解除する
ありがとうございます。フォームが受理されました。
申し訳ございません。フォームを送信中にエラーが発生しました。

Claude を活用して組織運営の方法を変革

料金プランを見る
営業担当者に問い合わせる

開発者向けニュースレターを入手

製品の最新情報、操作方法、コミュニティスポットライトなどを掲載しています。毎月受信トレイに配信されます。

購読する

毎月の開発者向けニュースレターを受け取りたい場合は、メールアドレスを入力してください。購読はいつでも解除できます。

ありがとうございます。購読登録済みです。
申し訳ありません。送信中に問題が発生しました。しばらくしてからもう一度お試しください。