@transferwise/components 0.0.0-experimental-c81666a → 0.0.0-experimental-bb07bc5

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 (79) hide show
  1. package/build/i18n/ja.json +1 -1
  2. package/build/i18n/ja.json.js +1 -1
  3. package/build/i18n/ja.json.mjs +1 -1
  4. package/build/image/Image.js +10 -9
  5. package/build/image/Image.js.map +1 -1
  6. package/build/image/Image.mjs +11 -11
  7. package/build/image/Image.mjs.map +1 -1
  8. package/build/index.js +1 -0
  9. package/build/index.js.map +1 -1
  10. package/build/index.mjs +1 -1
  11. package/build/main.css +212 -0
  12. package/build/styles/listItem/ListItem.css +212 -0
  13. package/build/styles/main.css +212 -0
  14. package/build/test-utils/assets/apple-pay-logo.svg +84 -0
  15. package/build/types/image/Image.d.ts +1 -0
  16. package/build/types/image/Image.d.ts.map +1 -1
  17. package/build/types/index.d.ts +2 -0
  18. package/build/types/index.d.ts.map +1 -1
  19. package/build/types/listItem/ListItem.d.ts +50 -0
  20. package/build/types/listItem/ListItem.d.ts.map +1 -0
  21. package/build/types/listItem/ListItemAdditionalInfo.d.ts +9 -0
  22. package/build/types/listItem/ListItemAdditionalInfo.d.ts.map +1 -0
  23. package/build/types/listItem/ListItemButton.d.ts +6 -0
  24. package/build/types/listItem/ListItemButton.d.ts.map +1 -0
  25. package/build/types/listItem/ListItemCheckbox.d.ts +4 -0
  26. package/build/types/listItem/ListItemCheckbox.d.ts.map +1 -0
  27. package/build/types/listItem/ListItemIconButton.d.ts +8 -0
  28. package/build/types/listItem/ListItemIconButton.d.ts.map +1 -0
  29. package/build/types/listItem/ListItemMedia.d.ts +19 -0
  30. package/build/types/listItem/ListItemMedia.d.ts.map +1 -0
  31. package/build/types/listItem/ListItemNavigation.d.ts +4 -0
  32. package/build/types/listItem/ListItemNavigation.d.ts.map +1 -0
  33. package/build/types/listItem/ListItemSwitch.d.ts +3 -0
  34. package/build/types/listItem/ListItemSwitch.d.ts.map +1 -0
  35. package/build/types/listItem/index.d.ts +6 -0
  36. package/build/types/listItem/index.d.ts.map +1 -0
  37. package/build/types/listItem/prompt/Prompt.d.ts +12 -0
  38. package/build/types/listItem/prompt/Prompt.d.ts.map +1 -0
  39. package/build/types/listItem/useItemControl.d.ts +5 -0
  40. package/build/types/listItem/useItemControl.d.ts.map +1 -0
  41. package/build/types/test-utils/fake-data.d.ts +2 -0
  42. package/build/types/test-utils/fake-data.d.ts.map +1 -1
  43. package/build/types/uploadInput/UploadInput.d.ts.map +1 -1
  44. package/build/uploadInput/UploadInput.js +0 -1
  45. package/build/uploadInput/UploadInput.js.map +1 -1
  46. package/build/uploadInput/UploadInput.mjs +0 -1
  47. package/build/uploadInput/UploadInput.mjs.map +1 -1
  48. package/package.json +3 -3
  49. package/src/i18n/ja.json +1 -1
  50. package/src/image/Image.spec.tsx +3 -3
  51. package/src/image/Image.tsx +12 -10
  52. package/src/index.ts +2 -0
  53. package/src/legacylistItem/LegacyListItem.story.tsx +5 -5
  54. package/src/legacylistItem/LegacyListItem.tests.story.tsx +6 -6
  55. package/src/listItem/ListItem.css +212 -0
  56. package/src/listItem/ListItem.less +210 -0
  57. package/src/listItem/ListItem.spec.tsx +35 -0
  58. package/src/listItem/ListItem.story.tsx +461 -0
  59. package/src/listItem/ListItem.tsx +282 -0
  60. package/src/listItem/ListItemAdditionalInfo.tsx +31 -0
  61. package/src/listItem/ListItemButton.spec.tsx +92 -0
  62. package/src/listItem/ListItemButton.tsx +24 -0
  63. package/src/listItem/ListItemCheckbox.tsx +14 -0
  64. package/src/listItem/ListItemIconButton.tsx +16 -0
  65. package/src/listItem/ListItemMedia.tsx +52 -0
  66. package/src/listItem/ListItemNavigation.tsx +23 -0
  67. package/src/listItem/ListItemSwitch.tsx +8 -0
  68. package/src/listItem/index.ts +10 -0
  69. package/src/listItem/prompt/Prompt.spec.tsx +77 -0
  70. package/src/listItem/prompt/Prompt.story.tsx +170 -0
  71. package/src/listItem/prompt/Prompt.tsx +44 -0
  72. package/src/listItem/useItemControl.tsx +23 -0
  73. package/src/main.css +212 -0
  74. package/src/main.less +1 -0
  75. package/src/promoCard/__snapshots__/PromoCard.spec.tsx.snap +0 -1
  76. package/src/promoCard/__snapshots__/PromoCardGroup.spec.tsx.snap +0 -2
  77. package/src/test-utils/assets/apple-pay-logo.svg +84 -0
  78. package/src/test-utils/fake-data.ts +5 -0
  79. package/src/uploadInput/UploadInput.tsx +4 -13
