@antv/dumi-theme-antv 0.1.0

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 (111) hide show
  1. package/README.md +9 -0
  2. package/es/antv/404/index.js +20 -0
  3. package/es/antv/Banner/Banner.module.less +412 -0
  4. package/es/antv/Banner/Notification.js +44 -0
  5. package/es/antv/Banner/Notification.module.less +108 -0
  6. package/es/antv/Banner/index.js +115 -0
  7. package/es/antv/Cases/Cases.js +124 -0
  8. package/es/antv/Cases/Cases.module.less +203 -0
  9. package/es/antv/Features/FeatureCard.js +25 -0
  10. package/es/antv/Features/FeatureCard.module.less +51 -0
  11. package/es/antv/Features/Features.module.less +169 -0
  12. package/es/antv/Features/index.js +102 -0
  13. package/es/antv/Footer/Footer.module.less +36 -0
  14. package/es/antv/Footer/index.js +232 -0
  15. package/es/antv/Header/Logo.js +130 -0
  16. package/es/antv/Products/Product.js +61 -0
  17. package/es/antv/Products/Product.module.less +146 -0
  18. package/es/antv/Products/getNewProducts.js +41 -0
  19. package/es/antv/Products/getProducts.js +466 -0
  20. package/es/antv/Products/index.js +81 -0
  21. package/es/antv/hooks.js +81 -0
  22. package/es/antv/mixins.less +21 -0
  23. package/es/antv/utils.js +49 -0
  24. package/es/builtins/API.js +37 -0
  25. package/es/builtins/Alert.js +9 -0
  26. package/es/builtins/Alert.less +62 -0
  27. package/es/builtins/Badge.js +9 -0
  28. package/es/builtins/Badge.less +31 -0
  29. package/es/builtins/Example.js +48 -0
  30. package/es/builtins/Example.less +47 -0
  31. package/es/builtins/Previewer.js +225 -0
  32. package/es/builtins/Previewer.less +406 -0
  33. package/es/builtins/SourceCode.js +72 -0
  34. package/es/builtins/SourceCode.less +103 -0
  35. package/es/builtins/Table.js +56 -0
  36. package/es/builtins/Table.less +43 -0
  37. package/es/builtins/Tree.js +219 -0
  38. package/es/builtins/Tree.less +159 -0
  39. package/es/components/Dark.js +125 -0
  40. package/es/components/Dark.less +121 -0
  41. package/es/components/LocaleSelect.js +53 -0
  42. package/es/components/LocaleSelect.less +59 -0
  43. package/es/components/Navbar.js +155 -0
  44. package/es/components/Navbar.less +180 -0
  45. package/es/components/SearchBar.js +83 -0
  46. package/es/components/SearchBar.less +165 -0
  47. package/es/components/SideMenu.js +99 -0
  48. package/es/components/SideMenu.less +379 -0
  49. package/es/components/SlugList.js +33 -0
  50. package/es/components/SlugList.less +18 -0
  51. package/es/layout.js +276 -0
  52. package/es/style/layout.less +402 -0
  53. package/es/style/markdown.less +240 -0
  54. package/es/style/variables.less +37 -0
  55. package/package.json +58 -0
  56. package/src/antv/404/index.tsx +25 -0
  57. package/src/antv/Banner/Banner.module.less +412 -0
  58. package/src/antv/Banner/Notification.module.less +108 -0
  59. package/src/antv/Banner/Notification.tsx +45 -0
  60. package/src/antv/Banner/index.tsx +121 -0
  61. package/src/antv/Cases/Cases.module.less +203 -0
  62. package/src/antv/Cases/Cases.tsx +116 -0
  63. package/src/antv/Features/FeatureCard.module.less +51 -0
  64. package/src/antv/Features/FeatureCard.tsx +24 -0
  65. package/src/antv/Features/Features.module.less +169 -0
  66. package/src/antv/Features/index.tsx +86 -0
  67. package/src/antv/Footer/Footer.module.less +36 -0
  68. package/src/antv/Footer/index.tsx +272 -0
  69. package/src/antv/Header/Logo.tsx +85 -0
  70. package/src/antv/Products/Product.module.less +146 -0
  71. package/src/antv/Products/Product.tsx +80 -0
  72. package/src/antv/Products/getNewProducts.tsx +53 -0
  73. package/src/antv/Products/getProducts.tsx +626 -0
  74. package/src/antv/Products/index.tsx +70 -0
  75. package/src/antv/hooks.ts +87 -0
  76. package/src/antv/mixins.less +21 -0
  77. package/src/antv/utils.ts +44 -0
  78. package/src/builtins/API.tsx +57 -0
  79. package/src/builtins/Alert.less +62 -0
  80. package/src/builtins/Alert.tsx +4 -0
  81. package/src/builtins/Badge.less +31 -0
  82. package/src/builtins/Badge.tsx +4 -0
  83. package/src/builtins/Example.less +47 -0
  84. package/src/builtins/Example.tsx +34 -0
  85. package/src/builtins/Previewer.less +406 -0
  86. package/src/builtins/Previewer.tsx +264 -0
  87. package/src/builtins/SourceCode.less +103 -0
  88. package/src/builtins/SourceCode.tsx +55 -0
  89. package/src/builtins/Table.less +43 -0
  90. package/src/builtins/Table.tsx +42 -0
  91. package/src/builtins/Tree.less +159 -0
  92. package/src/builtins/Tree.tsx +130 -0
  93. package/src/components/Dark.less +121 -0
  94. package/src/components/Dark.tsx +78 -0
  95. package/src/components/LocaleSelect.less +59 -0
  96. package/src/components/LocaleSelect.tsx +53 -0
  97. package/src/components/Navbar.less +180 -0
  98. package/src/components/Navbar.tsx +152 -0
  99. package/src/components/SearchBar.less +165 -0
  100. package/src/components/SearchBar.tsx +68 -0
  101. package/src/components/SideMenu.less +379 -0
  102. package/src/components/SideMenu.tsx +148 -0
  103. package/src/components/SlugList.less +18 -0
  104. package/src/components/SlugList.tsx +20 -0
  105. package/src/layout.tsx +225 -0
  106. package/src/style/layout.less +402 -0
  107. package/src/style/markdown.less +240 -0
  108. package/src/style/variables.less +37 -0
  109. package/src/test/SearchBar.test.ts +32 -0
  110. package/src/test/Table.test.tsx +41 -0
  111. package/src/test/index.test.tsx +377 -0
