@transferwise/components 0.0.0-experimental-7f34f59 → 0.0.0-experimental-d1c5355

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 (39) hide show
  1. package/build/i18n/tr.json +1 -1
  2. package/build/i18n/tr.json.js +1 -1
  3. package/build/i18n/tr.json.mjs +1 -1
  4. package/build/main.css +162 -215
  5. package/build/styles/main.css +162 -215
  6. package/build/styles/uploadInput/UploadInput.css +33 -84
  7. package/build/styles/uploadInput/uploadButton/UploadButton.css +62 -31
  8. package/build/styles/uploadInput/uploadItem/UploadItem.css +76 -109
  9. package/build/types/uploadInput/UploadInput.d.ts.map +1 -1
  10. package/build/types/uploadInput/uploadButton/UploadButton.d.ts.map +1 -1
  11. package/build/uploadInput/UploadInput.js +24 -16
  12. package/build/uploadInput/UploadInput.js.map +1 -1
  13. package/build/uploadInput/UploadInput.mjs +24 -16
  14. package/build/uploadInput/UploadInput.mjs.map +1 -1
  15. package/build/uploadInput/uploadButton/UploadButton.js +23 -31
  16. package/build/uploadInput/uploadButton/UploadButton.js.map +1 -1
  17. package/build/uploadInput/uploadButton/UploadButton.mjs +23 -31
  18. package/build/uploadInput/uploadButton/UploadButton.mjs.map +1 -1
  19. package/build/uploadInput/uploadItem/UploadItem.js +31 -38
  20. package/build/uploadInput/uploadItem/UploadItem.js.map +1 -1
  21. package/build/uploadInput/uploadItem/UploadItem.mjs +32 -39
  22. package/build/uploadInput/uploadItem/UploadItem.mjs.map +1 -1
  23. package/build/uploadInput/uploadItem/UploadItemLink.js +2 -1
  24. package/build/uploadInput/uploadItem/UploadItemLink.js.map +1 -1
  25. package/build/uploadInput/uploadItem/UploadItemLink.mjs +2 -1
  26. package/build/uploadInput/uploadItem/UploadItemLink.mjs.map +1 -1
  27. package/package.json +3 -3
  28. package/src/i18n/tr.json +1 -1
  29. package/src/main.css +162 -215
  30. package/src/uploadInput/UploadInput.css +33 -84
  31. package/src/uploadInput/UploadInput.less +25 -75
  32. package/src/uploadInput/UploadInput.tsx +32 -28
  33. package/src/uploadInput/uploadButton/UploadButton.css +62 -31
  34. package/src/uploadInput/uploadButton/UploadButton.less +61 -38
  35. package/src/uploadInput/uploadButton/UploadButton.tsx +22 -25
  36. package/src/uploadInput/uploadItem/UploadItem.css +76 -109
  37. package/src/uploadInput/uploadItem/UploadItem.less +77 -127
  38. package/src/uploadInput/uploadItem/UploadItem.tsx +28 -28
  39. package/src/uploadInput/uploadItem/UploadItemLink.tsx +3 -3
