941 Commits

Author SHA1 Message Date
Julien Calixte
f89c2fa776 style: just changed the view latest button
All checks were successful
CI / verify (push) Successful in 2m7s
2026-07-12 12:36:54 +02:00
Julien Calixte
c21619c53a feat(notes): drop the redundant Close button from share popup
All checks were successful
CI / verify (push) Successful in 1m6s
The backdrop already dismisses the dialog on outside click.
2026-07-11 12:57:44 +02:00
Julien Calixte
b34b5851cd fix(notes): color the share trigger icon with accent
Scoped styles in HeaderNote don't cross into the ShareNote child
component, so text-base-content painted the icon white/black instead
of matching the other header icons.
2026-07-11 12:57:41 +02:00
Julien Calixte
9581dc88aa fix(notes): don't save empty content over a note that hasn't loaded
All checks were successful
CI / verify (push) Successful in 1m9s
Entering and exiting edit mode while a note was still loading (or after a
failed fetch) triggered a save of the empty placeholder, clobbering the
real file on GitHub with an empty commit. Gate the dirty check, performSave,
and the edit button on a loaded baseline.
2026-07-11 12:51:27 +02:00
Julien Calixte
40b0af6b01 style(welcome): tighten landing copy and reduce em-dash use
All checks were successful
CI / verify (push) Successful in 1m7s
Rework the lede parenthetical and thin the calm/quiet/pool
metaphor where it doubled up on itself, to soften AI-writing tells.
2026-07-11 12:21:15 +02:00
Julien Calixte
2592b19c8f docs: require Tabler icons for all icons
All checks were successful
CI / verify (push) Successful in 1m7s
2026-07-11 12:12:33 +02:00
Julien Calixte
99edff828a feat(notes): use Tabler pin/repeat icons in the share popup
Replace the 📌/🔄 emoji with inline Tabler SVGs colored via --color-accent
to match the note-header icons, and reword the always-latest description so
the two options no longer share the same em-dash phrasing.
2026-07-11 12:12:30 +02:00
Julien Calixte
b720759c89 fix(macroplan): pack grid rows to content, don't stretch to fill
All checks were successful
CI / verify (push) Successful in 1m9s
The mobile 100svh note height cascades into the grid and stretched the
auto row tracks; align-content: start keeps rows at their content height.
2026-07-11 11:13:29 +02:00
Julien Calixte
a88d0dbac7 feat(notes): share an always-latest link, not just a snapshot
Some checks failed
CI / verify (push) Has been cancelled
The Share button now offers two links: the pinned snapshot (default) and
an "always latest" link that carries note paths in `?liveNotes` instead of
blob shas. On open they resolve to the current shas against the HEAD file
list and the URL is rewritten to the ordinary pinned form, so freshness,
editing and the snapshot banner keep working unchanged.
2026-07-11 11:11:51 +02:00
Julien Calixte
70fbe5156f fix(notes): apply shikiji dark palette in dark theme
All checks were successful
CI / verify (push) Successful in 1m4s
Shikiji emits the dark colors as --shiki-dark* inline vars but the
activation CSS was missing, so code blocks kept the vitesse-light
white background and the base-content line numbers were white-on-white.
2026-07-08 00:40:40 +02:00
Julien Calixte
049ce01ab5 feat(notes): scroll to the last stacked note on page load
All checks were successful
CI / verify (push) Successful in 1m5s
Shared links with stackedNotes landed on the readme, forcing readers to
scroll past every note to reach the one that matters — especially long
on mobile where notes stack vertically.
2026-07-08 00:30:56 +02:00
Julien Calixte
f9906cba30 feat(notes): highlight rust code blocks and .rs file views
All checks were successful
CI / verify (push) Successful in 1m7s
2026-07-08 00:12:17 +02:00
Julien Calixte
1b6c7542d7 feat(notes): render macroplan code blocks as a delivery plan grid
All checks were successful
CI / verify (push) Successful in 2m9s
Follows the tikz pattern: the fence emits a base64 placeholder, then
the post-render hook lazily imports the parser and grid (separate
chunks) and mounts the grid only when a placeholder exists. Mono font
forced on the block because the flag-stacking math assumes Fira Code.
2026-07-08 00:01:21 +02:00
Julien Calixte
70f9a6b718 feat(macroplan): vendor plan model and grid from the macroplan app
Copied verbatim (imports resorted) from jclab/macroplan so future
upstream syncs stay copy-paste; extraction to a shared package is
deferred until drift hurts.
2026-07-08 00:01:12 +02:00
Julien Calixte
5386fa66ea feat(notes): show line numbers on non-markdown file views
All checks were successful
CI / verify (push) Successful in 2m8s
CSS counters on the per-line spans, scoped to .code-file so fenced
blocks inside notes stay untouched. The gutter width adapts to the
file's line count and numbers are excluded from text selection.
2026-07-03 16:57:09 +02:00
Julien Calixte
84a252e926 feat(notes): swap heading and paragraph fonts with a button
All checks were successful
CI / verify (push) Successful in 1m7s
Replace the heading/paragraph toggle with the intended UX: keep both font
dropdowns visible and add a button that exchanges the two fonts via a new
swapFonts store action.
2026-06-30 00:47:10 +02:00
Julien Calixte
30eadaf21b feat(notes): toggle one font picker between heading and paragraph
All checks were successful
CI / verify (push) Successful in 1m4s
Replace the two side-by-side font dropdowns with a single picker plus a
small h/p switch that flips which font it edits, keeping the modal compact.
2026-06-30 00:42:10 +02:00
Julien Calixte
4104e138c1 refactor(notes): rename title font to heading font
These fonts apply to markdown headings (h1-h6), so "heading" is more
accurate than "title". Renames the chosen*Font field, store action, and
the --heading-font-family CSS variable.

