UnigramDev/Unigram/layer228 • 53501e5 • 1 files, +1/-1
Fix missing default value
UnigramDev/Unigram/layer228 • da4f41c • 2 files, +0/-142
Remove unused code
UnigramDev/Unigram/layer228 • da41770 • 9 files, +1/-31
Removed TextStyle
UnigramDev/Unigram/layer228 • 24e067a • 1 files, +53/-69
Refactor formatted text block pools
UnigramDev/Unigram/layer228 • 90d9201 • 1 files, +16/-18
Fix fast run and auto font size
UnigramDev/Unigram/layer228 • 1a081c8 • 44 files, +441/-8
Debug chat history UI tree
UnigramDev/Unigram/layer228 • bd8c037 • 4 files, +80/-35
Don't use explicit bindings in FormattedTextBlock
UnigramDev/Unigram/layer228 • bcc5581 • 3 files, +9/-9
Fix code block font family
UnigramDev/Unigram/layer228 • c22c16b • 2 files, +76/-14
Optimize SVG decompression
UnigramDev/Unigram/layer228 • 67f34b7 • 1 files, +25/-10
Properly unsubscribe window
UnigramDev/Unigram/layer228 • 5c5590f • 1 files, +8/-1
Fix leak in dead code
UnigramDev/Unigram/layer228 • 49b2c6b • 3 files, +41/-9
Fixes
UnigramDev/Unigram/layer228 • b727254 • 1 files, +18/-5
Fix context menu for selected messages
UnigramDev/Unigram/layer228 • 15f1274 • 1 files, +1/-1
Fix context menu for vote-once polls
UnigramDev/Unigram/layer228 • 14e7634 • 2 files, +2/-6
Refactoring
#unigram
Fix missing default value
UnigramDev/Unigram/layer228 • da4f41c • 2 files, +0/-142
Remove unused code
UnigramDev/Unigram/layer228 • da41770 • 9 files, +1/-31
Removed TextStyle
UnigramDev/Unigram/layer228 • 24e067a • 1 files, +53/-69
Refactor formatted text block pools
UnigramDev/Unigram/layer228 • 90d9201 • 1 files, +16/-18
Fix fast run and auto font size
UnigramDev/Unigram/layer228 • 1a081c8 • 44 files, +441/-8
Debug chat history UI tree
UnigramDev/Unigram/layer228 • bd8c037 • 4 files, +80/-35
Don't use explicit bindings in FormattedTextBlock
UnigramDev/Unigram/layer228 • bcc5581 • 3 files, +9/-9
Fix code block font family
UnigramDev/Unigram/layer228 • c22c16b • 2 files, +76/-14
Optimize SVG decompression
UnigramDev/Unigram/layer228 • 67f34b7 • 1 files, +25/-10
Properly unsubscribe window
UnigramDev/Unigram/layer228 • 5c5590f • 1 files, +8/-1
Fix leak in dead code
UnigramDev/Unigram/layer228 • 49b2c6b • 3 files, +41/-9
Fixes
UnigramDev/Unigram/layer228 • b727254 • 1 files, +18/-5
Fix context menu for selected messages
UnigramDev/Unigram/layer228 • 15f1274 • 1 files, +1/-1
Fix context menu for vote-once polls
UnigramDev/Unigram/layer228 • 14e7634 • 2 files, +2/-6
Refactoring
#unigram
🫡2
UnigramDev/Unigram/layer228 • 7b8b6d2 • 2 files, +42/-0
IsTextTrimmable
UnigramDev/Unigram/layer228 • 90d5a6e • 5 files, +172/-26
WIP: memory optimizations
#unigram
IsTextTrimmable
UnigramDev/Unigram/layer228 • 90d5a6e • 5 files, +172/-26
WIP: memory optimizations
#unigram
🫡2
morethanwords/tweb/master • 6e3d57a • 1 files, +15/-1
Add view-in-stealth-mode option to profile stories context menu
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 3c6ca05 • 3 files, +106/-5
Fix code-block markdown paste and send handling
- parseMarkdown: only treat the first line of a ``` block as a language tag when it's a single identifier token, so a leading { (e.g. pretty-printed JSON with the opening fence on the same line) is kept as code instead of being swallowed.
- parseMarkdown: a lone ``` run (all-backtick content, not a real fence) was pushed twice — once in the all-backtick branch and again in the !pushedEntity fallback — duplicating it and drifting every entity after it on send. Emit it verbatim once.
- inputField paste handler: don't discard perfectly good rich HTML when text/plain is a markdown rendering of the same content (backticks/asterisks make it longer). Also accept the rich value when its non-whitespace chars are an in-order subsequence of the plain text.
- Add parseMarkdownCode.test.ts covering language detection and the lone-``` duplication.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 5dae11d • 8 files, +203/-21
Route OffscreenCanvas stickers and spoilers through per-tab workers
OffscreenCanvas presentation (transferControlToOffscreen) is incompatible
with a SharedWorker: a tab-owned canvas's frame sink is bound to the owning
renderer process, so a cross-process present is rejected ("Invalid client ID")
and kills the tab with RESULT_CODE_KILLED_BAD_MESSAGE whenever two same-origin
tabs land in different processes. Gate both offscreen paths behind a shared
IS_SHARED_WORKER_OFFSCREEN_CANVAS_SUPPORTED flag.
- Spoiler renderer runs as a per-tab dedicated Worker instead of a SharedWorker.
- rlottie 'canvas' stickers keep decoding in the shared rlottie worker but
present via the per-tab emoji compositor: the worker ships ImageBitmaps and
the compositor holds/tints/blits the transferred canvases (attach/detach/
resize/config/present sticker ops, keyed by item reqId). Re-key
lottieLoader.players on the offscreen->legacy fallback via a new reqIdChanged
event, and extract paintFrameTinted shared by both workers.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
Add view-in-stealth-mode option to profile stories context menu
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 3c6ca05 • 3 files, +106/-5
Fix code-block markdown paste and send handling
- parseMarkdown: only treat the first line of a ``` block as a language tag when it's a single identifier token, so a leading { (e.g. pretty-printed JSON with the opening fence on the same line) is kept as code instead of being swallowed.
- parseMarkdown: a lone ``` run (all-backtick content, not a real fence) was pushed twice — once in the all-backtick branch and again in the !pushedEntity fallback — duplicating it and drifting every entity after it on send. Emit it verbatim once.
- inputField paste handler: don't discard perfectly good rich HTML when text/plain is a markdown rendering of the same content (backticks/asterisks make it longer). Also accept the rich value when its non-whitespace chars are an in-order subsequence of the plain text.
- Add parseMarkdownCode.test.ts covering language detection and the lone-``` duplication.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 5dae11d • 8 files, +203/-21
Route OffscreenCanvas stickers and spoilers through per-tab workers
OffscreenCanvas presentation (transferControlToOffscreen) is incompatible
with a SharedWorker: a tab-owned canvas's frame sink is bound to the owning
renderer process, so a cross-process present is rejected ("Invalid client ID")
and kills the tab with RESULT_CODE_KILLED_BAD_MESSAGE whenever two same-origin
tabs land in different processes. Gate both offscreen paths behind a shared
IS_SHARED_WORKER_OFFSCREEN_CANVAS_SUPPORTED flag.
- Spoiler renderer runs as a per-tab dedicated Worker instead of a SharedWorker.
- rlottie 'canvas' stickers keep decoding in the shared rlottie worker but
present via the per-tab emoji compositor: the worker ships ImageBitmaps and
the compositor holds/tints/blits the transferred canvases (attach/detach/
resize/config/present sticker ops, keyed by item reqId). Re-key
lottieLoader.players on the offscreen->legacy fallback via a new reqIdChanged
event, and extract paintFrameTinted shared by both workers.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
🫡3
morethanwords/tweb/master • a42b5b4 • 4 files, +283/-3
Add Stories and Reactions sections to notification settings
Settings → Notifications gains two iOS-style sections:
- Stories: a 3-state "New Stories" control (all / important-only / off) mapped
to the nullable stories_muted flag on inputNotifyUsers, plus "Show Sender's
Name" (stories_hide_sender). The global toggle is inherited by the per-peer
story-notification guard and by server web-push, so it actually silences new
story notifications on WebK (bugs.telegram.org/c/63273).
- Reactions: per-category (messages / stories) off / My Contacts / Everyone
pickers plus "Show Sender's Name", backed by new appNotificationsManager
get/setReactionsNotifySettings wrappers over account.*ReactionsNotifySettings.
The stories write also publishes its change locally right away so the sibling
Private Chats section, which shares inputNotifyUsers and rewrites the whole
object on tab-close, cannot clobber the story flags.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 257c29d • 14 files, +2390/-35
Render Markdown documents in Instant View
Open .md / text/markdown attachments as a native Instant View page instead
of downloading them. A client-side CommonMark-ish parser builds a Telegram
Page from the markdown, rendered by the existing IV UI.
Parser (src/lib/richTextProcessor/):
- parseMarkdownToPage: headings H1-H6 (+ slug anchors), unordered/ordered/
nested lists, GFM tables with alignment, task lists, blockquotes, fenced
and indented code, $$...$$ math blocks, <details> collapsibles, footnotes
(sequential numbering + clickable reference<->definition links),
reference/inline links, HTML comment stripping, thematic breaks.
- inlineMarkdownToRichText: bold/italic/underline/strike/code/spoiler,
<sub>/<sup>/<mark>, <b>/<i>/<u>/<s> -> real formatting, <url>/<email>
autolinks, reference links, backslash escapes, inline $x$ math.
Instant View (src/components/):
- markdownInstantView + wrappers/document.ts: open .md attachments as IV.
- instantView.tsx: highlighted code blocks (reusing wrapRichText's
messageEntityPre markup) with working copy/wrap buttons, square task
checkboxes (StaticCheckbox), app-standard quote styling, Temml-rendered
math (inline + block), in-page anchor & footnote scrolling.
- instantViewMath: lazy Temml (LaTeX -> MathML) loader with plain-text
fallback, loaded as a Vite-minified async chunk on first formula.
- browser.tsx: hide open/copy-link menu actions for the URL-less md page.
Extract src/helpers/dom/codeBlockClick.ts for the shared code-block
copy/wrap detection; the Instant View onClick delegator reuses it.
Adds the temml dependency. Covered by src/tests/parseMarkdownToPage.test.ts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
Add Stories and Reactions sections to notification settings
Settings → Notifications gains two iOS-style sections:
- Stories: a 3-state "New Stories" control (all / important-only / off) mapped
to the nullable stories_muted flag on inputNotifyUsers, plus "Show Sender's
Name" (stories_hide_sender). The global toggle is inherited by the per-peer
story-notification guard and by server web-push, so it actually silences new
story notifications on WebK (bugs.telegram.org/c/63273).
- Reactions: per-category (messages / stories) off / My Contacts / Everyone
pickers plus "Show Sender's Name", backed by new appNotificationsManager
get/setReactionsNotifySettings wrappers over account.*ReactionsNotifySettings.
The stories write also publishes its change locally right away so the sibling
Private Chats section, which shares inputNotifyUsers and rewrites the whole
object on tab-close, cannot clobber the story flags.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 257c29d • 14 files, +2390/-35
Render Markdown documents in Instant View
Open .md / text/markdown attachments as a native Instant View page instead
of downloading them. A client-side CommonMark-ish parser builds a Telegram
Page from the markdown, rendered by the existing IV UI.
Parser (src/lib/richTextProcessor/):
- parseMarkdownToPage: headings H1-H6 (+ slug anchors), unordered/ordered/
nested lists, GFM tables with alignment, task lists, blockquotes, fenced
and indented code, $$...$$ math blocks, <details> collapsibles, footnotes
(sequential numbering + clickable reference<->definition links),
reference/inline links, HTML comment stripping, thematic breaks.
- inlineMarkdownToRichText: bold/italic/underline/strike/code/spoiler,
<sub>/<sup>/<mark>, <b>/<i>/<u>/<s> -> real formatting, <url>/<email>
autolinks, reference links, backslash escapes, inline $x$ math.
Instant View (src/components/):
- markdownInstantView + wrappers/document.ts: open .md attachments as IV.
- instantView.tsx: highlighted code blocks (reusing wrapRichText's
messageEntityPre markup) with working copy/wrap buttons, square task
checkboxes (StaticCheckbox), app-standard quote styling, Temml-rendered
math (inline + block), in-page anchor & footnote scrolling.
- instantViewMath: lazy Temml (LaTeX -> MathML) loader with plain-text
fallback, loaded as a Vite-minified async chunk on first formula.
- browser.tsx: hide open/copy-link menu actions for the URL-less md page.
Extract src/helpers/dom/codeBlockClick.ts for the shared code-block
copy/wrap detection; the Instant View onClick delegator reuses it.
Adds the temml dependency. Covered by src/tests/parseMarkdownToPage.test.ts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
🫡3
morethanwords/tweb/master • 5312839 • 2 files, +303/-89
Add trackpad swipe-to-reply for message bubbles
A two-finger horizontal trackpad swipe now replies to a message on desktop,
alongside the existing touch swipe. Wheel events (deltaX) drive the same reply
visuals through a shared createReplySwipeController; the gesture axis-locks per
burst so vertical scroll and inner horizontal scrollers (code blocks, wide
tables) keep working, and the commit point is found by detecting the momentum
decay (with a wheel-idle-debounce fallback) so the reply fires near release
without waiting out the full trackpad inertia.
Also fix two visual regressions in the reply gesture: fade the side reply icon
out on release instead of dropping it in a single frame, and keep the group
avatar's bottom animating during the slide-back so replying to the last message
no longer makes the avatar jump vertically.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • a3cad62 • 11 files, +174/-16
Add guest bots (bot_guestchat)
Sender: a guest bot's @username typed at the start of a message sends a plain
message instead of triggering an inline query, and guest bots are suggested in
the @ autocomplete (except in channels and monoforums).
Display: an incoming message carrying guestchat_via_from renders the guest
bot's avatar (forced even in a 1-on-1) and a "<Bot> for <Visitor>" name, with
consecutive messages grouped by visitor. A one-time hint explains that the bot
can't read the chat — only the message where it was mentioned.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 33179d0 • 2 files, +9/-16
Route code-block click handling through the codeBlockClick helper
Replace the inline code-header / monospace-text click detection and
wrap-toggle logic in ChatBubbles with getCodeBlockClickTarget and
toggleCodeBlockWrap from @helpers/dom/codeBlockClick. Also sort the
pngjs / @types/pngjs devDependencies alphabetically.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • a8cda12 • 300 files, +713/-603
Build
#webk
Add trackpad swipe-to-reply for message bubbles
A two-finger horizontal trackpad swipe now replies to a message on desktop,
alongside the existing touch swipe. Wheel events (deltaX) drive the same reply
visuals through a shared createReplySwipeController; the gesture axis-locks per
burst so vertical scroll and inner horizontal scrollers (code blocks, wide
tables) keep working, and the commit point is found by detecting the momentum
decay (with a wheel-idle-debounce fallback) so the reply fires near release
without waiting out the full trackpad inertia.
Also fix two visual regressions in the reply gesture: fade the side reply icon
out on release instead of dropping it in a single frame, and keep the group
avatar's bottom animating during the slide-back so replying to the last message
no longer makes the avatar jump vertically.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • a3cad62 • 11 files, +174/-16
Add guest bots (bot_guestchat)
Sender: a guest bot's @username typed at the start of a message sends a plain
message instead of triggering an inline query, and guest bots are suggested in
the @ autocomplete (except in channels and monoforums).
Display: an incoming message carrying guestchat_via_from renders the guest
bot's avatar (forced even in a 1-on-1) and a "<Bot> for <Visitor>" name, with
consecutive messages grouped by visitor. A one-time hint explains that the bot
can't read the chat — only the message where it was mentioned.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 33179d0 • 2 files, +9/-16
Route code-block click handling through the codeBlockClick helper
Replace the inline code-header / monospace-text click detection and
wrap-toggle logic in ChatBubbles with getCodeBlockClickTarget and
toggleCodeBlockWrap from @helpers/dom/codeBlockClick. Also sort the
pngjs / @types/pngjs devDependencies alphabetically.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • a8cda12 • 300 files, +713/-603
Build
#webk
🫡3
morethanwords/tweb/master • 859205f • 10 files, +580/-51
Layer 227
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • e22ba93 • 12 files, +968/-42
Add support for MTProto rich messages (#669)
Render incoming message.rich_message payloads through the Instant View block
renderer, with reply/search summary text and a messages.getRichMessage fetch for
"read more" parts. Math (pageBlockMath / inline textMath) renders via the Temml
path; the TL schema comes from the official Layer 227.
Also fixes a threaded-worker port-attachment race that could stick the app on
dialog load.
Fixes #664
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
Layer 227
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • e22ba93 • 12 files, +968/-42
Add support for MTProto rich messages (#669)
Render incoming message.rich_message payloads through the Instant View block
renderer, with reply/search summary text and a messages.getRichMessage fetch for
"read more" parts. Math (pageBlockMath / inline textMath) renders via the Temml
path; the TL schema comes from the official Layer 227.
Also fixes a threaded-worker port-attachment race that could stick the app on
dialog load.
Fixes #664
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
🫡4
telegramdesktop/tdesktop/dev • 54d4d8a • 1 files, +4/-2
[img-editor] Fixed std::clamp() crash in photo editor
#tdesktop
[img-editor] Fixed std::clamp() crash in photo editor
#tdesktop
🫡2
telegramdesktop/tdesktop/nightly • 75d0259 • 2 files, +13/-2
Fixed swipe-next-channel gesture freeze on Windows.
telegramdesktop/tdesktop/nightly • 0c00961 • 1 files, +3/-3
Switched Windows CI build from Debug to Release.
#tdesktop
Fixed swipe-next-channel gesture freeze on Windows.
telegramdesktop/tdesktop/nightly • 0c00961 • 1 files, +3/-3
Switched Windows CI build from Debug to Release.
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • 4898fbb • 2 files, +13/-2
Fixed swipe-next-channel gesture freeze on Windows.
#tdesktop
Fixed swipe-next-channel gesture freeze on Windows.
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • 80e798a • 2 files, +47/-2
Fixed swipe-next-channel gesture freeze on Windows.
#tdesktop
Fixed swipe-next-channel gesture freeze on Windows.
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • 8424c71 • 3 files, +48/-3
Fixed swipe-next-channel gesture freeze on Windows.
#tdesktop
Fixed swipe-next-channel gesture freeze on Windows.
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • 68eb633 • 3 files, +71/-3
Added reverse-over-scroll hypothesis pool (gesture + lib_ui DM).
#tdesktop
Added reverse-over-scroll hypothesis pool (gesture + lib_ui DM).
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • 806b744 • 3 files, +79/-3
Reverse-over-scroll hypothesis pool + H5 accumulator cap.
#tdesktop
Reverse-over-scroll hypothesis pool + H5 accumulator cap.
#tdesktop
🫡4
telegramdesktop/tdesktop/dev • c14efc2 • 1 files, +40/-28
Fix possible clamp contract violation.
Fixes #30925.
#tdesktop
Fix possible clamp contract violation.
Fixes #30925.
#tdesktop
🫡3
🫡3
telegramdesktop/tdesktop/dev • 8f1f399 • 1 files, +15/-1
Hide the main menu hit-area button from screen readers
The invisible hit-area stacked under the main menu toggle duplicates the
toggle's action but has no label, so in screen reader mode it became a
second, unnamed Tab stop that read out the raw Qt class chain. Give it no
accessible role so it is skipped by keyboard/screen-reader navigation,
while mouse clicks still open the menu.
#tdesktop
Hide the main menu hit-area button from screen readers
The invisible hit-area stacked under the main menu toggle duplicates the
toggle's action but has no label, so in screen reader mode it became a
second, unnamed Tab stop that read out the raw Qt class chain. Give it no
accessible role so it is skipped by keyboard/screen-reader navigation,
while mouse clicks still open the menu.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 04bfbfa • 1 files, +91/-0
Support screen reader focus and activate on country list rows
telegramdesktop/tdesktop/dev • ff355eb • 1 files, +4/-0
Focus chat list on launch in screen reader mode
Initial focus went to the unnamed Dialogs::Widget container, so NVDA
announced the raw Qt class chain. Focus the accessible chat list instead
so the list and its selected chat are announced.
#tdesktop
Support screen reader focus and activate on country list rows
telegramdesktop/tdesktop/dev • ff355eb • 1 files, +4/-0
Focus chat list on launch in screen reader mode
Initial focus went to the unnamed Dialogs::Widget container, so NVDA
announced the raw Qt class chain. Focus the accessible chat list instead
so the list and its selected chat are announced.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • ea2bb5b • 1 files, +5/-4
Migrate webpage timestamp links to wrapped URL format
#tdesktop
Migrate webpage timestamp links to wrapped URL format
#tdesktop
🫡3
🫡3
telegramdesktop/tdesktop/dev • 27f4158 • 1 files, +137/-2
Support screen reader focus and activate on language list rows
#tdesktop
Support screen reader focus and activate on language list rows
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • aeb3e6b • 4 files, +304/-0
Support screen reader focus and activate on message history rows
#tdesktop
Support screen reader focus and activate on message history rows
#tdesktop
🫡3