aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com>2026-11-02 09:01:49 +0900
committerYasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com>2026-11-02 09:01:49 +0900
commit9f2147a8d34015c841668cbbb34427ae969d0b52 (patch)
tree0f7f9c658ca14979678cdd6445751b9e7cad0f7a
parent5c6a79f7869b0da7a03be265686fc35ea110b0e0 (diff)
hp-archive: 図書館のイベント掲載と絞り込みを追加
- 小平市立図書館の月間カレンダーから、おはなし会・絵本のへやなど16件を掲載 - 「図書館」カテゴリボタンを追加し、カレンダー下部に絞り込み中の表示を追加 - 11月5日の公共施設マネジメント調査特別委員会を視察(傍聴なし)に修正 - 図書館イベントの日付更新スクリプトと、X投稿用のキャプチャスクリプトを追加
-rw-r--r--package.json2
-rw-r--r--scripts/capture-schedule-shot.mjs161
-rw-r--r--scripts/update-library-dates.mjs165
-rw-r--r--src/components/ScheduleInteractive.astro30
-rw-r--r--src/content/docs/kodaira-data/hp-archive.mdx1
-rw-r--r--src/content/docs/kodaira-data/hp-archive/schedule.mdx27
-rw-r--r--src/data/kodaira-event-venues.json7
-rw-r--r--src/styles/custom.css8
8 files changed, 396 insertions, 5 deletions
diff --git a/package.json b/package.json
index 4a57562..a7ab88e 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,8 @@
"build": "astro build && py -c \"import shutil; shutil.copy('public/.htaccess', 'dist/.htaccess')\" && py removeNullCharacters.py && node scripts/generate-llms-full.mjs",
"deploy": "sh deploy.sh",
"indexnow": "node scripts/indexnow.mjs",
+ "library:update": "node scripts/update-library-dates.mjs",
+ "library:apply": "node scripts/update-library-dates.mjs --apply",
"park-editor": "node scripts/park-editor.mjs",
"osm:update": "py -X utf8 scripts/update-osm-parks.py",
"parks:kit": "py -X utf8 scripts/make-park-qgis-kit.py",
diff --git a/scripts/capture-schedule-shot.mjs b/scripts/capture-schedule-shot.mjs
new file mode 100644
index 0000000..7ebdee5
--- /dev/null
+++ b/scripts/capture-schedule-shot.mjs
@@ -0,0 +1,161 @@
+#!/usr/bin/env node
+// 行事予定ページの「カテゴリで絞り込む」から「会場の地図」までを1枚の画像にする。
+// X(旧Twitter)への投稿用。ビルド済みの dist/ をローカルで配信して撮影する。
+//
+// 使い方:
+// node scripts/capture-schedule-shot.mjs
+// node scripts/capture-schedule-shot.mjs --category 図書館 --width 900 --out drafts/schedule-card.png
+// node scripts/capture-schedule-shot.mjs --zoom 16 … 地図の拡大(ピンが小さいとき)
+
+import http from 'node:http';
+import fs from 'node:fs';
+import path from 'node:path';
+import { chromium } from 'playwright';
+
+const args = process.argv.slice(2);
+const opt = (name, fallback) => {
+ const i = args.indexOf(`--${name}`);
+ return i >= 0 ? args[i + 1] : fallback;
+};
+
+const category = opt('category', '図書館');
+// 1120px 付近だとサイドバーが出ず、本文が最も広くなる(X で見やすい縦横比になる)
+const width = Number(opt('width', 1120));
+// 本文の最大幅。広げると縦長になりすぎない
+const contentWidth = opt('contentWidth', '56rem');
+// カレンダーで選ぶ日付(YYYY-MM-DD)。未指定なら今日
+const date = opt('date', '');
+// 地図でクリックしてフキダシを開くピン(会場名の一部)。未指定ならクリックしない
+const pin = opt('pin', '');
+const out = opt('out', 'drafts/schedule-card.png');
+const dpr = Number(opt('dpr', 2));
+
+const root = path.resolve('dist');
+if (!fs.existsSync(root)) {
+ console.error('dist がありません。先に npm run build を実行してください。');
+ process.exit(1);
+}
+
+const types = {
+ '.html': 'text/html; charset=utf-8',
+ '.js': 'text/javascript',
+ '.css': 'text/css',
+ '.svg': 'image/svg+xml',
+ '.webp': 'image/webp',
+ '.jpg': 'image/jpeg',
+ '.png': 'image/png',
+ '.woff2': 'font/woff2',
+ '.woff': 'font/woff',
+ '.xml': 'application/xml',
+ '.json': 'application/json',
+};
+
+const server = http.createServer((req, res) => {
+ const urlPath = decodeURIComponent(req.url.split('?')[0]);
+ let file = path.join(root, urlPath);
+ if (path.extname(file) === '') file = path.join(file, 'index.html');
+ fs.readFile(file, (err, data) => {
+ if (err) {
+ res.writeHead(404);
+ res.end('not found');
+ return;
+ }
+ res.writeHead(200, { 'content-type': types[path.extname(file)] || 'application/octet-stream' });
+ res.end(data);
+ });
+});
+await new Promise((r) => server.listen(0, r));
+const port = server.address().port;
+
+const browser = await chromium.launch();
+const page = await browser.newPage({ viewport: { width, height: 2600 }, deviceScaleFactor: dpr });
+await page.goto(`http://localhost:${port}/kodaira-data/hp-archive/schedule/`, {
+ waitUntil: 'networkidle',
+});
+await page.waitForSelector('#schedule-map.leaflet-container');
+
+// 本文を広めにして、縦長になりすぎないようにする(X での見え方を考慮)
+if (contentWidth) {
+ await page.addStyleTag({
+ content: `:root { --sl-content-width: ${contentWidth} !important; }`,
+ });
+}
+
+// カテゴリを選ぶ(地図・カレンダーに反映される)
+if (category && category !== 'すべて') {
+ await page.evaluate((label) => {
+ const btn = [...document.querySelectorAll('.schedule-filter-btn')].find((b) =>
+ b.textContent.trim().replace(/^[^\s]+\s/, '').startsWith(label)
+ );
+ if (btn) btn.click();
+ }, category);
+ await page.waitForTimeout(400);
+}
+
+// 日付を選ぶ(見つからなければ月を送って探す)
+if (date) {
+ let found = false;
+ for (let i = 0; i < 15 && !found; i += 1) {
+ found = await page.evaluate((key) => {
+ const btn = document.querySelector(`.schedule-cal-day[data-date="${key}"]`);
+ if (!btn) return false;
+ btn.click();
+ return true;
+ }, date);
+ if (found) break;
+ await page.evaluate(() => document.querySelector('.schedule-cal-nav[data-dir="1"]')?.click());
+ await page.waitForTimeout(200);
+ }
+ if (!found) throw new Error(`日付 ${date} のセルが見つかりませんでした`);
+ await page.waitForTimeout(600);
+}
+
+// 地図のピンをクリックしてフキダシを開く
+if (pin) {
+ const opened = await page.evaluate((name) => {
+ const marker = [...document.querySelectorAll('.schedule-map-marker')].find((el) =>
+ (el.getAttribute('title') ?? '').includes(name)
+ );
+ if (!marker) return false;
+ marker.click();
+ return true;
+ }, pin);
+ if (!opened) throw new Error(`ピン「${pin}」が見つかりませんでした`);
+ await page.waitForSelector('.leaflet-popup', { timeout: 5000 });
+}
+
+// タイルの読み込みとピンの描画を待つ
+await page.waitForTimeout(2500);
+
+// 絞り込みの直前の説明文(または絞り込み欄)から、地図ブロックの下端までを切り抜く
+const clip = await page.evaluate(() => {
+ const filters = document.getElementById('event-filters');
+ const mapBlock = document.querySelector('.schedule-map-block');
+
+ // 直前の段落(「カテゴリと日付を選ぶと…」)があれば上端に含める
+ let start = filters;
+ const prev = filters.previousElementSibling;
+ if (prev && prev.tagName === 'P' && prev.textContent.trim().length > 0) start = prev;
+
+ start.scrollIntoView({ block: 'start' });
+ window.scrollBy(0, -12);
+
+ const s = start.getBoundingClientRect();
+ const m = mapBlock.getBoundingClientRect();
+ const left = Math.max(0, Math.min(s.left, m.left) - 8);
+ const top = Math.max(0, s.top - 8);
+ const right = Math.min(window.innerWidth, Math.max(s.right, m.right) + 8);
+ return {
+ x: Math.round(left),
+ y: Math.round(top),
+ width: Math.round(right - left),
+ height: Math.round(m.bottom + 10 - top),
+ };
+});
+
+fs.mkdirSync(path.dirname(out), { recursive: true });
+await page.screenshot({ path: out, clip });
+console.log(`保存: ${out}(${clip.width}x${clip.height} CSS px × ${dpr}倍 = ${clip.width * dpr}x${clip.height * dpr}px)`);
+
+await browser.close();
+server.close();
diff --git a/scripts/update-library-dates.mjs b/scripts/update-library-dates.mjs
new file mode 100644
index 0000000..2317b17
--- /dev/null
+++ b/scripts/update-library-dates.mjs
@@ -0,0 +1,165 @@
+#!/usr/bin/env node
+// 小平市立図書館のイベントカレンダーから開催日を取得し、
+// 行事予定ページの図書館イベント行(日付セル)を更新する。
+//
+// 使い方:
+// node scripts/update-library-dates.mjs … 変更内容を表示(書き換えない)
+// node scripts/update-library-dates.mjs --apply … 実際に書き換える
+// node scripts/update-library-dates.mjs --months 4 … 当月から4か月分を取得(既定3)
+//
+// 行の追加・削除は自動では行わない(内容を確認して手で編集する)。
+// 表にない新しいイベント、カレンダーから消えたイベントは一覧で表示する。
+
+import fs from 'node:fs';
+import path from 'node:path';
+
+const BASE = 'https://library.kodaira.ed.jp/viewer/';
+const UA =
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
+
+const args = process.argv.slice(2);
+const apply = args.includes('--apply');
+const monthsArg = args.indexOf('--months');
+const months = monthsArg >= 0 ? Number(args[monthsArg + 1]) || 3 : 3;
+const targetIdx = args.indexOf('--target');
+const targetPath =
+ targetIdx >= 0
+ ? args[targetIdx + 1]
+ : path.join('src', 'content', 'docs', 'kodaira-data', 'hp-archive', 'schedule.mdx');
+
+async function fetchText(url) {
+ const res = await fetch(url, { headers: { 'User-Agent': UA } });
+ if (!res.ok) throw new Error(`${res.status} ${url}`);
+ return res.text();
+}
+
+function normalize(html) {
+ return html.replace(/\s+/g, ' ');
+}
+
+// カレンダーから { id: { title, lib, dates:Set } } を作る
+async function collectEvents() {
+ const now = new Date();
+ const events = new Map();
+
+ for (let i = 0; i < months; i += 1) {
+ const d = new Date(now.getFullYear(), now.getMonth() + i, 1);
+ const url = `${BASE}calendar-monthly.html?date=${d.getFullYear()}/${d.getMonth() + 1}/1`;
+ const html = normalize(await fetchText(url));
+ const rows = html.match(/<tr class="calendar-daily cal_event">.*?<\/tr>/g) ?? [];
+
+ for (const row of rows) {
+ const dm = row.match(/calendar-daily\.html\?date=(\d{4})\/(\d{2})\/(\d{2})/);
+ if (!dm) continue;
+ const key = `${dm[1]}-${dm[2]}-${dm[3]}`;
+ const items =
+ row.match(
+ /<a target="_self" href="([^"]*)" class="cal_event_index_\d+">([^<]+)<\/a> <span class="icon[^"]*">([^<]*)<\/span>/g
+ ) ?? [];
+
+ for (const item of items) {
+ const m = item.match(
+ /href="([^"]*)" class="cal_event_index_\d+">([^<]+)<\/a> <span class="icon[^"]*">([^<]*)<\/span>/
+ );
+ if (!m) continue;
+ const id = (m[1].match(/id=(\d+)/) ?? [])[1];
+ if (!id) continue;
+ if (!events.has(id)) {
+ events.set(id, { id, title: m[2].trim(), lib: m[3].trim(), dates: new Set() });
+ }
+ events.get(id).dates.add(key);
+ }
+ }
+ }
+ return events;
+}
+
+// "2026-11-01" の集合を「11月1日・18日、12月6日・16日」の形にする
+// 日付が1つだけのときは「11月19日(木)」のように曜日を付ける
+function formatDates(dateKeys, withWeekday) {
+ const sorted = [...dateKeys].sort();
+ const [y0, m0, d0] = sorted[0].split('-').map(Number);
+ if (withWeekday && sorted.length === 1) {
+ const w = '日月火水木金土'[new Date(y0, m0 - 1, d0).getDay()];
+ return `${m0}月${d0}日(${w})`;
+ }
+ const byMonth = new Map();
+ for (const key of sorted) {
+ const [y, m, d] = key.split('-').map(Number);
+ const k = `${y}-${m}`;
+ if (!byMonth.has(k)) byMonth.set(k, []);
+ byMonth.get(k).push(d);
+ }
+ const parts = [];
+ for (const [k, days] of byMonth) {
+ const m = Number(k.split('-')[1]);
+ parts.push(`${m}月${days[0]}日${days.slice(1).map((d) => `・${d}日`).join('')}`);
+ }
+ return parts.join('、');
+}
+
+// 図書館のページ(info.html?id=…)を出典に含む行を対象にする。
+// 市報など他の出典と併記している行(例:「市報こだいら10月20日号3面/[図書館のページ](…)」)も拾う。
+const ROW_RE =
+ /^\| ([^|]*) \| ([^|]*) \| ([^|]*) \| ([^|]*) \| ([^|]*library\.kodaira\.ed\.jp\/viewer\/info\.html\?id=(\d+)[^|]*) \|$/;
+
+async function main() {
+ const events = await collectEvents();
+ const src = fs.readFileSync(targetPath, 'utf8');
+ const lines = src.split('\n');
+
+ const inTable = new Map();
+ const changes = [];
+
+ lines.forEach((line, index) => {
+ // Windows の CRLF でも一致するよう、照合時だけ行末の \r を除く
+ const m = line.replace(/\r$/, '').match(ROW_RE);
+ if (!m) return;
+ const [, datesCell, name, , , , id] = m;
+ inTable.set(id, { index, name, datesCell });
+
+ const ev = events.get(id);
+ if (!ev || ev.dates.size === 0) return;
+ const next = formatDates(ev.dates, ev.dates.size === 1);
+ if (next !== datesCell) changes.push({ index, name, id, from: datesCell, to: next });
+ });
+
+ console.log(`図書館の予定: カレンダー ${events.size}件 / 表 ${inTable.size}件(${months}か月分を取得)`);
+
+ if (changes.length === 0) {
+ console.log('日付の変更はありません。');
+ } else {
+ for (const c of changes) {
+ console.log(`- ${c.name}`);
+ console.log(` 現在: ${c.from}`);
+ console.log(` 新規: ${c.to}`);
+ if (apply) lines[c.index] = lines[c.index].replace(`| ${c.from} |`, `| ${c.to} |`);
+ }
+ }
+
+ const missing = [...events.values()].filter((e) => !inTable.has(e.id));
+ if (missing.length > 0) {
+ console.log('\n表にないイベント(内容を確認して追加してください):');
+ for (const e of missing) {
+ console.log(`- ${e.title}(${e.lib}) ${formatDates(e.dates)} ${BASE}info.html?id=${e.id}`);
+ }
+ }
+
+ const gone = [...inTable.entries()].filter(([id]) => !events.has(id));
+ if (gone.length > 0) {
+ console.log('\nカレンダーにない行(終了した可能性。必要なら削除してください):');
+ for (const [, row] of gone) console.log(`- ${row.name.replace(/^📚 /, '')}(${row.datesCell})`);
+ }
+
+ if (apply && changes.length > 0) {
+ fs.writeFileSync(targetPath, lines.join('\n'), 'utf8');
+ console.log(`\n${changes.length}件を ${targetPath} に反映しました。`);
+ } else if (!apply && changes.length > 0) {
+ console.log('\n(--apply を付けると反映します)');
+ }
+}
+
+main().catch((err) => {
+ console.error(err);
+ process.exit(1);
+});
diff --git a/src/components/ScheduleInteractive.astro b/src/components/ScheduleInteractive.astro
index 58574ce..6bcbb1c 100644
--- a/src/components/ScheduleInteractive.astro
+++ b/src/components/ScheduleInteractive.astro
@@ -15,6 +15,10 @@
const COUNCIL_KEY = 'council';
const isCouncil = (e: { type: string; name: string }) =>
e.type === 'meeting' && e.name.includes('小平市議会');
+ // 図書館のイベントは出典に図書館のページ(info.html?id=…)のリンクが入っている。
+ const LIBRARY_KEY = 'library';
+ const isLibrary = (e: { source?: string }) =>
+ (e.source ?? '').includes('library.kodaira.ed.jp/viewer/info.html');
const WEEKDAYS = ['日', '月', '火', '水', '木', '金', '土'];
const WEEKDAY_MAP = { 日: 0, 月: 1, 火: 2, 水: 3, 木: 4, 金: 5, 土: 6 };
@@ -150,6 +154,8 @@
const dateText = cells[0].textContent.trim();
const name = cells[1].textContent.trim();
const timeText = cells[2].textContent.trim();
+ // 出典欄はリンク先URLで判定するため、HTML を保持する(textContent には href が入らない)。
+ const source = cells[4] ? cells[4].innerHTML : '';
const rowId = `${type}-row-${i}`;
row.id = rowId;
@@ -186,6 +192,7 @@
categoryLabel,
rowId,
dateText,
+ source,
});
});
}
@@ -247,6 +254,7 @@
function matchesCategory(e) {
if (activeCategory === 'all') return true;
if (activeCategory === COUNCIL_KEY) return isCouncil(e);
+ if (activeCategory === LIBRARY_KEY) return isLibrary(e);
// 「審議会等」は市議会を除く(市議会は別のボタンで絞り込む)。
if (activeCategory === MEETING_ICON) return e.type === 'meeting' && !isCouncil(e);
return e.category === activeCategory;
@@ -325,6 +333,11 @@
).join('')}
${cells.join('')}
</div>
+ <p class="schedule-cal-filter-note">${
+ activeCategory === 'all'
+ ? '絞り込みなし(すべての予定を表示)'
+ : `絞り込み中:${filterLabel()}`
+ }</p>
`;
calendarEl.querySelectorAll('.schedule-cal-day[data-date]').forEach((btn) => {
@@ -407,11 +420,20 @@
function categoryLabel(category) {
if (category === COUNCIL_KEY) return '市議会';
+ if (category === LIBRARY_KEY) return '図書館';
if (category === MEETING_ICON) return '審議会等';
const def = CATEGORY_DEFS.find((c) => c.icon === category);
return def ? def.label : '交流・地域';
}
+ // 「🏛️ 市議会」「📖 図書館」のように、アイコン付きで現在の絞り込みを表す
+ function filterLabel() {
+ if (activeCategory === COUNCIL_KEY) return `${MEETING_ICON} 市議会`;
+ if (activeCategory === LIBRARY_KEY) return '📖 図書館';
+ if (activeCategory === MEETING_ICON) return `${MEETING_ICON} 審議会等`;
+ return `${activeCategory} ${categoryLabel(activeCategory)}`;
+ }
+
function ensureStatus(container, type) {
const id = `${type}-filter-status`;
let status = document.getElementById(id);
@@ -434,7 +456,7 @@
const filtered = activeCategory !== 'all';
status.classList.toggle('is-filtered', filtered);
const text = filtered
- ? `${tableLabel}:「${activeCategory === COUNCIL_KEY ? categoryLabel(activeCategory) : `${activeCategory} ${categoryLabel(activeCategory)}`}」で絞り込み中:${visible}件/全${total}件`
+ ? `${tableLabel}:「${filterLabel()}」で絞り込み中:${visible}件/全${total}件`
: `${tableLabel}:全${total}件を表示しています(絞り込みなし)`;
status.innerHTML = `<span class="schedule-table-status-text">${text}</span>`;
if (filtered) {
@@ -512,6 +534,12 @@
label: '審議会等',
count: meetingEntries.length,
},
+ {
+ category: LIBRARY_KEY,
+ icon: '📖',
+ label: '図書館',
+ count: entries.filter(isLibrary).length,
+ },
...CATEGORY_DEFS.map((c) => ({
category: c.icon,
icon: c.icon,
diff --git a/src/content/docs/kodaira-data/hp-archive.mdx b/src/content/docs/kodaira-data/hp-archive.mdx
index 907c8aa..0c2aab9 100644
--- a/src/content/docs/kodaira-data/hp-archive.mdx
+++ b/src/content/docs/kodaira-data/hp-archive.mdx
@@ -232,6 +232,7 @@ import { LinkCard } from '@astrojs/starlight/components';
### その他のオンラインサービス
+- 市報こだいら電子版: [市報こだいら電子版](https://www.catapoke.com/search/?keyword=%E5%B0%8F%E5%B9%B3%E5%B8%82)
- 小平市防災メール(すぐメール): [小平市防災メール](https://plus.sugumail.com/usr/kodaira/)
- よくある質問: [小平市のよくある質問](https://helpfeel.com/kodaira-information/)
- 医療機関・介護施設を探す: [医療・介護マップ](https://chiiki-kaigo.casio.jp/Kodaira)
diff --git a/src/content/docs/kodaira-data/hp-archive/schedule.mdx b/src/content/docs/kodaira-data/hp-archive/schedule.mdx
index d0cd769..1c3f502 100644
--- a/src/content/docs/kodaira-data/hp-archive/schedule.mdx
+++ b/src/content/docs/kodaira-data/hp-archive/schedule.mdx
@@ -13,7 +13,7 @@ import ScheduleSeo from '../../../../components/ScheduleSeo.astro';
<ScheduleSeo />
-小平市ホームページがご覧いただけないため、市報こだいら(10月1日号・10月19日号・10月20日号)、市公式Xのポスト、LoGoフォームのイベント情報、市議会の行事予定表を確認しました。これらをもとに、今後の審議会等の開催予定とイベントをまとめています。市ホームページが停止しているため、すべてを把握できているとは限りません。延期・中止・会場変更となることもあります。最新の状況は、各担当課にお電話でご確認ください。
+小平市ホームページがご覧いただけないため、市報こだいら(10月1日号・10月19日号・10月20日号)、市公式Xのポスト、LoGoフォームのイベント情報、市議会の行事予定表を確認しました。市立図書館のイベント情報も確認しました。これらをもとに、今後の審議会等の開催予定とイベントをまとめています。市ホームページが停止しているため、すべてを把握できているとは限りません。延期・中止・会場変更となることもあります。最新の状況は、各担当課にお電話でご確認ください。
<div class="lang-intro">
@@ -69,7 +69,7 @@ import ScheduleSeo from '../../../../components/ScheduleSeo.astro';
| 10月30日(金) | 👶 小平市青少年問題協議会 | 午後1時30分から/中央公民館 学習室4 | 定員10人(当日、会場へ。多数の場合は抽選) | 市報こだいら10月19日号2面 |
| 10月30日(金) | 👶 小平市立中学校給食献立作成委員会 | 午後3時30分から/学校給食センター2階 会議室 | 定員10人(当日午後3時から会場で受付。先着順) | 市報こだいら10月19日号2面 |
| 11月2日(月) | 🌳 小平市農のあるまちづくり推進会議 | 午後2時から/市役所6階 601会議室 | 定員5人(市内在住・在勤・在学の方。10月20日から、申込みフォーム(市報10月19日号2面のQRコード)または電子メールで。先着順) | 市報こだいら10月19日号2面 |
-| 11月5日(木) | 🏛️ 小平市議会 公共施設マネジメント調査特別委員会 | 午前9時から(終了時刻は未定)/市役所7階 | 傍聴可。定員30人(当日午前8時30分から市役所7階 議会事務局で受付) | 市議会 行事予定表 |
+| 11月5日(木) | 🏛️ 小平市議会 公共施設マネジメント調査特別委員会 | 視察のため、委員会室での開催はありません(視察先は市議会事務局へお問い合わせください) | 傍聴はできません | 市議会 行事予定表 |
| 11月5日(木) | 🌳 小平市廃棄物減量等推進審議会 | 午後3時から午後4時まで/リサイクルセンター2階 多目的ルーム | 定員10人(当日、会場へ。多数の場合は抽選) | 市報こだいら10月19日号2面 |
| 11月6日(金) | 🌳 小平市緑化推進委員会 | 午後3時から午後5時まで/福祉会館3階 第2集会室 | 定員10人(当日午後2時40分から会場で受付。先着順) | 市報こだいら10月19日号2面 |
| 11月9日(月) | 🏛️ 小平市議会 総務委員会 | 午前9時から(終了時刻は未定)/市役所7階 | 傍聴可。定員30人(当日午前8時30分から市役所7階 議会事務局で受付) | 市議会 行事予定表 |
@@ -208,7 +208,7 @@ import ScheduleSeo from '../../../../components/ScheduleSeo.astro';
| 11月17日(火)、11月24日(火) | 🎨 大人の塗り絵講座 | 午前10時から正午まで(全2回)/さわやか館 多目的ホール(花小金井4-21-2) | 全2回参加可能な方10人(先着順)。無料。講師は加来哲郎さん(アニメーター)。11月2日(月)から申込み。東部ボランティアコーナー 042-451-6711。 | 社協だより11月1日号3面 |
| 11月18日(水) | 🧓 こだいら認知症週間 医師による物忘れ相談会 | 午後1時30分以降の指定する時間/特別養護老人ホーム小川ホーム(小川西町2-1-35-12) | 市内在住で、物忘れなどの認知症の症状がある方とその家族7人。10月20日(火)から地域包括支援センター小川ホームへ(先着順)。042-347-6033(国立精神・神経医療研究センター) | 市報こだいら10月20日号3面 |
| 11月18日(水) | 🧓 こだいら認知症週間 オレンジカフェ | 午後2時から午後4時まで/中央公民館 講座室2 | 市内在住で認知症の方とその家族15人。10月20日(火)から地域包括支援センター中央センターへ(先着順)。042-345-0691 | 市報こだいら10月20日号3面 |
-| 11月19日(木) | 👶 休館日の図書館に親子をご招待(大人はおはなし会・館内案内、こどもは読み聞かせ) | 午前10時から正午まで/中央図書館 | 未就学児(生後6か月頃から)とその保護者。6家族程度(申込み多数の場合は抽選)。1家族4人まで(お子さん2人まで)、0歳児のいる家族は2家族まで。大人だけ、こどもだけの参加はできません。10月24日(土)午前10時から31日(土)午後5時までに、申込みフォーム(市報10月20日号5面のQRコード)へ。中央図書館 042-345-1246 | 市報こだいら10月20日号5面 |
+| 11月19日(木) | 👶 休館日の図書館に親子をご招待(大人はおはなし会・館内案内、こどもは読み聞かせ) | 午前10時から正午まで/中央図書館 | 未就学児(生後6か月頃から)とその保護者。6家族程度(申込み多数の場合は抽選)。1家族4人まで(お子さん2人まで)、0歳児のいる家族は2家族まで。大人だけ、こどもだけの参加はできません。10月24日(土)午前10時から31日(土)午後5時までに、申込みフォーム(市報10月20日号5面のQRコード)へ。中央図書館 042-345-1246 | 市報こだいら10月20日号5面/[図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=395) |
| 11月19日(木) | 🧓 こだいら認知症週間 認知症サポーター養成講座 | 午後2時から午後3時30分まで/特別養護老人ホーム小平健成苑 多目的室(鈴木町2-12-30) | 市内在住・在勤の方25人。10月20日(火)から地域包括支援センター小平健成苑へ(先着順)。042-451-8813 | 市報こだいら10月20日号3面 |
| 11月20日(金) | 🧓 こだいら認知症週間 認知症声かけ模擬訓練 | 午後1時45分から午後4時まで/福祉会館小ホール、市役所周辺 | 市内在住・在勤の方15人。10月20日(火)から地域包括支援センター小平健成苑へ(先着順)。042-451-8813 | 市報こだいら10月20日号3面 |
| 11月20日(金)、11月29日(日)、12月4日(金) | 📚 地区まちづくりセミナー「まちづくり活動を仕掛ける・チームをつくる」 | 午後2時から午後4時30分まで、全3回/福祉会館第2集会室 | 対象は市内在住・在勤・在学の方。定員15人(先着順)。講師は國廣純子さん(武蔵野美術大学)。鷹の台の地区まちづくり観察やまちあるきを通して、市民が実際に関わるまちづくりを考えます。10月20日(火)から、電子メールまたは電話で住所・氏名・電話番号を都市計画課へ。042-346-9554、toshikeikaku@city.kodaira.lg.jp | 市報こだいら10月19日号2面 |
@@ -247,6 +247,22 @@ import ScheduleSeo from '../../../../components/ScheduleSeo.astro';
| 12月11日(金) | 🤝 親族後見人等連絡会 | 午後2時から午後4時まで/福祉会館3階 第2集会室 | 15人(先着順)。無料。講師は吉田徹さん(司法書士)。11月5日(木)から申込み。権利擁護センターこだいら 042-342-8780。 | 社協だより11月1日号3面 |
| 12月14日(月) | 🤝 後見人の実務を学ぼう~申立てから終了までの手続き~ | 午後2時から午後4時まで/福祉会館4階 小ホール | 60人(先着順)。無料。講師は清水輝さん(司法書士)。11月16日(月)から申込み。権利擁護センターこだいら 042-342-8780。 | 社協だより11月1日号3面 |
| 12月15日(火) | 📚 こだいら創業セミナー「想いをカタチに!ゼロから始める創業の第一歩」 | 午後7時から午後9時まで/Zoom(オンライン) | 創業予定の方、創業して間もない方、創業に興味がある方。無料。講師は藤尾翔太さん(TOKYO創業ステーションTAMA)。[申込みフォーム](https://logoform.jp/form/exdH/1807043)。産業振興課 042-346-9534 | [LoGoフォーム](https://logoform.jp/form/exdH/1807043) |
+| 11月1日・18日、12月6日・16日、1月10日・20日 | 📚 おはなし会(津田) | 午前11時から午前11時30分まで(第3水曜日は午後3時30分から午後4時まで)/津田図書館 おはなし室 | 4さいから小学生。20人(先着順)。事前申込み不要、当日津田図書館児童コーナーで受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=328) |
+| 11月4日・18日、12月2日・16日、1月6日・20日 | 📚 おはなし会(花小金井) | 午後3時30分から午後4時まで/花小金井図書館 おはなし室 | 4さいから小学生。10名程度。事前申込み不要、当日カウンターで受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=298) |
+| 11月5日、12月3日、1月14日 | 📚 絵本のへや(花小金井) | 午前11時から午前11時20分まで/東部市民センター1階 和室 | 0~3歳(保護者同伴)。15組程度(先着順)。事前予約が必要 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=332) |
+| 11月5日、12月3日、1月7日 | 📚 絵本のへや(仲町) | 午前11時から午前11時20分まで/なかまちテラス地下1階 和室 | 0~3歳(保護者同伴)。7組程度(先着順)。事前申込み不要、当日会場で受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=308) |
+| 11月8日・15日、12月13日・20日、1月10日・17日 | 📚 おはなし会(仲町) | 午前11時から午前11時30分まで/なかまちテラス地下1階 おはなし室 | 4さいから小学生。10名(先着順)。事前申込み不要、当日会場で受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=325) |
+| 11月10日・14日・17日・24日、12月12日・15日・22日、1月9日・12日・19日・26日 | 📚 おはなし会(中央) | 午後3時30分から午後4時まで(第2土曜日は午後2時から)/中央図書館2階 おはなし室 | 4さいから小学生。25名程度(先着順)。事前申込み不要、当日中央図書館1階児童コーナーで受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=326) |
+| 11月10日、12月1日、1月12日 | 📚 絵本のへや(中央) | 午前11時から午前11時20分まで/中央図書館2階 おはなし室 | 0~3歳(保護者同伴)。12組(先着順)。当日午前10時40分から中央図書館1階児童コーナーで受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=324) |
+| 11月11日、12月9日、1月13日 | 📚 絵本のへや(喜平) | 午前11時から午前11時20分まで/喜平図書館 おはなし室 | 0~3歳(保護者同伴)。13組程度(先着順)。事前申込み不要、当日喜平図書館2階おはなし室で受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=336) |
+| 11月11日・26日、12月9日・24日、1月13日・28日 | 📚 おはなし会(喜平) | 午後3時30分から午後4時まで/喜平図書館 おはなし室 | 4さいから小学生。25名程度(先着順)。事前申込み不要、当日喜平図書館1階児童コーナーで受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=335) |
+| 11月11日、12月9日、1月13日 | 📚 絵本のへや(大沼) | 午前11時から午前11時20分まで/大沼図書館 おはなし室 | 0~3歳(保護者同伴)。10組程度。事前申込み不要、当日大沼図書館カウンターで受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=330) |
+| 11月11日・26日、12月9日・24日、1月13日・28日 | 📚 おはなし会(大沼) | 午後4時から午後4時30分まで/大沼図書館 おはなし室 | 4さいから小学生。10組程度。事前申込み不要、当日大沼図書館カウンターで受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=327) |
+| 11月12日・25日、12月10日・23日、1月14日・27日 | 📚 おはなし会(上宿) | 午後3時30分から午後4時まで/上宿図書館2階 おはなし室 | 4さいから小学生。25名程度。電話または上宿図書館のカウンターで予約(当日申込み可) | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=317) |
+| 11月18日、12月16日、1月20日 | 📚 絵本のへや(津田) | 午前11時から午前11時20分まで/津田図書館 おはなし室 | 0~3歳(保護者同伴)。10組(先着順)。事前申込み不要、当日津田図書館児童コーナーで受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=331) |
+| 11月22日、12月27日、1月24日 | 📚 かみしばいの会(仲町) | 午前11時から午前11時30分まで/なかまちテラス2階 じゅうたん | どなたでも参加できます。定員なし。事前申込み不要、当日なかまちテラス2階児童コーナーで受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=337) |
+| 11月25日、12月23日、1月27日 | 📚 絵本のへや(上宿) | 午前11時から午前11時20分まで/上宿図書館2階 おはなし室 | 0~3歳(保護者同伴)。10組程度。事前申込み不要、当日上宿図書館2階おはなし室で受付 | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=329) |
+| 11月29日(日) | 📚 親子で楽しむおえかきワークショップ | 午前10時から午前11時30分まで(開場午前9時45分)/津田公民館 講座室 | 4歳から小学生とその保護者。親子10組(1組4名以内)。11月14日(土)午前10時から津田図書館 042-341-1245へ(電話可・先着順) | [図書館のページ](https://library.kodaira.ed.jp/viewer/info.html?id=413) |
</div>
@@ -290,6 +306,7 @@ import ScheduleSeo from '../../../../components/ScheduleSeo.astro';
- [小平市公式X(@kodaira_tokyo)](https://twitter.com/kodaira_tokyo)
- [LoGoフォームのイベント情報](https://logoform.jp/procedure/exdH/2517)
- [こだいら観光まちづくり協会のホームページ](https://kodaira-tourism.com/)
+- [小平市立図書館のイベントカレンダー](https://library.kodaira.ed.jp/viewer/calendar-monthly.html)
- [みんなでつくる音楽祭のホームページ](https://kodaira-ongakusai.jimdofree.com/)
上記の情報をそのまま並べただけでなく、次の点はこのページで作成したものです。
@@ -299,6 +316,8 @@ import ScheduleSeo from '../../../../components/ScheduleSeo.astro';
- 会場の位置を示す地図(住所から位置を調べて作成。市境も表示)
- 開催日が過ぎた予定の表示、カテゴリ別の絞り込み、申込みフォームへのリンクの集約
-市報こだいらは10月1日号・10月19日号・10月20日号、市議会だよりは11月1日号を確認しました。市議会の予定(本会議、委員会、特別委員会、議会運営委員会、幹事長会議)は、市議会事務局が公表している令和8年度の行事予定表(6月修正版)によります。市公式Xはポスト本文と添付画像、LoGoフォームは申込みフォームの記載を確認しています。こだいら観光まちづくり協会のホームページは、イベント情報を確認しています。小平市ホームページのアーカイブ(暫定)に保存された市のページからも、会議や催しの情報を確認しています。
+市報こだいら、市公式X、LoGoフォーム、市議会の行事予定表、市立図書館のイベント情報、社協だよりなど、複数の情報源をこのようにまとめて一覧にしているページは、調べた範囲ではほかに見当たりません。
+
+市報こだいらは10月1日号・10月19日号・10月20日号、市議会だよりは11月1日号を確認しました。市議会の予定(本会議、委員会、特別委員会、議会運営委員会、幹事長会議)は、市議会事務局が公表している令和8年度の行事予定表(6月修正版)によります。市公式Xはポスト本文と添付画像、LoGoフォームは申込みフォームの記載を確認しています。こだいら観光まちづくり協会のホームページは、イベント情報を確認しています。小平市ホームページのアーカイブ(暫定)に保存された市のページからも、会議や催しの情報を確認しています。市立図書館のイベント情報は、図書館ホームページの月間カレンダーと各イベントのページを確認しています。
<ScheduleInteractive />
diff --git a/src/data/kodaira-event-venues.json b/src/data/kodaira-event-venues.json
index 4a70987..2d3035f 100644
--- a/src/data/kodaira-event-venues.json
+++ b/src/data/kodaira-event-venues.json
@@ -145,5 +145,12 @@
"lat": 35.737324,
"lon": 139.455902,
"source": "国土地理院 住所検索(小川西町2-1-35-12)"
+ },
+ {
+ "name": "なかまちテラス(仲町図書館・仲町公民館)",
+ "aliases": ["なかまちテラス"],
+ "lat": 35.730902,
+ "lon": 139.484817,
+ "source": "公共施設データ(仲町図書館と同じ建物)"
}
]
diff --git a/src/styles/custom.css b/src/styles/custom.css
index 6a7e2bc..cdaab01 100644
--- a/src/styles/custom.css
+++ b/src/styles/custom.css
@@ -2089,6 +2089,14 @@ td.sanpi-open .sanpi-title {
grid-template-columns: repeat(7, minmax(0, 1fr));
gap: 4px;
}
+.schedule-cal-filter-note {
+ margin: 0.6rem 0 0;
+ padding-top: 0.5rem;
+ border-top: 1px solid var(--sl-color-gray-5);
+ color: var(--sl-color-gray-2);
+ font-size: 0.82rem;
+ text-align: center;
+}
.schedule-cal-weekday {
padding: 0.2rem 0;
text-align: center;