diff --git a/public/index.html b/public/index.html
index 9a8ef8f..5d57a79 100644
--- a/public/index.html
+++ b/public/index.html
@@ -8,7 +8,7 @@
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
-
React App
+ Яндекс.Почта
diff --git a/src/app/allLetters/allLetters.css b/src/app/allLetters/allLetters.css
new file mode 100644
index 0000000..b1edb05
--- /dev/null
+++ b/src/app/allLetters/allLetters.css
@@ -0,0 +1,4 @@
+.allLetters {
+ display: inline-block;
+ width: 100%;
+}
diff --git a/src/app/allLetters/allLetters.jsx b/src/app/allLetters/allLetters.jsx
new file mode 100644
index 0000000..915e733
--- /dev/null
+++ b/src/app/allLetters/allLetters.jsx
@@ -0,0 +1,30 @@
+import React, { Component } from 'react';
+
+import './allLetters.css';
+import { Letter } from '../letter';
+
+export class AllLetters extends Component {
+ render() {
+ return (
+
+ {this.props.visibleLetters.map(letter => {
+ return (
+
+ );
+ })}
+
+ );
+ }
+}
diff --git a/src/app/allLetters/index.js b/src/app/allLetters/index.js
new file mode 100644
index 0000000..7e2dfac
--- /dev/null
+++ b/src/app/allLetters/index.js
@@ -0,0 +1 @@
+export * from './allLetters';
diff --git a/src/app/app.css b/src/app/app.css
index 1c4d511..54d20b1 100644
--- a/src/app/app.css
+++ b/src/app/app.css
@@ -1,27 +1,13 @@
.app {
- text-align: center;
+ padding: 25px 3% 2%;
}
-.app-header {
- display: flex;
- min-height: 100vh;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- background-color: #282c34;
- color: #fff;
- font-size: calc(10px + 2vmin);
+@font-face {
+ font-family: HelveticaNeue;
+ src: url(txtStyle/HelveticaNeueCyr-Medium.otf);
}
-.app-link {
- color: #61dafb;
-}
-
-@keyframes app-logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
+@font-face {
+ font-family: HelveticaNeueLight;
+ src: url(txtStyle/HelveticaNeueCyr-Light.otf);
}
diff --git a/src/app/app.jsx b/src/app/app.jsx
index f759eed..5e592bc 100644
--- a/src/app/app.jsx
+++ b/src/app/app.jsx
@@ -1,24 +1,15 @@
import React, { Component } from 'react';
import './app.css';
+import { Header } from './header';
+import { MailInnerContent } from './mailInnerContent';
export class App extends Component {
render() {
return (
);
}
diff --git a/src/app/button/button.css b/src/app/button/button.css
new file mode 100644
index 0000000..59c9060
--- /dev/null
+++ b/src/app/button/button.css
@@ -0,0 +1,29 @@
+.button__textMenu {
+ width: 137px;
+ height: 13px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 10px;
+ margin-bottom: 8px;
+ margin-left: -10px;
+ color: #707070;
+ font-family: HelveticaNeue;
+ font-size: 11px;
+ line-height: 16px;
+ list-style-type: none;
+}
+
+.button__textMenu:hover {
+ background-color: #cdd6e4;
+ border-radius: 3px;
+ color: #555555;
+ font-weight: bold;
+}
+
+.button_unhighlight {
+ color: inherit;
+}
+
+.button__delLine {
+ text-decoration: none;
+}
diff --git a/src/app/button/button.jsx b/src/app/button/button.jsx
new file mode 100644
index 0000000..d773261
--- /dev/null
+++ b/src/app/button/button.jsx
@@ -0,0 +1,15 @@
+import React, { Component } from 'react';
+
+import './button.css';
+
+export class Button extends Component {
+ render() {
+ return (
+
+
+ {this.props.name}
+
+
+ );
+ }
+}
diff --git a/src/app/button/index.js b/src/app/button/index.js
new file mode 100644
index 0000000..eaf5eea
--- /dev/null
+++ b/src/app/button/index.js
@@ -0,0 +1 @@
+export * from './button';
diff --git a/src/app/content/content.css b/src/app/content/content.css
new file mode 100644
index 0000000..994d1ad
--- /dev/null
+++ b/src/app/content/content.css
@@ -0,0 +1,10 @@
+.content {
+ display: inline-block;
+ width: 78%;
+ min-height: 600px;
+ margin-left: 3%;
+ background-color: #ffffff;
+ border-radius: 3px;
+ box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.34);
+ vertical-align: top;
+}
diff --git a/src/app/content/content.jsx b/src/app/content/content.jsx
new file mode 100644
index 0000000..4cc0bc9
--- /dev/null
+++ b/src/app/content/content.jsx
@@ -0,0 +1,27 @@
+import React, { Component } from 'react';
+
+import './content.css';
+import { LettersMenu } from '../lettersMenu';
+import { LetterState } from '../lettersState';
+import { Footer } from '../footer';
+
+export class Content extends Component {
+ render() {
+ return (
+
+
+
+
+
+ );
+ }
+}
diff --git a/src/app/content/index.js b/src/app/content/index.js
new file mode 100644
index 0000000..7b367d1
--- /dev/null
+++ b/src/app/content/index.js
@@ -0,0 +1 @@
+export * from './content';
diff --git a/src/app/footer/footer.css b/src/app/footer/footer.css
new file mode 100644
index 0000000..0484ee2
--- /dev/null
+++ b/src/app/footer/footer.css
@@ -0,0 +1,24 @@
+.footer {
+ width: 100%;
+ height: 37px;
+
+ border-top: solid 1px #e2e2e2;
+}
+
+.footerText__textEndline {
+ height: 12px;
+ margin-right: 45px;
+ color: #9b9b9b;
+ float: right;
+ font-family: HelveticaNeueLight;
+ font-size: 11px;
+ line-height: 40px;
+}
+
+.footerText_unhighlight {
+ color: inherit;
+}
+
+.footerText__delLine {
+ text-decoration: none;
+}
diff --git a/src/app/footer/footer.jsx b/src/app/footer/footer.jsx
new file mode 100644
index 0000000..fd7800f
--- /dev/null
+++ b/src/app/footer/footer.jsx
@@ -0,0 +1,15 @@
+import React, { Component } from 'react';
+
+import './footer.css';
+
+export class Footer extends Component {
+ render() {
+ return (
+
+ );
+ }
+}
diff --git a/src/app/footer/index.js b/src/app/footer/index.js
new file mode 100644
index 0000000..a058eae
--- /dev/null
+++ b/src/app/footer/index.js
@@ -0,0 +1 @@
+export * from './footer';
diff --git a/src/app/header/header.css b/src/app/header/header.css
new file mode 100644
index 0000000..f0eb6e3
--- /dev/null
+++ b/src/app/header/header.css
@@ -0,0 +1,27 @@
+.header {
+ display: inline-block;
+ width: 100%;
+ min-width: 800px;
+ height: 5%;
+}
+
+.header__ypLogo {
+ display: inline-block;
+ width: 200px;
+ margin-left: 11px;
+ font-size: 170%;
+ vertical-align: text-bottom;
+}
+
+.header__burgerMenu {
+ display: inline-block;
+ margin-top: 7px;
+}
+
+.header__line {
+ width: 20px;
+ height: 3px;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ background-color: #000000;
+}
diff --git a/src/app/header/header.jsx b/src/app/header/header.jsx
new file mode 100644
index 0000000..4affdef
--- /dev/null
+++ b/src/app/header/header.jsx
@@ -0,0 +1,21 @@
+import React, { Component } from 'react';
+
+import './header.css';
+import { Search } from '../search';
+import logo from '../images/header-logo.svg';
+
+export class Header extends Component {
+ render() {
+ return (
+
+
+
+
+
+ );
+ }
+}
diff --git a/src/app/header/index.js b/src/app/header/index.js
new file mode 100644
index 0000000..677ca79
--- /dev/null
+++ b/src/app/header/index.js
@@ -0,0 +1 @@
+export * from './header';
diff --git a/src/app/images/cross.png b/src/app/images/cross.png
new file mode 100644
index 0000000..7765268
Binary files /dev/null and b/src/app/images/cross.png differ
diff --git a/src/app/images/header-logo.svg b/src/app/images/header-logo.svg
new file mode 100644
index 0000000..db23b2d
--- /dev/null
+++ b/src/app/images/header-logo.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/src/app/images/logo.jpg b/src/app/images/logo.jpg
new file mode 100644
index 0000000..8743b99
Binary files /dev/null and b/src/app/images/logo.jpg differ
diff --git a/src/app/leftMenu/index.js b/src/app/leftMenu/index.js
new file mode 100644
index 0000000..45e2691
--- /dev/null
+++ b/src/app/leftMenu/index.js
@@ -0,0 +1 @@
+export * from './leftMenu';
diff --git a/src/app/leftMenu/leftMenu.css b/src/app/leftMenu/leftMenu.css
new file mode 100644
index 0000000..d8f6caa
--- /dev/null
+++ b/src/app/leftMenu/leftMenu.css
@@ -0,0 +1,28 @@
+.leftMenu {
+ display: inline-block;
+ width: 147px;
+ height: 100%;
+ vertical-align: top;
+}
+
+.leftMenu__button {
+ width: 147px;
+ height: 32px;
+ margin-bottom: 8px;
+
+ border: #6287bd;
+ background-color: #6287bd;
+ border-radius: 3px;
+}
+
+.leftMenu__textWrite {
+ display: inline-block;
+ width: 56px;
+ height: 15px;
+ margin-top: 7px;
+ margin-bottom: 10px;
+ color: #ffffff;
+ font-family: HelveticaNeue;
+ font-size: 12px;
+ vertical-align: center;
+}
diff --git a/src/app/leftMenu/leftMenu.jsx b/src/app/leftMenu/leftMenu.jsx
new file mode 100644
index 0000000..f91a36e
--- /dev/null
+++ b/src/app/leftMenu/leftMenu.jsx
@@ -0,0 +1,17 @@
+import React, { Component } from 'react';
+
+import './leftMenu.css';
+import { MailMenu } from '../mailMenu';
+
+export class LeftMenu extends Component {
+ render() {
+ return (
+
+
+
+
+ );
+ }
+}
diff --git a/src/app/letter/index.js b/src/app/letter/index.js
new file mode 100644
index 0000000..c37f80d
--- /dev/null
+++ b/src/app/letter/index.js
@@ -0,0 +1 @@
+export * from './letter';
diff --git a/src/app/letter/letter.css b/src/app/letter/letter.css
new file mode 100644
index 0000000..1be3627
--- /dev/null
+++ b/src/app/letter/letter.css
@@ -0,0 +1,126 @@
+.letter {
+ width: 100%;
+ height: 37px;
+
+ border-bottom: solid 1px #e2e2e2;
+}
+
+.letter__animatedAddLetter {
+ animation-duration: 2s;
+ animation-name: add-new-letter;
+}
+
+.letter__animatedDeleteLetter {
+ animation-duration: 1s;
+ animation-name: delete-letter;
+}
+
+.letter__checkbox {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ padding: 2px;
+ margin-top: 11px;
+ margin-left: 20px;
+
+ border: solid 1px rgba(0, 0, 0, 0.15);
+ -webkit-appearance: none;
+ background-color: #ffffff;
+ border-radius: 3px;
+ outline: none;
+ vertical-align: top;
+}
+
+.letter__checkbox:checked {
+ display: inline-block;
+ background: #e2e2e2;
+ background-clip: content-box;
+}
+
+.letter__delLine {
+ text-decoration: none;
+}
+
+.letter__yLogo {
+ display: inline-block;
+ width: 37px;
+ margin-left: 10px;
+ border-radius: 50%;
+}
+
+.letter_isBold {
+ font-weight: bold;
+}
+
+.letter__textSenderLetter {
+ display: inline-block;
+ overflow: hidden;
+ width: 20%;
+ height: 15px;
+ margin-top: 12px;
+ margin-left: 10px;
+ color: #000000;
+ font-family: HelveticaNeue;
+ font-size: 13px;
+ text-overflow: ellipsis;
+ vertical-align: top;
+ white-space: nowrap;
+}
+
+.letter__textLetter {
+ display: inline-block;
+ overflow: hidden;
+ width: 40%;
+ height: 15px;
+ margin-top: 12px;
+ margin-left: 10px;
+ color: #000000;
+ font-family: HelveticaNeue;
+ font-size: 13px;
+ text-overflow: ellipsis;
+ vertical-align: top;
+ white-space: nowrap;
+}
+
+.letter__markNewLetter {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin-top: 14px;
+ margin-left: 20px;
+ background-color: #6287bd;
+ border-radius: 50%;
+ vertical-align: top;
+}
+
+.letter__data {
+ width: 8%;
+ height: 15px;
+ margin-top: 11px;
+ margin-right: 20px;
+ color: #9b9b9b;
+ float: right;
+ font-family: HelveticaNeue;
+ font-size: 13px;
+ text-align: right;
+}
+
+@keyframes delete-letter {
+ from {
+ opacity: 100%;
+ }
+
+ to {
+ opacity: 0;
+ }
+}
+
+@keyframes add-new-letter {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 100%;
+ }
+}
diff --git a/src/app/letter/letter.jsx b/src/app/letter/letter.jsx
new file mode 100644
index 0000000..968b50a
--- /dev/null
+++ b/src/app/letter/letter.jsx
@@ -0,0 +1,49 @@
+import React, { Component } from 'react';
+
+import './letter.css';
+import logo from '../images/logo.jpg';
+
+export class Letter extends Component {
+ constructor(props) {
+ super(props);
+
+ this.changeAnimation = this.changeAnimation.bind(this);
+ }
+
+ changeAnimation() {
+ if (this.props.changeAnimation) {
+ this.props.deleteChosenLetter(this.props.id);
+ }
+ }
+
+ render() {
+ return (
+
+ );
+ }
+}
diff --git a/src/app/lettersMenu/index.js b/src/app/lettersMenu/index.js
new file mode 100644
index 0000000..9dd0de6
--- /dev/null
+++ b/src/app/lettersMenu/index.js
@@ -0,0 +1 @@
+export * from './lettersMenu';
diff --git a/src/app/lettersMenu/lettersMenu.css b/src/app/lettersMenu/lettersMenu.css
new file mode 100644
index 0000000..a2f84f4
--- /dev/null
+++ b/src/app/lettersMenu/lettersMenu.css
@@ -0,0 +1,55 @@
+.lettersMenu {
+ width: 100%;
+ height: 37px;
+ padding: 0;
+ margin: 0;
+
+ border-bottom: solid 1px #e2e2e2;
+}
+
+.lettersMenu__checkbox {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ padding: 2px;
+ margin-top: 11px;
+ margin-left: 20px;
+
+ border: solid 1px rgba(0, 0, 0, 0.15);
+ -webkit-appearance: none;
+ background-color: #ffffff;
+ border-radius: 3px;
+ outline: none;
+ vertical-align: top;
+}
+
+.lettersMenu__checkbox:checked {
+ display: inline-block;
+ background: #e2e2e2;
+ background-clip: content-box;
+}
+
+.lettersMenu__horizontalPosition {
+ display: inline;
+ list-style-type: none;
+}
+
+.lettersMenu__button__textTitle {
+ display: inline-block;
+ height: 16px;
+ margin-top: 11px;
+ margin-left: 25px;
+
+ border: none;
+ background: none;
+ color: #cccccc;
+ font-family: HelveticaNeue;
+ font-size: 13px;
+ line-height: 20px;
+ outline: none;
+ vertical-align: top;
+}
+
+.lettersMenu__button__delLine {
+ text-decoration: none;
+}
diff --git a/src/app/lettersMenu/lettersMenu.jsx b/src/app/lettersMenu/lettersMenu.jsx
new file mode 100644
index 0000000..8803d89
--- /dev/null
+++ b/src/app/lettersMenu/lettersMenu.jsx
@@ -0,0 +1,46 @@
+import React, { Component } from 'react';
+
+import './lettersMenu.css';
+
+export class LettersMenu extends Component {
+ render() {
+ return (
+
+ );
+ }
+}
diff --git a/src/app/lettersState/index.js b/src/app/lettersState/index.js
new file mode 100644
index 0000000..32f343b
--- /dev/null
+++ b/src/app/lettersState/index.js
@@ -0,0 +1 @@
+export * from './letterState';
diff --git a/src/app/lettersState/letterState.css b/src/app/lettersState/letterState.css
new file mode 100644
index 0000000..9591015
--- /dev/null
+++ b/src/app/lettersState/letterState.css
@@ -0,0 +1,8 @@
+.letterState {
+ width: 100%;
+ min-height: 524px;
+}
+
+.letterState_show:target {
+ display: inline-block;
+}
diff --git a/src/app/lettersState/letterState.jsx b/src/app/lettersState/letterState.jsx
new file mode 100644
index 0000000..bba3f68
--- /dev/null
+++ b/src/app/lettersState/letterState.jsx
@@ -0,0 +1,49 @@
+import React, { Component } from 'react';
+
+import './letterState.css';
+import { OpenLetter } from '../openLetter';
+import { AllLetters } from '../allLetters';
+
+export class LetterState extends Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ openLetter: false,
+ contentLetter: ''
+ };
+ this.closeLetter = this.closeLetter.bind(this);
+ this.openLetter = this.openLetter.bind(this);
+ }
+
+ openLetter(text) {
+ this.setState({
+ openLetter: true,
+ contentLetter: text
+ });
+ }
+
+ closeLetter() {
+ this.setState({
+ openLetter: false
+ });
+ }
+
+ render() {
+ return this.state.openLetter ? (
+
+
+
+ ) : (
+
+ );
+ }
+}
diff --git a/src/app/mailInnerContent/index.js b/src/app/mailInnerContent/index.js
new file mode 100644
index 0000000..1babe3c
--- /dev/null
+++ b/src/app/mailInnerContent/index.js
@@ -0,0 +1 @@
+export * from './mailInnerContent';
diff --git a/src/app/mailInnerContent/mailInnerContent.css b/src/app/mailInnerContent/mailInnerContent.css
new file mode 100644
index 0000000..156ad4a
--- /dev/null
+++ b/src/app/mailInnerContent/mailInnerContent.css
@@ -0,0 +1,7 @@
+.mailInnerContent {
+ display: inline-block;
+ width: 100%;
+ min-width: 800px;
+ height: 90%;
+ padding-top: 13px;
+}
diff --git a/src/app/mailInnerContent/mailInnerContent.jsx b/src/app/mailInnerContent/mailInnerContent.jsx
new file mode 100644
index 0000000..4e819c8
--- /dev/null
+++ b/src/app/mailInnerContent/mailInnerContent.jsx
@@ -0,0 +1,164 @@
+import React, { Component } from 'react';
+
+import './mailInnerContent.css';
+import { LeftMenu } from '../leftMenu';
+import { Content } from '../content';
+import {
+ generateDate,
+ generateName,
+ generateContent,
+ generateRandomCount
+} from './scripts/letterGeneratorUtils';
+
+const MAX_COUNT = 30;
+
+export class MailInnerContent extends Component {
+ static async generateLetter() {
+ const author = generateName();
+ const text = await generateContent();
+ const subject = text[0].substr(0, 45);
+ const date = generateDate();
+ return { author, text, subject, date };
+ }
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ counter: 0,
+ letters: [],
+ visibleLetters: [],
+ selectAll: false,
+ markedLetters: {}
+ };
+ this.deleteChosenLetter = this.deleteChosenLetter.bind(this);
+ this.markLettersToDelete = this.markLettersToDelete.bind(this);
+ this.switchLetterCheckbox = this.switchLetterCheckbox.bind(this);
+ this.chooseAllLetters = this.chooseAllLetters.bind(this);
+ this.newMail = this.newMail.bind(this);
+ this.GenerateNewLetter();
+ }
+
+ deleteChosenLetter(id) {
+ let count = 0;
+ const tmpVisibleLetters = [];
+ const tmpLetters = this.state.letters.filter(letter => letter.id !== id);
+ tmpLetters.forEach(letter => {
+ const tmp = letter;
+ if (MAX_COUNT > count) {
+ tmpVisibleLetters.push(tmp);
+ count++;
+ }
+ });
+ this.setState(() => {
+ return { letters: tmpLetters, visibleLetters: tmpVisibleLetters };
+ });
+ }
+
+ chooseAllLetters() {
+ const tmpVisibleLetters = this.state.visibleLetters;
+ const newMarkedLetters = this.state.markedLetters;
+ for (let i = 0; i < tmpVisibleLetters.length; i++) {
+ newMarkedLetters[tmpVisibleLetters[i].id] = !this.state.selectAll;
+ }
+ this.setState(state => {
+ return {
+ visibleLetters: tmpVisibleLetters,
+ selectAll: !state.selectAll,
+ markedLetters: newMarkedLetters
+ };
+ });
+ }
+
+ async newMail() {
+ const { author, text, subject, date } = await MailInnerContent.generateLetter();
+ const newMarkedLetters = this.state.markedLetters;
+ const id = `${this.state.counter}`;
+ this.setState(state => {
+ return { counter: state.counter + 1 };
+ });
+ newMarkedLetters[id] = false;
+ const tmpLetters = this.state.letters;
+ const tmpVisibleLetters = [];
+ const letter = {
+ id,
+ author,
+ subject,
+ text,
+ date,
+ changeAnimation: false,
+ isSelected: false
+ };
+ tmpVisibleLetters.push(letter);
+ for (let i = 0; i < tmpLetters.length; i++) {
+ if (i < MAX_COUNT - 1) {
+ tmpVisibleLetters.push(tmpLetters[i]);
+ }
+ }
+ this.setState(state => {
+ return {
+ visibleLetters: tmpVisibleLetters,
+ letters: [letter].concat(state.letters),
+ markedLetters: newMarkedLetters
+ };
+ });
+ }
+
+ sleep(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+ }
+
+ async GenerateNewLetter() {
+ const fiveMinute = 300000;
+ const minTime = 10;
+ const maxTime = 600000;
+ let previous = 300000;
+ await this.newMail();
+ previous = Math.max(fiveMinute - previous, generateRandomCount(minTime, maxTime));
+ await this.sleep(previous);
+ this.GenerateNewLetter();
+ }
+
+ markLettersToDelete() {
+ const tmpLetters = this.state.letters;
+ const tmpVisibleLetters = this.state.visibleLetters;
+ for (let i = 0; i < tmpLetters.length; i++) {
+ if (this.state.markedLetters[tmpLetters[i].id]) {
+ tmpVisibleLetters[i].changeAnimation = true;
+ tmpLetters[i].changeAnimation = true;
+ }
+ }
+ this.setState(() => {
+ return {
+ visibleLetters: tmpVisibleLetters,
+ letters: tmpLetters,
+ selectAll: false
+ };
+ });
+ }
+
+ switchLetterCheckbox(id) {
+ const newMarkedLetters = this.state.markedLetters;
+ newMarkedLetters[id] = !newMarkedLetters[id];
+ this.setState(() => {
+ return { markedLetters: newMarkedLetters };
+ });
+ }
+
+ render() {
+ return (
+
+
+
+
+ );
+ }
+}
diff --git a/src/app/mailInnerContent/scripts/letterGeneratorUtils.js b/src/app/mailInnerContent/scripts/letterGeneratorUtils.js
new file mode 100644
index 0000000..87a1ff5
--- /dev/null
+++ b/src/app/mailInnerContent/scripts/letterGeneratorUtils.js
@@ -0,0 +1,95 @@
+const months = ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'];
+
+const names = [
+ 'Фотин',
+ 'Евтихий',
+ 'Азарий',
+ 'Фетис',
+ 'Полиевкт',
+ 'Борислав',
+ 'Кассиан',
+ 'Юст',
+ 'Мартьян',
+ 'Капитон',
+ 'Никандр',
+ 'Эрнест',
+ 'Петроний',
+ 'Иезекииль',
+ 'Харитон',
+ 'Севастиан',
+ 'Орест',
+ 'Вит',
+ 'Василий',
+ 'Гордей',
+ 'Максим',
+ 'Павлин',
+ 'Захар',
+ 'Владилен',
+ 'Наум',
+ 'Алипий',
+ 'Меркурий',
+ 'Феоктист',
+ 'Овдоким',
+ 'Феофил'
+];
+
+const surnames = [
+ 'Чашников',
+ 'Березников',
+ 'Руликовский',
+ 'Ляпишев',
+ 'Оффенберг',
+ 'Шипов',
+ 'Арнаутов',
+ 'Машковцев',
+ 'Столыпин',
+ 'Шереметьев',
+ 'Яворский',
+ 'Рындин',
+ 'Лонгинов',
+ 'Ададуров',
+ 'Нечаев',
+ 'Габаев',
+ 'Маткевич',
+ 'Маковский',
+ 'Юрасовский',
+ 'Ващенко',
+ 'Кобылин',
+ 'Карандеев',
+ 'Золотарёв',
+ 'Голицын',
+ 'Игнатьев',
+ 'Байчуров',
+ 'Бурдуков',
+ 'Болтенков',
+ 'Михеев',
+ 'Храпов'
+];
+
+export const generateRandomCount = (from, to) => {
+ return Math.floor(Math.random() * (to - from) + from);
+};
+
+const getRandomObj = (array) => {
+ return array[generateRandomCount(0, array.length)];
+};
+
+export const generateName = () => {
+ const name = getRandomObj(names);
+ const surname = getRandomObj(surnames);
+ return `${name} ${surname}`;
+};
+
+export const generateContent = async () => {
+ const paragraphsCount = generateRandomCount(3, 10);
+
+ const text = await fetch(
+ `https://baconipsum.com/api/?type=meat&formaat=json¶s=${paragraphsCount}`
+ );
+ return text.json();
+};
+
+export const generateDate = () => {
+ const date = new Date();
+ return `${date.getDate()} ${months[date.getMonth()]}`;
+};
diff --git a/src/app/mailMenu/index.js b/src/app/mailMenu/index.js
new file mode 100644
index 0000000..7451256
--- /dev/null
+++ b/src/app/mailMenu/index.js
@@ -0,0 +1 @@
+export * from './mailMenu';
diff --git a/src/app/mailMenu/mailMenu.css b/src/app/mailMenu/mailMenu.css
new file mode 100644
index 0000000..0a08017
--- /dev/null
+++ b/src/app/mailMenu/mailMenu.css
@@ -0,0 +1,5 @@
+.mailMenu__actionsBlock {
+ width: 100%;
+ margin-top: 0;
+ margin-left: -30px;
+}
diff --git a/src/app/mailMenu/mailMenu.jsx b/src/app/mailMenu/mailMenu.jsx
new file mode 100644
index 0000000..48c3cfe
--- /dev/null
+++ b/src/app/mailMenu/mailMenu.jsx
@@ -0,0 +1,19 @@
+import React, { Component } from 'react';
+
+import './mailMenu.css';
+import { Button } from '../button';
+
+export class MailMenu extends Component {
+ render() {
+ return (
+
+ );
+ }
+}
diff --git a/src/app/openLetter/index.js b/src/app/openLetter/index.js
new file mode 100644
index 0000000..3406e12
--- /dev/null
+++ b/src/app/openLetter/index.js
@@ -0,0 +1 @@
+export * from './openLetter';
diff --git a/src/app/openLetter/openLetter.css b/src/app/openLetter/openLetter.css
new file mode 100644
index 0000000..a150fe3
--- /dev/null
+++ b/src/app/openLetter/openLetter.css
@@ -0,0 +1,22 @@
+.openLetter__close {
+ margin-top: 10px;
+ margin-right: 10px;
+ float: right;
+}
+
+.openLetter__delLine {
+ text-decoration: none;
+}
+
+.openLetter__cross {
+ width: 15px;
+ height: 15px;
+ margin-top: -8px;
+ margin-right: 10px;
+ float: right;
+ opacity: 0.15;
+}
+
+.openLetter__textLetter {
+ margin: 30px;
+}
diff --git a/src/app/openLetter/openLetter.jsx b/src/app/openLetter/openLetter.jsx
new file mode 100644
index 0000000..088ea3c
--- /dev/null
+++ b/src/app/openLetter/openLetter.jsx
@@ -0,0 +1,19 @@
+import React, { Component } from 'react';
+
+import './openLetter.css';
+import cross from '../images/cross.png';
+
+export class OpenLetter extends Component {
+ render() {
+ return (
+
+
+
+
+
{this.props.contentLetter.map((paragraph) => {
+ return
{paragraph}
;
+ })}
+
+ );
+ }
+}
diff --git a/src/app/search/index.js b/src/app/search/index.js
new file mode 100644
index 0000000..5a2bdeb
--- /dev/null
+++ b/src/app/search/index.js
@@ -0,0 +1 @@
+export * from './search';
diff --git a/src/app/search/search.css b/src/app/search/search.css
new file mode 100644
index 0000000..7d55b6a
--- /dev/null
+++ b/src/app/search/search.css
@@ -0,0 +1,32 @@
+.search {
+ display: inline-block;
+ width: 40%;
+ height: 32px;
+ margin-left: 14%;
+ background-color: #ffffff;
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2);
+ opacity: 0.5;
+ vertical-align: text-bottom;
+}
+
+.search__textSearch {
+ width: 90%;
+ height: 100%;
+ padding-left: 10px;
+
+ border: none;
+ -webkit-appearance: none;
+ background: none;
+ color: #000000;
+ font-size: 15px;
+ outline: none;
+}
+
+.search__cross {
+ width: 9px;
+ height: 9px;
+ margin-top: 12px;
+ margin-right: 10px;
+ float: right;
+ opacity: 0.15;
+}
diff --git a/src/app/search/search.jsx b/src/app/search/search.jsx
new file mode 100644
index 0000000..9271796
--- /dev/null
+++ b/src/app/search/search.jsx
@@ -0,0 +1,15 @@
+import React, { Component } from 'react';
+
+import './search.css';
+import cross from '../images/cross.png';
+
+export class Search extends Component {
+ render() {
+ return (
+
+
+

+
+ );
+ }
+}
diff --git a/src/app/txtStyle/HelveticaNeueCyr-Light.otf b/src/app/txtStyle/HelveticaNeueCyr-Light.otf
new file mode 100644
index 0000000..7ced49a
Binary files /dev/null and b/src/app/txtStyle/HelveticaNeueCyr-Light.otf differ
diff --git a/src/app/txtStyle/HelveticaNeueCyr-Medium.otf b/src/app/txtStyle/HelveticaNeueCyr-Medium.otf
new file mode 100644
index 0000000..a2cde16
Binary files /dev/null and b/src/app/txtStyle/HelveticaNeueCyr-Medium.otf differ
diff --git a/src/app/txtStyle/YandexSansDisplay-Thin.ttf b/src/app/txtStyle/YandexSansDisplay-Thin.ttf
new file mode 100644
index 0000000..3b8e196
Binary files /dev/null and b/src/app/txtStyle/YandexSansDisplay-Thin.ttf differ
diff --git a/src/index.css b/src/index.css
index 2b6e525..74897da 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,10 +1,5 @@
body {
- padding: 0;
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',
- 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
+ background-color: #e5eaf0;
}
code {