)]}'
{
  "commit": "e35c679b201a02bbc685d92fb2eded8ead256635",
  "tree": "5a198b276f5105decfb3333092df39b9d7f2ec5a",
  "parents": [
    "e54b553982606145f88f6379839da208a2f55a06"
  ],
  "author": {
    "name": "hernan",
    "email": "hernan@rive.app",
    "time": "Fri Oct 30 07:55:11 2026 -0700"
  },
  "committer": {
    "name": "hernan",
    "email": "hernan@rive.app",
    "time": "Fri Oct 30 07:55:11 2026 -0700"
  },
  "message": "fix(text input): put the caret after pre-filled text on focus without a press (#15258)\n\n* fix(text input): put the caret after pre-filled text on focus without a press\n\nText set from outside (the file\u0027s own value, a data bind) leaves the caret\nat the start, and focus only moved it for Tab or selectAllOnFocus. A field\nfocused on a state\u0027s entry, from code or by accessibility showed the caret\nbefore its text, so typing went in front of it.\n\nFocus now puts the caret after the text unless the user placed it since the\ntext was last set from outside: a press places it before focusing, and keys,\ntyping and earlier focus keep it, so refocusing finds it where the user left\nit. Tab and selectAllOnFocus still select all.\n\nAdds RawTextInput::moveCursorToEnd, exported to Dart (rawTextMoveCursorToEnd)\nso the editor\u0027s TextInput behaves the same.\n\n* fix(text input): place the caret at the end before the font arrives\n\nA focus on a state\u0027s entry can land before the field\u0027s font is available,\nand moveCursorToEnd shaped the text to resolve the caret\u0027s line, which\ndereferences the missing font. Without a font, store the end position with\nits line unresolved and let update() resolve it once the font arrives.\n\n* fix(text input): select all before the font arrives\n\nTab or selectAllOnFocus can focus a field before its font is available, and\nselectAll shaped the text to resolve the selection\u0027s lines, dereferencing\nthe missing font. selectAll and moveCursorToEnd now share positionAtIndex,\nwhich leaves the line for update() to resolve when there is no font yet.\n\nAlso puts a test case header on one line, as clang-format 19 wants it.\n\n* test(capture): let the user place the caret the claimed press must keep\n\nThe nested capture test set the caret through the raw input, which no longer\ncounts as placed, so the claim\u0027s focus action moved it after the text. Place\nit with a key while focused instead: focus coming back keeps it, so the\ncaret still shows the input\u0027s press handling never ran.\n\nRive-Mono-Commit: 8199ff51213dda03caf4427c394ddcce0856db41\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f1199831cb55f3ad0c053ca2bcb236895a22cc48",
      "old_mode": 33188,
      "old_path": "include/rive/text/raw_text_input.hpp",
      "new_id": "2013e753e8d11d66a0659689ef3029ccc31a2a05",
      "new_mode": 33188,
      "new_path": "include/rive/text/raw_text_input.hpp"
    },
    {
      "type": "modify",
      "old_id": "8bf787cc3333f8f6fc1b7e193d5d88a0bdb32c83",
      "old_mode": 33188,
      "old_path": "include/rive/text/text_input.hpp",
      "new_id": "4ccd58484cc386c0b9493f1607e55e110cf84976",
      "new_mode": 33188,
      "new_path": "include/rive/text/text_input.hpp"
    },
    {
      "type": "modify",
      "old_id": "dc1f40470d623887ae3fe448db7f01afb51d371d",
      "old_mode": 33188,
      "old_path": "src/text/raw_text_input.cpp",
      "new_id": "5462352897b4f9652645e1922cf0a07c30d0c756",
      "new_mode": 33188,
      "new_path": "src/text/raw_text_input.cpp"
    },
    {
      "type": "modify",
      "old_id": "2ad5a606808c9cd287475b2fb327c76f21ae3686",
      "old_mode": 33188,
      "old_path": "src/text/text_input.cpp",
      "new_id": "f3d946cf1da5bf1812e402e3b177990bef6bde3e",
      "new_mode": 33188,
      "new_path": "src/text/text_input.cpp"
    },
    {
      "type": "modify",
      "old_id": "6a285db6bb01523c12edee13133eae99315b3342",
      "old_mode": 33188,
      "old_path": "tests/unit_tests/runtime/capture_listener_test.cpp",
      "new_id": "3b8a4892263c059d774dda3129e111dadf15d49a",
      "new_mode": 33188,
      "new_path": "tests/unit_tests/runtime/capture_listener_test.cpp"
    },
    {
      "type": "modify",
      "old_id": "ee3de76f87751ec4eb426dca8284e92b2f3588b2",
      "old_mode": 33188,
      "old_path": "tests/unit_tests/runtime/raw_text_input_test.cpp",
      "new_id": "0ddf3994926dfbe37f4f0dacd721b05082b893e0",
      "new_mode": 33188,
      "new_path": "tests/unit_tests/runtime/raw_text_input_test.cpp"
    },
    {
      "type": "modify",
      "old_id": "10c245a53a215dc58ac2b3ec9133d699794a0c94",
      "old_mode": 33188,
      "old_path": "tests/unit_tests/runtime/text_input_test.cpp",
      "new_id": "5778dcd2435d8ae592861e2486a4da57538720e1",
      "new_mode": 33188,
      "new_path": "tests/unit_tests/runtime/text_input_test.cpp"
    }
  ]
}
