/* global React, window */
const { SharedMasthead, Breadcrumb, Colophon } = window.cynixShared;
const { AUTHORS } = window.cynixDataExt;
const { useState } = React;

const editor = AUTHORS.find(a => a.role_jp && a.role_jp.includes("編集長")) || AUTHORS[0];

const LETTERS = [
  {
    id: "vol-09",
    vol: "VOL.09",
    issueDate: "2026-04-01",
    title: "夜のサーバー、昼の編集部",
    deck: "深夜帯のVPS応答性を測りに、編集部は3週間徹夜した。",
    body: [
      "VOL.09の特集を「深夜帯のVPS応答性、本当の差。」に決めたとき、編集会議の空気は半分賛成、半分困惑だった。",
      "「昼間のベンチマーク数値は、もうどのレビュー記事にも載っている。差がないことが分かっているのに、また同じ表を作るのか」——副編集長の林がそう言った。彼女が言い出したことで、特集の角度が変わった。差が出るのは深夜帯のはずだ、と。",
      "結果、3週間で延べ72時間の夜間ベンチを回した。23時から翌4時まで、5社のVPSに同時負荷をかけ続ける。担当の佐藤は、研究室の床で2回寝た。出てきた数値は予想を超えていた。広告で「99.99%稼働」と書かれている各社が、深夜帯では平気で2桁ms単位の遅延を出していた。",
      "この記事を出すべきか、編集会議は2回紛糾した。広告主から外されるリスクがある、と営業の声があった。それでも出した。読者がサーバーを契約するときに見ているのは、契約書に書かれたSLAではなく、実際の朝の業務開始時にサイトが開くかどうかだ。",
      "今号からデータ記事の連載「数字で見るインフラ」を始める。次号VOL.10は、ドメイン更新のリマインドメールを5社で比較する。地味だが、年に一度の重要な瞬間のUXだ。",
    ],
    sign: "naoto-miyake",
  },
  {
    id: "vol-08",
    vol: "VOL.08",
    issueDate: "2026-03-01",
    title: "SaaS疲れと、書くことの倫理",
    deck: "棚卸しの記事を書くのに、編集部の契約一覧から始めた。",
    body: [
      "VOL.08の特集「SaaS疲れの正体」は、僕自身の実体験から始まった。月初に経費精算をしようとして、freeeにログインできなかった。前の会社で使っていたMFアカウントのパスワードを入れていたのだ。",
      "編集部全員でSaaS契約一覧を作ってみたら、平均で12本契約していた。半分は記憶にあるが、半分は「いつ契約したか覚えていない」ものだった。",
      "この棚卸しの記事を書くのに、自分たちの恥を晒すかどうかは議論になった。最終的には全員のSaaS契約数と、解約したものを記名で公開することにした。読者に「棚卸ししろ」と書く以上、編集部がやらないわけにはいかない。",
      "次号は VPS 特集だが、その次の VOL.10 は「年に一度しか起きないUX」を集めた号にする予定だ。ドメイン更新メール、確定申告のSaaS切替、年末のSSL期限切れ通知。地味な瞬間こそ、サービスの真価が出る。",
    ],
    sign: "naoto-miyake",
  },
  {
    id: "vol-07",
    vol: "VOL.07",
    issueDate: "2026-02-01",
    title: "Shopifyで月商100万円——副編集長の100日",
    deck: "副編集長 林 春香が、自費でECを立ち上げた4ヶ月の記録。",
    body: [
      "VOL.07の特集記事「Shopifyで月商100万円まで、本当の距離」は、副編集長の林が自費でEC事業を立ち上げ、4ヶ月で月商100万円を超えるまでを記録した実体験だ。",
      "編集部の中には反対の声もあった。「メディア編集者がEC運営を始めると、利益相反になる」と。",
      "それでも書いた。Shopifyの記事を編集部が書くとき、「触ったことがある人」と「自分で売上を立てた人」では、書ける角度がまるで違う。私たちは後者でありたい。",
      "ただし、林の店舗の商品名・URLは記事内では伏せた。読者がそれを買いに行くと、検証データが歪むからだ。これも編集会議で2時間かかった判断だった。",
    ],
    sign: "haruka-hayashi",
  },
];