@@ -0,0 +1,170 @@
1
+ import Link from '../../link';
2
+ import { Sentiment } from '../../common';
3
+ import { Prompt, ListItemPromptProps } from './Prompt';
4
+ import { lorem40 } from '../../test-utils';
5
+ import { StoryObj } from '@storybook/react';
6
+
7
+ export default {
8
+ component: Prompt,
9
+ title: 'Content/ListItem/Prompt',
10
+ args: {
11
+ type: Sentiment.NEGATIVE,
12
+ children: 'You have done a terrible thing',
13
+ },
14
+ argTypes: {
15
+ type: {
16
+ options: [
17
+ Sentiment.POSITIVE,
18
+ Sentiment.NEGATIVE,
19
+ Sentiment.NEUTRAL,
20
+ Sentiment.WARNING,
21
+ 'discount',
22
+ 'savings',
23
+ ],
24
+ control: { type: 'radio' },
25
+ description: 'The type of prompt to display',
26
+ },
27
+ action: {
28
+ table: {
29
+ disable: true,
30
+ },
31
+ },
32
+ children: {
33
+ type: {
34
+ name: 'string',
35
+ required: true,
36
+ description: 'The content of the prompt',
37
+ },
38
+ },
39
+ },
40
+ };
41
+
42
+ type CustomStory = StoryObj<
43
+ ListItemPromptProps & {
44
+ interactivity?: 'none' | 'full-anchor' | 'full-button' | 'link';
45
+ }
46
+ >;
47
+
48
+ export const Basic: CustomStory = {
49
+ args: {
50
+ interactivity: 'none',
51
+ },
52
+ argTypes: {
53
+ interactivity: {
54
+ options: ['none', 'full-button', 'full-anchor', 'link'],
55
+ control: { type: 'radio' },
56
+ description: 'The type of interactivity to display',
57
+ },
58
+ },
59
+ render: ({ interactivity, ...args }) => {
60
+ return (
61
+ <div>
62
+ <Prompt
63
+ type={args.type}
64
+ action={
65
+ interactivity === 'full-anchor'
66
+ ? { href: 'wise.com' }
67
+ : interactivity === 'full-button'
68
+ ? {
69
+ onClick: () => {
70
+ console.log('clicked');
71
+ },
72
+ }
73
+ : undefined
74
+ }
75
+ >
76
+ {args.children} {interactivity === 'link' && <Link href="www.wise.com">with a link</Link>}
77
+ </Prompt>
78
+ </div>
79
+ );
80
+ },
81
+ };
82
+
83
+ export const Variants = () => {
84
+ return (
85
+ <>
86
+ <div className="m-b-2">
87
+ <Prompt type={Sentiment.POSITIVE}>
88
+ Positive prompt <Link href="www.wise.com">with a link to amazing content</Link>
89
+ </Prompt>
90
+ </div>
91
+ <div className="m-b-2">
92
+ <Prompt type={Sentiment.NEGATIVE}>
93
+ Negative prompt <Link href="www.wise.com">with a link to amazing content</Link>
94
+ </Prompt>
95
+ </div>
96
+ <div className="m-b-2">
97
+ <Prompt type={Sentiment.NEUTRAL}>
98
+ Neutral prompt <Link href="www.wise.com">with a link to amazing content</Link>
99
+ </Prompt>
100
+ </div>
101
+ <div className="m-b-2">
102
+ <Prompt type={Sentiment.WARNING}>
103
+ Warning prompt <Link href="www.wise.com">with a link to amazing content</Link>
104
+ </Prompt>
105
+ </div>
106
+ <div className="m-b-2">
107
+ <Prompt type="discount">
108
+ Discount prompt <Link href="www.wise.com">with a link to amazing content</Link>
109
+ </Prompt>
110
+ </div>
111
+ <div className="m-b-2">
112
+ <Prompt type="savings">
113
+ Savings prompt <Link href="www.wise.com">with a link to amazing content</Link>
114
+ </Prompt>
115
+ </div>
116
+ <div className="m-b-2">
117
+ <Prompt
118
+ type="discount"
119
+ action={{
120
+ href: 'www.wise.com',
121
+ target: '_self',
122
+ 'aria-label': 'hidden anchor tags are accessible, right?',
123
+ }}
124
+ >
125
+ The whole prompt is secretly clickable
126
+ </Prompt>
127
+ </div>
128
+ <div className="m-b-2">
129
+ <Prompt
130
+ type="negative"
131
+ action={{
132
+ href: 'www.wise.com',
133
+ target: '_self',
134
+ 'aria-label': 'clickable <a>',
135
+ }}
136
+ >
137
+ The whole prompt is secretly clickable as an anchor tag
138
+ </Prompt>
139
+ </div>
140
+ <div className="m-b-2">
141
+ <Prompt
142
+ type="warning"
143
+ action={{
144
+ onClick: () => {
145
+ console.log('clicked');
146
+ },
147
+ 'aria-label': 'clickable button',
148
+ }}
149
+ >
150
+ The whole prompt is secretly clickable as a button
151
+ </Prompt>
152
+ </div>
153
+ <div className="m-b-2">
154
+ <Prompt
155
+ type="neutral"
156
+ action={{
157
+ href: 'www.wise.com',
158
+ target: '_self',
159
+ 'aria-label': 'clickable prompt',
160
+ }}
161
+ >
162
+ The whole prompt is secretly clickable
163
+ </Prompt>
164
+ </div>
165
+ <div className="m-b-2" style={{ maxWidth: '300px' }}>
166
+ <Prompt type="warning">The prompt has very long text that wraps {lorem40}</Prompt>
167
+ </div>
168
+ </>
169
+ );
170
+ };
@@ -0,0 +1,44 @@
1
+ import { Confetti, Tags } from '@transferwise/icons';
2
+ import { Sentiment } from '../../common';
3
+ import StatusIcon from '../../statusIcon';
4
+ import { clsx } from 'clsx';
5
+ import { LinkProps } from '../../link';
6
+ import Body from '../../body';
7
+
8
+ export type ListItemPromptProps = {
9
+ type:
10
+ | `${Sentiment.POSITIVE | Sentiment.NEGATIVE | Sentiment.NEUTRAL | Sentiment.WARNING}`
11
+ | 'discount'
12
+ | 'savings';
13
+ children: React.ReactNode;
14
+ action?: Pick<LinkProps, 'href' | 'target' | 'onClick'> & { 'aria-label'?: string };
15
+ };
16
+
17
+ export const Prompt = ({ type, children, action }: ListItemPromptProps) => {
18
+ const Wrapper = action?.href ? 'a' : action?.onClick ? 'button' : 'span';
19
+
20
+ const icon =
21
+ type === 'discount' ? (
22
+ <Tags size={16} />
23
+ ) : type === 'savings' ? (
24
+ <Confetti size={16} />
25
+ ) : (
26
+ <StatusIcon size={16} sentiment={type} />
27
+ );
28
+
29
+ return (
30
+ <Wrapper
31
+ className={clsx(
32
+ 'wds-list-item-prompt',
33
+ type,
34
+ (action?.href || action?.onClick) && 'np-prompt-interactive',
35
+ )}
36
+ {...(action ?? {})}
37
+ >
38
+ <div className="np-prompt-icon">{icon}</div>
39
+ <Body>{children}</Body>
40
+ </Wrapper>
41
+ );
42
+ };
43
+
44
+ export default Prompt;
@@ -0,0 +1,23 @@
1
+ import { useContext, useEffect } from 'react';
2
+ import {
3
+ ListItemContext,
4
+ ListItemContextData,
5
+ ListItemControlProps,
6
+ ListItemTypes,
7
+ } from './ListItem';
8
+
9
+ export function useItemControl(controlType: ListItemTypes, controlProps?: ListItemControlProps) {
10
+ const {
11
+ setControlType,
12
+ setControlProps,
13
+ props: baseItemProps,
14
+ } = useContext<ListItemContextData>(ListItemContext);
15
+
16
+ useEffect(() => {
17
+ setControlType(controlType);
18
+ // @ts-expect-error TODO: fix the type error later
19
+ setControlProps(controlProps);
20
+ }, [controlType, controlProps, setControlType, setControlProps]);
21
+
22
+ return { baseItemProps };
23
+ }
package/src/main.css CHANGED
@@ -2662,6 +2662,218 @@ html:not([dir="rtl"]) .np-flow-navigation--sm .np-flow-navigation__stepper {
2662
2662
  border-radius: 9999px !important;
2663
2663
  border-radius: var(--radius-full) !important;
2664
2664
  }
