@applicaster/zapp-react-native-ui-components 16.0.0-alpha.1453660071 → 16.0.0-alpha.1454930193

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 (124) 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/__tests__/placement.test.ts +47 -21
  14. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/ActionButtonController.tsx +19 -4
  15. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/__tests__/ActionButtonController.test.tsx +43 -1
  16. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/placement.ts +34 -6
  17. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -0
  18. package/Components/MasterCell/DefaultComponents/Image/hoc/utils/__tests__/withDimensions.test.ts +420 -125
  19. package/Components/MasterCell/DefaultComponents/Image/hoc/utils/index.ts +114 -19
  20. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +19 -8
  21. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +5 -3
  22. package/Components/MasterCell/DefaultComponents/LiveImage/executePreloadHooks.ts +2 -4
  23. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -3
  24. package/Components/MasterCell/DefaultComponents/PressableView.tsx +29 -9
  25. package/Components/MasterCell/DefaultComponents/Text/hooks/useText.ts +4 -0
  26. package/Components/MasterCell/DefaultComponents/Toggle.tsx +36 -14
  27. package/Components/MasterCell/DefaultComponents/__tests__/Toggle.test.tsx +167 -0
  28. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/ActionButton.tsx +154 -100
  29. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/AssetComponent.tsx +15 -4
  30. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Button.ts +56 -22
  31. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Spacer.ts +6 -4
  32. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/TextLabelsContainer.ts +3 -1
  33. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/PressableView.test.tsx +32 -21
  34. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/index.test.ts +15 -4
  35. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/index.ts +23 -16
  36. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/utils/__tests__/insertButtons.test.ts +8 -3
  37. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/utils/index.ts +2 -2
  38. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/__tests__/insertButtonsBetweenLabels.test.ts +45 -13
  39. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/index.ts +2 -2
  40. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/factory.test.ts +32 -0
  41. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +1 -2
  42. package/Components/MasterCell/contexts/PressedStateContext.ts +3 -0
  43. package/Components/MasterCell/hooks/index.ts +2 -0
  44. package/Components/MasterCell/hooks/usePressedState.ts +4 -0
  45. package/Components/ModalComponent/ActionsBottomSheet/ActionButton.tsx +56 -0
  46. package/Components/ModalComponent/ActionsBottomSheet/__tests__/openActionsBottomSheet.test.ts +38 -0
  47. package/Components/ModalComponent/ActionsBottomSheet/boundActionButton.tsx +24 -0
  48. package/Components/ModalComponent/ActionsBottomSheet/index.ts +9 -0
  49. package/Components/ModalComponent/ActionsBottomSheet/openActionsBottomSheet.ts +61 -0
  50. package/Components/ModalComponent/AudioPlayer/Components/Button.tsx +392 -0
  51. package/Components/ModalComponent/AudioPlayer/Components/Header.tsx +772 -0
  52. package/Components/ModalComponent/AudioPlayer/Components/Input.tsx +728 -0
  53. package/Components/ModalComponent/AudioPlayer/Components/Item.tsx +1007 -0
  54. package/Components/ModalComponent/AudioPlayer/Components/NowPlayingHeaderSection.tsx +205 -0
  55. package/Components/ModalComponent/AudioPlayer/Components/__tests__/Item.test.tsx +113 -0
  56. package/Components/ModalComponent/AudioPlayer/Components/__tests__/NowPlayingHeaderSection.test.tsx +36 -0
  57. package/Components/ModalComponent/AudioPlayer/Components/index.ts +9 -0
  58. package/Components/ModalComponent/AudioPlayer/utils/__tests__/mergeStyles.test.ts +356 -0
  59. package/Components/ModalComponent/AudioPlayer/utils/mergeStyles.ts +521 -0
  60. package/Components/ModalComponent/BottomSheetDragArea.tsx +33 -0
  61. package/Components/ModalComponent/BottomSheetModalContent.tsx +505 -50
  62. package/Components/ModalComponent/Button/index.tsx +5 -3
  63. package/Components/ModalComponent/Header/CloseButton.tsx +12 -0
  64. package/Components/ModalComponent/Header/__tests__/CloseButton.test.tsx +72 -0
  65. package/Components/ModalComponent/Header/index.tsx +20 -7
  66. package/Components/ModalComponent/Header/utils.ts +1 -1
  67. package/Components/ModalComponent/ModalBlocksStyleContext.tsx +10 -0
  68. package/Components/ModalComponent/SortableList.tsx +156 -0
  69. package/Components/ModalComponent/SortableList.web.tsx +34 -0
  70. package/Components/ModalComponent/TextInputContent.tsx +135 -0
  71. package/Components/ModalComponent/__tests__/BottomSheetDragArea.test.tsx +74 -0
  72. package/Components/ModalComponent/__tests__/BottomSheetModalContent.test.tsx +343 -0
  73. package/Components/ModalComponent/__tests__/SortableList.web.test.tsx +16 -0
  74. package/Components/ModalComponent/__tests__/TextInputContent.test.tsx +169 -0
  75. package/Components/ModalComponent/__tests__/showTextInput.test.ts +95 -0
  76. package/Components/ModalComponent/index.tsx +18 -9
  77. package/Components/ModalComponent/presets/__tests__/getCell.test.ts +90 -0
  78. package/Components/ModalComponent/presets/dynamicCollectionCell.tsx +78 -0
  79. package/Components/ModalComponent/presets/index.ts +27 -0
  80. package/Components/ModalComponent/presets/selectableCell.tsx +28 -0
  81. package/Components/ModalComponent/presets/standardCell.tsx +41 -0
  82. package/Components/ModalComponent/presets/types.ts +35 -0
  83. package/Components/ModalComponent/showTextInput.ts +52 -0
  84. package/Components/ModalComponent/utils.ts +82 -21
  85. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +4 -85
  86. package/Components/OfflineHandler/__tests__/index.test.tsx +78 -18
  87. package/Components/OfflineHandler/hooks.ts +111 -0
  88. package/Components/OfflineHandler/index.tsx +51 -73
  89. package/Components/OfflineHandler/utils/index.ts +1 -13
  90. package/Components/PlayerContainer/PlayerContainer.tsx +11 -7
  91. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -4
  92. package/Components/PlayerContainer/__tests__/PlayerContainer.test.tsx +66 -13
  93. package/Components/PreloaderWrapper/index.tsx +1 -1
  94. package/Components/River/ComponentsMap/ComponentsMap.tsx +85 -59
  95. package/Components/River/River.tsx +4 -0
  96. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +140 -75
  97. package/Components/River/__tests__/componentsMap.test.js +8 -3
  98. package/Components/River/__tests__/resultCallback.test.tsx +47 -0
  99. package/Components/Screen/__tests__/Screen.test.tsx +24 -0
  100. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +2 -0
  101. package/Components/Screen/index.tsx +5 -0
  102. package/Components/Screen/navigationHandler.ts +8 -8
  103. package/Components/ScreenFeedLoader/ScreenFeedLoader.tsx +5 -3
  104. package/Components/ScreenResolverFeedProvider/ScreenResolverFeedProvider.tsx +1 -1
  105. package/Components/ScreenRevealManager/ScreenRevealManager.ts +18 -2
  106. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +36 -0
  107. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +56 -0
  108. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +21 -4
  109. package/Components/TopCutoffOverlay/index.tsx +2 -2
  110. package/Components/Transitioner/Transitioner.tsx +30 -20
  111. package/Components/Transitioner/__tests__/transitioner.test.js +83 -2
  112. package/Components/VideoLive/LiveImageManager.ts +9 -3
  113. package/Components/VideoLive/__tests__/LiveImageManager.test.ts +59 -0
  114. package/Contexts/ModalNavigationContext/__tests__/index.test.tsx +15 -0
  115. package/Contexts/ModalNavigationContext/index.tsx +2 -2
  116. package/Hooks/useEntryActionsExpander.ts +63 -0
  117. package/assets/empty-Info.png +0 -0
  118. package/package.json +6 -5
  119. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +0 -112
  120. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +0 -107
  121. package/Components/OfflineHandler/NotificationView/NotificationView.tsx +0 -153
  122. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -66
  123. package/Components/OfflineHandler/NotificationView/utils.ts +0 -34
  124. /package/Decorators/ZappPipesDataConnector/__tests__/{Hero.js → Hero.tsx} +0 -0
