{"id":31570335,"url":"https://github.com/jackiez123430/ideacapture","last_synced_at":"2026-04-28T12:02:27.064Z","repository":{"id":313836337,"uuid":"1053105076","full_name":"JackieZ123430/IdeaCapture","owner":"JackieZ123430","description":"An experimental iOS app built with SwiftUI + SpriteKit for idea capturing and visualization. 实验性 iOS 应用：基于 SwiftUI + SpriteKit 的灵感捕捉与可视化。","archived":false,"fork":false,"pushed_at":"2025-09-10T17:30:23.000Z","size":3701,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-05T12:30:54.261Z","etag":null,"topics":["apple","draggesture","eventkit","idea-capture","ios","ios-app","ios-application","ios-swift","live-activities","mysql","php","productivity-app","spritekit","swiftui","swiftui-demo","xcode"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JackieZ123430.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-09T02:06:06.000Z","updated_at":"2025-09-10T17:30:26.000Z","dependencies_parsed_at":"2025-09-09T03:59:01.399Z","dependency_job_id":"62411fea-98fb-47fd-9f46-fbb0c001a9e4","html_url":"https://github.com/JackieZ123430/IdeaCapture","commit_stats":null,"previous_names":["jackiez123430/ideacapture"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/JackieZ123430/IdeaCapture","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackieZ123430%2FIdeaCapture","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackieZ123430%2FIdeaCapture/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackieZ123430%2FIdeaCapture/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackieZ123430%2FIdeaCapture/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JackieZ123430","download_url":"https://codeload.github.com/JackieZ123430/IdeaCapture/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackieZ123430%2FIdeaCapture/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32379629,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T11:25:28.583Z","status":"ssl_error","status_checked_at":"2026-04-28T11:25:05.435Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["apple","draggesture","eventkit","idea-capture","ios","ios-app","ios-application","ios-swift","live-activities","mysql","php","productivity-app","spritekit","swiftui","swiftui-demo","xcode"],"created_at":"2025-10-05T12:21:04.887Z","updated_at":"2026-04-28T12:02:27.059Z","avatar_url":"https://github.com/JackieZ123430.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IdeaCapture 想法产生器\n\n\u003e EN: IdeaCapture is an experimental iOS app built with **SwiftUI + SpriteKit**, designed to capture and visualize ideas.  \n\u003e CN: IdeaCapture 是一个使用 **SwiftUI + SpriteKit** 构建的实验性 iOS 应用，主要用于灵感捕捉与可视化管理。  \n\n⚠️ **Status**: The project is **abandoned** and no longer maintained. / 本项目 **已弃坑，不再维护**。\n\n---\n\n## ✨ Features / 功能概览\n\n- 📌 **Idea Management / 灵感管理**\n  - Create, archive, delete ideas / 创建、归档、删除点子\n  - Organize ideas by project / 通过项目组织点子\n  - Export `.txt` file of ideas / 导出项目点子为 `.txt`\n\n- 🎨 **Visualization / 可视化**\n  - **BubbleCanvas**: SwiftUI random layout with wobble animation  \n    **BubbleCanvas**：SwiftUI 随机布局 + 抖动动画  \n  - **BubbleScene**: SpriteKit physics bubbles (DVD bounce or Gravity)  \n    **BubbleScene**：SpriteKit 物理气泡（DVD 弹跳 / 重力模式）\n\n  \u003cdiv\u003e\n    \u003cimg src=\"photo/Simulator%20Screenshot%20-%2016%2018.3%20-%202025-09-09%20at%2011.51.01.png\" width=\"260\"\u003e\n    \u003cimg src=\"photo/Simulator%20Screenshot%20-%2016%2018.3%20-%202025-09-09%20at%2011.51.05.png\" width=\"260\"\u003e\n    \u003cimg src=\"photo/Simulator%20Screenshot%20-%2016%2018.3%20-%202025-09-09%20at%2011.51.08.png\" width=\"260\"\u003e\n  \u003c/div\u003e\n\n- 🔔 **Notifications \u0026 Calendar / 通知与日历**\n  - Local countdown notifications (24h, 12h, 2h, 1h, 30m, 10m)  \n    本地倒计时提醒（24h、12h、2h、1h、30m、10m）  \n  - EventKit integration, auto-create calendar events  \n    集成 EventKit，自动写入日历\n\n- 🏝️ **Live Activities / 灵动岛**\n  - Real-time countdown on Dynamic Island (iOS 16.1+)  \n    灵动岛实时倒计时（iOS 16.1+）  \n  - Compact / Expanded / Minimal states  \n    紧凑 / 展开 / 极简三种状态\n\n- 🚀 **Onboarding / 引导**\n  - Multi-step setup wizard with project details  \n    多步骤引导页（摘要、标签、目标、受众、语气）  \n  - Advanced options: deadline, Live Activity, notifications  \n    高级选项：截止日期、灵动岛、通知  \n\n  \u003cdiv\u003e\n    \u003cimg src=\"photo/Simulator%20Screenshot%20-%2016%2018.3%20-%202025-09-09%20at%2011.50.38.png\" width=\"260\"\u003e\n    \u003cimg src=\"photo/Simulator%20Screenshot%20-%2016%2018.3%20-%202025-09-09%20at%2011.50.20.png\" width=\"260\"\u003e\n    \u003cimg src=\"photo/Simulator%20Screenshot%20-%2016%2018.3%20-%202025-09-09%20at%2011.50.15.png\" width=\"260\"\u003e\n    \u003cimg src=\"photo/Simulator%20Screenshot%20-%2016%2018.3%20-%202025-09-09%20at%2011.50.13.png\" width=\"260\"\u003e\n    \u003cimg src=\"photo/Simulator%20Screenshot%20-%2016%2018.3%20-%202025-09-09%20at%2011.50.11.png\" width=\"260\"\u003e\n    \u003cimg src=\"photo/Simulator%20Screenshot%20-%2016%2018.3%20-%202025-09-09%20at%2011.50.02.png\" width=\"260\"\u003e\n  \u003c/div\u003e\n\n- ⚙️ **Settings \u0026 Developer Mode / 设置与开发者模式**\n  - Switch between BubbleCanvas and BubbleScene  \n    切换可视化模式（BubbleCanvas / BubbleScene）  \n  - Unlock hidden developer mode by tapping version 7 times  \n    点击版本号 7 次解锁开发者模式  \n  - Debug tools: force onboarding, test notifications, test Live Activity  \n    调试工具：重置引导、测试通知、测试灵动岛\n\n---\n\n## 🛠️ Technical Details / 技术实现细节\n\n### 1. Data Layer / 数据层\n- **Idea.swift**\n  - Stores `id, content, project, createdAt, fontName, fontSize, colorHex, isArchived`\n  - 使用 `Codable + UserDefaults` JSON 存储\n- **IdeaViewModel**\n  - Manages all projects, ideas, configs, and metadata  \n  - 调度通知、日历、灵动岛逻辑\n\n---\n\n### 2. Sidebar Gesture / 侧边栏手势\n- Implemented in `ContentView.swift` using `DragGesture`  \n  在 `ContentView.swift` 中使用 `DragGesture` 实现\n- **Rule**:\n  - Only if drag starts within left 20px → allow opening sidebar  \n  - 只有手势起点在左边 20px 内才允许打开侧边栏  \n- **Threshold**:  \n  - If drag offset \u003e 40% of sidebar width → open  \n  - 向右拖拽超过侧边栏宽度 40% → 打开  \n\n---\n\n### 3. BubbleScene Physics / BubbleScene 物理模拟\n- **DVD Mode / DVD 模式**\n  - `restitution = 1` → 完全弹性碰撞  \n  - `friction = 0` → 无摩擦  \n  - Random initial velocity `-100...100`  \n    初始速度随机 `-100...100`\n- **Gravity Mode / 重力模式**\n  - Uses `CoreMotion` accelerometer or device motion  \n    使用 `CoreMotion` 加速度计或设备方向  \n  - Updates physics world:\n    ```swift\n    let dx = g.x * gravityStrength\n    let dy = g.y * gravityStrength\n    physicsWorld.gravity = CGVector(dx: dx, dy: dy)\n    ```\n  - 实时根据设备姿态改变重力方向\n\n---\n\n### 4. Notifications / 通知参数\n- Reminder offsets (in seconds):  \n  - `[86400, 43200, 7200, 3600, 1800, 600]`  \n  - 对应 **24h, 12h, 2h, 1h, 30m, 10m**  \n- Trigger type: `UNTimeIntervalNotificationTrigger`\n\n---\n\n### 5. Live Activity / 灵动岛\n- Based on **ActivityKit + WidgetKit**  \n- Countdown text formatter:  \n  - \u003e1 hour → `\"xh ym\"`  \n  - \u003c1 hour → `\"ym\"`  \n  - expired → `\"已到期\" / \"Expired\"`\n- Compact → shows short label (e.g., `45m`)  \n- Expanded → project name + countdown  \n\n---\n\n## 📂 Project Structure / 项目结构\n\n```\nIdeaCapture/\n├── IdeaBubbleApp.swift        # App entry / 入口\n├── ContentView.swift          # Main UI with Sidebar / 主界面 + 侧边栏\n├── BubbleCanvas.swift         # SwiftUI bubble layout / SwiftUI 气泡布局\n├── BubbleScene.swift          # SpriteKit bubble physics / SpriteKit 物理气泡\n├── AllIdeasView.swift         # Idea list with search / 点子列表 + 搜索\n├── ProjectEditorView.swift    # Project editing / 编辑项目\n├── ProjectSettingsView.swift  # Project config / 项目配置\n├── OnboardingView.swift       # Onboarding wizard / 引导页\n├── SettingsView.swift         # Settings + Developer mode / 设置 + 开发者模式\n├── Idea.swift                 # Data model + ViewModel / 数据模型 + VM\n├── NotificationManager.swift  # Local notifications / 通知\n├── CalendarManager.swift      # EventKit integration / 日历\n├── LiveActivityManager.swift  # ActivityKit wrapper / 灵动岛封装\n├── APIService.swift           # Mock login API / 登录接口\n├── NewWidgetExtension/        # Widget + Live Activity extension / 小组件\n└── web-backend/               # 后端网站（PHP + MySQL）\n```\n\n---\n\n## 🚧 Known Limitations / 已知限制\n\n- Some features only available on iOS 16.1+  \n  部分功能仅限 iOS 16.1+  \n- 云端上传 / 服务器交互功能未公开 → 功能残缺状态\n\n---\n\n## 🌐 Web Backend / 网站后端\n\n- Located in `/web-backend`  \n- Built with **PHP + MySQL**  \n- Provides planned API endpoints for:  \n  - Idea upload \u0026 sync / 点子上传与同步  \n  - User login \u0026 project binding / 用户登录与项目绑定  \n\n### Database / 数据库\n- Database name: `ideaapi_jackiezy`  \n- Tables:\n  - `projects` → 存放项目基本信息  \n  - `project_opinions` → 存放项目意见/反馈  \n  - `snapshots` → 存放项目快照  \n  - `users` → 存放用户信息（仅示例用户，无真实数据）\n\n### 导入方法\n1. 创建数据库：\n   ```bash\n   CREATE DATABASE ideaapi_jackiezy CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;\n   ```\n2. 导入结构和示例数据：\n   ```bash\n   mysql -u root -p ideaapi_jackiezy \u003c web-backend/ideaapi_jackiezy.sql\n   ```\n\n---\n\n## 📲 Installation / 安装与运行说明\n\n1. 克隆本仓库并在 Xcode 中打开：  \n   ```bash\n   git clone https://github.com/JackieZ123430/IdeaCapture.git\n   cd IdeaCapture\n   open IdeaCapture.xcodeproj\n   ```\n\n2. **开发环境说明**  \n   - 本项目开发于 **Xcode 26 beta 4**  \n   - 可以在 **更高版本或正式版 Xcode** 中正常打开与运行  \n   - 运行环境要求：**iOS 18 – iOS 26**\n\n3. **功能说明**  \n   - 本地功能（点子管理、项目管理、气泡可视化、通知、灵动岛倒计时等）均可正常使用  \n   - **部分依赖服务器的功能（云端上传、账号验证等）目前未公开** → 功能不可用，后续可能开放  \n\n4. **开发者模式**  \n   - 原本 **双击版本号 7 次** 解锁的云端逻辑已被禁用  \n   - 如需使用云端验证账户是否能启动开发者工具，请直接在代码中手动开启：  \n     ```swift\n     @AppStorage(\"DebugEnabled\") private var debugEnabled: Bool = true\n     ```\n\n---\n\n## 📖 Contributing / 贡献\n\n- 本项目已停止维护，**Pull Request 不再主动合并**。  \n- 欢迎 fork 本仓库，用于个人学习或扩展功能。  \n- 请遵守 [Apache License 2.0](./LICENSE)。\n\n---\n\n## 📝 Changelog / 更新记录\n\n### v1.0.0 (2025-09-09)\n- 初始开源版本  \n- 包含点子管理、BubbleScene、通知、日历、灵动岛功能  \n- 云端上传功能未公开  \n- 新增 Web Backend（PHP + MySQL，含数据库结构 `ideaapi_jackiezy`）\n\n---\n\n## 🙏 Acknowledgements / 致谢\n- Apple 官方文档（SwiftUI / SpriteKit / ActivityKit / EventKit / UserNotifications）  \n- GitHub Actions for iOS CI/CD  \n- 参考灵感来自 Things、Notion 等效率应用  \n\n---\n\n## ⚠️ Status / 状态\n- EN: This project is **abandoned**, but serves as a reference for SwiftUI + SpriteKit + PHP/MySQL integration.  \n- CN: 本项目 **已弃坑**，但可作为 SwiftUI + SpriteKit + PHP/MySQL 集成的参考示例。  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjackiez123430%2Fideacapture","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjackiez123430%2Fideacapture","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjackiez123430%2Fideacapture/lists"}