2665
+ .wds-list-item {
2666
+ list-style: none;
2667
+ width: 100%;
2668
+ padding: 0;
2669
+ border-radius: 16px;
2670
+ border-radius: var(--radius-medium);
2671
+ background-color: #ffffff;
2672
+ background-color: var(--color-background-screen);
2673
+ gap: 16px;
2674
+ gap: var(--size-16);
2675
+ }
2676
+ .wds-list-item .partially-interactive {
2677
+ padding: 16px;
2678
+ padding: var(--size-16);
2679
+ }
2680
+ .wds-list-item label,
2681
+ .wds-list-item a {
2682
+ padding: 16px;
2683
+ padding: var(--size-16);
2684
+ }
2685
+ .wds-list-item-interactive label {
2686
+ cursor: pointer;
2687
+ }
2688
+ .wds-list-item-interactive:hover {
2689
+ background-color: var(--color-background-screen-hover);
2690
+ }
2691
+ .wds-list-item-interactive:hover .wds-list-item-control .wds-Button {
2692
+ background-color: var(--Button-background-hover);
2693
+ color: var(--Button-color-hover);
2694
+ transition: none;
2695
+ }
2696
+ .wds-list-item-interactive:active {
2697
+ background-color: var(--color-background-screen-active);
2698
+ }
2699
+ .wds-list-item-interactive .wds-list-item-control .wds-Button {
2700
+ transition: none;
2701
+ }
2702
+ .wds-list-item-media-image {
2703
+ width: var(--item-media-image-size);
2704
+ height: var(--item-media-image-size);
2705
+ }
2706
+ .wds-list-item-body {
2707
+ width: 100%;
2708
+ }
2709
+ .wds-list-item-title {
2710
+ color: #37517e;
2711
+ color: var(--color-content-primary);
2712
+ }
2713
+ .wds-list-item-additional-info {
2714
+ color: #768e9c;
2715
+ color: var(--color-content-tertiary);
2716
+ }
2717
+ .wds-list-item-value {
2718
+ flex: 0 0 auto;
2719
+ }
2720
+ .wds-list-item-control {
2721
+ flex: 0 0 auto;
2722
+ }
2723
+ .wds-list-item-navigation,
2724
+ .wds-list-item-navigation:hover,
2725
+ .wds-list-item-navigation:focus {
2726
+ -webkit-text-decoration: none;
2727
+ text-decoration: none;
2728
+ }
2729
+ .wds-list-item-spotlight-active {
2730
+ background-color: rgba(134,167,189,0.10196);
2731
+ background-color: var(--color-background-neutral);
2732
+ }
2733
+ .wds-list-item-spotlight-active:not(.disabled):not(:disabled):hover {
2734
+ background-color: var(--color-background-neutral-hover);
2735
+ }
2736
+ .wds-list-item-spotlight-active:not(.disabled):not(:disabled):active {
2737
+ background-color: var(--color-background-neutral-active);
2738
+ }
2739
+ .wds-list-item-spotlight-inactive {
2740
+ background-color: rgba(134, 167, 189, 0.025);
2741
+ border: 1px dashed rgba(0,0,0,0.10196);
2742
+ border: 1px dashed var(--color-border-neutral);
2743
+ }
2744
+ @supports (color: color-mix(in lch, red, blue)) {
2745
+ .wds-list-item-spotlight-inactive {
2746
+ background-color: color-mix(in srgb, var(--color-background-neutral) 25%, transparent);
2747
+ }
2748
+ }
2749
+ .wds-list-item-spotlight-inactive:not(.disabled):not(:disabled):hover {
2750
+ background-color: color-mix(in srgb, var(--color-background-neutral-hover) 25%, transparent);
2751
+ }
2752
+ .wds-list-item-spotlight-inactive:not(.disabled):not(:disabled):active {
2753
+ background-color: color-mix(in srgb, var(--color-background-neutral-active) 25%, transparent);
2754
+ }
2755
+ .wds-list-item-prompt {
2756
+ display: inline-flex;
2757
+ padding-top: calc(8px / 2);
2758
+ padding-top: calc(var(--padding-x-small) / 2);
2759
+ padding-bottom: calc(8px / 2);
2760
+ padding-bottom: calc(var(--padding-x-small) / 2);
2761
+ padding-left: calc(8px - 1px);
2762
+ padding-left: calc(var(--padding-x-small) - 1px);
2763
+ padding-right: 8px;
2764
+ padding-right: var(--padding-x-small);
2765
+ border-radius: 10px;
2766
+ border-radius: var(--radius-small);
2767
+ word-break: break-word;
2768
+ word-wrap: break-word;
2769
+ }
2770
+ .wds-list-item-prompt .np-prompt-icon {
2771
+ padding-right: calc(12px / 2);
2772
+ padding-right: calc(var(--size-12) / 2);
2773
+ padding-top: calc(4px - 1px);
2774
+ padding-top: calc(var(--size-4) - 1px);
2775
+ padding-bottom: calc(4px - 1px);
2776
+ padding-bottom: calc(var(--size-4) - 1px);
2777
+ }
2778
+ .wds-list-item-prompt .np-prompt-icon .tw-icon-tags,
2779
+ .wds-list-item-prompt .np-prompt-icon .tw-icon-confetti {
2780
+ color: var(--color-sentiment-positive-primary);
2781
+ }
2782
+ .wds-list-item-prompt a {
2783
+ text-underline-offset: calc(4px / 2);
2784
+ text-underline-offset: calc(var(--size-4) / 2);
2785
+ }
2786
+ .wds-list-item-prompt.np-prompt-interactive {
2787
+ -webkit-text-decoration: none;
2788
+ text-decoration: none;
2789
+ cursor: pointer;
2790
+ border: none;
2791
+ }
2792
+ .wds-list-item-prompt.negative {
2793
+ background-color: var(--color-sentiment-negative-secondary);
2794
+ color: var(--color-sentiment-negative-primary);
2795
+ }
2796
+ .wds-list-item-prompt.negative a {
2797
+ color: var(--color-sentiment-negative-primary);
2798
+ }
2799
+ .wds-list-item-prompt.negative a:hover {
2800
+ color: var(--color-sentiment-negative-primary-hover);
2801
+ }
2802
+ .wds-list-item-prompt.negative a:active {
2803
+ color: var(--color-sentiment-negative-primary-active);
2804
+ }
2805
+ .np-prompt-interactive.wds-list-item-prompt.negative:hover {
2806
+ background-color: color-mix(in srgb, var(--color-sentiment-negative-secondary) 95%, var(--color-sentiment-negative-primary));
2807
+ }
2808
+ .np-prompt-interactive.wds-list-item-prompt.negative:active {
2809
+ background-color: color-mix(in srgb, var(--color-sentiment-negative-secondary) 90%, var(--color-sentiment-negative-primary));
2810
+ }
2811
+ .wds-list-item-prompt.positive,
2812
+ .wds-list-item-prompt.discount,
2813
+ .wds-list-item-prompt.savings {
2814
+ background-color: var(--color-sentiment-positive-secondary);
2815
+ color: var(--color-sentiment-positive-primary);
2816
+ }
2817
+ .wds-list-item-prompt.positive a,
2818
+ .wds-list-item-prompt.discount a,
2819
+ .wds-list-item-prompt.savings a {
2820
+ color: var(--color-sentiment-positive-primary);
2821
+ }
2822
+ .wds-list-item-prompt.positive a:hover,
2823
+ .wds-list-item-prompt.discount a:hover,
2824
+ .wds-list-item-prompt.savings a:hover {
2825
+ color: var(--color-sentiment-positive-primary-hover);
2826
+ }
2827
+ .wds-list-item-prompt.positive a:active,
2828
+ .wds-list-item-prompt.discount a:active,
2829
+ .wds-list-item-prompt.savings a:active {
2830
+ color: var(--color-sentiment-positive-primary-active);
2831
+ }
2832
+ .np-prompt-interactive.wds-list-item-prompt.positive:hover,
2833
+ .np-prompt-interactive.wds-list-item-prompt.discount:hover,
2834
+ .np-prompt-interactive.wds-list-item-prompt.savings:hover {
2835
+ background-color: color-mix(in srgb, var(--color-sentiment-positive-secondary) 95%, var(--color-sentiment-positive-primary));
2836
+ }
2837
+ .np-prompt-interactive.wds-list-item-prompt.positive:active,
2838
+ .np-prompt-interactive.wds-list-item-prompt.discount:active,
2839
+ .np-prompt-interactive.wds-list-item-prompt.savings:active {
2840
+ background-color: color-mix(in srgb, var(--color-sentiment-positive-secondary) 90%, var(--color-sentiment-positive-primary));
2841
+ }
2842
+ .wds-list-item-prompt.neutral {
2843
+ background-color: rgba(134,167,189,0.10196);
2844
+ background-color: var(--color-background-neutral);
2845
+ color: #37517e;
2846
+ color: var(--color-content-primary);
2847
+ }
2848
+ .wds-list-item-prompt.neutral a {
2849
+ color: #37517e;
2850
+ color: var(--color-content-primary);
2851
+ }
2852
+ .np-prompt-interactive.wds-list-item-prompt.neutral:hover {
2853
+ background-color: var(--color-background-neutral-hover);
2854
+ }
2855
+ .np-prompt-interactive.wds-list-item-prompt.neutral:active {
2856
+ background-color: var(--color-background-neutral-active);
2857
+ }
2858
+ .wds-list-item-prompt.warning {
2859
+ background-color: var(--color-sentiment-warning-secondary);
2860
+ color: var(--color-sentiment-warning-content);
2861
+ }
2862
+ .wds-list-item-prompt.warning a {
2863
+ color: var(--color-sentiment-warning-content);
2864
+ }
2865
+ .wds-list-item-prompt.warning a:hover {
2866
+ color: var(--color-sentiment-warning-content-hover);
2867
+ }
2868
+ .wds-list-item-prompt.warning a:active {
2869
+ color: var(--color-sentiment-warning-content-active);
2870
+ }
2871
+ .np-prompt-interactive.wds-list-item-prompt.warning:hover {
2872
+ background-color: color-mix(in srgb, var(--color-sentiment-warning-secondary) 90%, var(--color-sentiment-warning-primary));
2873
+ }
2874
+ .np-prompt-interactive.wds-list-item-prompt.warning:active {
2875
+ background-color: color-mix(in srgb, var(--color-sentiment-warning-secondary) 80%, var(--color-sentiment-warning-primary));
2876
+ }
2665
2877
  .np-field-control {
2666
2878
  margin-top: 4px;
2667
2879
  margin-top: var(--size-4);
package/src/main.less CHANGED
@@ -39,6 +39,7 @@
39
39
  @import "./image/Image.less";
40
40
  @import "./info/Info.less";
41
41
  @import "./inputs/Input.less";
42
+ @import "./listItem/ListItem.less";
42
43
  @import "./field/Field.less";
43
44
  @import "./inputs/InputGroup.less";
44
45
  @import "./inputs/SelectInput.less";
@@ -23,7 +23,6 @@ exports[`PromoCard matches snapshot 1`] = `
23
23
  <img
24
24
  alt="Test Image"
25
25
  class="tw-image tw-image__stretch tw-image__shrink"
26
- loading="lazy"
27
26
  src="test.jpg"
28
27
  />
29
28
  </div>
@@ -33,7 +33,6 @@ exports[`PromoCardGroup matches snapshot 1`] = `
33
33
  <img
34
34
  alt=""
35
35
  class="tw-image tw-image__stretch tw-image__shrink"
36
- loading="lazy"
37
36
  src="https://via.placeholder.com/150"
38
37
  />
39
38
  </div>
@@ -68,7 +67,6 @@ exports[`PromoCardGroup matches snapshot 1`] = `
68
67
  <img
69
68
  alt=""
70
69
  class="tw-image tw-image__stretch tw-image__shrink"
71
- loading="lazy"
72
70
  src="https://via.placeholder.com/150"
73
71
  />
74
72
  </div>
@@ -0,0 +1,84 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Artwork" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
+ width="165.52107px" height="105.9651px" viewBox="0 0 165.52107 105.9651" enable-background="new 0 0 165.52107 105.9651"
5
+ xml:space="preserve">
6
+ <g>
7
+ <path id="XMLID_4_" d="M150.69807,0H14.82318c-0.5659,0-1.1328,0-1.69769,0.0033c-0.47751,0.0034-0.95391,0.0087-1.43031,0.0217
8
+ c-1.039,0.0281-2.0869,0.0894-3.1129,0.2738c-1.0424,0.1876-2.0124,0.4936-2.9587,0.9754
9
+ c-0.9303,0.4731-1.782,1.0919-2.52009,1.8303c-0.73841,0.7384-1.35721,1.5887-1.83021,2.52
10
+ c-0.4819,0.9463-0.7881,1.9166-0.9744,2.9598c-0.18539,1.0263-0.2471,2.074-0.2751,3.1119
11
+ c-0.0128,0.4764-0.01829,0.9528-0.0214,1.4291c-0.0033,0.5661-0.0022,1.1318-0.0022,1.6989V91.142
12
+ c0,0.5671-0.0011,1.13181,0.0022,1.69901c0.00311,0.4763,0.0086,0.9527,0.0214,1.4291
13
+ c0.028,1.03699,0.08971,2.08469,0.2751,3.11069c0.1863,1.0436,0.4925,2.0135,0.9744,2.9599
14
+ c0.473,0.9313,1.0918,1.7827,1.83021,2.52c0.73809,0.7396,1.58979,1.3583,2.52009,1.8302
15
+ c0.9463,0.4831,1.9163,0.7892,2.9587,0.9767c1.026,0.1832,2.0739,0.2456,3.1129,0.2737c0.4764,0.0108,0.9528,0.0172,1.43031,0.0194
16
+ c0.56489,0.0044,1.13179,0.0044,1.69769,0.0044h135.87489c0.5649,0,1.13181,0,1.69659-0.0044
17
+ c0.47641-0.0022,0.95282-0.0086,1.4314-0.0194c1.0368-0.0281,2.0845-0.0905,3.11301-0.2737
18
+ c1.041-0.1875,2.0112-0.4936,2.9576-0.9767c0.9313-0.4719,1.7805-1.0906,2.52011-1.8302c0.7372-0.7373,1.35599-1.5887,1.8302-2.52
19
+ c0.48299-0.9464,0.78889-1.9163,0.97429-2.9599c0.1855-1.026,0.2457-2.0737,0.2738-3.11069
20
+ c0.013-0.4764,0.01941-0.9528,0.02161-1.4291c0.00439-0.5672,0.00439-1.1319,0.00439-1.69901V14.8242
21
+ c0-0.5671,0-1.1328-0.00439-1.6989c-0.0022-0.4763-0.00861-0.9527-0.02161-1.4291c-0.02811-1.0379-0.0883-2.0856-0.2738-3.1119
22
+ c-0.18539-1.0432-0.4913-2.0135-0.97429-2.9598c-0.47421-0.9313-1.093-1.7816-1.8302-2.52
23
+ c-0.73961-0.7384-1.58881-1.3572-2.52011-1.8303c-0.9464-0.4818-1.9166-0.7878-2.9576-0.9754
24
+ c-1.0285-0.1844-2.0762-0.2457-3.11301-0.2738c-0.47858-0.013-0.95499-0.0183-1.4314-0.0217C151.82988,0,151.26297,0,150.69807,0
25
+ L150.69807,0z"/>
26
+ <path id="XMLID_3_" fill="#FFFFFF" d="M150.69807,3.532l1.67149,0.0032c0.4528,0.0032,0.90561,0.0081,1.36092,0.0205
27
+ c0.79201,0.0214,1.71849,0.0643,2.58209,0.2191c0.7507,0.1352,1.38029,0.3408,1.9845,0.6484
28
+ c0.5965,0.3031,1.14301,0.7003,1.62019,1.1768c0.479,0.4797,0.87671,1.0271,1.18381,1.6302
29
+ c0.30589,0.5995,0.51019,1.2261,0.64459,1.9823c0.1544,0.8542,0.1971,1.7832,0.21881,2.5801
30
+ c0.01219,0.4498,0.01819,0.8996,0.0204,1.3601c0.00429,0.5569,0.0042,1.1135,0.0042,1.6715V91.142
31
+ c0,0.558,0.00009,1.1136-0.0043,1.6824c-0.00211,0.4497-0.0081,0.8995-0.0204,1.3501c-0.02161,0.7957-0.0643,1.7242-0.2206,2.5885
32
+ c-0.13251,0.7458-0.3367,1.3725-0.64429,1.975c-0.30621,0.6016-0.70331,1.1484-1.18022,1.6251
33
+ c-0.47989,0.48-1.0246,0.876-1.62819,1.1819c-0.5997,0.3061-1.22821,0.51151-1.97151,0.6453
34
+ c-0.88109,0.157-1.84639,0.2002-2.57339,0.2199c-0.4574,0.0103-0.9126,0.01649-1.37889,0.0187
35
+ c-0.55571,0.0043-1.1134,0.0042-1.6692,0.0042H14.82318c-0.0074,0-0.0146,0-0.0221,0c-0.5494,0-1.0999,0-1.6593-0.0043
36
+ c-0.4561-0.00211-0.9112-0.0082-1.3512-0.0182c-0.7436-0.0201-1.7095-0.0632-2.5834-0.2193
37
+ c-0.74969-0.1348-1.3782-0.3402-1.9858-0.6503c-0.59789-0.3032-1.1422-0.6988-1.6223-1.1797
38
+ c-0.4764-0.4756-0.8723-1.0207-1.1784-1.6232c-0.3064-0.6019-0.5114-1.2305-0.64619-1.9852
39
+ c-0.15581-0.8626-0.19861-1.7874-0.22-2.5777c-0.01221-0.4525-0.01731-0.9049-0.02021-1.3547l-0.0022-1.3279l0.0001-0.3506V14.8242
40
+ l-0.0001-0.3506l0.0021-1.3251c0.003-0.4525,0.0081-0.9049,0.02031-1.357c0.02139-0.7911,0.06419-1.7163,0.22129-2.5861
41
+ c0.1336-0.7479,0.3385-1.3765,0.6465-1.9814c0.3037-0.5979,0.7003-1.1437,1.17921-1.6225
42
+ c0.477-0.4772,1.02309-0.8739,1.62479-1.1799c0.6011-0.3061,1.2308-0.5116,1.9805-0.6465c0.8638-0.1552,1.7909-0.198,2.5849-0.2195
43
+ c0.4526-0.0123,0.9052-0.0172,1.3544-0.0203l1.6771-0.0033H150.69807"/>
44
+ <g>
45
+ <g>
46
+ <path d="M45.1862,35.64053c1.41724-1.77266,2.37897-4.15282,2.12532-6.58506c-2.07464,0.10316-4.60634,1.36871-6.07207,3.14276
47
+ c-1.31607,1.5192-2.4809,3.99902-2.17723,6.3293C41.39111,38.72954,43.71785,37.36345,45.1862,35.64053"/>
48
+ <path d="M47.28506,38.98252c-3.38211-0.20146-6.25773,1.91951-7.87286,1.91951c-1.61602,0-4.08931-1.81799-6.76438-1.76899
49
+ c-3.48177,0.05114-6.71245,2.01976-8.4793,5.15079c-3.63411,6.2636-0.95904,15.55471,2.57494,20.65606
50
+ c1.71618,2.5238,3.78447,5.30269,6.50976,5.20287c2.57494-0.10104,3.58421-1.66732,6.71416-1.66732
51
+ c3.12765,0,4.03679,1.66732,6.76252,1.61681c2.82665-0.05054,4.59381-2.52506,6.30997-5.05132
52
+ c1.96878-2.877,2.77473-5.65498,2.82542-5.80748c-0.0507-0.05051-5.45058-2.12204-5.50065-8.33358
53
+ c-0.05098-5.20101,4.23951-7.6749,4.44144-7.82832C52.3832,39.4881,48.5975,39.08404,47.28506,38.98252"/>
54
+ </g>
55
+ <g>
56
+ <path d="M76.73385,31.94381c7.35096,0,12.4697,5.06708,12.4697,12.44437c0,7.40363-5.22407,12.49704-12.65403,12.49704h-8.13892
57
+ v12.94318h-5.88037v-37.8846H76.73385z M68.41059,51.9493h6.74732c5.11975,0,8.0336-2.75636,8.0336-7.53479
58
+ c0-4.77792-2.91385-7.50845-8.00727-7.50845h-6.77365V51.9493z"/>
59
+ <path d="M90.73997,61.97864c0-4.8311,3.70182-7.79761,10.26583-8.16526l7.56061-0.44614v-2.12639
60
+ c0-3.07185-2.07423-4.90959-5.53905-4.90959c-3.28251,0-5.33041,1.57492-5.82871,4.04313h-5.35574
61
+ c0.31499-4.98859,4.56777-8.66407,11.3941-8.66407c6.69466,0,10.97377,3.54432,10.97377,9.08388v19.03421h-5.43472v-4.54194
62
+ h-0.13065c-1.60125,3.07185-5.09341,5.01441-8.71623,5.01441C94.52078,70.30088,90.73997,66.94038,90.73997,61.97864z
63
+ M108.56641,59.4846v-2.17905l-6.8,0.41981c-3.38683,0.23649-5.30306,1.73291-5.30306,4.09579
64
+ c0,2.41504,1.99523,3.99046,5.04075,3.99046C105.46823,65.81161,108.56641,63.08108,108.56641,59.4846z"/>
65
+ <path d="M119.34167,79.9889v-4.5946c0.4193,0.10483,1.36425,0.10483,1.83723,0.10483c2.6252,0,4.04313-1.10245,4.90908-3.9378
66
+ c0-0.05267,0.49931-1.68025,0.49931-1.70658l-9.97616-27.64562h6.14268l6.98432,22.47371h0.10432l6.98433-22.47371h5.9857
67
+ l-10.34483,29.06304c-2.36186,6.69517-5.0924,8.84789-10.81577,8.84789C121.17891,80.12006,119.76098,80.06739,119.34167,79.9889
68
+ z"/>
69
+ </g>
70
+ </g>
71
+ </g>
72
+ <g>
73
+ </g>
74
+ <g>
75
+ </g>
76
+ <g>
77
+ </g>
78
+ <g>
79
+ </g>
80
+ <g>
81
+ </g>
82
+ <g>
83
+ </g>
84
+ </svg>
@@ -1,6 +1,11 @@
1
+ export const lorem5 = 'Lorem ipsum dolor sit amet.';
2
+
1
3
  export const lorem10 =
2
4
  'Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iste, architecto?';
3
5
 
6
+ export const lorem20 =
7
+ 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum non explicabo doloribus rerum saepe ut beatae adipisci rem vero optio.';
8
+
4
9
  export const lorem40 =
5
10
  'Lorem ipsum dolor sit amet consectetur, adipisicing elit. Illo esse quod et iure deserunt facilis similique voluptatem reprehenderit mollitia inventore, ab voluptate dignissimos autem repellat accusamus perferendis sed pariatur tempore possimus ipsam praesentium ipsum? Nesciunt cumque repellendus impedit aliquam! Error?';
6
11
 
@@ -328,9 +328,7 @@ const UploadInput = ({
328
328
  | { ref: HTMLDivElement | UploadItemRef; target: 'button' | 'link' }
329
329
  | null;
330
330
 
331
- const [nextFocusable, setNextFocusable] = useState<NextFocusable>(
332
- uploadInputRef.current,
333
- );
331
+ const [nextFocusable, setNextFocusable] = useState<NextFocusable>(uploadInputRef.current);
334
332
 
335
333
  const handleFocus = (fileId: string | number) => {
336
334
  fileRefs = fileRefs.filter((ref) => {
@@ -363,7 +361,7 @@ const UploadInput = ({
363
361
  // If next is an UploadItemRef, check if it has a URL (succeeded)
364
362
  if (next && 'status' in next) {
365
363
  // Find the file object for this ref
366
- const fileObj = uploadedFiles.find(f => f.id === next?.id);
364
+ const fileObj = uploadedFiles.find((f) => f.id === next?.id);
367
365
  if (
368
366
  fileObj &&
369
367
  (fileObj.status === Status.SUCCEEDED || fileObj.status === Status.DONE) &&
@@ -404,19 +402,12 @@ const UploadInput = ({
404
402
  typeof focusTarget.ref.focus === 'function'
405
403
  ) {
406
404
  setTimeout(() => {
407
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
408
- if (
409
- focusTarget.ref &&
410
- typeof (focusTarget.ref as UploadItemRef).focus === 'function'
411
- ) {
405
+ if (focusTarget.ref && typeof (focusTarget.ref as UploadItemRef).focus === 'function') {
412
406
  // @ts-expect-error: focus may not exist on all possible ref types, but is safe here
413
407
  (focusTarget.ref as UploadItemRef).focus(focusTarget.target);
414
408
  }
415
409
  }, 0);
416
- } else if (
417
- focusTarget &&
418
- typeof (focusTarget as UploadItemRef).focus === 'function'
419
- ) {
410
+ } else if (focusTarget && typeof (focusTarget as UploadItemRef).focus === 'function') {
420
411
  setTimeout(() => {
421
412
  (focusTarget as UploadItemRef).focus();
422
413
  }, 0);