315 Commits
Author SHA1 Message Date
fen 7ee3ffbfc9 v0.4.0 release prep: README refresh + new wiki screenshots (Ref #160)
CI / test (pull_request) Successful in 23s
CI / docker (pull_request) Skipped
2026-09-17 10:25:20 -05:00
fen 53e7a97c44 Merge pull request '#243 fix attempt 2: button capitalization + link button label persistence' (#245) from fix-243-r2 into dev
CI / test (push) Successful in 21s
CI / docker (push) Successful in 46s
2026-09-17 14:50:10 +00:00
fen e7ecb9789b #243 fix attempt 2: capitalize action buttons; link button keeps its label after copy feedback
CI / test (pull_request) Successful in 20s
CI / docker (pull_request) Skipped
2026-09-16 15:56:15 -05:00
fen 3c5ccfb787 Merge pull request '#243: copy button should copy the link' (#244) from fix-243 into dev
CI / test (push) Successful in 19s
CI / docker (push) Successful in 47s
2026-09-16 20:44:56 +00:00
fen 1f745b6e59 #243: copy button copies the paste link; content copy kept on separate button
CI / test (pull_request) Successful in 26s
CI / docker (pull_request) Skipped
2026-09-16 15:40:39 -05:00
fen a9f94ce806 Merge pull request '#233: file attachment title takes the file name' (#236) from fix-233 into dev
CI / test (push) Successful in 50s
CI / docker (push) Successful in 44s
2026-09-10 23:39:44 +00:00
fen dbcdd1b7cd Merge pull request '#240: burn-after-read readable box padding/indent consistency' (#242) from fix-240 into dev
CI / test (push) Successful in 43s
CI / docker (push) Successful in 33s
2026-09-10 23:38:09 +00:00
fen c89d064eb8 #240: indent burn-after-read readable box under the option label text and match row padding rhythm
CI / test (pull_request) Successful in 44s
CI / docker (pull_request) Skipped
2026-09-10 18:09:00 -05:00
fen 9c0bd7abb9 Merge pull request '#240: burn-after-read submenu padding inconsistent with UI' (#241) from fix-240 into dev
CI / test (push) Successful in 43s
CI / docker (push) Successful in 43s
2026-09-10 23:00:32 +00:00
fen f25ed8bc5d #240: keep submenu padding on burn-after-read row
CI / test (pull_request) Successful in 43s
CI / docker (pull_request) Skipped
2026-09-10 17:58:21 -05:00
fen 9490b8d25a Merge pull request '#238: page 2 shows in pagination window when not adjacent' (#239) from fix-238 into dev
CI / test (push) Successful in 43s
CI / docker (push) Successful in 40s
2026-09-10 22:42:25 +00:00
fen b840bffeba #238: drop hardcoded page 2 from pagination window
CI / test (pull_request) Successful in 44s
CI / docker (pull_request) Skipped
2026-09-10 17:29:28 -05:00
fen 5075374abe Merge pull request '#235: rename Language column to Type; attachments show file extension' (#237) from fix-235 into dev
CI / test (push) Successful in 43s
CI / docker (push) Successful in 37s
2026-09-10 22:14:57 +00:00
fen 0008b8ce0c #235: rename Language column to Type; attachment pastes show file extension
CI / test (pull_request) Successful in 43s
CI / docker (pull_request) Skipped
- history/mine table column 'Language' -> 'Type' (data-sort key 'type')
- /api/public and /api/mine rows gain a 'type' field: file extension for
  attachment pastes, stored language otherwise (default 'text')
- paste page stats label 'Language' -> 'Type'; summary line uses the same
  label; get-paste JSON gains 'type'
- store list queries LEFT JOIN attachments to expose the filename
- table.js sorting accepts the 'type' key
2026-09-10 17:13:37 -05:00
fen 1dd8a3b28a Merge pull request '#232: remove duplicate filename under attachment pill, widen pill' (#234) from fix-232 into dev
CI / test (push) Successful in 46s
CI / docker (push) Successful in 41s
2026-09-10 22:06:25 +00:00
fen 9a5eaed00b #232: file pill shows filename twice on non-image files; drop duplicate, let long names truncate wider and reveal on hover
CI / test (pull_request) Successful in 44s
CI / docker (pull_request) Skipped
2026-09-10 17:05:18 -05:00
fen 785fafcaf9 #233: file attachment title takes the file name, fallback date.ext
CI / test (pull_request) Successful in 44s
CI / docker (pull_request) Skipped
2026-09-10 17:05:08 -05:00
fen ca59c19fa4 fix-232: drop attachment-preview img for non-image files (alt text painted duplicate filename); widen chip name max-width to 560px
CI / test (pull_request) Successful in 42s
CI / docker (pull_request) Skipped
2026-09-10 17:02:54 -05:00
fen e059ca1554 Merge pull request '#229: padding between image and pill body border' (#230) from fix-229 into dev
CI / test (push) Successful in 42s
CI / docker (push) Successful in 52s
2026-09-10 19:55:58 +00:00
fen 86eb821780 #229: padding between image and pill border, drop corner-clipped inner border
CI / test (pull_request) Successful in 46s
CI / docker (pull_request) Skipped
2026-09-10 14:54:28 -05:00
fen e589428315 Merge pull request 'Fix #221 follow-up: summary pill size for attachment pastes' (#228) from fix-221-r2 into dev
CI / test (push) Successful in 42s
CI / docker (push) Successful in 42s
2026-09-10 19:33:51 +00:00
fen d18bbb7064 #221: summary pill size must come from the attachment blob for file pastes
CI / test (pull_request) Successful in 43s
CI / docker (pull_request) Skipped
The merged #224 fix covered the details grid but left the summary
pill using humanSize(len(row.Content)), which reads 0 for attachment
pastes (text content is empty). Use the attachment size there too.
2026-09-10 14:31:56 -05:00
fen cb58a51bab Merge pull request 'fix #221: scale image pastes, clean link pill, raw image view, accurate size' (#224) from fix-221 into dev
CI / test (push) Successful in 41s
CI / docker (push) Successful in 40s
2026-09-10 19:21:22 +00:00
fen 98ea7eefa9 fix #221: scale image pastes, drop text box, fix raw view and size
CI / test (pull_request) Successful in 45s
CI / docker (pull_request) Skipped
- image pastes render the image scaled to fit the viewer box (aspect
  ratio preserved, max-height 70vh), no text/code box below it
- link pill moved under the image as a small inline chip
- /raw serves image attachment bytes as an image instead of empty text
- view details size reports the actual attachment file size
2026-09-10 14:19:07 -05:00
fen 44cff7e718 Merge pull request 'Fix details pill border clipped thin at corners' (#223) from fix-222 into dev
CI / test (push) Successful in 44s
CI / docker (push) Successful in 52s
2026-09-10 19:18:27 +00:00
fen fa702eb8b1 Fix details pill border clipped thin at corners (#222)
CI / test (pull_request) Successful in 42s
CI / docker (pull_request) Skipped
The details pill drew its own 1px border with a 10px radius inside .float, which draws the real border at 20px radius and clips with overflow:hidden. The parent's looser curve clipped the pill's tighter corner curve, making the border appear thinner/cut at the corners, in both collapsed and expanded states. Drop the pill's own border/radius so .float is the single border surface, matching the other pills on the page.

Ref #222
2026-09-10 14:16:28 -05:00
fen 7c7e60375c Merge pull request #217 from fen/fix-209
CI / test (push) Successful in 41s
CI / docker (push) Successful in 37s
Fix #209 r2: arrows immediately right of the column label text
2026-09-10 13:27:49 -05:00
fen 700b8252f0 Merge pull request 'Fix #209 r2: sort arrows immediately right of label text' (#218) from fix-209 into dev
CI / test (push) Successful in 47s
CI / docker (push) Successful in 41s
2026-09-10 18:17:39 +00:00
fen 89a9c173ca Fix #209 r2: sort arrows immediately right of label text
CI / test (pull_request) Successful in 43s
CI / docker (pull_request) Skipped
2026-09-10 13:15:06 -05:00
fen 13884ca786 Merge pull request #215 from fix-205
CI / test (push) Successful in 46s
CI / docker (push) Successful in 42s
Fix #205: stop gutter drift from phantom newline rows
2026-09-10 18:15:03 +00:00
fen 7cffd21df9 Fix #209 r2: arrows immediately right of label text, fixed gap
CI / test (pull_request) Successful in 44s
CI / docker (pull_request) Skipped
Absolute right:8px pinned arrows to the column edge; inline span after
the label with margin-left:6px keeps a consistent gap from the text.
2026-09-10 13:14:28 -05:00
fen 5034f156ee Fix #205: strip whitespace-only text nodes between codeline blocks
CI / test (pull_request) Successful in 43s
CI / docker (pull_request) Skipped
paste-lines.js rebuilt the codebody with innerHTML but relied on the
server-side '\n' delimiters disappearing between the per-line blocks.
Under white-space: pre any whitespace-only text node that survives
(cached HTML, template drift) renders as a phantom row and drifts the
gutter numbers off their lines. splitLines() now strips whitespace-only
text nodes after rebuilding, keeping renumber() geometry intact.
2026-09-10 13:12:12 -05:00
fen 6951470bda Merge pull request 'Fix #207 r2: dark mode toggle left aligned per owner feedback' (#213) from fix-207-r2 into dev
CI / test (push) Successful in 41s
CI / docker (push) Successful in 43s
2026-09-10 18:08:45 +00:00
fen c320fa03c9 Fix #207 r2: dark mode toggle left aligned per owner feedback
CI / test (pull_request) Successful in 46s
CI / docker (pull_request) Skipped
2026-09-10 13:07:14 -05:00
fen 672288e60b Merge pull request 'Fix #209: sort arrows to the right of column labels' (#212) from fix-209 into dev
CI / test (push) Successful in 45s
CI / docker (push) Successful in 49s
2026-09-10 18:02:46 +00:00
fen 5039a76bec Fix #209: move sort arrows to the right of the column label
CI / test (pull_request) Successful in 45s
CI / docker (pull_request) Skipped
2026-09-10 13:02:22 -05:00
fen a49127eff2 Merge pull request 'Fix #210: saved pastes ID column / delete button overlap' (#211) from fix-210 into dev
CI / test (push) Successful in 40s
CI / docker (push) Successful in 40s
2026-09-10 18:00:42 +00:00
fen 8636a23f49 Fix #210: declare missing delete-button column in saved pastes table
CI / test (pull_request) Successful in 45s
CI / docker (pull_request) Skipped
/mine rows render 7 cells (ID + delete button) but the colgroup and
thead only declared 6 columns, so under table-layout:fixed the delete
button cell overlapped the ID column at narrower widths. Add a
col-del column + empty header th to match the row cells.
2026-09-10 12:56:10 -05:00
fen 348f792c73 Merge pull request 'Fix #169: persistent full-width divider between dropdown title and body' (#195) from fix-195 into dev
CI / test (push) Successful in 44s
CI / docker (push) Successful in 45s
2026-09-10 12:27:33 -05:00
fen 5c6cd40539 Merge pull request 'Fix #167 r2' from fix-167-r2 into dev
CI / test (push) Successful in 42s
CI / docker (push) Successful in 39s
2026-09-10 12:22:14 -05:00
fen ec791cc2db Fix #167 r2: measure-based gutter rows + fix undefined tops ref in renumber
CI / test (pull_request) Successful in 42s
CI / docker (pull_request) Skipped
QA of the #167 follow-up found two defects:
1) renumber() referenced an undefined 'tops' variable in the rAF
   re-verification pass, so any wrap toggle that reflowed a partially
   filled last visual row left stale (non-idempotent) numbering.
2) rows were derived from per-span heights while the code column also
   renders newline text nodes between .codeline blocks, so the gutter
   could drift from the code column's real visual rows.

renumber() now measures each .codeline's actual offsetTop and places
every number on the visual row its line starts on (a line wrapping to N
rows gets its number on the first of them), pads filler rows in between,
and self-corrects one frame later if reflow moves any line. Wrap-OFF
path stays unchanged ('1
2
3
4'). Verified in headless Chromium:
gutter/code row alignment exact at 1200px and 640px, toggle cycles
stable, no horizontal scroll, no CSP console errors; go build/test pass.
2026-09-10 12:19:44 -05:00
fen 23cf3151c4 Merge pull request 'Fix settings dark mode toggle and center it (#197)' (#199) from fix-197 into dev
CI / test (push) Successful in 42s
CI / docker (push) Successful in 50s
2026-09-10 17:16:38 +00:00
fen f1665f1b31 Merge fix-167 (PR #200) into dev
CI / test (push) Successful in 38s
CI / docker (push) Successful in 43s
Resolves #167

QA: fen
2026-09-10 12:14:21 -05:00
fen e1056df747 Fix #167: gutter alignment with wrap on
CI / test (pull_request) Successful in 46s
CI / docker (pull_request) Skipped
Rebuild renumber() so gutter numbers are placed by measured geometry:
each .gutline block is one visual row and each number is assigned to the
row whose top matches its .codeline's top, instead of counting rows per
line. This keeps numbers aligned with wrapped line starts regardless of
how many visual rows a line occupies. Wrap OFF path unchanged.
2026-09-10 12:12:31 -05:00
fen 5fdb34a059 Fix #167: align gutter numbers with actual rendered line rows (wrap ON)
CI / test (pull_request) Successful in 44s
CI / docker (pull_request) Skipped
paste-lines.js joined .codeline spans with '\n' text nodes that pre-wrap
renders as extra line boxes, and renumber() counted per-line span heights
(rounding) instead of real geometry, so gutter numbers drifted off their
line starts on wrapped lines. Fix: join spans with '' (blocks need no
newline text), and build one .gutline per visual row measured from the
code body's real height, placing each number at the visual row whose top
matches its .codeline's measured top. Wrap OFF path unchanged. Mobile
font-size rule added so gutter row pitch matches code rows at 375x812.
2026-09-10 12:12:00 -05:00
fen 734d656f0c Merge pull request 'Fix #194 r2: line-number gutter alignment in both wrap modes' (#198) from fix-194-r2 into dev
CI / test (push) Successful in 47s
CI / docker (push) Successful in 49s
2026-09-10 17:11:08 +00:00
fen 8042116a69 Fix settings dark mode toggle double-binding and center it (#197)
CI / test (pull_request) Successful in 50s
CI / docker (pull_request) Skipped
topbar.js binds click handlers to every .dark-toggle, including the
settings one; settings.js then also wired a delegation that re-clicked
the topbar button, so each click flipped dark mode twice (net no-op).
Mark buttons as wired in topbar.js and only add a fallback handler in
settings.js when topbar.js did not run.

CSS: center the toggle horizontally under the Settings title with auto
margins, matching .settings-body padding.

Closes #197
2026-09-10 12:10:00 -05:00
fen d77f1faf67 Merge pull request 'Fix #167 (r2): pin gutter width so wrapped-row renumbering stays aligned' (#192) from fix-167 into dev
CI / test (push) Successful in 46s
CI / docker (push) Successful in 47s
2026-09-10 17:09:56 +00:00
fen 2149fcc2e1 Fix #167: gutter numbers align with wrapped-line starts
CI / test (pull_request) Successful in 49s
CI / docker (pull_request) Skipped
- splitLines(): join .codeline blocks with "" not "\n" — newline text
  nodes under pre-wrap rendered an extra line box per logical line, so
  every gutter number drifted one row per line
- renumber(): geometry-driven placement — one gutline per visual row of
  the code body, each number assigned to the row matching its line's
  measured offsetTop; verified second pass re-runs if a partially-filled
  last wrapped row reflows after the gutter rebuild
- app.css: mobile media query gives .code .gutter the same 13px font as
  .code so gutter rows and code rows share one line box at 375px

Verified in local build with headless chromium (long unbroken token on
line 5, wrap ON): all numbers align with line starts, no misalignment,
no horizontal scroll at 1400x900 and 375x812.
2026-09-10 12:09:16 -05:00
fen e430eb57b7 Fix #167: renumber gutter to visual rows when line wrap is on
CI / test (pull_request) Successful in 39s
CI / docker (pull_request) Skipped
Split the paste codebody into per-line block spans (paste-lines.js) and
rebuild the gutter from each line's wrapped height so numbers count
visual rows, not logical lines. Pinned the gutter width (flex 0 0 auto,
3ch) so its row count no longer feeds back into the code column width.
ResizeObserver renumbers on wrap toggle / resize; wrap-off behavior is
unchanged (one number per newline).
2026-09-10 12:08:49 -05:00