Commit Graph

921 Commits

Author SHA1 Message Date
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
Julien Calixte
70d9d8a890 feat(todotxt): add parser/serializer for todo.txt format
Pure utility with Task model, line/file parse/serialize, project/context/tag
extraction, due/rec segment splitting, and toggleCompleted. Round-trip tests
cover priorities, dates, tag tokens, mid-word @ guards, and blank lines.
2026-06-13 21:23:11 +02:00
Julien Calixte
9380eace92 chore: drop unused TanStack Vue Query and ts-rest client
Some checks failed
CI / verify (push) Failing after 1m2s
VueQueryPlugin was mounted but no useQuery/useMutation calls existed,
and the noteRouter ts-rest contract was never imported. The callers
of api.remanso.space all use plain fetch(), so the three packages
(@tanstack/vue-query, @ts-rest/core, @ts-rest/vue-query) and the
src/modules/post directory can go.
2026-06-12 13:05:42 +02:00
Julien Calixte
57bc63d43b fix(markdown): wrap long inline code in Safari
Some checks failed
CI / verify (push) Failing after 51s
Safari does not treat `/` as a soft break opportunity inside inline
`<code>`, so long paths overflow the fixed-width stacked note column.
Use `overflow-wrap: anywhere` so the column can shrink to its max-width
instead of being pushed wider by unbreakable inline code.
2026-06-09 16:22:03 +02:00
Julien Calixte
ac3a641b22 fix(markdown): re-render code blocks after Shikiji loads
Some checks failed
CI / verify (push) Failing after 7s
The singleton `md` instance is mutated by `useShikiji()` asynchronously,
but `content` computeds had no reactive dep on that loading, so the
initial render on page reload never picked up syntax highlighting.
Link-click navigation appeared to work only because Shikiji was already
installed in `md` by an earlier render.
2026-06-09 14:38:40 +02:00
Julien Calixte
cdfc90f7eb chore: update pnpm
Some checks failed
CI / verify (push) Failing after 28s
2026-06-09 14:35:00 +02:00
Julien Calixte
f8e0bbf9a7 Merge branch 'main' of ssh://git.apoena.dev:22222/remanso-space/remanso
Some checks failed
CI / verify (push) Has been cancelled
2026-06-09 14:34:31 +02:00
Julien Calixte
f2ba56e936 fix: add tsx as lang 2026-06-09 14:34:23 +02:00
Julien Calixte
bb3a4a4dad test: cover post-merge gaps in utils, services, and hooks
All checks were successful
CI / verify (push) Successful in 59s
Adds specs for the files added or modified in the recent merge that
weren't yet covered: oauthReturnPath, withATProtoImages, link,
displayLanguage, and the useGitHubContent / useImageUpload /
useNoteFreshness hooks. Locks in the new pullLatest contract
({raw, failureStatus}) and the fetchLatestSha branch semantics
(ok/unauthorized/offline).
2026-06-06 23:36:17 +02:00
Julien Calixte
af2ffc3949 chore(ci): re-enable pnpm cache
All checks were successful
CI / verify (push) Successful in 1m56s
Runner cache backend is now reachable from the job container, so
`cache: pnpm` on setup-node works again. Reverts b77c097.
2026-06-06 23:27:58 +02:00
Julien Calixte
b77c097032 chore(ci): disable pnpm cache to avoid 9-min runner timeout
All checks were successful
CI / verify (push) Successful in 47s
The Gitea cache server at 10.0.23.3:42951 is unreachable from the
job container. Each cache restore and save hangs ~4m40s on TCP
timeout before falling back to a cold run, costing ~9m per job.
Removing `cache: pnpm` brings total CI time down to ~45s.
2026-06-06 23:17:26 +02:00
Julien Calixte
9f21cb7882 chore: merge origin/main with local test additions
All checks were successful
CI / verify (push) Successful in 10m1s
Resolves conflict in repo.spec.ts by combining getRepoPermission
tests from main with the getFiles and queryFileContent tests from
the local test pass. Adds getRepoPermission to the userRepo.store
spec mocks so the new permission probe added upstream doesn't break
the store tests.
2026-06-06 22:17:10 +02:00
Julien Calixte
1a2d8f4ebf chore: add tests 2026-06-06 22:13:14 +02:00
Julien Calixte
d99672dbd8 fix(auth): return to origin path after GitHub login
Sign-in saves the current path in sessionStorage so the OAuth callback
can route back instead of always landing on Home.
2026-05-29 16:49:44 +02:00
Julien Calixte
a09e541fa8 feat(repo): hide write UI for users without push access
Fetch the viewer's push permission via GET /repos/{owner}/{repo} when
entering a repo and gate every write affordance behind it: edit and
image-upload buttons in StackedNote, new-fleeting-note and YouTube
buttons in FleetingNotes, and interactive checkboxes in TodoNotes
(rendered disabled when read-only). Anonymous viewers get the same
treatment because the permissions field is absent without auth, which
collapses to canPush = false.

Previously every write button was visible regardless of role, so
read-role collaborators and anonymous viewers could enter edit mode and
type before the save failed with 401/403.
2026-05-29 15:24:12 +02:00
Julien Calixte
455addf760 style(notes): move image upload button after edit/save button 2026-05-25 21:29:54 +02:00
Julien Calixte
b87836782b fix(notes): persist uploaded image to cache so it survives reload 2026-05-25 21:29:51 +02:00
Julien Calixte
299493854e fix(notes): type emit calls in NoteConflictModal
Vue's defineEmits generates per-event overloads, so emit(action) with
a union of literal types failed to type-check. Split the single
choose() helper into one handler per action.
2026-05-25 21:27:48 +02:00
Julien Calixte
54c52feeba refactor(notes): return failure status from pullLatest
Callers had to read back the side-effected status ref to know why a
pull failed, which also broke TS narrowing on the freshness badge
handler. Return { raw, failureStatus } so the reason flows through
the return value.
2026-05-25 21:25:54 +02:00
Julien Calixte
60e3849c20 fix(notes): always insert blank line before appended image link 2026-05-25 21:23:31 +02:00
Julien Calixte
4ab0be75e7 feat(notes): show loader on image upload button while uploading 2026-05-25 21:23:22 +02:00