Files browser (web/files):
- Alphabetical listing grouped folders-then-files
- Upload via button or drag-and-drop, including whole folders
- Folder creation
- Fixed layout for long filenames without spaces (table-fixed + break-all)
Contacts (web/contacts):
- Full CRUD for CardDAV contacts (create/edit/delete)
- VCF import (multi-card files) and export (single/all)
- Photo upload with preview, birthday field
- TYPE labels (private/business) for phone, email, address
- Repeatable multi-input rows for phones/emails/addresses instead of textareas
- Sanitizes a known malformed TYPE parameter pattern from some vCard
exporters (e.g. Nextcloud Contacts) that otherwise caused phone numbers
to be silently dropped on import
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- web/ts/login.ts: small vanilla TS module toggling the password input's
type between 'password'/'text' via a 'Show/Hide' button, so users can
rule out typos before submitting. Compiled to web/static/login.js
(ES module) via tsc (web/tsconfig.json, new 'make web-ts'/'web-assets'
Makefile targets) and loaded via <script type="module">. Compiled JS
is committed/embedded the same way as the compiled CSS — no Node.js
needed at runtime.
- Verified end-to-end against the live proxied server
(https://local.unqr.dev/web/login): POST /web/login correctly returns
303 + Set-Cookie, and the session then authorizes GET /web/ — the
server-side login flow is confirmed working correctly.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>