TGX-Android/Telegram-X/main • d76e7b5 • 6 files, +82/-22
Upgrade Gradle to 9.6.0 + FCM to 25.1.0 + Upgrade dependencies + Set target SDK to Android 17
TGX-Android/Telegram-X/main • f5f283a • 1 files, +1/-1
Version bump to `1788`
#tgxandroid
Upgrade Gradle to 9.6.0 + FCM to 25.1.0 + Upgrade dependencies + Set target SDK to Android 17
TGX-Android/Telegram-X/main • f5f283a • 1 files, +1/-1
Version bump to `1788`
#tgxandroid
🫡3
🫡3
🫡2
telegramdesktop/tdesktop/dev • ab8d1ff • 3 files, +39/-46
Check GNotification option via base::options::lookup
#tdesktop
Check GNotification option via base::options::lookup
#tdesktop
🫡3
morethanwords/tweb/master • 9b5b04b • 17 files, +565/-309
perf(stickers): worker-clock free-run for play-once + blink-free first frame
Move infinite AND play-once looping into the rlottie worker's free-run clock,
keeping the UI thread out of the per-frame path for every boolean-loop player:
- rlottie.worker: free-run now honours a loop flag - true wraps at the bound,
false parks on the far bound and emits freeRunEnded so the player settles into
the same paused, end-of-play state command mode reaches via onLap's !loop branch.
- rlottiePlayer: onFreeRunEnded mirrors command-mode end-of-play (clears autoplay
so animationIntersector won't re-play on scroll/visibility ticks). Numeric loops
stay on the UI clock; mainLoopForwards/Backwards rewritten to count the lap via
onLap BEFORE choosing the wrap target, so the final lap parks on the last frame
and numeric loops actually terminate instead of looping forever.
- ensurePresented: re-present the staged frame, await the worker ack, then wait a
few of the tab's own paints (PRESENT_PAINT_WAITS) so dropping the underlay can't
flash a blank cell; append the placeholder canvas BEFORE firstFrame so appearance
listeners see it attached.
- customEmoji: groupPainted fires once the group is fully faded in (immediately
when fade is skipped) and clears placeholders synchronously, so the thumb never
lingers past full canvas coverage.
- apiFileManager: raise TGS_MAX_DECOMPRESSED_SIZE 1MB -> 8MB for large stickers.
- Add a Playwright lottie harness (e2e/, playwright.config, test:lottie) that
renders real .tgs in a browser to guard the no-blink first-frame path.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • f7fc2fc • 7 files, +2065/-0
chore: misc tooling, docs, and test leftovers
- .claude: add graphify + tweb-bugs skills, ignore .claude/bugs-cache
- compareVersion: comment noting single-operand iteration is intentional (no behavior change)
- tests/api: opt-in B->A burst-send harness test (TG_BURST=1, skipped by default)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
perf(stickers): worker-clock free-run for play-once + blink-free first frame
Move infinite AND play-once looping into the rlottie worker's free-run clock,
keeping the UI thread out of the per-frame path for every boolean-loop player:
- rlottie.worker: free-run now honours a loop flag - true wraps at the bound,
false parks on the far bound and emits freeRunEnded so the player settles into
the same paused, end-of-play state command mode reaches via onLap's !loop branch.
- rlottiePlayer: onFreeRunEnded mirrors command-mode end-of-play (clears autoplay
so animationIntersector won't re-play on scroll/visibility ticks). Numeric loops
stay on the UI clock; mainLoopForwards/Backwards rewritten to count the lap via
onLap BEFORE choosing the wrap target, so the final lap parks on the last frame
and numeric loops actually terminate instead of looping forever.
- ensurePresented: re-present the staged frame, await the worker ack, then wait a
few of the tab's own paints (PRESENT_PAINT_WAITS) so dropping the underlay can't
flash a blank cell; append the placeholder canvas BEFORE firstFrame so appearance
listeners see it attached.
- customEmoji: groupPainted fires once the group is fully faded in (immediately
when fade is skipped) and clears placeholders synchronously, so the thumb never
lingers past full canvas coverage.
- apiFileManager: raise TGS_MAX_DECOMPRESSED_SIZE 1MB -> 8MB for large stickers.
- Add a Playwright lottie harness (e2e/, playwright.config, test:lottie) that
renders real .tgs in a browser to guard the no-blink first-frame path.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • f7fc2fc • 7 files, +2065/-0
chore: misc tooling, docs, and test leftovers
- .claude: add graphify + tweb-bugs skills, ignore .claude/bugs-cache
- compareVersion: comment noting single-operand iteration is intentional (no behavior change)
- tests/api: opt-in B->A burst-send harness test (TG_BURST=1, skipped by default)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
🫡3
telegramdesktop/tdesktop/dev • 949f2a6 • 2 files, +111/-46
Expose the chat-folders strip as a list, not a tab control
Report the folders container with the List role (was PageTabList) and
each folder as a ListItem, which matches NVDA's native single-selection
list behaviour better than a tab control. TabListLayout opts in to
RpWidget::accessibilitySelectionList(), so the selection interface and
selected-item focus forwarding apply only to this strip, not to every
List-role widget.
- Locked (premium) folders are ordinary list items now: a ListItem is
clickable, so they can open the Premium box, and they are reachable
with the arrow keys like any other folder (they keep their locked
accessible name/description, and report selectable = false).
- Arrow keys move focus only and scroll the focused folder into view;
activation - switching the chat list, or opening the Premium box for a
locked folder - happens on Enter.
- The list has one roving Tab-stop driven by focus (setListTabStop): a
FocusIn on any folder - arrow, mouse or UIA SetFocus - makes it the
single Tab-stop, wired main menu -> folder -> edit, always demoting the
previous one; the active folder seeds it when nothing is focused. A
refresh re-establishes the Tab-stop on the folder that was focused (or
the active one), so rebuilding the list never leaves it without one. So
Tab/Shift+Tab leave the list the same way regardless of which folder is
focused, with no stray extra tab-stops.
#tdesktop
Expose the chat-folders strip as a list, not a tab control
Report the folders container with the List role (was PageTabList) and
each folder as a ListItem, which matches NVDA's native single-selection
list behaviour better than a tab control. TabListLayout opts in to
RpWidget::accessibilitySelectionList(), so the selection interface and
selected-item focus forwarding apply only to this strip, not to every
List-role widget.
- Locked (premium) folders are ordinary list items now: a ListItem is
clickable, so they can open the Premium box, and they are reachable
with the arrow keys like any other folder (they keep their locked
accessible name/description, and report selectable = false).
- Arrow keys move focus only and scroll the focused folder into view;
activation - switching the chat list, or opening the Premium box for a
locked folder - happens on Enter.
- The list has one roving Tab-stop driven by focus (setListTabStop): a
FocusIn on any folder - arrow, mouse or UIA SetFocus - makes it the
single Tab-stop, wired main menu -> folder -> edit, always demoting the
previous one; the active folder seeds it when nothing is focused. A
refresh re-establishes the Tab-stop on the folder that was focused (or
the active one), so rebuilding the list never leaves it without one. So
Tab/Shift+Tab leave the list the same way regardless of which folder is
focused, with no stray extra tab-stops.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • f43a2ca • 1 files, +1/-0
Add QScroller experimental option
telegramdesktop/tdesktop/dev • ded7588 • 1 files, +1/-1
Update lib_ui.
#tdesktop
Add QScroller experimental option
telegramdesktop/tdesktop/dev • ded7588 • 1 files, +1/-1
Update lib_ui.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 54b9a6b • 1 files, +12/-0
Restore Home/End navigation in the chat list
Home/End jumped to the first/last chat until InnerWidget's key handling
was rewritten from a switch into an if/else chain (in 'Extract chats list
accessibility, fix build'), which carried over only Up/Down and Page
Up/Down and dropped the Home/End cases.
Re-add them, skipping by the actual total row count (which selectSkip()
clamps) instead of the previous 1<<20 constant, so it lands on the first
or last row in both the default list and the filtered/search results.
#tdesktop
Restore Home/End navigation in the chat list
Home/End jumped to the first/last chat until InnerWidget's key handling
was rewritten from a switch into an if/else chain (in 'Extract chats list
accessibility, fix build'), which carried over only Up/Down and Page
Up/Down and dropped the Home/End cases.
Re-add them, skipping by the actual total row count (which selectSkip()
clamps) instead of the previous 1<<20 constant, so it lands on the first
or last row in both the default list and the filtered/search results.
#tdesktop
🫡4
telegramdesktop/tdesktop/dev • e4fa072 • 8 files, +21/-2
Added animated icons to media saving toasts.
telegramdesktop/tdesktop/dev • 145e580 • 43 files, +396/-90
Added animated icons to copy-to-clipboard toasts.
telegramdesktop/tdesktop/dev • bbcc5fc • 6 files, +27/-7
Added animated icons to mute and pin quick action toasts.
telegramdesktop/tdesktop/dev • 39cfbea • 2 files, +14/-3
Added animated icons to shared media and group call pin toasts.
telegramdesktop/tdesktop/dev • 8901dba • 3 files, +6/-0
Added animated icon to chat archiving toast.
telegramdesktop/tdesktop/dev • 6ecdee2 • 3 files, +4/-0
Added animated icon to premium purchased toast.
telegramdesktop/tdesktop/dev • 5ed4e43 • 4 files, +19/-5
Added animated icons to sticker set install and copy toasts.
telegramdesktop/tdesktop/dev • 8fa4ccb • 1 files, +24/-76
Added support for dragging files out of shared media.
telegramdesktop/tdesktop/dev • ff3eb41 • 3 files, +93/-49
Added file preview to shared media drag.
telegramdesktop/tdesktop/dev • cfc99e4 • 22 files, +501/-9
Added support of zoom in shared media for photos.
telegramdesktop/tdesktop/dev • c255a97 • 5 files, +49/-4
Added a shadow to the action buttons in the profile top bar.
telegramdesktop/tdesktop/dev • e1d63f9 • 1 files, +1/-1
Prevented Xcode 27 libc++ platform warning from breaking mac build.
telegramdesktop/tdesktop/dev • cb1d81f • 2 files, +25/-6
Added group emoji badge to emoji list widget.
telegramdesktop/tdesktop/dev • 84a4eee • 1 files, +14/-5
Added blur to poll attached media while loading.
#tdesktop
Added animated icons to media saving toasts.
telegramdesktop/tdesktop/dev • 145e580 • 43 files, +396/-90
Added animated icons to copy-to-clipboard toasts.
telegramdesktop/tdesktop/dev • bbcc5fc • 6 files, +27/-7
Added animated icons to mute and pin quick action toasts.
telegramdesktop/tdesktop/dev • 39cfbea • 2 files, +14/-3
Added animated icons to shared media and group call pin toasts.
telegramdesktop/tdesktop/dev • 8901dba • 3 files, +6/-0
Added animated icon to chat archiving toast.
telegramdesktop/tdesktop/dev • 6ecdee2 • 3 files, +4/-0
Added animated icon to premium purchased toast.
telegramdesktop/tdesktop/dev • 5ed4e43 • 4 files, +19/-5
Added animated icons to sticker set install and copy toasts.
telegramdesktop/tdesktop/dev • 8fa4ccb • 1 files, +24/-76
Added support for dragging files out of shared media.
telegramdesktop/tdesktop/dev • ff3eb41 • 3 files, +93/-49
Added file preview to shared media drag.
telegramdesktop/tdesktop/dev • cfc99e4 • 22 files, +501/-9
Added support of zoom in shared media for photos.
telegramdesktop/tdesktop/dev • c255a97 • 5 files, +49/-4
Added a shadow to the action buttons in the profile top bar.
telegramdesktop/tdesktop/dev • e1d63f9 • 1 files, +1/-1
Prevented Xcode 27 libc++ platform warning from breaking mac build.
telegramdesktop/tdesktop/dev • cb1d81f • 2 files, +25/-6
Added group emoji badge to emoji list widget.
telegramdesktop/tdesktop/dev • 84a4eee • 1 files, +14/-5
Added blur to poll attached media while loading.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 1c1a538 • 1 files, +15/-0
Fix accessible focus on filters refresh.
#tdesktop
Fix accessible focus on filters refresh.
#tdesktop
🫡3
UnigramDev/Unigram/develop • ff09a2f • 1 files, +1/-11
Undo style
UnigramDev/Unigram/develop • 9e4cc27 • 1 files, +5/-2
Fix null ref
UnigramDev/Unigram/develop • 9aa2550 • 3 files, +225/-17
Improve custom text selection
UnigramDev/Unigram/develop • b309941 • 6 files, +52/-27
Break MessageSelector reference cycle
UnigramDev/Unigram/develop • 703b2fd • 11 files, +199/-85
Fix playback service unsubscribe
UnigramDev/Unigram/develop • 1188ad4 • 1 files, +8/-2
Access violation guard
UnigramDev/Unigram/develop • 9d86f1b • 9 files, +738/-298
Break FormattedTextBlock into pieces, add MessageTextBlock, support expandable quotes
UnigramDev/Unigram/develop • 8e4368b • 1 files, +17/-8
Fix text selection manager events registration
UnigramDev/Unigram/develop • f3a06d3 • 2 files, +29/-0
Add missing interface methods
UnigramDev/Unigram/develop • 1d66e25 • 2 files, +43/-3
Handle custom text selection in chat history
UnigramDev/Unigram/develop • dbfee71 • 5 files, +42/-74
Support translating formatted text
UnigramDev/Unigram/develop • dc5dd1d • 1 files, +21/-186
Improve quotes in rich messages
UnigramDev/Unigram/develop • aab94f7 • 2 files, +13/-5
Use new text block in gallery
UnigramDev/Unigram/develop • 333b44b • 1 files, +4/-1
Disable interactions on album children
UnigramDev/Unigram/develop • 19714bb • 1 files, +4/-0
Don't stackalloc in debug to avoid recompiling every time
#unigram
Undo style
UnigramDev/Unigram/develop • 9e4cc27 • 1 files, +5/-2
Fix null ref
UnigramDev/Unigram/develop • 9aa2550 • 3 files, +225/-17
Improve custom text selection
UnigramDev/Unigram/develop • b309941 • 6 files, +52/-27
Break MessageSelector reference cycle
UnigramDev/Unigram/develop • 703b2fd • 11 files, +199/-85
Fix playback service unsubscribe
UnigramDev/Unigram/develop • 1188ad4 • 1 files, +8/-2
Access violation guard
UnigramDev/Unigram/develop • 9d86f1b • 9 files, +738/-298
Break FormattedTextBlock into pieces, add MessageTextBlock, support expandable quotes
UnigramDev/Unigram/develop • 8e4368b • 1 files, +17/-8
Fix text selection manager events registration
UnigramDev/Unigram/develop • f3a06d3 • 2 files, +29/-0
Add missing interface methods
UnigramDev/Unigram/develop • 1d66e25 • 2 files, +43/-3
Handle custom text selection in chat history
UnigramDev/Unigram/develop • dbfee71 • 5 files, +42/-74
Support translating formatted text
UnigramDev/Unigram/develop • dc5dd1d • 1 files, +21/-186
Improve quotes in rich messages
UnigramDev/Unigram/develop • aab94f7 • 2 files, +13/-5
Use new text block in gallery
UnigramDev/Unigram/develop • 333b44b • 1 files, +4/-1
Disable interactions on album children
UnigramDev/Unigram/develop • 19714bb • 1 files, +4/-0
Don't stackalloc in debug to avoid recompiling every time
#unigram
🫡2
TGX-Android/Telegram-X/main • cea514d • 37 files, +2744/-318
Add `marshmallow` flavor
TGX-Android/Telegram-X/main • 6c14410 • 1 files, +8/-1
Sync `.gitignore` with `translations.telegram.org`
#tgxandroid
Add `marshmallow` flavor
TGX-Android/Telegram-X/main • 6c14410 • 1 files, +8/-1
Sync `.gitignore` with `translations.telegram.org`
#tgxandroid
🫡3
morethanwords/tweb/master • ceb5160 • 11 files, +19/-48
Address AI Editor review findings
- Fix: removing a saved tone was blocked at the saved-tones limit — the
ViewTonePopup unsave path fell through to Promise.reject(), showing an
error toast instead of unsaving. Allow unsave regardless of capacity.
- Bound the composed-message cache (was an unbounded module-level Map).
- Drop duplicate AICOMPOSE_*/TONE_NOT_FOUND literals in ServerErrorType.
- customEmoji renderer: pass the callback to unobserveResize so it removes
only its own resize callback (the new array-based observeResize allows
multiple callbacks per element).
- Remove dead code: simulateDelay/DEBUG scaffolding in styleTab, autoHeight
duration/easing props, inputFieldMessage containerRef prop, and the
byte-identical unused viewTonePopup/limits.ts.
- wrapRichText: wrap the messageEntityDiffReplace case body in a block.
- getMessageEntityFromDocIdOrEmoji: use the @lib alias import.
- lang: "Used by %d persons" -> "people".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • ea7e91b • 300 files, +15781/-2628
Merge branch 'master' into feature/ai-editor
Resolved conflicts:
- Icon font (icons.ts, _variables/_style.scss, tgico.svg/ttf/woff): kept the
PR's regenerated set so the new AI icons work. Re-added master's
`privacypolicy` glyph to icons.ts/_variables.scss as a placeholder
(codepoint eab3) so the tree builds — it renders blank until the icon font
is regenerated (`pnpm generate-icons`) from the union of SVG sources
(privacypolicy.svg + the AI icons are both present in assets/icons/).
- inputFieldMessage.tsx: union of imports (PR's AI-editor imports + master's
getOverlayRoot).
Production build passes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 40846ea • 116 files, +6147/-1857
Merge pull request #665 from H7GhosT/feature/ai-editor
AI Editor
morethanwords/tweb/master • 3a0099f • 3 files, +3/-3
Merge pull request #676 from prdsrm/master
fix: update nodejs version #675
#webk
Address AI Editor review findings
- Fix: removing a saved tone was blocked at the saved-tones limit — the
ViewTonePopup unsave path fell through to Promise.reject(), showing an
error toast instead of unsaving. Allow unsave regardless of capacity.
- Bound the composed-message cache (was an unbounded module-level Map).
- Drop duplicate AICOMPOSE_*/TONE_NOT_FOUND literals in ServerErrorType.
- customEmoji renderer: pass the callback to unobserveResize so it removes
only its own resize callback (the new array-based observeResize allows
multiple callbacks per element).
- Remove dead code: simulateDelay/DEBUG scaffolding in styleTab, autoHeight
duration/easing props, inputFieldMessage containerRef prop, and the
byte-identical unused viewTonePopup/limits.ts.
- wrapRichText: wrap the messageEntityDiffReplace case body in a block.
- getMessageEntityFromDocIdOrEmoji: use the @lib alias import.
- lang: "Used by %d persons" -> "people".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • ea7e91b • 300 files, +15781/-2628
Merge branch 'master' into feature/ai-editor
Resolved conflicts:
- Icon font (icons.ts, _variables/_style.scss, tgico.svg/ttf/woff): kept the
PR's regenerated set so the new AI icons work. Re-added master's
`privacypolicy` glyph to icons.ts/_variables.scss as a placeholder
(codepoint eab3) so the tree builds — it renders blank until the icon font
is regenerated (`pnpm generate-icons`) from the union of SVG sources
(privacypolicy.svg + the AI icons are both present in assets/icons/).
- inputFieldMessage.tsx: union of imports (PR's AI-editor imports + master's
getOverlayRoot).
Production build passes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 40846ea • 116 files, +6147/-1857
Merge pull request #665 from H7GhosT/feature/ai-editor
AI Editor
morethanwords/tweb/master • 3a0099f • 3 files, +3/-3
Merge pull request #676 from prdsrm/master
fix: update nodejs version #675
#webk
🫡3🤨1
TGX-Android/Telegram-X/main • 3bb31c2 • 15 files, +245/-152
Migrate to `Firebase Installation ID` on Android 6 (Marshmallow) and higher
#tgxandroid
Migrate to `Firebase Installation ID` on Android 6 (Marshmallow) and higher
#tgxandroid
🫡3
morethanwords/tweb/master • 29e1272 • 6 files, +351/-350
Regenerate icons
morethanwords/tweb/master • 3853912 • 300 files, +934/-818
Build
#webk
Regenerate icons
morethanwords/tweb/master • 3853912 • 300 files, +934/-818
Build
#webk
🫡3
Ajaxy/telegram-tt/master • 2b0f5d9 • 3 files, +4/-4
12.0.31
Ajaxy/telegram-tt/master • 297afa4 • 1 files, +5/-2
Message List: Fix random scroll to bottom on open (#7055)
Ajaxy/telegram-tt/master • 5d4d237 • 1 files, +5/-1
Bot: Hide info immediately when starting new chat (#7056)
Ajaxy/telegram-tt/master • 1dc28e3 • 2 files, +11/-3
Polls: Add line break for poll action messages (#7051)
Ajaxy/telegram-tt/master • 81ee4be • 34 files, +1444/-873
Poll: Support more creation options (#7033)
Ajaxy/telegram-tt/master • 72557c2 • 6 files, +91/-115
Poll Answer Results: Redesign (#7057)
Ajaxy/telegram-tt/master • acebf11 • 1 files, +12/-0
Media Viewer: Fix closing MV on Esc (#7062)
Ajaxy/telegram-tt/master • 46fa678 • 10 files, +669/-0
Message: Support read metrics (#7060)
Ajaxy/telegram-tt/master • 7899098 • 1 files, +1/-0
Middle Column: Fix visibility after unlock (#7065)
Ajaxy/telegram-tt/master • 7f3f7ff • 4 files, +18/-10
Middle Header: Fix middle header panel styles (#7063)
Ajaxy/telegram-tt/master • d97d4da • 94 files, +207/-193
[Build]
#webz
12.0.31
Ajaxy/telegram-tt/master • 297afa4 • 1 files, +5/-2
Message List: Fix random scroll to bottom on open (#7055)
Ajaxy/telegram-tt/master • 5d4d237 • 1 files, +5/-1
Bot: Hide info immediately when starting new chat (#7056)
Ajaxy/telegram-tt/master • 1dc28e3 • 2 files, +11/-3
Polls: Add line break for poll action messages (#7051)
Ajaxy/telegram-tt/master • 81ee4be • 34 files, +1444/-873
Poll: Support more creation options (#7033)
Ajaxy/telegram-tt/master • 72557c2 • 6 files, +91/-115
Poll Answer Results: Redesign (#7057)
Ajaxy/telegram-tt/master • acebf11 • 1 files, +12/-0
Media Viewer: Fix closing MV on Esc (#7062)
Ajaxy/telegram-tt/master • 46fa678 • 10 files, +669/-0
Message: Support read metrics (#7060)
Ajaxy/telegram-tt/master • 7899098 • 1 files, +1/-0
Middle Column: Fix visibility after unlock (#7065)
Ajaxy/telegram-tt/master • 7f3f7ff • 4 files, +18/-10
Middle Header: Fix middle header panel styles (#7063)
Ajaxy/telegram-tt/master • d97d4da • 94 files, +207/-193
[Build]
#webz
🫡2
morethanwords/tweb/master • ef8c380 • 1 files, +2/-4
Merge branch 'feature/ai-editor' of github.com:H7GhosT/private-tweb into feature/ai-editor
morethanwords/tweb/master • 50bb529 • 300 files, +10771/-2264
Merge branch 'master' into feature/ai-editor
morethanwords/tweb/master • d88da87 • 1 files, +2/-5
Change comment
morethanwords/tweb/master • c381bf7 • 1 files, +2/-2
Prevent EmojiDocumentIcon rerendering when color changes
morethanwords/tweb/master • 1d339ba • 5 files, +125/-49
Make inner content scrollable
morethanwords/tweb/master • dc3cec8 • 1 files, +1/-5
Change arrow bg hover color
morethanwords/tweb/master • 8b0c60e • 1 files, +5/-1
Fix skeleton color on light theme
morethanwords/tweb/master • e4d5364 • 2 files, +21/-4
Recompose message when editing currently selected tone
morethanwords/tweb/master • 299f8ab • 1 files, +8/-7
Move create style button to the end of the list
morethanwords/tweb/master • 8fedf41 • 3 files, +22/-3
Fade original and result scrollables edges when scrolled
morethanwords/tweb/master • 1743807 • 3 files, +17/-2
Hide thumb when original is collapsed
morethanwords/tweb/master • 68c84cc • 3 files, +6/-6
Show created by you in view tone popup
morethanwords/tweb/master • 4d9db4b • 2 files, +21/-25
Fix formatting
morethanwords/tweb/master • d25787e • 4 files, +128/-21
Add send menu to the send button
morethanwords/tweb/master • d3d34f3 • 19 files, +880/-684
Remake the translation popup to be like the AI Editor popup
#webk
Merge branch 'feature/ai-editor' of github.com:H7GhosT/private-tweb into feature/ai-editor
morethanwords/tweb/master • 50bb529 • 300 files, +10771/-2264
Merge branch 'master' into feature/ai-editor
morethanwords/tweb/master • d88da87 • 1 files, +2/-5
Change comment
morethanwords/tweb/master • c381bf7 • 1 files, +2/-2
Prevent EmojiDocumentIcon rerendering when color changes
morethanwords/tweb/master • 1d339ba • 5 files, +125/-49
Make inner content scrollable
morethanwords/tweb/master • dc3cec8 • 1 files, +1/-5
Change arrow bg hover color
morethanwords/tweb/master • 8b0c60e • 1 files, +5/-1
Fix skeleton color on light theme
morethanwords/tweb/master • e4d5364 • 2 files, +21/-4
Recompose message when editing currently selected tone
morethanwords/tweb/master • 299f8ab • 1 files, +8/-7
Move create style button to the end of the list
morethanwords/tweb/master • 8fedf41 • 3 files, +22/-3
Fade original and result scrollables edges when scrolled
morethanwords/tweb/master • 1743807 • 3 files, +17/-2
Hide thumb when original is collapsed
morethanwords/tweb/master • 68c84cc • 3 files, +6/-6
Show created by you in view tone popup
morethanwords/tweb/master • 4d9db4b • 2 files, +21/-25
Fix formatting
morethanwords/tweb/master • d25787e • 4 files, +128/-21
Add send menu to the send button
morethanwords/tweb/master • d3d34f3 • 19 files, +880/-684
Remake the translation popup to be like the AI Editor popup
#webk
🫡3
morethanwords/tweb/master • 7f76e50 • 3 files, +17/-8
Rethrow error for copyTextToClipboard
morethanwords/tweb/master • 3dfc632 • 2 files, +0/-2
Remove unnecessary instance check
morethanwords/tweb/master • f15ee7b • 3 files, +16/-22
Small refactor. Fix Original's overlay fading when appearing first time
morethanwords/tweb/master • 0cf0e02 • 3 files, +69/-12
Add animation to scrollable's mask. Trigger onSizeChange when scrollable
is added to DOM.
morethanwords/tweb/master • 4281569 • 1 files, +7/-4
AI editor: don't leak composer's pending silent/schedule/effect into sends
getMessageSendingParams() carries the chat input's live silent/scheduleDate/
scheduleRepeatPeriod/effect (e.g. restored from a draft). The AI editor manages
these via its own send menu, so override them outright instead of merging —
otherwise a message sent from the editor inherits state the editor never showed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • f382c99 • 32 files, +1260/-777
Merge pull request #678 from H7GhosT/feature/ai-editor
Ai Editor improvements
#webk
Rethrow error for copyTextToClipboard
morethanwords/tweb/master • 3dfc632 • 2 files, +0/-2
Remove unnecessary instance check
morethanwords/tweb/master • f15ee7b • 3 files, +16/-22
Small refactor. Fix Original's overlay fading when appearing first time
morethanwords/tweb/master • 0cf0e02 • 3 files, +69/-12
Add animation to scrollable's mask. Trigger onSizeChange when scrollable
is added to DOM.
morethanwords/tweb/master • 4281569 • 1 files, +7/-4
AI editor: don't leak composer's pending silent/schedule/effect into sends
getMessageSendingParams() carries the chat input's live silent/scheduleDate/
scheduleRepeatPeriod/effect (e.g. restored from a draft). The AI editor manages
these via its own send menu, so override them outright instead of merging —
otherwise a message sent from the editor inherits state the editor never showed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • f382c99 • 32 files, +1260/-777
Merge pull request #678 from H7GhosT/feature/ai-editor
Ai Editor improvements
#webk
🫡3
morethanwords/tweb/master • e9ea7d0 • 1 files, +4/-0
Ignore clicks on pinned gifts when profile avatar is expanded
The pinned-gifts layer paints on top of the avatar and was only hidden
via opacity:0 when the header is expanded, which leaves it catching
clicks meant for the avatar underneath. Make it pointer-events:none in
the expanded state so clicks fall through to the avatar handler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 0b2e4a5 • 1 files, +9/-2
Fix player menus invisible in fullscreen
Playback-rate / quality / live menus open via ButtonMenuToggle, which
portals the menu to document.body. While the player wrapper is the
fullscreen element the browser paints only its subtree (top layer), so a
menu in document.body never shows. Mount the menu inside the fullscreen
element when the trigger lives there; falls back to the overlay root
otherwise.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • bc0fe18 • 3 files, +27/-19
Chat preview: apply per-chat theme to outgoing bubbles + fix bubble width
A preview Chat sets isPreview, so Chat.handleBackgrounds() short-circuits and
applyContainerTheme() never runs — the per-chat theme's outgoing-bubble vars
(--message-out-*) were missing on the container, so outgoing bubbles fell back
to the global :root palette ("theme only partially applied"). Apply the
resolved theme to the preview's chat container, re-firing on day/night toggle,
mirroring Chat._handleBackgrounds.
Also scope the bubbles scroll-area negative inset-inline rule to #column-center
so it no longer widens the preview popup's bubbles, and drop the now-redundant
inset-inline: 0 override in _chatPreview.scss.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 2010d64 • 3 files, +56/-0
Close global search and left-sidebar tabs when switching folders
Switching a chat folder now dismisses an open global search and closes any
stacked left-sidebar tabs, mirroring closeEverythingInside. Tabs close the
natural way (as if via the back arrow), so a tab that needs confirmation
still asks; if the user declines, the folder switch is cancelled. Both folder
UIs (the horizontal tabs and the vertical folders sidebar) funnel through
selectFolderByIndex, so a single hook covers both.
Adds SidebarSlider.closeAllTabsNaturally (close tabs top-down honoring each
tab's isConfirmationNeededOnClose) and AppSidebarLeft.closeEverythingInsideNaturally.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
Ignore clicks on pinned gifts when profile avatar is expanded
The pinned-gifts layer paints on top of the avatar and was only hidden
via opacity:0 when the header is expanded, which leaves it catching
clicks meant for the avatar underneath. Make it pointer-events:none in
the expanded state so clicks fall through to the avatar handler.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 0b2e4a5 • 1 files, +9/-2
Fix player menus invisible in fullscreen
Playback-rate / quality / live menus open via ButtonMenuToggle, which
portals the menu to document.body. While the player wrapper is the
fullscreen element the browser paints only its subtree (top layer), so a
menu in document.body never shows. Mount the menu inside the fullscreen
element when the trigger lives there; falls back to the overlay root
otherwise.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • bc0fe18 • 3 files, +27/-19
Chat preview: apply per-chat theme to outgoing bubbles + fix bubble width
A preview Chat sets isPreview, so Chat.handleBackgrounds() short-circuits and
applyContainerTheme() never runs — the per-chat theme's outgoing-bubble vars
(--message-out-*) were missing on the container, so outgoing bubbles fell back
to the global :root palette ("theme only partially applied"). Apply the
resolved theme to the preview's chat container, re-firing on day/night toggle,
mirroring Chat._handleBackgrounds.
Also scope the bubbles scroll-area negative inset-inline rule to #column-center
so it no longer widens the preview popup's bubbles, and drop the now-redundant
inset-inline: 0 override in _chatPreview.scss.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 2010d64 • 3 files, +56/-0
Close global search and left-sidebar tabs when switching folders
Switching a chat folder now dismisses an open global search and closes any
stacked left-sidebar tabs, mirroring closeEverythingInside. Tabs close the
natural way (as if via the back arrow), so a tab that needs confirmation
still asks; if the user declines, the folder switch is cancelled. Both folder
UIs (the horizontal tabs and the vertical folders sidebar) funnel through
selectFolderByIndex, so a single hook covers both.
Adds SidebarSlider.closeAllTabsNaturally (close tabs top-down honoring each
tab's isConfirmationNeededOnClose) and AppSidebarLeft.closeEverythingInsideNaturally.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
🫡3
morethanwords/tweb/master • d232274 • 1 files, +10/-12
Fix voice waveform dropped for non-standard (62-byte) waveforms
decodeWaveform read each 5-bit sample via DataView.getUint16, which
over-reads one byte past the needed one. For a 62-byte / 99-sample
waveform the last sample's read landed out of bounds, threw a
RangeError, and the catch returned an empty array — so the whole
waveform silently failed to render (flat line). Standard 63-byte
waveforms have a spare trailing byte and happened to work.
Read the two bytes manually with a bounds-guarded high byte instead;
output is bit-identical for 63-byte waveforms and now correct for
shorter ones. Also fixes the latent byteOffset bug in the old
new DataView(waveform.buffer) on view-backed arrays.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 29ce0b6 • 5 files, +106/-16
Pause video avatars when not visible (incl. right sidebar closed)
Video avatars kept animating while off-screen and, notably, while sitting in
the right sidebar after it was slid closed — the column is hidden with a
transform but stays mounted, so an IntersectionObserver never reports it as
hidden.
- avatarNew: register avatar <video>s with animationIntersector instead of an
ad-hoc IntersectionObserver (pauses on off-screen / blur / idle / lite-mode,
resumes when visible, survives Document-PiP). Covers both the chat-list /
topbar overlay and the profile-carousel / service-bubble path, which had no
visibility gating at all.
- animationIntersector: add toggleVideosUnder(element, paused) to pause+lock
(or resume) every registered video inside a container.
- sidebarRight: pause/resume the column's avatar videos on hide()/show(), since
the transform-based hide is invisible to the observer.
- peerProfileAvatars: self-suspend the tab-progress rAF loop when the active
video isn't advancing (restart on a captured 'play' / carousel nav), and free
the carousel's registered videos on cleanup so a video locked while the
sidebar was closed can't leak when the profile is torn down.
- createLoopingMutedVideo: set autoplay only after the start-frame seek so the
clip isn't briefly flashed from frame 0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 388a8b4 • 32 files, +1260/-777
Merge branch 'master' of https://github.com/morethanwords/tweb
#webk
Fix voice waveform dropped for non-standard (62-byte) waveforms
decodeWaveform read each 5-bit sample via DataView.getUint16, which
over-reads one byte past the needed one. For a 62-byte / 99-sample
waveform the last sample's read landed out of bounds, threw a
RangeError, and the catch returned an empty array — so the whole
waveform silently failed to render (flat line). Standard 63-byte
waveforms have a spare trailing byte and happened to work.
Read the two bytes manually with a bounds-guarded high byte instead;
output is bit-identical for 63-byte waveforms and now correct for
shorter ones. Also fixes the latent byteOffset bug in the old
new DataView(waveform.buffer) on view-backed arrays.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 29ce0b6 • 5 files, +106/-16
Pause video avatars when not visible (incl. right sidebar closed)
Video avatars kept animating while off-screen and, notably, while sitting in
the right sidebar after it was slid closed — the column is hidden with a
transform but stays mounted, so an IntersectionObserver never reports it as
hidden.
- avatarNew: register avatar <video>s with animationIntersector instead of an
ad-hoc IntersectionObserver (pauses on off-screen / blur / idle / lite-mode,
resumes when visible, survives Document-PiP). Covers both the chat-list /
topbar overlay and the profile-carousel / service-bubble path, which had no
visibility gating at all.
- animationIntersector: add toggleVideosUnder(element, paused) to pause+lock
(or resume) every registered video inside a container.
- sidebarRight: pause/resume the column's avatar videos on hide()/show(), since
the transform-based hide is invisible to the observer.
- peerProfileAvatars: self-suspend the tab-progress rAF loop when the active
video isn't advancing (restart on a captured 'play' / carousel nav), and free
the carousel's registered videos on cleanup so a video locked while the
sidebar was closed can't leak when the profile is torn down.
- createLoopingMutedVideo: set autoplay only after the start-frame seek so the
clip isn't briefly flashed from frame 0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 388a8b4 • 32 files, +1260/-777
Merge branch 'master' of https://github.com/morethanwords/tweb
#webk
🫡4
morethanwords/tweb/master • e8c9dca • 1 files, +2/-2
Skip post-send handling when no message was actually sent
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 64efd76 • 1 files, +1/-1
Wrap long bot verification text in peer profile
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 330ca41 • 1 files, +8/-1
Show profile Edit button for any admin, not only change_info
The Edit (pencil) button in group/channel info was gated solely on the
change_info right, so an admin who could manage members/permissions/admins
but lacked change_info couldn't reach the edit screen — even though that
screen already gates each section on its own rights and merely locks the
name field when change_info is missing.
Mirror tdesktop's EditPeerInfoBox::Available: show the button to any admin
(channel: just_admin || change_info, excluding monoforums; basic group:
change_info || change_permissions).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
Skip post-send handling when no message was actually sent
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 64efd76 • 1 files, +1/-1
Wrap long bot verification text in peer profile
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
morethanwords/tweb/master • 330ca41 • 1 files, +8/-1
Show profile Edit button for any admin, not only change_info
The Edit (pencil) button in group/channel info was gated solely on the
change_info right, so an admin who could manage members/permissions/admins
but lacked change_info couldn't reach the edit screen — even though that
screen already gates each section on its own rights and merely locks the
name field when change_info is missing.
Mirror tdesktop's EditPeerInfoBox::Available: show the button to any admin
(channel: just_admin || change_info, excluding monoforums; basic group:
change_info || change_permissions).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#webk
🫡4💅1