react-native-unistyles 3.0.0-alpha.40 → 3.0.0-alpha.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,3 +34,6 @@ set_target_properties(unistyles PROPERTIES
34
34
 
35
35
  # For React Native 0.76 and above, we don't need to link anything
36
36
  # as NitroModules will automatically add ReactAndroid::reactnative prefab
37
+ if (ReactAndroid_VERSION_MINOR LESS 76)
38
+ message(FATAL_ERROR "Unistyles 3.0 requires min. React Native version to be 0.76")
39
+ endif ()
@@ -79,3 +79,13 @@ dependencies {
79
79
  implementation 'com.facebook.react:react-native'
80
80
  implementation project(":react-native-nitro-modules")
81
81
  }
82
+
83
+ tasks.register("checkNativeTurboUnistylesSpec") {
84
+ doLast {
85
+ if (!isNewArchitectureEnabled()) {
86
+ throw new GradleException("Unistyles 3.0 requires your project to have New Architecture enabled.")
87
+ }
88
+ }
89
+ }
90
+
91
+ preBuild.dependsOn checkNativeTurboUnistylesSpec
@@ -8,6 +8,7 @@ import android.view.View
8
8
  import android.view.WindowManager
9
9
  import androidx.core.text.TextUtilsCompat
10
10
  import androidx.core.view.ViewCompat
11
+ import androidx.core.view.WindowCompat
11
12
  import androidx.core.view.WindowInsetsCompat
12
13
  import androidx.core.view.WindowInsetsControllerCompat
13
14
  import com.facebook.react.bridge.LifecycleEventListener
@@ -279,7 +280,15 @@ class NativePlatformAndroid(private val reactContext: ReactApplicationContext):
279
280
  try {
280
281
  Class.forName("com.zoontek.rnedgetoedge.EdgeToEdgePackage")
281
282
  } catch (exception: ClassNotFoundException) {
282
- throw IllegalStateException("Unistyles: react-native-edge-to-edge is not installed.")
283
+ enableEdgeToEdge()
284
+ }
285
+ }
286
+
287
+ private fun enableEdgeToEdge() {
288
+ reactContext.currentActivity?.let { activity ->
289
+ activity.runOnUiThread {
290
+ WindowCompat.setDecorFitsSystemWindows(activity.window, false)
291
+ }
283
292
  }
284
293
  }
285
294
  }
@@ -9,5 +9,6 @@ static const std::string STYLE_VARIANTS = "uni__variants";
9
9
  static const std::string WEB_STYLE_KEY = "_web";
10
10
  static const std::string EXOTIC_STYLE_KEY = "_exotic";
11
11
  static const std::string NAME_STYLE_KEY = "__unistyles_name";
12
+ static const std::string UNI_PRESSABLE_ID = "__uni_pressable_id";
12
13
 
13
14
  }