@@ -0,0 +1,356 @@
1
+ import {
2
+ mergeItemConfiguration,
3
+ mergeButtonConfiguration,
4
+ mergeHeaderConfiguration,
5
+ } from "../mergeStyles";
6
+ import {
7
+ VARIANT_SECTION_HEADER,
8
+ VARIANT_SINGLE_LINE_HEADER,
9
+ } from "../../Components/Header";
10
+
11
+ const base = {
12
+ background: {
13
+ defaultColor: "transparent",
14
+ focusedColor: "rgba(62, 62, 62, 1)",
15
+ cornerRadius: 12,
16
+ },
17
+ image: {
18
+ width: 48,
19
+ height: 48,
20
+ borderWidth: 1,
21
+ borderColor: "rgba(255, 255, 255, 0.1)",
22
+ cornerRadius: 6,
23
+ },
24
+ nowPlayingAsset: {},
25
+ nowPlayingLabel: { fontColor: "#fff", fontSize: 12 },
26
+ textLabel1: { fontColor: "#fff", fontSize: 15 },
27
+ textLabel2: { fontColor: "#999", fontSize: 13 },
28
+ };
29
+
30
+ describe("mergeItemConfiguration background", () => {
31
+ it("applies Studio focus background to focusedColor", () => {
32
+ const merged = mergeItemConfiguration(base as any, {
33
+ background: {
34
+ default: { backgroundColor: "transparent" },
35
+ focused: { backgroundColor: "#FF3B30" },
36
+ },
37
+ });
38
+
39
+ expect(merged.background.defaultColor).toBe("transparent");
40
+ expect(merged.background.focusedColor).toBe("#FF3B30");
41
+ });
42
+
43
+ it("accepts focus alias bucket from parser output", () => {
44
+ const merged = mergeItemConfiguration(base as any, {
45
+ background: {
46
+ default: { backgroundColor: "transparent" },
47
+ focus: { backgroundColor: "#00FF66" },
48
+ },
49
+ });
50
+
51
+ expect(merged.background.focusedColor).toBe("#00FF66");
52
+ });
53
+
54
+ it("merges text label lineHeight from Studio keys", () => {
55
+ const merged = mergeItemConfiguration(base as any, {
56
+ textLabel1: {
57
+ default: { fontSize: 28, lineHeight: 40 },
58
+ },
59
+ });
60
+
61
+ expect(merged.textLabel1.fontSize).toBe(28);
62
+ expect(merged.textLabel1.lineHeight).toBe(40);
63
+ });
64
+
65
+ it("does not merge Studio item background padding (white spec field)", () => {
66
+ const merged = mergeItemConfiguration(base as any, {
67
+ background: {
68
+ default: {
69
+ backgroundColor: "#2E7D32",
70
+ paddingTop: 32,
71
+ paddingBottom: 32,
72
+ paddingLeft: 40,
73
+ paddingRight: 40,
74
+ },
75
+ },
76
+ });
77
+
78
+ expect(merged.background.defaultColor).toBe("#2E7D32");
79
+ expect(merged.background.paddingTop).toBeUndefined();
80
+ expect(merged.background.paddingBottom).toBeUndefined();
81
+ expect(merged.background.paddingLeft).toBeUndefined();
82
+ expect(merged.background.paddingRight).toBeUndefined();
83
+ expect(merged.background.focusedColor).toBe("rgba(62, 62, 62, 1)");
84
+ });
85
+
86
+ it("preserves base focusedColor when only default background is set", () => {
87
+ const merged = mergeItemConfiguration(base as any, {
88
+ background: {
89
+ default: { backgroundColor: "#2E7D32" },
90
+ },
91
+ });
92
+
93
+ expect(merged.background.defaultColor).toBe("#2E7D32");
94
+ expect(merged.background.focusedColor).toBe("rgba(62, 62, 62, 1)");
95
+ });
96
+
97
+ it("applies Studio checkbox assets onto checkboxAssets", () => {
98
+ const merged = mergeItemConfiguration(base as any, {
99
+ checkbox: {
100
+ default: {
101
+ asset: "https://placehold.co/24x24/FF3B30/FFFFFF/png?text=CB",
102
+ checkedAsset: "https://placehold.co/24x24/FFD60A/000000/png?text=CK",
103
+ },
104
+ },
105
+ });
106
+
107
+ expect(merged.checkboxAssets?.asset).toBe(
108
+ "https://placehold.co/24x24/FF3B30/FFFFFF/png?text=CB"
109
+ );
110
+
111
+ expect(merged.checkboxAssets?.checkedAsset).toBe(
112
+ "https://placehold.co/24x24/FFD60A/000000/png?text=CK"
113
+ );
114
+ });
115
+
116
+ it("applies Studio reorder/remove assets onto actionButtonAssets", () => {
117
+ const merged = mergeItemConfiguration(base as any, {
118
+ actionButtons: {
119
+ default: {
120
+ removeAsset: "https://placehold.co/24x24/00FF00/000000/png?text=RM",
121
+ dragAsset: "https://placehold.co/24x24/FF3B30/FFFFFF/png?text=RH",
122
+ },
123
+ },
124
+ });
125
+
126
+ expect(merged.actionButtonAssets?.removeAsset).toBe(
127
+ "https://placehold.co/24x24/00FF00/000000/png?text=RM"
128
+ );
129
+
130
+ expect(merged.actionButtonAssets?.dragAsset).toBe(
131
+ "https://placehold.co/24x24/FF3B30/FFFFFF/png?text=RH"
132
+ );
133
+ });
134
+ });
135
+
136
+ describe("mergeButtonConfiguration background", () => {
137
+ const buttonBase = {
138
+ background: {
139
+ defaultColor: "#FFFFFF",
140
+ focusedColor: "#E0E0E0",
141
+ inactiveColor: "#CCCCCC",
142
+ cornerRadius: 12,
143
+ paddingTop: 12,
144
+ paddingRight: 12,
145
+ paddingBottom: 12,
146
+ paddingLeft: 12,
147
+ horizontalGutter: 8,
148
+ },
149
+ title: {
150
+ fontColor: "#000000",
151
+ focusedFontColor: "#000000",
152
+ inactiveFontColor: "#666666",
153
+ iosFontFamily: "SFProText-Semibold",
154
+ androidFontFamily: "Roboto-Medium",
155
+ fontSize: 15,
156
+ lineHeight: 24,
157
+ iosLetterSpacing: 0,
158
+ androidLetterSpacing: 0,
159
+ textTransform: "default" as const,
160
+ },
161
+ icons: {
162
+ width: 24,
163
+ height: 24,
164
+ leadingIcon: { enabled: true },
165
+ },
166
+ };
167
+
168
+ it("applies Studio button focus background to focusedColor", () => {
169
+ const merged = mergeButtonConfiguration(buttonBase as any, {
170
+ background: {
171
+ default: { backgroundColor: "#FFFFFF" },
172
+ focused: { backgroundColor: "#00FF00" },
173
+ },
174
+ });
175
+
176
+ expect(merged.background.defaultColor).toBe("#FFFFFF");
177
+ expect(merged.background.focusedColor).toBe("#00FF00");
178
+ });
179
+
180
+ it("applies Studio button title lineHeight", () => {
181
+ const merged = mergeButtonConfiguration(buttonBase as any, {
182
+ title: {
183
+ default: { fontColor: "#000000", fontSize: 15, lineHeight: 40 },
184
+ },
185
+ });
186
+
187
+ expect(merged.title.lineHeight).toBe(40);
188
+ expect(merged.title.fontSize).toBe(15);
189
+ });
190
+
191
+ it("applies Studio button background padding", () => {
192
+ const merged = mergeButtonConfiguration(buttonBase as any, {
193
+ background: {
194
+ default: {
195
+ backgroundColor: "#FFFFFF",
196
+ paddingTop: 32,
197
+ paddingRight: 20,
198
+ paddingBottom: 8,
199
+ paddingLeft: 4,
200
+ },
201
+ },
202
+ });
203
+
204
+ expect(merged.background.paddingTop).toBe(32);
205
+ expect(merged.background.paddingRight).toBe(20);
206
+ expect(merged.background.paddingBottom).toBe(8);
207
+ expect(merged.background.paddingLeft).toBe(4);
208
+ expect(merged.background.focusedColor).toBe("#E0E0E0");
209
+ });
210
+
211
+ it("preserves base button focusedColor when only default background is set", () => {
212
+ const merged = mergeButtonConfiguration(buttonBase as any, {
213
+ background: {
214
+ default: { backgroundColor: "#ABCDEF" },
215
+ },
216
+ });
217
+
218
+ expect(merged.background.defaultColor).toBe("#ABCDEF");
219
+ expect(merged.background.focusedColor).toBe("#E0E0E0");
220
+ });
221
+
222
+ it("applies Studio create-new leading icon asset", () => {
223
+ const merged = mergeButtonConfiguration(buttonBase as any, {
224
+ leadingIcon: {
225
+ default: {
226
+ asset: "https://placehold.co/24x24/FF00FF/FFFFFF/png?text=CN",
227
+ },
228
+ },
229
+ });
230
+
231
+ expect(merged.icons.leadingIcon.asset).toBe(
232
+ "https://placehold.co/24x24/FF00FF/FFFFFF/png?text=CN"
233
+ );
234
+ });
235
+
236
+ it("applies Studio button title typography (fontFamily, letterSpacing, textTransform)", () => {
237
+ const merged = mergeButtonConfiguration(buttonBase as any, {
238
+ title: {
239
+ default: {
240
+ fontFamily: "CustomFont",
241
+ letterSpacing: -0.5,
242
+ textTransform: "uppercase",
243
+ },
244
+ },
245
+ });
246
+
247
+ expect(merged.title.iosFontFamily).toBe("CustomFont");
248
+ expect(merged.title.androidFontFamily).toBe("CustomFont");
249
+ expect(merged.title.iosLetterSpacing).toBe(-0.5);
250
+ expect(merged.title.androidLetterSpacing).toBe(-0.5);
251
+ expect(merged.title.textTransform).toBe("uppercase");
252
+ });
253
+ });
254
+
255
+ describe("mergeHeaderConfiguration section header (Variant 3)", () => {
256
+ it("merges section title + Clear action button styles", () => {
257
+ const merged = mergeHeaderConfiguration(VARIANT_SECTION_HEADER, {
258
+ title: {
259
+ default: {
260
+ fontColor: "#ABCDEF",
261
+ fontSize: 15,
262
+ lineHeight: 36,
263
+ fontFamily: "CustomSection",
264
+ letterSpacing: -0.2,
265
+ textTransform: "uppercase",
266
+ alignment: "left",
267
+ },
268
+ },
269
+ actionButtons: {
270
+ default: {
271
+ backgroundColor: "rgba(10, 10, 10, 1)",
272
+ fontColor: "#EEEEEE",
273
+ fontSize: 12,
274
+ borderRadius: 20,
275
+ paddingTop: 8,
276
+ paddingRight: 12,
277
+ paddingBottom: 8,
278
+ paddingLeft: 12,
279
+ },
280
+ focused: {
281
+ backgroundColor: "rgba(20, 20, 20, 1)",
282
+ fontColor: "#FFDD00",
283
+ },
284
+ },
285
+ });
286
+
287
+ expect(merged.title.fontColor).toBe("#ABCDEF");
288
+ expect(merged.title.fontSize).toBe(15);
289
+ expect(merged.title.lineHeight).toBe(36);
290
+ expect(merged.title.iosFontFamily).toBe("CustomSection");
291
+ expect(merged.title.androidFontFamily).toBe("CustomSection");
292
+ expect(merged.title.iosLetterSpacing).toBe(-0.2);
293
+ expect(merged.title.textTransform).toBe("uppercase");
294
+
295
+ expect(merged.actionButtons.defaultBackgroundColor).toBe(
296
+ "rgba(10, 10, 10, 1)"
297
+ );
298
+
299
+ expect(merged.actionButtons.focusedBackgroundColor).toBe(
300
+ "rgba(20, 20, 20, 1)"
301
+ );
302
+
303
+ expect(merged.actionButtons.fontColor).toBe("#EEEEEE");
304
+ expect(merged.actionButtons.focusedFontColor).toBe("#FFDD00");
305
+ expect(merged.actionButtons.fontSize).toBe(12);
306
+ expect(merged.actionButtons.cornerRadius).toBe(20);
307
+ expect(merged.actionButtons.paddingTop).toBe(8);
308
+ expect(merged.actionButtons.paddingLeft).toBe(12);
309
+ });
310
+
311
+ it("uses title.default when only platform font and letter spacing are set", () => {
312
+ const merged = mergeHeaderConfiguration(VARIANT_SECTION_HEADER, {
313
+ title: {
314
+ default: {
315
+ iosFontFamily: "SFProText-Semibold",
316
+ androidFontFamily: "Roboto-Medium",
317
+ iosLetterSpacing: -0.4,
318
+ androidLetterSpacing: 0,
319
+ },
320
+ },
321
+ });
322
+
323
+ expect(merged.title.iosFontFamily).toBe("SFProText-Semibold");
324
+ expect(merged.title.androidFontFamily).toBe("Roboto-Medium");
325
+ expect(merged.title.iosLetterSpacing).toBe(-0.4);
326
+ expect(merged.title.androidLetterSpacing).toBe(0);
327
+ expect(merged.title.fontSize).toBe(VARIANT_SECTION_HEADER.title.fontSize);
328
+ });
329
+
330
+ it("does not change section defaults when block is empty", () => {
331
+ const merged = mergeHeaderConfiguration(VARIANT_SECTION_HEADER, {
332
+ title: { default: {} },
333
+ actionButtons: { default: {} },
334
+ });
335
+
336
+ expect(merged.title.fontSize).toBe(VARIANT_SECTION_HEADER.title.fontSize);
337
+
338
+ expect(merged.actionButtons.defaultBackgroundColor).toBe(
339
+ VARIANT_SECTION_HEADER.actionButtons.defaultBackgroundColor
340
+ );
341
+ });
342
+
343
+ it("leaves single-line header title size untouched when only actionButtons set", () => {
344
+ const merged = mergeHeaderConfiguration(VARIANT_SINGLE_LINE_HEADER, {
345
+ actionButtons: {
346
+ default: { backgroundColor: "#123456" },
347
+ },
348
+ });
349
+
350
+ expect(merged.title.fontSize).toBe(
351
+ VARIANT_SINGLE_LINE_HEADER.title.fontSize
352
+ );
353
+
354
+ expect(merged.actionButtons.defaultBackgroundColor).toBe("#123456");
355
+ });
356
+ });