Keeps backward compatibility: .remanso.json still honors the legacy `t`
key (alongside the new `h`), and a saved `chosenTitleFont` in
localStorage is migrated on load so existing preferences survive.
2026-06-30 00:41:54 +02:00
Julien Calixte
b8c9d07930 feat(notes): auto-merge non-overlapping edits on conflict
All checks were successful
CI / verify (push) Successful in 1m13s
When a save hits a GitHub conflict, try a three-way merge first: if our
edits and the remote ones don't overlap, commit the result silently with
a tailored toast. Only genuinely overlapping edits open the conflict
modal. Adds an optional successMessage override to updateFile.
2026-06-30 00:27:07 +02:00
Julien Calixte
cb22c755df feat(notes): resolve base and remote sources for merge
resolveMergeSources reads the edited-from snapshot as the merge base
(its own immutable cache entry, never the path pointer) and the current
remote blob, returning the decoded text a three-way merge needs.
2026-06-30 00:27:03 +02:00
Julien Calixte
3a528c63e0 feat(notes): add line-level three-way merge util
Wraps node-diff3 to merge two edits derived from a common ancestor.
Conservative by design: edits to immediately-adjacent lines are
reported as conflicts so the caller can fall back to manual resolution
rather than risk a wrong auto-merge.
2026-06-30 00:26:59 +02:00
Julien Calixte
c2764deb49 chore(deps): add node-diff3 for three-way merge 2026-06-30 00:26:54 +02:00
Julien Calixte
57ef4a9e50 style(notes): constrain public note list to a centered column
All checks were successful
CI / verify (push) Successful in 2m4s
Full-bleed rows flung the author/date meta to the far edge on wide
screens. Cap the list and tabs to a 42rem centered column, stack the
meta tight under the title, and drop the button padding on titles.
2026-06-29 21:38:43 +02:00
Julien Calixte
9d27aa024f feat(notes): banner when viewing an older shared version
All checks were successful
CI / verify (push) Successful in 1m3s
Cache the note path on each snapshot so an old shared sha can find its
current version, and show a calm "older shared version — View latest"
banner. The exact snapshot is shown as-is; the banner only offers a jump
to the latest, never swapping content.
2026-06-29 01:04:51 +02:00
Julien Calixte
2f8d3c24a4 feat(notes): keep old shas as immutable snapshots
All checks were successful
CI / verify (push) Successful in 1m5s
Cache content under its own sha (write-once) with the path key as the
latest pointer, and advance the stack handle to the new sha after an
edit or pull. A shared link keeps showing exactly what was shared, while
the live view follows your changes.
2026-06-29 00:43:56 +02:00
Julien Calixte
08d2d804ff feat(notes): show loading and failed states for stacked notes
All checks were successful
CI / verify (push) Successful in 1m3s
A note that couldn't load rendered a silent blank div. Add a calm
NoteState placeholder (spinner while loading, message + retry on
failure) and gate the read view on it; content still wins when present.
2026-06-29 00:31:09 +02:00
Julien Calixte
8f50259efe docs: record two-key cache strategy for reference modes
Decide the C3/C4 cache shape: content keyed by its own SHA (write-once,
immutable snapshot store) plus a path key holding the latest content
(live pointer). Notes the current immutability violation to fix.
2026-06-29 00:31:04 +02:00
Julien Calixte
a04d169bd8 fix(notes): show raw-text fallback when markdown render fails
All checks were successful
CI / verify (push) Successful in 1m2s
A throwing markdown-it plugin propagated uncaught and left the note
silently blank. Wrap the central render in try/catch and degrade to the
note's escaped raw text with a gentle notice, so content stays readable.
2026-06-29 00:00:20 +02:00
Julien Calixte
1b47101340 fix(notes): persist new SHA and dedup files by path on edit
All checks were successful
CI / verify (push) Successful in 2m2s
Editing a note in a stacked note saved cache without the path, so
store.files never received the new SHA and lookups went stale. Pass the
path through, and make addFile dedup by path as well as SHA so an edit
(same path, new SHA) replaces the old entry instead of duplicating it.
2026-06-28 23:52:37 +02:00
Julien Calixte
a7d846aa33 docs: add language glossary, QFD design, and ADRs
Capture the walk-with-me + qfd session: CONTEXT.md ubiquitous-language
glossary, DESIGN.md goal-driven cascade (Beauty / Pride & Peace /
public voice), and ADRs for Note identity (Path) and the two reference
modes (Live vs Snapshot).
2026-06-28 23:52:27 +02:00
Julien Calixte
fac05af862 feat: keep faved repos in list
All checks were successful
CI / verify (push) Successful in 1m3s
2026-06-21 12:07:19 +02:00
Julien Calixte
ad0a388f57 Merge branch 'main' of ssh://git.apoena.dev:22222/julien/remanso
All checks were successful
CI / verify (push) Successful in 2m3s
2026-06-21 10:29:23 +02:00
Julien Calixte
d76d63a198 feat(todo): auto-schedule next occurrence on recurring task completion
When a task with rec:Nd/w/m/y is checked off, a new open task is
appended with the updated due date. Non-strict (rec:1m) bases the
next due on today; strict (rec:+1m) bases it on the existing due date.
2026-06-21 10:26:37 +02:00
Julien Calixte
7575e34f8b style: inset lightbox image with a small dim margin
All checks were successful
CI / verify (push) Successful in 1m5s
Cap the fullscreen image at 96vh/96vw so a thin dim margin frames the
white image instead of bleeding to the viewport edges.
2026-06-18 00:23:38 +02:00
Julien Calixte
0f19482cf2 feat: fullscreen image lightbox on image/diagram click
All checks were successful
CI / verify (push) Successful in 2m2s
Click a note image or a mermaid/tikz diagram to view it fullscreen over
a blurred dim backdrop, with a fade/scale animation and rounded white
frame. Works on desktop and mobile; diagram SVGs are serialized to a
data URL via svgToDataUrl. Closes on click or Escape.
2026-06-18 00:19:51 +02:00
Julien Calixte
826f7a4ec9 fix(svg): cover full viewBox with export background
The white background rect was anchored at 0,0, but a diagram's viewBox
origin can be negative (content drawn above y=0, e.g. a QFD house roof),
leaving that content outside the fill. Anchor the rect to the viewBox
origin so the whole drawing sits on white in PNG/SVG exports.
2026-06-18 00:19:38 +02:00
Julien Calixte
e24f75a1cb feat(todo): show archived tasks from done.txt in a collapsible section
All checks were successful
CI / verify (push) Successful in 1m8s
2026-06-15 00:02:24 +02:00
Julien Calixte
2c3ce18e4d feat: filter only open todo items
All checks were successful
CI / verify (push) Successful in 1m2s
2026-06-14 21:00:41 +02:00
Julien Calixte
cef5873c95 Merge branch 'main' of ssh://git.apoena.dev:22222/remanso-space/remanso
All checks were successful
CI / verify (push) Successful in 2m5s
2026-06-14 19:49:25 +02:00
Julien Calixte
c296921eaf chore: update pnpm on ci 2026-06-14 19:49:10 +02:00
Julien Calixte
8e9ca655a9 2026-06-13 23:31:43
Some checks failed
CI / verify (push) Failing after 6s
2026-06-13 23:31:43 +02:00
Julien Calixte
a5de08087e fix(todo): smoothly collapse rows on filter leave/enter
Some checks failed
CI / verify (push) Failing after 7s
Switch the TransitionGroup animation from in-flow opacity+translate to
the grid-template-rows 1fr → 0fr pattern so a leaving row's height
shrinks during the transition. Avoids the post-animation snap that
happened when the DOM nodes were removed and the surrounding gap
suddenly closed.
2026-06-13 23:06:55 +02:00
Julien Calixte
bff3db79f9 style(todo): add plus/at icons to project and context chips
Aligns the baseline of +project and @context chips with due:/rec: chips
which already render Tabler SVG prefixes. Without an icon the text-only
prefix sat a few pixels off vertically.
2026-06-13 22:21:29 +02:00
Julien Calixte
08ea81684e style(notes): show repo title and user inline with a separator
Some checks failed
CI / verify (push) Failing after 8s
2026-06-13 22:13:41 +02:00
Julien Calixte
af7c87a18c fix(todo): drop stale filter selections when source values disappear
Some checks failed
CI / verify (push) Failing after 7s
If a user filters by a project/context/priority and then edits tasks until
that value no longer exists, the chip is gone but the active set still
contains it — leaving the list filtered to empty with no chip to toggle
off. Watch each available-list and prune orphaned entries from the
matching active set. Also tightens the task-input placeholder and reflows
some template whitespace.
2026-06-13 22:11:31 +02:00
Julien Calixte
4c29151f7c feat(todo): add exclusive open/done status filter
Some checks failed
CI / verify (push) Failing after 7s
2026-06-13 21:48:44 +02:00
Julien Calixte
d455ae0000 style(todo): bump clear-filters button from xs to sm
Some checks failed
CI / verify (push) Failing after 8s
2026-06-13 21:45:25 +02:00
Julien Calixte
03e7185abe fix(todo): rebuild priority dropdown with controlled state
Some checks failed
CI / verify (push) Failing after 7s
The DaisyUI <details>/<summary> dropdown didn't toggle reliably in Firefox
(summary + inline-flex badge), and :focus-within left the wrong row open
when TransitionGroup reordered tasks on sort. Replace with a Vue-controlled
ref + onClickOutside, render options as colored badge buttons (no menu
hover underline), and lift the widget by z-index: 1 only while open so the
absolute menu paints above the next row.
2026-06-13 21:42:09 +02:00
Julien Calixte
5de84f135f feat(todo): add priority filter and stack filter rows inline
Adds a Priorities filter column with toggleable (A)/(B)/(C)/(D)/no-priority
chips. Reflows the filter section from a two-column grid into single-line
strips so each filter type (Priorities · Projects · Contexts) reads on one
row with a fixed-width label and wrap-only-on-overflow chips.
2026-06-13 21:42:04 +02:00
Julien Calixte
72dee337b7 feat(todo): switch /todo view to todo.txt format
Some checks failed
CI / verify (push) Failing after 1m1s
Replace the markdown _todo/todo.md view with a structured todo.txt UI at the
repo root: priority dropdown, inline body edit, project/context/due/rec chips
with Tabler icons, add input as a join-suffix, project/context filter columns
with TransitionGroup animation, priority-sorted list. Drops the now-unused
.todo-notes markdown checkbox styles from app.css.
2026-06-13 21:23:19 +02:00