@applicaster/zapp-react-native-ui-components 16.0.0-alpha.7845362739 → 16.0.0-alpha.8101951023

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 (82) hide show
  1. package/Components/AudioPlayer/tv/__tests__/audioPlayer.test.js +19 -0
  2. package/Components/AudioPlayer/tv/__tests__/index.test.tsx +120 -0
  3. package/Components/AudioPlayer/tv/index.tsx +5 -1
  4. package/Components/Cell/Cell.tsx +3 -6
  5. package/Components/Cell/TvOSCellComponent.tsx +0 -1
  6. package/Components/GeneralContentScreen/GeneralContentScreenHookAdapter.tsx +15 -0
  7. package/Components/GeneralContentScreen/hookAdapter/__tests__/skipExpression.test.ts +294 -0
  8. package/Components/GeneralContentScreen/hookAdapter/__tests__/validationHelper.test.ts +64 -0
  9. package/Components/GeneralContentScreen/hookAdapter/skipExpression.ts +252 -0
  10. package/Components/GeneralContentScreen/hookAdapter/validationHelper.ts +18 -0
  11. package/Components/LinkHandler/LinkHandler.tsx +2 -7
  12. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +5 -1
  13. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/ActionButtonController.tsx +19 -4
  14. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/__tests__/ActionButtonController.test.tsx +43 -1
  15. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -0
  16. package/Components/MasterCell/DefaultComponents/LiveImage/executePreloadHooks.ts +2 -4
  17. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -3
  18. package/Components/MasterCell/DefaultComponents/Toggle.tsx +36 -14
  19. package/Components/MasterCell/DefaultComponents/__tests__/Toggle.test.tsx +167 -0
  20. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/factory.test.ts +32 -0
  21. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +1 -2
  22. package/Components/ModalComponent/ActionsBottomSheet/ActionButton.tsx +56 -0
  23. package/Components/ModalComponent/ActionsBottomSheet/__tests__/openActionsBottomSheet.test.ts +38 -0
  24. package/Components/ModalComponent/ActionsBottomSheet/boundActionButton.tsx +24 -0
  25. package/Components/ModalComponent/ActionsBottomSheet/index.ts +9 -0
  26. package/Components/ModalComponent/ActionsBottomSheet/openActionsBottomSheet.ts +61 -0
  27. package/Components/ModalComponent/AudioPlayer/Components/Button.tsx +87 -97
  28. package/Components/ModalComponent/AudioPlayer/Components/Header.tsx +87 -126
  29. package/Components/ModalComponent/AudioPlayer/Components/Input.tsx +1 -44
  30. package/Components/ModalComponent/AudioPlayer/Components/Item.tsx +252 -123
  31. package/Components/ModalComponent/AudioPlayer/Components/NowPlayingHeaderSection.tsx +84 -0
  32. package/Components/ModalComponent/AudioPlayer/Components/__tests__/Item.test.tsx +113 -0
  33. package/Components/ModalComponent/AudioPlayer/Components/index.ts +3 -3
  34. package/Components/ModalComponent/AudioPlayer/utils/__tests__/mergeStyles.test.ts +356 -0
  35. package/Components/ModalComponent/AudioPlayer/utils/mergeStyles.ts +521 -0
  36. package/Components/ModalComponent/BottomSheetModalContent.tsx +488 -66
  37. package/Components/ModalComponent/Button/index.tsx +5 -3
  38. package/Components/ModalComponent/Header/CloseButton.tsx +12 -0
  39. package/Components/ModalComponent/Header/__tests__/CloseButton.test.tsx +72 -0
  40. package/Components/ModalComponent/Header/index.tsx +20 -7
  41. package/Components/ModalComponent/Header/utils.ts +1 -1
  42. package/Components/ModalComponent/ModalBlocksStyleContext.tsx +10 -0
  43. package/Components/ModalComponent/SortableList.tsx +157 -0
  44. package/Components/ModalComponent/SortableList.web.tsx +34 -0
  45. package/Components/ModalComponent/TextInputContent.tsx +112 -0
  46. package/Components/ModalComponent/__tests__/BottomSheetModalContent.test.tsx +270 -0
  47. package/Components/ModalComponent/__tests__/SortableList.web.test.tsx +16 -0
  48. package/Components/ModalComponent/__tests__/TextInputContent.test.tsx +156 -0
  49. package/Components/ModalComponent/__tests__/showTextInput.test.ts +95 -0
  50. package/Components/ModalComponent/index.tsx +18 -9
  51. package/Components/ModalComponent/presets/__tests__/getCell.test.ts +90 -0
  52. package/Components/ModalComponent/presets/dynamicCollectionCell.tsx +78 -0
  53. package/Components/ModalComponent/presets/index.ts +27 -0
  54. package/Components/ModalComponent/presets/selectableCell.tsx +28 -0
  55. package/Components/ModalComponent/presets/standardCell.tsx +41 -0
  56. package/Components/ModalComponent/presets/types.ts +35 -0
  57. package/Components/ModalComponent/showTextInput.ts +43 -0
  58. package/Components/ModalComponent/utils.ts +82 -21
  59. package/Components/OfflineHandler/hooks.ts +0 -12
  60. package/Components/PlayerContainer/PlayerContainer.tsx +11 -7
  61. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -4
  62. package/Components/PlayerContainer/__tests__/PlayerContainer.test.tsx +66 -13
  63. package/Components/River/ComponentsMap/ComponentsMap.tsx +85 -59
  64. package/Components/River/River.tsx +4 -0
  65. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +138 -75
  66. package/Components/River/__tests__/componentsMap.test.js +8 -3
  67. package/Components/River/__tests__/resultCallback.test.tsx +47 -0
  68. package/Components/Screen/__tests__/Screen.test.tsx +24 -0
  69. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +2 -0
  70. package/Components/Screen/index.tsx +5 -0
  71. package/Components/Screen/navigationHandler.ts +8 -8
  72. package/Components/ScreenRevealManager/ScreenRevealManager.ts +18 -2
  73. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +36 -0
  74. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +56 -0
  75. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +21 -4
  76. package/Components/VideoLive/LiveImageManager.ts +1 -1
  77. package/Contexts/ModalNavigationContext/__tests__/index.test.tsx +15 -0
  78. package/Contexts/ModalNavigationContext/index.tsx +2 -2
  79. package/Hooks/useEntryActionsExpander.ts +63 -0
  80. package/package.json +6 -5
  81. package/Components/ModalComponent/AudioPlayer/Components/Action.tsx +0 -332
  82. /package/Decorators/ZappPipesDataConnector/__tests__/{Hero.js → Hero.tsx} +0 -0
