TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Unified Inbox — Phase 3 (Google OAuth + Gmail)
Phase 2 converted the working index.html prototype into a maintainable
Next.js + TypeScript app running on mock data only. Phase 3 adds a real,
read-only connection to one Gmail account via Google OAuth — everything
else (Outlook accounts, the other 11 mock Gmail accounts) is still mock
data, exactly as before.
Every row component (AccountRow, ExpandedAccount, EmailRow) receives
its data as props — none of them import mock data directly.
Phase 3: Google OAuth + Gmail (new)檢視完整 README ↗Phase 2 converted the working index.html prototype into a maintainable
Next.js + TypeScript app running on mock data only. Phase 3 adds a real,
read-only connection to one Gmail account via Google OAuth — everything
else (Outlook accounts, the other 11 mock Gmail accounts) is still mock
data, exactly as before.
app/
layout.tsx root layout, imports globals.css
page.tsx entry point, passes mock data into <Dashboard />
globals.css all styling, ported from the prototype's <style>
components/
Dashboard.tsx owns all state (search, filters, expanded/selected
account, modals) — the only "smart" component
AccountPanel.tsx left column: toolbar + scrollable account list
AccountToolbar.tsx search input + All/Gmail/Outlook/Unread chips
AccountRow.tsx one collapsed account row
ExpandedAccount.tsx the open state of an account row (Inbox/Login/•••)
MoreMenu.tsx dropdown: mark all read / sync / settings / disconnect
StreamPanel.tsx right column: unified email list + search
EmailRow.tsx one row in the email stream
EmailDetailModal.tsx modal shown when an email is opened
ConnectAccountModal.tsx "+ Connect account" modal — now links to
/api/auth/google for the real Gmail connection
lib/
types.ts Account, Email, Provider, ProviderFilter
mock-data.ts mockAccounts[], mockEmails[] — the 12 mock accounts /
10 mock emails Phase 3 layers the real Gmail account on
top of (see "Phase 3" section below for the new lib/ files)
Every row component (AccountRow, ExpandedAccount, EmailRow) receives
its data as props — none of them import mock data directly.
No new npm dependencies — OAuth and the Gmail REST calls are implemented
with plain fetch and Node's built-in crypto, nothing else.
lib/
google-auth.ts OAuth URL building, code/refresh-token exchange, token
revoke, and the Gmail API calls (list inbox, unread
count) — all plain fetch, no googleapis/next-auth
session.ts AES-256-GCM encrypt/decrypt for the session cookie
(keyed from AUTH_SECRET)
constants.ts REAL_GMAIL_ACCOUNT_ID — the reserved id (1000) used
to merge the one real account into the mock arrays
without colliding with mock ids 1-12 / 1-10
app/api/
auth/google/route.ts GET → redirects to Google's consent screen
auth/google/callback/route.ts GET → exchanges code for tokens, sets session cookie
auth/google/disconnect/route.ts POST → revokes token, clears session cookie
gmail/messages/route.ts GET → { connected, account, emails } for the
logged-in Gmail account, refreshing the
access token first if it's expired
components/Dashboard.tsx fetches /api/gmail/messages once on mount and
merges the result into the same accounts/emails state the mock data
already lives in — so every existing component (search, filters, the
inbox stream, the detail modal) works on the real account for free,
without ever knowing it's real. "Sync now" and "Disconnect" on that one
account are now wired to actually call Google instead of being no-ops.
http://localhost:3000/api/auth/google/callback
.env.local (already git-ignored):
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
AUTH_SECRET=... # any long random string, e.g. `openssl rand -base64 32`
GOOGLE_REDIRECT_URI=http://localhost:3000/api/auth/google/callback
npm install && npm run dev, then click + Connect account → Continue
with Google.1000) — there's no multi-account Gmail support and
Outlook OAuth isn't implemented.gmail.readonly; no send, no
archive/delete, no labels beyond reading INBOX/UNREAD.snippet (~100 chars), not the full parsed
MIME body — fetching/parsing full multipart bodies (text vs HTML,
attachments) is real scope for a later phase, not added here.This was implemented and type-checked (tsc --noEmit passes cleanly) in a
sandbox with no network access, so npm run build's SWC binary download
and the actual Google OAuth redirect couldn't be exercised. Please run
npm run dev and click through Connect account → Continue with Google
yourself, and run npm run build before deploying — if anything breaks,
send me the error output and I'll fix it.
npm install
npm run dev
npm run build
npm start
lib/mock-data.ts) — refreshing the page resets their
read/unread state and any disconnected mock accounts. The one real
Gmail account re-syncs from the actual API on every load instead.Push this folder to a GitHub repo and import it into Vercel the same way as before — Vercel auto-detects Next.js, so no manual Framework Preset or Output Directory changes are needed this time (that override was only required for the raw static HTML version).