Commit graph

95 commits

Author SHA1 Message Date
amblued
f36ca9317d
feat(web): add a global memo composer to the sidebar (#6219) 2026-08-21 21:14:28 +08:00
amblued
e99ae78012
fix(markdown): avoid parsing currency as inline math (#6216) 2026-08-20 19:47:10 +08:00
amblued
e67ec79351
fix(web): correct RTL layout behavior (#6215) 2026-08-19 21:14:51 +08:00
amblued
488b71a00a chore(sidebar): animate global navigator pill transitions
Give the home/attachments/inbox navigator one shared pill anatomy so the
active label expands and collapses as a single smooth motion: constant
px-[7px] padding with the label in a grid column animating 0fr to 1fr,
tooltips kept mounted via Base UI's disabled prop, and the scope control
as one always-mounted uncontrolled DropdownMenu that vetoes the menu and
navigates when off the scope routes. The unread badge scales in and out,
and the scope chevron rotates while its menu is open.

The tooltip anchors to a wrapper span because a disabled tooltip stamps
data-trigger-disabled on its trigger element, which Base UI's shared
floating logic would read as the menu trigger being disabled.
2026-08-19 19:35:37 +08:00
amblued
38412eb75a
fix(storage): proxy S3 attachments through authenticated routes (#6210) 2026-08-18 23:38:35 +08:00
shiva
c9324f9519
chore: add Hebrew language support (#6203)
Co-authored-by: AlloyQA Runner <runner@alloyqa.invalid>
2026-08-18 21:24:27 +08:00
johnnyjoygh
bbb23958b2 fix(editor): match tag autocomplete on path segments
Tag completion filtered candidates with a full-path prefix test, so a
nested tag was only reachable by retyping its whole ancestry: `#Mem`
offered nothing for `software/hosted/Memos`.

Rank candidates instead — full-path prefix, then path-segment start,
then any other position — and keep that order by opting out of
CodeMirror's own fuzzy filtering.

Fixes #6190
2026-08-16 22:09:04 +08:00
boojack
14d757ce1f fix(editor): preserve IME composition during content sync 2026-08-14 00:08:45 +08:00
Johnny
57bfe0a70f
feat(filter): support memo location filters (#6181) 2026-08-12 00:00:37 +08:00
Johnny
da81b6b48f
feat: persist and display client media metadata (#6180) 2026-08-11 23:47:21 +08:00
Johnny
9a928c2868
feat: insert attachment images into memo content (#6172) 2026-08-10 22:53:07 +08:00
Johnny
4e8b262d6d
refactor(memo-views): replace shortcuts with saved views (#6167) 2026-08-09 20:27:27 +08:00
Johnny
f75d49f9b6
fix(web): restore sidebar and outline behavior (#6161) 2026-08-08 08:58:07 +08:00
s4kura
e5ed6e7ec6
fix: align memo outline links with rendered headings (#6159) 2026-08-07 09:51:48 +08:00
Wally
3f567fda45
fix(web): keep share token on shared-memo attachment thumbnails (#6155) 2026-08-07 00:21:53 +08:00
johnnyjoygh
ec689c3a03 chore(sidebar): replace static mode with a library-content fallback
The rail had two navigation grammars for the same destinations: a
compact icon strip on recognized routes, and StaticNavigation — full
labeled rows — on everything else (/about, /403, /404, wildcard).
Crossing onto one of those pages rearranged the entire rail, and any
route nobody remembered to classify silently inherited the alternate
layout.

Make the frame invariant instead: header, global strip, contextual
content, footer — on every route. Pages without a specific sidebar
tenant now fall back to the default library content (the home
collection for signed-in users, explore for guests), following the
convention that error and utility pages render inside the persistent
shell rather than degrading it. The memo-detail route gets the same
fallback while the page has not yet published its descriptor, instead
of a blank scroll area.

Off the collection routes the library is display-plus-navigation, so
StatisticsView and TagsSection accept a navigationTarget: calendar and
tag clicks land on / or /explore with the filter in the query string,
which RootLayout's route-change effect would otherwise wipe.

StaticNavigation is deleted, About returns to living only in the user
menu (the showAbout prop is gone), and the guest strip now marks About
active on /about.
2026-08-07 00:04:04 +08:00
boojack
d722608947 fix(sidebar): stop the month calendar growing with the rail
Calendar cells were `aspect-square w-full`, so cell height was a pure
function of rail width. Dragging the rail from 224px to its 400px max
took the calendar block from 231px to 382px — a 65% jump that pushed
Views and Tags out of view, left a 12px numeral floating in a 50px box,
and turned the selected day into a 50x50 slab against a rail whose every
other row is 30px.

Split the cell in two: the button spans its whole column and takes the
pointer, while a chip inside it carries the fill, the ring and the today
dot, and stops growing at `maxSize`. A chip is therefore
`min(column, 30px)` — narrow rails are untouched (224px still yields
25px cells, 170px of grid) and wider ones spend the surplus on hit area
instead of height, holding the grid at 200px from 258px up.

The today dot stops detaching as a side effect: it is positioned against
a chip that no longer grows, rather than against a cell floor that
drifted 19px below the numeral at full width.
2026-08-06 22:59:21 +08:00
Johnny
abe87d9440
feat(sidebar): make the desktop rail resizable (#6148)
Signed-off-by: Johnny <johnnyjoygg@gmail.com>
2026-08-06 19:18:38 +08:00
boojack
5192732cee fix(web): keep task checkboxes controlled so check-all updates render
remark-gfm passes checked as undefined for unchecked task items, so the
Base UI Checkbox mounted uncontrolled and permanently ignored the
checked=true arriving after "Check all tasks" rewrote the memo content.
Coerce the prop to a boolean so the checkbox is always controlled.

Also drop the `${updateTime}` suffixes from memo React keys and the
comment editor cache key: a protobuf-es Timestamp stringifies to
"[object Object]", so the suffix was a constant — the keys were
effectively name-only already, and now say so honestly.

Fixes usememos/memos#6143
2026-08-06 09:09:37 +08:00
johnnyjoygh
b930b1090a refactor(sidebar): reduce tooltip noise and refine tags
- Centralize tooltip timing and limit hints to useful content.\n- Simplify tag hierarchy presentation and align compact tag rows.
2026-08-05 23:52:13 +08:00
johnnyjoygh
6fbc81337f chore(sidebar): improve view and tag controls
- expose display settings from the Views header and refine layout controls
- add explicit tag list/tree navigation with accessible expansion behavior
- cover view persistence, menu behavior, and tag tree construction
2026-08-05 23:12:49 +08:00
johnnyjoygh
d14a542002 chore(web): add static navigation for default routes
- Show auth-aware common destinations when a route has no contextual sidebar.
- Restore About as a standalone page and route all About entries to it.
2026-08-05 21:46:34 +08:00
johnnyjoygh
83eab44695 fix(web): preserve memo scope across global navigation 2026-08-05 09:32:41 +08:00
Johnny
4d2667983f
feat(web): unify navigation in a route-aware sidebar (#6144) 2026-08-05 09:05:57 +08:00
Johnny
d617f652b0
fix(markdown): support word-internal apostrophes in tags (#6135) 2026-08-02 21:08:57 +08:00
Johnny
8648b97b9e
feat(user): define username format and mention syntax (#6134) 2026-08-02 19:57:16 +08:00
Johnny
c68e3d5bf9
feat(markdown): unify tag syntax and recognition (#6132) 2026-08-02 14:46:04 +08:00
boojack
571e0a3ff6 chore: scope memo providers to authenticated routes 2026-07-30 23:42:37 +08:00
boojack
dd18002b12 perf(sse): reduce redundant connections and fanout overhead
- Share one visible-tab connection across a browser and harden retries.\n- Preframe hub events, disconnect slow clients, and reset idle heartbeats.\n- Add cross-tab, concurrency, race, and fanout benchmark coverage.
2026-07-29 21:47:54 +08:00
boojack
c4221c6dfe fix(attachments): link media to source memos
Close https://github.com/usememos/memos/issues/6120
2026-07-29 09:06:42 +08:00
boojack
6f1ff135fb chore: add global quick-create entry
Use the authenticated navigation logo to open the existing focus-mode editor and preserve the draft cursor across reopenings.
2026-07-29 08:57:04 +08:00
johnnyjoygh
9328413797 fix(ui): keep select menus above parent popovers 2026-07-27 22:05:20 +08:00
johnnyjoygh
b4fefa94d7 fix(editor): restore Windows emoji input 2026-07-27 22:05:16 +08:00
johnnyjoygh
c536434b81 test(release): cover 0.30.0 changelog promises 2026-07-26 22:21:19 +08:00
johnnyjoygh
249b331596 perf(web): reduce memo feed startup and rendering work 2026-07-20 00:15:26 +08:00
johnnyjoygh
6c1055f483 perf(web): deduplicate explore data requests
Share canonical user and memo query caches across creator, reaction, comment, mention, and relation lookups. Reuse list data for relation snippets and cover overlapping queries with regression tests.
2026-07-18 23:25:59 +08:00
johnnyjoygh
88c6ee8ebc perf(web): reduce demo bandwidth usage
- Cache fingerprinted frontend assets for one month.
- Load media, rich renderers, dialogs, and editors only when needed.
- Simplify seeded demo content and cover deferred-loading behavior.
2026-07-18 22:06:14 +08:00
johnnyjoygh
0bfeb91d50 fix(api): show clean RPC error messages 2026-07-18 11:20:15 +08:00
johnnyjoygh
84776cc106 fix(api): align resource IDs with AIP conventions
Validate new user-provided IDs using the AIP-122 format while retaining legacy UID compatibility. Correct resource annotations and canonical names returned by user stats.
2026-07-18 11:12:28 +08:00
boojack
e497895bf3 feat(web): restore scroll position across navigation 2026-07-16 22:31:00 +08:00
boojack
df1967df91 fix(editor): restore CodeMirror default spacing
Remove the zero-padding line override that replaced CodeMirror's built-in horizontal spacing and caused the editor content regression reported in #6093.

Disable completion icons through CodeMirror configuration, preserve placeholder and dark-theme contrast, and remove redundant editor style overrides.

Fixes #6093
2026-07-14 21:35:55 +08:00
boojack
8d9849e13f chore: redesign about page as identity hero
Rebuild /about around an identity hero: instance branding with custom
profile fallbacks, a demo badge, and version/commit chips linked to the
GitHub release and commit. Dev builds show a plain version chip and hide
the unknown-commit chip.

Project links become an annotated directory (homepage, docs, API docs,
GitHub repo), followed by an MIT license note. The bird sprite gallery
moves out of the page, and the version/commit block leaves the settings
sidebar now that /about owns build info.
2026-07-14 20:54:29 +08:00
boojack
1e91cfba9d fix(auth): stabilize SSO option loading 2026-07-14 20:06:54 +08:00
boojack
9c3bd44a1b chore(web): migrate UI primitives to Base UI 2026-07-14 09:06:40 +08:00
boojack
564da949cb chore(auth): redesign sign-in and sign-up pages with panel layout
Rebuild the auth pages around a shared AuthPageLayout card with a
three-tier guidance hierarchy: the form (or provider buttons) on top,
a centered switch sentence below it, and a quiet explore band anchored
to the card foot on public instances.

- add AuthPageLayout (brand row, chip, empty state, link prompt,
  explore band gated by instance URL with hideExplore opt-out)
- extract CredentialFields shared by sign-in and sign-up forms
- extract IdentityProviderButtons; fetch the provider list via a
  cached TanStack Query hook with an enabled flag
- cover every instance config: SSO-only, password-only, registrations
  closed, private instance, nothing enabled, first-run setup, admin
- promote /auth/signup, /auth/admin, /auth/callback to ROUTES and add
  appendSearchParams for param-preserving auth links
- move the explore link out of AuthFooter (selectors only now)
- refresh en and zh-Hans auth strings; drop dead keys
2026-07-13 19:40:31 +08:00
boojack
a9fcd459f6 chore(demo): harden SSO-only demo experience 2026-07-13 00:31:15 +08:00
boojack
42ad4105c1 fix(editor): align CodeMirror markdown event handling
- intercept file paste and drop before CodeMirror inserts file text
- reconfigure localized placeholders without remounting the editor
- add regression coverage and document the CodeMirror review
2026-07-10 18:59:33 +08:00
boojack
a9ac008a68 fix(editor): let CodeMirror own caret layout
Keep caret and placeholder behavior on CodeMirror's standard extensions, and move height and scrolling to the editor elements so empty space stays interactive across browsers.\n\n- disable unused multi-cursor selection\n- upgrade CodeMirror state and view patches
2026-07-10 08:51:16 +08:00
boojack
730c24592f fix(web): stabilize multi-column memo layout 2026-07-09 20:56:35 +08:00
johnnyjoygh
620db61f7c chore(web): unify compact truncation into a single ClampedSection
Compact cards previously had two truncation systems taped together: a
text-only clamp inside MemoContent (144px, no re-measure on image load,
fade tinted to the wrong surface) and a whole-tile cap in ColumnGrid
(hard clip mid-image, no affordance), later joined by a content-shape
rule choosing an owner per card — which could still stack two Show-more
buttons and silently broke footnote navigation in clamped cards.

Now there is exactly one mechanism: ClampedSection measures its content
and folds anything taller than 420px to a 360px preview with a fade and
a Show more/less toggle. MemoBody wraps the whole body in it (reactions
stay outside, never hidden); ColumnGrid is pure packing again and never
clips; MemoContent is a stateless renderer whose `compact` prop only
informs footnote-link behavior; MemoPreview uses a static CSS bound in
place of its previously inert toggle.

Deltas: text-only compact previews grow from ~6 rows to the same 360px
image cards get, and pinned memos clamp like any card (pinned means
ordering and a badge, not size).
2026-07-07 21:01:19 +08:00