@@ -0,0 +1,521 @@
1
+ import {
2
+ BackgroundConfiguration as ItemBackgroundConfiguration,
3
+ ImageConfiguration as ItemImageConfiguration,
4
+ LabelConfiguration as ItemLabelConfiguration,
5
+ NowPlayingAssetConfiguration as ItemNowPlayingAssetConfiguration,
6
+ CheckboxAssetsConfiguration as ItemCheckboxAssetsConfiguration,
7
+ ActionButtonAssetsConfiguration as ItemActionButtonAssetsConfiguration,
8
+ ItemConfiguration,
9
+ } from "../Components/Item";
10
+ import {
11
+ TitleConfiguration as HeaderTitleConfiguration,
12
+ ActionButtonsStyleConfiguration as HeaderActionButtonsStyleConfiguration,
13
+ HeaderConfiguration,
14
+ } from "../Components/Header";
15
+ import {
16
+ BackgroundConfiguration as ButtonBackgroundConfiguration,
17
+ TitleConfiguration as ButtonTitleConfiguration,
18
+ ButtonConfiguration,
19
+ } from "../Components/Button";
20
+
21
+ // ---------------------------------------------------------------------------
22
+ // Item Merging Helpers
23
+ // ---------------------------------------------------------------------------
24
+
25
+ function mergeItemBackground(
26
+ base: ItemBackgroundConfiguration,
27
+ defaultOverride?: Record<string, any>,
28
+ focusedOverride?: Record<string, any>
29
+ ): ItemBackgroundConfiguration {
30
+ if (!defaultOverride && !focusedOverride) return base;
31
+
32
+ // Only take focused color from the focused/pressed bucket (or legacy
33
+ // mis-parsed focus* aliases). Never fall back to default background —
34
+ // that would overwrite base.focusedColor whenever Studio only sets default.
35
+ const focusedColor =
36
+ focusedOverride?.backgroundColor ??
37
+ defaultOverride?.focusColor ??
38
+ defaultOverride?.focusBackgroundColor;
39
+
40
+ return {
41
+ ...base,
42
+ ...(defaultOverride?.backgroundColor
43
+ ? { defaultColor: defaultOverride.backgroundColor }
44
+ : {}),
45
+ ...(focusedColor != null && focusedColor !== "" ? { focusedColor } : {}),
46
+ ...(defaultOverride?.borderRadius !== undefined
47
+ ? { cornerRadius: defaultOverride.borderRadius }
48
+ : {}),
49
+ };
50
+ }
51
+
52
+ function mergeItemImage(
53
+ base: ItemImageConfiguration,
54
+ override?: Record<string, any>
55
+ ): ItemImageConfiguration {
56
+ if (!override) return base;
57
+
58
+ return {
59
+ ...base,
60
+ ...(override.width !== undefined ? { width: override.width } : {}),
61
+ ...(override.height !== undefined ? { height: override.height } : {}),
62
+ ...(override.borderRadius !== undefined
63
+ ? { cornerRadius: override.borderRadius }
64
+ : {}),
65
+ ...(override.borderWidth !== undefined
66
+ ? { borderWidth: override.borderWidth }
67
+ : {}),
68
+ ...(override.borderColor ? { borderColor: override.borderColor } : {}),
69
+ };
70
+ }
71
+
72
+ function mergeItemLabel(
73
+ base: ItemLabelConfiguration,
74
+ override?: Record<string, any>
75
+ ): ItemLabelConfiguration {
76
+ if (!override) return base;
77
+
78
+ return {
79
+ ...base,
80
+ ...(override.fontColor ? { fontColor: override.fontColor } : {}),
81
+ ...(override.fontSize !== undefined ? { fontSize: override.fontSize } : {}),
82
+ ...(override.lineHeight !== undefined
83
+ ? { lineHeight: override.lineHeight }
84
+ : {}),
85
+ ...(override.fontFamily
86
+ ? {
87
+ iosFontFamily: override.fontFamily,
88
+ androidFontFamily: override.fontFamily,
89
+ }
90
+ : {}),
91
+ ...(override.iosFontFamily
92
+ ? { iosFontFamily: override.iosFontFamily }
93
+ : {}),
94
+ ...(override.androidFontFamily
95
+ ? { androidFontFamily: override.androidFontFamily }
96
+ : {}),
97
+ ...(override.letterSpacing !== undefined
98
+ ? {
99
+ iosLetterSpacing: override.letterSpacing,
100
+ androidLetterSpacing: override.letterSpacing,
101
+ }
102
+ : {}),
103
+ ...(override.iosLetterSpacing !== undefined
104
+ ? { iosLetterSpacing: override.iosLetterSpacing }
105
+ : {}),
106
+ ...(override.androidLetterSpacing !== undefined
107
+ ? { androidLetterSpacing: override.androidLetterSpacing }
108
+ : {}),
109
+ ...(override.textTransform
110
+ ? { textTransform: override.textTransform }
111
+ : {}),
112
+ };
113
+ }
114
+
115
+ function mergeItemNowPlayingAsset(
116
+ base: ItemNowPlayingAssetConfiguration,
117
+ override?: Record<string, any>
118
+ ): ItemNowPlayingAssetConfiguration {
119
+ if (!override) return base;
120
+
121
+ return {
122
+ ...base,
123
+ ...(override.asset ? { asset: override.asset } : {}),
124
+ };
125
+ }
126
+
127
+ function mergeItemCheckboxAssets(
128
+ base: ItemCheckboxAssetsConfiguration,
129
+ override?: Record<string, any>
130
+ ): ItemCheckboxAssetsConfiguration {
131
+ if (!override) return base;
132
+
133
+ return {
134
+ ...base,
135
+ ...(override.asset ? { asset: override.asset } : {}),
136
+ ...(override.checkedAsset ? { checkedAsset: override.checkedAsset } : {}),
137
+ };
138
+ }
139
+
140
+ function mergeItemActionButtonAssets(
141
+ base: ItemActionButtonAssetsConfiguration,
142
+ override?: Record<string, any>
143
+ ): ItemActionButtonAssetsConfiguration {
144
+ if (!override) return base;
145
+
146
+ return {
147
+ ...base,
148
+ ...(override.removeAsset ? { removeAsset: override.removeAsset } : {}),
149
+ ...(override.dragAsset ? { dragAsset: override.dragAsset } : {}),
150
+ };
151
+ }
152
+
153
+ export function mergeItemConfiguration(
154
+ base: ItemConfiguration,
155
+ itemBlock?: Record<string, any>
156
+ ): ItemConfiguration {
157
+ if (!itemBlock) return base;
158
+
159
+ const bgDefault = itemBlock.background?.default || itemBlock.background;
160
+
161
+ const bgFocused =
162
+ itemBlock.background?.focused ||
163
+ itemBlock.background?.focus ||
164
+ itemBlock.background?.pressed;
165
+
166
+ const img = itemBlock.image?.default || itemBlock.image;
167
+ const label1 = itemBlock.textLabel1?.default || itemBlock.textLabel1;
168
+ const label2 = itemBlock.textLabel2?.default || itemBlock.textLabel2;
169
+
170
+ const npLabel =
171
+ itemBlock.nowPlayingLabel?.default || itemBlock.nowPlayingLabel;
172
+
173
+ const npAsset =
174
+ itemBlock.nowPlayingAsset?.default || itemBlock.nowPlayingAsset;
175
+
176
+ const checkbox = itemBlock.checkbox?.default || itemBlock.checkbox;
177
+
178
+ const actionButtons =
179
+ itemBlock.actionButtons?.default || itemBlock.actionButtons;
180
+
181
+ return {
182
+ ...base,
183
+ background: mergeItemBackground(base.background, bgDefault, bgFocused),
184
+ image: mergeItemImage(base.image, img),
185
+ textLabel1: mergeItemLabel(base.textLabel1, label1),
186
+ textLabel2: mergeItemLabel(base.textLabel2, label2),
187
+ nowPlayingLabel: mergeItemLabel(base.nowPlayingLabel, npLabel),
188
+ nowPlayingAsset: mergeItemNowPlayingAsset(base.nowPlayingAsset, npAsset),
189
+ checkboxAssets: mergeItemCheckboxAssets(
190
+ base.checkboxAssets || {},
191
+ checkbox
192
+ ),
193
+ actionButtonAssets: mergeItemActionButtonAssets(
194
+ base.actionButtonAssets || {},
195
+ actionButtons
196
+ ),
197
+ };
198
+ }
199
+
200
+ // ---------------------------------------------------------------------------
201
+ // Header Merging Helpers
202
+ // ---------------------------------------------------------------------------
203
+
204
+ function mergeHeaderTitle(
205
+ base: HeaderTitleConfiguration,
206
+ override?: Record<string, any>
207
+ ): HeaderTitleConfiguration {
208
+ if (!override) return base;
209
+
210
+ return {
211
+ ...base,
212
+ ...(override.fontColor ? { fontColor: override.fontColor } : {}),
213
+ ...(override.fontSize !== undefined ? { fontSize: override.fontSize } : {}),
214
+ ...(override.lineHeight !== undefined
215
+ ? { lineHeight: override.lineHeight }
216
+ : {}),
217
+ ...(typeof override.fontFamily === "string"
218
+ ? {
219
+ iosFontFamily: override.fontFamily,
220
+ androidFontFamily: override.fontFamily,
221
+ }
222
+ : {}),
223
+ ...(override.iosFontFamily
224
+ ? { iosFontFamily: override.iosFontFamily }
225
+ : {}),
226
+ ...(override.androidFontFamily
227
+ ? { androidFontFamily: override.androidFontFamily }
228
+ : {}),
229
+ ...(override.letterSpacing !== undefined
230
+ ? {
231
+ iosLetterSpacing: override.letterSpacing,
232
+ androidLetterSpacing: override.letterSpacing,
233
+ }
234
+ : {}),
235
+ ...(override.iosLetterSpacing !== undefined
236
+ ? { iosLetterSpacing: override.iosLetterSpacing }
237
+ : {}),
238
+ ...(override.androidLetterSpacing !== undefined
239
+ ? { androidLetterSpacing: override.androidLetterSpacing }
240
+ : {}),
241
+ ...(override.textTransform
242
+ ? { textTransform: override.textTransform }
243
+ : {}),
244
+ ...(override.alignment ? { alignment: override.alignment } : {}),
245
+ };
246
+ }
247
+
248
+ function mergeHeaderActionButtons(
249
+ base: HeaderActionButtonsStyleConfiguration,
250
+ defaultOverride?: Record<string, any>,
251
+ focusedOverride?: Record<string, any>
252
+ ): HeaderActionButtonsStyleConfiguration {
253
+ if (!defaultOverride && !focusedOverride) return base;
254
+
255
+ const focusedBackgroundColor =
256
+ focusedOverride?.backgroundColor ??
257
+ defaultOverride?.focusBackgroundColor ??
258
+ defaultOverride?.focusedBackgroundColor;
259
+
260
+ const focusedFontColor =
261
+ focusedOverride?.fontColor ??
262
+ defaultOverride?.focusFontColor ??
263
+ defaultOverride?.focusedFontColor;
264
+
265
+ return {
266
+ ...base,
267
+ ...(defaultOverride?.backgroundColor
268
+ ? { defaultBackgroundColor: defaultOverride.backgroundColor }
269
+ : {}),
270
+ ...(focusedBackgroundColor != null && focusedBackgroundColor !== ""
271
+ ? { focusedBackgroundColor }
272
+ : {}),
273
+ ...(defaultOverride?.fontColor
274
+ ? { fontColor: defaultOverride.fontColor }
275
+ : {}),
276
+ ...(focusedFontColor != null && focusedFontColor !== ""
277
+ ? { focusedFontColor }
278
+ : {}),
279
+ ...(defaultOverride?.fontSize !== undefined
280
+ ? { fontSize: defaultOverride.fontSize }
281
+ : {}),
282
+ ...(defaultOverride?.lineHeight !== undefined
283
+ ? { lineHeight: defaultOverride.lineHeight }
284
+ : {}),
285
+ ...(typeof defaultOverride?.fontFamily === "string"
286
+ ? {
287
+ iosFontFamily: defaultOverride.fontFamily,
288
+ androidFontFamily: defaultOverride.fontFamily,
289
+ }
290
+ : {}),
291
+ ...(defaultOverride?.iosFontFamily
292
+ ? { iosFontFamily: defaultOverride.iosFontFamily }
293
+ : {}),
294
+ ...(defaultOverride?.androidFontFamily
295
+ ? { androidFontFamily: defaultOverride.androidFontFamily }
296
+ : {}),
297
+ ...(defaultOverride?.letterSpacing !== undefined
298
+ ? {
299
+ iosLetterSpacing: defaultOverride.letterSpacing,
300
+ androidLetterSpacing: defaultOverride.letterSpacing,
301
+ }
302
+ : {}),
303
+ ...(defaultOverride?.iosLetterSpacing !== undefined
304
+ ? { iosLetterSpacing: defaultOverride.iosLetterSpacing }
305
+ : {}),
306
+ ...(defaultOverride?.androidLetterSpacing !== undefined
307
+ ? { androidLetterSpacing: defaultOverride.androidLetterSpacing }
308
+ : {}),
309
+ ...(defaultOverride?.textTransform
310
+ ? { textTransform: defaultOverride.textTransform }
311
+ : {}),
312
+ ...(defaultOverride?.borderRadius !== undefined
313
+ ? { cornerRadius: defaultOverride.borderRadius }
314
+ : {}),
315
+ ...(defaultOverride?.cornerRadius !== undefined
316
+ ? { cornerRadius: defaultOverride.cornerRadius }
317
+ : {}),
318
+ ...(defaultOverride?.paddingTop !== undefined
319
+ ? { paddingTop: defaultOverride.paddingTop }
320
+ : {}),
321
+ ...(defaultOverride?.paddingRight !== undefined
322
+ ? { paddingRight: defaultOverride.paddingRight }
323
+ : {}),
324
+ ...(defaultOverride?.paddingBottom !== undefined
325
+ ? { paddingBottom: defaultOverride.paddingBottom }
326
+ : {}),
327
+ ...(defaultOverride?.paddingLeft !== undefined
328
+ ? { paddingLeft: defaultOverride.paddingLeft }
329
+ : {}),
330
+ };
331
+ }
332
+
333
+ export function mergeHeaderConfiguration(
334
+ base: HeaderConfiguration,
335
+ headerBlock?: Record<string, any>
336
+ ): HeaderConfiguration & { backgroundColor?: string } {
337
+ if (!headerBlock) return base;
338
+
339
+ const bgOverride = headerBlock.container?.default?.backgroundColor;
340
+
341
+ const actionButtonsDefault =
342
+ headerBlock.actionButtons?.default || headerBlock.actionButtons;
343
+
344
+ const actionButtonsFocused =
345
+ headerBlock.actionButtons?.focused || headerBlock.actionButtons?.focus;
346
+
347
+ // Parser shape is title.default.*; hydrate() returns a flat title object.
348
+ const titleDefault = headerBlock.title?.default;
349
+
350
+ const titleOverride =
351
+ titleDefault &&
352
+ (titleDefault.fontColor !== undefined ||
353
+ titleDefault.fontSize !== undefined ||
354
+ titleDefault.lineHeight !== undefined ||
355
+ titleDefault.fontFamily ||
356
+ titleDefault.iosFontFamily ||
357
+ titleDefault.androidFontFamily ||
358
+ titleDefault.letterSpacing !== undefined ||
359
+ titleDefault.iosLetterSpacing !== undefined ||
360
+ titleDefault.androidLetterSpacing !== undefined ||
361
+ titleDefault.textTransform ||
362
+ titleDefault.alignment)
363
+ ? titleDefault
364
+ : headerBlock.title;
365
+
366
+ return {
367
+ ...base,
368
+ title: mergeHeaderTitle(base.title, titleOverride),
369
+ actionButtons: mergeHeaderActionButtons(
370
+ base.actionButtons,
371
+ actionButtonsDefault,
372
+ actionButtonsFocused
373
+ ),
374
+ ...(bgOverride ? { backgroundColor: bgOverride } : {}),
375
+ };
376
+ }
377
+
378
+ // ---------------------------------------------------------------------------
379
+ // Button Merging Helpers
380
+ // ---------------------------------------------------------------------------
381
+
382
+ function mergeButtonBackground(
383
+ base: ButtonBackgroundConfiguration,
384
+ defaultOverride?: Record<string, any>,
385
+ focusedOverride?: Record<string, any>
386
+ ): ButtonBackgroundConfiguration {
387
+ if (!defaultOverride && !focusedOverride) return base;
388
+
389
+ // Same as mergeItemBackground: do not use default background as focusedColor.
390
+ const focusedColor =
391
+ focusedOverride?.backgroundColor ??
392
+ defaultOverride?.focusColor ??
393
+ defaultOverride?.focusBackgroundColor;
394
+
395
+ return {
396
+ ...base,
397
+ ...(defaultOverride?.backgroundColor
398
+ ? { defaultColor: defaultOverride.backgroundColor }
399
+ : {}),
400
+ ...(focusedColor != null && focusedColor !== "" ? { focusedColor } : {}),
401
+ ...(defaultOverride?.borderRadius !== undefined
402
+ ? { cornerRadius: defaultOverride.borderRadius }
403
+ : {}),
404
+ ...(defaultOverride?.paddingTop !== undefined
405
+ ? { paddingTop: defaultOverride.paddingTop }
406
+ : {}),
407
+ ...(defaultOverride?.paddingRight !== undefined
408
+ ? { paddingRight: defaultOverride.paddingRight }
409
+ : {}),
410
+ ...(defaultOverride?.paddingBottom !== undefined
411
+ ? { paddingBottom: defaultOverride.paddingBottom }
412
+ : {}),
413
+ ...(defaultOverride?.paddingLeft !== undefined
414
+ ? { paddingLeft: defaultOverride.paddingLeft }
415
+ : {}),
416
+ };
417
+ }
418
+
419
+ function mergeButtonTitle(
420
+ base: ButtonTitleConfiguration,
421
+ override?: Record<string, any>
422
+ ): ButtonTitleConfiguration {
423
+ if (!override) return base;
424
+
425
+ return {
426
+ ...base,
427
+ ...(override.fontColor ? { fontColor: override.fontColor } : {}),
428
+ ...(override.fontSize !== undefined ? { fontSize: override.fontSize } : {}),
429
+ ...(override.lineHeight !== undefined
430
+ ? { lineHeight: override.lineHeight }
431
+ : {}),
432
+ ...(override.fontFamily
433
+ ? {
434
+ iosFontFamily: override.fontFamily,
435
+ androidFontFamily: override.fontFamily,
436
+ }
437
+ : {}),
438
+ ...(override.iosFontFamily
439
+ ? { iosFontFamily: override.iosFontFamily }
440
+ : {}),
441
+ ...(override.androidFontFamily
442
+ ? { androidFontFamily: override.androidFontFamily }
443
+ : {}),
444
+ ...(override.letterSpacing !== undefined
445
+ ? {
446
+ iosLetterSpacing: override.letterSpacing,
447
+ androidLetterSpacing: override.letterSpacing,
448
+ }
449
+ : {}),
450
+ ...(override.iosLetterSpacing !== undefined
451
+ ? { iosLetterSpacing: override.iosLetterSpacing }
452
+ : {}),
453
+ ...(override.androidLetterSpacing !== undefined
454
+ ? { androidLetterSpacing: override.androidLetterSpacing }
455
+ : {}),
456
+ ...(override.textTransform
457
+ ? { textTransform: override.textTransform }
458
+ : {}),
459
+ };
460
+ }
461
+
462
+ function mergeButtonIcons(
463
+ base: ButtonConfiguration["icons"],
464
+ iconsOverride?: Record<string, any>,
465
+ leadingOverride?: Record<string, any>
466
+ ): ButtonConfiguration["icons"] {
467
+ if (!iconsOverride && !leadingOverride) return base;
468
+
469
+ const iconsDefault = iconsOverride?.default || iconsOverride;
470
+ const leadingDefault = leadingOverride?.default || leadingOverride;
471
+
472
+ return {
473
+ ...base,
474
+ ...(iconsDefault?.width !== undefined ? { width: iconsDefault.width } : {}),
475
+ ...(iconsDefault?.height !== undefined
476
+ ? { height: iconsDefault.height }
477
+ : {}),
478
+ leadingIcon: {
479
+ ...base.leadingIcon,
480
+ ...(leadingDefault?.enabled !== undefined
481
+ ? { enabled: leadingDefault.enabled }
482
+ : {}),
483
+ ...(leadingDefault?.actionType
484
+ ? { actionType: leadingDefault.actionType }
485
+ : {}),
486
+ ...(leadingDefault?.asset ? { asset: leadingDefault.asset } : {}),
487
+ },
488
+ };
489
+ }
490
+
491
+ export function mergeButtonConfiguration(
492
+ base: ButtonConfiguration,
493
+ buttonBlock?: Record<string, any>,
494
+ actionBlock?: Record<string, any>
495
+ ): ButtonConfiguration {
496
+ if (!buttonBlock && !actionBlock) return base;
497
+
498
+ const bgDefault =
499
+ buttonBlock?.background?.default || actionBlock?.background?.default;
500
+
501
+ const bgFocused =
502
+ buttonBlock?.background?.focused ||
503
+ buttonBlock?.background?.focus ||
504
+ actionBlock?.background?.focused ||
505
+ actionBlock?.background?.focus ||
506
+ buttonBlock?.background?.pressed ||
507
+ actionBlock?.background?.pressed;
508
+
509
+ const titleOverride =
510
+ buttonBlock?.title?.default || actionBlock?.title?.default;
511
+
512
+ const iconsOverride = buttonBlock?.icons || actionBlock?.icons;
513
+ const leadingOverride = buttonBlock?.leadingIcon || actionBlock?.leadingIcon;
514
+
515
+ return {
516
+ ...base,
517
+ background: mergeButtonBackground(base.background, bgDefault, bgFocused),
518
+ title: mergeButtonTitle(base.title, titleOverride),
519
+ icons: mergeButtonIcons(base.icons, iconsOverride, leadingOverride),
520
+ };
521
+ }