Repository navigation
fix(vault): let the join form follow the window and accept a blank Region - #23
Merged
Merged
Conversation
…gion
The join screen was a fixed 384px column that scrolled on its own, so
the wheel worked only over that column. The eye button's addon in
PasswordField hung 3px past its input group, and the scrolling form
turned that into a horizontal scrollbar. The screen is now the scroll
container and the form is m-auto up to max-w-3xl, the Settings content
width. The addon overrides pr-3 has-[>button]:-mr-1 with
pr-2 has-[>button]:mr-0, so the button stays where it was and nothing
hangs past the group.
Join vault no longer requires an S3 Region. provider_config passes the
region through as typed, Settings > Sync saves it blank, and a server
that takes an empty one works with it (Cloudflare R2 reads it as auto).
Bucket stays required for S3: a blank one builds {endpoint}//{key}
paths.
connectionFieldsReady becomes missingConnectionFields, which returns the
labels of the blank fields, and useMasterPassword also returns problems,
one sentence per rule the password still fails. useJoinSync builds
blockers from both, the credential pair and the passphrase, and derives
canSubmit from it. The screen lists the blockers under the button in
muted text.
scripts/sync-verify.ts checks the new connection gate, including the
blank Region.
Closes #22
This was referenced Oct 6, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The Join a synced vault screen now scrolls as a whole, and its form widens
with the window up to the Settings content width, with no horizontal scrollbar.
Join vault accepts a blank S3 Region, and while it is disabled a list under
it names every field that is still empty or invalid.
Why
Closes #22.
The form was a fixed 384px column and its own scroll container, so the wheel
did nothing outside that column. A 3px horizontal scrollbar sat under the
button. Join vault also required a Region that Settings > Sync saves blank and
provider_configpasses through as typed, and nothing on screen said why thebutton was disabled.
How
Layout:
JoinSyncScreen.tsx: the outerdivis the scroll container(
flex h-full flex-1 overflow-y-auto p-6). The form ism-auto flex w-full max-w-3xl flex-col gap-4. Auto margins centre a shortform and collapse to 0 on a tall one, so the heading stays reachable, which
items-centeron an overflowing child did not guarantee.max-w-3xlis thewidth of the Settings content (
SettingsApp.tsx), so the rows the two formsshare wrap the same in both.
PasswordField.tsx: the eye button's addon getsclassName="pr-2 has-[>button]:mr-0".cnrunstwMerge, which drops thebase
pr-3 has-[>button]:-mr-1. The button's right edge stays 8px inside thegroup (12px padding minus the 4px overhang before, 8px padding now), and the
addon no longer ends 3px past the group.
input-group.tsxis generated byshadcn and stays untouched.
Gate:
src/modules/sync/types.ts:connectionFieldsReady(config, credentialsReady)becomes
missingConnectionFields(config), which returns the labels of theblank connection fields: Endpoint, plus Bucket for S3. Region is never
listed. Bucket stays required for S3: a blank one builds
{endpoint}//{key}request paths, and Join screen: the form doesn't follow the window size, and Join vault stays disabled on a blank Region that Settings accepts #22 shows no server that works with one.
MasterPasswordFields.tsx:useMasterPasswordalso returnsproblems, onesentence per rule the password still fails.
readyisproblems.length === 0and means what it did before, so
CreateVaultScreen.tsxis unchanged.useJoinSync.ts: a file-privatemissingCredentialsreplaces the exportedcredentialsReadyand returns the selected provider's blank credentiallabels. The hook takes
masterPasswordProblemsand returnsblockers: oneStill empty: …line for the blank fields, in render order, then themaster-password sentences.
canSubmitisblockers.length === 0 && !busy.JoinSyncScreen.tsx: the blockers render as a muted<ul id="join-blockers">under the button, which points at it with
aria-describedby. Muted ratherthan destructive, because an untouched form is not an error. On an untouched
S3 form it reads:
src-tauri/src/modules/sync/engine/types.rs: theregiondoc comment nolonger says the S3 form requires it. Comment only.
CHANGELOG.md: two entries under[Unreleased]→Fixed.Testing
pnpm run verify sync: the join-gate block inscripts/sync-verify.tsnowchecks that a WebDAV connection needs no Region or Bucket, a complete S3
connection is ready, a blank Region is ready, a blank Bucket names
Bucket,and a blank Endpoint names
Endpoint. Each of these breaks inmissingConnectionFields, made one at a time and then reverted, fails acheck:
"Region";"";.trim()dropped from the Endpoint test: the blank-Endpoint check failswith
"";"Bucket".A one-off Playwright script (not committed) against
pnpm devin Chromium,with
invokestubbed forvault_status,vault_listandsync_join:At every size the form itself does not scroll and the heading is visible at
the top. At 1280×800 the wheel scrolls the screen with the pointer left of
the form. The gate flow: an untouched form lists the three lines above; with
every field filled and Region blank the button is enabled and the list is
gone; a blank Bucket, a mismatched confirmation, a 6-character master
password and an unticked box are each named; WebDAV lists
Still empty: Username, Password.; and the submittedsync_joincallcarries
region: "". With the old layout classes back, the width,form-scroll and wheel checks fail. Without the addon
className, the addonends 3px past its group at every size.
pnpm run lint:imports,pnpm run typecheck:scripts,pnpm exec tsc --noEmit,pnpm run verify(17/17),pnpm run format:checkand
cargo fmt --all -- --checkare clean.pnpm exec tsc --noEmitcleanManual smoke-test of the affected feature
(If you touched
src-tauri/)cargo checkclean(If UI) tested in
pnpm tauri:dev(isolated dev data dir)Under
src-tauri/only a doc comment changed, socargo checkwas not run.Not tested yet:
pnpm tauri:dev(WebKitGTK, where Join screen: the form doesn't follow the window size, and Join vault stays disabled on a blank Region that Settings accepts #22 was found), at640×480 and maximized.
Screenshots / GIFs
None. The layout was measured in the
pnpm devpreview (table above) and hasnot been run in
pnpm tauri:devyet.Notes for reviewer
p-6scroller, the 3px addon overhang no longer produces ascrollbar on this screen even without the
PasswordFieldoverride. Theoverride still keeps the shared field inside its group wherever it sits
against a scrolling edge.
spinner;
busyis the only reason Submit is disabled that the list does notname.
missingCredentials, theStill empty:line,problems) has no permanent check, ascredentialsReadyandreadyhadnone before.
useJoinSync.tsimports@tauri-apps/api/eventat modulescope, so
pnpm run verifycannot load it.