{"id":27615628,"url":"https://github.com/oumelab/demo-react-event-calendar","last_synced_at":"2026-04-10T15:44:57.104Z","repository":{"id":288636932,"uuid":"968692406","full_name":"oumelab/demo-react-event-calendar","owner":"oumelab","description":"practice","archived":false,"fork":false,"pushed_at":"2025-04-19T05:45:00.000Z","size":1470,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-23T03:56:53.152Z","etag":null,"topics":["cloudflare-pages","react","react-router","tailwindcss","typescript","vite"],"latest_commit_sha":null,"homepage":"https://demo-react-event-calendar.pages.dev/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oumelab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-18T14:54:21.000Z","updated_at":"2025-04-19T05:45:04.000Z","dependencies_parsed_at":"2025-04-19T06:01:58.169Z","dependency_job_id":"83b4b27c-1e0a-4642-b702-d60ee83284b9","html_url":"https://github.com/oumelab/demo-react-event-calendar","commit_stats":null,"previous_names":["oumelab/demo-react-event-calendar"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oumelab%2Fdemo-react-event-calendar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oumelab%2Fdemo-react-event-calendar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oumelab%2Fdemo-react-event-calendar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oumelab%2Fdemo-react-event-calendar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oumelab","download_url":"https://codeload.github.com/oumelab/demo-react-event-calendar/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250366715,"owners_count":21418769,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare-pages","react","react-router","tailwindcss","typescript","vite"],"created_at":"2025-04-23T03:56:56.993Z","updated_at":"2025-12-30T23:05:03.340Z","avatar_url":"https://github.com/oumelab.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# React Road お題チャレンジ　- イベント掲載アプリ -\n\nconnpass のようなイベントの掲載・申し込みができるアプリ\u003cbr /\u003e\nReact Router によるクライアントサイドルーティングを実践し、SPA の実装を学ぶ。\u003cbr /\u003e\n\nReact の実践型学習プラットフォーム [React Road](https://react-road.b13o.com/) のお題 [イベント掲載アプリ](https://react-road.b13o.com/challenges/event-listing-app)に挑戦させていただいた学習プロジェクトです。\u003cbr /\u003e\n\u003cbr /\u003e\n課題の実装の他、個人的な学習目的で私が行った変更や追加機能が含まれています。\u003cbr /\u003e\n\n\u003e [!NOTE]\n\u003e このリポジトリは、個人的な学習およびデモンストレーションの目的のみに使用されます。\u003cbr /\u003e\n\u003e This repository is for personal learning and demonstration purposes only.\n\n## 🌐 デモサイト・スクリーンショット\n\n[👀 View Demo site](https://demo-react-event-calendar.pages.dev/)\n\u003cbr /\u003e\n\u003cp\u003e匿名ログイン（アカウント登録不要）で気軽に申し込み・キャンセル機能を試用可能です。\u003c/p\u003e\n\u003cbr /\u003e\n\n\u003c!-- デスクトップ表示用テーブル（2行2列） --\u003e\n\u003ctable style=\"border-collapse: collapse; width: 100%;\"\u003e\n  \u003ccolgroup\u003e\n    \u003ccol style=\"width: 50%;\"\u003e\n    \u003ccol style=\"width: 50%;\"\u003e\n  \u003c/colgroup\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\" align=\"center\" style=\"padding: 8px;\"\u003e\n    \u003ca href=\"./public/docs/screenshot/screenshot.png\" target=\"_blank\"\u003e\n        \u003cpicture\u003e\n          \u003csource srcset=\"./public/docs/screenshot/screenshot.webp\" type=\"image/webp\" /\u003e\n          \u003cimg src=\"./public/docs/screenshot/screenshot.png\" alt=\"トップページ\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n        \u003c/picture\u003e\n        \u003c/a\u003e\n      \u003cp\u003e\u003cem\u003eトップページ\u003c/em\u003e\u003c/p\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"50%\" align=\"center\" style=\"padding: 8px;\"\u003e\n    \u003ca href=\"./public/docs/screenshot/screenshot-2.png\" target=\"_blank\"\u003e\n        \u003cpicture\u003e\n          \u003csource srcset=\"./public/docs/screenshot/screenshot-2.webp\" type=\"image/webp\" /\u003e\n          \u003cimg src=\"./public/docs/screenshot/screenshot-2.png\" alt=\"イベント一覧ページ\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n        \u003c/picture\u003e\n        \u003c/a\u003e\n      \u003cp\u003e\u003cem\u003eイベント一覧ページ\u003c/em\u003e\u003c/p\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\" align=\"center\" style=\"padding: 8px;\"\u003e\n    \u003ca href=\"./public/docs/screenshot/screenshot-3.png\" target=\"_blank\"\u003e\n        \u003cpicture\u003e\n          \u003csource srcset=\"./public/docs/screenshot/screenshot-3.webp\" type=\"image/webp\" /\u003e\n          \u003cimg src=\"./public/docs/screenshot/screenshot-3.png\" alt=\"イベント詳細ページ\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n        \u003c/picture\u003e\n        \u003c/a\u003e\n      \u003cp\u003e\u003cem\u003eイベント詳細ページ\u003c/em\u003e\u003c/p\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"50%\" align=\"center\" style=\"padding: 8px;\"\u003e\n    \u003ca href=\"./public/docs/screenshot/screenshot-4.png\" target=\"_blank\"\u003e\n        \u003cpicture\u003e\n          \u003csource srcset=\"./public/docs/screenshot/screenshot-4.webp\" type=\"image/webp\" /\u003e\n          \u003cimg src=\"./public/docs/screenshot/screenshot-4.png\" alt=\"イベント作成フォーム\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n        \u003c/picture\u003e\n        \u003c/a\u003e\n      \u003cp\u003e\u003cem\u003eイベント作成フォーム\u003c/em\u003e\u003c/p\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\" align=\"center\" style=\"padding: 8px;\"\u003e\n    \u003ca href=\"./public/docs/screenshot/screenshot-7.png\" target=\"_blank\"\u003e\n        \u003cpicture\u003e\n          \u003csource srcset=\"./public/docs/screenshot/screenshot-7.webp\" type=\"image/webp\" /\u003e\n          \u003cimg src=\"./public/docs/screenshot/screenshot-7.png\" alt=\"申し込み履歴ページ\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n        \u003c/picture\u003e\n        \u003c/a\u003e\n      \u003cp\u003e\u003cem\u003eイベント申し込み履歴ページ\u003c/em\u003e\u003c/p\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"50%\" align=\"center\" style=\"padding: 8px;\"\u003e\n    \u003ca href=\"./public/docs/screenshot/screenshot-8.png\" target=\"_blank\"\u003e\n        \u003cpicture\u003e\n          \u003csource srcset=\"./public/docs/screenshot/screenshot-8.webp\" type=\"image/webp\" /\u003e\n          \u003cimg src=\"./public/docs/screenshot/screenshot-8.png\" alt=\"本アカウント登録ダイアログ\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n        \u003c/picture\u003e\n        \u003c/a\u003e\n      \u003cp\u003e\u003cem\u003eAnonymous→本アカウント登録ダイアログ\u003c/em\u003e\u003c/p\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## ✨ 主な機能\n\n### 基本機能（React Road お題）\n\n1. **イベント一覧ページ**： サイトアクセス時に、イベント一覧を表示\n2. **イベント詳細ページ**： イベント詳細情報を表示\n3. **イベント申し込みページ**： イベントに申し込むためのメールフォーム(フロントエンドのみ)\n4. **申し込み完了ページ**： 申し込み完了メッセージを表示\n\n### 追加実装済み機能\n\n- [x] **認証システム** - ユーザー登録・ログイン・ログアウト機能 [#3](https://github.com/oumelab/demo-react-event-calendar/issues/3)\n- [x] **イベント管理** - CRUD 操作でイベントの作成・編集・削除 [#4](https://github.com/oumelab/demo-react-event-calendar/issues/4), [#17](https://github.com/oumelab/demo-react-event-calendar/issues/17)\n- [x] **データベース連携** - イベントと参加者情報をデータベースに保存 [#1](https://github.com/oumelab/demo-react-event-calendar/issues/1)\n- [x] **定員管理** - 参加者が満員の場合、参加できないよう制御\n- [x] **型安全性** - フロントエンドとバックエンドで型定義を共有\n- [x] **モダンフォーム** - React Hook Form + Zod [#16](https://github.com/oumelab/demo-react-event-calendar/issues/16)\n- [x] **状態管理** - Zustand による効率的な状態管理 [#29](https://github.com/oumelab/demo-react-event-calendar/issues/29)\n- [x] **ルーティング** - React Router v6 → v7 へのアップデート\n- [x] **イベント申し込み・キャンセル機能** - 参加申し込みとキャンセル機能 [#5](https://github.com/oumelab/demo-react-event-calendar/issues/5)\n- [x] **Anonymous 認証** - 登録なしでゲストとしてイベント申し込みが可能、本アカウントへデータ移行も可能 [#43](https://github.com/oumelab/demo-react-event-calendar/issues/43)\n- [x] **バンドルサイズ分析・最適化** - `rollup -plugin-visualizer`導入、チャンク分割・動的インポートによるバンドルサイズ削減・最適化 [#45](https://github.com/oumelab/demo-react-event-calendar/issues/45)\n- [x] **イベント作成履歴** - イベント作成履歴の表示 [#40](https://github.com/oumelab/demo-react-event-calendar/issues/40)\n- [x] **画像アップロード** - イベント画像のアップロード機能 [#19](https://github.com/oumelab/demo-react-event-calendar/issues/19)\n\n### 実装予定機能\n\n- [ ] **ユーザー情報編集機能** - ユーザープロフィールページ・ユーザー情報の編集機能実装 [#18](https://github.com/oumelab/demo-react-event-calendar/issues/18)\n- [ ] **イベント終了日時** - イベントの終了日時を設定 [#42](https://github.com/oumelab/demo-react-event-calendar/issues/42)\n- [ ] **Google カレンダーに追加** - イベントを Google カレンダーに追加\n- [ ] **ページネーション** - イベント一覧のページネーション\n- [ ] **イベント検索機能** - イベント検索機能\n- [ ] **メール通知** - メール通知システム実装 [#28](https://github.com/oumelab/demo-react-event-calendar/issues/28)\n\n## 🛠️ 使用技術\n\n| カテゴリ               | 技術スタック                                         |\n| ---------------------- | ---------------------------------------------------- |\n| **フロントエンド**     | Vite, React, React Router v7, TailwindCSS, shadcn/ui |\n| **状態管理・フォーム** | TanStack Query, Zustand, React Hook Form             |\n| **バリデーション**     | Zod（フロントエンド・バックエンド共通スキーマ）      |\n| **バックエンド**       | Cloudflare Pages Functions                           |\n| **データベース**       | Turso（libSQL）                                      |\n| **認証**               | Better Auth                                          |\n| **デプロイ**           | Cloudflare Pages                                     |\n| **開発ツール**         | TypeScript, Bun, rollup-plugin-visualizer            |\n\n## 📊 プロジェクト構成図\n\n### 🏗️ システムアーキテクチャ\n\n\u003ca href=\"./public/docs/system-architecture.png\" target=\"_blank\"\u003e\n  \u003cpicture\u003e\n    \u003csource srcset=\"./public/docs/system-architecture.webp\" type=\"image/webp\" /\u003e\n      \u003cimg src=\"./public/docs/system-architecture.png\" alt=\"システムアーキテクチャ\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eMermaid\u003c/summary\u003e\n\n```mermaid\n---\nconfig:\n  theme: neo\n---\ngraph TB\n    subgraph \"クライアント（ブラウザ）\"\n        React[React App\u003cbr/\u003eVite + TypeScript]\n        Zustand[Zustand\u003cbr/\u003e状態管理]\n        TanStack[TanStack Query\u003cbr/\u003eサーバー状態]\n        ReactRouter[React Router v7\u003cbr/\u003eルーティング]\n    end\n    subgraph \"Cloudflare Pages\"\n        StaticFiles[静的ファイル配信]\n        Functions[Pages Functions\u003cbr/\u003eAPI endpoints]\n    end\n    subgraph \"データベース\"\n        Turso[(Turso libSQL)]\n    end\n    subgraph \"認証\"\n        BetterAuth[Better Auth\u003cbr/\u003eセッション管理]\n    end\n    React --\u003e StaticFiles\n    TanStack --\u003e Functions\n    Zustand -.-\u003e TanStack\n    Functions --\u003e Turso\n    Functions --\u003e BetterAuth\n    BetterAuth --\u003e Turso\n```\n\n\u003c/details\u003e\n\n### 🗄️ データベース構成（ER 図）\n\n\u003ca href=\"./public/docs/database-configuration.png\" target=\"_blank\"\u003e\n  \u003cpicture\u003e\n    \u003csource srcset=\"./public/docs/database-configuration.webp\" type=\"image/webp\" /\u003e\n    \u003cimg src=\"./public/docs/database-configuration.png\" alt=\"データベース構成\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eMermaid\u003c/summary\u003e\n\n```mermaid\n---\nconfig:\n  theme: redux-color\n---\nerDiagram\n    users {\n        text id PK\n        text email\n        boolean emailVerified\n        text name\n        text image\n        boolean isAnonymous\n        integer createdAt\n        integer updatedAt\n    }\n\n    events {\n        text id PK\n        text title\n        text date\n        text location\n        text description\n        text image_url\n        integer capacity\n        text creator_id FK\n        integer created_at\n    }\n\n    attendees {\n        text id PK\n        text event_id FK\n        text email\n        text user_id FK\n        integer created_at\n    }\n\n    sessions {\n        text id PK\n        text userId FK\n        text token\n        integer expiresAt\n        text ipAddress\n        text userAgent\n        integer createdAt\n        integer updatedAt\n    }\n\n    accounts {\n        text id PK\n        text accountId\n        text providerId\n        text userId FK\n        text accessToken\n        text refreshToken\n        text idToken\n        text password\n        integer createdAt\n        integer updatedAt\n    }\n\n    verifications {\n        text id PK\n        text identifier\n        text value\n        integer expiresAt\n        integer createdAt\n        integer updatedAt\n    }\n\n    users ||--o{ events : creates\n    users ||--o{ attendees : registers\n    users ||--o{ sessions : has\n    users ||--o{ accounts : has\n    events ||--o{ attendees : has\n```\n\n\u003c/details\u003e\n\n### 🔄 状態管理フロー\n\n\u003ca href=\"./public/docs/state-management-flow.png\" target=\"_blank\"\u003e\n  \u003cpicture\u003e\n    \u003csource srcset=\"./public/docs/state-management-flow.webp\" type=\"image/webp\" /\u003e\n    \u003cimg src=\"./public/docs/state-management-flow.png\" alt=\"状態管理フロー\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eMermaid\u003c/summary\u003e\n\n```mermaid\n---\nconfig:\n  theme: redux-color\n---\nsequenceDiagram\n    participant U as User\n    participant C as Component\n    participant Z as Zustand Store\n    participant T as TanStack Query\n    participant A as Better Auth API\n    participant D as Database\n\n    U-\u003e\u003eC: ログインボタンクリック\n    C-\u003e\u003eT: authClient.signIn.email()\n    T-\u003e\u003eA: Better Auth認証\n    A-\u003e\u003eD: ユーザー認証・セッション作成\n    D--\u003e\u003eA: 認証結果\n    A--\u003e\u003eT: レスポンス返却\n    T-\u003e\u003eZ: ユーザー情報を更新\n    Z--\u003e\u003eC: 状態変更通知\n    C--\u003e\u003eU: UI更新\n```\n\n\u003c/details\u003e\n\n### 🌐 API エンドポイント構成\n\n### **🗓️ イベント管理**\n\n| エンドポイント            | メソッド | 認証 | 説明             |\n| ------------------------- | -------- | ---- | ---------------- |\n| `/api/events`             | GET      | -    | イベント一覧取得 |\n| `/api/events/[id]`        | GET      | -    | イベント詳細取得 |\n| `/api/events/create`      | POST     | ✅   | イベント作成     |\n| `/api/events/[id]/update` | PUT      | ✅   | イベント更新     |\n| `/api/events/[id]/delete` | DELETE   | ✅   | イベント削除     |\n\n### **📝 イベント参加**\n\n| エンドポイント            | メソッド | 認証 | 説明                       |\n| ------------------------- | -------- | ---- | -------------------------- |\n| `/api/events/[id]/apply`  | POST     | ✅   | イベント申し込み           |\n| `/api/events/[id]/cancel` | DELETE   | ✅   | イベント申し込みキャンセル |\n| `/api/user/registrations` | GET      | ✅   | ユーザー申し込み履歴取得   |\n| `/api/user/created-events` | GET      | ✅   | ユーザーイベント作成履歴取得   |\n\n### **🔐 認証システム**\n\nBetter Auth による統一認証エンドポイント（Email and Password）\n| エンドポイント | メソッド | 認証 | 説明 |\n| ------------------- | -------- | ---- | ------------------ |\n| `/api/auth/sign-in/email` | POST | - | ユーザーログイン |\n| `/api/auth/sign-up/email` | POST | - | ユーザー新規登録 |\n| `/api/auth/sign-out`| POST | ✅ | ユーザーログアウト |\n| `/api/auth/get-session` | GET | - | セッション情報取得 |\n\n\u003e Note: Better Auth の [[catchall]] ハンドラーにより、認証関連のエンドポイントは自動的に提供される。\n\n### **📷 画像アップロード**\n\n| エンドポイント      | メソッド | 認証 | 説明                           |\n| ------------------- | -------- | ---- | ------------------------------ |\n| `/api/upload/image` | POST     | ✅   | 汎用画像アップロード           |\n| `/api/upload/image` | DELETE   | ✅   | 画像削除                       |\n| `/api/upload/image` | GET      | ✅   | ユーザー画像一覧取得           |\n\n## 🚀 Anonymous 認証の特徴\n\n### ゲストユーザー体験\n\n- 登録なしで即体験: 面倒な会員登録なしでイベントの閲覧・申し込みが可能\n- 一時的なデータ保存: 申し込み履歴は匿名ユーザー ID で一時保存\n- スムーズなアップグレード: ワンクリックで正規ユーザーに移行\n\n### データ移行システム\n\n\u003ca href=\"./public/docs/anonymous-login-flow.png\" target=\"_blank\"\u003e\n  \u003cpicture\u003e\n    \u003csource srcset=\"./public/docs/anonymous-login-flow.webp\" type=\"image/webp\" /\u003e\n    \u003cimg src=\"./public/docs/anonymous-login-flow.png\" alt=\"状態管理フロー\" width=\"100%\" style=\"border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eMermaid\u003c/summary\u003e\n\n```mermaid\ngraph LR\n    A[ゲストユーザー] --\u003e B[イベント申し込み]\n    B --\u003e C[一時データ保存]\n    C --\u003e D[アカウント作成]\n    D --\u003e E[データ自動移行]\n    E --\u003e F[正規ユーザー]\n\n    style A fill:#e1f5fe\n    style F fill:#e8f5e8\n    style E fill:#fff3e0\n```\n\n\u003c/details\u003e\n\n### 移行されるデータ\n\n- ✅ イベント申し込み履歴\n- ✅ ユーザー設定・preferences\n- ✅ セッション情報\n\n## 🔧 開発環境\n\n### 必要なツール\n\n- Node.js: 22.16.0 (.nvmrc で指定)\n- パッケージマネージャー: bun\n- TypeScript: ^5.7.2\n\n### 開発サーバー起動\n\n```bash\n# フロントエンド (Vite)\nbun run dev\n\n# バックエンド (Wrangler + Vite)\nbunx wrangler pages dev -- bun run dev\n```\n\n### ビルド・プレビュー\n\n```bash\n# ビルド\nbun run build\n\n# プレビュー\nbun run preview\n```\n\n## 📊 パフォーマンス最適化\n\n### バンドル分析・最適化\n\n- **rollup-plugin-visualizer** によるバンドルサイズ分析\n- **チャンク分割**: React、Router、Form ライブラリを個別バンドル化\n- **遅延読み込み**: React.lazy() によるイベント作成画面の動的インポート\n- **成果**: 初期バンドルサイズ 29%削減（647KB → 460KB）\n\n```bash\n# バンドル分析実行\nbun run build:analyze\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foumelab%2Fdemo-react-event-calendar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foumelab%2Fdemo-react-event-calendar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foumelab%2Fdemo-react-event-calendar/lists"}