├── .gitignore ├── .prettierrc ├── src ├── static │ ├── robots.txt │ ├── social.png │ ├── favicon.ico │ ├── favicon.png │ ├── logo138.png │ ├── privacy-policy-en.pdf │ ├── privacy-policy-ru.pdf │ ├── _redirects │ ├── favicon.svg │ └── 404.html ├── components │ ├── organisms │ │ ├── Company │ │ │ ├── fs-no.avif │ │ │ ├── fs-no.jpg │ │ │ ├── fs-no.webp │ │ │ ├── flatstack.jpg │ │ │ ├── fs-warsaw.jpg │ │ │ ├── flatstack.avif │ │ │ ├── flatstack.webp │ │ │ ├── flatstack2x.avif │ │ │ ├── fs-antalya.avif │ │ │ ├── fs-antalya.jpg │ │ │ ├── fs-antalya.webp │ │ │ ├── fs-warsaw.avif │ │ │ ├── fs-warsaw.webp │ │ │ ├── index.jsx │ │ │ └── Content.jsx │ │ ├── Hero │ │ │ ├── title-bg.jpg │ │ │ ├── title-bg.webp │ │ │ ├── index.jsx │ │ │ └── Content.jsx │ │ ├── Join │ │ │ ├── hr-photo.avif │ │ │ ├── hr-photo.jpg │ │ │ ├── hr-photo.webp │ │ │ ├── SuccessModal.jsx │ │ │ ├── HrDecoratedPhoto.jsx │ │ │ └── index.jsx │ │ ├── Relocation │ │ │ ├── image.avif │ │ │ ├── image.jpg │ │ │ ├── image.webp │ │ │ ├── index.jsx │ │ │ └── Content.jsx │ │ ├── Warsaw │ │ │ ├── office_700.jpg │ │ │ ├── office_1400.avif │ │ │ ├── office_1400.jpg │ │ │ ├── office_1400.webp │ │ │ ├── office_700.avif │ │ │ ├── office_700.webp │ │ │ ├── index.jsx │ │ │ └── Content.jsx │ │ ├── Feedbacks │ │ │ ├── alina_128.avif │ │ │ ├── alina_128.jpg │ │ │ ├── alina_128.webp │ │ │ ├── alina_64.avif │ │ │ ├── alina_64.jpg │ │ │ ├── alina_64.webp │ │ │ ├── arkadey_64.jpg │ │ │ ├── askar_128.avif │ │ │ ├── askar_128.jpg │ │ │ ├── askar_128.webp │ │ │ ├── askar_64.avif │ │ │ ├── askar_64.jpg │ │ │ ├── askar_64.webp │ │ │ ├── dmitry_128.jpg │ │ │ ├── dmitry_64.avif │ │ │ ├── dmitry_64.jpg │ │ │ ├── dmitry_64.webp │ │ │ ├── arkadey_128.avif │ │ │ ├── arkadey_128.jpg │ │ │ ├── arkadey_128.webp │ │ │ ├── arkadey_64.avif │ │ │ ├── arkadey_64.webp │ │ │ ├── dmitry_128.avif │ │ │ ├── dmitry_128.webp │ │ │ ├── index.jsx │ │ │ ├── FeedbackCard.jsx │ │ │ └── Content.jsx │ │ ├── Header │ │ │ ├── index.jsx │ │ │ ├── Content.jsx │ │ │ └── LogoSvg.jsx │ │ ├── Vacancy │ │ │ ├── index.jsx │ │ │ └── Content.jsx │ │ └── Footer │ │ │ ├── index.jsx │ │ │ └── Content.jsx │ ├── atoms │ │ ├── Container.jsx │ │ ├── List.jsx │ │ ├── ButtonLink.jsx │ │ ├── RequiredFormText.jsx │ │ ├── Card.jsx │ │ ├── Input.jsx │ │ ├── Link.jsx │ │ └── Button.jsx │ ├── icons │ │ ├── CloseIcon.jsx │ │ ├── AlertIcon.jsx │ │ ├── FacebookIcon.jsx │ │ ├── LoadingIcon.jsx │ │ ├── MediumIcon.jsx │ │ ├── TwitterIcon.jsx │ │ ├── LinkedInIcon.jsx │ │ ├── EmailIcon.jsx │ │ ├── GitHubIcon.jsx │ │ ├── TelegramIcon.jsx │ │ └── InstagramIcon.jsx │ ├── molecules │ │ ├── Alert.jsx │ │ ├── Section.jsx │ │ ├── RecommendButton │ │ │ ├── HiddenFormForNetlify.jsx │ │ │ ├── index.jsx │ │ │ ├── RecommendModal.jsx │ │ │ └── RecommendForm.jsx │ │ ├── ShareButton │ │ │ ├── index.jsx │ │ │ └── ShareModal.jsx │ │ └── Modal.jsx │ ├── L10nContext.jsx │ └── Page.jsx ├── config.js ├── theme.js ├── webpack-templates │ └── index.js ├── index-en.jsx ├── Document.jsx ├── render.js ├── hooks │ └── useOnClickHydrate.js └── locales │ └── en.js ├── .browserslistrc ├── .editorconfig ├── README.md ├── .eslintrc ├── stylelint.config.js ├── LICENSE ├── babel.config.js ├── .github └── workflows │ └── ci.yml ├── lighthouserc.json ├── package.json ├── webpack.config.js └── PatchHtmlWebpackPluginPlugin.js /.gitignore: -------------------------------------------------------------------------------- 1 | .snowpack 2 | dist 3 | node_modules 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } 5 | -------------------------------------------------------------------------------- /src/static/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | 3 | User-agent: * 4 | Allow: / 5 | -------------------------------------------------------------------------------- /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 4 Chrome version 3 | last 4 Firefox version 4 | not dead 5 | -------------------------------------------------------------------------------- /src/static/social.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/static/social.png -------------------------------------------------------------------------------- /src/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/static/favicon.ico -------------------------------------------------------------------------------- /src/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/static/favicon.png -------------------------------------------------------------------------------- /src/static/logo138.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/static/logo138.png -------------------------------------------------------------------------------- /src/static/privacy-policy-en.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/static/privacy-policy-en.pdf -------------------------------------------------------------------------------- /src/static/privacy-policy-ru.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/static/privacy-policy-ru.pdf -------------------------------------------------------------------------------- /src/components/organisms/Company/fs-no.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/fs-no.avif -------------------------------------------------------------------------------- /src/components/organisms/Company/fs-no.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/fs-no.jpg -------------------------------------------------------------------------------- /src/components/organisms/Company/fs-no.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/fs-no.webp -------------------------------------------------------------------------------- /src/components/organisms/Hero/title-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Hero/title-bg.jpg -------------------------------------------------------------------------------- /src/components/organisms/Hero/title-bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Hero/title-bg.webp -------------------------------------------------------------------------------- /src/components/organisms/Join/hr-photo.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Join/hr-photo.avif -------------------------------------------------------------------------------- /src/components/organisms/Join/hr-photo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Join/hr-photo.jpg -------------------------------------------------------------------------------- /src/components/organisms/Join/hr-photo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Join/hr-photo.webp -------------------------------------------------------------------------------- /src/components/organisms/Company/flatstack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/flatstack.jpg -------------------------------------------------------------------------------- /src/components/organisms/Company/fs-warsaw.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/fs-warsaw.jpg -------------------------------------------------------------------------------- /src/components/organisms/Relocation/image.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Relocation/image.avif -------------------------------------------------------------------------------- /src/components/organisms/Relocation/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Relocation/image.jpg -------------------------------------------------------------------------------- /src/components/organisms/Relocation/image.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Relocation/image.webp -------------------------------------------------------------------------------- /src/components/organisms/Warsaw/office_700.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Warsaw/office_700.jpg -------------------------------------------------------------------------------- /src/components/organisms/Company/flatstack.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/flatstack.avif -------------------------------------------------------------------------------- /src/components/organisms/Company/flatstack.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/flatstack.webp -------------------------------------------------------------------------------- /src/components/organisms/Company/flatstack2x.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/flatstack2x.avif -------------------------------------------------------------------------------- /src/components/organisms/Company/fs-antalya.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/fs-antalya.avif -------------------------------------------------------------------------------- /src/components/organisms/Company/fs-antalya.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/fs-antalya.jpg -------------------------------------------------------------------------------- /src/components/organisms/Company/fs-antalya.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/fs-antalya.webp -------------------------------------------------------------------------------- /src/components/organisms/Company/fs-warsaw.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/fs-warsaw.avif -------------------------------------------------------------------------------- /src/components/organisms/Company/fs-warsaw.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Company/fs-warsaw.webp -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/alina_128.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/alina_128.avif -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/alina_128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/alina_128.jpg -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/alina_128.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/alina_128.webp -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/alina_64.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/alina_64.avif -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/alina_64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/alina_64.jpg -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/alina_64.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/alina_64.webp -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/arkadey_64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/arkadey_64.jpg -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/askar_128.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/askar_128.avif -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/askar_128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/askar_128.jpg -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/askar_128.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/askar_128.webp -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/askar_64.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/askar_64.avif -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/askar_64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/askar_64.jpg -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/askar_64.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/askar_64.webp -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/dmitry_128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/dmitry_128.jpg -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/dmitry_64.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/dmitry_64.avif -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/dmitry_64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/dmitry_64.jpg -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/dmitry_64.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/dmitry_64.webp -------------------------------------------------------------------------------- /src/components/organisms/Warsaw/office_1400.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Warsaw/office_1400.avif -------------------------------------------------------------------------------- /src/components/organisms/Warsaw/office_1400.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Warsaw/office_1400.jpg -------------------------------------------------------------------------------- /src/components/organisms/Warsaw/office_1400.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Warsaw/office_1400.webp -------------------------------------------------------------------------------- /src/components/organisms/Warsaw/office_700.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Warsaw/office_700.avif -------------------------------------------------------------------------------- /src/components/organisms/Warsaw/office_700.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Warsaw/office_700.webp -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/arkadey_128.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/arkadey_128.avif -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/arkadey_128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/arkadey_128.jpg -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/arkadey_128.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/arkadey_128.webp -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/arkadey_64.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/arkadey_64.avif -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/arkadey_64.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/arkadey_64.webp -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/dmitry_128.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/dmitry_128.avif -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/dmitry_128.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fs/flatstack-warsaw/main/src/components/organisms/Feedbacks/dmitry_128.webp -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | -------------------------------------------------------------------------------- /src/static/_redirects: -------------------------------------------------------------------------------- 1 | https://flatstack-warsaw.netlify.app/* https://warsaw.flatstack.com/:splat 301! 2 | /index.html / 301! 3 | /js/script.js https://plausible.io/js/plausible.js 200 4 | /api/event https://plausible.io/api/event 202 5 | -------------------------------------------------------------------------------- /src/components/atoms/Container.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const Container = styled.div` 4 | width: 100%; 5 | max-width: 75em; 6 | margin: 0 auto; 7 | padding-right: 1em; 8 | padding-left: 1em; 9 | `; 10 | 11 | export default Container; 12 | -------------------------------------------------------------------------------- /src/components/atoms/List.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const List = styled.ul` 4 | margin: 1em 0; 5 | padding: 0 0 0 2em; 6 | 7 | list-style: disc; 8 | `; 9 | 10 | List.Item = styled.li` 11 | margin: 0 0 0.5em 0; 12 | `; 13 | 14 | export default List; 15 | -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | sectionIds: { 3 | join: 'join-section', 4 | vacancy: 'vacancy-section', 5 | warsaw: 'warsaw-section', 6 | relocation: 'relocation-section', 7 | feedbacks: 'feedbacks-section', 8 | company: 'company-section', 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /src/components/atoms/ButtonLink.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import Button from './Button'; 3 | 4 | const ButtonLink = styled(Button).attrs(() => ({ 5 | as: 'a', 6 | }))``; 7 | 8 | export { variants, paddingVariants } from './Button'; 9 | 10 | export default ButtonLink; 11 | -------------------------------------------------------------------------------- /src/theme.js: -------------------------------------------------------------------------------- 1 | export default { 2 | colors: { 3 | accent: '#e00519', 4 | accentPale: '#faecec', 5 | primary: '#f3f3f3', 6 | secondary: '#c4c4c4', 7 | text: '#000000', 8 | invertedText: '#ffffff', 9 | paleText: '#4e4e4e', 10 | outline: '#086cea', 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /src/components/organisms/Header/index.jsx: -------------------------------------------------------------------------------- 1 | const Content = 2 | typeof window === 'undefined' ? require('./Content').default : () => null; 3 | 4 | const Header = () => { 5 | return ( 6 |
7 | 8 |
9 | ); 10 | }; 11 | 12 | export default Header; 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Website for Flatstack Warsaw 2 | 3 | ![CI status](https://github.com/braska/flatstack-warsaw/workflows/CI/badge.svg) 4 | [![Netlify Status](https://api.netlify.com/api/v1/badges/8a46652f-46d7-462d-92b1-80918e914419/deploy-status)](https://app.netlify.com/sites/flatstack-warsaw/deploys) 5 | 6 | This repo contains source code for Flatstack Warsaw website 7 | -------------------------------------------------------------------------------- /src/webpack-templates/index.js: -------------------------------------------------------------------------------- 1 | import L10nContext from '../components/L10nContext'; 2 | import Page from '../components/Page'; 3 | import enLocale from '../locales/en'; 4 | import render from '../render'; 5 | 6 | export default render(() => ( 7 | 8 | 9 | 10 | )); 11 | -------------------------------------------------------------------------------- /src/components/organisms/Warsaw/index.jsx: -------------------------------------------------------------------------------- 1 | import Section from '../../molecules/Section'; 2 | import config from '../../../config'; 3 | 4 | const Content = 5 | typeof window === 'undefined' ? require('./Content').default : () => null; 6 | 7 | const Warsaw = () => { 8 | return ( 9 |
13 | 14 |
15 | ); 16 | }; 17 | 18 | export default Warsaw; 19 | -------------------------------------------------------------------------------- /src/components/organisms/Company/index.jsx: -------------------------------------------------------------------------------- 1 | import config from '../../../config'; 2 | import Section from '../../molecules/Section'; 3 | 4 | const Content = 5 | typeof window === 'undefined' ? require('./Content').default : () => null; 6 | 7 | const Company = () => { 8 | return ( 9 |
13 | 14 |
15 | ); 16 | }; 17 | 18 | export default Company; 19 | -------------------------------------------------------------------------------- /src/components/organisms/Vacancy/index.jsx: -------------------------------------------------------------------------------- 1 | import config from '../../../config'; 2 | import Section from '../../molecules/Section'; 3 | 4 | const Content = 5 | typeof window === 'undefined' ? require('./Content').default : () => null; 6 | 7 | const Vacancy = () => { 8 | return ( 9 |
13 | 14 |
15 | ); 16 | }; 17 | 18 | export default Vacancy; 19 | -------------------------------------------------------------------------------- /src/components/organisms/Feedbacks/index.jsx: -------------------------------------------------------------------------------- 1 | import config from '../../../config'; 2 | import Section from '../../molecules/Section'; 3 | 4 | const Content = 5 | typeof window === 'undefined' ? require('./Content').default : () => null; 6 | 7 | const Feedbacks = () => { 8 | return ( 9 |
13 | 14 |
15 | ); 16 | }; 17 | 18 | export default Feedbacks; 19 | -------------------------------------------------------------------------------- /src/components/organisms/Relocation/index.jsx: -------------------------------------------------------------------------------- 1 | import config from '../../../config'; 2 | import Section from '../../molecules/Section'; 3 | 4 | const Content = 5 | typeof window === 'undefined' ? require('./Content').default : () => null; 6 | 7 | const Relocation = () => { 8 | return ( 9 |
13 | 14 |
15 | ); 16 | }; 17 | 18 | export default Relocation; 19 | -------------------------------------------------------------------------------- /src/components/atoms/RequiredFormText.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { useL10n } from '../L10nContext'; 3 | 4 | const RequiredText = styled.p` 5 | color: ${({ theme }) => theme.colors.paleText}; 6 | `; 7 | 8 | const AsteriskWrapper = styled.span` 9 | color: red; 10 | `; 11 | 12 | const RequiredFormText = () => { 13 | const { t } = useL10n(); 14 | return ( 15 | {t('form.requiredText', { AsteriskWrapper })} 16 | ); 17 | }; 18 | 19 | export default RequiredFormText; 20 | -------------------------------------------------------------------------------- /src/components/icons/CloseIcon.jsx: -------------------------------------------------------------------------------- 1 | const CloseIcon = (props) => { 2 | return ( 3 | 13 | 14 | 15 | ); 16 | }; 17 | 18 | export default CloseIcon; 19 | -------------------------------------------------------------------------------- /src/components/organisms/Footer/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import Container from '../../atoms/Container'; 3 | 4 | const Content = 5 | typeof window === 'undefined' ? require('./Content').default : () => null; 6 | 7 | const Wrapper = styled.footer` 8 | padding: 3em 0; 9 | 10 | color: ${({ theme }) => theme.colors.paleText}; 11 | `; 12 | 13 | const Footer = () => ( 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | 21 | export default Footer; 22 | -------------------------------------------------------------------------------- /src/index-en.jsx: -------------------------------------------------------------------------------- 1 | import 'regenerator-runtime/runtime'; 2 | 3 | import ReactDOM from 'react-dom'; 4 | import { ThemeProvider } from 'styled-components'; 5 | import L10nContext from './components/L10nContext'; 6 | import Page from './components/Page'; 7 | import enLocale from './locales/en'; 8 | import theme from './theme'; 9 | 10 | const target = document.getElementById('root'); 11 | 12 | const App = () => ( 13 | 14 | 15 | 16 | 17 | 18 | ); 19 | 20 | ReactDOM.hydrate(, target); 21 | -------------------------------------------------------------------------------- /src/components/icons/AlertIcon.jsx: -------------------------------------------------------------------------------- 1 | const AlertIcon = (props) => { 2 | return ( 3 | 10 | 11 | 12 | 16 | 17 | ); 18 | }; 19 | 20 | export default AlertIcon; 21 | -------------------------------------------------------------------------------- /src/components/molecules/Alert.jsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import AlertIcon from '../icons/AlertIcon'; 3 | 4 | const Wrapper = styled.div` 5 | display: flex; 6 | align-items: center; 7 | padding: 0.5em; 8 | 9 | background-color: ${({ theme }) => theme.colors.accentPale}; 10 | border-radius: 0.7em; 11 | 12 | & > * { 13 | margin: 0.5em; 14 | } 15 | `; 16 | 17 | const StyledAlertIcon = styled(AlertIcon)` 18 | display: block; 19 | flex: none; 20 | `; 21 | 22 | const Alert = ({ children }) => { 23 | return ( 24 | 25 | 26 |

{children}

27 |
28 | ); 29 | }; 30 | 31 | export default Alert; 32 | -------------------------------------------------------------------------------- /src/components/molecules/Section.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components'; 3 | import Container from '../atoms/Container'; 4 | 5 | const Wrapper = styled.section` 6 | margin-bottom: 4em; 7 | padding: ${({ grey }) => (grey ? '2em' : '0')} 0; 8 | 9 | background-color: ${({ theme, grey }) => grey && theme.colors.primary}; 10 | 11 | &:last-of-type { 12 | margin-bottom: 0; 13 | } 14 | `; 15 | 16 | const Section = React.forwardRef(({ children, ...props }, ref) => ( 17 | 18 | {children} 19 | 20 | )); 21 | 22 | Section.Title = styled.h2` 23 | margin: 0 0 1em 0; 24 | 25 | font-size: 2em; 26 | `; 27 | 28 | export default Section; 29 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "@babel/eslint-parser", 3 | "extends": ["airbnb", "airbnb/hooks", "plugin:prettier/recommended"], 4 | "env": { 5 | "browser": true, 6 | "node": true, 7 | "jest": true 8 | }, 9 | "rules": { 10 | "react/no-unknown-property": "off", // for compatibility with Preact 11 | "react/react-in-jsx-scope": "off", 12 | "react/jsx-props-no-spreading": "off", 13 | "react/prop-types": "off", 14 | "jsx-a11y/html-has-lang": "off", 15 | "react/jsx-filename-extension": "off", 16 | "no-plusplus": "off", 17 | "import/no-unresolved": [ 18 | "error", 19 | { "commonjs": true, "caseSensitive": true, "ignore": ["^react$", "^react-dom$", "^react-dom\/.*$", "\\?"] } 20 | ] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/components/icons/FacebookIcon.jsx: -------------------------------------------------------------------------------- 1 | const FacebookIcon = ({ currentColor, ...restProps }) => { 2 | return ( 3 | 10 | 16 | 20 | 21 | ); 22 | }; 23 | 24 | export default FacebookIcon; 25 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | processors: ['stylelint-processor-styled-components'], 3 | extends: [ 4 | 'stylelint-config-recommended', 5 | 'stylelint-config-rational-order', 6 | 'stylelint-config-styled-components', 7 | ], 8 | rules: { 9 | 'order/properties-order': [], 10 | 'plugin/rational-order': [ 11 | true, 12 | { 13 | 'empty-line-between-groups': true, 14 | }, 15 | ], 16 | // We decided to deny media queries. 17 | // Prefer flex layout with flex-wrap. 18 | // If designer give you mockup with potential media queries, 19 | // come and discuss it. Try to convince to change design 20 | // and get rid of media queries. 21 | 'media-feature-name-disallowed-list': ['max-width', 'min-width'], 22 | }, 23 | }; 24 | -------------------------------------------------------------------------------- /src/components/icons/LoadingIcon.jsx: -------------------------------------------------------------------------------- 1 | const LoadingIcon = (props) => { 2 | return ( 3 | 10 | 19 | 27 | 28 | 29 | ); 30 | }; 31 | 32 | export default LoadingIcon; 33 | -------------------------------------------------------------------------------- /src/components/atoms/Card.jsx: -------------------------------------------------------------------------------- 1 | import styled, { css } from 'styled-components'; 2 | 3 | export const variants = { 4 | BORDERED: 'BORDERED', 5 | FILL_PRIMARY: 'FILL_PRIMARY', 6 | FILL_ACCENT_PALE: 'FILL_ACCENT_PALE', 7 | }; 8 | 9 | const cssByVariant = { 10 | [variants.BORDERED]: css` 11 | border: 1px solid ${({ theme }) => theme.colors.secondary}; 12 | `, 13 | [variants.FILL_PRIMARY]: css` 14 | background-color: ${({ theme }) => theme.colors.primary}; 15 | `, 16 | [variants.FILL_ACCENT_PALE]: css` 17 | background-color: ${({ theme }) => theme.colors.accentPale}; 18 | `, 19 | }; 20 | 21 | const Card = styled.div` 22 | padding: 2em; 23 | 24 | border-radius: 1em; 25 | 26 | ${({ variant }) => cssByVariant[variant]} 27 | `; 28 | 29 | Card.defaultProps = { 30 | variant: variants.BORDERED, 31 | }; 32 | 33 | export default Card; 34 | -------------------------------------------------------------------------------- /src/Document.jsx: -------------------------------------------------------------------------------- 1 | const DETECT_WEBP_SUPPORT_SCRIPT = 2 | 'var i=new Image;i.onload=i.onerror=function(){document.body.classList.add(i.height==1?"webp":"no-webp")};i.src="data:image/webp;base64,UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==";\n'; 3 | 4 | const Document = ({ children, styles, helmet }) => ( 5 | 6 | 7 | {helmet.title.toComponent()} 8 | {helmet.meta.toComponent()} 9 | {helmet.link.toComponent()} 10 | {styles} 11 | {helmet.script.toComponent()} 12 | 13 | 14 |