Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ftxui for openSUSE:Factory checked 
in at 2026-08-03 17:17:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ftxui (Old)
 and      /work/SRC/openSUSE:Factory/.ftxui.new.16738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ftxui"

Mon Aug  3 17:17:58 2026 rev:7 rq:1369177 version:7.0.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/ftxui/ftxui.changes      2026-07-15 
16:57:59.431789299 +0200
+++ /work/SRC/openSUSE:Factory/.ftxui.new.16738/ftxui.changes   2026-08-03 
17:18:08.056474883 +0200
@@ -1,0 +2,26 @@
+Mon Aug  3 07:23:28 UTC 2026 - Michael Vetter <[email protected]>
+
+- Update to 7.02:
+  Component:
+  * Bugfix: Fix high CPU usage (app and terminal emulator, e.g. tmux) caused 
by a
+    cursor position request/reply feedback loop redrawing the screen at ~60fps 
in
+    the non-alternate-screen modes. See #1302.
+  * Animation frames are now produced only when requested via
+    animation::RequestAnimationFrame() (e.g. by animation::Animator), as in
+    FTXUI 6. Receiving an event no longer implicitly triggers an animation
+    frame.
+  * Bugfix: App::PostEvent is now thread safe again, as documented. Since the
+    7.0.0 event loop rework it pushed into an unsynchronized buffer, racing 
with
+    the main loop when called from another thread.
+  * Bugfix: Fix unbounded memory growth in the event buffer. A receiver used
+    during terminal setup was kept for the whole App lifetime, retaining every
+    subsequent event (including every mouse move).
+  Dom:
+  * Performance: text computes its requirement once and renders only the
+    visible lines. This makes scrolling a large text inside a frame
+    significantly faster. See #1309.
+  * Performance: text selection now only visits and stores the selected line
+    range, instead of scanning and allocating one entry per line of the whole
+    text on every frame.
+
+-------------------------------------------------------------------

Old:
----
  v7.0.1.tar.gz

New:
----
  v7.0.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ftxui.spec ++++++
--- /var/tmp/diff_new_pack.4myZW8/_old  2026-08-03 17:18:10.800571532 +0200
+++ /var/tmp/diff_new_pack.4myZW8/_new  2026-08-03 17:18:10.804571672 +0200
@@ -18,7 +18,7 @@
 
 %define         c_lib libftxui7
 Name:           ftxui
-Version:        7.0.1
+Version:        7.0.2
 Release:        0
 Summary:        A C++ library for terminal based user interfaces
 License:        MIT

++++++ v7.0.1.tar.gz -> v7.0.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/.github/workflows/conan.yaml 
new/FTXUI-7.0.2/.github/workflows/conan.yaml
--- old/FTXUI-7.0.1/.github/workflows/conan.yaml        1970-01-01 
01:00:00.000000000 +0100
+++ new/FTXUI-7.0.2/.github/workflows/conan.yaml        2026-08-01 
17:33:05.000000000 +0200
@@ -0,0 +1,43 @@
+name: Conan
+
+on:
+  # On new commits to main:
+  push:
+    branches:
+      - main
+
+  # On pull requests:
+  pull_request:
+    branches:
+      - main
+
+jobs:
+  test_conan:
+    name: "Conan, ${{ matrix.os }}, shared=${{ matrix.shared }}"
+    strategy:
+      fail-fast: false
+      matrix:
+        os: [ubuntu-latest, macos-latest, windows-latest]
+        shared: ["False", "True"]
+
+    runs-on: ${{ matrix.os }}
+    steps:
+      - name: "Checkout repository"
+        uses: actions/checkout@v4
+
+      - name: "Setup Python"
+        uses: actions/setup-python@v5
+        with:
+          python-version: '3.x'
+
+      - name: "Install Conan"
+        run: pip install conan ninja
+
+      - name: "Detect Conan profile"
+        run: conan profile detect
+
+      - name: "conan create ."
+        run: >
+          conan create .
+          --build=missing
+          -o "&:shared=${{ matrix.shared }}"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/.github/workflows/shared_lib_build.yaml 
new/FTXUI-7.0.2/.github/workflows/shared_lib_build.yaml
--- old/FTXUI-7.0.1/.github/workflows/shared_lib_build.yaml     2026-07-14 
13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/.github/workflows/shared_lib_build.yaml     2026-08-01 
17:33:05.000000000 +0200
@@ -10,15 +10,20 @@
 
 jobs:
   build-shared:
-    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        os:
+          - ubuntu-latest
+          - macos-latest
+          - windows-latest
+    runs-on: ${{ matrix.os }}
     steps:
       - name: Checkout repository
         uses: actions/checkout@v4
 
       - name: Configure CMake
-        env:
-          CC: clang
-          CXX: clang++
+        shell: bash
         run: |
           cmake -B build \
             -DBUILD_SHARED_LIBS=ON \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/.gitignore new/FTXUI-7.0.2/.gitignore
--- old/FTXUI-7.0.1/.gitignore  2026-07-14 13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/.gitignore  2026-08-01 17:33:05.000000000 +0200
@@ -13,6 +13,7 @@
 !.gitignore
 !CHANGELOG.md
 !CMakeLists.txt
+!conanfile.py
 !LICENSE
 !README.md
 !GEMINI.md
@@ -84,6 +85,11 @@
 /subprojects/*
 !subprojects/*.wrap
 
+# test_package directory (Conan recipe self-test):
+!test_package/**/*.py
+!test_package/**/*.txt
+!test_package/**/*.cpp
+
 # tools directory:
 !tools/**/*.sh
 !tools/**/*.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/BUILD.bazel new/FTXUI-7.0.2/BUILD.bazel
--- old/FTXUI-7.0.1/BUILD.bazel 2026-07-14 13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/BUILD.bazel 2026-08-01 17:33:05.000000000 +0200
@@ -45,6 +45,7 @@
         "src/ftxui/screen/string_internal.hpp",
         "src/ftxui/screen/terminal.cpp",
         "src/ftxui/screen/util.hpp",
