From 2f4f3817adaa9722dabe8448105b83d6ce566c8a Mon Sep 17 00:00:00 2001 From: Yasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com> Date: Mon, 19 Oct 2026 10:23:59 +0900 Subject: parks: 表をPNG画像で保存できるボタンを追加 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 7 ++ package.json | 1 + src/components/ParksTable.astro | 222 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 230 insertions(+) diff --git a/package-lock.json b/package-lock.json index 3962026..07802f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@fontsource/noto-sans-jp": "^5.2.9", "@resvg/resvg-js": "^2.6.2", "astro": "^7.3.5", + "html-to-image": "^1.11.13", "leaflet": "^1.9.4", "mammoth": "^1.12.0", "playwright": "^1.60.0", @@ -8009,6 +8010,12 @@ "dev": true, "license": "ISC" }, + "node_modules/html-to-image": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.13.tgz", + "integrity": "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==", + "license": "MIT" + }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", diff --git a/package.json b/package.json index 4cd1a43..3d29c41 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@fontsource/noto-sans-jp": "^5.2.9", "@resvg/resvg-js": "^2.6.2", "astro": "^7.3.5", + "html-to-image": "^1.11.13", "leaflet": "^1.9.4", "mammoth": "^1.12.0", "playwright": "^1.60.0", diff --git a/src/components/ParksTable.astro b/src/components/ParksTable.astro index 6f8fdbd..e5def82 100644 --- a/src/components/ParksTable.astro +++ b/src/components/ParksTable.astro @@ -204,9 +204,11 @@ const total = parks.length; + {total}件

設備の情報は、市の資料などに基づきます。設備で絞ると、この情報がある公園だけが対象になります。

+

@@ -345,6 +347,85 @@ const total = parks.length; font-size: 0.9rem; opacity: 0.75; } + .parks-save { + padding: 0.35rem 0.7rem; + border: 1px solid var(--sl-color-hairline, #ccc); + border-radius: 0.35rem; + background: var(--sl-color-bg, #fff); + color: var(--sl-color-text, inherit); + font: inherit; + font-size: 0.85rem; + cursor: pointer; + } + .parks-save:hover { + border-color: var(--sl-color-text-accent, #4c8); + } + .parks-save:disabled { + opacity: 0.6; + cursor: wait; + } + .parks-save-status { + margin: 0 0 0.6rem; + font-size: 0.8rem; + opacity: 0.8; + } + .parks-save-status:empty { + display: none; + } + /* 画像保存用のオフスクリーン領域。サイトの表スタイルをそのまま使う。 */ + .parks-capture { + position: fixed; + left: 0; + top: 0; + z-index: -1; + pointer-events: none; + width: max-content; + padding: 24px 28px; + background: #fff; + color: #1a1a1a; + color-scheme: light; + --sl-color-text: #1a1a1a; + --sl-color-bg: #ffffff; + --sl-color-hairline: #dddddd; + --sl-color-gray-4: #888888; + --sl-color-gray-6: #eef1f3; + --sl-color-white: #1a1a1a; + --sl-color-text-accent: #0b7a4b; + } + .parks-capture-head { + display: flex; + align-items: baseline; + gap: 0.8rem; + margin-bottom: 0.2rem; + } + .parks-capture-head strong { + font-size: 1.35rem; + } + .parks-capture-head span { + font-size: 0.9rem; + opacity: 0.75; + } + .parks-capture-meta { + margin-bottom: 0.7rem; + font-size: 0.8rem; + opacity: 0.75; + } + .parks-capture table { + width: max-content; + } + .parks-capture thead th { + position: static; + background: #eef1f3; + color: #1a1a1a; + } + .parks-capture tbody td { + color: #1a1a1a; + } + .parks-capture-foot { + margin-top: 0.7rem; + font-size: 0.72rem; + opacity: 0.65; + } .parks-hint, .parks-none { margin: 0 0 0.6rem; @@ -593,6 +674,8 @@ const total = parks.length;