@applicaster/zapp-react-native-ui-components 16.0.0-alpha.1593888345 → 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 (48) hide show
  1. package/Components/LinkHandler/LinkHandler.tsx +2 -7
  2. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +4 -1
  3. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/ActionButtonController.tsx +19 -4
  4. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/components/__tests__/ActionButtonController.test.tsx +43 -1
  5. package/Components/MasterCell/DefaultComponents/LiveImage/executePreloadHooks.ts +2 -4
  6. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -3
  7. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/factory.test.ts +32 -0
  8. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +1 -2
  9. package/Components/ModalComponent/ActionsBottomSheet/ActionButton.tsx +4 -2
  10. package/Components/ModalComponent/ActionsBottomSheet/__tests__/openActionsBottomSheet.test.ts +38 -0
  11. package/Components/ModalComponent/ActionsBottomSheet/boundActionButton.tsx +5 -2
  12. package/Components/ModalComponent/ActionsBottomSheet/openActionsBottomSheet.ts +4 -1
  13. package/Components/ModalComponent/AudioPlayer/Components/Button.tsx +58 -73
  14. package/Components/ModalComponent/AudioPlayer/Components/Header.tsx +65 -56
  15. package/Components/ModalComponent/AudioPlayer/Components/Input.tsx +140 -65
  16. package/Components/ModalComponent/AudioPlayer/Components/Item.tsx +93 -46
  17. package/Components/ModalComponent/AudioPlayer/Components/NowPlayingHeaderSection.tsx +148 -32
  18. package/Components/ModalComponent/AudioPlayer/Components/__tests__/Item.test.tsx +113 -0
  19. package/Components/ModalComponent/AudioPlayer/Components/__tests__/NowPlayingHeaderSection.test.tsx +36 -0
  20. package/Components/ModalComponent/AudioPlayer/Components/index.ts +0 -2
  21. package/Components/ModalComponent/AudioPlayer/utils/__tests__/mergeStyles.test.ts +132 -6
  22. package/Components/ModalComponent/AudioPlayer/utils/mergeStyles.ts +202 -13
  23. package/Components/ModalComponent/BottomSheetModalContent.tsx +187 -73
  24. package/Components/ModalComponent/SortableList.tsx +36 -22
  25. package/Components/ModalComponent/TextInputContent.tsx +42 -7
  26. package/Components/ModalComponent/__tests__/BottomSheetModalContent.test.tsx +111 -6
  27. package/Components/ModalComponent/__tests__/TextInputContent.test.tsx +50 -1
  28. package/Components/ModalComponent/index.tsx +7 -9
  29. package/Components/ModalComponent/presets/__tests__/getCell.test.ts +24 -0
  30. package/Components/ModalComponent/presets/selectableCell.tsx +1 -1
  31. package/Components/ModalComponent/showTextInput.ts +11 -2
  32. package/Components/PlayerContainer/PlayerContainer.tsx +8 -1
  33. package/Components/River/ComponentsMap/ComponentsMap.tsx +10 -12
  34. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +138 -75
  35. package/Components/River/__tests__/componentsMap.test.js +8 -3
  36. package/Components/Screen/__tests__/Screen.test.tsx +24 -0
  37. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +2 -0
  38. package/Components/Screen/index.tsx +5 -0
  39. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +1 -1
  40. package/Components/Transitioner/Transitioner.tsx +2 -3
  41. package/Components/Transitioner/__tests__/transitioner.test.js +83 -2
  42. package/Components/VideoLive/LiveImageManager.ts +8 -2
  43. package/Components/VideoLive/__tests__/LiveImageManager.test.ts +59 -0
  44. package/Contexts/ModalNavigationContext/__tests__/index.test.tsx +15 -0
  45. package/Contexts/ModalNavigationContext/index.tsx +2 -2
  46. package/assets/empty-Info.png +0 -0
  47. package/package.json +5 -5
  48. package/Components/ModalComponent/AudioPlayer/Components/Action.tsx +0 -314
@@ -1,7 +1,12 @@
1
1
  import {
2
2
  mergeItemConfiguration,
3
3
  mergeButtonConfiguration,
4
+ mergeHeaderConfiguration,
4
5
  } from "../mergeStyles";
