Commit Graph

17763 Commits

Author SHA1 Message Date
scheinriese
cb02c2eb66 enhance(icon-picker): clarify "Clear customized icons" tooltip
Replace the single-line tooltip with the two-line pattern used elsewhere
in the icon picker (color picker recents lane, contrast indicator):

  Reset to this default
  Replaces 4 custom icons

The previous copy ("Clear N customized icons — these rows will inherit
from this default again") repeated the button label, used an em dash,
and tied the framing to table-row terminology that doesn't translate
to other views. The new copy puts the outcome verb on the bold line
("Reset to this default", matching the codebase's :keymap/reset-to-default
key) and uses the muted line for scope ("Replaces N custom icons"),
keeping the subject on the icons themselves so it reads cleanly across
table, list, and gallery views.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 16:43:38 +02:00
scheinriese
9822f5307f enhance(icon-picker): unify one-icon-per-row + 20x20 slot across entity pickers
Three coordinated fixes to align the bracket popover and property-value
combobox with CMD-K's existing single-icon pattern:

1. De-dup: drop the inline `block-title-with-icon` icon prepend on both
   surfaces; titles render alone. Previously every result row that had a
   committed `:logseq.property/icon` rendered the icon twice — once in
   the leading slot via `get-node-icon-cp` and again inlined into the
   title. CMD-K's `list_item.cljs:114-122` already documented this
   exact de-dup; the other two surfaces never got it.

2. Slot: pin the icon column to a fixed 20×20 box
   (`w-5 h-5 flex items-center justify-center shrink-0`) so all titles
   start at the same x-axis regardless of whether the row's icon is a
   14px tabler glyph or a 20px avatar. CMD-K's
   `list_item.cljs:98-109` is the reference pattern.

3. Guard fix in property/value.cljs: the leading-icon `when-not` used
   to suppress for `:logseq.property/classes`-having properties
   (Attendees, Collaborators, etc.) because the old inline title path
   prepended an icon. With (1) removing that path, the suppression now
   leaves the slot empty. Narrow the guard to just `:class`/`:property`
   property-types (which are intentionally iconless — the entities
   being picked ARE the classes).

CMD-K is untouched; it was already correct.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 16:30:46 +02:00
scheinriese
091c6b347d enhance(icon-picker): clamp emoji glyph and optically lift page-ref icons
Two related polish passes on the inline icon slot:

- Emoji glyphs in page-ref and left-sidebar contexts now render at
  font-size 16 (was 20). emoji-mart's <em-emoji size="N"> only sets
  font-size on its inner spans, and native emoji fonts produce a
  bounding box ~32% taller than font-size — so size=20 visually
  rendered at ~26.5px and bled into the row below in the left
  sidebar. Clamping to 16px lands the glyph at ~21px, fitting the
  20x20 slot. Both `em-emoji` and `em-emoji span` selectors are
  load-bearing because emoji-mart's inline font-size on the inner
  span wins over !important on the ancestor — same pattern as the
  customize-band compact state at icon.css:2214.

- Pull all inline page-ref icons up 1px via translateY. vertical-align:
  middle centers icons on x-height/2, but readers compare against
  cap-height/2 (~2px higher in Inter at body size), so the
  geometric center reads as a sag. translateY decouples optical
  correction from layout flow.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 15:40:19 +02:00
scheinriese
6687e4435f fix(icon-picker): render avatar/image page-icons on cold reload
On a fresh session, page entities carry icon metadata (asset-uuid)
before their referenced asset blocks have transacted into the
main-thread DataScript DB. The render bodies of avatar-image-cp /
image-icon-cp were gating the loaded blob URL on
(db/entity [:block/uuid uuid]) — which returned nil during this
hydration window, flipping asset-missing? true and masking a working
URL with the image-error / initials fallback. The workaround was to
visit #Asset, whose table query hydrated the blocks via
db.async/<get-block; once the block landed, asset-missing? cleared
and the already-loaded URL became visible everywhere.

Drop the entity-presence gate. Render is now driven purely by load
outcome (URL set → image, *error → fallback, else → placeholder).
Retraction is handled in :did-update by watching the per-tx
:deleted-ids set: when the asset's uuid appears there, *url is
cleared and a fresh load is fired; the outliner pipeline has
deleted the file, so the load fails into *error and the fallback
renders.

The Avatar :key now toggles on URL presence (was asset-missing?)
to keep Radix's image-loading state machine fresh across
load/clear transitions.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 15:05:04 +02:00
scheinriese
74bf1a089c enhance(icon-picker): unify inline page-ref icons in 20x20 slot
Tabler/text/emoji glyphs and avatar/image icons all share the same
20x20 visual slot in [[page-refs]] now, matching the left-sidebar's
.page-icon dimensions. Photo icons (avatar, image) fill the slot;
non-photo glyphs render at 16px centered with 2px breathing room.

Drop the legacy .page-ref svg { width: 16px } clamp that overrode
the per-icon size attributes, drop the 1lh height/line-height clamp
on the wrappers that resolved to 16px and capped emoji glyphs, and
opt the icon wrappers out of the .block-content-wrapper svg { 18px }
sledgehammer. The cljs side simply defaults inline icon-size to 20
(was nil) and lets heading contexts override via heading-icon-size.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 15:04:53 +02:00
scheinriese
c438798984 Merge origin/master into feat/unified-icon-picker
Brings 1,081 master commits forward. 19 file-level conflicts resolved.
Major master-side changes integrated:

* Migrate yarn → pnpm (package.json + pnpm-lock.yaml)
* Closure compiler upgrade → requires Java 21 runtime
* Recycle-bin properties + delete embedding properties (migrations 65.24/65.25)
* block-renderer plugin replacement infrastructure (block.cljs ~3600-4150)
* Enhanced breadcrumb display (commit 51f0ce261c)
* Heading icon alignment + menu active state (755840c474)
* Scoped choice + sanitize-property-values-for-display in property/config
* Sub-menu Set-icon context menu items
* TooltipArrow / electron handler refactor

Migration renumber: our 65.24-29 → 65.26-31 (after master's 65.24-25).
Schema version bumped to 65.31.

Post-merge fixes (build cleanliness):
- hsl2hex: re-add to util.cljc (master removed; colors.cljs still uses it)
- <unlink-asset: re-add to handler/assets.cljs (master removed; outliner
  pipeline's asset-file unlink still uses it)
- en.edn: dedupe 25 identical keys that survived the conflict resolution
- icon.cljs: drop the duplicate get-used-items / add-used-item! that
  master added (HEAD has v2-storage versions further down with type-aware
  dedup + renderable filtering — preferred)
- block.cljs: restore the inline page-ref avatar size default for
  non-heading contexts (master commit 755840c474 forced 14px via
  ; revert so photo-icons keep their 20px default
  while headings still get heading-aware sizing)
- left_sidebar.cljs: keep master's left-sidebar-resized-at as a real
  binding (not _-prefixed) since the page-title-content fn uses it

Smoke-tested: theme toggle, icon picker, asset delete, page-title
icons, sidebar refs. Outstanding visual issues from master's CSS
changes (icon alignment drift in inline refs, breadcrumb [[]] raw
brackets) tracked as separate follow-up commits.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-13 17:54:31 +02:00
Tienson Qin
9318205c32 fix: improve graph view interactions 2026-05-13 21:38:19 +08:00
rcmerci
3f5b52cc07 feat(cli): unify backup impl for desktop and cli 2026-05-13 16:27:00 +08:00
rcmerci
51c9c2970d fix lint 2026-05-13 13:51:53 +08:00
rcmerci
d12beff383 feat(graph-view): add task zoom-in view 2026-05-13 13:40:55 +08:00
Tienson Qin
cf24914e6c fix: dedupe raw node choices 2026-05-13 12:04:23 +08:00
Tienson Qin
b2fc00b31b fix: handle sidebar asset drops 2026-05-13 12:03:29 +08:00
megayu
e097ec8cd8 fix(fsrs): cloze macro with superscript/subscript markup and render improvements 2026-05-13 12:00:24 +08:00
Tienson Qin
58098303e0 fix: stop cmdk sidebar shortcut propagation 2026-05-13 11:42:28 +08:00
Tienson Qin
c8d00f5a7b fix: dedupe node property choices 2026-05-13 11:35:13 +08:00
scheinriese
942a87fae6 fix: theme-toggle re-render + text icon contrast
Two related fixes converging on the same root issue: render-time JS
reads of CSS variables (via `colors/read-bg-var` / `getComputedStyle`)
produce hex values that go stale or out of contrast across themes.

1) Global theme-toggle reactivity (theme.cljs)

   The earlier pointwise `(state/sub :ui/theme)` subscriptions in
   `avatar-image-cp`, `get-node-icon-cp`, and `icon-picker-trigger-icon`
   covered the high-traffic surfaces but left picker-internal tiles
   and future icon-rendering components vulnerable to the same
   staleness. Pivot to one `(ui-handler/re-render-root!)` call inside
   theme.cljs's existing data-theme `use-effect!`. Fires after the
   DOM attribute is stamped on <html>, marks every reactive component
   dirty, and lets the next reconciliation re-sample fresh CSS
   variables. Pattern-consistent with the language-change handler at
   settings.cljs:298. Theme toggle is a rare user-initiated action;
   the one-frame reconciliation cost is imperceptible. Removes the
   three pointwise subs as redundant.

2) Text icon contrast (icon.cljs text branch)

   The text-icon SVG previously baked the raw user-picked hex into
   `:fill`, which won the cascade over the surrounding `color?`
   wrapper's contrast-adjusted `:style {:color …}`. Result: a
   `#000000` text-icon pick rendered as invisible black on a dark
   theme even though the wrapper had computed a readable shade right
   above it in the tree. Same `colors/adjust-for-contrast` path
   tabler icons have always used — they inherit via
   `stroke="currentColor"`; text icons just need to opt into the
   same inheritance via `:fill "currentColor"`. One-line behavioral
   change; the `text-color` let-binding is no longer needed.

Net diff: theme.cljs +12 / icon.cljs -20.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 23:29:29 +02:00
scheinriese
290ebf6d55 fix: page-title avatar updates on theme toggle
Extends the previous theme-toggle fix to cover the page-title render
path. `block.cljs:3223` (page-title) routes through `icon-picker` →
`icon-picker-trigger-icon` → `(icon …)`, bypassing `get-node-icon-cp`
entirely. The earlier `(state/sub :ui/theme)` on `get-node-icon-cp`
covered the sidebar, cmdk, breadcrumb, and inline page references,
but the page-title's reactive boundary is `icon-picker-trigger-icon`
— which only subscribed to `:ui/icon-hover-preview`, not theme.
Result: page-title avatars with user-picked custom hex colors (which
get contrast-adjusted differently per theme via `adjust-for-contrast`)
stayed frozen with the previous theme's tone until something else
triggered a re-render.

One-line patch: add `_theme (state/sub :ui/theme)` to the trigger's
let block. The subscribed value is discarded; the subscription is
just there to tick Rum's dependency graph when the user hits `t t`.

Known follow-up: same pattern exists in other less-trafficked render
paths (avatar-cp picker-tile, custom-tab-cp preview, asset-picker
customize-band, and a handful of external callers in property/value,
property, property/config, views). They'll exhibit the same staleness
but only when visible — most are picker-internal (rare during theme
toggle). Best addressed in a focused refactor that extracts the
avatar-only and colored-icon branches of `icon` into reactive
subcomponents, killing the bug class at the right abstraction layer.
Filed for after this PR lands.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 20:32:06 +02:00
Tienson Qin
00964157b1 dev: run lint-and-test in parallel
run cljs tests in parallel too
2026-05-12 23:36:42 +08:00
scheinriese
c540a92ffa fix: avatar fallback colors update instantly on theme toggle
The avatar fallback hex (background + text) is computed in JS by
`avatar-fallback-style` → `colors/read-bg-var` → `getComputedStyle`,
so its output is a snapshot of the current theme's CSS variables at
render time. The result is written into the element's inline style.
On `tt` (theme toggle) the snapshot stayed frozen until something
unrelated triggered a re-render, leaving avatars carrying the wrong
theme's tone — too bright in dark mode, too dark in light mode.

Two coordinated changes:

1. state/set-theme-mode! now stamps `data-theme` + body classes
   synchronously *before* mutating `:ui/theme`. The previous flow
   left the DOM update inside theme.cljs's `use-effect!`, which
   fires AFTER React's render commit — so subscribers re-rendering
   on the state change still read the old theme's CSS vars. The
   theme.cljs effect remains as an idempotent safety net plus the
   side effects (plugin hook, custom-theme application).

2. `avatar-image-cp` and `get-node-icon-cp` subscribe to `:ui/theme`.
   The subscribed value is discarded — the subscription's job is to
   tick Rum's dependency graph so the component re-renders on toggle
   and recomputes `avatar-fallback-style` against the (now fresh)
   CSS variables. Combined with the synchronous DOM update above,
   the read-bg-var snapshot is correct on the first render after
   toggle, no second tick required.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 17:31:42 +02:00
scheinriese
e30384d6c5 feat: redesign asset-picker customize banner — single click target
Resting state restructured for clearer affordance + better
discoverability:

- Avatar tile demoted from <button> to <div aria-hidden> — it's a
  live preview, not a control. Removes the redundant second toggle.
- Banner demoted from <button> to <div aria-hidden>. The chevron-down
  is gone — it was miscueing as a <select>-style dropdown, and the
  morph-in-place transition meant it never lived long enough to read
  as a disclosure rotation anyway.
- New invisible <button.cb-row-trigger> overlays the resting row
  edge-to-edge (covering the zone's 18px padding) so the entire
  surface is one accessible click target. Mounted only when collapsed
  (`when-not expanded?`) — when expanded, the dropdown chips inside
  `.cb-rows` are unparented so there's no nested-interactive risk.
- aria-label composes scope + descriptor + verb so screen readers
  announce the current state on focus ("Custom · Image, circle.
  Customize avatar."). aria-controls links to the rows panel id;
  panel gets role="region" + aria-label for the disclosure pair.
- Right-side "Edit" text label replaces the chevron — muted gray-09
  at rest, brightens to gray-12 when the row is hovered.

Zone background swapped to solid theme tokens (no alpha veil):
- Rest: var(--lx-gray-01) — most recessed surface in both themes
- Hover: var(--lx-gray-03) — two-step lift via :has(.cb-row-trigger:hover)
- 120ms cubic-bezier(0.32, 0.72, 0, 1) on background-color only

Solid colors compose more reliably across light + dark themes than
stacked alphas, and avoid the content-clipping issue that would
happen if the trigger overlay carried a near-opaque background of
its own. The :has() pattern means the hover paints on the same
element that already backs the content, so the avatar / banner-text
/ Edit label naturally show through.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 17:11:12 +02:00
scheinriese
50b3cdfbc9 fix: asset deletion lifecycle + PR-review cleanup
Asset deletion (three independent failures stacked):
- Unlink file on asset-block retract via the existing <unlink-asset
  helper at handler/assets.cljs (modules/outliner/pipeline.cljs:74-80).
  The block was commented out; deleted-assets was computed but never
  consumed, so files leaked indefinitely.
- Reactive existence check in image-icon-cp / avatar-image-cp via
  state/sub :db/latest-transacted-entity-uuids. model/sub-block can't
  drive this — worker/react.cljs:63-67 calls (d/entity db-after id),
  which returns nil for retracted entities, so [::block id] is never
  emitted in affected-keys and subscriptions never fire on deletion.
- Force-remount Avatar root via :key on asset-missing? toggle. Radix's
  Avatar primitive tracks image-loading status in context; once
  AvatarImage reported 'loaded', the status sticks even after the image
  unmounts, so AvatarFallback stays hidden.

PR-review cleanup (no behavior change):
- Strip 17+ [DEBUG ...] console statements across icon, block, views,
  two editor handlers, and assets.
- Close content.cljs preview gap: pass :preview-target-db-id +
  :property to icon-search so the block bullet observes hover preview
  consistently with every other surface.
- Scope-correct close-fallback-menu! — use dissoc-icon-preview-field!
  instead of unconditional state/set-state! nil.
- Delete dead code: heal-dangling-asset-icon (raced lazy hydrate),
  asset-uuid->entity, rgb-string->hex, name->hex (named + css),
  format-pairs.
- Hoist icon-grid-cols / custom-tab-cols magic numbers (9 sites).
- Search inputs: add :type "search" and :aria-label (both picker +
  asset-picker).
- Replace hardcoded #6B7280 with (colors/variable :gray :09).
- Reconcile recents-cap doc drift in storage.cljc + recents-lane
  docstring (cap lives in handler/icon-color/max-recents).
- Remove orphan-asset cleanup from outliner/core save-block-inner. Root
  cause (migration 65.27's :url ref-type) is fixed by 65.28/65.29; all
  asset writers are atomic (save-image-asset!, new-asset-block,
  build-new-asset), and the cleanup ran on every save with a silent-
  retract failure mode.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 16:28:06 +02:00
Tienson Qin
1b9a1999ac fix: block selection while scrolling 2026-05-12 21:38:21 +08:00
Tienson Qin
1c061cc871 fix: align heading bullets 2026-05-12 20:28:38 +08:00
scheinriese
d960773ef5 fix: declare derive-abbreviated for forward reference
`get-node-icon` (icon.cljs:783) references `derive-abbreviated`,
defined later at line 2235 — added to the existing `declare` for
the other derive helpers to silence the `:undeclared-var` warning.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 14:17:41 +02:00
Tienson Qin
96bf1f074b fix: align dark right sidebar header 2026-05-12 18:50:30 +08:00
Tienson Qin
9c77efda04 [codex] fix import of auto heading pre-blocks (#12612)
* fix(import): handle auto heading pre-blocks (db-test#863, db-test#864)

* fix(import): clean missing OG block refs (db-test#863, db-test#864)

* Revert "fix(import): handle auto heading pre-blocks (db-test#863, db-test#864)"

This reverts commit 08d586a2d8.

* fix(import): propagate missing block ref cleanup

---------

Co-authored-by: Mega Yu <yuhg2310@gmail.com>
2026-05-12 18:07:07 +08:00
Charlie
7194e54925 fix(ux): incorrect reaction for the order list sibling blocks (#12617)
* fix(ux): incorrect reaction for the order list sibling blocks

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix: lint

* chore(test): add tests for order list type and sibling block interactions

* fix: refresh nested ordered lists

* fix: split affected query keys helper

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Tienson Qin <tiensonqin@gmail.com>
2026-05-12 18:06:12 +08:00
Mega Yu
4c98cc6b51 fix: clear stale title when converting code block 2026-05-12 17:03:01 +08:00
megayu
7cb9144422 enhance(editor): support dollar autopair for markdown math (#12618)
* feat(editor): add support for dollar sign in autopair feature

* fix(editor): handle dollar autopair for markdown math

* feat(help): add inline math example

* fix(editor): double dollar autopair behavior
2026-05-12 16:09:06 +08:00
Grandroot
e63bc56750 Merge pull request #12470 2026-05-12 13:35:25 +08:00
Tienson Qin
3ae4d92adc fix: invalid data from old graphs
fixes https://github.com/logseq/db-test/issues/795
2026-05-12 10:52:45 +08:00
ivan-danilov
7c4111b248 Added prettify-url? option to QuickCapture (#12409)
Co-authored-by: Tienson Qin <tiensonqin@gmail.com>
2026-05-12 00:16:03 +08:00
Kidy Lee
be34b7904a feat: add "Always on Top" in window menu. 2026-05-12 00:00:14 +08:00
IderAghbal
ba3ff5e5a5 feat: add support for avif and cr2 images (#11997) 2026-05-11 23:57:04 +08:00
megayu
755840c474 fix: heading icon alignment and menu active state
1. Derive the effective heading level consistently for auto headings, and reuse it for block icons, page-ref icons, and heading layout attributes.
2. Align heading bullets and page-ref icons so h3-h6 and auto heading changes no longer shift vertically.
3. Show the active heading and background color in the single-block context menu.
2026-05-11 23:26:46 +08:00
Tienson Qin
634ba33b3e fix: render markdown headings in quote blocks (#12611)
Preserve parsed Markdown heading levels for display-type blocks so quote blocks render '# heading' consistently with explicit heading properties.

Adds an app E2E regression test covering both quote heading creation paths.

Fixes logseq/db-test#599
2026-05-11 19:25:20 +08:00
Tienson Qin
e03e019a19 fix: export sqlite db as binary 2026-05-11 18:18:33 +08:00
megayu
1884911cc8 fix(exporter): preserve mixed quote blocks during DB export (#12610) 2026-05-11 18:08:14 +08:00
charlie
5726ecaa21 enhance(plugin): add thumbnail icon handling for plugin items 2026-05-11 16:32:04 +08:00
Tienson Qin
0b26f16422 fix: can't export client ops db on web 2026-05-11 16:15:22 +08:00
Tienson Qin
c32428702f fix: wrong datoms format when fixing invalid data 2026-05-11 14:45:39 +08:00
Charlie
cba65ee479 enhance(plugins): improve legacy storage apis (#12605) 2026-05-11 10:26:46 +08:00
Tienson Qin
1f9c017998 refactor: graph view V2 (#12604)
* feat(graph): rebuild global graph view with Pixi

Summary:

- Replace /graph route with a new Pixi-based global graph implementation in ClojureScript.

- Build graph data from db-worker only (no UI DB writeback) and default to tags+objects with a toggle for all pages.

- Add fast scene rendering for large graphs with indexed hit-testing, zoom/pan, node dragging, and click/shift+click node actions.

- Introduce dynamic label management (zoom hysteresis, viewport culling, overlap control, hover-emphasis) and fix hook lifecycle cleanup issues.

- Refresh graph UI styling to full-container layout, dot-first settings control, and Logseq button usage.

- Add/expand tests for global graph modes, node actions, and Pixi label/visibility logic.

- Update graph-related dependencies/lockfile as part of the new implementation.

* enhance(graph): improve drag exploration and label visibility

- Dragging a node now pulls connected nodes with depth-based weights for easier structure exploration.

- Labels are rendered only for currently visible node dots; hover no longer reveals hidden-node titles.

- Hovered node title remains promoted in foreground while respecting visibility constraints.

- Add logic/test coverage for connected drag weights and updated label text behavior.

* enhance(graph): use d3 force layout

Summary:
- Move Graph V2 node layout into graph pixi logic.
- Use d3-force link, charge, center, collision, and y forces instead of the hand-written ring/spiral layout.
- Add coverage that linked graph nodes settle closer than an unlinked island.

Dependency:
- Verified d3-force is already latest at 3.0.0.

Tests:
- bb dev:test -v frontend.extensions.graph-pixi-logic-test
- bb dev:test -v frontend.common.graph-view-v2-test
- pnpm install --frozen-lockfile --lockfile-only

* fix: graph view interactions

* enhance: speed up large graph view

* enhance: speed up tags graph

* enhance: speed up tags layout

* enhance: bound tags force layout

* enhance: speed up graph opening

* fix: keep graph objects visible when zoomed out

* fix: resize graph with sidebars

* enhance: select graph nodes

* fix: refine graph selection controls

* support icons

* fix: sharpen graph node icons

* enhance(graph): update graph v2 settings

* fix: re-render graph when theme changes

* enhance(graph): remove legacy graph view

* fix: typo

* fix: improve graph view

* test: cover graph view improvements

* enhance: improve graph view

* test: cover graph time travel behavior

* enhance: refine graph time travel

* test: cover graph layout controls

* enhance: add graph layout controls

* test: cover graph highlight controls

* fix: refine graph highlight controls

* test: cover edge label alignment

* fix: align graph edge labels

* test: keep graph lines visible on highlight

* fix: keep graph lines visible on highlight

* fix: show graph lines by default

* test: filter graph lines on highlight

* fix: filter graph lines on highlight

* test: keep graph depth incremental

* fix: update graph depth incrementally

* test: cover graph label link occlusion

* fix: occlude graph links behind labels

* test: cover graph edge visibility defaults

* fix: smooth graph edges on highlight

* test: cover graph arrow toggle

* fix: toggle graph arrows

* test: cover reciprocal graph edge offsets

* fix: separate reciprocal graph edges

* test: cover duplicate graph edge runs

* fix: dedupe graph edge render runs

* test: cover graph tag clusters

* enhance: cluster graph tags layout

* test: cover graph tag cluster colors

* fix: color graph tag clusters by title

* test: cover subdued graph node colors

* fix: mute graph node colors

* feat: grid layout

* add more options

* enhance(graph): drill into tags on zoom

* map-like navigation

* mod+click to preview node

* edge enhancements

* more tweaks

* fix: block preview

* enhance(graph): speed up large graph layout

* fix: improve graph mode switching ux

* fix: speed up graph view switching

* fix: optimize large all-pages graph render

* fix: speed up graph data build

* fix: collapse graph tag settings on mode switch

* enhance: refine graph panel width

* fix: improve graph zoom performance

* fix: satisfy graph lint

* fix: open graph nodes by uuid

---------

Co-authored-by: rcmerci <rcmerci@gmail.com>
2026-05-10 23:26:32 +08:00
rcmerci
a3e4d8a902 feat(cli): add qmd query (4) 2026-05-10 15:48:26 +08:00
rcmerci
b06eaa48a9 feat(cli): add qmd query (3) 2026-05-10 14:58:47 +08:00
rcmerci
5ec5b258c9 feat(cli): add qmd query (2) 2026-05-10 14:53:55 +08:00
rcmerci
635d4b7a73 feat(cli): add qmd query (1) 2026-05-10 14:53:55 +08:00
rcmerci
9288c1de7e enhance: markdown-mirror blocks embed id in comment 2026-05-10 14:53:54 +08:00
Tienson Qin
198e6975e1 fix: markdown mirror rendering (#12607)
* fix: markdown mirror rendering

* fix: keep markdown mirror content lines
2026-05-10 14:24:14 +08:00
megayu
0fb9c20d30 Support fullwidth left square bracket input with IME auto-completion (#12606)
* feat(editor): normalize ime-producted fullwidth ref input

* fix(editor): handle non-enter processed state in keyup handler
2026-05-10 11:53:25 +08:00