)]}'
{
  "commit": "36b18770737e52b0b504da38659dceb3964b4934",
  "tree": "bd86cd8ddfa9c417f912515174a1e178a8338fb5",
  "parents": [
    "e5f799a631060d7a6bb36262f7e6b51a7cf379f7"
  ],
  "author": {
    "name": "Renzo Olivares",
    "email": "rmolivares@renzo-olivares.dev",
    "time": "Tue Nov 11 10:44:19 2025 -0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue Nov 11 18:44:19 2025 +0000"
  },
  "message": "Listen to text spacing overrides on the web (#178081)\n\nOriginal PR/Discussion: https://github.com/flutter/flutter/pull/172915\n\n# Framework:\n* `EditableText`/`SelectableText`, applies\n`lineHeightScaleFactorOverride`, `wordSpacingOverride`, and\n`letterSpacingOverride` to it\u0027s `TextStyle` similarly to how we already\ndo for bold platform overrides. Note `SelectableText` is built on\n`EditableText` so it also applies these overrides.\n* `Text`, applies `lineHeightScaleFactorOverride`,\n`wordSpacingOverride`, and `letterSpacingOverride` to it\u0027s `TextStyle`\nsimilarly to how we already do for bold platform overrides.\n* Exposes line height override through\n`MediaQueryData.lineHeightScaleFactorOverride` and\n`maybeLineHeightScaleFactorOverrideOf(context)`.\n* Exposes letter spacing override through\n`MediaQueryData.letterSpacingOverride` and\n`maybeLetterSpacingOverrideOf(context)`.\n* Exposes word spacing override through\n`MediaQueryData.wordSpacingOverride` and\n`maybeWordSpacingOverrideOf(context)`.\n* Exposes paragraph spacing override through\n`MediaQueryData.paragraphSpacingOverride` and\n`maybeParagraphSpacingOverrideOf(context)`.\n* `MediaQuery.applyTextStyleOverrides()` \\\n`MediaQueryData.applyTextStyleOverrides()` to be able to reset/override\nthe text spacing settings on `MediaQueryData`.\n\n# Engine:\n* Introduces new members on `PlatformDispatcher` API that hold the text\nspacing properties that are overridden on the web.\n* We provide the `lineHeightScaleFactorOverride`,\n`letterSpacingOverride`, `wordSpacingOverride`, and\n`paragraphSpacingOverride` on the web by attaching a `ResizeObserver` to\nan off-screen hidden element, when its size changes we capture its text\nspacing CSS properties, and notify the framework through\n`onMetricsChanged`.\n\nFixes #142712\n\n\nhttps://github.com/user-attachments/assets/aaaa3e74-c232-4956-acd2-ae1a4487e415\n\n## Pre-launch Checklist\n\n- [x] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [x] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [x] I read and followed the [Flutter Style Guide], including [Features\nwe expect every widget to implement].\n- [x] I signed the [CLA].\n- [x] I listed at least one issue that this PR fixes in the description\nabove.\n- [x] I updated/added relevant documentation (doc comments with `///`).\n- [x] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [x] I followed the [breaking change policy] and added [Data Driven\nFixes] where supported.\n- [x] All existing and new tests are passing.\n\n---------\n\nCo-authored-by: Renzo Olivares \u003croliv@google.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "a799001c0108b37738f8c550beb26ab55822cb08",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/ui/platform_dispatcher.dart",
      "new_id": "9d7198065bd28be35817bb738f6bbd1700d4d621",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/ui/platform_dispatcher.dart"
    },
    {
      "type": "modify",
      "old_id": "8d4bba0bdbef8946407cd20c3a93c72a5ac94a8c",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/platform_dispatcher.dart",
      "new_id": "c6d53aa5daee29acbb1957a46dcb03e8596cd145",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/platform_dispatcher.dart"
    },
    {
      "type": "modify",
      "old_id": "c868219f4316662b820056c0717f41d96f032246",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/src/engine/platform_dispatcher.dart",
      "new_id": "09c1ec4a583af3caf25cac75d8b4f125fb21b053",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/src/engine/platform_dispatcher.dart"
    },
    {
      "type": "modify",
      "old_id": "0a1548c68a02fb2f068d17fd39322123e48c7448",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/src/engine/safe_browser_api.dart",
      "new_id": "fe818340c1376034f8be3e2b0d0c39f5ddccb313",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/src/engine/safe_browser_api.dart"
    },
    {
      "type": "modify",
      "old_id": "640d1994e4749d224e04d5a512a19af189558b4a",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/test/engine/platform_dispatcher/platform_dispatcher_test.dart",
      "new_id": "5392039ef1f98b0c5c1d865cd27a0f7b59ab12eb",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/test/engine/platform_dispatcher/platform_dispatcher_test.dart"
    },
    {
      "type": "modify",
      "old_id": "356b740eb9d33757853e46deab0dcbd132c622a2",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/painting/strut_style.dart",
      "new_id": "d5cfd970ce682a3dd85d2c1742964a2977b188ee",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/painting/strut_style.dart"
    },
    {
      "type": "modify",
      "old_id": "e8f4cc168b2a9a7660a523c8bfc8ffa3b437820d",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/widgets/basic.dart",
      "new_id": "a61dc7bb71ef31b148a7c234af5cd7db0c9afc30",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/widgets/basic.dart"
    },
    {
      "type": "modify",
      "old_id": "df986059e4536a5b0963e7f627898b9e96cb6d07",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/widgets/editable_text.dart",
      "new_id": "ea2fae6d59c05787c05baefcd26c22d691ddf20c",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/widgets/editable_text.dart"
    },
    {
      "type": "modify",
      "old_id": "f06659c818335ba0629ee337c92408f0ceb9d6a8",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/widgets/media_query.dart",
      "new_id": "1de12ba86f3a27f61c65694466dee2527c18787b",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/widgets/media_query.dart"
    },
    {
      "type": "modify",
      "old_id": "c62420469668af23c4eaa91a20bee4f549ce1ac4",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/widgets/text.dart",
      "new_id": "06d3f49ff9527a07a5cb30960b491fefeea11782",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/widgets/text.dart"
    },
    {
      "type": "modify",
      "old_id": "f28e179e9ecd2289c0c72ebd0878a396fdff836f",
      "old_mode": 33188,
      "old_path": "packages/flutter/test/cupertino/text_field_test.dart",
      "new_id": "9324f9728a53d960506ed5b673d7546c7b5ca7b4",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/cupertino/text_field_test.dart"
    },
    {
      "type": "modify",
      "old_id": "8bc89d0cc2b0831503397c71ed882b5dbde5c0fb",
      "old_mode": 33188,
      "old_path": "packages/flutter/test/widgets/editable_text_test.dart",
      "new_id": "206bd413b9a3efd2ec8236bf5e8adef377b57dbd",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/widgets/editable_text_test.dart"
    },
    {
      "type": "modify",
      "old_id": "1d98a4bfc64e78e6641dfb3da382b7677ad639c9",
      "old_mode": 33188,
      "old_path": "packages/flutter/test/widgets/media_query_test.dart",
      "new_id": "d2376a8de0091024a323db0d2d33a1ed14597204",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/widgets/media_query_test.dart"
    },
    {
      "type": "modify",
      "old_id": "7b924f4aa00b298282be33ffd2453d2c43a809c7",
      "old_mode": 33188,
      "old_path": "packages/flutter/test/widgets/selectable_text_test.dart",
      "new_id": "8f07048718598be236f655bf1ef109dd98ded70d",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/widgets/selectable_text_test.dart"
    },
    {
      "type": "modify",
      "old_id": "562dc17653f1abd71e45aed6d8a574658f4ebe7d",
      "old_mode": 33188,
      "old_path": "packages/flutter/test/widgets/text_test.dart",
      "new_id": "e694ae55aabf06660abe9ffc1cea7b745887da72",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/widgets/text_test.dart"
    },
    {
      "type": "modify",
      "old_id": "17ddfbc051df800b211e482c08dc7cd0e52ed20a",
      "old_mode": 33188,
      "old_path": "packages/flutter_test/lib/src/window.dart",
      "new_id": "d0e8b35397f8a4f4d64a59a140c410afb5674918",
      "new_mode": 33188,
      "new_path": "packages/flutter_test/lib/src/window.dart"
    }
  ]
}