6
+ import {
7
+ VARIANT_SECTION_HEADER,
8
+ VARIANT_SINGLE_LINE_HEADER,
9
+ } from "../../Components/Header";
5
10
 
6
11
  const base = {
7
12
  background: {
@@ -57,7 +62,7 @@ describe("mergeItemConfiguration background", () => {
57
62
  expect(merged.textLabel1.lineHeight).toBe(40);
58
63
  });
59
64
 
60
- it("merges background padding from Studio keys", () => {
65
+ it("does not merge Studio item background padding (white spec field)", () => {
61
66
  const merged = mergeItemConfiguration(base as any, {
62
67
  background: {
63
68
  default: {
@@ -70,11 +75,11 @@ describe("mergeItemConfiguration background", () => {
70
75
  },
71
76
  });
72
77
 
73
- expect(merged.background.paddingTop).toBe(32);
74
- expect(merged.background.paddingBottom).toBe(32);
75
- expect(merged.background.paddingLeft).toBe(40);
76
- expect(merged.background.paddingRight).toBe(40);
77
- // Default-only override must not steal the base focused highlight color.
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();
78
83
  expect(merged.background.focusedColor).toBe("rgba(62, 62, 62, 1)");
79
84
  });
80
85
 
@@ -227,4 +232,125 @@ describe("mergeButtonConfiguration background", () => {
227
232
  "https://placehold.co/24x24/FF00FF/FFFFFF/png?text=CN"
228
233
  );
229
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
+ });
230
356
  });
@@ -9,6 +9,7 @@ import {
9
9
  } from "../Components/Item";
10
10
  import {
11
11
  TitleConfiguration as HeaderTitleConfiguration,
12
+ ActionButtonsStyleConfiguration as HeaderActionButtonsStyleConfiguration,
12
13
  HeaderConfiguration,
13
14
  } from "../Components/Header";
14
15
  import {
@@ -45,18 +46,6 @@ function mergeItemBackground(
45
46
  ...(defaultOverride?.borderRadius !== undefined
46
47
  ? { cornerRadius: defaultOverride.borderRadius }
47
48
  : {}),
48
- ...(defaultOverride?.paddingTop !== undefined
49
- ? { paddingTop: defaultOverride.paddingTop }
50
- : {}),
51
- ...(defaultOverride?.paddingRight !== undefined
52
- ? { paddingRight: defaultOverride.paddingRight }
53
- : {}),
54
- ...(defaultOverride?.paddingBottom !== undefined
55
- ? { paddingBottom: defaultOverride.paddingBottom }
56
- : {}),
57
- ...(defaultOverride?.paddingLeft !== undefined
58
- ? { paddingLeft: defaultOverride.paddingLeft }
59
- : {}),
60
49
  };
61
50
  }
62
51
 
@@ -93,6 +82,33 @@ function mergeItemLabel(
93
82
  ...(override.lineHeight !== undefined
94
83
  ? { lineHeight: override.lineHeight }
95
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
+ : {}),
96
112
  };
97
113
  }
98
114
 
@@ -195,6 +211,122 @@ function mergeHeaderTitle(
195
211
  ...base,
196
212
  ...(override.fontColor ? { fontColor: override.fontColor } : {}),
197
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
+ : {}),
198
330
  };
199
331
  }
200
332
 
@@ -206,9 +338,39 @@ export function mergeHeaderConfiguration(
206
338
 
207
339
  const bgOverride = headerBlock.container?.default?.backgroundColor;
208
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
+
209
366
  return {
210
367
  ...base,
211
- title: mergeHeaderTitle(base.title, headerBlock.title?.default),
368
+ title: mergeHeaderTitle(base.title, titleOverride),
369
+ actionButtons: mergeHeaderActionButtons(
370
+ base.actionButtons,
371
+ actionButtonsDefault,
372
+ actionButtonsFocused
373
+ ),
212
374
  ...(bgOverride ? { backgroundColor: bgOverride } : {}),
213
375
  };
214
376
  }
@@ -267,6 +429,33 @@ function mergeButtonTitle(
267
429
  ...(override.lineHeight !== undefined
268
430
  ? { lineHeight: override.lineHeight }
269
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
+ : {}),
270
459
  };
271
460
  }
272
461