1
1
/* @flow */
2
2
3
- import { max , perc , roundUp } from "@krakenjs/belter/src" ;
3
+ import { max , perc } from "@krakenjs/belter/src" ;
4
4
import {
5
5
FUNDING ,
6
6
type FundingEligibilityType ,
@@ -12,96 +12,38 @@ import {
12
12
BUTTON_NUMBER ,
13
13
CLASS ,
14
14
ATTRIBUTE ,
15
- BUTTON_SIZE ,
16
15
} from "../../../constants" ;
17
- import { BUTTON_SIZE_STYLE , BUTTON_RELATIVE_STYLE } from "../config" ;
16
+ import {
17
+ BUTTON_SIZE_STYLE ,
18
+ BUTTON_RELATIVE_STYLE ,
19
+ BUTTON_DISABLE_MAX_HEIGHT_STYLE ,
20
+ } from "../config" ;
18
21
import { isBorderRadiusNumber } from "../util" ;
19
22
import type { Experiment } from "../../../types" ;
20
23
21
- const BUTTON_MIN_ASPECT_RATIO = 2.2 ;
22
- const MIN_SPLIT_BUTTON_WIDTH = 300 ;
24
+ import {
25
+ getResponsiveStyleVariables ,
26
+ getDisableMaxHeightResponsiveStyleVariables ,
27
+ } from "./styleUtils" ;
23
28
24
29
const FIRST_BUTTON_PERC = 50 ;
25
30
const WALLET_BUTTON_PERC = 60 ;
26
31
27
- export function getResponsiveStyleVariables ( {
28
- height,
29
- fundingEligibility,
30
- experiment = { } ,
31
- size,
32
- } : { |
33
- height ?: ?number ,
34
- fundingEligibility : FundingEligibilityType ,
35
- experiment : Experiment ,
36
- size : $Values < typeof BUTTON_SIZE > ,
37
- | } ) : Object {
38
- const { isPaypalRebrandEnabled, defaultBlueButtonColor } = experiment ;
39
- const shouldApplyRebrandedStyles =
40
- isPaypalRebrandEnabled && defaultBlueButtonColor !== "gold" ;
41
-
42
- const style = BUTTON_SIZE_STYLE [ size ] ;
43
-
44
- const buttonHeight = height || style . defaultHeight ;
45
- const minDualWidth = Math . max (
46
- Math . round (
47
- buttonHeight * BUTTON_MIN_ASPECT_RATIO * ( 100 / WALLET_BUTTON_PERC )
48
- ) ,
49
- MIN_SPLIT_BUTTON_WIDTH
50
- ) ;
51
-
52
- const { paylater } = fundingEligibility ;
53
-
54
- const shouldResizeLabel =
55
- paylater ?. products ?. paylater ?. variant === "DE" ||
56
- paylater ?. products ?. payIn3 ?. variant === "IT" ||
57
- paylater ?. products ?. payIn3 ?. variant === "ES" ;
58
-
59
- const textPercPercentage = shouldResizeLabel ? 32 : 36 ;
60
- const labelPercPercentage = shouldResizeLabel ? 32 : 35 ;
61
-
62
- let smallerLabelHeight = max (
63
- roundUp ( perc ( buttonHeight , labelPercPercentage ) + 5 , 2 ) ,
64
- 12
65
- ) ;
66
- let labelHeight = max ( roundUp ( perc ( buttonHeight , 35 ) + 5 , 2 ) , 12 ) ;
67
-
68
- const pillBorderRadius = Math . ceil ( buttonHeight / 2 ) ;
69
-
70
- if ( shouldApplyRebrandedStyles ) {
71
- labelHeight = roundUp ( perc ( buttonHeight , 76 ) , 1 ) ;
72
- // smallerLabelHeight gets triggered at widths < 320px
73
- // We will need to investigate why the labels need to get significantly smaller at this breakpoint
74
- smallerLabelHeight = labelHeight ;
75
- }
76
-
77
- const styleVariables = {
78
- style,
79
- buttonHeight,
80
- minDualWidth,
81
- textPercPercentage,
82
- smallerLabelHeight,
83
- labelHeight,
84
- pillBorderRadius,
85
- } ;
86
-
87
- return styleVariables ;
88
- }
89
-
90
- export function buttonResponsiveStyle ( {
32
+ const generateButtonSizeStyles = ( {
91
33
height,
92
34
fundingEligibility,
93
35
disableMaxWidth,
94
36
disableMaxHeight,
95
37
borderRadius,
96
- experiment = { } ,
38
+ experiment,
97
39
} : { |
98
40
height ?: ?number ,
99
41
fundingEligibility : FundingEligibilityType ,
100
42
disableMaxWidth ?: ?boolean ,
101
43
disableMaxHeight ?: ?boolean ,
102
44
borderRadius ?: ?number ,
103
45
experiment : Experiment ,
104
- | } ) : string {
46
+ | } ) : string => {
105
47
return Object . keys ( BUTTON_SIZE_STYLE )
106
48
. map ( ( size ) => {
107
49
const {
@@ -121,7 +63,6 @@ export function buttonResponsiveStyle({
121
63
122
64
return `
123
65
@media only screen and (min-width: ${ style . minWidth } px) {
124
-
125
66
.${ CLASS . CONTAINER } {
126
67
min-width: ${ style . minWidth } px;
127
68
${ disableMaxWidth ? "" : `max-width: ${ style . maxWidth } px;` } ;
@@ -409,8 +350,147 @@ export function buttonResponsiveStyle({
409
350
display: block;
410
351
}
411
352
}
353
+ ` ;
354
+ } )
355
+ . join ( "\n" ) ;
356
+ } ;
412
357
413
- ` ;
358
+ const generateDisableMaxHeightStyles = ( {
359
+ fundingEligibility,
360
+ experiment,
361
+ } : { |
362
+ fundingEligibility : FundingEligibilityType ,
363
+ experiment : Experiment ,
364
+ | } ) : string => {
365
+ return Object . keys ( BUTTON_DISABLE_MAX_HEIGHT_STYLE )
366
+ . map ( ( disableMaxHeightSize ) => {
367
+ const {
368
+ disableHeightStyle,
369
+ buttonHeight,
370
+ labelHeight,
371
+ fontSize,
372
+ marginTop,
373
+ spinnerSize,
374
+ pillBorderRadius,
375
+ APMHeight,
376
+ applePayHeight,
377
+ } = getDisableMaxHeightResponsiveStyleVariables ( {
378
+ fundingEligibility,
379
+ experiment,
380
+ disableMaxHeightSize,
381
+ } ) ;
382
+
383
+ const { minHeight, maxHeight } = disableHeightStyle ;
384
+
385
+ return `
386
+ @media (min-height: ${ minHeight } px) and (max-height: ${ maxHeight } px) {
387
+ .${ CLASS . CONTAINER } .${ CLASS . BUTTON_ROW } .${ CLASS . TEXT } ,
388
+ .${ CLASS . CONTAINER } .${ CLASS . BUTTON_ROW } .${ CLASS . SPACE } {
389
+ font-size: ${ fontSize } px;
390
+ margin-top: -${ marginTop } px;
391
+ line-height: ${ labelHeight } px;
392
+ }
393
+
394
+ .${ CLASS . CONTAINER } .${ CLASS . BUTTON_ROW } .${ CLASS . TEXT } * {
395
+ margin-top: ${ marginTop } px;
396
+ }
397
+
398
+ .${ CLASS . BUTTON } .${ CLASS . SPINNER } {
399
+ height: ${ spinnerSize } px;
400
+ width: ${ spinnerSize } px;
401
+ }
402
+
403
+ .${ CLASS . BUTTON } > .${ CLASS . BUTTON_LABEL } {
404
+ margin: 0 4vw;
405
+ height: ${ labelHeight } px;
406
+ }
407
+
408
+ .${ CLASS . BUTTON } [${ ATTRIBUTE . FUNDING_SOURCE } =${ FUNDING . APPLEPAY } ]
409
+ .${ CLASS . BUTTON_LABEL } {
410
+ height: ${ applePayHeight } px;
411
+ }
412
+
413
+ .${ CLASS . BUTTON } [${ ATTRIBUTE . FUNDING_SOURCE } =${ FUNDING . APPLEPAY } ]
414
+ .${ CLASS . BUTTON_LABEL } .${ CLASS . TEXT } {
415
+ line-height: ${ applePayHeight } px;
416
+ }
417
+
418
+ .${ CLASS . BUTTON } [${ ATTRIBUTE . FUNDING_SOURCE } =${ FUNDING . EPS } ]
419
+ .${ CLASS . BUTTON_LABEL } ,
420
+ .${ CLASS . BUTTON } [${ ATTRIBUTE . FUNDING_SOURCE } =${ FUNDING . MYBANK } ]
421
+ .${ CLASS . BUTTON_LABEL } {
422
+ height: ${ APMHeight } px;
423
+ }
424
+
425
+ .${ CLASS . BUTTON } [${ ATTRIBUTE . FUNDING_SOURCE } =${ FUNDING . EPS } ]
426
+ .${ CLASS . BUTTON_LABEL } .${ CLASS . TEXT } ,
427
+ .${ CLASS . BUTTON } [${ ATTRIBUTE . FUNDING_SOURCE } =${ FUNDING . EPS } ]
428
+ .${ CLASS . BUTTON_LABEL } .${ CLASS . SPACE } ,
429
+ .${ CLASS . BUTTON } [${ ATTRIBUTE . FUNDING_SOURCE } =${ FUNDING . MYBANK } ]
430
+ .${ CLASS . BUTTON_LABEL } .${ CLASS . TEXT } ,
431
+ .${ CLASS . BUTTON } [${ ATTRIBUTE . FUNDING_SOURCE } =${ FUNDING . MYBANK } ]
432
+ .${ CLASS . BUTTON_LABEL } .${ CLASS . SPACE } {
433
+ line-height: ${ APMHeight } px;
434
+ }
435
+
436
+ .${ CLASS . BUTTON } .${ CLASS . SHAPE } -${ BUTTON_SHAPE . PILL } {
437
+ border-radius: ${ pillBorderRadius } px;
438
+ }
439
+
440
+ .${ CLASS . BUTTON_ROW } .${ CLASS . SHAPE } -${ BUTTON_SHAPE . PILL }
441
+ .menu-button {
442
+ border-top-right-radius: ${ pillBorderRadius } px;
443
+ border-bottom-right-radius: ${ pillBorderRadius } px;
444
+ }
445
+
446
+ .${ CLASS . BUTTON_ROW } .${ CLASS . WALLET } .${ CLASS . WALLET_MENU }
447
+ .${ CLASS . BUTTON } {
448
+ width: calc(100% - ${ buttonHeight + 2 } px);
449
+ border-top-right-radius: 0px;
450
+ border-bottom-right-radius: 0px;
451
+ }
452
+
453
+ .menu-button {
454
+ height: 100%;
455
+ width: auto;
456
+ aspect-ratio: 1;
457
+ }
458
+ }
459
+ ` ;
414
460
} )
415
461
. join ( "\n" ) ;
462
+ } ;
463
+
464
+ export function buttonResponsiveStyle ( {
465
+ height,
466
+ fundingEligibility,
467
+ disableMaxWidth,
468
+ disableMaxHeight,
469
+ borderRadius,
470
+ experiment = { } ,
471
+ } : { |
472
+ height ?: ?number ,
473
+ fundingEligibility : FundingEligibilityType ,
474
+ disableMaxWidth ?: ?boolean ,
475
+ disableMaxHeight ?: ?boolean ,
476
+ borderRadius ?: ?number ,
477
+ experiment : Experiment ,
478
+ | } ) : string {
479
+ const buttonSizeStyles = generateButtonSizeStyles ( {
480
+ height,
481
+ fundingEligibility,
482
+ disableMaxWidth,
483
+ disableMaxHeight,
484
+ borderRadius,
485
+ experiment,
486
+ } ) ;
487
+
488
+ const disableMaxHeightStyles = disableMaxHeight
489
+ ? generateDisableMaxHeightStyles ( {
490
+ fundingEligibility,
491
+ experiment,
492
+ } )
493
+ : "" ;
494
+
495
+ return buttonSizeStyles + disableMaxHeightStyles ;
416
496
}
0 commit comments