@popsure/dirty-swan 0.27.5 → 0.27.8-alpha
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.
- package/dist/index.css +21 -12
- package/dist/index.css.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/components/markdown/index.d.ts +9 -0
- package/dist/lib/components/multiDropzone/index.d.ts +2 -1
- package/dist/lib/scss/private/base/style.module.scss +1 -1
- package/dist/lib/scss/private/components/_badge.scss +1 -1
- package/dist/lib/scss/private/components/_buttons.scss +2 -2
- package/dist/lib/scss/private/components/_input.scss +6 -6
- package/dist/lib/scss/public/colors/default.scss +4 -2
- package/dist/lib/scss/third-party/_google_places.scss +1 -1
- package/package.json +4 -1
- package/src/lib/components/dateSelector/datepicker.scss +2 -2
- package/src/lib/components/input/index.stories.mdx +4 -0
- package/src/lib/components/input/style.module.scss +2 -2
- package/src/lib/components/markdown/example.md +78 -0
- package/src/lib/components/markdown/index.stories.mdx +22 -0
- package/src/lib/components/markdown/index.tsx +139 -0
- package/src/lib/components/markdown/styles.module.scss +13 -0
- package/src/lib/components/multiDropzone/UploadFileCell/style.module.scss +1 -1
- package/src/lib/components/multiDropzone/icons/upload.svg +4 -4
- package/src/lib/components/multiDropzone/index.stories.mdx +21 -0
- package/src/lib/components/multiDropzone/index.tsx +17 -8
- package/src/lib/components/multiDropzone/style.module.scss +19 -14
- package/src/lib/components/signaturePad/style.module.scss +1 -1
- package/src/lib/scss/private/base/style.module.scss +1 -1
- package/src/lib/scss/private/components/_badge.scss +1 -1
- package/src/lib/scss/private/components/_buttons.scss +2 -2
- package/src/lib/scss/private/components/_input.scss +6 -6
- package/src/lib/scss/public/colors/default.scss +4 -2
- package/src/lib/scss/third-party/_google_places.scss +1 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React, { FunctionComponent } from 'react';
|
|
2
|
+
declare const Markdown: ({ children, customMDComponents, className, openLinksInNewTab, paragraphClassName, }: {
|
|
3
|
+
children: string;
|
|
4
|
+
customMDComponents?: Record<string, React.FunctionComponent<any>> | undefined;
|
|
5
|
+
className?: string | undefined;
|
|
6
|
+
openLinksInNewTab?: boolean | undefined;
|
|
7
|
+
paragraphClassName?: string | undefined;
|
|
8
|
+
}) => JSX.Element;
|
|
9
|
+
export default Markdown;
|
|
@@ -14,6 +14,7 @@ interface Props {
|
|
|
14
14
|
uploadedFiles: UploadedFile[];
|
|
15
15
|
uploading: boolean;
|
|
16
16
|
onRemoveFile: (id: string) => void;
|
|
17
|
+
isCondensed?: boolean;
|
|
17
18
|
}
|
|
18
|
-
declare const _default: ({ uploadedFiles, onFileSelect, uploading, onRemoveFile, }: Props) => JSX.Element;
|
|
19
|
+
declare const _default: ({ uploadedFiles, onFileSelect, uploading, onRemoveFile, isCondensed, }: Props) => JSX.Element;
|
|
19
20
|
export default _default;
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
color: $ds-grey-500;
|
|
172
172
|
background-color: transparent;
|
|
173
173
|
|
|
174
|
-
border: 1px dashed $ds-grey-
|
|
174
|
+
border: 1px dashed $ds-grey-400;
|
|
175
175
|
|
|
176
176
|
&:hover {
|
|
177
177
|
color: $ds-grey-600;
|
|
@@ -180,7 +180,7 @@
|
|
|
180
180
|
|
|
181
181
|
&[disabled] {
|
|
182
182
|
color: $ds-grey-500;
|
|
183
|
-
border-color: $ds-grey-
|
|
183
|
+
border-color: $ds-grey-400;
|
|
184
184
|
opacity: 0.5;
|
|
185
185
|
}
|
|
186
186
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
width: 100%;
|
|
15
15
|
|
|
16
16
|
border-radius: 8px;
|
|
17
|
-
border: 1px solid $ds-grey-
|
|
17
|
+
border: 1px solid $ds-grey-400;
|
|
18
18
|
background-color: white;
|
|
19
19
|
|
|
20
20
|
color: $ds-grey-900;
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
&:disabled {
|
|
29
29
|
background-color: $ds-grey-300;
|
|
30
|
-
border
|
|
30
|
+
border: none;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
&:focus {
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
height: 16px;
|
|
82
82
|
min-height: 16px;
|
|
83
83
|
|
|
84
|
-
border: 1px solid $ds-grey-
|
|
84
|
+
border: 1px solid $ds-grey-400;
|
|
85
85
|
border-radius: 50%;
|
|
86
86
|
|
|
87
87
|
background-color: white;
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
height: 16px;
|
|
114
114
|
min-height: 16px;
|
|
115
115
|
|
|
116
|
-
border: 1px solid $ds-grey-
|
|
116
|
+
border: 1px solid $ds-grey-400;
|
|
117
117
|
border-radius: 4px;
|
|
118
118
|
|
|
119
119
|
background-color: white;
|
|
@@ -163,7 +163,7 @@
|
|
|
163
163
|
padding-left: 16px;
|
|
164
164
|
|
|
165
165
|
border-radius: 8px;
|
|
166
|
-
border: 1px solid $ds-grey-
|
|
166
|
+
border: 1px solid $ds-grey-400;
|
|
167
167
|
background-color: white;
|
|
168
168
|
|
|
169
169
|
&:hover {
|
|
@@ -201,7 +201,7 @@ input:checked[type='checkbox'] + .p-label--bordered {
|
|
|
201
201
|
height: 48px;
|
|
202
202
|
|
|
203
203
|
border-radius: 8px;
|
|
204
|
-
border: 1px solid $ds-grey-
|
|
204
|
+
border: 1px solid $ds-grey-400;
|
|
205
205
|
background-color: white;
|
|
206
206
|
|
|
207
207
|
font-family: inherit;
|
|
@@ -41,8 +41,9 @@ $ds-pink-900: #700024;
|
|
|
41
41
|
|
|
42
42
|
$ds-grey-100: #fafaff;
|
|
43
43
|
$ds-grey-200: #f5f5fa;
|
|
44
|
-
$ds-grey-300: #
|
|
45
|
-
$ds-grey-
|
|
44
|
+
$ds-grey-300: #ededf2;
|
|
45
|
+
$ds-grey-400: #d2d2d8;
|
|
46
|
+
$ds-grey-500: #848490;
|
|
46
47
|
$ds-grey-600: #696970;
|
|
47
48
|
$ds-grey-700: #4c4c53;
|
|
48
49
|
$ds-grey-900: #26262e;
|
|
@@ -98,6 +99,7 @@ $colors: (
|
|
|
98
99
|
'grey-100': $ds-grey-100,
|
|
99
100
|
'grey-200': $ds-grey-200,
|
|
100
101
|
'grey-300': $ds-grey-300,
|
|
102
|
+
'grey-400': $ds-grey-400,
|
|
101
103
|
'grey-500': $ds-grey-500,
|
|
102
104
|
'grey-600': $ds-grey-600,
|
|
103
105
|
'grey-700': $ds-grey-700,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@popsure/dirty-swan",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.8-alpha",
|
|
4
4
|
"author": "Vincent Audoire <vincent@getpopsure.com>",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"private": false,
|
|
@@ -23,12 +23,15 @@
|
|
|
23
23
|
"@popsure/public-models": "^1.0.1",
|
|
24
24
|
"classnames": "^2.3.1",
|
|
25
25
|
"dayjs": "^1.10.7",
|
|
26
|
+
"hastscript": "^7.0.2",
|
|
26
27
|
"lodash.debounce": "^4.0.8",
|
|
27
28
|
"lodash.isequal": "^4.5.0",
|
|
28
29
|
"react-autosuggest": "^10.1.0",
|
|
29
30
|
"react-day-picker": "^7.4.10",
|
|
30
31
|
"react-dropzone": "^11.3.2",
|
|
32
|
+
"react-markdown": "^8.0.3",
|
|
31
33
|
"react-scroll-sync": "^0.9.0",
|
|
34
|
+
"remark-directive": "^2.0.1",
|
|
32
35
|
"sass": "^1.35.1",
|
|
33
36
|
"signature_pad": "^3.0.0-beta.3"
|
|
34
37
|
},
|
|
@@ -391,7 +391,7 @@
|
|
|
391
391
|
}
|
|
392
392
|
|
|
393
393
|
.DayPicker-Day--outside {
|
|
394
|
-
color: $ds-grey-
|
|
394
|
+
color: $ds-grey-400;
|
|
395
395
|
cursor: pointer;
|
|
396
396
|
|
|
397
397
|
&:hover {
|
|
@@ -400,7 +400,7 @@
|
|
|
400
400
|
}
|
|
401
401
|
|
|
402
402
|
.DayPicker-Day--disabled {
|
|
403
|
-
color: $ds-grey-
|
|
403
|
+
color: $ds-grey-400;
|
|
404
404
|
background-color: transparent;
|
|
405
405
|
pointer-events: none;
|
|
406
406
|
}
|
|
@@ -34,6 +34,8 @@ You are looking at the JSX definition of the Input component, if you want you ca
|
|
|
34
34
|
value="jane.doe@feather-insurance.com"
|
|
35
35
|
placeholder="Email"
|
|
36
36
|
/>
|
|
37
|
+
<h4 className="p-h4 mt24">Disabled</h4>
|
|
38
|
+
<Input className="wmx5 mt8" placeholder="Email" disabled />
|
|
37
39
|
<h4 className="p-h4 mt24">Error</h4>
|
|
38
40
|
<Input
|
|
39
41
|
className="wmx5 mt8"
|
|
@@ -50,6 +52,8 @@ You are looking at the JSX definition of the Input component, if you want you ca
|
|
|
50
52
|
<Input className="wmx5 mt8" placeholder="amount" prefix="€" />
|
|
51
53
|
<h4 className="p-h4 mt24">Filled with placeholder</h4>
|
|
52
54
|
<Input className="wmx5 mt8" placeholder="amount" value="100" prefix="€" />
|
|
55
|
+
<h4 className="p-h4 mt24">Disabled</h4>
|
|
56
|
+
<Input className="wmx5 mt8" placeholder="amount" disabled prefix="€" />
|
|
53
57
|
<h4 className="p-h4 mt24">Error</h4>
|
|
54
58
|
<Input
|
|
55
59
|
className="wmx5 mt8"
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
transform: translateY(-50%);
|
|
12
12
|
|
|
13
|
-
color: var(--ds-grey-
|
|
13
|
+
color: var(--ds-grey-500);
|
|
14
14
|
|
|
15
15
|
transition: 0.3s top;
|
|
16
16
|
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
transform: translateY(-50%);
|
|
79
79
|
transition: 0.3s ease all;
|
|
80
80
|
|
|
81
|
-
color: var(--ds-grey-
|
|
81
|
+
color: var(--ds-grey-500);
|
|
82
82
|
|
|
83
83
|
&--with-prefix {
|
|
84
84
|
left: 32px;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Headers
|
|
2
|
+
|
|
3
|
+
The header options range from h1 to h4.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
# H1
|
|
7
|
+
## H2
|
|
8
|
+
### H3
|
|
9
|
+
#### H4
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
# H1 Lorem ipsum non sunt qui sunt
|
|
13
|
+
|
|
14
|
+
## H2 Lorem ipsum non sunt qui sunt
|
|
15
|
+
|
|
16
|
+
### H3 Lorem ipsum non sunt qui sunt
|
|
17
|
+
|
|
18
|
+
#### H4 Lorem ipsum non sunt qui sunt
|
|
19
|
+
|
|
20
|
+
# Emphasis
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Emphasis or italics, use *asterisk* or _underscore_.
|
|
24
|
+
Strong emphasis or bold, use **asterisks** or __underscores__.
|
|
25
|
+
Combined emphasis, use **_asterisks and underscores_**.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Emphasis or italics, use _asterisk_ or _underscore_.
|
|
29
|
+
|
|
30
|
+
Strong emphasis or bold, use **asterisks** or **underscores**.
|
|
31
|
+
|
|
32
|
+
Combined emphasis, use **_asterisks and underscores_**.
|
|
33
|
+
|
|
34
|
+
# Lists
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
1. First ordered list item
|
|
38
|
+
2. Another item
|
|
39
|
+
3. Actual numbers don't matter, just that it's a number
|
|
40
|
+
4. And another item.
|
|
41
|
+
|
|
42
|
+
* Unordered list can use asterisks
|
|
43
|
+
- Or minuses
|
|
44
|
+
+ Or pluses
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
1. First ordered list item
|
|
48
|
+
2. Another item
|
|
49
|
+
3. Actual numbers don't matter, just that it's a number
|
|
50
|
+
4. And another item.
|
|
51
|
+
|
|
52
|
+
- Unordered list can use asterisks
|
|
53
|
+
- Or minuses
|
|
54
|
+
- Or pluses
|
|
55
|
+
|
|
56
|
+
# Links
|
|
57
|
+
|
|
58
|
+
For links markdown syntax should be used.
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
[This is an inline link](https://feather-insurance.com)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
[This is an inline link](https://feather-insurance.com)
|
|
65
|
+
|
|
66
|
+
# Custom Markdown tags
|
|
67
|
+
|
|
68
|
+
When additional functionality needs to be added to the markdown component, custom tags can be used.
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
Tags in the form of :mytag[value]{attributes} will be converted to the corresponding
|
|
72
|
+
custom HTML tags <mytag ...attributes>value<mytag>.
|
|
73
|
+
|
|
74
|
+
Custom styling for these tags can be provided by passing the customMDComponents prop
|
|
75
|
+
<Markdown customMDComponents={
|
|
76
|
+
mytag: ({ children }) => (<h1>{childrend}</h1>)
|
|
77
|
+
}>
|
|
78
|
+
```
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Meta, Preview } from '@storybook/addon-docs/blocks';
|
|
2
|
+
|
|
3
|
+
import Markdown from '.';
|
|
4
|
+
import example from './example.md';
|
|
5
|
+
|
|
6
|
+
<Meta title="JSX/Markdown" />
|
|
7
|
+
|
|
8
|
+
# Markdown
|
|
9
|
+
|
|
10
|
+
Display markdown text based on [react-markdown](https://github.com/remarkjs/react-markdown) with custom styling.
|
|
11
|
+
|
|
12
|
+
<Preview>
|
|
13
|
+
<Markdown>{example}</Markdown>
|
|
14
|
+
</Preview>
|
|
15
|
+
|
|
16
|
+
| attribute | unit | description | default value | required |
|
|
17
|
+
| ------------------ | ---------------------------------------------- | ------------------------------------------------ | ------------- | -------- |
|
|
18
|
+
| children | string | Markdown source to be rendered | n/a | true |
|
|
19
|
+
| customMDComponents | Record<string, FunctionComponent<any>> | Styling functions for custom tags | n/a | false |
|
|
20
|
+
| className | string | Styles to be applied to the whole markdown block | '' | false |
|
|
21
|
+
| openLinksInNewTab | boolean | Whether the links should open in a new tab | false | false |
|
|
22
|
+
| paragraphClassName | string | Styles to be applied to paragraph tags | '' | false |
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { h } from 'hastscript/html.js';
|
|
2
|
+
import React, { FunctionComponent } from 'react';
|
|
3
|
+
import ReactMarkdown from 'react-markdown';
|
|
4
|
+
import remarkDirective from 'remark-directive';
|
|
5
|
+
import visit from 'unist-util-visit';
|
|
6
|
+
|
|
7
|
+
import styles from './styles.module.scss';
|
|
8
|
+
|
|
9
|
+
// The plugin function 'directiveToHTMLTag' is used in conjunction with 'remarkDirective' to parse custom markdown tags.
|
|
10
|
+
|
|
11
|
+
// It converts tags in the form of :mytag[value]{attributes} to the
|
|
12
|
+
// corresponding custom HTML tags <mytag ...attributes>value<mytag> .
|
|
13
|
+
// (NOTE: tag names are always converted to lowercase custom html tags)
|
|
14
|
+
|
|
15
|
+
// These can then be overridden by supplying the ReactMarkdown component with
|
|
16
|
+
// an entry in its 'components' property:
|
|
17
|
+
// <ReactMarkdown components={
|
|
18
|
+
// mytag: ({ children }) => (<h1>{childrend}</h1>)
|
|
19
|
+
// }>
|
|
20
|
+
|
|
21
|
+
// Without those plugins, it's only possible to override the standard html tags as listed here:
|
|
22
|
+
// https://github.com/remarkjs/react-markdown#appendix-b-components
|
|
23
|
+
|
|
24
|
+
const directiveToHTMLTag = () => {
|
|
25
|
+
return (tree: any) => {
|
|
26
|
+
// Visit the given tree and transform 'text-', 'leaf-' or 'containerDirectives' (= custom tags) as parsed by
|
|
27
|
+
// the remarkDirective plugin
|
|
28
|
+
visit(
|
|
29
|
+
tree,
|
|
30
|
+
['textDirective', 'leafDirective', 'containerDirective'],
|
|
31
|
+
(node: any) => {
|
|
32
|
+
// Grab a reference to the data of the custom tag node
|
|
33
|
+
const data = node.data || (node.data = {});
|
|
34
|
+
|
|
35
|
+
// Create a HyperText Abstract Syntax Tree (HAST) from the node
|
|
36
|
+
const hast = h(node.name, node.attributes);
|
|
37
|
+
|
|
38
|
+
// Modify the node data with the resulting HAST's data to transform the node into something
|
|
39
|
+
// that ReactMarkdown can understand (custom html tag) and later replace with a custom component
|
|
40
|
+
data.hName = hast.tagName;
|
|
41
|
+
data.hProperties = hast.properties;
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const Link = (openLinksInNewTab: boolean) => (props: any) => {
|
|
48
|
+
return openLinksInNewTab ? (
|
|
49
|
+
<a href={props.href} className="p-a" target="_blank" rel="noreferrer">
|
|
50
|
+
{props.children}
|
|
51
|
+
</a>
|
|
52
|
+
) : (
|
|
53
|
+
<a href={props.href} className="p-a">
|
|
54
|
+
{props.children}
|
|
55
|
+
</a>
|
|
56
|
+
);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const Paragraph = (className: string) => (props: any) => {
|
|
60
|
+
return <p className={className || 'p-p mt8'}>{props.children}</p>;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const Heading = (props: any) => {
|
|
64
|
+
const { level } = props;
|
|
65
|
+
|
|
66
|
+
switch (level) {
|
|
67
|
+
case 1:
|
|
68
|
+
return <h1 className="p-h1 p--serif mt32">{props.children}</h1>;
|
|
69
|
+
case 2:
|
|
70
|
+
return <h2 className="p-h2 mt24">{props.children}</h2>;
|
|
71
|
+
case 3:
|
|
72
|
+
return <h3 className="p-h3 mt16">{props.children}</h3>;
|
|
73
|
+
case 4:
|
|
74
|
+
return <h4 className="p-h4 mt8">{props.children}</h4>;
|
|
75
|
+
default:
|
|
76
|
+
return <p>{props.children}</p>;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const UList = (props: any) => {
|
|
81
|
+
return <ul className={`p-p ${styles.ulist} mt8`}>{props.children}</ul>;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const OList = (props: any) => {
|
|
85
|
+
return <ol className={`p-p ${styles.olist} mt8`}>{props.children}</ol>;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const Strong = (props: any) => {
|
|
89
|
+
return <strong className="fw-bold">{props.children}</strong>;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const Italic = (props: any) => {
|
|
93
|
+
return <em className="fs-italic">{props.children}</em>;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const Code = (props: any) => {
|
|
97
|
+
return (
|
|
98
|
+
<div className={`bg-grey-200 p8 p-p--small my8 br2 ${styles.code}`}>
|
|
99
|
+
{props.children}
|
|
100
|
+
</div>
|
|
101
|
+
);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const Markdown = ({
|
|
105
|
+
children,
|
|
106
|
+
customMDComponents,
|
|
107
|
+
className = '',
|
|
108
|
+
openLinksInNewTab = false,
|
|
109
|
+
paragraphClassName = '',
|
|
110
|
+
}: {
|
|
111
|
+
children: string;
|
|
112
|
+
customMDComponents?: Record<string, FunctionComponent<any>>;
|
|
113
|
+
className?: string;
|
|
114
|
+
openLinksInNewTab?: boolean;
|
|
115
|
+
paragraphClassName?: string;
|
|
116
|
+
}) => (
|
|
117
|
+
<ReactMarkdown
|
|
118
|
+
children={children}
|
|
119
|
+
className={className}
|
|
120
|
+
components={{
|
|
121
|
+
a: Link(openLinksInNewTab),
|
|
122
|
+
p: Paragraph(paragraphClassName),
|
|
123
|
+
h1: Heading,
|
|
124
|
+
h2: Heading,
|
|
125
|
+
h3: Heading,
|
|
126
|
+
h4: Heading,
|
|
127
|
+
h5: Heading,
|
|
128
|
+
ol: OList,
|
|
129
|
+
ul: UList,
|
|
130
|
+
strong: Strong,
|
|
131
|
+
em: Italic,
|
|
132
|
+
code: Code,
|
|
133
|
+
...customMDComponents,
|
|
134
|
+
}}
|
|
135
|
+
remarkPlugins={[remarkDirective, directiveToHTMLTag]}
|
|
136
|
+
/>
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
export default Markdown;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<svg width="
|
|
2
|
-
<path d="
|
|
3
|
-
<path d="
|
|
4
|
-
<path d="
|
|
1
|
+
<svg width="70" height="70" viewBox="0 0 70 70" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M25.589 52.324H16.6368C12.2734 52.324 2.91699 48.3383 2.91699 38.0351C2.91699 26.9493 12.2734 23.2325 16.9623 23.2325C17.6018 17.8902 21.1291 7.97805 34.1238 7.29132C46.6242 7.29132 52.2035 18.5714 51.2854 26.9756C56.175 26.6729 67.0837 28.8787 67.0837 39.8558C67.0837 49.1926 57.3044 52.7417 52.4147 52.324H44.7121" stroke="#8E8CEE" stroke-width="3.08333" stroke-linecap="round" stroke-linejoin="round"/>
|
|
3
|
+
<path d="M35 63.2981V32.646" stroke="#8E8CEE" stroke-width="3.08333" stroke-linecap="round" stroke-linejoin="round"/>
|
|
4
|
+
<path d="M27.3428 40.3045L35.0013 32.646L42.6599 40.3045" stroke="#8E8CEE" stroke-width="3.08333" stroke-linecap="round" stroke-linejoin="round"/>
|
|
5
5
|
</svg>
|
|
@@ -69,6 +69,27 @@ MultiDropzone component allows upload of multiple documents / files.
|
|
|
69
69
|
/>
|
|
70
70
|
</Preview>
|
|
71
71
|
|
|
72
|
+
### Condensed view
|
|
73
|
+
|
|
74
|
+
<Preview>
|
|
75
|
+
<MultiDropzone
|
|
76
|
+
uploadedFiles={[
|
|
77
|
+
{
|
|
78
|
+
id: '123',
|
|
79
|
+
type: 'pdf',
|
|
80
|
+
progress: '100',
|
|
81
|
+
name: 'test_file_name.pdf',
|
|
82
|
+
token: 'abc',
|
|
83
|
+
previewUrl: 'http://getpopsure.com/test_file_name.pdf',
|
|
84
|
+
},
|
|
85
|
+
]}
|
|
86
|
+
onFileSelect={() => {}}
|
|
87
|
+
uploading={false}
|
|
88
|
+
onRemoveFile={() => {}}
|
|
89
|
+
isCondensed
|
|
90
|
+
/>
|
|
91
|
+
</Preview>
|
|
92
|
+
|
|
72
93
|
### Error state
|
|
73
94
|
|
|
74
95
|
<Preview>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
2
|
import { useDropzone } from 'react-dropzone';
|
|
3
3
|
import classnames from 'classnames';
|
|
4
4
|
|
|
@@ -44,6 +44,7 @@ interface Props {
|
|
|
44
44
|
uploadedFiles: UploadedFile[];
|
|
45
45
|
uploading: boolean;
|
|
46
46
|
onRemoveFile: (id: string) => void;
|
|
47
|
+
isCondensed?: boolean;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
export default ({
|
|
@@ -51,6 +52,7 @@ export default ({
|
|
|
51
52
|
onFileSelect,
|
|
52
53
|
uploading,
|
|
53
54
|
onRemoveFile,
|
|
55
|
+
isCondensed = false,
|
|
54
56
|
}: Props) => {
|
|
55
57
|
const onDrop = useCallback(
|
|
56
58
|
(acceptedFiles) => {
|
|
@@ -62,16 +64,23 @@ export default ({
|
|
|
62
64
|
const { getRootProps, getInputProps } = useDropzone({ onDrop });
|
|
63
65
|
|
|
64
66
|
return (
|
|
65
|
-
<div className={
|
|
67
|
+
<div className={styles.container}>
|
|
66
68
|
<div
|
|
67
|
-
className={classnames(
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
className={classnames(
|
|
70
|
+
`w100 ta-center br8 c-pointer ${styles.dropzoneContainer}`,
|
|
71
|
+
{
|
|
72
|
+
[styles['dropzoneContainerDisabled']]: uploading,
|
|
73
|
+
}
|
|
74
|
+
)}
|
|
70
75
|
{...getRootProps()}
|
|
71
76
|
>
|
|
72
77
|
<input {...getInputProps()} />
|
|
73
|
-
<img
|
|
74
|
-
|
|
78
|
+
<img
|
|
79
|
+
className={isCondensed ? styles.img : ''}
|
|
80
|
+
src={icons.uploadIcon}
|
|
81
|
+
alt="purple cloud with an arrow"
|
|
82
|
+
/>
|
|
83
|
+
<div className={`p-h4 mt8 ${isCondensed ? styles.textInline : ''}`}>
|
|
75
84
|
{uploading
|
|
76
85
|
? 'Please wait while uploading file...'
|
|
77
86
|
: 'Choose file or drag & drop'}
|
|
@@ -79,7 +88,7 @@ export default ({
|
|
|
79
88
|
<div className="p-p--small tc-grey-500">Supports JPEG, PNG, PDF</div>
|
|
80
89
|
</div>
|
|
81
90
|
{uploadedFiles.length > 0 && (
|
|
82
|
-
<div className=
|
|
91
|
+
<div className="w100 mt16">
|
|
83
92
|
{uploadedFiles.map((file) => {
|
|
84
93
|
const uploadStatus = getUploadStatus(file.progress, file.error);
|
|
85
94
|
return (
|
|
@@ -1,32 +1,37 @@
|
|
|
1
1
|
@use "../../scss/public/grid" as *;
|
|
2
2
|
|
|
3
3
|
.container {
|
|
4
|
-
background-color:
|
|
5
|
-
padding: 24px;
|
|
6
|
-
box-shadow: 0px 2px 3px rgba(38, 38, 46, 0.04);
|
|
7
|
-
border-radius: 8px;
|
|
8
|
-
|
|
9
|
-
@include p-size-mobile {
|
|
10
|
-
padding: 16px;
|
|
11
|
-
}
|
|
4
|
+
background-color: transparent;
|
|
12
5
|
}
|
|
13
6
|
|
|
14
|
-
.
|
|
7
|
+
.dropzoneContainer {
|
|
15
8
|
border: 1px dashed var(--ds-primary-500);
|
|
16
9
|
padding: 32px 0;
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
background-color: white;
|
|
11
|
+
|
|
12
|
+
transition: all 0.6s ease-in-out;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.img {
|
|
16
|
+
vertical-align: middle;
|
|
17
|
+
margin-right: 8px;
|
|
18
|
+
height: 18px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.textInline {
|
|
22
|
+
display: inline-flex;
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
.
|
|
25
|
+
.dropzoneContainer:focus {
|
|
22
26
|
outline: none;
|
|
23
27
|
}
|
|
24
28
|
|
|
25
|
-
.
|
|
29
|
+
.dropzoneContainer:hover {
|
|
26
30
|
background-color: var(--ds-primary-100);
|
|
27
31
|
transition: 0.5s ease;
|
|
28
32
|
}
|
|
29
33
|
|
|
30
|
-
.
|
|
34
|
+
.dropzoneContainerDisabled {
|
|
31
35
|
pointer-events: none;
|
|
36
|
+
opacity: 0.4
|
|
32
37
|
}
|