@@ -1,11 +1,32 @@
1
- .np-upload-item {
2
- border: 1px solid #c9cbce;
3
- border: 1px solid var(--color-interactive-secondary);
1
+ .np-upload-input__item {
4
2
  position: relative;
3
+ padding: 16px;
4
+ padding: var(--size-16);
5
+ display: flex;
6
+ align-items: flex-start;
7
+ }
8
+ .np-upload-input__item .np-upload-input__item-content {
9
+ padding-top: 2px;
10
+ flex: 1;
11
+ }
12
+ .np-upload-input__item .np-upload-input__title,
13
+ .np-upload-input__item .np-upload-input__text {
14
+ margin: 0;
15
+ -moz-text-align-last: left;
16
+ text-align-last: left;
17
+ color: #5d7079;
18
+ color: var(--color-content-secondary);
5
19
  }
6
- .np-upload-item:first-child ~ div:not(.np-upload-item--link):before,
7
- .np-upload-item:not(:first-child).np-upload-item--link .np-upload-item__link:before,
8
- .np-upload-item.np-upload-item--link:hover .np-upload-item__link:after {
20
+ .np-upload-input__item .np-upload-input__title + .np-upload-input__text {
21
+ margin-top: 4px;
22
+ margin-top: var(--size-4);
23
+ line-height: 22px;
24
+ }
25
+ .np-upload-input__item .np-upload-input__icon {
26
+ padding-right: 16px;
27
+ padding-right: var(--size-16);
28
+ }
29
+ .np-upload-input__item:not(:first-child)::before {
9
30
  display: block;
10
31
  position: absolute;
11
32
  height: 1px;
@@ -16,129 +37,75 @@
16
37
  left: var(--size-16);
17
38
  width: calc(100% - 2 * 16px);
18
39
  width: calc(100% - 2 * var(--size-16));
19
- }
20
- .np-upload-item:first-child ~ div:not(.np-upload-item--link):before,
21
- .np-upload-item:not(:first-child).np-upload-item--link .np-upload-item__link:before {
22
40
  top: 0;
23
41
  }
24
- .np-upload-item.np-upload-item--link:hover .np-upload-item__link:after {
25
- bottom: -1px;
26
- }
27
- .np-upload-item:first-child ~ div {
28
- border-top: 1px;
29
- }
30
- .np-upload-item:not(:first-child) .np-upload-item__link:hover {
31
- border-top-color: rgba(0,0,0,0.10196);
32
- border-top-color: var(--color-border-neutral);
33
- }
34
- .np-upload-item:not(:last-child) {
35
- border-bottom: 0;
36
- }
37
- .np-upload-item.np-upload-item--link:hover + .np-upload-item:before,
38
- .np-upload-item.np-upload-item--link:hover + .np-upload-button-container:before,
39
- .np-upload-item.np-upload-item--link:hover + .np-upload-item .np-upload-item__link:before,
40
- .np-upload-item.np-upload-item--link:hover + .np-upload-button-container .np-upload-item__link:before {
41
- display: none;
42
- }
43
- .np-upload-button-container:hover:before,
44
- .np-upload-button-container.droppable-dropping:before {
45
- left: 0 !important;
46
- width: 100% !important;
47
- }
48
- .np-upload-button-container:has(:focus-visible) {
49
- outline: var(--ring-outline-color) solid var(--ring-outline-width);
50
- outline-offset: var(--ring-outline-offset);
51
- border-color: transparent;
52
- outline-offset: -3px;
53
- }
54
- .np-upload-item--single-file:focus-visible,
55
- .np-upload-item__link:focus-visible,
56
- .np-upload-button-container:has(:focus-visible) {
57
- outline-width: 3px;
58
- }
59
- .np-upload-item--link a {
60
- flex: 1;
61
- -webkit-text-decoration: none;
62
- text-decoration: none;
63
- border-top: 1px solid transparent;
64
- border-radius: inherit;
65
- }
66
- .np-upload-item--link a:focus-visible {
67
- outline-offset: -2px;
68
- }
69
- .np-upload-item--link a:hover:before {
70
- display: none !important;
71
- }
72
- .np-upload-item--link a:hover:after {
73
- left: 0 !important;
74
- width: 100% !important;
75
- }
76
- .np-upload-item--link a:hover,
77
- .np-upload-item--link a:active {
78
- -webkit-text-decoration: none;
79
- text-decoration: none;
80
- }
81
- .np-upload-item--link a:hover .np-upload-button,
82
- .np-upload-item--link a:active .np-upload-button {
83
- background-color: rgba(134,167,189,0.10196);
84
- background-color: var(--color-background-neutral);
85
- border-radius: inherit;
86
- }
87
- .np-upload-item--link:first-of-type a {
88
- border-top: 0;
89
- }
90
- .np-upload-item__body {
42
+ .np-upload-input__item .np-upload-input__item-link,
43
+ .np-upload-input__item .np-upload-input__item-container {
44
+ align-items: flex-start;
91
45
  display: flex;
92
- align-items: center;
93
- justify-content: space-between;
94
- position: relative;
95
- border-radius: inherit;
46
+ width: 100%;
96
47
  }
97
- .np-upload-item__remove-button {
98
- display: flex;
99
- align-items: center;
100
- justify-content: center;
101
- align-self: flex-start;
48
+ .np-upload-input__item .np-upload-input__item-action {
102
49
  position: absolute;
50
+ top: 18px;
51
+ right: 16px;
52
+ right: var(--size-16);
53
+ }
54
+ .np-upload-input__item .np-upload-input__item-action .np-upload-input__item-button {
55
+ -webkit-appearance: none;
56
+ -moz-appearance: none;
57
+ appearance: none;
103
58
  height: 24px;
104
59
  height: var(--size-24);
105
- min-height: 0;
106
60
  width: 24px;
107
61
  width: var(--size-24);
108
- padding: 0;
109
- border-radius: 50% !important;
110
- outline-offset: 0 !important;
62
+ padding: 0 4px;
63
+ padding: 0 var(--size-4);
64
+ border-radius: 50%;
65
+ border: 0;
111
66
  background-color: rgba(134,167,189,0.10196);
112
67
  background-color: var(--color-background-neutral);
113
- border: none;
114
68
  color: var(--color-interactive-primary);
115
- right: 16px;
116
- right: var(--size-16);
117
- top: 16px;
118
- top: var(--size-16);
119
69
  transition: color, background-color 0.15s ease-in-out;
120
70
  }
121
71
  @media (max-width: 320px) {
122
- .np-upload-item__remove-button {
123
- top: 16px;
124
- top: var(--size-16);
125
- right: 16px;
126
- right: var(--size-16);
72
+ .np-upload-input__item .np-upload-input__item-action .np-upload-input__item-button {
127
73
  height: 48px;
128
74
  height: var(--size-48);
129
75
  width: 48px;
130
76
  width: var(--size-48);
131
77
  }
132
78
  }
133
- .np-upload-item__remove-button:hover {
134
- background-color: var(--color-sentiment-negative);
135
- color: var(--color-contrast-overlay) !important;
79
+ .np-upload-input__item .np-upload-input__item-action .np-upload-input__item-button:hover {
80
+ background-color: var(--color-background-neutral-hover);
136
81
  }
137
- .np-upload-item__remove-button:before {
138
- display: block;
139
- width: 44px;
140
- height: 44px;
141
- content: '';
142
- border-radius: 50%;
143
- position: absolute;
82
+ .np-upload-input__item .np-upload-input__item-action .np-upload-input__item-button:active {
83
+ background-color: var(--color-background-neutral-active);
84
+ }
85
+ .np-upload-input__item.is-interactive {
86
+ padding: 0;
87
+ }
88
+ .np-upload-input__item.is-interactive:hover + .np-upload-input__item::before,
89
+ .np-upload-input__item.is-interactive:hover::before {
90
+ width: 100%;
91
+ left: 0;
92
+ }
93
+ .np-upload-input__item.is-interactive:hover + .np-upload-input__item::before {
94
+ top: -1px;
95
+ }
96
+ .np-upload-input__item.is-interactive .np-upload-input__item-link {
97
+ padding: 16px;
98
+ padding: var(--size-16);
99
+ -webkit-text-decoration: none;
100
+ text-decoration: none;
101
+ border-radius: inherit;
102
+ }
103
+ .np-upload-input__item.is-interactive .np-upload-input__item-link:focus-visible {
104
+ outline-offset: -3px;
105
+ outline-width: 3px;
106
+ }
107
+ .np-upload-input__item.is-interactive .np-upload-input__item-link:hover,
108
+ .np-upload-input__item.is-interactive .np-upload-input__item-link:active {
109
+ background: rgba(134,167,189,0.10196);
110
+ background: var(--color-background-neutral);
144
111
  }
@@ -1,13 +1,33 @@
1
1
  @import (reference) "../../../node_modules/@transferwise/neptune-css/src/less/ring.less";
2
2
 
3
- // Be aware of touching styles related to :before/:after pseudo-elements in this file, delimiters between items build by using them
4
- .np-upload-item {
5
- border: 1px solid var(--color-interactive-secondary);
3
+ .np-upload-input__item {
6
4
  position: relative;
5
+ padding: var(--size-16);
6
+ display: flex;
7
+ align-items: flex-start;
8
+
9
+ .np-upload-input__item-content {
10
+ padding-top: 2px;
11
+ flex: 1;
12
+ }
13
+
14
+ .np-upload-input__title,
15
+ .np-upload-input__text {
16
+ margin: 0;
17
+ text-align-last: left;
18
+ color: var(--color-content-secondary);
19
+ }
20
+
21
+ .np-upload-input__title + .np-upload-input__text {
22
+ margin-top: var(--size-4);
23
+ line-height: 22px;
24
+ }
25
+
26
+ .np-upload-input__icon {
27
+ padding-right: var(--size-16);
28
+ }
7
29
 
8
- &:first-child ~ div:not(.np-upload-item--link):before,
9
- &:not(:first-child).np-upload-item--link .np-upload-item__link:before,
10
- &.np-upload-item--link:hover .np-upload-item__link:after {
30
+ &:not(:first-child)::before {
11
31
  display: block;
12
32
  position: absolute;
13
33
  height: 1px;
@@ -15,146 +35,76 @@
15
35
  content: " ";
16
36
  left: var(--size-16);
17
37
  width: calc(100% - 2 * var(--size-16));
18
- }
19
-
20
- &:first-child ~ div:not(.np-upload-item--link):before,
21
- &:not(:first-child).np-upload-item--link .np-upload-item__link:before {
22
38
  top: 0;
23
39
  }
24
40
 
25
- &.np-upload-item--link:hover .np-upload-item__link:after {
26
- bottom: -1px;
27
- }
28
-
29
- &:first-child {
30
- & ~ div {
31
- border-top: 1px;
32
- }
41
+ .np-upload-input__item-link,
42
+ .np-upload-input__item-container {
43
+ align-items: flex-start;
44
+ display: flex;
45
+ width: 100%;
33
46
  }
34
47
 
35
- &:not(:first-child) {
36
- .np-upload-item__link:hover {
37
- border-top-color: var(--color-border-neutral);
38
- }
39
- }
48
+ .np-upload-input__item-action {
49
+ position: absolute;
50
+ top: 18px;
51
+ right: var(--size-16);
40
52
 
41
- &:not(:last-child) {
42
- border-bottom: 0;
43
- }
53
+ .np-upload-input__item-button {
54
+ appearance: none;
55
+ height: var(--size-24);
56
+ width: var(--size-24);
57
+ padding: 0 var(--size-4);
58
+ border-radius: 50%;
59
+ border: 0;
60
+ background-color: var(--color-background-neutral);
61
+ color: var(--color-interactive-primary);
62
+ transition: color, background-color 0.15s ease-in-out;
63
+
64
+ @media (--screen-400-zoom) {
65
+ height: var(--size-48);
66
+ width: var(--size-48);
67
+ }
44
68
 
69
+ &:hover {
70
+ background-color: var(--color-background-neutral-hover);
71
+ }
45
72
 
46
- &.np-upload-item--link:hover + .np-upload-item,
47
- &.np-upload-item--link:hover + .np-upload-button-container {
48
- &:before,
49
- .np-upload-item__link:before {
50
- display: none;
73
+ &:active {
74
+ background-color: var(--color-background-neutral-active);
75
+ }
51
76
  }
52
77
  }
53
- }
54
78
 
55
- .np-upload-button-container {
56
- &:hover:before,
57
- &.droppable-dropping:before {
58
- left: 0 !important;
59
- width: 100% !important;
60
- }
61
-
62
- &:has(:focus-visible) {
63
- .ring();
64
- border-color: transparent;
65
- outline-offset: -3px;
66
- }
67
- }
68
-
69
- .np-upload-item--single-file:focus-visible,
70
- .np-upload-item__link:focus-visible,
71
- .np-upload-button-container:has(:focus-visible) {
72
- outline-width: 3px;
73
- }
74
-
75
- .np-upload-item--link {
76
- a {
77
- flex: 1;
78
- text-decoration: none;
79
- border-top: 1px solid transparent;
80
- border-radius: inherit;
81
-
82
- &:focus-visible {
83
- outline-offset: -2px;
84
- }
79
+ &.is-interactive {
80
+ padding: 0;
85
81
 
86
82
  &:hover {
87
- &:before {
88
- display: none !important;
83
+ + .np-upload-input__item::before,
84
+ &::before {
85
+ width: 100%;
86
+ left: 0;
89
87
  }
90
-
91
- &:after {
92
- left: 0 !important;
93
- width: 100% !important;
88
+
89
+ + .np-upload-input__item::before {
90
+ top: -1px;
94
91
  }
95
92
  }
96
93
 
97
- &:hover,
98
- &:active {
94
+ .np-upload-input__item-link {
95
+ padding: var(--size-16);
99
96
  text-decoration: none;
100
- .np-upload-button {
101
- background-color: var(--color-background-neutral);
102
- border-radius: inherit;
103
- }
104
- }
105
- }
97
+ border-radius: inherit;
106
98
 
107
- &:first-of-type a {
108
- border-top: 0;
109
- }
110
- }
111
-
112
- .np-upload-item__body {
113
- display: flex;
114
- align-items: center;
115
- justify-content: space-between;
116
- // We should have the `relative` position for the body, because we have `absolute` position for `np-upload-item__remove-button` to achieve appropriate `hover` effects
117
- position: relative;
118
- border-radius: inherit;
119
- }
120
-
121
- .np-upload-item__remove-button {
122
- display: flex;
123
- align-items: center;
124
- justify-content: center;
125
- align-self: flex-start;
126
- position: absolute;
127
- height: var(--size-24);
128
- min-height: 0;
129
- width: var(--size-24);
130
- padding: 0;
131
- border-radius: 50% !important;
132
- outline-offset: 0 !important;
133
- background-color: var(--color-background-neutral);
134
- border: none;
135
- color: var(--color-interactive-primary);
136
- right: var(--size-16);
137
- top: var(--size-16);
138
- transition: color, background-color 0.15s ease-in-out;
139
-
140
- @media (--screen-400-zoom) {
141
- top: var(--size-16);
142
- right: var(--size-16);
143
- height: var(--size-48);
144
- width: var(--size-48);
145
- }
146
-
147
- &:hover {
148
- background-color: var(--color-sentiment-negative);
149
- color: var(--color-contrast-overlay) !important;
150
- }
99
+ &:focus-visible {
100
+ outline-offset: -3px;
101
+ outline-width: 3px;
102
+ }
151
103
 
152
- &:before {
153
- display: block;
154
- width: 44px;
155
- height: 44px;
156
- content: '';
157
- border-radius: 50%;
158
- position: absolute;
104
+ &:hover,
105
+ &:active {
106
+ background: var(--color-background-neutral);
107
+ }
108
+ }
159
109
  }
160
110
  }
@@ -85,7 +85,7 @@ const UploadItem = ({
85
85
  }
86
86
 
87
87
  return (
88
- <ul className="np-upload-input-errors m-b-0">
88
+ <ul className="np-upload-input-errors m-b-0 p-l-2">
89
89
  {errors.map((error, index) => {
90
90
  // eslint-disable-next-line react/no-array-index-key
91
91
  return <li key={index}>{getErrorMessage(error)}</li>;
@@ -97,7 +97,7 @@ const UploadItem = ({
97
97
  const getDescription = () => {
98
98
  if (error || errors?.length || status === Status.FAILED) {
99
99
  return (
100
- <Body type={Typography.BODY_DEFAULT_BOLD} className="text-negative">
100
+ <Body type={Typography.BODY_DEFAULT_BOLD} className="np-upload-input__text text-negative">
101
101
  {errors?.length ? getMultipleErrors(errors) : getErrorMessage(error)}
102
102
  </Body>
103
103
  );
@@ -105,14 +105,18 @@ const UploadItem = ({
105
105
 
106
106
  switch (status) {
107
107
  case Status.PENDING:
108
- return <Body type={Typography.BODY_DEFAULT_BOLD}>{formatMessage(MESSAGES.uploading)}</Body>;
108
+ return (
109
+ <Body type={Typography.BODY_DEFAULT} className="np-upload-input__text">
110
+ {formatMessage(MESSAGES.uploading)}
111
+ </Body>
112
+ );
109
113
  case Status.PROCESSING:
110
- return <Body>{formatMessage(MESSAGES.deleting)}</Body>;
114
+ return <Body className="np-upload-input__text">{formatMessage(MESSAGES.deleting)}</Body>;
111
115
  case Status.SUCCEEDED:
112
116
  case Status.DONE:
113
117
  default:
114
118
  return (
115
- <Body type={Typography.BODY_DEFAULT_BOLD} className="text-positive">
119
+ <Body type={Typography.BODY_DEFAULT_BOLD} className="np-upload-input__text">
116
120
  {formatMessage(MESSAGES.uploaded)}
117
121
  </Body>
118
122
  );
@@ -132,38 +136,34 @@ const UploadItem = ({
132
136
 
133
137
  return (
134
138
  <div
135
- className={clsx('np-upload-item', { 'np-upload-item--link': isSucceeded })}
139
+ className={clsx('np-upload-input__item', { 'is-interactive': isSucceeded && url })}
136
140
  data-testid={TEST_IDS.uploadItem}
137
141
  >
138
- <div className="np-upload-item__body">
139
- <UploadItemLink
140
- url={isSucceeded ? url : undefined}
141
- singleFileUpload={singleFileUpload}
142
- onDownload={onDownloadFile}
143
- >
144
- <div className="np-upload-button" aria-live="polite">
145
- <div className="media">
146
- <div className="np-upload-icon media-left">{getIcon()}</div>
147
- <div className="media-body text-xs-left" data-testid={TEST_IDS.mediaBody}>
148
- <Body className="text-word-break d-block text-primary">{getTitle()}</Body>
149
- {getDescription()}
150
- </div>
151
- </div>
152
- </div>
153
- </UploadItemLink>
154
- {canDelete && (
142
+ <UploadItemLink
143
+ url={isSucceeded ? url : undefined}
144
+ singleFileUpload={singleFileUpload}
145
+ onDownload={onDownloadFile}
146
+ >
147
+ <span className="np-upload-input__icon">{getIcon()}</span>
148
+ <div className="np-upload-input__item-content">
149
+ <Body type={Typography.BODY_LARGE} className="np-upload-input__title text-word-break">
150
+ {getTitle()}
151
+ </Body>
152
+ {getDescription()}
153
+ </div>
154
+ </UploadItemLink>
155
+ {canDelete && (
156
+ <div className="np-upload-input__item-action">
155
157
  <button
156
158
  aria-label={formatMessage(MESSAGES.removeFile, { filename })}
157
- className={clsx('btn', 'np-upload-item__remove-button', 'media-left', {
158
- 'np-upload-item--single-file': singleFileUpload,
159
- })}
159
+ className="np-upload-input__item-button"
160
160
  type="button"
161
161
  onClick={() => onDelete()}
162
162
  >
163
163
  <Bin size={16} />
164
164
  </button>
165
- )}
166
- </div>
165
+ </div>
166
+ )}
167
167
  </div>
168
168
  );
169
169
  };
@@ -14,7 +14,7 @@ export const UploadItemLink = ({
14
14
  singleFileUpload,
15
15
  }: UploadItemLinkProps) => {
16
16
  if (!url) {
17
- return <div>{children}</div>;
17
+ return <div className={clsx('np-upload-input__item-container')}>{children}</div>;
18
18
  }
19
19
 
20
20
  return (
@@ -23,8 +23,8 @@ export const UploadItemLink = ({
23
23
  target="_blank"
24
24
  rel="noopener noreferrer"
25
25
  className={clsx(
26
- 'np-upload-item__link',
27
- singleFileUpload ? 'np-upload-item--single-file' : '',
26
+ 'np-upload-input__item-link',
27
+ singleFileUpload ? 'np-upload-input__item-link--single-file' : '',
28
28
  )}
29
29
  onClick={onDownload}
30
30
  >