diff options
| -rw-r--r-- | package.json | 2 | ||||
| -rw-r--r-- | scripts/capture-schedule-shot.mjs | 161 | ||||
| -rw-r--r-- | scripts/update-library-dates.mjs | 165 | ||||
| -rw-r--r-- | src/components/ScheduleInteractive.astro | 30 | ||||
| -rw-r--r-- | src/content/docs/kodaira-data/hp-archive.mdx | 1 | ||||
| -rw-r--r-- | src/content/docs/kodaira-data/hp-archive/schedule.mdx | 27 | ||||
| -rw-r--r-- | src/data/kodaira-event-venues.json | 7 | ||||
| -rw-r--r-- | src/styles/custom.css | 8 |
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; |