const App = () => {
  const [active, setActive] = useState(LETTERS[0].id);
  const letter = LETTERS.find(l => l.id === active);
  const author = AUTHORS.find(a => a.slug === letter.sign) || editor;

  return (
    <>
      <SharedMasthead section="EDITOR'S LETTER" />
      <main className="mod-shell">
        <Breadcrumb items={[{ label: "TOP", href: "index.html" }, { label: "編集長コラム" }]} />

        {/* Hero */}
        <section style={{ borderTop: "4px double var(--ink)", borderBottom: "4px double var(--ink)", padding: "60px 0 70px", margin: "16px 0 48px", display: "grid", gridTemplateColumns: "1.2fr 1fr", gap: 56, alignItems: "end" }}>
          <div>
            <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 11, letterSpacing: "0.3em", color: "var(--vermilion)", marginBottom: 14 }}>FROM THE EDITOR</div>
            <h1 style={{ fontFamily: "'Crimson Pro', serif", fontSize: 96, fontWeight: 500, lineHeight: 0.9, margin: 0, letterSpacing: "-0.035em" }}>編集長<br/>コラム</h1>
            <div style={{ fontFamily: "'Crimson Pro', serif", fontSize: 28, fontStyle: "italic", marginTop: 12, opacity: 0.7 }}>Editor's Letter</div>
            <p style={{ maxWidth: 540, marginTop: 22, fontSize: 14, lineHeight: 1.95, opacity: 0.9 }}>
              号ごとに、編集部の判断と迷いを編集長の言葉で残します。<br/>
              紙面に書ききれなかった「なぜこの記事を出したのか」の記録。
            </p>
          </div>
          <figure style={{ margin: 0, position: "relative" }}>
            <div style={{ aspectRatio: "1/1", background: "var(--cream)", border: "3px solid var(--ink)", display: "grid", placeItems: "center", position: "relative", overflow: "hidden" }}>
              <div style={{ fontFamily: "'Crimson Pro', serif", fontSize: 280, fontWeight: 500, fontStyle: "italic", color: "var(--vermilion)", lineHeight: 1, letterSpacing: "-0.05em" }}>三</div>
              <div style={{ position: "absolute", bottom: 16, left: 18, right: 18, fontFamily: "'JetBrains Mono', monospace", fontSize: 9, letterSpacing: "0.2em", display: "flex", justifyContent: "space-between" }}>
                <span>EDITOR-IN-CHIEF</span>
                <span>{editor.name_jp}</span>
              </div>
            </div>
          </figure>
        </section>

        {/* Index strip */}
        <nav style={{ display: "grid", gridTemplateColumns: `repeat(${LETTERS.length}, 1fr)`, border: "2px solid var(--ink)", marginBottom: 48 }}>
          {LETTERS.map(l => (
            <button key={l.id} onClick={() => setActive(l.id)} style={{
              padding: "18px 22px",
              border: "none",
              borderRight: "1px solid var(--ink)",
              background: active === l.id ? "var(--ink)" : "transparent",
              color: active === l.id ? "var(--paper)" : "var(--ink)",
              cursor: "pointer",
              textAlign: "left",
              fontFamily: "inherit",
            }}>
              <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.2em", color: active === l.id ? "var(--vermilion)" : "var(--vermilion)", marginBottom: 4 }}>{l.vol} — {l.issueDate}</div>
              <div style={{ fontFamily: "'Crimson Pro', serif", fontSize: 18, fontWeight: 500, lineHeight: 1.3 }}>{l.title}</div>
            </button>
          ))}
        </nav>

        {/* Letter body */}
        <article style={{ display: "grid", gridTemplateColumns: "240px 1fr", gap: 48 }}>
          <aside style={{ borderRight: "1px solid var(--ink)", paddingRight: 32 }}>
            <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.22em", color: "var(--vermilion)", marginBottom: 6 }}>{letter.vol}</div>
            <div style={{ fontFamily: "'Crimson Pro', serif", fontSize: 14, fontStyle: "italic", marginBottom: 24 }}>Issued {letter.issueDate}</div>
            <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.22em", marginBottom: 4, opacity: 0.6 }}>SIGNED BY</div>
            <div style={{ fontFamily: "'Crimson Pro', serif", fontSize: 22, fontWeight: 500, marginBottom: 2 }}>{author.name_jp}</div>
            <div style={{ fontSize: 11, opacity: 0.7, fontStyle: "italic", marginBottom: 16 }}>{author.role_jp}</div>
            <a href={`/authors/${author.slug}`} style={{ fontSize: 11, fontFamily: "'JetBrains Mono', monospace", letterSpacing: "0.15em", borderBottom: "1px solid currentColor", color: "var(--vermilion)" }}>EXECUTED ARTICLES →</a>

            <div style={{ marginTop: 36, padding: "18px 20px", background: "var(--cream)", border: "1px solid var(--ink)", fontSize: 11, lineHeight: 1.85 }}>
              <b style={{ fontFamily: "'JetBrains Mono', monospace", letterSpacing: "0.18em", display: "block", marginBottom: 6, color: "var(--vermilion)" }}>READING TIME</b>
              この号のコラムは約 {Math.ceil(letter.body.join("").length / 600)} 分。
            </div>
          </aside>

          <div>
            <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.22em", color: "var(--vermilion)", marginBottom: 12 }}>EDITOR'S LETTER — {letter.vol}</div>
            <h2 style={{ fontFamily: "'Crimson Pro', serif", fontSize: 56, fontWeight: 500, lineHeight: 1.05, margin: "0 0 14px", letterSpacing: "-0.02em" }}>{letter.title}</h2>
            <div style={{ fontFamily: "'Crimson Pro', serif", fontSize: 22, fontStyle: "italic", lineHeight: 1.5, marginBottom: 32, paddingBottom: 20, borderBottom: "1px solid var(--ink)", opacity: 0.85 }}>{letter.deck}</div>

            {letter.body.map((p, i) => (
              <p key={i} style={{
                fontFamily: "'Crimson Pro', 'Noto Sans JP', serif",
                fontSize: 16,
                lineHeight: 2,
                margin: "0 0 22px",
                textIndent: i === 0 ? 0 : "1em",
              }}>
                {i === 0 ? (
                  <>
                    <span style={{ float: "left", fontFamily: "'Crimson Pro', serif", fontSize: 86, fontWeight: 600, lineHeight: 0.85, marginRight: 10, marginTop: 6, color: "var(--vermilion)" }}>{p[0]}</span>
                    {p.slice(1)}
                  </>
                ) : p}
              </p>
            ))}

            {/* Signature */}
            <div style={{ marginTop: 36, paddingTop: 28, borderTop: "1px solid var(--ink)", display: "flex", justifyContent: "space-between", alignItems: "center" }}>
              <div>
                <div style={{ fontFamily: "'Crimson Pro', serif", fontSize: 36, fontStyle: "italic", color: "var(--vermilion)", lineHeight: 1 }}>{author.name_jp.replace(/\s/g, "")}</div>
                <div style={{ fontSize: 11, marginTop: 4, opacity: 0.7 }}>{author.role_jp} · {letter.issueDate}</div>
              </div>
              <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.2em", opacity: 0.5, textAlign: "right" }}>cynix.jp<br/>EDITOR'S LETTER</div>
            </div>

            {/* Footer reader response */}
            <div style={{ marginTop: 40, padding: "24px 28px", background: "var(--ink)", color: "var(--paper)" }}>
              <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.2em", color: "var(--vermilion)", marginBottom: 8 }}>RESPONSES WELCOME</div>
              <div style={{ fontFamily: "'Crimson Pro', serif", fontSize: 24, fontStyle: "italic", marginBottom: 6 }}>このコラムへの感想・反論を編集部が読みます。</div>
              <div style={{ display: "flex", gap: 12, marginTop: 14 }}>
                <a href="/reader-letters.html" style={{ background: "var(--paper)", color: "var(--ink)", padding: "8px 18px", fontFamily: "'JetBrains Mono', monospace", fontSize: 11, letterSpacing: "0.18em" }}>読者の手紙 →</a>
                <a href="/contact.html" style={{ border: "1px solid var(--paper)", padding: "8px 18px", fontFamily: "'JetBrains Mono', monospace", fontSize: 11, letterSpacing: "0.18em" }}>編集部に送る →</a>
              </div>
            </div>
          </div>
        </article>

        <Colophon />
      </main>
    </>
  );
};

ReactDOM.createRoot(document.getElementById("root")).render(<App />);
