@applicaster/zapp-react-native-ui-components 16.0.0-alpha.1535029240 → 16.0.0-alpha.1701179921

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 (92) 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/Image/hoc/utils/__tests__/withDimensions.test.ts +420 -125
  17. package/Components/MasterCell/DefaultComponents/Image/hoc/utils/index.ts +114 -19
  18. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +19 -8
  19. package/Components/MasterCell/DefaultComponents/LiveImage/executePreloadHooks.ts +2 -4
  20. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -3
  21. package/Components/MasterCell/DefaultComponents/Toggle.tsx +36 -14
  22. package/Components/MasterCell/DefaultComponents/__tests__/Toggle.test.tsx +167 -0
  23. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/factory.test.ts +32 -0
  24. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +1 -2
  25. package/Components/ModalComponent/ActionsBottomSheet/ActionButton.tsx +56 -0
  26. package/Components/ModalComponent/ActionsBottomSheet/__tests__/openActionsBottomSheet.test.ts +38 -0
  27. package/Components/ModalComponent/ActionsBottomSheet/boundActionButton.tsx +24 -0
  28. package/Components/ModalComponent/ActionsBottomSheet/index.ts +9 -0
  29. package/Components/ModalComponent/ActionsBottomSheet/openActionsBottomSheet.ts +61 -0
  30. package/Components/ModalComponent/AudioPlayer/Components/Button.tsx +87 -97
  31. package/Components/ModalComponent/AudioPlayer/Components/Header.tsx +87 -126
  32. package/Components/ModalComponent/AudioPlayer/Components/Input.tsx +140 -83
  33. package/Components/ModalComponent/AudioPlayer/Components/Item.tsx +252 -123
  34. package/Components/ModalComponent/AudioPlayer/Components/NowPlayingHeaderSection.tsx +205 -0
  35. package/Components/ModalComponent/AudioPlayer/Components/__tests__/Item.test.tsx +113 -0
  36. package/Components/ModalComponent/AudioPlayer/Components/__tests__/NowPlayingHeaderSection.test.tsx +36 -0
  37. package/Components/ModalComponent/AudioPlayer/Components/index.ts +3 -3
  38. package/Components/ModalComponent/AudioPlayer/utils/__tests__/mergeStyles.test.ts +356 -0
  39. package/Components/ModalComponent/AudioPlayer/utils/mergeStyles.ts +521 -0
  40. package/Components/ModalComponent/BottomSheetDragArea.tsx +33 -0
  41. package/Components/ModalComponent/BottomSheetModalContent.tsx +505 -66
  42. package/Components/ModalComponent/Button/index.tsx +5 -3
  43. package/Components/ModalComponent/Header/CloseButton.tsx +12 -0
  44. package/Components/ModalComponent/Header/__tests__/CloseButton.test.tsx +72 -0
  45. package/Components/ModalComponent/Header/index.tsx +20 -7
  46. package/Components/ModalComponent/Header/utils.ts +1 -1
  47. package/Components/ModalComponent/ModalBlocksStyleContext.tsx +10 -0
  48. package/Components/ModalComponent/SortableList.tsx +156 -0
  49. package/Components/ModalComponent/SortableList.web.tsx +34 -0
  50. package/Components/ModalComponent/TextInputContent.tsx +135 -0
  51. package/Components/ModalComponent/__tests__/BottomSheetDragArea.test.tsx +74 -0
  52. package/Components/ModalComponent/__tests__/BottomSheetModalContent.test.tsx +343 -0
  53. package/Components/ModalComponent/__tests__/SortableList.web.test.tsx +16 -0
  54. package/Components/ModalComponent/__tests__/TextInputContent.test.tsx +169 -0
  55. package/Components/ModalComponent/__tests__/showTextInput.test.ts +95 -0
  56. package/Components/ModalComponent/index.tsx +18 -9
  57. package/Components/ModalComponent/presets/__tests__/getCell.test.ts +90 -0
  58. package/Components/ModalComponent/presets/dynamicCollectionCell.tsx +78 -0
  59. package/Components/ModalComponent/presets/index.ts +27 -0
  60. package/Components/ModalComponent/presets/selectableCell.tsx +28 -0
  61. package/Components/ModalComponent/presets/standardCell.tsx +41 -0
  62. package/Components/ModalComponent/presets/types.ts +35 -0
  63. package/Components/ModalComponent/showTextInput.ts +52 -0
  64. package/Components/ModalComponent/utils.ts +82 -21
  65. package/Components/OfflineHandler/hooks.ts +0 -12
  66. package/Components/PlayerContainer/PlayerContainer.tsx +19 -8
  67. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -4
  68. package/Components/PlayerContainer/__tests__/PlayerContainer.test.tsx +66 -13
  69. package/Components/River/ComponentsMap/ComponentsMap.tsx +85 -59
  70. package/Components/River/River.tsx +4 -0
  71. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +138 -75
  72. package/Components/River/__tests__/componentsMap.test.js +8 -3
  73. package/Components/River/__tests__/resultCallback.test.tsx +47 -0
  74. package/Components/Screen/__tests__/Screen.test.tsx +24 -0
  75. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +2 -0
  76. package/Components/Screen/index.tsx +5 -0
  77. package/Components/Screen/navigationHandler.ts +8 -8
  78. package/Components/ScreenRevealManager/ScreenRevealManager.ts +18 -2
  79. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +36 -0
  80. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +56 -0
  81. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +21 -4
  82. package/Components/Transitioner/Transitioner.tsx +2 -3
  83. package/Components/Transitioner/__tests__/transitioner.test.js +83 -2
  84. package/Components/VideoLive/LiveImageManager.ts +9 -3
  85. package/Components/VideoLive/__tests__/LiveImageManager.test.ts +59 -0
  86. package/Contexts/ModalNavigationContext/__tests__/index.test.tsx +15 -0
  87. package/Contexts/ModalNavigationContext/index.tsx +2 -2
  88. package/Hooks/useEntryActionsExpander.ts +63 -0
  89. package/assets/empty-Info.png +0 -0
  90. package/package.json +6 -5
  91. package/Components/ModalComponent/AudioPlayer/Components/Action.tsx +0 -332
  92. /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
+ });