@onekeyfe/react-native-native-list 6.7.0-alpha.378 → 6.7.0-alpha.382

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.
Files changed (116) hide show
  1. package/android/src/main/java/com/onekey/nativelist/HybridNativeList.kt +14 -1
  2. package/android/src/main/java/com/onekey/nativelist/NativeListAccessoryStack.kt +240 -11
  3. package/android/src/main/java/com/onekey/nativelist/NativeListActivityDetailsView.kt +7 -4
  4. package/android/src/main/java/com/onekey/nativelist/NativeListActivityRenderer.kt +6 -3
  5. package/android/src/main/java/com/onekey/nativelist/NativeListButtonGroupRenderer.kt +102 -0
  6. package/android/src/main/java/com/onekey/nativelist/NativeListContainerSlotAdapter.kt +12 -0
  7. package/android/src/main/java/com/onekey/nativelist/NativeListDataRowRenderer.kt +87 -7
  8. package/android/src/main/java/com/onekey/nativelist/NativeListIdentityRenderer.kt +177 -1
  9. package/android/src/main/java/com/onekey/nativelist/NativeListLeadingVisual.kt +43 -14
  10. package/android/src/main/java/com/onekey/nativelist/NativeListMessageRenderer.kt +25 -0
  11. package/android/src/main/java/com/onekey/nativelist/NativeListModels.kt +33 -2
  12. package/android/src/main/java/com/onekey/nativelist/NativeListPrimitives.kt +22 -0
  13. package/android/src/main/java/com/onekey/nativelist/NativeListRendererRegistry.kt +2 -0
  14. package/android/src/main/java/com/onekey/nativelist/NativeListRendererRowView.kt +2 -0
  15. package/android/src/main/java/com/onekey/nativelist/NativeListResolvedText.kt +3 -2
  16. package/android/src/main/java/com/onekey/nativelist/NativeListSectionHeaderRenderer.kt +69 -0
  17. package/android/src/main/java/com/onekey/nativelist/NativeListTextView.kt +55 -1
  18. package/android/src/main/java/com/onekey/nativelist/NativeListView.kt +1912 -107
  19. package/android/src/test/java/com/margelo/nitro/nativelist/NativeListPressPolicyTest.kt +1 -0
  20. package/docs/ROW_TEMPLATES.md +60 -9
  21. package/docs/SPEC.md +450 -5
  22. package/docs/STYLE_SPEC.md +6 -0
  23. package/ios/HybridNativeList.swift +21 -2
  24. package/ios/NativeListAccessoryStack.swift +227 -39
  25. package/ios/NativeListActivityDetailsView.swift +18 -8
  26. package/ios/NativeListActivityRenderer.swift +8 -2
  27. package/ios/NativeListButtonGroupRenderer.swift +89 -0
  28. package/ios/NativeListDataRowRenderer.swift +155 -27
  29. package/ios/NativeListDesignAssets.swift +3 -0
  30. package/ios/NativeListIdentityRenderer.swift +166 -30
  31. package/ios/NativeListLeadingVisual.swift +49 -14
  32. package/ios/NativeListMessageRenderer.swift +34 -1
  33. package/ios/NativeListModels.swift +42 -2
  34. package/ios/NativeListRendererRegistry.swift +1 -0
  35. package/ios/NativeListResolvedText.swift +2 -1
  36. package/ios/NativeListRowHost.swift +14 -0
  37. package/ios/NativeListSectionHeaderRenderer.swift +88 -0
  38. package/ios/RNCNativeListView.swift +1013 -55
  39. package/ios/Resources/NativeListIcons.xcassets/onekey_crypto_coin_outline.imageset/Contents.json +15 -0
  40. package/ios/Resources/NativeListIcons.xcassets/onekey_crypto_coin_outline.imageset/icon.svg +4 -0
  41. package/ios/Resources/NativeListIcons.xcassets/onekey_gas_solid.imageset/Contents.json +15 -0
  42. package/ios/Resources/NativeListIcons.xcassets/onekey_gas_solid.imageset/icon.svg +3 -0
  43. package/ios/Resources/NativeListIcons.xcassets/onekey_refresh_ccw_outline.imageset/Contents.json +15 -0
  44. package/ios/Resources/NativeListIcons.xcassets/onekey_refresh_ccw_outline.imageset/icon.svg +3 -0
  45. package/ios/tests/NativeListActivityPresentationTests.swift +56 -0
  46. package/ios/tests/NativeListLifecycleTests.swift +2720 -3
  47. package/lib/module/NativeList.js +175 -28
  48. package/lib/module/NativeList.web.js +129 -30
  49. package/lib/module/index.js +1 -1
  50. package/lib/module/models.js +1 -0
  51. package/lib/module/selection.js +1 -1
  52. package/lib/module/validation.js +421 -8
  53. package/lib/module/web/NativeListWebEngine.js +507 -19
  54. package/lib/module/web/templates/ActivityRowRenderer.js +8 -7
  55. package/lib/module/web/templates/ButtonGroupRowRenderer.js +47 -0
  56. package/lib/module/web/templates/DataRowRenderer.js +40 -5
  57. package/lib/module/web/templates/IdentityRowRenderer.js +90 -4
  58. package/lib/module/web/templates/MessageRowRenderer.js +18 -2
  59. package/lib/module/web/templates/RowContainerStyle.js +1 -0
  60. package/lib/module/web/templates/RowRendererRegistry.js +3 -0
  61. package/lib/module/web/templates/SectionHeaderRowRenderer.js +36 -2
  62. package/lib/nitrogen/generated/android/c++/JHybridNativeListSpec.cpp +26 -0
  63. package/lib/nitrogen/generated/android/c++/JHybridNativeListSpec.hpp +4 -0
  64. package/lib/nitrogen/generated/android/c++/views/JHybridNativeListStateUpdater.cpp +10 -0
  65. package/lib/nitrogen/generated/android/kotlin/com/margelo/nitro/nativelist/HybridNativeListSpec.kt +20 -0
  66. package/lib/nitrogen/generated/ios/c++/HybridNativeListSpecSwift.hpp +14 -0
  67. package/lib/nitrogen/generated/ios/c++/views/HybridNativeListComponent.mm +12 -0
  68. package/lib/nitrogen/generated/ios/swift/HybridNativeListSpec.swift +2 -0
  69. package/lib/nitrogen/generated/ios/swift/HybridNativeListSpec_cxx.swift +43 -0
  70. package/lib/nitrogen/generated/shared/c++/HybridNativeListSpec.cpp +4 -0
  71. package/lib/nitrogen/generated/shared/c++/HybridNativeListSpec.hpp +4 -0
  72. package/lib/nitrogen/generated/shared/c++/views/HybridNativeListComponent.cpp +4 -0
  73. package/lib/nitrogen/generated/shared/c++/views/HybridNativeListComponent.hpp +6 -0
  74. package/lib/nitrogen/generated/shared/json/NativeListConfig.json +2 -0
  75. package/lib/typescript/src/NativeList.d.ts +1 -1
  76. package/lib/typescript/src/NativeList.nitro.d.ts +2 -0
  77. package/lib/typescript/src/NativeList.types.d.ts +18 -0
  78. package/lib/typescript/src/index.d.ts +2 -2
  79. package/lib/typescript/src/models.d.ts +105 -9
  80. package/lib/typescript/src/validation.d.ts +12 -0
  81. package/lib/typescript/src/web/NativeListWebEngine.d.ts +32 -0
  82. package/lib/typescript/src/web/templates/ButtonGroupRowRenderer.d.ts +14 -0
  83. package/lib/typescript/src/web/templates/IdentityRowRenderer.d.ts +1 -1
  84. package/lib/typescript/src/web/templates/MessageRowRenderer.d.ts +9 -3
  85. package/nitrogen/generated/android/c++/JHybridNativeListSpec.cpp +26 -0
  86. package/nitrogen/generated/android/c++/JHybridNativeListSpec.hpp +4 -0
  87. package/nitrogen/generated/android/c++/views/JHybridNativeListStateUpdater.cpp +10 -0
  88. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nativelist/HybridNativeListSpec.kt +20 -0
  89. package/nitrogen/generated/ios/c++/HybridNativeListSpecSwift.hpp +14 -0
  90. package/nitrogen/generated/ios/c++/views/HybridNativeListComponent.mm +12 -0
  91. package/nitrogen/generated/ios/swift/HybridNativeListSpec.swift +2 -0
  92. package/nitrogen/generated/ios/swift/HybridNativeListSpec_cxx.swift +43 -0
  93. package/nitrogen/generated/shared/c++/HybridNativeListSpec.cpp +4 -0
  94. package/nitrogen/generated/shared/c++/HybridNativeListSpec.hpp +4 -0
  95. package/nitrogen/generated/shared/c++/views/HybridNativeListComponent.cpp +4 -0
  96. package/nitrogen/generated/shared/c++/views/HybridNativeListComponent.hpp +6 -0
  97. package/nitrogen/generated/shared/json/NativeListConfig.json +2 -0
  98. package/package.json +3 -3
  99. package/react-native-native-list.podspec +1 -0
  100. package/src/NativeList.nitro.ts +2 -0
  101. package/src/NativeList.tsx +313 -44
  102. package/src/NativeList.types.ts +22 -0
  103. package/src/NativeList.web.tsx +204 -48
  104. package/src/index.ts +2 -0
  105. package/src/models.ts +117 -3
  106. package/src/selection.ts +1 -0
  107. package/src/validation.ts +852 -6
  108. package/src/web/NativeListWebEngine.ts +803 -20
  109. package/src/web/templates/ActivityRowRenderer.ts +14 -6
  110. package/src/web/templates/ButtonGroupRowRenderer.ts +58 -0
  111. package/src/web/templates/DataRowRenderer.ts +93 -20
  112. package/src/web/templates/IdentityRowRenderer.ts +150 -5
  113. package/src/web/templates/MessageRowRenderer.ts +23 -7
  114. package/src/web/templates/RowContainerStyle.ts +2 -0
  115. package/src/web/templates/RowRendererRegistry.ts +11 -1
  116. package/src/web/templates/SectionHeaderRowRenderer.ts +47 -4
