1 parent
d55640d37a
commit
fff8521a17
67 files changed
+11016
-16763
No files matched your search
@@ -1,6 +1,6 @@
|
||||
# RustBox 0.0.1 - implementation status
|
||||
# RustBox 0.0.2 - implementation status
|
||||
|
||||
This file tracks the internal `0.0.1` baseline. The user-approved `docs/RUSTBOX_PLAN.md` remains authoritative. A feature is only listed as implemented when working code exists in this source tree; partial items are called out explicitly.
|
||||
This file tracks the internal `0.0.2` baseline. The user-approved `docs/RUSTBOX_PLAN.md` remains authoritative. A feature is only listed as implemented when working code exists in this source tree; partial items are called out explicitly.
|
||||
|
||||
## Implemented / wired in this working snapshot
|
||||
|
||||
@@ -16,6 +16,7 @@ This file tracks the internal `0.0.1` baseline. The user-approved `docs/RUSTBOX_
|
||||
- IMAP folder list, hierarchy, create, create subfolder, rename, delete, subscribe/unsubscribe, plus collapsible branch navigation with per-account remembered expansion state.
|
||||
- Special folders stored per account: Sent, Drafts, Trash, Junk and Archive. Spam/Junk additionally supports a browser-wide default destination with a per-account override and IMAP special-use/name fallback.
|
||||
- Special-folder references follow folder renames and are cleared when a referenced folder is deleted.
|
||||
- Administrators can define server-wide default Sent/Drafts/Trash/Junk/Archive folder names; per-account settings still override them when present.
|
||||
- Sent-copy, delete-to-Trash, Archive and Junk actions use the configured special folders.
|
||||
- Mark-all-read and empty-folder operations.
|
||||
- Message move and copy operations.
|
||||
@@ -30,7 +31,7 @@ This file tracks the internal `0.0.1` baseline. The user-approved `docs/RUSTBOX_
|
||||
- Forward-as-attachment using `message/rfc822`.
|
||||
- Mailing-list unsubscribe action from `List-Unsubscribe`; RFC 8058 one-click HTTPS requests are sent by the backend only when `List-Unsubscribe-Post: List-Unsubscribe=One-Click` is advertised, with redirect-free public-address SSRF checks. Ordinary HTTPS/mailto links remain user-confirmed UI actions.
|
||||
- Explicit upload-body limits for attachments, contact imports/photos, ICS imports and `.eml` import so Axum does not reject allowed uploads at its smaller default limit.
|
||||
- Attachment context menu supports in-app preview/download for safe image/PDF/text MIME classes; multiple attachments can be downloaded as a client-built UTF-8 ZIP without external runtime dependencies.
|
||||
- Attachment context menu supports in-app preview/download for safe image/PDF/text/HTML/video classes; HTML is sandboxed and video uses native browser controls. Multiple attachments can be downloaded as a client-built UTF-8 ZIP without external runtime dependencies.
|
||||
- Message rows expose compact hover/focus quick actions for read/unread and flag/unflag; flagged rows also receive a subtle red lower-edge marker.
|
||||
|
||||
### Composer / identities
|
||||
@@ -103,14 +104,14 @@ This file tracks the internal `0.0.1` baseline. The user-approved `docs/RUSTBOX_
|
||||
|
||||
- Fixed the `E0499` mutable-borrow failure in `mark_all_read`: the `uid_store()` stream is dropped before `session.logout()`.
|
||||
- Fixed a duplicate `else` introduced in the calendar delete handler during the calendar expansion.
|
||||
- All 36 SQLite migrations are present, contiguous and wired sequentially in the migration runner during static validation; V032–V036 add advanced appearance controls, draft compose-format persistence, optional IMAP-keyword sync, composer behavior preferences and remote IMAP-draft tracking.
|
||||
- All 45 SQLite migrations are present, contiguous and wired sequentially in the migration runner during static validation; V042 adds trusted senders, V043 saved responses, V044 persisted interface skins and V045 saved-response format.
|
||||
|
||||
## Partially implemented - keep visible as incomplete
|
||||
|
||||
- Sieve visual builder now supports a three-condition nested AND/OR group, negation, two actions, capability-aware disabling, managed-rule ordering and scheduled vacation dates. An arbitrary-depth condition tree, arbitrary-length action stack and full capability-aware condition/action matrix remain unfinished.
|
||||
- Drafts are stored locally and can be recovered after interrupted editing/SMTP failure. Remote replacement is implemented conservatively: RustBox resolves the new UID with UIDNEXT plus an exact per-draft header search and only removes the previous snapshot when resolution and UIDVALIDITY are safe; wider real-server compatibility still needs the release gate.
|
||||
- Calendar is local/ICS-capable and stores recurrence/attendee/reminder metadata, but recurrence expansion/edit semantics, invitation responses and CalDAV synchronization are not finished.
|
||||
- Notifications are wired through IMAP IDLE/WebSocket, but richer per-account notification policy and service-worker/background delivery are not finished.
|
||||
- Notifications are wired through IMAP IDLE/WebSocket, include permission status/test controls, and local calendar reminders can show browser notifications and play the configured sound while RustBox is open. Service-worker/background delivery is still not finished.
|
||||
- Identities emit Organization metadata; composer priority, MDN request headers and validated administrator-defined outbound headers are wired. SMTP DSN negotiation remains to be completed.
|
||||
|
||||
## Not yet complete - do not claim Roundcube parity
|
||||
@@ -133,13 +134,15 @@ This file tracks the internal `0.0.1` baseline. The user-approved `docs/RUSTBOX_
|
||||
- Month calendar grid and toolbar layout are responsive and remain usable under browser/UI scaling.
|
||||
- UI scale now affects font size, row height, pane widths, icons, field/button padding and control/header dimensions without being overwritten by the separate font-size setting.
|
||||
- Responsive layout keeps user-selected folder/message pane widths within safe viewport bounds instead of reverting to fixed widths.
|
||||
- The mobile composer keeps address labels and controls aligned, and the mobile folder drawer can be closed by its toggle, backdrop, Escape or folder selection while hierarchy disclosure controls keep larger touch targets.
|
||||
- Application actions have reusable success/error/warning/info toast feedback, including from within native modal dialogs.
|
||||
- Primary and bulk message toolbars include Spam / Not spam, driven by the configured Junk folder.
|
||||
- Reader includes Print, Source viewer and quick Create-filter-from-sender actions.
|
||||
- Reader addresses expose one-click contact actions; trusted senders can be added from a message so remote images load automatically unless the global policy is Never.
|
||||
- Header viewer shows a structured common-header summary and the raw header block.
|
||||
- vCard/iCalendar attachment SVG action icons no longer leak their markup as visible text; reader cleanup also strips only RustBox-owned icon-sprite fragments from malformed MIME content.
|
||||
- Message HTML receives an additional client-side sanitization pass before sandboxed iframe rendering; plain text is preserved exactly.
|
||||
- Embedded 0.0.1 UI assets are served with `Cache-Control: no-store` so development snapshots do not mix stale and current bundles.
|
||||
- Embedded CSS/JS use content-fingerprinted URLs with `Cache-Control: public, max-age=31536000, immutable`; HTML and unversioned compatibility aliases remain `no-store`.
|
||||
- Native browser confirmation/text prompts are no longer used by the main UI workflows; destructive actions and folder/label/text choices use RustBox application dialogs.
|
||||
- Message selection has an explicit mode: per-row checkboxes only appear while selecting, with select-all and bulk actions grouped in the selection toolbar.
|
||||
- Search selection can materialize and select every cached matching result, not only the currently rendered page.
|
||||
@@ -152,6 +155,6 @@ This file tracks the internal `0.0.1` baseline. The user-approved `docs/RUSTBOX_
|
||||
- Composer uploads expose progress, clipboard images become CID inline attachments, and browser-local recovery preserves edits when a draft save fails.
|
||||
- Compact/comfortable density now visibly affects controls/toolbars/dialog headers without overwriting the separate row-height and pane-width preferences.
|
||||
- Toasts show the remaining auto-dismiss time and pause their countdown while hovered or keyboard-focused.
|
||||
- Appearance settings include Compact, Balanced, Comfortable and Reading layout presets persisted through display preferences.
|
||||
- Composing settings now persist the default format, autosave interval, default priority, default read-receipt request, attachment-reminder behavior, default font, reply placement, quote style, forward mode and browser spellcheck through display preferences.
|
||||
- Appearance uses persisted `interface_skin` modes for RustBox (custom), Roundcube Classic, Roundcube Larry, Roundcube Elastic, Clean, Graphite and High contrast. The old Compact/Balanced/Comfortable/Reading preset cards were removed. Fixed interface styles apply their own visual geometry and palette without overwriting the user's stored RustBox custom values; selecting RustBox re-enables manual color, spacing, pane and typography controls. Classic Dark remains an adaptation because upstream Classic has no official dark skin.
|
||||
- Composing settings now persist the default format, autosave interval, default priority, default read-receipt request, attachment-reminder behavior, default font, reply placement, quote style, forward mode and browser spellcheck through display preferences. Saved/canned responses can be managed as text or sanitized HTML and inserted from the composer toolbar.
|
||||
- Message Print uses an in-page print frame instead of a popup and prints sanitized HTML or plain text with From/To/Date metadata.
|
||||
@@ -21,3 +21,8 @@ RUSTBOX_CONFIG=./config.dev.toml ./target/release/rustbox --check-config
|
||||
|
||||
6. Package the repository without `target/`, `.dev/` or `.git/`.
|
||||
7. Generate SHA-256 sums for release archives.
|
||||
|
||||
|
||||
## Browser asset build
|
||||
|
||||
Browser JavaScript source lives in functional modules under `src/web/js/`, ordered by `src/web/js/manifest.txt`. `build.rs` concatenates those modules into the embedded `rustbox-ui.js` asset during every Cargo build. `ui/app.js` is a generated standalone preview/release snapshot and must not be edited as source.
|
||||
@@ -1,4 +1,4 @@
|
||||
# RustBox 0.0.1 — remaining roadmap gaps
|
||||
# RustBox 0.0.2 — remaining roadmap gaps
|
||||
|
||||
Snapshot after the OpenPGP/key-lifecycle and unbounded Sieve action/condition work in this iteration.
|
||||
|
||||
@@ -74,7 +74,7 @@ OpenPGP is functionally complete for the scope defined in `RUSTBOX_PLAN.md` §9:
|
||||
### Search / notifications / diagnostics — 4
|
||||
|
||||
- [ ] Complete attachment content/metadata indexing policy and limits.
|
||||
- [ ] Background/service-worker notifications while the page is inactive, if retained for 0.0.1.
|
||||
- [ ] Background/service-worker notifications while the page is inactive, if retained for 0.0.2.
|
||||
- [ ] Richer per-account notification policy beyond global/per-folder controls.
|
||||
- [ ] Background task/queue status plus recent-error/repair workflows.
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# Roundcube skin validation
|
||||
|
||||
This snapshot maps RustBox components onto the official Roundcube Classic and Elastic visual tokens and adds a Larry-compatible fixed interface style.
|
||||
|
||||
## Source mapping
|
||||
|
||||
- **Classic Light**: `skins/classic/common.css` and Classic mail styles: `#F6F6F6` page background, `#F2F2F2` box background, `#CC3333` selected message/accent, `#929292` selected folder, square controls, Lucida/Verdana/Arial stack.
|
||||
- **Classic Dark**: upstream Classic has no official dark mode. RustBox preserves the Classic red/gray hierarchy, square controls and gradients while adapting surfaces/text for dark contrast.
|
||||
- **Elastic Light**: `skins/elastic/styles/colors.less` and variables: `#37beff` main, `#00acff` link/accent, `#f4f4f4` header, `#ddd` borders, white list/content surfaces.
|
||||
- **Elastic Dark**: upstream dark tokens: `#21292c` background, `#c5d1d3` text, `#4d6066` border, `#374549` selected row, `#2f3a3f` dark header/task surface.
|
||||
|
||||
## Automated checks
|
||||
|
||||
`python3 tests/roundcube_skin_contract.py`
|
||||
|
||||
The test verifies all migrations on a blank SQLite database, `interface_skin`, saved-response `format`, unique HTML ids, SVG back-arrow markup, both skin/theme selector pairs, upstream palette tokens, CSS parseability and frontend/backend registration.
|
||||
|
||||
`scripts/bundle-ui-js.py --output /tmp/rustbox-ui.js` followed by `node --check /tmp/rustbox-ui.js` validates the JavaScript manifest as one build artifact. `ui/app.js` is the generated standalone snapshot and is checked separately.
|
||||
|
||||
The browser fixture in `tests/theme_fixture.html` is rendered with the real bundled CSS. Validation screenshots in `tests/theme-shots/` cover Classic Light/Dark, Elastic Light/Dark and both mobile drawer variants.
|
||||
+2
-2
@@ -9,13 +9,13 @@ Design direction:
|
||||
- dark, light and system themes;
|
||||
- compact/comfortable density, preview-pane position and UI scale preferences;
|
||||
- a single embedded SVG icon sprite for interface actions;
|
||||
- no CSS gradients and no Unicode pseudo-icons;
|
||||
- no Unicode pseudo-icons; the native RustBox style stays flat while compatibility skins may reproduce their source skin treatment;
|
||||
- HTML compose formatting, threaded reading, folder operations and ManageSieve filters.
|
||||
|
||||
The supplied RustProxy source was used as a reference for disciplined asset organization, modular CSS, compact typography and Cargo-driven UI assembly. RustBox does not depend on RustProxy at runtime and retains its own mail-oriented layout and components.
|
||||
|
||||
## Build
|
||||
|
||||
`build.rs` reads `src/web/css/manifest.txt`, concatenates the CSS modules in the declared order and writes the bundle to Cargo `OUT_DIR`. `src/ui.rs` embeds that bundle together with `index.html`, `app.js` and `icons.svg` into the RustBox executable.
|
||||
`build.rs` reads both `src/web/css/manifest.txt` and `src/web/js/manifest.txt`, concatenates each module set in declared order and writes generated CSS/JavaScript bundles to Cargo `OUT_DIR`. `src/ui.rs` embeds those generated bundles together with `index.html` and `icons.svg` into the RustBox executable. The source of truth for browser JavaScript is `src/web/js/`; `src/web/app.js` does not exist.
|
||||
|
||||
No Node.js, Bun, TypeScript, React or Next.js build step exists.
|
||||
@@ -0,0 +1,21 @@
|
||||
# RustBox 0.0.2
|
||||
|
||||
RustBox 0.0.2 modularizes the browser JavaScript build and restructures appearance selection around fixed interface styles plus a fully customizable RustBox mode.
|
||||
|
||||
## UI build
|
||||
|
||||
- Source JavaScript lives in `src/web/js/` and is ordered by `src/web/js/manifest.txt`.
|
||||
- Cargo `build.rs` concatenates the modules into `rustbox-ui.js`, fingerprints the combined CSS/JS asset set and embeds the generated bundle.
|
||||
- `scripts/bundle-ui-js.py` generates `ui/app.js` only for standalone UI previews/release snapshots.
|
||||
|
||||
## Interface styles
|
||||
|
||||
- RustBox (custom)
|
||||
- Roundcube Classic
|
||||
- Roundcube Larry
|
||||
- Roundcube Elastic
|
||||
- Clean
|
||||
- Graphite
|
||||
- High contrast
|
||||
|
||||
The removed Compact/Balanced/Comfortable/Reading preset cards are no longer part of Appearance. Fixed styles use their own geometry and palette without destroying the stored RustBox custom values.
|
||||
Reference in new issue
Block a user