@@ -0,0 +1,203 @@
1
+ @import '../mixins';
2
+ .wrapper {
3
+ height: 667px;
4
+ margin: auto;
5
+ position: relative;
6
+ padding: 0;
7
+ overflow: hidden;
8
+ background: rgba(250, 251, 252, 1);
9
+ .slider {
10
+ .container1440;
11
+ }
12
+ .appWrapper {
13
+ margin-left: 5%;
14
+ margin-bottom: 5%;
15
+ width: 83.88%;
16
+ height: 100%;
17
+ overflow-y: hidden;
18
+ display: flex;
19
+ .appLeft {
20
+ margin-left: 3.06%;
21
+ width: 35%;
22
+ margin-top: 8%;
23
+ height: 613px;
24
+ .appContent {
25
+ height: fit-content;
26
+ position: relative;
27
+ .appLogo {
28
+ height: 80px;
29
+ }
30
+ .appTitle {
31
+ font-size: 1.2857em;
32
+ font-weight: 500;
33
+ margin: 48px 0 0 0;
34
+ position: relative;
35
+ height: min-content;
36
+ color: rgba(0, 0, 0, 1);
37
+ user-select: text;
38
+ }
39
+ .appDescription {
40
+ color: rgba(105, 123, 140, 0.6);
41
+ font-size: 1em;
42
+ margin: 16px 0 0 0;
43
+ user-select: text;
44
+ }
45
+ .detailWrapper {
46
+ margin: 20px 0 0 0;
47
+ .detail {
48
+ color: @primary-color;
49
+ font-size: 1em;
50
+ }
51
+ }
52
+ }
53
+ .buttons {
54
+ cursor: pointer;
55
+ position: absolute;
56
+ display: flex;
57
+ bottom: 30%;
58
+ height: 100px;
59
+ .controlButton {
60
+ width: 47px;
61
+ height: 47px;
62
+ line-height: 47px;
63
+ border: 1px solid #a3b1bf;
64
+ transition: all 0.3s;
65
+ &:hover {
66
+ border: 1px solid #ced4d9;
67
+ fill: #000000;
68
+ }
69
+ &:hover :only-child {
70
+ color: #ced4d9;
71
+ }
72
+ .controlButtonIcon {
73
+ width: 100%;
74
+ color: #a3b1bf;
75
+ transition: all 0.3s;
76
+ }
77
+ }
78
+ .nextButton {
79
+ width: 47px;
80
+ margin-left: -1px;
81
+ background-image: url('https://gw.alipayobjects.com/zos/basement_prod/27ce6e21-bbb6-4490-8326-43483ac39e0b.svg');
82
+ background-size: 100% 100%;
83
+ &:hover {
84
+ background-image: url('https://gw.alipayobjects.com/zos/basement_prod/4d1f0d0a-4e56-4f21-a9aa-06b2f8c3e18e.svg');
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ }
91
+ .appTeaser {
92
+ position: absolute;
93
+ height: 667px;
94
+ left: 50%;
95
+ right: 0;
96
+ }
97
+
98
+ .slider {
99
+ height: 100%;
100
+ :global {
101
+ .slick-dots {
102
+ display: none;
103
+ }
104
+ }
105
+ }
106
+
107
+ :global {
108
+ .slick-current {
109
+ z-index: 2 !important;
110
+ }
111
+ }
112
+
113
+ @media (max-width: 1200px) {
114
+ .wrapper {
115
+ .appWrapper {
116
+ .appLeft {
117
+ width: 270px;
118
+ }
119
+ }
120
+ }
121
+ .appTeaser {
122
+ position: absolute;
123
+ width: 857px;
124
+ left: 350px;
125
+ }
126
+ }
127
+
128
+ @media (max-width: 768px) {
129
+ .wrapper {
130
+ width: 100%;
131
+ height: fit-content;
132
+ .slider {
133
+ width: 100%;
134
+ max-width: 100%;
135
+ margin-left: 0;
136
+ margin-right: 0;
137
+ }
138
+ .appWrapper {
139
+ width: 100%;
140
+ padding-bottom: 150px;
141
+ margin-left: 0;
142
+ flex-direction: column;
143
+ text-align: center;
144
+ .appLeft {
145
+ height: 286px;
146
+ margin-left: 4.27%;
147
+ width: 91.47%;
148
+ margin-top: 64px;
149
+ .appContent {
150
+ width: 90%;
151
+ margin-left: 5%;
152
+ .appLogo {
153
+ position: absolute;
154
+ top: -36px;
155
+ left: 50%;
156
+ transform: translateX(-40px);
157
+ }
158
+ .appTitle {
159
+ padding-top: 76px;
160
+ }
161
+ .detailWrapper {
162
+ margin-top: 40px;
163
+ .detail {
164
+ font-size: 1em;
165
+ }
166
+ }
167
+ }
168
+ .buttons {
169
+ display: none;
170
+ position: absolute;
171
+ bottom: 60px;
172
+ left: 50%;
173
+ height: 100px;
174
+ transform: translateX(-47px);
175
+ width: 92%;
176
+ }
177
+ }
178
+ .appTeaser {
179
+ left: 0;
180
+ margin-top: 60px;
181
+ margin-bottom: 40px;
182
+ margin-left: 4.06%;
183
+ width: 91.47%;
184
+ height: auto;
185
+ position: relative;
186
+ }
187
+ }
188
+ }
189
+
190
+ .slider {
191
+ height: 100%;
192
+ :global {
193
+ .slick-dots {
194
+ display: block;
195
+ bottom: 100px;
196
+ }
197
+ .slick-dots li.slick-active button:before {
198
+ opacity: 1;
199
+ color: #1890ff;
200
+ }
201
+ }
202
+ }
203
+ }
@@ -0,0 +1,116 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import React from 'react';
3
+ import { ArrowLeftOutlined, ArrowRightOutlined } from '@ant-design/icons';
4
+ import { Link } from 'react-router-dom';
5
+ import Slider from 'react-slick';
6
+ import classNames from 'classnames';
7
+ import 'slick-carousel/slick/slick.css';
8
+ import 'slick-carousel/slick/slick-theme.css';
9
+ // @ts-ignore
10
+ import styles from './Cases.module.less';
11
+
12
+ interface Case {
13
+ logo?: string;
14
+ isAppLogo?: boolean;
15
+ title: string;
16
+ description: string;
17
+ link?: string;
18
+ image: string;
19
+ }
20
+ interface CasesProps {
21
+ cases: Case[];
22
+ style?: React.CSSProperties;
23
+ className?: string;
24
+ }
25
+ const Cases: React.FC<CasesProps> = ({ cases = [], style = {}, className }) => {
26
+ let slider: any;
27
+
28
+ const clickPrevious = () => {
29
+ slider.slickPrev();
30
+ };
31
+ const clickNext = () => {
32
+ slider.slickNext();
33
+ };
34
+
35
+ const getCases = () => {
36
+ let buttons: any;
37
+ if (cases.length > 1) {
38
+ buttons = (
39
+ <div className={styles.buttons}>
40
+ <div className={styles.controlButton} onClick={clickPrevious}>
41
+ <ArrowLeftOutlined className={styles.controlButtonIcon} style={{ fontSize: '16px' }} />
42
+ </div>
43
+ <div className={styles.controlButton} onClick={clickNext} style={{ marginLeft: '-1px' }}>
44
+ <ArrowRightOutlined className={styles.controlButtonIcon} style={{ fontSize: '16px' }} />
45
+ </div>
46
+ </div>
47
+ );
48
+ }
49
+ const children = cases.map(app => {
50
+ const linkDiv = (
51
+ <div className={styles.detailWrapper} style={{ display: app.link ? 'block' : 'none' }}>
52
+ {app.link && app.link.startsWith('http') ? (
53
+ <a className={styles.detail} href={app.link} target="_blank" rel="noopener noreferrer">
54
+ 查看详情
55
+ </a>
56
+ ) : (
57
+ <Link className={styles.detail} to={app.link ? app.link : ''}>
58
+ 查看详情
59
+ </Link>
60
+ )}
61
+ </div>
62
+ );
63
+
64
+ return (
65
+ <div className={styles.appWrapper} key={app.title}>
66
+ <img className={styles.appTeaser} src={app.image} alt={app.title} />
67
+ <div className={styles.appLeft}>
68
+ <div className={styles.appContent}>
69
+ <img
70
+ className={styles.appLogo}
71
+ src={app.logo}
72
+ alt="logo"
73
+ style={{
74
+ borderRadius: app.isAppLogo ? '15px' : '0px',
75
+ boxShadow: app.isAppLogo ? '0px 12px 24px #CED4D9' : '0px 0px 0px',
76
+ }}
77
+ />
78
+ <p className={styles.appTitle}>{app.title}</p>
79
+ <p className={styles.appDescription}>{app.description}</p>
80
+ {linkDiv}
81
+ </div>
82
+ {buttons}
83
+ </div>
84
+ </div>
85
+ );
86
+ });
87
+ return children;
88
+ };
89
+
90
+ const sliderSettings = {
91
+ dots: cases.length > 1,
92
+ infinite: true,
93
+ slidesToShow: 1,
94
+ adaptiveHeight: true,
95
+ speed: 500,
96
+ cssEase: 'linear',
97
+ arrows: false,
98
+ autoplay: true,
99
+ autoplaySpeed: 3000,
100
+ fade: true,
101
+ };
102
+ return (
103
+ <div className={classNames(styles.wrapper, className)} style={style}>
104
+ <Slider
105
+ {...sliderSettings}
106
+ className={styles.slider}
107
+ ref={c => {
108
+ slider = c;
109
+ }}
110
+ >
111
+ {getCases()}
112
+ </Slider>
113
+ </div>
114
+ );
115
+ };
116
+ export default Cases;
@@ -0,0 +1,51 @@
1
+ .card {
2
+ background-color: #fff;
3
+ height: auto;
4
+ .content {
5
+ padding-left: 15.9%;
6
+ padding-right: 15.9%;
7
+ .icon {
8
+ height: 60px;
9
+ }
10
+ .title {
11
+ font-size: 1.714em;
12
+ color: #000;
13
+ margin-top: 40px;
14
+ margin-bottom: 0;
15
+ }
16
+ .description {
17
+ opacity: 0.6;
18
+ width: 100%;
19
+ color: rgba(105, 123, 140, 1);
20
+ font-size: 1em;
21
+ line-height: 1.8em;
22
+ margin-top: 24px;
23
+ margin-bottom: 0;
24
+ }
25
+ }
26
+ }
27
+
28
+ @media (max-width: 768px) {
29
+ .cards {
30
+ .cardWrapper {
31
+ .card {
32
+ margin: 84px 19px 80px 19px;
33
+ .content {
34
+ .icon {
35
+ width: 25.6%;
36
+ }
37
+ .title {
38
+ font-size: 1.4em;
39
+ margin-top: 28px;
40
+ }
41
+ .description {
42
+ font-size: 1em;
43
+ padding-bottom: 0px;
44
+ padding-top: 0px;
45
+ margin-top: 12px;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import classNames from 'classnames';
3
+ // @ts-ignore
4
+ import styles from './FeatureCard.module.less';
5
+
6
+ interface FeatureProps {
7
+ icon: string;
8
+ title: string;
9
+ description: string;
10
+ }
11
+
12
+ const FeatureCard: React.FC<FeatureProps> = ({ icon, title, description }) => {
13
+ return (
14
+ <div className={styles.card}>
15
+ <div className={styles.content}>
16
+ <img className={classNames(styles.icon, 'feature-logo')} src={icon} alt="advantage" />
17
+ <p className={styles.title}>{title}</p>
18
+ <p className={styles.description}>{description}</p>
19
+ </div>
20
+ </div>
21
+ );
22
+ };
23
+
24
+ export default FeatureCard;
@@ -0,0 +1,169 @@
1
+ @import '../mixins';
2
+
3
+ .wrapper {
4
+ display: flex;
5
+ margin: auto;
6
+ position: relative;
7
+ flex-direction: column;
8
+ padding: 0;
9
+ background: rgb(240, 245, 250);
10
+ height: auto;
11
+ overflow-x: hidden;
12
+ .content {
13
+ width: 95.8%;
14
+ height: 100%;
15
+ margin-left: 4.2%;
16
+ margin-bottom: 5%;
17
+ position: relative;
18
+ .container1440;
19
+ }
20
+ .title {
21
+ font-size: 2.8em;
22
+ padding-left: 4.06%;
23
+ font-weight: 500;
24
+ margin: 48px 0 0 0;
25
+ position: relative;
26
+ height: min-content;
27
+ color: #fff;
28
+ }
29
+ .slicerbarv {
30
+ display: none;
31
+ }
32
+ .slicerbarv2 {
33
+ display: none;
34
+ }
35
+ .lefttop {
36
+ background: linear-gradient(130deg, fade(@primary-color, 70%), shade(@primary-color, 20%));
37
+ width: 100%;
38
+ top: 0;
39
+ position: absolute;
40
+ }
41
+ .lefttopWithTitle {
42
+ height: 60%;
43
+ }
44
+ .lefttopWithoutTitle {
45
+ height: 75%;
46
+ }
47
+ .rightbottom {
48
+ position: absolute;
49
+ width: 95.83%;
50
+ left: 4.17%;
51
+ top: 144px;
52
+ background: #fff;
53
+ height: 65%;
54
+ box-shadow: -5px 5px 15px rgba(0, 0, 0, 0.1);
55
+ }
56
+ .rightbottomWithoutTitle {
57
+ top: 48px;
58
+ height: 75%;
59
+ }
60
+ .cardsContainer {
61
+ width: 100%;
62
+ height: 65%;
63
+ margin-top: 48px;
64
+ position: relative;
65
+ .cards {
66
+ display: flex;
67
+ text-align: center;
68
+ position: relative;
69
+ width: -webkit-fill-available;
70
+ flex-wrap: wrap;
71
+ margin-left: 4.06%;
72
+ .cardWrapper {
73
+ margin: 68px 0 93px 0;
74
+ border-right: 1px solid rgba(0, 0, 0, 0.1);
75
+ &:last-child {
76
+ border-right: 0px;
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ .dot {
83
+ position: absolute;
84
+ width: 3px;
85
+ height: 3px;
86
+ border-radius: 50%;
87
+ background: #d8d8d8;
88
+ display: none;
89
+ }
90
+
91
+ @media (max-width: 768px) {
92
+ .wrapper {
93
+ width: 100%;
94
+ .lefttop {
95
+ left: 0px;
96
+ height: 100%;
97
+ width: 100%;
98
+ }
99
+ .rightbottom {
100
+ height: 79.5%;
101
+ margin-top: 48px;
102
+ .slicerbarv {
103
+ position: absolute;
104
+ background-color: #f2f4f5;
105
+ width: 1px;
106
+ height: 100%;
107
+ margin-left: 3%;
108
+ display: block;
109
+ z-index: 1;
110
+ }
111
+ .slicerbarv2 {
112
+ margin-left: 92.2%; // 1 - (0.96 * 0.04 + 0.04)
113
+ }
114
+ .slicerbarh {
115
+ position: absolute;
116
+ background-color: #f2f4f5;
117
+ width: 100%;
118
+ height: 1px;
119
+ display: block;
120
+ margin-top: 45px;
121
+ }
122
+ .slicerbarh2 {
123
+ margin-top: 395px;
124
+ }
125
+ .slicerbarh3 {
126
+ margin-top: 745px;
127
+ }
128
+ .slicerbarh4 {
129
+ margin-top: 1095px;
130
+ }
131
+ }
132
+
133
+ .rightbottomWithoutTitle {
134
+ top: 48px;
135
+ height: 86.5%;
136
+ }
137
+ .lefttopWithTitle {
138
+ height: 95.73%;
139
+ }
140
+ .lefttopWithoutTitle {
141
+ height: 95.73%;
142
+ }
143
+ .content {
144
+ .title {
145
+ font-size: 2.143rem;
146
+ margin: 80px 0 60px 0;
147
+ }
148
+ .cardsContainer {
149
+ margin-bottom: 70px;
150
+ .cards {
151
+ margin-top: 60px;
152
+ margin-left: 3.34%;
153
+ padding-top: 45px;
154
+ padding-bottom: 45px;
155
+ .cardWrapper {
156
+ margin: 68px 0 68px 0;
157
+ width: 100%;
158
+ height: 216px;
159
+ border-right: 0px;
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+ .dot {
166
+ display: block;
167
+ z-index: 2;
168
+ }
169
+ }
@@ -0,0 +1,86 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import React from 'react';
3
+ import { Row, Col } from 'antd';
4
+ import classNames from 'classnames';
5
+
6
+ import FeatureCard from './FeatureCard';
7
+ // @ts-ignore
8
+ import styles from './Features.module.less';
9
+
10
+ interface Card {
11
+ icon: string;
12
+ title: string;
13
+ description: string;
14
+ }
15
+
16
+ interface FeaturesProps {
17
+ title?: string;
18
+ features: Card[];
19
+ className?: string;
20
+ style?: React.CSSProperties;
21
+ id?: string;
22
+ }
23
+
24
+ const Features: React.FC<FeaturesProps> = ({ title, features = [], className, style, id }) => {
25
+ const getCards = () => {
26
+ const children = features.map(card => (
27
+ <Col className={styles.cardWrapper} key={card.title} md={8} xs={24}>
28
+ <FeatureCard {...card} />
29
+ </Col>
30
+ ));
31
+ return children;
32
+ };
33
+
34
+ // for small screen
35
+ const getDots = () => {
36
+ const dots: Array<Record<string, any>> = [];
37
+ const { length } = features;
38
+ const startTop = 45;
39
+ const cardHeight = 350;
40
+ const startLeftPercent = 0.028;
41
+ const rows = length + 1;
42
+ for (let i = 0; i < rows; i += 1) {
43
+ const yOffset = 1;
44
+ const top = `${startTop + cardHeight * i - yOffset}px`;
45
+ const leftColLeft = `${startLeftPercent * 100}%`;
46
+ const rigthColLeft = `${(startLeftPercent + 0.892) * 100}%`;
47
+ dots.push(<div key={`${i}-0`} className={styles.dot} style={{ marginLeft: leftColLeft, marginTop: top }} />);
48
+ dots.push(<div key={`${i}-1`} className={styles.dot} style={{ marginLeft: rigthColLeft, marginTop: top }} />);
49
+ }
50
+
51
+ return dots;
52
+ };
53
+
54
+ return (
55
+ <div id={id} className={classNames(styles.wrapper, className)} style={style}>
56
+ {title ? (
57
+ <div className={classNames(styles.lefttopWithTitle, styles.lefttop)} />
58
+ ) : (
59
+ <div className={classNames(styles.lefttopWithoutTitle, styles.lefttop)} />
60
+ )}
61
+ <div className={title ? styles.rightbottom : classNames(styles.rightbottomWithoutTitle, styles.rightbottom)}>
62
+ <div className={classNames(styles.slicerbar, styles.slicerbarv, styles.slicerbarv1)} />
63
+ <div className={classNames(styles.slicerbar, styles.slicerbarv, styles.slicerbarv2)} />
64
+ <div className={classNames(styles.slicerbar, styles.slicerbarh, styles.slicerbarh1)} />
65
+ <div className={classNames(styles.slicerbar, styles.slicerbarh, styles.slicerbarh2)} />
66
+ <div className={classNames(styles.slicerbar, styles.slicerbarh, styles.slicerbarh3)} />
67
+ <div className={classNames(styles.slicerbar, styles.slicerbarh, styles.slicerbarh4)} />
68
+ {getDots()}
69
+ </div>
70
+ <div className={styles.content}>
71
+ <div key="content">
72
+ <p key="title" className={styles.title}>
73
+ {title}
74
+ </p>
75
+ <div key="block" className={styles.cardsContainer}>
76
+ <Row key="cards" className={styles.cards}>
77
+ {getCards()}
78
+ </Row>
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </div>
83
+ );
84
+ };
85
+
86
+ export default Features;
@@ -0,0 +1,36 @@
1
+ @import '../mixins';
2
+
3
+ .footer {
4
+ font-family: Avenir, @font-family;
5
+
6
+ :global(.rc-footer-container),
7
+ :global(.rc-footer-bottom-container) {
8
+ .container1440;
9
+ }
10
+
11
+ .description {
12
+ opacity: 0.6;
13
+ font-weight: normal;
14
+ margin-left: 0.5em;
15
+ }
16
+
17
+ .bottom {
18
+ display: flex;
19
+ justify-content: space-between;
20
+ font-size: 14px;
21
+
22
+ :global(.anticon),
23
+ a {
24
+ margin-right: 8px;
25
+ color: rgba(255, 255, 255, 0.6);
26
+ }
27
+ }
28
+ }
29
+
30
+ @media only screen and (max-width: 767.99px) {
31
+ .footer {
32
+ .bottom {
33
+ display: block;
34
+ }
35
+ }
36
+ }