@@ -96,6 +96,13 @@ namespace margelo::nitro::nativelist {
96
96
  inline void setContainerSlotHeightsJson(const std::string& containerSlotHeightsJson) noexcept override {
97
97
  _swiftPart.setContainerSlotHeightsJson(containerSlotHeightsJson);
98
98
  }
99
+ inline std::string getSidecarLayoutJson() noexcept override {
100
+ auto __result = _swiftPart.getSidecarLayoutJson();
101
+ return __result;
102
+ }
103
+ inline void setSidecarLayoutJson(const std::string& sidecarLayoutJson) noexcept override {
104
+ _swiftPart.setSidecarLayoutJson(sidecarLayoutJson);
105
+ }
99
106
  inline NativeListScrollEdgeEffect getTopScrollEdgeEffect() noexcept override {
100
107
  auto __result = _swiftPart.getTopScrollEdgeEffect();
101
108
  return static_cast<NativeListScrollEdgeEffect>(__result);
@@ -179,6 +186,13 @@ namespace margelo::nitro::nativelist {
179
186
  inline void setOnVisibleRangeChanged(const std::optional<std::function<void(const std::string& /* payloadJson */)>>& onVisibleRangeChanged) noexcept override {
180
187
  _swiftPart.setOnVisibleRangeChanged(onVisibleRangeChanged);
181
188
  }
189
+ inline std::optional<std::function<void(const std::string& /* payloadJson */)>> getOnStructuralTransitionSettled() noexcept override {
190
+ auto __result = _swiftPart.getOnStructuralTransitionSettled();
191
+ return __result;
192
+ }
193
+ inline void setOnStructuralTransitionSettled(const std::optional<std::function<void(const std::string& /* payloadJson */)>>& onStructuralTransitionSettled) noexcept override {
194
+ _swiftPart.setOnStructuralTransitionSettled(onStructuralTransitionSettled);
195
+ }
182
196
 
183
197
  public:
184
198
  // Methods
@@ -130,6 +130,12 @@ using namespace margelo::nitro::nativelist::views;
130
130
  : !newViewProps.containerSlotHeightsJson.hasSameValue(oldViewProps->containerSlotHeightsJson)) {
131
131
  swiftPart.setContainerSlotHeightsJson(newViewProps.containerSlotHeightsJson.get());
132
132
  }
133
+ // sidecarLayoutJson: string
134
+ if (oldViewProps == nullptr
135
+ ? newViewProps.sidecarLayoutJson.isProvided()
136
+ : !newViewProps.sidecarLayoutJson.hasSameValue(oldViewProps->sidecarLayoutJson)) {
137
+ swiftPart.setSidecarLayoutJson(newViewProps.sidecarLayoutJson.get());
138
+ }
133
139
  // topScrollEdgeEffect: enum
134
140
  if (oldViewProps == nullptr
135
141
  ? newViewProps.topScrollEdgeEffect.isProvided()
@@ -202,6 +208,12 @@ using namespace margelo::nitro::nativelist::views;
202
208
  : !newViewProps.onVisibleRangeChanged.hasSameValue(oldViewProps->onVisibleRangeChanged)) {
203
209
  swiftPart.setOnVisibleRangeChanged(newViewProps.onVisibleRangeChanged.get());
204
210
  }
211
+ // onStructuralTransitionSettled: optional
212
+ if (oldViewProps == nullptr
213
+ ? newViewProps.onStructuralTransitionSettled.isProvided()
214
+ : !newViewProps.onStructuralTransitionSettled.hasSameValue(oldViewProps->onStructuralTransitionSettled)) {
215
+ swiftPart.setOnStructuralTransitionSettled(newViewProps.onStructuralTransitionSettled.get());
216
+ }
205
217
 
206
218
  // Update hybridRef if it changed
207
219
  if (oldViewProps == nullptr
@@ -13,6 +13,7 @@ public protocol HybridNativeListSpec_protocol: HybridObject, HybridView {
13
13
  var snapshotJson: String { get set }
14
14
  var fontFamiliesJson: String { get set }
15
15
  var containerSlotHeightsJson: String { get set }
16
+ var sidecarLayoutJson: String { get set }
16
17
  var topScrollEdgeEffect: NativeListScrollEdgeEffect { get set }
17
18
  var topOverlayHeight: Double { get set }
18
19
  var scrollPositionThresholdsJson: String { get set }
@@ -25,6 +26,7 @@ public protocol HybridNativeListSpec_protocol: HybridObject, HybridView {
25
26
  var onReorder: ((_ payloadJson: String) -> Void)? { get set }
26
27
  var onEndReached: ((_ payloadJson: String) -> Void)? { get set }
27
28
  var onVisibleRangeChanged: ((_ payloadJson: String) -> Void)? { get set }
29
+ var onStructuralTransitionSettled: ((_ payloadJson: String) -> Void)? { get set }
28
30
 
29
31
  // Methods
30
32
  func applySnapshot(snapshotJson: String) throws -> Void
@@ -154,6 +154,17 @@ open class HybridNativeListSpec_cxx {
154
154
  }
155
155
  }
156
156
 
157
+ public final var sidecarLayoutJson: std.string {
158
+ @inline(__always)
159
+ get {
160
+ return std.string(self.__implementation.sidecarLayoutJson)
161
+ }
162
+ @inline(__always)
163
+ set {
164
+ self.__implementation.sidecarLayoutJson = String(newValue)
165
+ }
166
+ }
167
+
157
168
  public final var topScrollEdgeEffect: Int32 {
158
169
  @inline(__always)
159
170
  get {
@@ -432,6 +443,38 @@ open class HybridNativeListSpec_cxx {
432
443
  }()
433
444
  }
434
445
  }
446
+
447
+ public final var onStructuralTransitionSettled: bridge.std__optional_std__function_void_const_std__string_____payloadJson______ {
448
+ @inline(__always)
449
+ get {
450
+ return { () -> bridge.std__optional_std__function_void_const_std__string_____payloadJson______ in
451
+ if let __unwrappedValue = self.__implementation.onStructuralTransitionSettled {
452
+ return bridge.create_std__optional_std__function_void_const_std__string_____payloadJson______({ () -> bridge.Func_void_std__string in
453
+ let __closureWrapper = Func_void_std__string(__unwrappedValue)
454
+ return bridge.create_Func_void_std__string(__closureWrapper.toUnsafe())
455
+ }())
456
+ } else {
457
+ return .init()
458
+ }
459
+ }()
460
+ }
461
+ @inline(__always)
462
+ set {
463
+ self.__implementation.onStructuralTransitionSettled = { () -> ((_ payloadJson: String) -> Void)? in
464
+ if bridge.has_value_std__optional_std__function_void_const_std__string_____payloadJson______(newValue) {
465
+ let __unwrapped = bridge.get_std__optional_std__function_void_const_std__string_____payloadJson______(newValue)
466
+ return { () -> (String) -> Void in
467
+ let __wrappedFunction = bridge.wrap_Func_void_std__string(__unwrapped)
468
+ return { (__payloadJson: String) -> Void in
469
+ __wrappedFunction.call(std.string(__payloadJson))
470
+ }
471
+ }()
472
+ } else {
473
+ return nil
474
+ }
475
+ }()
476
+ }
477
+ }
435
478
 
436
479
  // Methods
437
480
  @inline(__always)
@@ -20,6 +20,8 @@ namespace margelo::nitro::nativelist {
20
20
  prototype.registerHybridSetter("fontFamiliesJson", &HybridNativeListSpec::setFontFamiliesJson);
21
21
  prototype.registerHybridGetter("containerSlotHeightsJson", &HybridNativeListSpec::getContainerSlotHeightsJson);
22
22
  prototype.registerHybridSetter("containerSlotHeightsJson", &HybridNativeListSpec::setContainerSlotHeightsJson);
23
+ prototype.registerHybridGetter("sidecarLayoutJson", &HybridNativeListSpec::getSidecarLayoutJson);
24
+ prototype.registerHybridSetter("sidecarLayoutJson", &HybridNativeListSpec::setSidecarLayoutJson);
23
25
  prototype.registerHybridGetter("topScrollEdgeEffect", &HybridNativeListSpec::getTopScrollEdgeEffect);
24
26
  prototype.registerHybridSetter("topScrollEdgeEffect", &HybridNativeListSpec::setTopScrollEdgeEffect);
25
27
  prototype.registerHybridGetter("topOverlayHeight", &HybridNativeListSpec::getTopOverlayHeight);
@@ -44,6 +46,8 @@ namespace margelo::nitro::nativelist {
44
46
  prototype.registerHybridSetter("onEndReached", &HybridNativeListSpec::setOnEndReached);
45
47
  prototype.registerHybridGetter("onVisibleRangeChanged", &HybridNativeListSpec::getOnVisibleRangeChanged);
46
48
  prototype.registerHybridSetter("onVisibleRangeChanged", &HybridNativeListSpec::setOnVisibleRangeChanged);
49
+ prototype.registerHybridGetter("onStructuralTransitionSettled", &HybridNativeListSpec::getOnStructuralTransitionSettled);
50
+ prototype.registerHybridSetter("onStructuralTransitionSettled", &HybridNativeListSpec::setOnStructuralTransitionSettled);
47
51
  prototype.registerHybridMethod("applySnapshot", &HybridNativeListSpec::applySnapshot);
48
52
  prototype.registerHybridMethod("applyPatches", &HybridNativeListSpec::applyPatches);
49
53
  prototype.registerHybridMethod("reconcileSelection", &HybridNativeListSpec::reconcileSelection);
@@ -63,6 +63,8 @@ namespace margelo::nitro::nativelist {
63
63
  virtual void setFontFamiliesJson(const std::string& fontFamiliesJson) = 0;
64
64
  virtual std::string getContainerSlotHeightsJson() = 0;
65
65
  virtual void setContainerSlotHeightsJson(const std::string& containerSlotHeightsJson) = 0;
66
+ virtual std::string getSidecarLayoutJson() = 0;
67
+ virtual void setSidecarLayoutJson(const std::string& sidecarLayoutJson) = 0;
66
68
  virtual NativeListScrollEdgeEffect getTopScrollEdgeEffect() = 0;
67
69
  virtual void setTopScrollEdgeEffect(NativeListScrollEdgeEffect topScrollEdgeEffect) = 0;
68
70
  virtual double getTopOverlayHeight() = 0;
@@ -87,6 +89,8 @@ namespace margelo::nitro::nativelist {
87
89
  virtual void setOnEndReached(const std::optional<std::function<void(const std::string& /* payloadJson */)>>& onEndReached) = 0;
88
90
  virtual std::optional<std::function<void(const std::string& /* payloadJson */)>> getOnVisibleRangeChanged() = 0;
89
91
  virtual void setOnVisibleRangeChanged(const std::optional<std::function<void(const std::string& /* payloadJson */)>>& onVisibleRangeChanged) = 0;
92
+ virtual std::optional<std::function<void(const std::string& /* payloadJson */)>> getOnStructuralTransitionSettled() = 0;
93
+ virtual void setOnStructuralTransitionSettled(const std::optional<std::function<void(const std::string& /* payloadJson */)>>& onStructuralTransitionSettled) = 0;
90
94
 
91
95
  public:
92
96
  // Methods
@@ -23,6 +23,7 @@ namespace margelo::nitro::nativelist::views {
23
23
  snapshotJson(nitro::ReactProp<std::string>::fromRawValue("NativeList", "snapshotJson", rawProps, sourceProps.snapshotJson)),
24
24
  fontFamiliesJson(nitro::ReactProp<std::string>::fromRawValue("NativeList", "fontFamiliesJson", rawProps, sourceProps.fontFamiliesJson)),
25
25
  containerSlotHeightsJson(nitro::ReactProp<std::string>::fromRawValue("NativeList", "containerSlotHeightsJson", rawProps, sourceProps.containerSlotHeightsJson)),
26
+ sidecarLayoutJson(nitro::ReactProp<std::string>::fromRawValue("NativeList", "sidecarLayoutJson", rawProps, sourceProps.sidecarLayoutJson)),
26
27
  topScrollEdgeEffect(nitro::ReactProp<NativeListScrollEdgeEffect>::fromRawValue("NativeList", "topScrollEdgeEffect", rawProps, sourceProps.topScrollEdgeEffect)),
27
28
  topOverlayHeight(nitro::ReactProp<double>::fromRawValue("NativeList", "topOverlayHeight", rawProps, sourceProps.topOverlayHeight)),
28
29
  scrollPositionThresholdsJson(nitro::ReactProp<std::string>::fromRawValue("NativeList", "scrollPositionThresholdsJson", rawProps, sourceProps.scrollPositionThresholdsJson)),
@@ -35,6 +36,7 @@ namespace margelo::nitro::nativelist::views {
35
36
  onReorder(nitro::ReactProp<std::optional<std::function<void(const std::string& /* payloadJson */)>>>::fromRawValue("NativeList", "onReorder", rawProps, sourceProps.onReorder)),
36
37
  onEndReached(nitro::ReactProp<std::optional<std::function<void(const std::string& /* payloadJson */)>>>::fromRawValue("NativeList", "onEndReached", rawProps, sourceProps.onEndReached)),
37
38
  onVisibleRangeChanged(nitro::ReactProp<std::optional<std::function<void(const std::string& /* payloadJson */)>>>::fromRawValue("NativeList", "onVisibleRangeChanged", rawProps, sourceProps.onVisibleRangeChanged)),
39
+ onStructuralTransitionSettled(nitro::ReactProp<std::optional<std::function<void(const std::string& /* payloadJson */)>>>::fromRawValue("NativeList", "onStructuralTransitionSettled", rawProps, sourceProps.onStructuralTransitionSettled)),
38
40
  hybridRef(nitro::ReactProp<std::optional<std::function<void(const std::shared_ptr<HybridNativeListSpec>& /* ref */)>>>::fromRawValue("NativeList", "hybridRef", rawProps, sourceProps.hybridRef)) { }
39
41
 
40
42
  bool HybridNativeListProps::filterObjectKeys(const std::string& propName) {
@@ -42,6 +44,7 @@ namespace margelo::nitro::nativelist::views {
42
44
  case hashString("snapshotJson"): return true;
43
45
  case hashString("fontFamiliesJson"): return true;
44
46
  case hashString("containerSlotHeightsJson"): return true;
47
+ case hashString("sidecarLayoutJson"): return true;
45
48
  case hashString("topScrollEdgeEffect"): return true;
46
49
  case hashString("topOverlayHeight"): return true;
47
50
  case hashString("scrollPositionThresholdsJson"): return true;
@@ -54,6 +57,7 @@ namespace margelo::nitro::nativelist::views {
54
57
  case hashString("onReorder"): return true;
55
58
  case hashString("onEndReached"): return true;
56
59
  case hashString("onVisibleRangeChanged"): return true;
60
+ case hashString("onStructuralTransitionSettled"): return true;
57
61
  case hashString("hybridRef"): return true;
58
62
  default: return false;
59
63
  }
@@ -49,6 +49,7 @@ namespace margelo::nitro::nativelist::views {
49
49
  nitro::ReactProp<std::string> snapshotJson;
50
50
  nitro::ReactProp<std::string> fontFamiliesJson;
51
51
  nitro::ReactProp<std::string> containerSlotHeightsJson;
52
+ nitro::ReactProp<std::string> sidecarLayoutJson;
52
53
  nitro::ReactProp<NativeListScrollEdgeEffect> topScrollEdgeEffect;
53
54
  nitro::ReactProp<double> topOverlayHeight;
54
55
  nitro::ReactProp<std::string> scrollPositionThresholdsJson;
@@ -61,6 +62,7 @@ namespace margelo::nitro::nativelist::views {
61
62
  nitro::ReactProp<std::optional<std::function<void(const std::string& /* payloadJson */)>>> onReorder;
62
63
  nitro::ReactProp<std::optional<std::function<void(const std::string& /* payloadJson */)>>> onEndReached;
63
64
  nitro::ReactProp<std::optional<std::function<void(const std::string& /* payloadJson */)>>> onVisibleRangeChanged;
65
+ nitro::ReactProp<std::optional<std::function<void(const std::string& /* payloadJson */)>>> onStructuralTransitionSettled;
64
66
  nitro::ReactProp<std::optional<std::function<void(const std::shared_ptr<HybridNativeListSpec>& /* ref */)>>> hybridRef;
65
67
 
66
68
  [[nodiscard]]
@@ -68,6 +70,7 @@ namespace margelo::nitro::nativelist::views {
68
70
  return snapshotJson.hasSameValue(other.snapshotJson) &&
69
71
  fontFamiliesJson.hasSameValue(other.fontFamiliesJson) &&
70
72
  containerSlotHeightsJson.hasSameValue(other.containerSlotHeightsJson) &&
73
+ sidecarLayoutJson.hasSameValue(other.sidecarLayoutJson) &&
71
74
  topScrollEdgeEffect.hasSameValue(other.topScrollEdgeEffect) &&
72
75
  topOverlayHeight.hasSameValue(other.topOverlayHeight) &&
73
76
  scrollPositionThresholdsJson.hasSameValue(other.scrollPositionThresholdsJson) &&
@@ -80,6 +83,7 @@ namespace margelo::nitro::nativelist::views {
80
83
  onReorder.hasSameValue(other.onReorder) &&
81
84
  onEndReached.hasSameValue(other.onEndReached) &&
82
85
  onVisibleRangeChanged.hasSameValue(other.onVisibleRangeChanged) &&
86
+ onStructuralTransitionSettled.hasSameValue(other.onStructuralTransitionSettled) &&
83
87
  hybridRef.hasSameValue(other.hybridRef);
84
88
  }
85
89
 
@@ -88,6 +92,7 @@ namespace margelo::nitro::nativelist::views {
88
92
  return snapshotJson.isProvided() ||
89
93
  fontFamiliesJson.isProvided() ||
90
94
  containerSlotHeightsJson.isProvided() ||
95
+ sidecarLayoutJson.isProvided() ||
91
96
  topScrollEdgeEffect.isProvided() ||
92
97
  topOverlayHeight.isProvided() ||
93
98
  scrollPositionThresholdsJson.isProvided() ||
@@ -100,6 +105,7 @@ namespace margelo::nitro::nativelist::views {
100
105
  onReorder.isProvided() ||
101
106
  onEndReached.isProvided() ||
102
107
  onVisibleRangeChanged.isProvided() ||
108
+ onStructuralTransitionSettled.isProvided() ||
103
109
  hybridRef.isProvided();
104
110
  }
105
111
 
@@ -7,6 +7,7 @@
7
7
  "snapshotJson": true,
8
8
  "fontFamiliesJson": true,
9
9
  "containerSlotHeightsJson": true,
10
+ "sidecarLayoutJson": true,
10
11
  "topScrollEdgeEffect": true,
11
12
  "topOverlayHeight": true,
12
13
  "scrollPositionThresholdsJson": true,
@@ -19,6 +20,7 @@
19
20
  "onReorder": true,
20
21
  "onEndReached": true,
21
22
  "onVisibleRangeChanged": true,
23
+ "onStructuralTransitionSettled": true,
22
24
  "hybridRef": true
23
25
  }
24
26
  }
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { ImageSource, NativeListSnapshot } from './models';
3
3
  import type { NativeListProps } from './NativeList.types';
4
- export type { NativeListProps, NativeListRef } from './NativeList.types';
4
+ export type { NativeListProps, NativeListRef, StructuralTransitionSettledEvent, } from './NativeList.types';
5
5
  export type { ActionAnchorState, NativeListKeyboardDismissMode, NativeListKeyboardShouldPersistTaps, ScrollAlignment, ScrollPositionOptions, ScrollToEndParams, ScrollToIndexFailedInfo, ScrollToIndexParams, ScrollToItemParams, ScrollToKeyParams, ScrollToLocationParams, ScrollToOffsetParams, } from './NativeList.types';
6
6
  export declare function preloadNativeListAvatarImages(sources: readonly ImageSource[]): Promise<boolean>;
7
7
  export declare const NativeList: React.ForwardRefExoticComponent<NativeListProps & React.RefAttributes<Readonly<{
@@ -8,6 +8,7 @@ export interface NativeListNativeProps extends HybridViewProps {
8
8
  snapshotJson: string;
9
9
  fontFamiliesJson: string;
10
10
  containerSlotHeightsJson: string;
11
+ sidecarLayoutJson: string;
11
12
  topScrollEdgeEffect: NativeListScrollEdgeEffect;
12
13
  topOverlayHeight: number;
13
14
  scrollPositionThresholdsJson: string;
@@ -20,6 +21,7 @@ export interface NativeListNativeProps extends HybridViewProps {
20
21
  onReorder?: (payloadJson: string) => void;
21
22
  onEndReached?: (payloadJson: string) => void;
22
23
  onVisibleRangeChanged?: (payloadJson: string) => void;
24
+ onStructuralTransitionSettled?: (payloadJson: string) => void;
23
25
  }
24
26
  export type NativeListKeyboardDismissMode = 'none' | 'on-drag' | 'interactive';
25
27
  export type NativeListKeyboardShouldPersistTaps = 'never' | 'always' | 'handled';
@@ -49,6 +49,16 @@ export type NativeListWebScrollHost = Readonly<{
49
49
  clientHeight: number;
50
50
  scrollTop: number;
51
51
  }>;
52
+ export type NativeListSidecarLayout = Readonly<{
53
+ width: number;
54
+ gap: number;
55
+ maxContentWidth: number;
56
+ }>;
57
+ export type StructuralTransitionSettledEvent = Readonly<{
58
+ transitionId: string;
59
+ status: 'completed' | 'interrupted';
60
+ settledExpanded: boolean;
61
+ }>;
52
62
  type InitialScrollProps = Readonly<{
53
63
  initialScrollIndex?: never;
54
64
  initialScrollKey?: never;
@@ -86,6 +96,13 @@ export type NativeListProps = Omit<ViewProps, 'children'> & Readonly<{
86
96
  listHeader?: ReactNode;
87
97
  listFooter?: ReactNode;
88
98
  listEmpty?: ReactNode;
99
+ /** Native disclosure content, retained until its transition settles. */
100
+ listExpandedContent?: ReactNode;
101
+ /** Stable native disclosure toggle after expanded content. */
102
+ listStructureToggle?: ReactNode;
103
+ /** Scrolling right column for a vertical linear list. Requires sidecarLayout. */
104
+ listSidecar?: ReactNode;
105
+ sidecarLayout?: NativeListSidecarLayout;
89
106
  /** Fixed overlay above scrolling rows on iOS 26 and newer. */
90
107
  topOverlay?: ReactNode;
91
108
  /** Selects UIKit's top scroll-edge effect on iOS 26 and newer. */
@@ -111,6 +128,7 @@ export type NativeListProps = Omit<ViewProps, 'children'> & Readonly<{
111
128
  onReorder?: (event: ReorderEvent) => void;
112
129
  onEndReached?: (event: EndReachedEvent) => void;
113
130
  onVisibleRangeChanged?: (event: VisibleRangeChangedEvent) => void;
131
+ onStructuralTransitionSettled?: (event: StructuralTransitionSettledEvent) => void;
114
132
  /** Native only. Emits initial state and hysteresis transitions, not scroll frames. */
115
133
  scrollPositionThresholds?: Readonly<{
116
134
  start: number;
@@ -1,7 +1,7 @@
1
1
  export { NativeList, preloadNativeListAvatarImages } from './NativeList';
2
- export type { ActionAnchorState, NativeListKeyboardDismissMode, NativeListKeyboardShouldPersistTaps, NativeListProps, NativeListRef, ScrollAlignment, ScrollPositionOptions, ScrollToEndParams, ScrollToIndexFailedInfo, ScrollToIndexParams, ScrollToItemParams, ScrollToKeyParams, ScrollToLocationParams, ScrollToOffsetParams, } from './NativeList';
2
+ export type { ActionAnchorState, NativeListKeyboardDismissMode, NativeListKeyboardShouldPersistTaps, NativeListProps, NativeListRef, ScrollAlignment, ScrollPositionOptions, ScrollToEndParams, ScrollToIndexFailedInfo, ScrollToIndexParams, ScrollToItemParams, ScrollToKeyParams, ScrollToLocationParams, ScrollToOffsetParams, StructuralTransitionSettledEvent, } from './NativeList';
3
3
  export type * from './models';
4
- export { applyRowPatches, serializePatches, serializeSnapshot, validatePatches, validateSnapshot, } from './validation';
4
+ export { applyRowPatches, planNativeListPatches, serializePatches, serializeSnapshot, validatePatches, validateSnapshot, } from './validation';
5
5
  export { checkboxStateForKeys, checkboxStateForSection, isSelectableRow, reduceSelection, selectionStateFromSnapshot, } from './selection';
6
6
  export type { SelectionAction, SelectionResult, SelectionState, } from './selection';
7
7
  export { configureNativeListFonts } from './fonts';
@@ -97,6 +97,7 @@ export declare const ROW_BOX_STYLE_KEYS_BY_TYPE: {
97
97
  readonly metricCard: readonly ["horizontalPadding", "verticalPadding", "leadingGap", "lineGap", "image"];
98
98
  readonly sectionHeader: readonly ["horizontalPadding", "verticalPadding", "lineGap", "trailingGap"];
99
99
  readonly action: readonly ["horizontalPadding", "verticalPadding", "leadingGap", "trailingGap", "image"];
100
+ readonly buttonGroup: readonly [];
100
101
  readonly system: readonly ["horizontalPadding", "verticalPadding", "lineGap"];
101
102
  };
102
103
  type TemplateBoxStyle<T extends keyof typeof ROW_BOX_STYLE_KEYS_BY_TYPE> = Pick<RowBoxStyle, (typeof ROW_BOX_STYLE_KEYS_BY_TYPE)[T][number] | 'container'>;
@@ -107,6 +108,7 @@ type TemplateBoxStyle<T extends keyof typeof ROW_BOX_STYLE_KEYS_BY_TYPE> = Pick<
107
108
  * the same key name keeps one meaning across platforms. See docs/STYLE_SPEC.md §4.
108
109
  */
109
110
  export type IdentityRowStyle = TemplateBoxStyle<'identity'> & Readonly<{
111
+ leadingContentMaxWidthRatio?: number;
110
112
  title?: NativeListTextStyle;
111
113
  subtitle?: NativeListTextStyle;
112
114
  tertiary?: NativeListTextStyle;
@@ -168,6 +170,13 @@ export type SectionHeaderRowStyle = TemplateBoxStyle<'sectionHeader'> & Readonly
168
170
  title?: NativeListTextStyle;
169
171
  subtitle?: NativeListTextStyle;
170
172
  value?: NativeListTextStyle;
173
+ valuePlacement?: 'afterTitle';
174
+ titleDecoration?: 'none' | 'dashed';
175
+ }>;
176
+ export type RowTextHelp = Readonly<{
177
+ actionKey: string;
178
+ presentation: 'tooltip' | 'popover';
179
+ underline?: 'dashed';
171
180
  }>;
172
181
  export type ActionRowStyle = TemplateBoxStyle<'action'> & Readonly<{
173
182
  title?: NativeListTextStyle;
@@ -225,8 +234,13 @@ export type VisualOverlay = Readonly<{
225
234
  offsetX?: number;
226
235
  offsetY?: number;
227
236
  image?: ImageSource;
237
+ fallbackIcon?: Readonly<{
238
+ name: string;
239
+ tintColor?: string;
240
+ }>;
228
241
  name?: string;
229
242
  text?: string;
243
+ fontWeight?: NativeListTextStyle['fontWeight'];
230
244
  tintColor?: string;
231
245
  backgroundColor?: string;
232
246
  }>;
@@ -234,12 +248,15 @@ type VisualWithImage = Readonly<{
234
248
  fallbackIcon?: Readonly<{
235
249
  name: string;
236
250
  tintColor?: string;
251
+ size?: number;
252
+ backgroundColor?: string;
237
253
  }>;
238
254
  overlays?: readonly VisualOverlay[];
239
255
  borderStyle?: 'dashed';
240
256
  borderColor?: string;
241
257
  image?: ImageSource;
242
258
  fallbackText?: string;
259
+ fallbackTextColor?: string;
243
260
  backgroundColor?: string;
244
261
  shape?: 'circle' | 'rounded' | 'square';
245
262
  cornerIcon?: Readonly<{
@@ -291,8 +308,24 @@ export type TrailingAccessory = Readonly<{
291
308
  kind: 'valuePair';
292
309
  primary: string;
293
310
  secondary: string;
311
+ primaryFontWeight?: 'medium';
312
+ primaryHelp?: RowTextHelp;
313
+ primaryTextSegments?: readonly ValueTextSegment[];
314
+ secondaryTextSegments?: readonly ValueTextSegment[];
294
315
  primaryTone?: TextTone;
295
316
  secondaryTone?: TextTone;
317
+ }> | Readonly<{
318
+ kind: 'button';
319
+ label: string;
320
+ actionKey: string;
321
+ disabled?: boolean;
322
+ testID?: string;
323
+ accessibilityLabel?: string;
324
+ textColor?: string;
325
+ backgroundColor?: string;
326
+ pressedBackgroundColor?: string;
327
+ hoverBackgroundColor?: string;
328
+ focusRingColor?: string;
296
329
  }> | Readonly<{
297
330
  kind: 'checkbox';
298
331
  state: CheckboxState;
@@ -323,6 +356,7 @@ export type TrailingAccessory = Readonly<{
323
356
  kind: 'icon';
324
357
  name: string;
325
358
  tintColor?: string;
359
+ buttonStyle?: 'tertiary';
326
360
  disabled?: boolean;
327
361
  actionKey?: string;
328
362
  testID?: string;
@@ -362,6 +396,10 @@ export type RowBase = Readonly<{
362
396
  }>;
363
397
  export type IdentityRow = RowBase & Readonly<{
364
398
  type: 'identity';
399
+ /** Opt in to content-based height; explicit row/container height still wins. */
400
+ contentHeight?: 'auto';
401
+ /** Emits a row action instead of a press after a successful long press. */
402
+ longPressActionKey?: string;
365
403
  titleMatch?: readonly Readonly<{
366
404
  start: number;
367
405
  end: number;
@@ -375,11 +413,27 @@ export type IdentityRow = RowBase & Readonly<{
375
413
  kind: 'icon';
376
414
  }>;
377
415
  title: string;
416
+ /** Plain 12/16 labels beside the title, preserving independent tones. */
417
+ titleSuffixes?: readonly Readonly<{
418
+ text: string;
419
+ tone: 'secondary' | 'disabled';
420
+ maxWidth?: number;
421
+ }>[];
422
+ titleIcon?: Readonly<{
423
+ name: string;
424
+ tintColor?: string;
425
+ accessibilityLabel?: string;
426
+ /** Web-only anchored help from this icon; does not add a click action. */
427
+ hoverActionKey?: string;
428
+ }>;
429
+ /** Web-only additional help icon after titleIcon. */
430
+ secondaryTitleIcon?: IdentityRow['titleIcon'];
378
431
  subtitle?: string;
379
432
  tertiary?: string;
380
433
  tertiaryTone?: 'secondary' | 'info';
381
434
  titleLines?: 1 | 2;
382
- subtitleLines?: 1 | 2;
435
+ /** Zero displays the complete subtitle. */
436
+ subtitleLines?: 0 | 1 | 2;
383
437
  badges?: readonly BadgeModel[];
384
438
  trailing?: readonly TrailingAccessory[];
385
439
  draggable?: boolean;
@@ -413,6 +467,7 @@ export type ActivityAmount = Readonly<{
413
467
  export type ActivityRow = RowBase & Readonly<{
414
468
  type: 'activity';
415
469
  leading: LeadingVisual;
470
+ hideLeading?: boolean;
416
471
  secondaryLeading?: LeadingVisual;
417
472
  title: string;
418
473
  description?: string;
@@ -436,11 +491,14 @@ export type ActivityRow = RowBase & Readonly<{
436
491
  }>;
437
492
  export type MessageRow = RowBase & Readonly<{
438
493
  type: 'message';
494
+ /** Draws only top and bottom container borders when a border is supplied. */
495
+ presentation?: 'inlineWarning';
439
496
  unread?: boolean;
440
497
  leading?: LeadingVisual;
441
498
  title: string;
442
499
  body: string;
443
- bodyLines?: 1 | 2 | 3;
500
+ /** Zero displays the complete body. */
501
+ bodyLines?: 0 | 1 | 2 | 3;
444
502
  time: string;
445
503
  thumbnail?: ImageSource;
446
504
  style?: MessageRowStyle;
@@ -448,8 +506,12 @@ export type MessageRow = RowBase & Readonly<{
448
506
  export type DataColumn = Readonly<{
449
507
  key: string;
450
508
  text: string;
509
+ textSegments?: readonly ValueTextSegment[];
510
+ titleIcon?: IdentityRow['titleIcon'];
511
+ secondaryTitleIcon?: IdentityRow['titleIcon'];
451
512
  secondaryLeadingText?: string;
452
513
  secondaryText?: string;
514
+ secondaryTextSegments?: readonly ValueTextSegment[];
453
515
  weight?: 1 | 2 | 3;
454
516
  alignment?: 'start' | 'center' | 'end';
455
517
  tone?: 'primary' | 'secondary' | 'positive' | 'negative';
@@ -459,6 +521,7 @@ export type DataRow = RowBase & Readonly<{
459
521
  type: 'dataRow';
460
522
  leading?: LeadingVisual;
461
523
  columns: readonly DataColumn[];
524
+ trailing?: readonly TrailingAccessory[];
462
525
  checkbox?: Extract<TrailingAccessory, {
463
526
  kind: 'checkbox';
464
527
  }>;
@@ -611,9 +674,11 @@ export type SectionHeaderRow = RowBase & Readonly<{
611
674
  indexTitle?: string;
612
675
  variant?: 'summary' | 'gallery' | 'history';
613
676
  title: string;
677
+ leadingBadge?: BadgeModel;
614
678
  titleLoading?: boolean;
615
679
  subtitle?: string;
616
680
  value?: string;
681
+ valueHelp?: RowTextHelp;
617
682
  valueActionKey?: string;
618
683
  titleIcon?: Extract<TrailingAccessory, {
619
684
  kind: 'icon';
@@ -641,6 +706,19 @@ export type ActionRow = RowBase & Readonly<{
641
706
  trailing?: readonly TrailingAccessory[];
642
707
  style?: ActionRowStyle;
643
708
  }>;
709
+ export type ButtonGroupRow = RowBase & Readonly<{
710
+ type: 'buttonGroup';
711
+ buttons: readonly Readonly<{
712
+ key: string;
713
+ label: string;
714
+ actionKey: string;
715
+ disabled?: boolean;
716
+ loading?: boolean;
717
+ testID?: string;
718
+ accessibilityLabel?: string;
719
+ }>[];
720
+ style?: TemplateBoxStyle<'buttonGroup'>;
721
+ }>;
644
722
  export type SystemRow = RowBase & Readonly<{
645
723
  style?: SystemRowStyle;
646
724
  }> & (Readonly<{
@@ -677,7 +755,7 @@ export type SystemRow = RowBase & Readonly<{
677
755
  variant: 'spacer';
678
756
  height: number;
679
757
  }>);
680
- export type RowModel = IdentityRow | WalletGroupRow | RailRow | ActivityRow | MessageRow | DataRow | MarketRow | MediaTileRow | MetricCardRow | SectionHeaderRow | ActionRow | SystemRow;
758
+ export type RowModel = IdentityRow | WalletGroupRow | RailRow | ActivityRow | MessageRow | DataRow | MarketRow | MediaTileRow | MetricCardRow | SectionHeaderRow | ActionRow | ButtonGroupRow | SystemRow;
681
759
  export type NativeListTheme = Readonly<{
682
760
  checkboxBackground?: string;
683
761
  checkboxBorder?: string;
@@ -687,6 +765,8 @@ export type NativeListTheme = Readonly<{
687
765
  rowBackground: string;
688
766
  rowSelectedBackground: string;
689
767
  rowPressedBackground?: string;
768
+ /** Web-only enabled-row hover color; defaults to rowPressedBackground. */
769
+ rowHoverBackground?: string;
690
770
  subduedBackground?: string;
691
771
  strongBackground?: string;
692
772
  /** Web-only background for a displayed declared image fallback. */
@@ -699,6 +779,8 @@ export type NativeListTheme = Readonly<{
699
779
  separator: string;
700
780
  accent: string;
701
781
  positive: string;
782
+ /** Optional exact background for the success tone of section leading badges. */
783
+ successBackground?: string;
702
784
  negative: string;
703
785
  criticalBackground?: string;
704
786
  inverseBackground?: string;
@@ -740,6 +822,16 @@ export type NativeListListStyle = Readonly<{
740
822
  export type NativeListSnapshot = Readonly<{
741
823
  schemaVersion: 1;
742
824
  generation: number;
825
+ /** One-shot animation for a user-initiated row-key insertion or removal. */
826
+ structuralTransition?: Readonly<{
827
+ id: string;
828
+ durationMs?: number;
829
+ anchorKey?: string;
830
+ }>;
831
+ disclosure?: Readonly<{
832
+ expanded: boolean;
833
+ expandedTrailingInset?: number;
834
+ }>;
743
835
  layout: Readonly<{
744
836
  kind: NativeListLayout;
745
837
  orientation?: NativeListOrientation;
@@ -775,7 +867,7 @@ type CommonPatchFields = 'revision' | 'disabled' | 'selected' | 'separator' | 'h
775
867
  export type RowPatch = Readonly<{
776
868
  type: 'identity';
777
869
  key: string;
778
- changes: Partial<Pick<IdentityRow, CommonPatchFields | 'title' | 'subtitle' | 'tertiary' | 'tertiaryTone' | 'badges' | 'trailing' | 'leading' | 'leadingAction' | 'titleMatch' | 'titleActionKey' | 'titleActionOnHover' | 'subtitleSegments'>>;
870
+ changes: Partial<Pick<IdentityRow, CommonPatchFields | 'title' | 'titleSuffixes' | 'titleIcon' | 'secondaryTitleIcon' | 'subtitle' | 'subtitleLines' | 'contentHeight' | 'longPressActionKey' | 'tertiary' | 'tertiaryTone' | 'badges' | 'trailing' | 'leading' | 'leadingAction' | 'titleMatch' | 'titleActionKey' | 'titleActionOnHover' | 'subtitleSegments'>>;
779
871
  }> | Readonly<{
780
872
  type: 'rail';
781
873
  key: string;
@@ -783,15 +875,15 @@ export type RowPatch = Readonly<{
783
875
  }> | Readonly<{
784
876
  type: 'activity';
785
877
  key: string;
786
- changes: Partial<Pick<ActivityRow, CommonPatchFields | 'title' | 'description' | 'status' | 'amounts' | 'badges' | 'presentation' | 'fee' | 'descriptionActionKey' | 'primaryAmount' | 'secondaryAmount' | 'leading' | 'secondaryLeading' | 'footerActions'>>;
878
+ changes: Partial<Pick<ActivityRow, CommonPatchFields | 'title' | 'description' | 'status' | 'amounts' | 'badges' | 'presentation' | 'fee' | 'descriptionActionKey' | 'primaryAmount' | 'secondaryAmount' | 'leading' | 'hideLeading' | 'secondaryLeading' | 'footerActions'>>;
787
879
  }> | Readonly<{
788
880
  type: 'message';
789
881
  key: string;
790
- changes: Partial<Pick<MessageRow, CommonPatchFields | 'unread' | 'title' | 'body' | 'bodyLines' | 'time' | 'thumbnail'>>;
882
+ changes: Partial<Pick<MessageRow, CommonPatchFields | 'unread' | 'title' | 'body' | 'bodyLines' | 'presentation' | 'time' | 'thumbnail'>>;
791
883
  }> | Readonly<{
792
884
  type: 'dataRow';
793
885
  key: string;
794
- changes: Partial<Pick<DataRow, CommonPatchFields | 'leading' | 'columns' | 'checkbox' | 'index' | 'badge' | 'badges' | 'favorite' | 'favoriteActive'>>;
886
+ changes: Partial<Pick<DataRow, CommonPatchFields | 'leading' | 'columns' | 'trailing' | 'checkbox' | 'index' | 'badge' | 'badges' | 'favorite' | 'favoriteActive'>>;
795
887
  }> | Readonly<{
796
888
  type: 'market';
797
889
  key: string;
@@ -807,11 +899,15 @@ export type RowPatch = Readonly<{
807
899
  }> | Readonly<{
808
900
  type: 'sectionHeader';
809
901
  key: string;
810
- changes: Partial<Pick<SectionHeaderRow, CommonPatchFields | 'variant' | 'titleLoading' | 'title' | 'subtitle' | 'value' | 'valueActionKey' | 'titleActionKey' | 'titleActionOnHover' | 'titleIcon' | 'valueIcon' | 'checkbox'>>;
902
+ changes: Partial<Pick<SectionHeaderRow, CommonPatchFields | 'variant' | 'titleLoading' | 'title' | 'subtitle' | 'value' | 'valueHelp' | 'leadingBadge' | 'valueActionKey' | 'titleActionKey' | 'titleActionOnHover' | 'titleIcon' | 'valueIcon' | 'checkbox'>>;
811
903
  }> | Readonly<{
812
904
  type: 'action';
813
905
  key: string;
814
906
  changes: Partial<Pick<ActionRow, CommonPatchFields | 'title' | 'tone' | 'icon' | 'checkbox' | 'trailing'>>;
907
+ }> | Readonly<{
908
+ type: 'buttonGroup';
909
+ key: string;
910
+ changes: Partial<Pick<ButtonGroupRow, CommonPatchFields | 'buttons'>>;
815
911
  }> | Readonly<{
816
912
  type: 'system';
817
913
  key: string;
@@ -821,7 +917,7 @@ export type RowPatch = Readonly<{
821
917
  message?: string;
822
918
  }>;
823
919
  }>;
824
- export type NativeListActionSource = 'row' | 'marketBadge' | 'leadingAction' | 'trailingAccessory' | 'footerAction' | 'description' | 'mediaClose';
920
+ export type NativeListActionSource = 'row' | 'marketBadge' | 'leadingAction' | 'trailingAccessory' | 'footerAction' | 'buttonGroup' | 'description' | 'mediaClose';
825
921
  export type NativeListWindowRect = Readonly<{
826
922
  x: number;
827
923
  y: number;