@@ -8,8 +8,8 @@ namespace margelo::nitro::unistyles::core {
8
8
  using Variants = std::vector<std::pair<std::string, std::string>>;
9
9
 
10
10
  struct UnistyleData {
11
- UnistyleData(Unistyle::Shared unistyle, const Variants& variants, std::vector<folly::dynamic>& arguments)
12
- : unistyle{unistyle}, variants(std::move(variants)), dynamicFunctionMetadata{std::move(arguments)} {}
11
+ UnistyleData(Unistyle::Shared unistyle, const Variants& variants, std::vector<folly::dynamic>& arguments, std::optional<std::string> uniquePressableId)
12
+ : unistyle{unistyle}, variants(std::move(variants)), dynamicFunctionMetadata{std::move(arguments)}, pressableId{std::move(uniquePressableId)} {}
13
13
 
14
14
  UnistyleData(const UnistyleData&) = delete;
15
15
  UnistyleData(UnistyleData&& other) = delete;
@@ -18,6 +18,7 @@ struct UnistyleData {
18
18
  core::Variants variants;
19
19
  std::optional<jsi::Object> parsedStyle = std::nullopt;
20
20
  std::optional<std::vector<folly::dynamic>> dynamicFunctionMetadata = std::nullopt;
21
+ std::optional<std::string> pressableId = std::nullopt;
21
22
  };
22
23
 
23
24
  }
@@ -73,7 +73,8 @@ void core::UnistylesRegistry::linkShadowNodeWithUnistyle(
73
73
  const ShadowNodeFamily* shadowNodeFamily,
74
74
  std::vector<core::Unistyle::Shared>& unistyles,
75
75
  Variants& variants,
76
- std::vector<std::vector<folly::dynamic>>& arguments
76
+ std::vector<std::vector<folly::dynamic>>& arguments,
77
+ std::optional<std::string> uniquePressableId
77
78
  ) {
78
79
  auto parser = parser::Parser(nullptr);
79
80
  shadow::ShadowLeafUpdates updates;
@@ -81,7 +82,7 @@ void core::UnistylesRegistry::linkShadowNodeWithUnistyle(
81
82
  for (size_t index = 0; index < unistyles.size(); index++) {
82
83
  Unistyle::Shared unistyle = unistyles[index];
83
84
 
84
- this->_shadowRegistry[&rt][shadowNodeFamily].emplace_back(std::make_shared<UnistyleData>(unistyle, variants, arguments[index]));
85
+ this->_shadowRegistry[&rt][shadowNodeFamily].emplace_back(std::make_shared<UnistyleData>(unistyle, variants, arguments[index], uniquePressableId));
85
86
 
86
87
  // add or update node for shadow leaf updates
87
88
  // dynamic functions are parsed later
@@ -148,15 +149,18 @@ core::DependencyMap core::UnistylesRegistry::buildDependencyMap(jsi::Runtime& rt
148
149
 
149
150
  // called from proxied function only, we don't know host
150
151
  // so we need to rebuild all instances as they may have different variants
151
- void core::UnistylesRegistry::shadowLeafUpdateFromUnistyle(jsi::Runtime& rt, Unistyle::Shared unistyle) {
152
+ void core::UnistylesRegistry::shadowLeafUpdateFromUnistyle(jsi::Runtime& rt, Unistyle::Shared unistyle, std::optional<std::string> uniquePressableId) {
152
153
  shadow::ShadowLeafUpdates updates;
153
154
  auto parser = parser::Parser(nullptr);
154
155
 
155
156
  for (const auto& [family, unistyles] : this->_shadowRegistry[&rt]) {
156
157
  for (const auto& unistyleData : unistyles) {
157
158
  if (unistyleData->unistyle == unistyle) {
158
- // update state eg. for pressable
159
- unistyleData->parsedStyle = jsi::Value(rt, unistyle->parsedStyle.value()).asObject(rt);
159
+ // special case for pressable
160
+ if (uniquePressableId.has_value() && unistyleData->pressableId.has_value() && uniquePressableId.value() == unistyleData->pressableId.value()) {
161
+ unistyleData->parsedStyle = jsi::Value(rt, unistyle->parsedStyle.value()).asObject(rt);
162
+ }
163
+
160
164
  updates[family] = parser.parseStylesToShadowTreeStyles(rt, { unistyleData });
161
165
  }
162
166
  }
@@ -37,11 +37,11 @@ struct UnistylesRegistry: public StyleSheetRegistry {
37
37
  UnistylesState& getState(jsi::Runtime& rt);
38
38
  void createState(jsi::Runtime& rt);
39
39
  std::vector<std::shared_ptr<core::StyleSheet>> getStyleSheetsToRefresh(jsi::Runtime& rt, std::vector<UnistyleDependency>& unistylesDependencies);
40
- void linkShadowNodeWithUnistyle(jsi::Runtime& rt, const ShadowNodeFamily*, std::vector<core::Unistyle::Shared>& unistyles, Variants& variants, std::vector<std::vector<folly::dynamic>>&);
40
+ void linkShadowNodeWithUnistyle(jsi::Runtime& rt, const ShadowNodeFamily*, std::vector<core::Unistyle::Shared>& unistyles, Variants& variants, std::vector<std::vector<folly::dynamic>>&, std::optional<std::string> uniquePressableId);
41
41
  void unlinkShadowNodeWithUnistyles(jsi::Runtime& rt, const ShadowNodeFamily*);
42
42
  std::shared_ptr<core::StyleSheet> addStyleSheet(jsi::Runtime& rt, int tag, core::StyleSheetType type, jsi::Object&& rawValue);
43
43
  DependencyMap buildDependencyMap(jsi::Runtime& rt, std::vector<UnistyleDependency>& deps);
44
- void shadowLeafUpdateFromUnistyle(jsi::Runtime& rt, Unistyle::Shared unistyle);
44
+ void shadowLeafUpdateFromUnistyle(jsi::Runtime& rt, Unistyle::Shared unistyle, std::optional<std::string> uniquePressableId);
45
45
  shadow::ShadowTrafficController trafficController{};
46
46
 
47
47
  private:
@@ -4,12 +4,15 @@ using namespace margelo::nitro::unistyles;
4
4
  using namespace facebook::react;
5
5
 
6
6
  jsi::Value HybridShadowRegistry::link(jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) {
7
- helpers::assertThat(rt, count == 4, "Unistyles: Invalid babel transform 'ShadowRegistry link' expected 4 arguments.");
7
+ helpers::assertThat(rt, count == 5, "Unistyles: Invalid babel transform 'ShadowRegistry link' expected 5 arguments.");
8
8
 
9
9
  ShadowNode::Shared shadowNodeWrapper = shadowNodeFromValue(rt, args[0]);
10
10
  std::vector<core::Unistyle::Shared> unistyleWrappers = core::unistyleFromValue(rt, args[1]);
11
11
  core::Variants variants = helpers::variantsToPairs(rt, args[2].asObject(rt));
12
12
  jsi::Array rawArguments = args[3].asObject(rt).asArray(rt);
13
+ std::optional<std::string> uniquePressableId = args[4].isUndefined()
14
+ ? std::nullopt
15
+ : std::make_optional<std::string>(args[4].asString(rt).utf8(rt));
13
16
  std::vector<std::vector<folly::dynamic>> arguments;
14
17
  auto& registry = core::UnistylesRegistry::get();
15
18
 
@@ -17,7 +20,7 @@ jsi::Value HybridShadowRegistry::link(jsi::Runtime &rt, const jsi::Value &thisVa
17
20
  arguments.push_back(helpers::parseDynamicFunctionArguments(rt, value.asObject(rt).asArray(rt)));
18
21
  });
19
22
 
20
- registry.linkShadowNodeWithUnistyle(rt, &shadowNodeWrapper->getFamily(), unistyleWrappers, variants, arguments);
23
+ registry.linkShadowNodeWithUnistyle(rt, &shadowNodeWrapper->getFamily(), unistyleWrappers, variants, arguments, uniquePressableId);
21
24
 
22
25
  return jsi::Value::undefined();
23
26
  }
@@ -210,6 +210,7 @@ void parser::Parser::rebuildShadowLeafUpdates(jsi::Runtime& rt, core::Dependency
210
210
  auto& registry = core::UnistylesRegistry::get();
211
211
 
212
212
  for (const auto& [shadowNode, unistyles] : dependencyMap) {
213
+ // this step is required to parse string colors eg. #000000 to int representation
213
214
  auto rawProps = this->parseStylesToShadowTreeStyles(rt, unistyles);
214
215
 
215
216
  updates.emplace(shadowNode, std::move(rawProps));
@@ -333,6 +334,26 @@ jsi::Object parser::Parser::parseFirstLevel(jsi::Runtime& rt, Unistyle::Shared u
333
334
  return parsedStyle;
334
335
  }
335
336
 
337
+ std::optional<std::string> parser::Parser::getUniquePressableIdFromArguments(jsi::Runtime& rt, const jsi::Value* args, size_t count) {
338
+ if (count == 0) {
339
+ return std::nullopt;
340
+ }
341
+
342
+ auto& lastArg = args[count - 1];
343
+
344
+ if (!lastArg.isObject()) {
345
+ return std::nullopt;
346
+ }
347
+
348
+ auto lastArgObj = lastArg.asObject(rt);
349
+
350
+ if (!lastArgObj.hasProperty(rt, helpers::UNI_PRESSABLE_ID.c_str())) {
351
+ return std::nullopt;
352
+ }
353
+
354
+ return lastArgObj.getProperty(rt, helpers::UNI_PRESSABLE_ID.c_str()).asString(rt).utf8(rt);
355
+ }
356
+
336
357
  // function replaces original user dynamic function with additional logic to memoize arguments
337
358
  jsi::Function parser::Parser::createDynamicFunctionProxy(jsi::Runtime& rt, Unistyle::Shared unistyle) {
338
359
  auto unistylesRuntime = this->_unistylesRuntime;
@@ -371,13 +392,13 @@ jsi::Function parser::Parser::createDynamicFunctionProxy(jsi::Runtime& rt, Unist
371
392
  // update shadow leaf updates to indicate newest changes
372
393
  auto& registry = core::UnistylesRegistry::get();
373
394
 
374
- registry.shadowLeafUpdateFromUnistyle(rt, unistyle);
395
+ registry.shadowLeafUpdateFromUnistyle(rt, unistyle, getUniquePressableIdFromArguments(rt, args, count));
375
396
 
376
397
  return style;
377
398
  });
378
399
  }
379
400
 
380
- // function convert babel generated dependencies to C++ dependencies
401
+ // function converts babel generated dependencies to C++ dependencies
381
402
  std::vector<UnistyleDependency> parser::Parser::parseDependencies(jsi::Runtime &rt, jsi::Object&& dependencies) {
382
403
  helpers::assertThat(rt, dependencies.isArray(rt), "Unistyles: Babel transform is invalid - unexpected type for dependencies.");
383
404
 
@@ -640,7 +661,7 @@ jsi::Object parser::Parser::parseCompoundVariants(jsi::Runtime& rt, Unistyle::Sh
640
661
  return parsedCompoundVariants;
641
662
  }
642
663
 
643
- // check every condition in compound variants, support boolean variants
664
+ // check every condition in compound variants, supports boolean variants
644
665
  bool parser::Parser::shouldApplyCompoundVariants(jsi::Runtime& rt, const Variants& variants, jsi::Object& compoundVariant) {
645
666
  if (variants.empty()) {
646
667
  return false;
@@ -43,6 +43,7 @@ private:
43
43
  jsi::Value getStylesForVariant(jsi::Runtime& rt, const std::string groupName, jsi::Object&& groupValue, std::optional<std::string> selectedVariant, Variants& variants);
44
44
  jsi::Object parseCompoundVariants(jsi::Runtime& rt, Unistyle::Shared unistyle, jsi::Object& obj, Variants& variants);
45
45
  bool shouldApplyCompoundVariants(jsi::Runtime& rt, const Variants& variants, jsi::Object& compoundVariant);
46
+ std::optional<std::string> getUniquePressableIdFromArguments(jsi::Runtime& rt, const jsi::Value* args, size_t count);
46
47
  bool isColor(const std::string& propertyName);
47
48
 
48
49
  std::shared_ptr<HybridUnistylesRuntime> _unistylesRuntime;
@@ -9,6 +9,7 @@ namespace margelo::nitro::unistyles::shadow {
9
9
  using namespace facebook;
10
10
  using namespace facebook::react;
11
11
 
12
+ // translates Unistyles changes to unified shadow tree changes
12
13
  using ShadowLeafUpdates = std::unordered_map<const ShadowNodeFamily*, folly::dynamic>;
13
14
 
14
15
  }
@@ -109,6 +109,10 @@ ShadowNode::Unshared shadow::ShadowTreeManager::cloneShadowTree(const ShadowNode
109
109
  *shadowNode.getContextContainer()
110
110
  };
111
111
 
112
+ // this is important and critical
113
+ // first of all Android doesn't like nullish props (they work perfectly fine on iOS)
114
+ // second of all Android props MUST be constructed from previous props, otherwise RawProps::~RawProps error occurs
115
+ // Meta wants to remove shadowNode.getProps()->rawProps, but for now it's the only viable solution
112
116
  #ifdef ANDROID
113
117
  auto safeProps = rawPropsIt->second == nullptr ? folly::dynamic::object() : rawPropsIt->second;
114
118
  auto newProps = folly::dynamic::merge(shadowNode.getProps()->rawProps, safeProps);
@@ -1,11 +1,13 @@
1
1
  import Foundation
2
2
 
3
3
  extension UIColor {
4
+ // int is universal way of color representation
5
+ // iOS API expects UIColor, so we need to translate it
4
6
  public static func fromInt(_ color: Int) -> UIColor {
5
7
  let red = CGFloat((color >> 16) & 0xFF) / 255.0
6
8
  let green = CGFloat((color >> 8) & 0xFF) / 255.0
7
9
  let blue = CGFloat(color & 0xFF) / 255.0
8
-
10
+
9
11
  return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
10
12
  }
11
13
  }
@@ -187,11 +187,22 @@ class NativeIOSPlatform: HybridNativePlatformSpec {
187
187
  return getContentSizeCategoryFn()
188
188
  }
189
189
  }
190
+
191
+ func getMainWindow() -> UIWindow? {
192
+ guard let mainWindow = UIApplication.shared.connectedScenes
193
+ .compactMap({ $0 as? UIWindowScene })
194
+ .flatMap({ $0.windows })
195
+ .first(where: { $0.isKeyWindow }) else {
196
+ return nil
197
+ }
198
+
199
+ return mainWindow
200
+ }
190
201
 
191
202
  // todo handle IME animation
192
203
  func getInsets() -> Insets {
193
204
  func getInsetsFn() -> Insets {
194
- guard let window = UIApplication.shared.windows.first else {
205
+ guard let window = getMainWindow() else {
195
206
  // this should never happen, but it's better to return zeros
196
207
  return Insets(top: 0, bottom: 0, left: 0, right: 0, ime: 0)
197
208
  }
@@ -235,7 +246,7 @@ class NativeIOSPlatform: HybridNativePlatformSpec {
235
246
 
236
247
  func getStatusBarDimensions() -> Dimensions {
237
248
  func getStatusBarDimensionsFn() -> Dimensions {
238
- guard let window = UIApplication.shared.windows.first,
249
+ guard let window = getMainWindow(),
239
250
  let statusBarManager = window.windowScene?.statusBarManager else {
240
251
  // this should never happen, but it's better to return defaults
241
252
  return Dimensions(width: 0, height: 0)
@@ -4,7 +4,6 @@ extension NativeIOSPlatform {
4
4
  func setupPlatformListeners() {
5
5
  NotificationCenter.default.publisher(for: NSNotification.Name("RCTWindowFrameDidChangeNotification"))
6
6
  // add small delay (10ms) to make sure all values are up ot date
7
- // we MUST call it on current thread, otherwise random crashes occurs
8
7
  .delay(for: .milliseconds(10), scheduler: RunLoop.current)
9
8
  .sink { [weak self] notification in
10
9
  self?.onWindowChange(notification)
@@ -14,7 +14,7 @@ const findShadowNodeForHandle = handle => {
14
14
  }
15
15
  return node;
16
16
  };
17
- HybridShadowRegistry.add = (handle, styles, variants, args) => {
17
+ HybridShadowRegistry.add = (handle, styles, variants, args, uniquePressableId) => {
18
18
  // virtualized nodes can be null
19
19
  if (!handle || !styles || !Array.isArray(styles)) {
20
20
  return;
@@ -22,7 +22,7 @@ HybridShadowRegistry.add = (handle, styles, variants, args) => {
22
22
 
23
23
  // filter Reanimated styles and styles that are undefined
24
24
  const filteredStyles = styles.filter(style => !style?.initial?.updater).filter(Boolean);
25
- HybridShadowRegistry.link(findShadowNodeForHandle(handle), filteredStyles, variants ?? {}, args ?? []);
25
+ HybridShadowRegistry.link(findShadowNodeForHandle(handle), filteredStyles, variants ?? {}, args ?? [], uniquePressableId);
26
26
  };
27
27
  HybridShadowRegistry.remove = handle => {
28
28
  if (!handle) {
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNativeNitroModules","require","HybridShadowRegistry","NitroModules","createHybridObject","findShadowNodeForHandle","handle","node","__internalInstanceHandle","stateNode","getScrollResponder","getNativeScrollRef","Error","add","styles","variants","args","Array","isArray","filteredStyles","filter","style","initial","updater","Boolean","link","remove","unlink","UnistylesShadowRegistry","exports"],"sourceRoot":"../../../../src","sources":["specs/ShadowRegistry/index.ts"],"mappings":";;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AAaA,MAAMC,oBAAoB,GAAGC,qCAAY,CAACC,kBAAkB,CAAiB,yBAAyB,CAAC;AAEvG,MAAMC,uBAAuB,GAAIC,MAAkB,IAAK;EACpD,MAAMC,IAAI,GAAGD,MAAM,EAAEE,wBAAwB,EAAEC,SAAS,EAAEF,IAAI,IACvDD,MAAM,EAAEI,kBAAkB,GAAG,CAAC,EAAEC,kBAAkB,GAAG,CAAC,EAAEH,wBAAwB,EAAEC,SAAS,EAAEF,IAAI,IACjGD,MAAM,EAAEK,kBAAkB,GAAG,CAAC,EAAEH,wBAAwB,EAAEC,SAAS,EAAEF,IAAI;EAEhF,IAAI,CAACA,IAAI,EAAE;IACP;IACA,MAAM,IAAIK,KAAK,CAAC,uDAAuD,CAAC;EAC5E;EAEA,OAAOL,IAAI;AACf,CAAC;AAEDL,oBAAoB,CAACW,GAAG,GAAG,CAACP,MAAM,EAAEQ,MAAM,EAAEC,QAAQ,EAAEC,IAAI,KAAK;EAC3D;EACA,IAAI,CAACV,MAAM,IAAI,CAACQ,MAAM,IAAI,CAACG,KAAK,CAACC,OAAO,CAACJ,MAAM,CAAC,EAAE;IAC9C;EACJ;;EAEA;EACA,MAAMK,cAAc,GAAGL,MAAM,CACxBM,MAAM,CAACC,KAAK,IAAI,CAACA,KAAK,EAAEC,OAAO,EAAEC,OAAO,CAAC,CACzCH,MAAM,CAACI,OAAO,CAAC;EAEpBtB,oBAAoB,CAACuB,IAAI,CAACpB,uBAAuB,CAACC,MAAM,CAAC,EAAEa,cAAc,EAAEJ,QAAQ,IAAI,CAAC,CAAC,EAAEC,IAAI,IAAI,EAAE,CAAC;AAC1G,CAAC;AAEDd,oBAAoB,CAACwB,MAAM,GAAGpB,MAAM,IAAI;EACpC,IAAI,CAACA,MAAM,EAAE;IACT;EACJ;EAEAJ,oBAAoB,CAACyB,MAAM,CAACtB,uBAAuB,CAACC,MAAM,CAAC,CAAC;AAChE,CAAC;AAQM,MAAMsB,uBAAuB,GAAAC,OAAA,CAAAD,uBAAA,GAAG1B,oBAA4D","ignoreList":[]}
1
+ {"version":3,"names":["_reactNativeNitroModules","require","HybridShadowRegistry","NitroModules","createHybridObject","findShadowNodeForHandle","handle","node","__internalInstanceHandle","stateNode","getScrollResponder","getNativeScrollRef","Error","add","styles","variants","args","uniquePressableId","Array","isArray","filteredStyles","filter","style","initial","updater","Boolean","link","remove","unlink","UnistylesShadowRegistry","exports"],"sourceRoot":"../../../../src","sources":["specs/ShadowRegistry/index.ts"],"mappings":";;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AAaA,MAAMC,oBAAoB,GAAGC,qCAAY,CAACC,kBAAkB,CAAiB,yBAAyB,CAAC;AAEvG,MAAMC,uBAAuB,GAAIC,MAAkB,IAAK;EACpD,MAAMC,IAAI,GAAGD,MAAM,EAAEE,wBAAwB,EAAEC,SAAS,EAAEF,IAAI,IACvDD,MAAM,EAAEI,kBAAkB,GAAG,CAAC,EAAEC,kBAAkB,GAAG,CAAC,EAAEH,wBAAwB,EAAEC,SAAS,EAAEF,IAAI,IACjGD,MAAM,EAAEK,kBAAkB,GAAG,CAAC,EAAEH,wBAAwB,EAAEC,SAAS,EAAEF,IAAI;EAEhF,IAAI,CAACA,IAAI,EAAE;IACP;IACA,MAAM,IAAIK,KAAK,CAAC,uDAAuD,CAAC;EAC5E;EAEA,OAAOL,IAAI;AACf,CAAC;AAEDL,oBAAoB,CAACW,GAAG,GAAG,CAACP,MAAM,EAAEQ,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,iBAAiB,KAAK;EAC9E;EACA,IAAI,CAACX,MAAM,IAAI,CAACQ,MAAM,IAAI,CAACI,KAAK,CAACC,OAAO,CAACL,MAAM,CAAC,EAAE;IAC9C;EACJ;;EAEA;EACA,MAAMM,cAAc,GAAGN,MAAM,CACxBO,MAAM,CAACC,KAAK,IAAI,CAACA,KAAK,EAAEC,OAAO,EAAEC,OAAO,CAAC,CACzCH,MAAM,CAACI,OAAO,CAAC;EAEpBvB,oBAAoB,CAACwB,IAAI,CAACrB,uBAAuB,CAACC,MAAM,CAAC,EAAEc,cAAc,EAAEL,QAAQ,IAAI,CAAC,CAAC,EAAEC,IAAI,IAAI,EAAE,EAAEC,iBAAiB,CAAC;AAC7H,CAAC;AAEDf,oBAAoB,CAACyB,MAAM,GAAGrB,MAAM,IAAI;EACpC,IAAI,CAACA,MAAM,EAAE;IACT;EACJ;EAEAJ,oBAAoB,CAAC0B,MAAM,CAACvB,uBAAuB,CAACC,MAAM,CAAC,CAAC;AAChE,CAAC;AAQM,MAAMuB,uBAAuB,GAAAC,OAAA,CAAAD,uBAAA,GAAG3B,oBAA4D","ignoreList":[]}
@@ -10,7 +10,7 @@ const findShadowNodeForHandle = handle => {
10
10
  }
11
11
  return node;
12
12
  };
13
- HybridShadowRegistry.add = (handle, styles, variants, args) => {
13
+ HybridShadowRegistry.add = (handle, styles, variants, args, uniquePressableId) => {
14
14
  // virtualized nodes can be null
15
15
  if (!handle || !styles || !Array.isArray(styles)) {
16
16
  return;
@@ -18,7 +18,7 @@ HybridShadowRegistry.add = (handle, styles, variants, args) => {
18
18
 
19
19
  // filter Reanimated styles and styles that are undefined
20
20
  const filteredStyles = styles.filter(style => !style?.initial?.updater).filter(Boolean);
21
- HybridShadowRegistry.link(findShadowNodeForHandle(handle), filteredStyles, variants ?? {}, args ?? []);
21
+ HybridShadowRegistry.link(findShadowNodeForHandle(handle), filteredStyles, variants ?? {}, args ?? [], uniquePressableId);
22
22
  };
23
23
  HybridShadowRegistry.remove = handle => {
24
24
  if (!handle) {
@@ -1 +1 @@
1
- {"version":3,"names":["NitroModules","HybridShadowRegistry","createHybridObject","findShadowNodeForHandle","handle","node","__internalInstanceHandle","stateNode","getScrollResponder","getNativeScrollRef","Error","add","styles","variants","args","Array","isArray","filteredStyles","filter","style","initial","updater","Boolean","link","remove","unlink","UnistylesShadowRegistry"],"sourceRoot":"../../../../src","sources":["specs/ShadowRegistry/index.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAazD,MAAMC,oBAAoB,GAAGD,YAAY,CAACE,kBAAkB,CAAiB,yBAAyB,CAAC;AAEvG,MAAMC,uBAAuB,GAAIC,MAAkB,IAAK;EACpD,MAAMC,IAAI,GAAGD,MAAM,EAAEE,wBAAwB,EAAEC,SAAS,EAAEF,IAAI,IACvDD,MAAM,EAAEI,kBAAkB,GAAG,CAAC,EAAEC,kBAAkB,GAAG,CAAC,EAAEH,wBAAwB,EAAEC,SAAS,EAAEF,IAAI,IACjGD,MAAM,EAAEK,kBAAkB,GAAG,CAAC,EAAEH,wBAAwB,EAAEC,SAAS,EAAEF,IAAI;EAEhF,IAAI,CAACA,IAAI,EAAE;IACP;IACA,MAAM,IAAIK,KAAK,CAAC,uDAAuD,CAAC;EAC5E;EAEA,OAAOL,IAAI;AACf,CAAC;AAEDJ,oBAAoB,CAACU,GAAG,GAAG,CAACP,MAAM,EAAEQ,MAAM,EAAEC,QAAQ,EAAEC,IAAI,KAAK;EAC3D;EACA,IAAI,CAACV,MAAM,IAAI,CAACQ,MAAM,IAAI,CAACG,KAAK,CAACC,OAAO,CAACJ,MAAM,CAAC,EAAE;IAC9C;EACJ;;EAEA;EACA,MAAMK,cAAc,GAAGL,MAAM,CACxBM,MAAM,CAACC,KAAK,IAAI,CAACA,KAAK,EAAEC,OAAO,EAAEC,OAAO,CAAC,CACzCH,MAAM,CAACI,OAAO,CAAC;EAEpBrB,oBAAoB,CAACsB,IAAI,CAACpB,uBAAuB,CAACC,MAAM,CAAC,EAAEa,cAAc,EAAEJ,QAAQ,IAAI,CAAC,CAAC,EAAEC,IAAI,IAAI,EAAE,CAAC;AAC1G,CAAC;AAEDb,oBAAoB,CAACuB,MAAM,GAAGpB,MAAM,IAAI;EACpC,IAAI,CAACA,MAAM,EAAE;IACT;EACJ;EAEAH,oBAAoB,CAACwB,MAAM,CAACtB,uBAAuB,CAACC,MAAM,CAAC,CAAC;AAChE,CAAC;AAQD,OAAO,MAAMsB,uBAAuB,GAAGzB,oBAA4D","ignoreList":[]}
1
+ {"version":3,"names":["NitroModules","HybridShadowRegistry","createHybridObject","findShadowNodeForHandle","handle","node","__internalInstanceHandle","stateNode","getScrollResponder","getNativeScrollRef","Error","add","styles","variants","args","uniquePressableId","Array","isArray","filteredStyles","filter","style","initial","updater","Boolean","link","remove","unlink","UnistylesShadowRegistry"],"sourceRoot":"../../../../src","sources":["specs/ShadowRegistry/index.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAazD,MAAMC,oBAAoB,GAAGD,YAAY,CAACE,kBAAkB,CAAiB,yBAAyB,CAAC;AAEvG,MAAMC,uBAAuB,GAAIC,MAAkB,IAAK;EACpD,MAAMC,IAAI,GAAGD,MAAM,EAAEE,wBAAwB,EAAEC,SAAS,EAAEF,IAAI,IACvDD,MAAM,EAAEI,kBAAkB,GAAG,CAAC,EAAEC,kBAAkB,GAAG,CAAC,EAAEH,wBAAwB,EAAEC,SAAS,EAAEF,IAAI,IACjGD,MAAM,EAAEK,kBAAkB,GAAG,CAAC,EAAEH,wBAAwB,EAAEC,SAAS,EAAEF,IAAI;EAEhF,IAAI,CAACA,IAAI,EAAE;IACP;IACA,MAAM,IAAIK,KAAK,CAAC,uDAAuD,CAAC;EAC5E;EAEA,OAAOL,IAAI;AACf,CAAC;AAEDJ,oBAAoB,CAACU,GAAG,GAAG,CAACP,MAAM,EAAEQ,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,iBAAiB,KAAK;EAC9E;EACA,IAAI,CAACX,MAAM,IAAI,CAACQ,MAAM,IAAI,CAACI,KAAK,CAACC,OAAO,CAACL,MAAM,CAAC,EAAE;IAC9C;EACJ;;EAEA;EACA,MAAMM,cAAc,GAAGN,MAAM,CACxBO,MAAM,CAACC,KAAK,IAAI,CAACA,KAAK,EAAEC,OAAO,EAAEC,OAAO,CAAC,CACzCH,MAAM,CAACI,OAAO,CAAC;EAEpBtB,oBAAoB,CAACuB,IAAI,CAACrB,uBAAuB,CAACC,MAAM,CAAC,EAAEc,cAAc,EAAEL,QAAQ,IAAI,CAAC,CAAC,EAAEC,IAAI,IAAI,EAAE,EAAEC,iBAAiB,CAAC;AAC7H,CAAC;AAEDd,oBAAoB,CAACwB,MAAM,GAAGrB,MAAM,IAAI;EACpC,IAAI,CAACA,MAAM,EAAE;IACT;EACJ;EAEAH,oBAAoB,CAACyB,MAAM,CAACvB,uBAAuB,CAACC,MAAM,CAAC,CAAC;AAChE,CAAC;AAQD,OAAO,MAAMuB,uBAAuB,GAAG1B,oBAA4D","ignoreList":[]}
@@ -1,9 +1,9 @@
1
1
  import type { UnistylesShadowRegistry as UnistylesShadowRegistrySpec } from './ShadowRegistry.nitro';
2
2
  import type { ShadowNode, Unistyle, ViewHandle } from './types';
3
3
  interface ShadowRegistry extends UnistylesShadowRegistrySpec {
4
- add(handle?: ViewHandle, styles?: Array<Unistyle>, variants?: Record<string, string | boolean>, args?: Array<Array<any>>): void;
4
+ add(handle?: ViewHandle, styles?: Array<Unistyle>, variants?: Record<string, string | boolean>, args?: Array<Array<any>>, uniquePressableId?: string): void;
5
5
  remove(handle?: ViewHandle): void;
6
- link(node: ShadowNode, styles?: Array<Unistyle>, variants?: Record<string, string | boolean>, args?: Array<Array<any>>): void;
6
+ link(node: ShadowNode, styles?: Array<Unistyle>, variants?: Record<string, string | boolean>, args?: Array<Array<any>>, uniquePressableId?: string): void;
7
7
  unlink(node: ShadowNode): void;
8
8
  }
9
9
  type PrivateMethods = 'add' | 'remove' | 'link' | 'unlink';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/specs/ShadowRegistry/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,IAAI,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AACpG,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE/D,UAAU,cAAe,SAAQ,2BAA2B;IAExD,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAChI,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAElC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9H,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CACjC;AAuCD,KAAK,cAAc,GACb,KAAK,GACL,QAAQ,GACR,MAAM,GACN,QAAQ,CAAA;AAEd,eAAO,MAAM,uBAAuB,EAA2B,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/specs/ShadowRegistry/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,IAAI,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AACpG,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE/D,UAAU,cAAe,SAAQ,2BAA2B;IAExD,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5J,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAElC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1J,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CACjC;AAuCD,KAAK,cAAc,GACb,KAAK,GACL,QAAQ,GACR,MAAM,GACN,QAAQ,CAAA;AAEd,eAAO,MAAM,uBAAuB,EAA2B,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA"}
@@ -43,7 +43,7 @@ namespace margelo::nitro::unistyles { struct UnistylesNativeMiniRuntime; }
43
43
  #include <NitroModules/ArrayBufferHolder.hpp>
44
44
  #include <NitroModules/AnyMapHolder.hpp>
45
45
  #include <NitroModules/HybridContext.hpp>
46
- #include <NitroModules/PromiseHolder.hpp>
46
+ #include <NitroModules/RuntimeError.hpp>
47
47
 
48
48
  // Forward declarations of Swift defined types
49
49
  // Forward declaration of `HybridNativePlatformSpecCxx` to properly resolve imports.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-unistyles",
3
- "version": "3.0.0-alpha.40",
3
+ "version": "3.0.0-alpha.41",
4
4
  "description": "Level up your React Native StyleSheet",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -74,11 +74,11 @@
74
74
  "husky": "9.1.6",
75
75
  "jest": "29.7.0",
76
76
  "metro-react-native-babel-preset": "0.77.0",
77
- "nitro-codegen": "0.16.2",
77
+ "nitro-codegen": "0.17.0",
78
78
  "react": "18.3.1",
79
79
  "react-native": "0.76.0",
80
80
  "react-native-builder-bob": "0.30.2",
81
- "react-native-nitro-modules": "0.16.2",
81
+ "react-native-nitro-modules": "0.17.0",
82
82
  "react-test-renderer": "18.3.1",
83
83
  "release-it": "17.10.0",
84
84
  "typescript": "5.6.3"
package/plugin/index.js CHANGED
@@ -128,9 +128,9 @@ module.exports = function ({ types: t }) {
128
128
  return
129
129
  }
130
130
 
131
- if (openingElementName === 'Pressable') {
132
- handlePressable(t, path, styleAttr, metadata)
133
- }
131
+ const uniquePressableId = openingElementName === 'Pressable'
132
+ ? handlePressable(t, path, styleAttr, metadata)
133
+ : undefined
134
134
 
135
135
  styleAttributeToArray(t, path)
136
136
 
@@ -144,8 +144,8 @@ module.exports = function ({ types: t }) {
144
144
  }
145
145
 
146
146
  refProp
147
- ? overrideRef(t, path, refProp, metadata, state)
148
- : addRef(t, path, metadata, state)
147
+ ? overrideRef(t, path, refProp, metadata, state, uniquePressableId)
148
+ : addRef(t, path, metadata, state, uniquePressableId)
149
149
  },
150
150
  CallExpression(path, state) {
151
151
  if (isUsingVariants(t, path)) {
package/plugin/ref.js CHANGED
@@ -1,5 +1,9 @@
1
1
  const { PRESSABLE_STATE_NAME } = require('./common')
2
2
 
3
+ function generateUniqueId() {
4
+ return `${Math.random().toString(36).substring(2, 9)}`
5
+ }
6
+
3
7
  function getRefProp(t, path) {
4
8
  return path.node.openingElement.attributes.find(attr =>
5
9
  t.isJSXAttribute(attr) &&
@@ -90,7 +94,8 @@ function arrayFromDynamicFunctionArgs(t, metadata, path) {
90
94
 
91
95
  return t.arrayExpression(memberExpressions)
92
96
  }
93
- function addRef(t, path, metadata, state) {
97
+
98
+ function addRef(t, path, metadata, state, uniquePressableId) {
94
99
  const hasVariants = state.file.hasVariants
95
100
 
96
101
  const newRefFunction = t.arrowFunctionExpression(
@@ -103,8 +108,9 @@ function addRef(t, path, metadata, state) {
103
108
  t.identifier('ref'),
104
109
  arrayExpressionFromMetadata(t, metadata),
105
110
  t.identifier(hasVariants ? '__uni__variants' : 'undefined'),
106
- arrayFromDynamicFunctionArgs(t, metadata, path)
107
- ]
111
+ arrayFromDynamicFunctionArgs(t, metadata, path),
112
+ uniquePressableId ? t.stringLiteral(uniquePressableId) : undefined
113
+ ].filter(Boolean)
108
114
  )
109
115
  ),
110
116
  t.returnStatement(
@@ -126,7 +132,7 @@ function addRef(t, path, metadata, state) {
126
132
  path.node.openingElement.attributes.push(newRefProp)
127
133
  }
128
134
 
129
- function overrideRef(t, path, refProp, metadata, state) {
135
+ function overrideRef(t, path, refProp, metadata, state, uniquePressableId) {
130
136
  const hasVariants = state.file.hasVariants
131
137
  const uniqueRefName = path.scope.generateUidIdentifier('ref').name
132
138
  const isIdentifier = t.isIdentifier(refProp.value.expression)
@@ -152,8 +158,9 @@ function overrideRef(t, path, refProp, metadata, state) {
152
158
  t.identifier(uniqueRefName),
153
159
  arrayExpressionFromMetadata(t, metadata),
154
160
  t.identifier(hasVariants ? '__uni__variants' : 'undefined'),
155
- arrayFromDynamicFunctionArgs(t, metadata, path)
156
- ]
161
+ arrayFromDynamicFunctionArgs(t, metadata, path),
162
+ uniquePressableId ? t.stringLiteral(uniquePressableId) : undefined
163
+ ].filter(Boolean)
157
164
  )
158
165
  ),
159
166
  t.returnStatement(
@@ -197,8 +204,9 @@ function overrideRef(t, path, refProp, metadata, state) {
197
204
  t.identifier(userRefName),
198
205
  arrayExpressionFromMetadata(t, metadata),
199
206
  t.identifier(hasVariants ? '__uni__variants' : 'undefined'),
200
- arrayFromDynamicFunctionArgs(t, metadata, path)
201
- ]
207
+ arrayFromDynamicFunctionArgs(t, metadata, path),
208
+ uniquePressableId ? t.stringLiteral(uniquePressableId) : undefined
209
+ ].filter(Boolean)
202
210
  )
203
211
  ),
204
212
  // Merged cleanup function
@@ -259,8 +267,9 @@ function overrideRef(t, path, refProp, metadata, state) {
259
267
  t.identifier(uniqueRefName),
260
268
  arrayExpressionFromMetadata(t, metadata),
261
269
  t.identifier(hasVariants ? '__uni__variants' : 'undefined'),
262
- arrayFromDynamicFunctionArgs(t, metadata, path)
263
- ]
270
+ arrayFromDynamicFunctionArgs(t, metadata, path),
271
+ uniquePressableId ? t.stringLiteral(uniquePressableId) : undefined
272
+ ].filter(Boolean)
264
273
  )
265
274
  ),
266
275
  t.returnStatement(
@@ -291,5 +300,6 @@ module.exports = {
291
300
  getRefProp,
292
301
  addRef,
293
302
  overrideRef,
294
- hasStringRef
303
+ hasStringRef,
304
+ generateUniqueId
295
305
  }
package/plugin/style.js CHANGED
@@ -1,4 +1,5 @@
1
1
  const { PRESSABLE_STATE_NAME } = require('./common')
2
+ const { generateUniqueId } = require('./ref')
2
3
 
3
4
  function getStyleMetadata(t, node, dynamicFunction = null) {
4
5
  // {styles.container}
@@ -143,6 +144,8 @@ function handlePressable(t, path, styleAttr, metadata) {
143
144
  t.identifier(members[0])
144
145
  )
145
146
 
147
+ const uniquePressableId = generateUniqueId()
148
+
146
149
  // state => typeof style.pressable === 'function' ? style.pressable(state) : style.pressable
147
150
  styleAttr.value.expression = t.arrowFunctionExpression(
148
151
  [t.identifier("state")],
@@ -157,13 +160,18 @@ function handlePressable(t, path, styleAttr, metadata) {
157
160
  ),
158
161
  t.callExpression(
159
162
  stylePath,
160
- [t.identifier("state")]
163
+ [t.identifier("state"), t.objectExpression([
164
+ t.objectProperty(
165
+ t.identifier("__uni_pressable_id"),
166
+ t.stringLiteral(uniquePressableId)
167
+ )
168
+ ])]
161
169
  ),
162
170
  stylePath
163
171
  )
164
172
  )
165
173
 
166
- return
174
+ return uniquePressableId
167
175
  }
168
176
 
169
177
  // {style.pressable(1, 2)}
@@ -212,8 +220,19 @@ function handlePressable(t, path, styleAttr, metadata) {
212
220
  return arg
213
221
  })
214
222
 
223
+ const uniquePressableId = generateUniqueId()
224
+
225
+ args.arguments.push(t.objectExpression([
226
+ t.objectProperty(
227
+ t.identifier("__uni_pressable_id"),
228
+ t.stringLiteral(uniquePressableId)
229
+ )
230
+ ]))
231
+
215
232
  // update arrow function arg name
216
233
  styleExpression.params[0].name = PRESSABLE_STATE_NAME
234
+
235
+ return uniquePressableId
217
236
  }
218
237
  }
219
238
 
@@ -4,10 +4,10 @@ import type { ShadowNode, Unistyle, ViewHandle } from './types'
4
4
 
5
5
  interface ShadowRegistry extends UnistylesShadowRegistrySpec {
6
6
  // Babel API
7
- add(handle?: ViewHandle, styles?: Array<Unistyle>, variants?: Record<string, string | boolean>, args?: Array<Array<any>>): void,
7
+ add(handle?: ViewHandle, styles?: Array<Unistyle>, variants?: Record<string, string | boolean>, args?: Array<Array<any>>, uniquePressableId?: string): void,
8
8
  remove(handle?: ViewHandle): void,
9
9
  // JSI
10
- link(node: ShadowNode, styles?: Array<Unistyle>, variants?: Record<string, string | boolean>, args?: Array<Array<any>>): void,
10
+ link(node: ShadowNode, styles?: Array<Unistyle>, variants?: Record<string, string | boolean>, args?: Array<Array<any>>, uniquePressableId?: string): void,
11
11
  unlink(node: ShadowNode): void
12
12
  }
13
13
 
@@ -26,7 +26,7 @@ const findShadowNodeForHandle = (handle: ViewHandle) => {
26
26
  return node
27
27
  }
28
28
 
29
- HybridShadowRegistry.add = (handle, styles, variants, args) => {
29
+ HybridShadowRegistry.add = (handle, styles, variants, args, uniquePressableId) => {
30
30
  // virtualized nodes can be null
31
31
  if (!handle || !styles || !Array.isArray(styles)) {
32
32
  return
@@ -37,7 +37,7 @@ HybridShadowRegistry.add = (handle, styles, variants, args) => {
37
37
  .filter(style => !style?.initial?.updater)
38
38
  .filter(Boolean)
39
39
 
40
- HybridShadowRegistry.link(findShadowNodeForHandle(handle), filteredStyles, variants ?? {}, args ?? [])
40
+ HybridShadowRegistry.link(findShadowNodeForHandle(handle), filteredStyles, variants ?? {}, args ?? [], uniquePressableId)
41
41
  }
42
42
 
43
43
  HybridShadowRegistry.remove = handle => {