+        "src/ftxui/util/ref.cpp",
     ],
     hdrs = [
         "include/ftxui/screen/box.hpp",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/CHANGELOG.md new/FTXUI-7.0.2/CHANGELOG.md
--- old/FTXUI-7.0.1/CHANGELOG.md        2026-07-14 13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/CHANGELOG.md        2026-08-01 17:33:05.000000000 +0200
@@ -4,6 +4,32 @@
 Next
 ====
 
+7.0.2 (2026-08-01)
+------------------
+
+### Component
+- Bugfix: Fix high CPU usage (app and terminal emulator, e.g. tmux) caused by a
+  cursor position request/reply feedback loop redrawing the screen at ~60fps in
+  the non-alternate-screen modes. See #1302.
+- Animation frames are now produced only when requested via
+  `animation::RequestAnimationFrame()` (e.g. by `animation::Animator`), as in
+  FTXUI 6. Receiving an event no longer implicitly triggers an animation
+  frame.
+- Bugfix: `App::PostEvent` is now thread safe again, as documented. Since the
+  7.0.0 event loop rework it pushed into an unsynchronized buffer, racing with
+  the main loop when called from another thread.
+- Bugfix: Fix unbounded memory growth in the event buffer. A receiver used
+  during terminal setup was kept for the whole `App` lifetime, retaining every
+  subsequent event (including every mouse move).
+
+### Dom
+- Performance: `text` computes its requirement once and renders only the
+  visible lines. This makes scrolling a large text inside a `frame`
+  significantly faster. Thanks @patlefort. See #1309.
+- Performance: `text` selection now only visits and stores the selected line
+  range, instead of scanning and allocating one entry per line of the whole
+  text on every frame.
+
 7.0.1 (2026-07-14)
 ------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/CMakeLists.txt 
new/FTXUI-7.0.2/CMakeLists.txt
--- old/FTXUI-7.0.1/CMakeLists.txt      2026-07-14 13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/CMakeLists.txt      2026-08-01 17:33:05.000000000 +0200
@@ -30,7 +30,7 @@
 endif()
 project(ftxui
   LANGUAGES CXX
-  VERSION 7.0.1
+  VERSION 7.0.2
   DESCRIPTION "C++ Functional Terminal User Interface."
 )
 
@@ -49,6 +49,8 @@
   include/ftxui/screen/string.hpp
   include/ftxui/screen/surface.hpp
   include/ftxui/util/export.hpp
+  include/ftxui/util/ref.hpp
+  src/ftxui/util/ref.cpp
   src/ftxui/screen/box.cpp
   src/ftxui/screen/color.cpp
   src/ftxui/screen/color_info.cpp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/MODULE.bazel new/FTXUI-7.0.2/MODULE.bazel
--- old/FTXUI-7.0.1/MODULE.bazel        2026-07-14 13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/MODULE.bazel        2026-08-01 17:33:05.000000000 +0200
@@ -1,7 +1,7 @@
 # FTXUI module.
 module(
     name = "ftxui",
-    version = "7.0.1",
+    version = "7.0.2",
 )
 
 # Build dependencies.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/README.md new/FTXUI-7.0.2/README.md
--- old/FTXUI-7.0.1/README.md   2026-07-14 13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/README.md   2026-08-01 17:33:05.000000000 +0200
@@ -403,7 +403,7 @@
 - [tiles](https://github.com/tusharpm/tiles)
 - [todoman](https://github.com/aaleino/todoman)
 - [turing_cmd](https://github.com/DanArmor/turing_cmd)
-- [typing-speed-test](https://codeberg.org/ymcx/typing-speed-test)
+- [typing-speed-test](https://github.com/ymcx/typing-speed-test)
 - [vantage](https://github.com/gokulmaxi/vantage)
 - [x86-64 CPU Architecture Simulation](https://github.com/AnisBdz/CPU)
 - [C++ Process Manager](https://github.com/ondrejhonus/cpp_proc)
@@ -431,7 +431,7 @@
 include(FetchContent)
 FetchContent_Declare(ftxui
   GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui
-  GIT_TAG v7.0.1
+  GIT_TAG v7.0.2
 )
 FetchContent_MakeAvailable(ftxui)
 
@@ -452,7 +452,7 @@
 ```starlark
 bazel_dep(
     name = "ftxui",
-    version = "7.0.1",
+    version = "7.0.2",
 )
 ```
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/bazel/test/MODULE.bazel 
new/FTXUI-7.0.2/bazel/test/MODULE.bazel
--- old/FTXUI-7.0.1/bazel/test/MODULE.bazel     2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/bazel/test/MODULE.bazel     2026-08-01 17:33:05.000000000 
+0200
@@ -6,7 +6,7 @@
     version = "0.0.1",
 )
 
-bazel_dep(name = "ftxui", version = "7.0.1")
+bazel_dep(name = "ftxui", version = "7.0.2")
 bazel_dep(name = "rules_cc", version = "0.2.17")
 
 local_path_override(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/conanfile.py new/FTXUI-7.0.2/conanfile.py
--- old/FTXUI-7.0.1/conanfile.py        1970-01-01 01:00:00.000000000 +0100
+++ new/FTXUI-7.0.2/conanfile.py        2026-08-01 17:33:05.000000000 +0200
@@ -0,0 +1,101 @@
+import os
+import re
+
+from conan import ConanFile
+from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
+from conan.tools.files import copy, load, rmdir
+
+required_conan_version = ">=2.0.0"
+
+
+class FtxuiConan(ConanFile):
+    name = "ftxui"
+    description = "C++ Functional Terminal User Interface."
+    license = "MIT"
+    url = "https://github.com/ArthurSonzogni/FTXUI";
+    homepage = "https://github.com/ArthurSonzogni/FTXUI";
+    topics = ("terminal", "tui", "cli", "console", "functional")
+    package_type = "library"
+    settings = "os", "arch", "compiler", "build_type"
+    options = {
+        "shared": [True, False],
+        "fPIC": [True, False],
+    }
+    default_options = {
+        "shared": False,
+        "fPIC": True,
+    }
+
+    exports_sources = (
+        "CMakeLists.txt",
+        "cmake/*",
+        "include/*",
+        "src/*",
+        "ftxui.pc.in",
+        "LICENSE",
+        # CMakeLists.txt unconditionally add_subdirectory()s these two
+        # directories; each one's own CMakeLists.txt returns immediately
+        # when its FTXUI_BUILD_* option is off, so nothing else from
+        # examples/ or doc/ needs to be exported.
+        "examples/CMakeLists.txt",
+        "doc/CMakeLists.txt",
+    )
+
+    def set_version(self):
+        cmake_lists = load(self, os.path.join(self.recipe_folder, 
"CMakeLists.txt"))
+        match = re.search(r"project\(\s*ftxui.*?VERSION\s+(\S+)", cmake_lists, 
re.DOTALL)
+        self.version = match.group(1)
+
+    def config_options(self):
+        if self.settings.os == "Windows":
+            self.options.rm_safe("fPIC")
+
+    def configure(self):
+        if self.options.shared:
+            self.options.rm_safe("fPIC")
+
+    def layout(self):
+        cmake_layout(self, src_folder=".")
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        if self.settings.os == "Windows":
+            # Avoid the multi-config "Visual Studio" generator, which installs
+            # libraries into lib/<CONFIG>/ instead of lib/, where Conan expects
+            # them.
+            tc.generator = "Ninja"
+        tc.variables["BUILD_SHARED_LIBS"] = bool(self.options.shared)
+        tc.variables["FTXUI_BUILD_DOCS"] = False
+        tc.variables["FTXUI_BUILD_EXAMPLES"] = False
+        tc.variables["FTXUI_BUILD_MODULES"] = False
+        tc.variables["FTXUI_BUILD_TESTS"] = False
+        tc.variables["FTXUI_BUILD_TESTS_FUZZER"] = False
+        tc.variables["FTXUI_ENABLE_INSTALL"] = True
+        tc.variables["FTXUI_QUIET"] = True
+        tc.generate()
+
+    def build(self):
+        cmake = CMake(self)
+        cmake.configure()
+        cmake.build()
+
+    def package(self):
+        copy(self, "LICENSE", src=self.source_folder, 
dst=os.path.join(self.package_folder, "licenses"))
+        cmake = CMake(self)
+        cmake.install()
+        rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
+        rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
+
+    def package_info(self):
+        self.cpp_info.set_property("cmake_file_name", "ftxui")
+
+        self.cpp_info.components["screen"].set_property("cmake_target_name", 
"ftxui::screen")
+        self.cpp_info.components["screen"].libs = ["ftxui-screen"]
+
+        self.cpp_info.components["dom"].set_property("cmake_target_name", 
"ftxui::dom")
+        self.cpp_info.components["dom"].libs = ["ftxui-dom"]
+        self.cpp_info.components["dom"].requires = ["screen"]
+
+        
self.cpp_info.components["component"].set_property("cmake_target_name", 
"ftxui::component")
+        self.cpp_info.components["component"].libs = ["ftxui-component"]
+        self.cpp_info.components["component"].requires = ["dom"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/doc/cpp20-modules.md 
new/FTXUI-7.0.2/doc/cpp20-modules.md
--- old/FTXUI-7.0.1/doc/cpp20-modules.md        2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/doc/cpp20-modules.md        2026-08-01 17:33:05.000000000 
+0200
@@ -41,7 +41,7 @@
 int main() {
   App app = App::TerminalOutput();
   Component button = Button("Click me", app.ExitLoopClosure());
-  screen.Loop(button);
+  app.Loop(button);
   return 0;
 }
 ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/doc/getting-started.md 
new/FTXUI-7.0.2/doc/getting-started.md
--- old/FTXUI-7.0.1/doc/getting-started.md      2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/doc/getting-started.md      2026-08-01 17:33:05.000000000 
+0200
@@ -21,7 +21,7 @@
 include(FetchContent)
 FetchContent_Declare(ftxui
   GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui
-  GIT_TAG main # or a specific version like v7.0.1
+  GIT_TAG main # or a specific version like v7.0.2
 )
 FetchContent_MakeAvailable(ftxui)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/doc/installation_bazel.md 
new/FTXUI-7.0.2/doc/installation_bazel.md
--- old/FTXUI-7.0.1/doc/installation_bazel.md   2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/doc/installation_bazel.md   2026-08-01 17:33:05.000000000 
+0200
@@ -7,7 +7,7 @@
 
 **MODULE.bazel**
 ```starlark
-bazel_dep(name = "ftxui", version = "7.0.1")
+bazel_dep(name = "ftxui", version = "7.0.2")
 ```
 
 **BUILD.bazel**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/doc/installation_cmake.md 
new/FTXUI-7.0.2/doc/installation_cmake.md
--- old/FTXUI-7.0.1/doc/installation_cmake.md   2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/doc/installation_cmake.md   2026-08-01 17:33:05.000000000 
+0200
@@ -15,7 +15,7 @@
 
 FetchContent_Declare(ftxui
   GIT_REPOSITORY https://github.com/ArthurSonzogni/FTXUI
-  GIT_TAG v7.0.1  # Replace with a version, tag, or commit hash
+  GIT_TAG v7.0.2  # Replace with a version, tag, or commit hash
 )
 
 FetchContent_MakeAvailable(ftxui)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/doc/installation_conan.md 
new/FTXUI-7.0.2/doc/installation_conan.md
--- old/FTXUI-7.0.1/doc/installation_conan.md   2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/doc/installation_conan.md   2026-08-01 17:33:05.000000000 
+0200
@@ -26,6 +26,12 @@
 > team but by the community. The package maintainer appears to actively update 
 > it
 > to the latest releases. Many thanks to the maintainer for their work!
 
+FTXUI also ships its own `conanfile.py` at the root of the repository, tested
+by CI on every commit. It isn't published to Conan Center itself, but it can
+be used to consume FTXUI directly from a local checkout via
+`conan create .`, and could serve as the basis for an official Conan Center
+recipe.
+
 @todo If you are familiar with the process, please consider adding an 
"official" build script to Conan Center.
 This could be a GitHub Action that automatically updates Conan Center upon new 
releases.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/doc/installation_meson.md 
new/FTXUI-7.0.2/doc/installation_meson.md
--- old/FTXUI-7.0.1/doc/installation_meson.md   2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/doc/installation_meson.md   2026-08-01 17:33:05.000000000 
+0200
@@ -88,7 +88,7 @@
 ```ini
 [wrap-git]
 url = https://github.com/ArthurSonzogni/FTXUI.git
-revision = v7.0.1
+revision = v7.0.2
 
 [provide]
 ftxui-screen = ftxui_screen_dep
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/doc/installation_vcpkg.md 
new/FTXUI-7.0.2/doc/installation_vcpkg.md
--- old/FTXUI-7.0.1/doc/installation_vcpkg.md   2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/doc/installation_vcpkg.md   2026-08-01 17:33:05.000000000 
+0200
@@ -14,7 +14,7 @@
   "dependencies": [
     {
         "name": "ftxui",
-        "version>=": "7.0.1"
+        "version>=": "7.0.2"
     }
   ]
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/include/ftxui/component/event.hpp 
new/FTXUI-7.0.2/include/ftxui/component/event.hpp
--- old/FTXUI-7.0.1/include/ftxui/component/event.hpp   2026-07-14 
13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/include/ftxui/component/event.hpp   2026-08-01 
17:33:05.000000000 +0200
@@ -78,35 +78,153 @@
   static const Event PageDown;
 
   // --- Function keys ---
-  static const Event F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12;
+  // MSVC's dllexport/dllimport only applies correctly to the first
+  // declarator in a multi-name declaration, so these must be declared one
+  // per statement (see error C2487) when built as a Windows DLL.
+  static const Event F1;
+  static const Event F2;
+  static const Event F3;
+  static const Event F4;
+  static const Event F5;
+  static const Event F6;
+  static const Event F7;
+  static const Event F8;
+  static const Event F9;
+  static const Event F10;
+  static const Event F11;
+  static const Event F12;
 
   // --- Control keys ---
-  static const Event a, A, CtrlA, AltA, CtrlAltA;
-  static const Event b, B, CtrlB, AltB, CtrlAltB;
-  static const Event c, C, CtrlC, AltC, CtrlAltC;
-  static const Event d, D, CtrlD, AltD, CtrlAltD;
-  static const Event e, E, CtrlE, AltE, CtrlAltE;
-  static const Event f, F, CtrlF, AltF, CtrlAltF;
-  static const Event g, G, CtrlG, AltG, CtrlAltG;
-  static const Event h, H, CtrlH, AltH, CtrlAltH;
-  static const Event i, I, CtrlI, AltI, CtrlAltI;
-  static const Event j, J, CtrlJ, AltJ, CtrlAltJ;
-  static const Event k, K, CtrlK, AltK, CtrlAltK;
-  static const Event l, L, CtrlL, AltL, CtrlAltL;
-  static const Event m, M, CtrlM, AltM, CtrlAltM;
-  static const Event n, N, CtrlN, AltN, CtrlAltN;
-  static const Event o, O, CtrlO, AltO, CtrlAltO;
-  static const Event p, P, CtrlP, AltP, CtrlAltP;
-  static const Event q, Q, CtrlQ, AltQ, CtrlAltQ;
-  static const Event r, R, CtrlR, AltR, CtrlAltR;
-  static const Event s, S, CtrlS, AltS, CtrlAltS;
-  static const Event t, T, CtrlT, AltT, CtrlAltT;
-  static const Event u, U, CtrlU, AltU, CtrlAltU;
-  static const Event v, V, CtrlV, AltV, CtrlAltV;
-  static const Event w, W, CtrlW, AltW, CtrlAltW;
-  static const Event x, X, CtrlX, AltX, CtrlAltX;
-  static const Event y, Y, CtrlY, AltY, CtrlAltY;
-  static const Event z, Z, CtrlZ, AltZ, CtrlAltZ;
+  static const Event a;
+  static const Event A;
+  static const Event CtrlA;
+  static const Event AltA;
+  static const Event CtrlAltA;
+  static const Event b;
+  static const Event B;
+  static const Event CtrlB;
+  static const Event AltB;
+  static const Event CtrlAltB;
+  static const Event c;
+  static const Event C;
+  static const Event CtrlC;
+  static const Event AltC;
+  static const Event CtrlAltC;
+  static const Event d;
+  static const Event D;
+  static const Event CtrlD;
+  static const Event AltD;
+  static const Event CtrlAltD;
+  static const Event e;
+  static const Event E;
+  static const Event CtrlE;
+  static const Event AltE;
+  static const Event CtrlAltE;
+  static const Event f;
+  static const Event F;
+  static const Event CtrlF;
+  static const Event AltF;
+  static const Event CtrlAltF;
+  static const Event g;
+  static const Event G;
+  static const Event CtrlG;
+  static const Event AltG;
+  static const Event CtrlAltG;
+  static const Event h;
+  static const Event H;
+  static const Event CtrlH;
+  static const Event AltH;
+  static const Event CtrlAltH;
+  static const Event i;
+  static const Event I;
+  static const Event CtrlI;
+  static const Event AltI;
+  static const Event CtrlAltI;
+  static const Event j;
+  static const Event J;
+  static const Event CtrlJ;
+  static const Event AltJ;
+  static const Event CtrlAltJ;
+  static const Event k;
+  static const Event K;
+  static const Event CtrlK;
+  static const Event AltK;
+  static const Event CtrlAltK;
+  static const Event l;
+  static const Event L;
+  static const Event CtrlL;
+  static const Event AltL;
+  static const Event CtrlAltL;
+  static const Event m;
+  static const Event M;
+  static const Event CtrlM;
+  static const Event AltM;
+  static const Event CtrlAltM;
+  static const Event n;
+  static const Event N;
+  static const Event CtrlN;
+  static const Event AltN;
+  static const Event CtrlAltN;
+  static const Event o;
+  static const Event O;
+  static const Event CtrlO;
+  static const Event AltO;
+  static const Event CtrlAltO;
+  static const Event p;
+  static const Event P;
+  static const Event CtrlP;
+  static const Event AltP;
+  static const Event CtrlAltP;
+  static const Event q;
+  static const Event Q;
+  static const Event CtrlQ;
+  static const Event AltQ;
+  static const Event CtrlAltQ;
+  static const Event r;
+  static const Event R;
+  static const Event CtrlR;
+  static const Event AltR;
+  static const Event CtrlAltR;
+  static const Event s;
+  static const Event S;
+  static const Event CtrlS;
+  static const Event AltS;
+  static const Event CtrlAltS;
+  static const Event t;
+  static const Event T;
+  static const Event CtrlT;
+  static const Event AltT;
+  static const Event CtrlAltT;
+  static const Event u;
+  static const Event U;
+  static const Event CtrlU;
+  static const Event AltU;
+  static const Event CtrlAltU;
+  static const Event v;
+  static const Event V;
+  static const Event CtrlV;
+  static const Event AltV;
+  static const Event CtrlAltV;
+  static const Event w;
+  static const Event W;
+  static const Event CtrlW;
+  static const Event AltW;
+  static const Event CtrlAltW;
+  static const Event x;
+  static const Event X;
+  static const Event CtrlX;
+  static const Event AltX;
+  static const Event CtrlAltX;
+  static const Event y;
+  static const Event Y;
+  static const Event CtrlY;
+  static const Event AltY;
+  static const Event CtrlAltY;
+  static const Event z;
+  static const Event Z;
+  static const Event CtrlZ;
+  static const Event AltZ;
+  static const Event CtrlAltZ;
 
   // --- Custom ---
   static const Event Custom;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/include/ftxui/dom/node.hpp 
new/FTXUI-7.0.2/include/ftxui/dom/node.hpp
--- old/FTXUI-7.0.1/include/ftxui/dom/node.hpp  2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/include/ftxui/dom/node.hpp  2026-08-01 17:33:05.000000000 
+0200
@@ -84,7 +84,7 @@
   virtual void Reserved7();
   virtual void Reserved8();
 
-  friend void Render(Screen& screen, Node* node, Selection& selection);
+  friend FTXUI_EXPORT(DOM) void Render(Screen& screen, Node* node, Selection& 
selection);
 
  protected:
   Elements children_;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/src/ftxui/component/animation_test.cpp 
new/FTXUI-7.0.2/src/ftxui/component/animation_test.cpp
--- old/FTXUI-7.0.1/src/ftxui/component/animation_test.cpp      2026-07-14 
13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/src/ftxui/component/animation_test.cpp      2026-08-01 
17:33:05.000000000 +0200
@@ -3,10 +3,18 @@
 // the LICENSE file.
 
 #include <gtest/gtest.h>
+#include <chrono>      // for milliseconds
 #include <functional>  // for function
+#include <thread>      // for sleep_for
 #include <vector>      // for allocator, vector
 
 #include "ftxui/component/animation.hpp"  // for Function, BackIn, BackInOut, 
BackOut, BounceIn, BounceInOut, BounceOut, CircularIn, CircularInOut, 
CircularOut, CubicIn, CubicInOut, CubicOut, ElasticIn, ElasticInOut, 
ElasticOut, ExponentialIn, ExponentialInOut, ExponentialOut, Linear, 
QuadraticIn, QuadraticInOut, QuadraticOut, QuarticIn, QuarticInOut, QuarticOut, 
QuinticIn, QuinticInOut, QuinticOut, SineIn, SineInOut, SineOut
+#include "ftxui/component/app.hpp"        // for App
+#include "ftxui/component/component.hpp"  // for Make
+#include "ftxui/component/component_base.hpp"  // for ComponentBase
+#include "ftxui/component/event.hpp"           // for Event
+#include "ftxui/component/loop.hpp"            // for Loop
+#include "ftxui/dom/elements.hpp"              // for text
 
 namespace ftxui {
 
@@ -35,4 +43,61 @@
   }
 }
 
+namespace {
+
+class AnimationCounter : public ComponentBase {
+ public:
+  int count = 0;
+
+ private:
+  Element OnRender() override { return text(""); }
+  void OnAnimation(animation::Params& /*params*/) override { count++; }
+  bool OnEvent(Event event) override {
+    if (event == Event::Character('a')) {
+      animation::RequestAnimationFrame();
+      return true;
+    }
+    return false;
+  }
+};
+
+// Give the recurring AnimationTask (reposted every 15ms) time to become due,
+// then run the loop to execute it.
+void RunAnimationTask(Loop& loop) {
+  std::this_thread::sleep_for(std::chrono::milliseconds(20));
+  loop.RunOnce();
+}
+
+}  // namespace
+
+// OnAnimation must tick only when a frame was requested with
+// animation::RequestAnimationFrame(), typically by an Animator. In particular,
+// handling an event must not implicitly produce a tick: internal terminal
+// replies are events too, and animating on them caused the #1302 feedback
+// loop.
+TEST(AnimationTest, TicksOnlyWhenRequested) {
+  auto component = Make<AnimationCounter>();
+  auto screen = App::FixedSize(10, 1);
+  Loop loop(&screen, component);
+  loop.RunOnce();
+
+  // No request: the recurring AnimationTask is a no-op.
+  RunAnimationTask(loop);
+  EXPECT_EQ(component->count, 0);
+
+  // An event alone doesn't produce a tick.
+  screen.PostEvent(Event::Custom);
+  loop.RunOnce();
+  RunAnimationTask(loop);
+  EXPECT_EQ(component->count, 0);
+
+  // A component requesting a frame gets exactly one tick.
+  screen.PostEvent(Event::Character('a'));
+  loop.RunOnce();
+  RunAnimationTask(loop);
+  EXPECT_EQ(component->count, 1);
+  RunAnimationTask(loop);
+  EXPECT_EQ(component->count, 1);
+}
+
 }  // namespace ftxui
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/src/ftxui/component/app.cpp 
new/FTXUI-7.0.2/src/ftxui/component/app.cpp
--- old/FTXUI-7.0.1/src/ftxui/component/app.cpp 2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/src/ftxui/component/app.cpp 2026-08-01 17:33:05.000000000 
+0200
@@ -228,6 +228,7 @@
    private:
     void Send() {
       last_sent_time_ = std::chrono::steady_clock::now();
+      last_request_time_ = last_sent_time_;
       pending_request_ = true;
       send_();
     }
@@ -245,7 +246,6 @@
   ThrottledRequest cursor_position_request;
 
   MultiReceiverBuffer<Event> event_buffer;
-  std::unique_ptr<MultiReceiverBuffer<Event>::Receiver> setup_receiver;
   std::unique_ptr<MultiReceiverBuffer<Event>::Receiver> main_loop_receiver;
 
   Internal(App* app, AppDimension dimension, bool use_alternative_screen);
@@ -556,12 +556,10 @@
       use_alternative_screen_(use_alternative_screen),
       terminal_input_parser([&](Event event) {
         event_buffer.Push(std::move(event));
-        public_->RequestAnimationFrame();
       }),
       cursor_position_request(this, [this] {
         TerminalSend(DeviceStatusReport(DSRMode::kCursor));
       }) {
-  setup_receiver = event_buffer.CreateReceiver();
   main_loop_receiver = event_buffer.CreateReceiver();
 }
 
@@ -1182,6 +1180,10 @@
 
   // Wait for the cursor shape reply using the setup head.
   if (is_stdin_a_tty_ && is_stdout_a_tty_) {
+    // A receiver scoped to the setup: keeping one alive after setup would pin
+    // every subsequent event in the buffer, growing it for the whole app
+    // lifetime.
+    auto setup_receiver = event_buffer.CreateReceiver();
     auto start = std::chrono::steady_clock::now();
     bool terminal_capabilities_received = false;
     // Wait for the cursor shape reply using the setup head.
@@ -1532,8 +1534,9 @@
 }
 
 void App::PostEvent(Event event) {
-  internal_->event_buffer.Push(std::move(event));
-  RequestAnimationFrame();
+  // PostEvent is documented as thread safe: go through the mutex-protected
+  // task queue. The event_buffer is only safe to use from the main thread.
+  Post(Task(std::move(event)));
 }
 
 // static
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/src/ftxui/component/app_test.cpp 
new/FTXUI-7.0.2/src/ftxui/component/app_test.cpp
--- old/FTXUI-7.0.1/src/ftxui/component/app_test.cpp    2026-07-14 
13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/src/ftxui/component/app_test.cpp    2026-08-01 
17:33:05.000000000 +0200
@@ -2,8 +2,10 @@
 // Use of this source code is governed by the MIT license that can be found in
 // the LICENSE file.
 #include <gtest/gtest.h>  // for Test, TestInfo (ptr only), TEST, EXPECT_EQ, 
Message, TestPartResult
+#include <chrono>  // for steady_clock, seconds
 #include <csignal>  // for raise, SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, 
SIGTERM
 #include <ftxui/component/event.hpp>  // for Event, Event::Custom
+#include <thread>                     // for thread
 #include <tuple>                      // for _Swallow_assign, ignore
 
 #include "ftxui/component/app.hpp"
@@ -296,6 +298,36 @@
   EXPECT_EQ(called, 1);
 }
 
+// PostEvent is documented as thread safe. Posting from another thread while
+// the main loop runs must deliver every event, without data races.
+TEST(App, PostEventFromAnotherThread) {
+  int received = 0;
+  auto component =
+      CatchEvent(Renderer([] { return text(""); }), [&](const Event& event) {
+        if (event == Event::Custom) {
+          received++;
+        }
+        return true;
+      });
+  auto screen = App::FixedSize(10, 1);
+  Loop loop(&screen, component);
+
+  constexpr int kCount = 10000;
+  std::thread poster([&] {
+    for (int i = 0; i < kCount; ++i) {
+      screen.PostEvent(Event::Custom);
+    }
+  });
+
+  const auto deadline =
+      std::chrono::steady_clock::now() + std::chrono::seconds(10);
+  while (received < kCount && std::chrono::steady_clock::now() < deadline) {
+    loop.RunOnce();
+  }
+  poster.join();
+  EXPECT_EQ(received, kCount);
+}
+
 TEST(App, MoveAssignment) {
   auto screen = App::FixedSize(10, 10);
   auto screen2 = App::FixedSize(5, 5);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/src/ftxui/dom/selection_test.cpp 
new/FTXUI-7.0.2/src/ftxui/dom/selection_test.cpp
--- old/FTXUI-7.0.1/src/ftxui/dom/selection_test.cpp    2026-07-14 
13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/src/ftxui/dom/selection_test.cpp    2026-08-01 
17:33:05.000000000 +0200
@@ -152,6 +152,45 @@
   }
 }
 
+// The selection style must not persist on an element rendered again after the
+// selection was cleared. See #1309.
+TEST(SelectionTest, StyleClearedWhenSelectionCleared) {
+  auto element = text("Lorem ipsum dolor");
+
+  {
+    auto screen = App::FixedSize(20, 1);
+    Selection selection(2, 0, 9, 0);
+    Render(screen, element.get(), selection);
+    EXPECT_EQ(screen.CellAt(2, 0).inverted, true);
+  }
+
+  {
+    auto screen = App::FixedSize(20, 1);
+    Render(screen, element);
+    for (int i = 0; i < 20; i++) {
+      EXPECT_EQ(screen.CellAt(i, 0).inverted, false);
+    }
+  }
+}
+
+// A selection over a subset of the lines of a multi-line text must style and
+// extract exactly the selected rows.
+TEST(SelectionTest, MultiLineTextSelection) {
+  auto element = text("abc\ndef\nghi");
+  auto screen = App::FixedSize(3, 3);
+  Selection selection(1, 1, 2, 2);
+  Render(screen, element.get(), selection);
+
+  EXPECT_EQ(selection.GetParts(), "ef\nghi");
+  for (int y = 0; y < 3; y++) {
+    for (int x = 0; x < 3; x++) {
+      const bool selected = (y == 1 && x >= 1) || y == 2;
+      EXPECT_EQ(screen.CellAt(x, y).inverted, selected)
+          << "at (" << x << "," << y << ")";
+    }
+  }
+}
+
 TEST(SelectionTest, VBoxSelection) {
   auto element = vbox({
       text("Lorem ipsum dolor"),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/src/ftxui/dom/text.cpp 
new/FTXUI-7.0.2/src/ftxui/dom/text.cpp
--- old/FTXUI-7.0.1/src/ftxui/dom/text.cpp      2026-07-14 13:59:09.000000000 
+0200
+++ new/FTXUI-7.0.2/src/ftxui/dom/text.cpp      2026-08-01 17:33:05.000000000 
+0200
@@ -25,15 +25,10 @@
 
 class Text : public Node {
  public:
-  explicit Text(std::string_view text) : glyphs_(Utf8ToGlyphs(text)) {}
-
-  void ComputeRequirement() override {
+  explicit Text(std::string_view text) : glyphs_(Utf8ToGlyphs(text)) {
     int max_width = 0;
     int current_width = 0;
     int lines_count = 1;
-    has_selection_ = false;
-    selection_rows_.clear();
-    lines_offsets_.clear();
     lines_offsets_.push_back(0);
 
     for (size_t i = 0; i < glyphs_.size(); ++i) {
@@ -53,29 +48,38 @@
     requirement_.min_y = lines_count;
   }
 
+  void ComputeRequirement() override {
+    // The requirement was computed once in the constructor. This hook still
+    // runs before every frame; use it to clear the selection, which Select()
+    // re-populates while a selection is active.
+    selection_rows_.clear();
+  }
+
   void Select(Selection& selection) override {
-    if (Box::Intersection(selection.GetBox(), box_).IsEmpty()) {
+    const Box selection_box = Box::Intersection(selection.GetBox(), box_);
+    if (selection_box.IsEmpty()) {
       return;
     }
 
-    has_selection_ = true;
-    selection_rows_.assign(lines_offsets_.size() - 1, {-1, -1});
+    // Only store the selected line range. Sizing per line would allocate one
+    // entry per line of the whole text on every frame.
+    const size_t lines_count = lines_offsets_.size() - 1;
+    const size_t first = selection_box.y_min - box_.y_min;
+    const size_t last =
+        std::min<size_t>(selection_box.y_max - box_.y_min + 1, lines_count);
+    if (first >= last) {
+      return;
+    }
+    selection_first_line_ = first;
+    selection_rows_.assign(last - first, {-1, -1});
 
-    for (size_t i = 0; i < lines_offsets_.size() - 1; ++i) {
+    for (size_t i = first; i < last; ++i) {
       const int y = box_.y_min + (int)i;
-      if (y > box_.y_max) {
-        break;
-      }
-
       const Box row_box{box_.x_min, box_.x_max, y, y};
-      if (Box::Intersection(selection.GetBox(), row_box).IsEmpty()) {
-        continue;
-      }
-
       const Selection row_sel = selection.SaturateHorizontal(row_box);
       const int sel_start = row_sel.GetBox().x_min;
       const int sel_end = row_sel.GetBox().x_max;
-      selection_rows_[i] = {sel_start, sel_end};
+      selection_rows_[i - first] = {sel_start, sel_end};
 
       std::string part;
       int x = box_.x_min;
@@ -92,43 +96,46 @@
   }
 
   void Render(Screen& screen) override {
-    int x = box_.x_min;
-    int y = box_.y_min;
-    size_t line = 0;
-
-    if (y > box_.y_max) {
+    const auto visible_box = Box::Intersection(screen.stencil, box_);
+    if (visible_box.IsEmpty()) {
       return;
     }
 
-    for (const auto& cell : glyphs_) {
-      if (cell == "\n") {
-        y++;
-        x = box_.x_min;
-        line++;
-        if (y > box_.y_max) {
-          return;
+    int y = visible_box.y_min;
+
+    const size_t first_line = visible_box.y_min - box_.y_min;
+    const size_t last_line = std::min<size_t>(
+        visible_box.y_max - box_.y_min + 1, lines_offsets_.size() - 1);
+
+    for (size_t line = first_line; line < last_line; ++line, ++y) {
+      int x = box_.x_min;
+
+      for (auto glyph = glyphs_.begin() + lines_offsets_[line];
+           glyph != glyphs_.end() && *glyph != "\n"; ++glyph, ++x) {
+        if (x > box_.x_max) {
+          break;
         }
-        continue;
-      }
 
-      if (x <= box_.x_max) {
-        screen.CellAt(x, y).character = cell;
+        auto& cell = screen.CellAt(x, y);
+        cell.character = *glyph;
 
-        if (has_selection_ && line < selection_rows_.size()) {
-          const auto& [sel_start, sel_end] = selection_rows_[line];
+        const size_t sel_index = line - selection_first_line_;
+        if (sel_index < selection_rows_.size()) {
+          const auto& [sel_start, sel_end] = selection_rows_[sel_index];
           if (sel_start != -1 && x >= sel_start && x <= sel_end) {
-            screen.GetSelectionStyle()(screen.CellAt(x, y));
+            screen.GetSelectionStyle()(cell);
           }
         }
       }
-      x++;
     }
   }
 
  private:
   std::vector<std::string> glyphs_;
   std::vector<int> lines_offsets_;
-  bool has_selection_ = false;
+  // Selection state for the line range [selection_first_line_,
+  // selection_first_line_ + selection_rows_.size()).
+  size_t selection_first_line_ = 0;
   std::vector<std::pair<int, int>> selection_rows_;
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/src/ftxui/screen/meson.build 
new/FTXUI-7.0.2/src/ftxui/screen/meson.build
--- old/FTXUI-7.0.1/src/ftxui/screen/meson.build        2026-07-14 
13:59:09.000000000 +0200
+++ new/FTXUI-7.0.2/src/ftxui/screen/meson.build        2026-08-01 
17:33:05.000000000 +0200
@@ -6,4 +6,5 @@
   'screen.cpp',
   'string.cpp',
   'terminal.cpp',
+  '../util/ref.cpp',
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/src/ftxui/util/ref.cpp 
new/FTXUI-7.0.2/src/ftxui/util/ref.cpp
--- old/FTXUI-7.0.1/src/ftxui/util/ref.cpp      1970-01-01 01:00:00.000000000 
+0100
+++ new/FTXUI-7.0.2/src/ftxui/util/ref.cpp      2026-08-01 17:33:05.000000000 
+0200
@@ -0,0 +1,49 @@
+// Copyright 2026 Arthur Sonzogni. All rights reserved.
+// Use of this source code is governed by the MIT license that can be found in
+// the LICENSE file.
+#include "ftxui/util/ref.hpp"
+
+#include <utility>
+
+namespace ftxui {
+
+namespace {
+
+// StringRef, ConstStringRef, and ConstStringListRef are exported
+// (FTXUI_EXPORT(SCREEN)), but all of their member functions -- including
+// ones inherited from Ref<string>/ConstRef<string> -- are defined inline in
+// the header and never odr-used from within libftxui-screen itself. On
+// Windows, MSVC only emits (and therefore dllexports) an inline member
+// function into the DLL that first odr-uses it; otherwise consumers linking
+// against the dllimport declaration get an unresolved external symbol. This
+// function exists solely to force that instantiation.
+[[maybe_unused]] void ForceSymbolInstantiation() {
+  StringRef s = "a";
+  StringRef s2(s);
+  StringRef s3(std::move(s2));
+  s = s3;
+  s = std::move(s3);
+  (void)s();
+  (void)*s;
+  (void)s.operator->();
+
+  ConstStringRef c = "a";
+  ConstStringRef c2(c);
+  ConstStringRef c3(std::move(c2));
+  c = c3;
+  c = std::move(c3);
+  (void)c();
+  (void)*c;
+
+  ConstStringListRef l;
+  ConstStringListRef l2(l);
+  ConstStringListRef l3(std::move(l2));
+  l = l3;
+  l = std::move(l3);
+  (void)l.size();
+  (void)l[0];
+}
+
+}  // namespace
+
+}  // namespace ftxui
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/test_package/CMakeLists.txt 
new/FTXUI-7.0.2/test_package/CMakeLists.txt
--- old/FTXUI-7.0.1/test_package/CMakeLists.txt 1970-01-01 01:00:00.000000000 
+0100
+++ new/FTXUI-7.0.2/test_package/CMakeLists.txt 2026-08-01 17:33:05.000000000 
+0200
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 3.15)
+project(test_package CXX)
+
+find_package(ftxui CONFIG REQUIRED)
+
+add_executable(example src/example.cpp)
+target_compile_features(example PRIVATE cxx_std_17)
+target_link_libraries(example PRIVATE ftxui::component)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/test_package/conanfile.py 
new/FTXUI-7.0.2/test_package/conanfile.py
--- old/FTXUI-7.0.1/test_package/conanfile.py   1970-01-01 01:00:00.000000000 
+0100
+++ new/FTXUI-7.0.2/test_package/conanfile.py   2026-08-01 17:33:05.000000000 
+0200
@@ -0,0 +1,30 @@
+import os
+
+from conan import ConanFile
+from conan.tools.build import can_run
+from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
+
+
+class FtxuiTestConan(ConanFile):
+    settings = "os", "arch", "compiler", "build_type"
+    generators = "CMakeDeps"
+
+    def requirements(self):
+        self.requires(self.tested_reference_str)
+
+    def layout(self):
+        cmake_layout(self)
+
+    def generate(self):
+        tc = CMakeToolchain(self)
+        tc.generate()
+
+    def build(self):
+        cmake = CMake(self)
+        cmake.configure()
+        cmake.build()
+
+    def test(self):
+        if can_run(self):
+            bin_path = os.path.join(self.cpp.build.bindir, "example")
+            self.run(bin_path, env="conanrun")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/FTXUI-7.0.1/test_package/src/example.cpp 
new/FTXUI-7.0.2/test_package/src/example.cpp
--- old/FTXUI-7.0.1/test_package/src/example.cpp        1970-01-01 
01:00:00.000000000 +0100
+++ new/FTXUI-7.0.2/test_package/src/example.cpp        2026-08-01 
17:33:05.000000000 +0200
@@ -0,0 +1,16 @@
+#include <ftxui/dom/elements.hpp>
+#include <ftxui/screen/screen.hpp>
+#include <iostream>
+
+int main() {
+  using namespace ftxui;
+  auto document = hbox({
+      text(" Hello "),
+      text("FTXUI ") | bold | color(Color::Red),
+      text(" world! "),
+  });
+  auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
+  Render(screen, document);
+  std::cout << screen.ToString() << std::endl;
+  return 0;
+}

Reply via email to