aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md15
-rw-r--r--README.md22
2 files changed, 35 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2a503a7..cc13970 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -61,9 +61,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- A dismiss (✕) button on status-line messages. They previously stayed until
some later action replaced them; any status message can now be cleared
without waiting.
+- A copy button on every fenced code block, below it on the right. Qt rich
+ text has no widgets and no `:hover`, so it is an anchor in the same internal
+ scheme dispatch the thinking and search toggles use, and hovering is a
+ re-render driven by `QTextBrowser.highlighted()`. It is grey at rest, takes
+ the highlight colour under the pointer, and becomes a green tick for a
+ moment once used. The text comes from the source markdown, since Qt emits
+ one `<pre>` per line and the block cannot be recovered from the rendered
+ HTML.
### Fixed
+- A long line in a code block widened the whole transcript and left it
+ scrolling sideways. Qt's markdown stylesheet wraps `p` and `li` but not
+ `pre`, and it is dropped when only the body fragment is kept, so the block
+ style now carries `white-space:pre-wrap` itself.
+- Code blocks sat flush against their tint. Qt ignores `padding` and vertical
+ margins on `<pre>`, so the inset now comes from left and right margins and
+ the room above and below from a tinted spacer line.
- Model listing crashed when a provider's `/v1/models` endpoint returned a
bare JSON array instead of the standard `{"data": [...]}` envelope. The
parser now accepts both shapes.
diff --git a/README.md b/README.md
index f53d167..24a5d7f 100644
--- a/README.md
+++ b/README.md
@@ -22,8 +22,10 @@ persistent process and toggles like a scratchpad from a Hyprland keybind.
words of the question the entry was created with.
- **Streaming replies** rendered token by token, formatted as markdown:
headings, bold and italic, bullet and numbered lists, tables, inline code
- and tinted fenced code blocks. What you type is shown exactly as typed, so
- the contents of an attached file are never reflowed.
+ and tinted fenced code blocks. Long lines wrap rather than scrolling the
+ transcript sideways, and each code block carries a copy button. What you
+ type is shown exactly as typed, so the contents of an attached file are
+ never reflowed.
- **Collapsed reasoning.** Presets with a reasoning budget return the model's
thinking separately from its answer. It shows as a one-line `▸ thinking`
summary above the reply, and clicking that expands it. Each reply collapses
@@ -563,6 +565,22 @@ handed to the desktop opener.
Qt renders a fenced block as one `<pre>` element per line with no background
of its own, so llamachat adds the tint that makes a code block read as one.
+Qt also ignores `padding` and vertical margins on `<pre>`, so the inset comes
+from left and right margins and the room above and below from a tinted spacer
+line. Without an explicit `white-space:pre-wrap` a long line would widen the
+whole transcript: Qt's own markdown stylesheet wraps `p` and `li` but not
+`pre`, and that stylesheet is dropped when only the body fragment is kept.
+
+Each code block gets a copy button below it, on the right. Qt rich text has
+no widgets and no `:hover`, so the button is an anchor in the same internal
+scheme dispatch the thinking and search toggles use, and hovering is a
+re-render driven by `QTextBrowser.highlighted()`. It sits below the block
+because Qt cannot float it over the tint. The button is grey at rest, takes
+the highlight colour under the pointer, and becomes a green tick for a moment
+once used; the tick reverts on its own rather than standing indefinitely and
+implying the clipboard still holds that block. The text is copied from the
+source markdown, not the rendered HTML, which per-line `<pre>` elements would
+make unrecoverable.
## Notes and limits