From 605697ecda2e0c9da05349658a347f0dfb156da6 Mon Sep 17 00:00:00 2001 From: Frederik St-Onge Date: Wed, 4 Feb 2026 09:16:47 -0500 Subject: [PATCH 1/5] Update packages --- example/pubspec.lock | 101 ++++++++++----------- example/pubspec.yaml | 2 +- example2/pubspec.lock | 101 ++++++++++----------- example2/pubspec.yaml | 2 +- pubspec.lock | 202 +++++++++++++++++++++++------------------- pubspec.yaml | 2 +- 6 files changed, 214 insertions(+), 196 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index ff50e45..d50465c 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,58 +5,58 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.13.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.1" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.8" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.3" flutter: dependency: "direct main" description: flutter @@ -66,10 +66,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "6.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -79,134 +79,135 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.2" lints: dependency: transitive description: name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "6.1.0" matcher: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.17.0" path: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.7" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "15.0.2" sdks: - dart: ">=3.2.0-0 <4.0.0" + dart: ">=3.8.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 0c8923e..dab0746 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^3.0.0 + flutter_lints: ^6.0.0 flutter: uses-material-design: true diff --git a/example2/pubspec.lock b/example2/pubspec.lock index ff50e45..d50465c 100644 --- a/example2/pubspec.lock +++ b/example2/pubspec.lock @@ -5,58 +5,58 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.13.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.1" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.8" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.3" flutter: dependency: "direct main" description: flutter @@ -66,10 +66,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "6.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -79,134 +79,135 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.2" lints: dependency: transitive description: name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "6.1.0" matcher: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.17.0" path: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.7" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "15.0.2" sdks: - dart: ">=3.2.0-0 <4.0.0" + dart: ">=3.8.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/example2/pubspec.yaml b/example2/pubspec.yaml index 06ce89e..68eb145 100644 --- a/example2/pubspec.yaml +++ b/example2/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^3.0.0 + flutter_lints: ^6.0.0 flutter: uses-material-design: true diff --git a/pubspec.lock b/pubspec.lock index 1a13275..d68bab8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,170 +5,170 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "36a321c3d2cbe01cbcb3540a87b8843846e0206df3e691fa7b23e19e78de6d49" + sha256: "796d97d925add7ffcdf5595f33a2066a6e3cee97971e6dbef09b76b7880fd760" url: "https://pub.dev" source: hosted - version: "65.0.0" + version: "94.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: dfe03b90ec022450e22513b5e5ca1f01c0c01de9c3fba2f7fd233cb57a6b9a07 + sha256: "9c8ebb304d72c0a0c8764344627529d9503fc83d7d73e43ed727dc532f822e4b" url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "10.0.2" args: dependency: "direct main" description: name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.7.0" async: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.13.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" collection: dependency: "direct main" description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.1" convert: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" coverage: dependency: transitive description: name: coverage - sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" url: "https://pub.dev" source: hosted - version: "1.6.4" + version: "1.15.0" crypto: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.7" file: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" frontend_server_client: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" glob: dependency: transitive description: name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" http_multi_server: dependency: transitive description: name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.2" io: dependency: transitive description: name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b url: "https://pub.dev" source: hosted - version: "1.0.4" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" + version: "1.0.5" lints: dependency: "direct dev" description: name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "6.1.0" logging: dependency: transitive description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" matcher: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.18" meta: dependency: "direct main" description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "9f29b9bcc8ee287b1a31e0d01be0eae99a930dbffdaecf04b3f3d82a969f296f" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.18.1" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "2.0.0" node_preamble: dependency: transitive description: @@ -181,34 +181,34 @@ packages: dependency: transitive description: name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" path: dependency: "direct main" description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.1" pool: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" url: "https://pub.dev" source: hosted - version: "1.5.1" + version: "1.5.2" pub_semver: dependency: transitive description: name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" recase: dependency: "direct main" description: @@ -221,10 +221,10 @@ packages: dependency: transitive description: name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.2" shelf_packages_handler: dependency: transitive description: @@ -237,130 +237,146 @@ packages: dependency: transitive description: name: shelf_static - sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.3" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "3.0.0" source_map_stack_trace: dependency: transitive description: name: source_map_stack_trace - sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" source_maps: dependency: transitive description: name: source_maps - sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" url: "https://pub.dev" source: hosted - version: "0.10.12" + version: "0.10.13" source_span: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test: dependency: "direct dev" description: name: test - sha256: d983a57c33dde6d44b1fb8635f67c91f4b41d26cf227c147963affa97d63563d + sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" url: "https://pub.dev" source: hosted - version: "1.24.8" + version: "1.29.0" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.9" test_core: dependency: transitive description: name: test_core - sha256: "2f866bf4b20c11327ac166ee6036bddafb7fe9e35505ff8324f788e66913f967" + sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" url: "https://pub.dev" source: hosted - version: "0.5.8" + version: "0.6.15" typed_data: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" vm_service: dependency: transitive description: name: vm_service - sha256: a13d5503b4facefc515c8c587ce3cf69577a7b064a9f1220e005449cf1f64aad + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" url: "https://pub.dev" source: hosted - version: "12.0.0" + version: "15.0.2" watcher: dependency: transitive description: name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.0.1" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "3.0.3" webkit_inspection_protocol: dependency: transitive description: @@ -373,9 +389,9 @@ packages: dependency: transitive description: name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" sdks: - dart: ">=3.0.0 <4.0.0" + dart: ">=3.9.0 <4.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index e566ff4..c137881 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: recase: ^4.1.0 dev_dependencies: - lints: ^3.0.0 + lints: ^6.1.0 test: ^1.21.0 executables: From 19ccb303ec500a0e89069e0964d45c835162dfcd Mon Sep 17 00:00:00 2001 From: Frederik St-Onge Date: Wed, 4 Feb 2026 09:18:58 -0500 Subject: [PATCH 2/5] Update versions --- example/pubspec.lock | 2 +- example/pubspec.yaml | 2 +- example2/pubspec.lock | 2 +- example2/pubspec.yaml | 2 +- pubspec.lock | 2 +- pubspec.yaml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index d50465c..928d8fb 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -209,5 +209,5 @@ packages: source: hosted version: "15.0.2" sdks: - dart: ">=3.8.0 <4.0.0" + dart: ">=3.10.0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index dab0746..d608ddd 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0+1 environment: - sdk: ">=2.19.2 <4.0.0" + sdk: ">=3.10.0 <4.0.0" dependencies: flutter: diff --git a/example2/pubspec.lock b/example2/pubspec.lock index d50465c..928d8fb 100644 --- a/example2/pubspec.lock +++ b/example2/pubspec.lock @@ -209,5 +209,5 @@ packages: source: hosted version: "15.0.2" sdks: - dart: ">=3.8.0 <4.0.0" + dart: ">=3.10.0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/example2/pubspec.yaml b/example2/pubspec.yaml index 68eb145..9f221ac 100644 --- a/example2/pubspec.yaml +++ b/example2/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0+1 environment: - sdk: ">=2.19.2 <4.0.0" + sdk: ">=3.10.0 <4.0.0" dependencies: flutter: diff --git a/pubspec.lock b/pubspec.lock index d68bab8..d0cd12b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -394,4 +394,4 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.9.0 <4.0.0" + dart: ">=3.10.0 <4.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index c137881..fdf8e1f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,10 +1,10 @@ name: figma2flutter description: This package converts Tokens Studio for Figma json exports into Flutter code. -version: 0.3.1-alpha +version: 0.4.0-alpha repository: https://github.com/mark-nicepants/figma2flutter environment: - sdk: ">=2.17.0 <4.0.0" + sdk: ">=3.10.0 <4.0.0" dependencies: args: ^2.3.1 From 0fb54ca00201ead6bb21e3ad1b746853a4528198 Mon Sep 17 00:00:00 2001 From: Frederik St-Onge Date: Wed, 4 Feb 2026 09:22:18 -0500 Subject: [PATCH 3/5] Update example --- example/.gitignore | 5 +- example/.metadata | 34 ++-- example/analysis_options.yaml | 3 +- example/android/.gitignore | 3 +- example/android/app/build.gradle | 71 -------- example/android/app/build.gradle.kts | 44 +++++ .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 17 +- .../com/example/example/MainActivity.kt | 3 +- .../app/src/profile/AndroidManifest.xml | 3 +- example/android/build.gradle | 31 ---- example/android/build.gradle.kts | 24 +++ example/android/gradle.properties | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- example/android/settings.gradle | 11 -- example/android/settings.gradle.kts | 26 +++ example/ios/Flutter/AppFrameworkInfo.plist | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 34 +++- example/ios/Runner/AppDelegate.swift | 4 +- example/ios/Runner/Info.plist | 2 - example/ios/RunnerTests/RunnerTests.swift | 12 ++ example/linux/CMakeLists.txt | 30 ++-- example/linux/runner/CMakeLists.txt | 26 +++ example/linux/{ => runner}/main.cc | 0 example/linux/{ => runner}/my_application.cc | 64 +++++-- example/linux/{ => runner}/my_application.h | 5 +- .../macos/Runner.xcodeproj/project.pbxproj | 164 +++++++++++++++++- .../xcshareddata/xcschemes/Runner.xcscheme | 32 +++- example/macos/Runner/AppDelegate.swift | 6 +- example/macos/Runner/MainFlutterWindow.swift | 2 +- example/macos/RunnerTests/RunnerTests.swift | 12 ++ example/pubspec.lock | 2 +- example/pubspec.yaml | 36 +++- example/web/index.html | 25 +-- example/windows/CMakeLists.txt | 9 +- example/windows/flutter/CMakeLists.txt | 7 +- example/windows/runner/flutter_window.cpp | 5 + example/windows/runner/runner.exe.manifest | 6 - example/windows/runner/utils.cpp | 9 +- example/windows/runner/win32_window.cpp | 2 +- example/windows/runner/win32_window.h | 2 +- 41 files changed, 548 insertions(+), 233 deletions(-) delete mode 100644 example/android/app/build.gradle create mode 100644 example/android/app/build.gradle.kts delete mode 100644 example/android/build.gradle create mode 100644 example/android/build.gradle.kts delete mode 100644 example/android/settings.gradle create mode 100644 example/android/settings.gradle.kts create mode 100644 example/ios/RunnerTests/RunnerTests.swift create mode 100644 example/linux/runner/CMakeLists.txt rename example/linux/{ => runner}/main.cc (100%) rename example/linux/{ => runner}/my_application.cc (58%) rename example/linux/{ => runner}/my_application.h (70%) create mode 100644 example/macos/RunnerTests/RunnerTests.swift diff --git a/example/.gitignore b/example/.gitignore index 24476c5..3820a95 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -5,9 +5,11 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ migrate_working_dir/ # IntelliJ related @@ -25,12 +27,11 @@ migrate_working_dir/ **/doc/api/ **/ios/Flutter/.last_build_id .dart_tool/ -.flutter-plugins .flutter-plugins-dependencies -.packages .pub-cache/ .pub/ /build/ +/coverage/ # Symbolication related app.*.symbols diff --git a/example/.metadata b/example/.metadata index 8e89d4d..08c2478 100644 --- a/example/.metadata +++ b/example/.metadata @@ -1,11 +1,11 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled. +# This file should be version controlled and should not be manually edited. version: - revision: 9944297138845a94256f1cf37beb88ff9a8e811a - channel: stable + revision: "3b62efc2a3da49882f43c372e0bc53daef7295a6" + channel: "stable" project_type: app @@ -13,26 +13,26 @@ project_type: app migration: platforms: - platform: root - create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a - base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a + create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 + base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - platform: android - create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a - base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a + create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 + base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - platform: ios - create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a - base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a + create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 + base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - platform: linux - create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a - base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a + create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 + base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - platform: macos - create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a - base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a + create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 + base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - platform: web - create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a - base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a + create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 + base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 - platform: windows - create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a - base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a + create_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 + base_revision: 3b62efc2a3da49882f43c372e0bc53daef7295a6 # User provided section diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml index 61b6c4d..0d29021 100644 --- a/example/analysis_options.yaml +++ b/example/analysis_options.yaml @@ -13,8 +13,7 @@ linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` # included above or to enable additional rules. A list of all available lints - # and their documentation is published at - # https://dart-lang.github.io/linter/lints/index.html. + # and their documentation is published at https://dart.dev/lints. # # Instead of disabling a lint rule for the entire project in the # section below, it can also be suppressed for a single line of code diff --git a/example/android/.gitignore b/example/android/.gitignore index 6f56801..be3943c 100644 --- a/example/android/.gitignore +++ b/example/android/.gitignore @@ -5,9 +5,10 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +# See https://flutter.dev/to/reference-keystore key.properties **/*.keystore **/*.jks diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle deleted file mode 100644 index b52183a..0000000 --- a/example/android/app/build.gradle +++ /dev/null @@ -1,71 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion flutter.compileSdkVersion - ndkVersion flutter.ndkVersion - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.example" - // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -} diff --git a/example/android/app/build.gradle.kts b/example/android/app/build.gradle.kts new file mode 100644 index 0000000..c3d837e --- /dev/null +++ b/example/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.example" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml index 45d523a..399f698 100644 --- a/example/android/app/src/debug/AndroidManifest.xml +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,4 @@ - + + + + + + + diff --git a/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt index e793a00..ac81bae 100644 --- a/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt +++ b/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -2,5 +2,4 @@ package com.example.example import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() { -} +class MainActivity : FlutterActivity() diff --git a/example/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml index 45d523a..399f698 100644 --- a/example/android/app/src/profile/AndroidManifest.xml +++ b/example/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,4 @@ - + - + @@ -31,29 +31,8 @@ example - - - - - + diff --git a/example/windows/CMakeLists.txt b/example/windows/CMakeLists.txt index c027074..d960948 100644 --- a/example/windows/CMakeLists.txt +++ b/example/windows/CMakeLists.txt @@ -8,7 +8,7 @@ set(BINARY_NAME "example") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. -cmake_policy(SET CMP0063 NEW) +cmake_policy(VERSION 3.14...3.25) # Define build configuration option. get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) @@ -52,6 +52,7 @@ add_subdirectory(${FLUTTER_MANAGED_DIR}) # Application build; see runner/CMakeLists.txt. add_subdirectory("runner") + # Generated plugin build rules, which manage building the plugins and adding # them to the application. include(flutter/generated_plugins.cmake) @@ -86,6 +87,12 @@ if(PLUGIN_BUNDLED_LIBRARIES) COMPONENT Runtime) endif() +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + # Fully re-copy the assets directory on each build to avoid having stale files # from a previous install. set(FLUTTER_ASSET_DIR_NAME "flutter_assets") diff --git a/example/windows/flutter/CMakeLists.txt b/example/windows/flutter/CMakeLists.txt index 930d207..903f489 100644 --- a/example/windows/flutter/CMakeLists.txt +++ b/example/windows/flutter/CMakeLists.txt @@ -10,6 +10,11 @@ include(${EPHEMERAL_DIR}/generated_config.cmake) # https://github.com/flutter/flutter/issues/57146. set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + # === Flutter Library === set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") @@ -92,7 +97,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E env ${FLUTTER_TOOL_ENVIRONMENT} "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - windows-x64 $ + ${FLUTTER_TARGET_PLATFORM} $ VERBATIM ) add_custom_target(flutter_assemble DEPENDS diff --git a/example/windows/runner/flutter_window.cpp b/example/windows/runner/flutter_window.cpp index b25e363..955ee30 100644 --- a/example/windows/runner/flutter_window.cpp +++ b/example/windows/runner/flutter_window.cpp @@ -31,6 +31,11 @@ bool FlutterWindow::OnCreate() { this->Show(); }); + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + return true; } diff --git a/example/windows/runner/runner.exe.manifest b/example/windows/runner/runner.exe.manifest index a42ea76..153653e 100644 --- a/example/windows/runner/runner.exe.manifest +++ b/example/windows/runner/runner.exe.manifest @@ -9,12 +9,6 @@ - - - - - - diff --git a/example/windows/runner/utils.cpp b/example/windows/runner/utils.cpp index f5bf9fa..3a0b465 100644 --- a/example/windows/runner/utils.cpp +++ b/example/windows/runner/utils.cpp @@ -45,9 +45,11 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) { if (utf16_string == nullptr) { return std::string(); } - int target_length = ::WideCharToMultiByte( + unsigned int target_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, nullptr, 0, nullptr, nullptr); + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); std::string utf8_string; if (target_length == 0 || target_length > utf8_string.max_size()) { return utf8_string; @@ -55,8 +57,7 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) { utf8_string.resize(target_length); int converted_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, utf8_string.data(), - target_length, nullptr, nullptr); + input_length, utf8_string.data(), target_length, nullptr, nullptr); if (converted_length == 0) { return std::string(); } diff --git a/example/windows/runner/win32_window.cpp b/example/windows/runner/win32_window.cpp index 041a385..60608d0 100644 --- a/example/windows/runner/win32_window.cpp +++ b/example/windows/runner/win32_window.cpp @@ -60,7 +60,7 @@ class WindowClassRegistrar { public: ~WindowClassRegistrar() = default; - // Returns the singleton registar instance. + // Returns the singleton registrar instance. static WindowClassRegistrar* GetInstance() { if (!instance_) { instance_ = new WindowClassRegistrar(); diff --git a/example/windows/runner/win32_window.h b/example/windows/runner/win32_window.h index c86632d..e901dde 100644 --- a/example/windows/runner/win32_window.h +++ b/example/windows/runner/win32_window.h @@ -77,7 +77,7 @@ class Win32Window { // OS callback called by message pump. Handles the WM_NCCREATE message which // is passed when the non-client area is being created and enables automatic // non-client DPI scaling so that the non-client area automatically - // responsponds to changes in DPI. All other messages are handled by + // responds to changes in DPI. All other messages are handled by // MessageHandler. static LRESULT CALLBACK WndProc(HWND const window, UINT const message, From ef5821fc82a0b310472e6d099026fc6d8903ec1a Mon Sep 17 00:00:00 2001 From: Frederik St-Onge Date: Wed, 4 Feb 2026 10:19:43 -0500 Subject: [PATCH 4/5] Handle percentage in a more clever way --- lib/models/border_value.dart | 2 +- lib/models/box_shadow_value.dart | 13 +++-- lib/models/dimension_value.dart | 54 ++++++++++++------- lib/models/letter_spacing_value.dart | 2 +- lib/models/linear_gradient_value.dart | 11 ++-- lib/models/multi_dimension_value.dart | 14 +++-- lib/models/sizing_value.dart | 8 +-- lib/models/text_style_value.dart | 4 +- lib/models/token.dart | 4 +- .../border_radius_transformer.dart | 49 +++++++++-------- lib/transformers/composition_transformer.dart | 41 +++++++------- lib/transformers/spacing_transformer.dart | 2 +- pubspec.lock | 2 +- pubspec.yaml | 1 - test/models/dimension_value_test.dart | 2 +- test/models/multi_dimension_value_test.dart | 2 +- 16 files changed, 119 insertions(+), 92 deletions(-) diff --git a/lib/models/border_value.dart b/lib/models/border_value.dart index edc5859..873498c 100644 --- a/lib/models/border_value.dart +++ b/lib/models/border_value.dart @@ -18,7 +18,7 @@ class BorderValue { } final width = - DimensionValue.maybeParse(value['width']) ?? DimensionValue.zero; + DimensionValue.maybeParse(value['width'], false) ?? DimensionValue.zero; final color = ColorValue.maybeParse(value['color']) ?? ColorValue.black; final style = BorderStyle.values.firstWhere( (e) => e.name == value['style'], diff --git a/lib/models/box_shadow_value.dart b/lib/models/box_shadow_value.dart index 2f4887b..909468f 100644 --- a/lib/models/box_shadow_value.dart +++ b/lib/models/box_shadow_value.dart @@ -1,4 +1,3 @@ -import 'package:collection/collection.dart'; import 'package:figma2flutter/models/color_value.dart'; import 'package:figma2flutter/models/dimension_value.dart'; @@ -12,11 +11,11 @@ class BoxShadowValueList { if (value is List) { final list = value.map(BoxShadowValue.maybeParse).toList(); - final shadows = list.whereNotNull().toList(); + final shadows = list.nonNulls.toList(); return BoxShadowValueList(shadows); } else { return BoxShadowValueList( - [BoxShadowValue.maybeParse(value)].whereNotNull().toList(), + [BoxShadowValue.maybeParse(value)].nonNulls.toList(), ); } } @@ -47,10 +46,10 @@ class BoxShadowValue { ); static BoxShadowValue? maybeParse(dynamic value) { - final x = DimensionValue.maybeParse(value['x'] ?? 0)!; - final y = DimensionValue.maybeParse(value['y'] ?? 0)!; - final blur = DimensionValue.maybeParse(value['blur'] ?? 0)!; - final spread = DimensionValue.maybeParse(value['spread'] ?? 0)!; + final x = DimensionValue.maybeParse(value['x'] ?? 0, false)!; + final y = DimensionValue.maybeParse(value['y'] ?? 0, false)!; + final blur = DimensionValue.maybeParse(value['blur'] ?? 0, false)!; + final spread = DimensionValue.maybeParse(value['spread'] ?? 0, false)!; final color = ColorValue.maybeParse(value['color'] ?? '#000000')!; // TODO(mark): Add support for inner shadows diff --git a/lib/models/dimension_value.dart b/lib/models/dimension_value.dart index f1ce82e..5aff97b 100644 --- a/lib/models/dimension_value.dart +++ b/lib/models/dimension_value.dart @@ -9,15 +9,22 @@ const kBaseFontSize = 16.0; /// And if the value is not a number 0 is returned. class DimensionValue { final double value; + final bool isPercentage; - DimensionValue(this.value); + DimensionValue(this.value, {this.isPercentage = false}); static DimensionValue get zero => DimensionValue(0); - static DimensionValue? maybeParse(dynamic value) { + static DimensionValue? maybeParse(dynamic value, bool supportPercentage) { if (value == null) return null; + final parsedValue = _parseNum(value.toString()); - return DimensionValue(_parseNum(value.toString())); + // If percentage values are not supported, return null for percentage values + if (parsedValue == null || (parsedValue.isPercentage && !supportPercentage)) { + return null; + } + + return parsedValue; } @override @@ -36,25 +43,32 @@ class DimensionValue { @override int get hashCode => value.hashCode; -} -double _parseNum(String value) { - // 1px = 1.0 - if (value.endsWith('px')) { - return double.tryParse(value.substring(0, value.length - 2)) ?? 0; - } + static DimensionValue? _parseNum(String value) { + // 1px = 1.0 + if (value.endsWith('px')) { + final doubleValue = double.tryParse(value.substring(0, value.length - 2)); + if (doubleValue == null) return null; + return DimensionValue(doubleValue); + } - // 1rem = 16px (base font size) - if (value.endsWith('rem')) { - return (double.tryParse(value.substring(0, value.length - 3)) ?? 0) * - kBaseFontSize; - } + // 1rem = 16px (base font size) + if (value.endsWith('rem')) { + final doubleValue = double.tryParse(value.substring(0, value.length - 3)); + if (doubleValue == null) return null; + return DimensionValue(doubleValue * kBaseFontSize); + } - // 100% = 1.0 - // 50% = 0.5 - if (value.endsWith('%')) { - return (double.tryParse(value.substring(0, value.length - 1)) ?? 0) / 100; - } + // 100% = 1.0 + // 50% = 0.5 + if (value.endsWith('%')) { + final doubleValue = double.tryParse(value.substring(0, value.length - 1)); + if (doubleValue == null) return null; + return DimensionValue(doubleValue / 100, isPercentage: true); + } - return double.tryParse(value) ?? 0; + final parsedValue = double.tryParse(value); + if (parsedValue == null) return null; + return DimensionValue(parsedValue); + } } diff --git a/lib/models/letter_spacing_value.dart b/lib/models/letter_spacing_value.dart index 9026d5c..2e5d2a7 100644 --- a/lib/models/letter_spacing_value.dart +++ b/lib/models/letter_spacing_value.dart @@ -13,7 +13,7 @@ class LetterSpacingValue extends DimensionValue { /// Parses the given [value] to a [LetterSpacingValue]. static LetterSpacingValue? maybeParse(dynamic value) { - final dimensionValue = DimensionValue.maybeParse(value); + final dimensionValue = DimensionValue.maybeParse(value, false); if (dimensionValue == null) return null; if (value is String && value.endsWith('%')) { diff --git a/lib/models/linear_gradient_value.dart b/lib/models/linear_gradient_value.dart index 8bda245..ec551ab 100644 --- a/lib/models/linear_gradient_value.dart +++ b/lib/models/linear_gradient_value.dart @@ -31,11 +31,16 @@ class LinearGradientValue { for (var element in stops) { final splitted = element.trim().split(' '); - final color = ColorValue.maybeParse(splitted[0].trim())!; - colors.add(color); + final color = ColorValue.maybeParse(splitted[0].trim()); + final stop = DimensionValue.maybeParse(splitted[1].trim(), true); + if (color == null || stop == null || !stop.isPercentage) { + // Invalid color or stop, skip this entry (stop should be a percentage) + continue; + } - final stop = DimensionValue.maybeParse(splitted[1].trim())!; + colors.add(color); stopsList.add(stop); + } return LinearGradientValue._(colors, stopsList, angle ?? 0); diff --git a/lib/models/multi_dimension_value.dart b/lib/models/multi_dimension_value.dart index f86a53a..7b3cbb7 100644 --- a/lib/models/multi_dimension_value.dart +++ b/lib/models/multi_dimension_value.dart @@ -9,17 +9,23 @@ class MultiDimensionValue { MultiDimensionValue._(this.values); /// Parses the given [value] to a [MultiDimensionValue]. - factory MultiDimensionValue.parse(dynamic value) { + factory MultiDimensionValue.parse(dynamic value, bool supportPercentage) { if (value == null) { return MultiDimensionValue._([]); } if (value is double) { - return MultiDimensionValue._([DimensionValue(value)]); + final parsedValue = DimensionValue.maybeParse(value, supportPercentage); + if (parsedValue != null) { + return MultiDimensionValue._([parsedValue]); + } } if (value is int) { - return MultiDimensionValue._([DimensionValue(value.toDouble())]); + final parsedValue = DimensionValue.maybeParse(value, supportPercentage); + if (parsedValue != null) { + return MultiDimensionValue._([parsedValue]); + } } if (value is! String) { @@ -29,7 +35,7 @@ class MultiDimensionValue { // Split on spaces and parse each value to a size final values = value .split(' ') - .map(DimensionValue.maybeParse) + .map((v) => DimensionValue.maybeParse(v, supportPercentage)) .where((element) => element != null) .cast() .toList(); diff --git a/lib/models/sizing_value.dart b/lib/models/sizing_value.dart index d38c5f7..7c97533 100644 --- a/lib/models/sizing_value.dart +++ b/lib/models/sizing_value.dart @@ -13,9 +13,9 @@ class SizingValue { if (value == null) return null; if (value is Map) { - final sizing = DimensionValue.maybeParse(value['sizing']); - final width = DimensionValue.maybeParse(value['width']); - final height = DimensionValue.maybeParse(value['height']); + final sizing = DimensionValue.maybeParse(value['sizing'], false); + final width = DimensionValue.maybeParse(value['width'], false); + final height = DimensionValue.maybeParse(value['height'], false); if (sizing == null && width == null && height == null) return null; @@ -25,7 +25,7 @@ class SizingValue { return SizingValue._(width: width, height: height); } } else { - final sizing = DimensionValue.maybeParse(value); + final sizing = DimensionValue.maybeParse(value, false); if (sizing != null) { return SizingValue._(width: sizing, height: sizing); } diff --git a/lib/models/text_style_value.dart b/lib/models/text_style_value.dart index f79fd3f..2a76566 100644 --- a/lib/models/text_style_value.dart +++ b/lib/models/text_style_value.dart @@ -59,8 +59,8 @@ class _FontSizeLineHeight { DimensionValue? lineHeight; _FontSizeLineHeight(dynamic value) { - final fontSize = DimensionValue.maybeParse(value['fontSize']); - final lineHeight = DimensionValue.maybeParse(value['lineHeight']); + final fontSize = DimensionValue.maybeParse(value['fontSize'], false); + final lineHeight = DimensionValue.maybeParse(value['lineHeight'], false); this.lineHeight = lineHeight; this.fontSize = fontSize; diff --git a/lib/models/token.dart b/lib/models/token.dart index 1c63ace..46b8522 100644 --- a/lib/models/token.dart +++ b/lib/models/token.dart @@ -260,8 +260,8 @@ class Token { ? tokenMap[rightPart.valueByRef]?.resolveAllReferences(tokenMap).value : rightPart; - final left = DimensionValue.maybeParse(leftValue); - final right = DimensionValue.maybeParse(rightValue); + final left = DimensionValue.maybeParse(leftValue, false); + final right = DimensionValue.maybeParse(rightValue, false); if (left == null || right == null) { throw FormatException( diff --git a/lib/transformers/border_radius_transformer.dart b/lib/transformers/border_radius_transformer.dart index 4ed9c21..5528471 100644 --- a/lib/transformers/border_radius_transformer.dart +++ b/lib/transformers/border_radius_transformer.dart @@ -1,3 +1,4 @@ +import 'package:figma2flutter/models/dimension_value.dart'; import 'package:figma2flutter/models/multi_dimension_value.dart'; import 'package:figma2flutter/models/token.dart'; import 'package:figma2flutter/transformers/transformer.dart'; @@ -8,6 +9,7 @@ import 'package:figma2flutter/transformers/transformer.dart'; /// radius. You can either create a single value token or define multiple /// border radii in a token. class BorderRadiusTransformer extends SingleTokenTransformer { + static const int percentageMultiplier = 100; @override bool matcher(Token token) { return token.type == 'borderRadius'; @@ -18,43 +20,44 @@ class BorderRadiusTransformer extends SingleTokenTransformer { @override String transform(Token token) { - final dimensions = MultiDimensionValue.parse(token.value); + final dimensions = MultiDimensionValue.parse(token.value, true); if (dimensions.values.length == 1) { - if (dimensions.values[0].value == 0) { + final dimension = dimensions.values[0]; + if (dimension.value == 0) { return 'BorderRadius.zero'; } - return 'BorderRadius.circular(${dimensions.values[0].value})'; + return 'BorderRadius.circular(${dimension.isPercentage ? dimension.value * percentageMultiplier : dimension.value})'; } - final double topLeft; - final double topRight; - final double bottomRight; - final double bottomLeft; + final DimensionValue topLeft; + final DimensionValue topRight; + final DimensionValue bottomRight; + final DimensionValue bottomLeft; if (dimensions.values.length == 2) { - topLeft = dimensions.values[0].value; - topRight = dimensions.values[1].value; - bottomRight = dimensions.values[0].value; - bottomLeft = dimensions.values[1].value; + topLeft = dimensions.values[0]; + topRight = dimensions.values[1]; + bottomRight = dimensions.values[0]; + bottomLeft = dimensions.values[1]; } else if (dimensions.values.length == 3) { - topLeft = dimensions.values[0].value; - topRight = dimensions.values[1].value; - bottomRight = dimensions.values[2].value; - bottomLeft = dimensions.values[1].value; + topLeft = dimensions.values[0]; + topRight = dimensions.values[1]; + bottomRight = dimensions.values[2]; + bottomLeft = dimensions.values[1]; } else { - topLeft = dimensions.values[0].value; - topRight = dimensions.values[1].value; - bottomRight = dimensions.values[2].value; - bottomLeft = dimensions.values[3].value; + topLeft = dimensions.values[0]; + topRight = dimensions.values[1]; + bottomRight = dimensions.values[2]; + bottomLeft = dimensions.values[3]; } return 'const BorderRadius.only(' - 'topLeft: Radius.circular($topLeft),' - 'topRight: Radius.circular($topRight),' - 'bottomRight: Radius.circular($bottomRight),' - 'bottomLeft: Radius.circular($bottomLeft)' + 'topLeft: Radius.circular(${topLeft.isPercentage ? topLeft.value * percentageMultiplier : topLeft.value}),' + 'topRight: Radius.circular(${topRight.isPercentage ? topRight.value * percentageMultiplier : topRight.value}),' + 'bottomRight: Radius.circular(${bottomRight.isPercentage ? bottomRight.value * percentageMultiplier : bottomRight.value}),' + 'bottomLeft: Radius.circular(${bottomLeft.isPercentage ? bottomLeft.value * percentageMultiplier : bottomLeft.value})' ')'; } diff --git a/lib/transformers/composition_transformer.dart b/lib/transformers/composition_transformer.dart index cb35f86..a6759a0 100644 --- a/lib/transformers/composition_transformer.dart +++ b/lib/transformers/composition_transformer.dart @@ -6,6 +6,7 @@ import 'package:figma2flutter/models/linear_gradient_value.dart'; import 'package:figma2flutter/models/sizing_value.dart'; import 'package:figma2flutter/models/text_style_value.dart'; import 'package:figma2flutter/models/token.dart'; +import 'package:figma2flutter/transformers/border_radius_transformer.dart'; import 'package:figma2flutter/transformers/transformer.dart'; class CompositionTransformer extends SingleTokenTransformer { @@ -65,20 +66,20 @@ CompositionToken( String? _getPadding(Map values) { final zero = DimensionValue(0); final horizontalPadding = - DimensionValue.maybeParse(values['horizontalPadding']); + DimensionValue.maybeParse(values['horizontalPadding'], false); final verticalPadding = - DimensionValue.maybeParse(values['verticalPadding']); + DimensionValue.maybeParse(values['verticalPadding'], false); - final topPadding = DimensionValue.maybeParse(values['paddingTop']) ?? + final topPadding = DimensionValue.maybeParse(values['paddingTop'], false) ?? verticalPadding ?? zero; - final rightPadding = DimensionValue.maybeParse(values['paddingRight']) ?? + final rightPadding = DimensionValue.maybeParse(values['paddingRight'], false) ?? horizontalPadding ?? zero; - final bottomPadding = DimensionValue.maybeParse(values['paddingBottom']) ?? + final bottomPadding = DimensionValue.maybeParse(values['paddingBottom'], false) ?? verticalPadding ?? zero; - final leftPadding = DimensionValue.maybeParse(values['paddingLeft']) ?? + final leftPadding = DimensionValue.maybeParse(values['paddingLeft'], false) ?? horizontalPadding ?? zero; @@ -110,7 +111,7 @@ padding: const EdgeInsets.only( } String? _getSpacing(Map values) { - final spacing = DimensionValue.maybeParse(values['itemSpacing']); + final spacing = DimensionValue.maybeParse(values['itemSpacing'], false); if (spacing == null) { return null; } @@ -119,16 +120,15 @@ padding: const EdgeInsets.only( } String? _getBorderRadius(Map values) { - final radius = DimensionValue.maybeParse(values['borderRadius']); + final radius = DimensionValue.maybeParse(values['borderRadius'], true); final borderRadiusTopLeft = - DimensionValue.maybeParse(values['borderRadiusTopLeft']); + DimensionValue.maybeParse(values['borderRadiusTopLeft'], true); final borderRadiusTopRight = - DimensionValue.maybeParse(values['borderRadiusTopRight']); + DimensionValue.maybeParse(values['borderRadiusTopRight'], true); final borderRadiusBottomRight = - DimensionValue.maybeParse(values['borderRadiusBottomRight']); + DimensionValue.maybeParse(values['borderRadiusBottomRight'], true); final borderRadiusBottomLeft = - DimensionValue.maybeParse(values['borderRadiusBottomLeft']); - + DimensionValue.maybeParse(values['borderRadiusBottomLeft'], true); // If all null return null if (radius == null && borderRadiusTopLeft == null && @@ -139,15 +139,15 @@ padding: const EdgeInsets.only( } if (radius != null) { - return 'borderRadius: BorderRadius.circular($radius)'; + return 'borderRadius: BorderRadius.circular(${radius.isPercentage ? radius.value * BorderRadiusTransformer.percentageMultiplier : radius.value})'; } return ''' borderRadius: BorderRadius.only( - topLeft: Radius.circular($borderRadiusTopLeft), - topRight: Radius.circular($borderRadiusTopRight), - bottomRight: Radius.circular($borderRadiusBottomRight), - bottomLeft: Radius.circular($borderRadiusBottomLeft), + topLeft: Radius.circular(${borderRadiusTopLeft!.isPercentage ? borderRadiusTopLeft.value * BorderRadiusTransformer.percentageMultiplier : borderRadiusTopLeft.value}), + topRight: Radius.circular(${borderRadiusTopRight!.isPercentage ? borderRadiusTopRight.value * BorderRadiusTransformer.percentageMultiplier : borderRadiusTopRight.value}), + bottomRight: Radius.circular(${borderRadiusBottomRight!.isPercentage ? borderRadiusBottomRight.value * BorderRadiusTransformer.percentageMultiplier : borderRadiusBottomRight.value}), + bottomLeft: Radius.circular(${borderRadiusBottomLeft!.isPercentage ? borderRadiusBottomLeft.value * BorderRadiusTransformer.percentageMultiplier : borderRadiusBottomLeft.value}), )'''; } @@ -217,8 +217,9 @@ border: const Border( } String? _getOpacity(Map values) { - final opacity = DimensionValue.maybeParse(values['opacity']); - return opacity == null ? null : 'opacity: $opacity'; + final opacity = DimensionValue.maybeParse(values['opacity'], true); + // Only support percentage, value must be between 0 and 1 + return opacity == null || !opacity.isPercentage ? null : 'opacity: $opacity'; } @override diff --git a/lib/transformers/spacing_transformer.dart b/lib/transformers/spacing_transformer.dart index 077cda6..2280ff3 100644 --- a/lib/transformers/spacing_transformer.dart +++ b/lib/transformers/spacing_transformer.dart @@ -16,7 +16,7 @@ class SpacingTransformer extends SingleTokenTransformer { String transform(Token token) { final value = token.value; - final sizes = MultiDimensionValue.parse(value); + final sizes = MultiDimensionValue.parse(value, false); if (sizes.values.length == 1) { if (sizes.values[0].value == 0) { diff --git a/pubspec.lock b/pubspec.lock index d0cd12b..a4fd82d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -50,7 +50,7 @@ packages: source: hosted version: "0.2.0" collection: - dependency: "direct main" + dependency: transitive description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" diff --git a/pubspec.yaml b/pubspec.yaml index fdf8e1f..e837aac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,6 @@ environment: dependencies: args: ^2.3.1 - collection: ^1.17.0 meta: ^1.8.0 path: ^1.8.0 recase: ^4.1.0 diff --git a/test/models/dimension_value_test.dart b/test/models/dimension_value_test.dart index ce52d95..8e17f76 100644 --- a/test/models/dimension_value_test.dart +++ b/test/models/dimension_value_test.dart @@ -44,7 +44,7 @@ void main() { final parsedValues = parser .resolvedTokens() - .map((e) => DimensionValue.maybeParse(e.value)?.value) + .map((e) => DimensionValue.maybeParse(e.value, true)?.value) .toList(); expect( diff --git a/test/models/multi_dimension_value_test.dart b/test/models/multi_dimension_value_test.dart index 9b07635..4f39248 100644 --- a/test/models/multi_dimension_value_test.dart +++ b/test/models/multi_dimension_value_test.dart @@ -3,7 +3,7 @@ import 'package:test/test.dart'; void main() { test('check invalid value usage', () { - final value = MultiDimensionValue.parse([]); + final value = MultiDimensionValue.parse([], true); expect(value.values, isEmpty); }); } From 3a51c223f59d67a9d9c95789e8b3249125ff61fd Mon Sep 17 00:00:00 2001 From: Frederik St-Onge Date: Wed, 4 Feb 2026 10:30:33 -0500 Subject: [PATCH 5/5] Fix some issues --- lib/models/letter_spacing_value.dart | 4 ++-- lib/models/text_style_value.dart | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/models/letter_spacing_value.dart b/lib/models/letter_spacing_value.dart index 2e5d2a7..d9a7067 100644 --- a/lib/models/letter_spacing_value.dart +++ b/lib/models/letter_spacing_value.dart @@ -13,10 +13,10 @@ class LetterSpacingValue extends DimensionValue { /// Parses the given [value] to a [LetterSpacingValue]. static LetterSpacingValue? maybeParse(dynamic value) { - final dimensionValue = DimensionValue.maybeParse(value, false); + final dimensionValue = DimensionValue.maybeParse(value, true); if (dimensionValue == null) return null; - if (value is String && value.endsWith('%')) { + if (value is String && dimensionValue.isPercentage) { return LetterSpacingValue._(dimensionValue.value * kBaseFontSize); } diff --git a/lib/models/text_style_value.dart b/lib/models/text_style_value.dart index 2a76566..0778230 100644 --- a/lib/models/text_style_value.dart +++ b/lib/models/text_style_value.dart @@ -60,7 +60,7 @@ class _FontSizeLineHeight { _FontSizeLineHeight(dynamic value) { final fontSize = DimensionValue.maybeParse(value['fontSize'], false); - final lineHeight = DimensionValue.maybeParse(value['lineHeight'], false); + final lineHeight = DimensionValue.maybeParse(value['lineHeight'], true); this.lineHeight = lineHeight; this.fontSize = fontSize;