├── .babelrc
├── .editorconfig
├── .env.sample
├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── antd
├── antd-config.js
└── antd.less
├── components
├── antd
│ ├── form
│ │ └── index.js
│ └── input
│ │ └── index.js
├── clients.js
├── countDown
│ ├── index.js
│ └── style.js
├── head.js
├── layouts
│ ├── doubleGrid.js
│ ├── footer.js
│ ├── header.js
│ ├── mainLayout.js
│ └── singleGrid.js
├── multiLingualNumber.js
├── people.js
├── react-css-grid.js
├── schedule.js
├── sponsorItem.js
└── subscribeForm.js
├── hooks
└── useIntl.js
├── localization
├── entries
│ ├── en_US.js
│ └── fa_IR.js
├── index.js
└── locales
│ ├── en_US.json
│ └── fa_IR.json
├── mock
├── data.json
└── users.json
├── next.config.js
├── package-lock.json
├── package.json
├── pages
├── _app.js
├── _document.js
└── index.js
├── partials
└── home
│ └── style.js
├── public
├── icons
│ ├── android-icon-144x144.png
│ ├── android-icon-192x192.png
│ ├── android-icon-36x36.png
│ ├── android-icon-48x48.png
│ ├── android-icon-72x72.png
│ ├── android-icon-96x96.png
│ ├── apple-icon-114x114.png
│ ├── apple-icon-120x120.png
│ ├── apple-icon-144x144.png
│ ├── apple-icon-152x152.png
│ ├── apple-icon-180x180.png
│ ├── apple-icon-57x57.png
│ ├── apple-icon-60x60.png
│ ├── apple-icon-72x72.png
│ ├── apple-icon-76x76.png
│ ├── apple-icon-precomposed.png
│ ├── apple-icon.png
│ ├── browserconfig.xml
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon-96x96.png
│ ├── favicon.ico
│ ├── manifest.json
│ ├── ms-icon-144x144.png
│ ├── ms-icon-150x150.png
│ ├── ms-icon-310x310.png
│ └── ms-icon-70x70.png
├── manifest.json
├── sitemap.xml
└── static
│ ├── favicon.ico
│ ├── fonts
│ ├── inter.woff2
│ └── vazir
│ │ ├── eot
│ │ ├── Vazir-Black.eot
│ │ ├── Vazir-Bold.eot
│ │ ├── Vazir-Light.eot
│ │ ├── Vazir-Medium.eot
│ │ ├── Vazir-Thin.eot
│ │ └── Vazir.eot
│ │ ├── ttf
│ │ ├── Vazir-Black.ttf
│ │ ├── Vazir-Bold.ttf
│ │ ├── Vazir-Light.ttf
│ │ ├── Vazir-Medium.ttf
│ │ ├── Vazir-Thin.ttf
│ │ └── Vazir.ttf
│ │ ├── woff
│ │ ├── Vazir-Black.woff
│ │ ├── Vazir-Bold.woff
│ │ ├── Vazir-Light.woff
│ │ ├── Vazir-Medium.woff
│ │ ├── Vazir-Thin.woff
│ │ ├── Vazir.woff
│ │ └── desktop.ini
│ │ └── woff2
│ │ ├── Vazir-Black.woff2
│ │ ├── Vazir-Bold.woff2
│ │ ├── Vazir-Light.woff2
│ │ ├── Vazir-Medium.woff2
│ │ ├── Vazir-Thin.woff2
│ │ └── Vazir.woff2
│ ├── images
│ ├── ReactConf.svg
│ ├── contact.svg
│ ├── hall.jpg
│ ├── icon
│ │ ├── apple-touch-icon-114x114.png
│ │ ├── apple-touch-icon-120x120.png
│ │ ├── apple-touch-icon-144x144.png
│ │ ├── apple-touch-icon-152x152.png
│ │ ├── apple-touch-icon-180x180.png
│ │ ├── apple-touch-icon-57x57.png
│ │ ├── apple-touch-icon-72x72.png
│ │ ├── apple-touch-icon-76x76.png
│ │ ├── apple-touch-icon.png
│ │ └── favicon.ico
│ ├── like.svg
│ ├── partners
│ │ ├── Binosha.png
│ │ ├── flerbo.png
│ │ ├── frontcast.png
│ │ ├── karlib.svg
│ │ ├── macneed.png
│ │ ├── raychat.png
│ │ ├── reacttehran.png
│ │ ├── sazito.png
│ │ ├── siamak.png
│ │ ├── vip
│ │ │ ├── hastnama-academy-color.svg
│ │ │ ├── hastnama-color.svg
│ │ │ ├── hastnama.svg
│ │ │ ├── hastnama_academy.svg
│ │ │ └── kidcoding.ir.svg
│ │ ├── virgool.png
│ │ ├── virgool.svg
│ │ └── webbranding.png
│ ├── people
│ │ ├── ali.jpg
│ │ ├── behrouz.jpg
│ │ ├── majid.jpg
│ │ ├── mehri.jpg
│ │ ├── milad.jpg
│ │ ├── pourya.jpg
│ │ ├── samaneh.jpg
│ │ ├── siamak.jpg
│ │ └── spearkes.jpg
│ ├── reactconf.png
│ ├── speakerad.jpg
│ ├── subscribe.jpg
│ ├── subscribeIcon.svg
│ ├── surprise.jpg
│ ├── talking.jpg
│ └── ticket.jpg
│ ├── reactconf-iran-share.jpg
│ └── video
│ ├── pr.gif
│ └── static.mp4
├── reactconf.png
├── registerServiceWorker.js
├── routes.js
├── server.js
├── styles
├── injectGlobal.js
├── modules
│ ├── colors.scss
│ ├── grid.scss
│ ├── timetable.scss
│ └── typography.scss
└── styles.scss
└── utils
├── intlMessage.js
├── isRTL.js
├── masonary.js
├── shuffle.js
└── utils.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["next/babel"],
3 | "env": {
4 | "production": {
5 | "plugins": ["transform-remove-console"]
6 | }
7 | },
8 | "plugins": [
9 | ["@babel/plugin-proposal-class-properties"],
10 | ["inline-react-svg"],
11 | [
12 | "import",
13 | {
14 | "libraryName": "antd",
15 | "style": true
16 | }
17 | ],
18 | [
19 | "module-resolver",
20 | {
21 | "root": "./",
22 | "extensions": [".js"],
23 | "alias": {
24 | "components": "./components",
25 | "utils": "./utils",
26 | "mock": "./mock",
27 | "partials": "./partials",
28 | "styles": "./styles",
29 | "localization": "./localization",
30 | "hooks": "./hooks",
31 | "config": "./config"
32 | },
33 | "cwd": "packagejson"
34 | }
35 | ]
36 | ]
37 | }
38 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = tab
5 | indent_size = 4
6 | end_of_line = lf
7 | charset = utf-8
8 | # trim_trailing_whitespace = true
9 | # insert_final_newline = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
--------------------------------------------------------------------------------
/.env.sample:
--------------------------------------------------------------------------------
1 | API_URL=https://api.reactconf.ir/
2 | RANDOM_USER_LIMIT=200
3 | REACT_CONF_DATE=July 30, 2020 08:00:00
4 | PORT=2000
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.gitignore.io/api/node
3 | # Edit at https://www.gitignore.io/?templates=node
4 |
5 | ### Node ###
6 | # Logs
7 | logs
8 | *.log
9 | npm-debug.log*
10 | yarn-debug.log*
11 | yarn-error.log*
12 | lerna-debug.log*
13 |
14 | # Diagnostic reports (https://nodejs.org/api/report.html)
15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
16 |
17 | # Runtime data
18 | pids
19 | *.pid
20 | *.seed
21 | *.pid.lock
22 |
23 | # Directory for instrumented libs generated by jscoverage/JSCover
24 | lib-cov
25 |
26 | # Coverage directory used by tools like istanbul
27 | coverage
28 | *.lcov
29 |
30 | # nyc test coverage
31 | .nyc_output
32 |
33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
34 | .grunt
35 |
36 | # Bower dependency directory (https://bower.io/)
37 | bower_components
38 |
39 | # node-waf configuration
40 | .lock-wscript
41 |
42 | # Compiled binary addons (https://nodejs.org/api/addons.html)
43 | build/Release
44 |
45 | # Dependency directories
46 | node_modules/
47 | jspm_packages/
48 |
49 | # TypeScript v1 declaration files
50 | typings/
51 |
52 | # TypeScript cache
53 | *.tsbuildinfo
54 |
55 | # Optional npm cache directory
56 | .npm
57 |
58 | # Optional eslint cache
59 | .eslintcache
60 |
61 | # Optional REPL history
62 | .node_repl_history
63 |
64 | # Output of 'npm pack'
65 | *.tgz
66 |
67 | # Yarn Integrity file
68 | .yarn-integrity
69 |
70 | # dotenv environment variables file
71 | .env
72 | .env.test
73 |
74 | # parcel-bundler cache (https://parceljs.org/)
75 | .cache
76 |
77 | # next.js build output
78 | .next
79 |
80 | # nuxt.js build output
81 | .nuxt
82 |
83 | # vuepress build output
84 | .vuepress/dist
85 |
86 | # Serverless directories
87 | .serverless/
88 |
89 | # FuseBox cache
90 | .fusebox/
91 |
92 | # DynamoDB Local files
93 | .dynamodb/
94 | *.iml
95 | /node_modules
96 | dist
97 | build
98 | .env
99 | .next
100 | .idea
101 | .DS_Store
102 | _MACOSX
103 | _next/
104 | # End of https://www.gitignore.io/api/node
105 | /bundles
106 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "tabWidth": 4,
3 | "useTabs": true
4 | }
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | # Next.js Boilerplate (ReactConf Iran website 2020)
5 |
6 |
Be familiar with next react project
7 |
8 | A complete guide for learn react and also use it as boilerplate
9 |
10 |
Created by Milad Heydari, Mehri Daei and maintained with ❤️ by an amazing react conf team .
11 |
12 |
13 |
14 | ## Features
15 |
16 |
17 |
18 | Quick Scaffolding
19 | You can create components, routes, make API call and also make your App more attractive with using AntDesign, besides you can have multilingual App.
20 |
21 | Instant Feedback
22 |
23 | Enjoy coding with good speed and awsome DX (Developer eXperience). As soon as you change CSS, SASS,LESS, JS, your changes are directly implemented without having to refresh your browser. One more thing Enjoy using one of the best UI libraries name AntDesign and finally have clean and formatted code.
24 |
25 | Philosophy
26 |
27 | - **Purpose :** React conf has been tried to have a positive effect on developer training. The only purpose of this boilerplate is to help those interested in development using react.js. We use different tools to show you how these tools work and also help you to compare them together.
28 | - **One Dependency :** You will have only one build dependency. It uses Webpack, Babel. It provides a cohesive experience for you.
29 | - **No Configuration Required :** You don't need to configure anything. Only required thing is to focus on writing code. You can reach a reasonably good configuration of both development and production builds.
30 |
31 | ## What's included ?
32 |
33 | - **React, Hooks.**
34 | - **ES6 & Next Generation JavaScript :** Use object destructuring, arrow functions, JSX syntax and more.
35 | - **Next Generation CSS :**
36 |
37 | - **Styled-Components :** It is powered of CSS and help you to write actual CSS code. you will have unique generated class names to keep your code coupsoled.
38 | - **SASS** If it's easily for you to use SASS, so keep use it. we support SASS too.
39 | - **LESS**
40 | At the end, with using this boilerplate you can ship only the styles that are on the page. This feature guide you to the best performance.
41 |
42 | - **React-intl:** If you want to have scalable apps, you probably need to support multiple languages. We use react-intl in this boilerplate to have a multilingual app.
43 | - **Offline-First :** Availability without network connection, INTERESTED :) , from the instant your users load the app, they can reach your app without network connection.
44 | - **Formatting :** Don't worry about implementing clean code or formatted one. We use prettier and have some configuration in Babel. to being sure that your codes always are clean and formated.
45 | - **SEO :** We support SEO (document head tags management ) for search engines that support indexing of JS content.
46 | - **Next-SEO**
47 | - **AntDesign :** You can easily customize ant design component and also use the only component that you need them in your project. Considering these features, your app can meet a great performance.
48 |
49 | - **Next.js & Webpack Setting**
50 |
51 | - **Next-Compose-Plugin**
52 | - **OptimizeCSSAssetsPlugin :** Next.js doesn't minify CSS files out of the box, so we've added the OptimizeCSSAssetsPlugin to handle this lack.
53 | - **TerserPlugin:** This plugin uses terser to minify your JavaScript.
54 | - **BundleAnalyzer:** Visualize the size of webpack output files with an interactive zoomable treemap.
55 | - **Transform Remove Console:** This plugin removes all console.\* calls.
56 | - **Babel Plugin Module Resolver:** A Babel plugin to add a new resolver for your modules when compiling your code using Babel. This plugin allows you to add new "root" directories that contain your modules. It also allows you to setup a custom alias for directories, specific files, or even other npm modules.
57 | - **cross-env**
58 |
59 | ## Environment Configuration
60 |
61 | The root directory of your application, contain a .env.example file. You should copy the file with .env. Your .env file should not be committed to your application's source control, since each developer / server using your application could require a different environment configuration.
62 |
63 | ## Quick start
64 |
65 | 1. Make sure that you have Node.js v10 or later and npm v5 or above installed.
66 |
67 | 2. Clone this repo using `git clone https://github.com/ReactConf/nextjs-boilerplate-reactconf-ir2020.git`
68 |
69 | 3. Move to the appropriate directory: `cd `.
70 |
71 | 4. Run `npm install` in order to install dependencies.
72 |
73 | 5.At this point you can run `npm start` to see the example app at `http://localhost:4000`. You can easily change this port by changing the `.env` file ._
74 |
--------------------------------------------------------------------------------
/antd/antd-config.js:
--------------------------------------------------------------------------------
1 | const cssLoaderConfig = require("@zeit/next-css/css-loader-config");
2 | const lessToJS = require("less-vars-to-js");
3 | const fs = require("fs");
4 | const path = require("path");
5 |
6 | // Where your antd-custom.less file lives
7 | const themeVariables = lessToJS(
8 | fs.readFileSync(path.resolve(__dirname, "./antd.less"), "utf8")
9 | );
10 |
11 | module.exports = (nextConfig = {}) => ({
12 | ...nextConfig,
13 | ...{
14 | webpack(config, options) {
15 | if (!options.defaultLoaders) {
16 | throw new Error(
17 | "This plugin is not compatible with Next.js versions below 5.0.0 https://err.sh/next-plugins/upgrade"
18 | );
19 | }
20 |
21 | const { dev, isServer } = options;
22 | const {
23 | cssModules,
24 | cssLoaderOptions,
25 | postcssLoaderOptions,
26 | lessLoaderOptions = {}
27 | } = nextConfig;
28 |
29 | // for all less in clint
30 | const baseLessConfig = {
31 | extensions: ["less"],
32 | cssModules,
33 | cssLoaderOptions,
34 | postcssLoaderOptions,
35 | dev,
36 | isServer,
37 | loaders: [
38 | {
39 | loader: "less-loader",
40 | options: {
41 | ...lessLoaderOptions,
42 | javascriptEnabled: true,
43 | modifyVars: themeVariables // make your antd custom effective
44 | }
45 | }
46 | ]
47 | };
48 |
49 | config.module.rules.push({
50 | test: /\.less$/,
51 | exclude: /node_modules/,
52 | use: cssLoaderConfig(config, baseLessConfig)
53 | });
54 |
55 | // for antd less in client
56 | // disable antd css module
57 | const antdLessConfig = {
58 | ...baseLessConfig,
59 | ...{
60 | cssModules: false,
61 | cssLoaderOptions: {},
62 | postcssLoaderOptions: {}
63 | }
64 | };
65 | config.module.rules.push({
66 | test: /\.less$/,
67 | include: /node_modules/,
68 | use: cssLoaderConfig(config, antdLessConfig)
69 | });
70 |
71 | // for antd less in server (yarn build)
72 | if (isServer) {
73 | const antStyles = /antd\/.*?\/style.*?/;
74 | const origExternals = [...config.externals];
75 | config.externals = [
76 | (context, request, callback) => {
77 | if (request.match(antStyles)) return callback();
78 | if (typeof origExternals[0] === "function") {
79 | origExternals[0](context, request, callback);
80 | } else {
81 | callback();
82 | }
83 | },
84 | ...(typeof origExternals[0] === "function"
85 | ? []
86 | : origExternals)
87 | ];
88 |
89 | config.module.rules.unshift({
90 | test: antStyles,
91 | use: "null-loader"
92 | });
93 | }
94 |
95 | if (typeof nextConfig.webpack === "function") {
96 | return nextConfig.webpack(config, options);
97 | }
98 |
99 | return config;
100 | }
101 | }
102 | });
103 |
--------------------------------------------------------------------------------
/components/antd/form/index.js:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 | import { Form as AntForm } from "antd";
3 |
4 | const Form = styled(AntForm)`
5 | .ant-form-item-has-error .ant-input:not([disabled]):hover,
6 | .ant-form-item-has-error .ant-input-affix-wrapper:not([disabled]):hover {
7 | box-shadow: rgb(55, 56, 62) 0px 0px 0px 1000px inset;
8 | background-color: transparent;
9 | border-color: transparent;
10 | }
11 | .ant-form-item-has-error .ant-input:focus,
12 | .ant-form-item-has-error .ant-input-affix-wrapper:focus,
13 | .ant-form-item-has-error .ant-input-focused,
14 | .ant-form-item-has-error .ant-input-affix-wrapper-focused {
15 | border-right-width: 0px;
16 | outline: 0;
17 | box-shadow: rgb(55, 56, 62) 0px 0px 0px 1000px inset;
18 | }
19 | .ant-form-vertical .ant-form-item-label {
20 | padding: 0px;
21 | }
22 | .ant-form-item-label {
23 | line-height: 45px;
24 | color: var(--foreground-color);
25 | }
26 | .ant-form-item-label > label::after {
27 | display: inline-block;
28 | margin-right: 4px;
29 | color: var(--foreground-color);
30 | font-size: 18px;
31 | font-family: SimSun, sans-serif;
32 | line-height: 1;
33 | content: "*";
34 | position: relative;
35 | top: -5px;
36 | }
37 | .ant-form-item-label > label::before {
38 | content: "";
39 | }
40 | .ant-form-item-explain,
41 | .ant-form-item-extra {
42 | padding-top: 5px;
43 | }
44 | `;
45 | export default Form;
46 |
--------------------------------------------------------------------------------
/components/antd/input/index.js:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 | import { Input as AntInput } from "antd";
3 | import { isRTL } from "utils/isRTL";
4 | import { fontFamily } from "styles/injectGlobal";
5 | const Input = styled(AntInput)`
6 | color: var(--foreground-color);
7 | direction: ${({ locale }) => (isRTL(locale) ? "rtl" : "ltr")};
8 | text-align: ${({ locale }) => (isRTL(locale) ? "right" : "left")};
9 | width: 100%;
10 | border: none;
11 | margin: 0;
12 | max-width: 450px;
13 | padding: 0 16px;
14 | position: relative;
15 | font-size: 16px;
16 | transition: background-color 5000s ease-in-out 0s;
17 | line-height: 50px;
18 | background-color: transparent;
19 | box-shadow: rgb(55, 56, 62) 0px 0px 0px 1000px inset;
20 | font-family: ${({ locale }) =>
21 | isRTL(locale) ? fontFamily.persian : fontFamily.english};
22 | &:focus {
23 | border-right: none;
24 | box-shadow: rgb(55, 56, 62) 0px 0px 0px 1000px inset;
25 | background-color: transparent;
26 | }
27 | `;
28 | export default Input;
29 |
--------------------------------------------------------------------------------
/components/clients.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import LazyLoad from "react-lazyload";
3 | import cx from "classnames";
4 |
5 | const Clients = ({ data }) => {
6 | const {fullName, email} = data;
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | );
16 | };
17 | export default Clients;
18 |
--------------------------------------------------------------------------------
/components/countDown/index.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect, Fragment } from "react";
2 | import { Parallax } from "react-scroll-parallax";
3 | import MultiLingualNumber from "components/multiLingualNumber";
4 | import Style from "./style";
5 | import IntlMessage from "utils/intlMessage";
6 | import getConfig from "next/config";
7 | const {
8 | publicRuntimeConfig: { REACT_CONF_DATE }
9 | } = getConfig();
10 |
11 | function CountDown({ confDate, locale }) {
12 | const [days, setDays] = useState(0);
13 | const [isEnd, setIsEnd] = useState(false);
14 | let timeInterval;
15 | useEffect(() => {
16 | countDownTimer();
17 | }, []);
18 | const countDownTimer = () => {
19 | const t = getTimeRemaining();
20 | setDays(`${t.finalDays}`);
21 | setIsEnd(t.isEnd);
22 | if (t.isEnd) {
23 | clearInterval(timeInterval);
24 | }
25 | return t;
26 | };
27 | const getTimeRemaining = () => {
28 | const currentTime = new Date();
29 | const confTime = new Date(confDate);
30 | const timeToConf = confTime - currentTime;
31 | const finalDays = Math.floor(timeToConf / 86400000);
32 | const finalHours = Math.floor((timeToConf % 86400000) / 3600000);
33 | const finalMinutes = Math.floor(
34 | ((timeToConf % 86400000) % 3600000) / 60000
35 | );
36 | const finalSeconds = Math.floor(
37 | (((timeToConf % 86400000) % 3600000) % 60000) / 1000
38 | );
39 | return {
40 | isEnd: finalSeconds <= 0 && finalMinutes <= 0 && finalHours <= 0,
41 | finalDays
42 | };
43 | };
44 | if (!isEnd) {
45 | return (
46 |
60 | );
61 | } else {
62 | return ;
63 | }
64 | }
65 | CountDown.defaultProps = {
66 | confDate: REACT_CONF_DATE || "July 30, 2020 08:00:00"
67 | };
68 | export default CountDown;
69 |
--------------------------------------------------------------------------------
/components/countDown/style.js:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 | import { isRTL } from "utils/isRTL";
3 |
4 | const Style = styled.div`
5 | position: absolute;
6 | ${({ locale }) =>
7 | isRTL(locale) ? "left: var(--gap)" : "right: var(--gap)"};
8 | font-weight: 545;
9 | font-size: 25vw;
10 | color: #070708;
11 | top: 0;
12 | line-height: 0.75;
13 | text-align: right;
14 | letter-spacing: -0.02em;
15 | z-index: -1;
16 | .month {
17 | font-size: 0.75em;
18 | position: relative;
19 | top: 20px;
20 | }
21 | .counter {
22 | display: flex;
23 | font-weight: 500;
24 | color: var(--gray-color);
25 | opacity: 0.15;
26 | justify-content: center;
27 | margin: -1rem 0 0;
28 | letter-spacing: -0.07em;
29 | padding-right: var(--gap);
30 | min-height: 42px;
31 | }
32 | `;
33 | export default Style;
34 |
--------------------------------------------------------------------------------
/components/head.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import NextHead from "next/head";
3 |
4 | const Head = () => (
5 |
6 |
15 |
20 |
30 |
31 | `
32 | }}
33 | />
34 |
39 |
44 |
49 |
54 |
59 |
64 |
69 |
74 |
79 |
85 |
91 |
97 |
103 |
104 |
105 |
109 |
110 |
111 | );
112 |
113 | export default Head;
114 |
--------------------------------------------------------------------------------
/components/layouts/doubleGrid.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import IntlMessage from "utils/intlMessage";
3 | import Grid from "components/react-css-grid";
4 | import SingleGrid from "./singleGrid";
5 |
6 | const DoubleGrid = ({ children, title, color = "", grid }) => {
7 | return (
8 |
9 |
10 |
11 |
16 |
17 |
18 | {children}
19 |
20 |
21 |
22 |
23 |
24 | );
25 | };
26 | export default DoubleGrid;
27 |
--------------------------------------------------------------------------------
/components/layouts/footer.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import IntlMessage from "utils/intlMessage";
3 |
4 | const Footer = ({ locale }) => {
5 | return (
6 |
120 | );
121 | };
122 | export default Footer;
123 |
--------------------------------------------------------------------------------
/components/layouts/header.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import IntlMessage from "utils/intlMessage";
3 | import Link from "next/link";
4 | import { Parallax } from "react-scroll-parallax";
5 | import CountDown from "components/countDown";
6 | import useIntl from "hooks/useIntl";
7 |
8 | const Header = ({ locale }) => {
9 | const intl = useIntl();
10 | return (
11 |
12 |
13 |
36 |
37 |
38 |
39 |
40 |
41 |
42 | {" "}
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | {" "}
51 | — {" "}
52 |
53 |
54 |
55 |
56 | .
57 |
58 |
59 |
60 |
61 | .
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | {" "}
70 |
71 |
72 |
73 |
74 |
75 |
76 | );
77 | };
78 | export default Header;
79 |
--------------------------------------------------------------------------------
/components/layouts/mainLayout.js:
--------------------------------------------------------------------------------
1 | import "styles/styles.scss";
2 | import { ParallaxProvider } from "react-scroll-parallax";
3 | import Header from "./header";
4 | import Footer from "./footer";
5 | import Head from "components/head";
6 | import React, { Fragment } from "react";
7 | import { NextSeo, SocialProfileJsonLd } from "next-seo";
8 | import useIntl from "hooks/useIntl";
9 |
10 | const MainLayout = ({ children, locale }) => {
11 | const intl = useIntl();
12 | return (
13 |
14 |
15 |
44 |
54 |
55 |
56 |
57 | {children}
58 |
59 |
60 |
61 |
62 | );
63 | };
64 | export default MainLayout;
65 |
--------------------------------------------------------------------------------
/components/layouts/singleGrid.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import IntlMessage from "utils/intlMessage";
3 | import Grid from "components/react-css-grid";
4 |
5 | const SingleGrid = ({ children, title, color = "tx-gr-purple", grid }) => {
6 | return (
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | {children}
15 |
16 |
17 |
18 |
19 | );
20 | };
21 | export default SingleGrid;
22 |
--------------------------------------------------------------------------------
/components/multiLingualNumber.js:
--------------------------------------------------------------------------------
1 | import React, { Fragment } from "react";
2 |
3 | function MultiLingualNumber({ locale, children, style }) {
4 | if (children !== null) {
5 | let internationalNumber = children.toString();
6 | let persianDigits = "۰۱۲۳۴۵۶۷۸۹";
7 | let persianMap = persianDigits.split("");
8 | let persianNumber = internationalNumber.replace(/\d/g, function(m) {
9 | return persianMap[parseInt(m)];
10 | });
11 | return (
12 |
13 | {" "}
14 | {locale === "fa" ? persianNumber : internationalNumber}{" "}
15 |
16 | );
17 | } else {
18 | return ;
19 | }
20 | }
21 |
22 | export default MultiLingualNumber;
23 |
--------------------------------------------------------------------------------
/components/react-css-grid.js:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 | import ReactGrid from "react-css-grid";
3 |
4 | const Grid = styled(ReactGrid)`
5 | display: grid;
6 | grid-template-columns: repeat(auto-fit, minmax(${({ grid }) => grid}, 1fr));
7 | grid-gap: var(--gap);
8 | `;
9 | export default Grid;
10 |
--------------------------------------------------------------------------------
/components/schedule.js:
--------------------------------------------------------------------------------
1 | import React, { memo } from "react";
2 | import data from "../pages/data";
3 | import cx from "classnames";
4 |
5 | const Schedule = memo(
6 | ({
7 | id,
8 | type,
9 | people,
10 | subject,
11 | summary,
12 | time,
13 | presentation_video,
14 | presentation_pdf
15 | }) => (
16 |
20 |
21 |
22 |
23 | {type === "Break" && (
24 |
33 |
41 |
42 | )}
43 | {type === "Presentation" && (
44 |
53 |
61 |
62 | )}
63 | {subject}
64 |
65 |
{summary}
66 | {data.peoples.find(p => p.slug === people) && (
67 |
68 |
p.slug === people)
71 | .avatar
72 | }
73 | alt={people}
74 | />{" "}
75 | {people}
76 |
77 | )}
78 |
79 |
80 |
{time.join(" — ")}
81 |
82 |
140 |
141 |
142 |
143 | )
144 | );
145 | export default Schedule;
146 |
--------------------------------------------------------------------------------
/components/sponsorItem.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | const SponsorItem = ({data}) => {
4 | const {url, logo , title} = data;
5 | return (
6 |
9 |
10 |
15 |
16 |
17 | );
18 | };
19 | export default SponsorItem;
20 |
--------------------------------------------------------------------------------
/components/subscribeForm.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import IntlMessage from "utils/intlMessage";
3 | import Grid from "components/react-css-grid";
4 | import Form from "components/antd/form";
5 | import Input from "components/antd/input";
6 | import { Cascader, message, Button } from "antd";
7 | import data from "mock/data";
8 | import SingleGrid from "./layouts/singleGrid";
9 | import axios from "axios";
10 | import getConfig from "next/config";
11 | const {
12 | publicRuntimeConfig: { API_URL }
13 | } = getConfig();
14 | const { jobPositions } = data;
15 | const { Item } = Form;
16 |
17 | function SubscribeForm({ locale }) {
18 | const axiosInstance = axios.create({
19 | baseURL: API_URL,
20 | headers: { "accept-language": locale === "fa" ? "fa-IR" : "en-US" }
21 | });
22 | const [loading, setLoading] = useState(false);
23 | const [form] = Form.useForm();
24 | const handleSubmit = async values => {
25 | try {
26 | setLoading(true);
27 | Object.assign(values, {
28 | experience: values.experience.toString()
29 | });
30 |
31 | const response = await axiosInstance.post("MailChimp", values);
32 | await form.resetFields();
33 | setLoading(false);
34 | await message.success(response.data.message);
35 | } catch (e) {
36 | setLoading(false);
37 | if (e.response.status === 400) {
38 | await message.error(e.response.data.message);
39 | } else {
40 | message.error("This is an error message");
41 | }
42 | } finally {
43 | setLoading(false);
44 | }
45 | };
46 | return (
47 |
52 |
53 |
54 |
201 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 | );
214 | }
215 |
216 | export default SubscribeForm;
217 |
--------------------------------------------------------------------------------
/hooks/useIntl.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { injectIntl } from "react-intl";
3 |
4 | const ReactIntlContext = React.createContext(null);
5 | export const IntlContextProvider = injectIntl(({ intl, children }) => (
6 |
7 | {children}
8 |
9 | ));
10 | export const useIntl = () => React.useContext(ReactIntlContext);
11 |
12 | export default useIntl;
13 |
--------------------------------------------------------------------------------
/localization/entries/en_US.js:
--------------------------------------------------------------------------------
1 | import appLocaleData from 'react-intl/locale-data/fa';
2 | import EnMessages from '../locales/en_US.json';
3 |
4 | const FaLang = {
5 | messages: {
6 | ...EnMessages,
7 | },
8 | locale: 'en_US',
9 | data: appLocaleData,
10 | };
11 | export default FaLang;
12 |
--------------------------------------------------------------------------------
/localization/entries/fa_IR.js:
--------------------------------------------------------------------------------
1 | import appLocaleData from 'react-intl/locale-data/fa';
2 | import faMessages from '../locales/fa_IR.json';
3 |
4 | const FaLang = {
5 | messages: {
6 | ...faMessages,
7 | },
8 | locale: 'fa_IR',
9 | data: appLocaleData,
10 | };
11 | export default FaLang;
12 |
--------------------------------------------------------------------------------
/localization/index.js:
--------------------------------------------------------------------------------
1 | import Falang from "./entries/fa_IR";
2 | import Enlang from "./entries/en_US";
3 | import { addLocaleData } from "react-intl";
4 |
5 | const AppLocale = {
6 | fa: Falang,
7 | en: Enlang
8 | };
9 | addLocaleData(AppLocale.en.data);
10 | addLocaleData(AppLocale.fa.data);
11 |
12 | export default AppLocale;
13 |
--------------------------------------------------------------------------------
/localization/locales/en_US.json:
--------------------------------------------------------------------------------
1 | {
2 | "reactconf.title": "ReactConf Iran 2020",
3 | "reactconf.description": "ReactConf Iran is being hosted by Hastnama Creative Solutions for all those who're in love with coding and passionate about Js and React.There are a lot of great talks, human beings, activities, and of course food.",
4 | "days.title": "Days",
5 | "main.title.first.line": "ReactJS ",
6 | "main.title.between": "&",
7 | "main.title.second.part": "JS",
8 | "main.title.second.line": "conference",
9 | "main.title.thrid.line": "July 30, 2020",
10 | "main.title.forth.line": "Tehran, Iran",
11 | "main.subtitle.hashtag": "#ReactConf",
12 | "main.subtitle": "The biggest Javascript & ReactJS conference in Iran is being hosted by Hastnama Creative Solutions for all those who're in love with coding and passionate about Js and React.There are a lot of great talks, human beings, activities, and of course food.",
13 | "speakers.title": "We’re looking for enthusiastic speakers!",
14 | "speakers.subtitle": "Speaker recruitment call at REACTCONF",
15 | "speakers.description": "Terms of Proposal Submission at the REACTCONF Conference\nThe REACTCONF conference was based on introducing new talented people who are not very well known but are very intelligent and knowledgeable. Based on this fact if you think you have User Interface Development (Front-End) or Repository Development experience; whether you have a problem or have solved a challenge in your company or product which can be helpful for other people, the REACTCONF conference is the best opportunity to provide you the experience. Also, the REACTCONF secretariat is waiting for you with open arms to join the energetic speakers of this course.\n \nIn order to have this opportunity, you just need to send us a brief presentation of the main meaning of your speech in Farsi or English through the Google form service or even Gmail it. Our reviewers rate the articles based on the quality of the topic, the level of empirical experience, and of course your post-talk skills afterward we select the best proposals for the conference day. The topics can include all aspects of Data Structure Development, Algorithm, React, Styling, your product development experience, HR, how to conduct a contract and so on. We are waiting for you until the end of May.",
16 | "speakers.link.title": "send your request",
17 | "sponsors.title": "Get In Touch!",
18 | "sponsors.subtitle": "The REACTCONF is a conference for anyone who has years of development experience or wants to start programming; with the presence of Iranian expert’s software developers, Iranian companies or startups seeking employment and promotions. REACTCONF is Suitable for entrepreneurs and organizations that seek to recruit expert developers or even students of programming for their facilities. After many years of experience in conference organizing, more than 4000 people are attending the conference and following it, this environment could be a great chance for learning, building a professional career network besides gaining a huge amount of experience. If you want to find a new job, many software companies are looking for talented people like you or if you want to meet and chat with people who have a lot of digital product development experience REACTCONF could make it happen. If you have any questions or would like to learn more about the REACTCONF, just contact us via email.",
19 | "sponsors.btn.title": "contact us",
20 | "subscribe.title": "Subscribe",
21 | "subscribe.subtitile": "you can know our plans and our palns about react conf and other conferences that we had.",
22 | "subscribe.btn.title": "Subscribe Now!",
23 | "meet.people.title": "Part of People Who Came.",
24 | "partners.title": "Partners",
25 | "partners.friends.title": "Partners & Friends ",
26 | "core.team.title": "CORE TEAM",
27 | "friends.team.title": "Friends",
28 | "footer.organized": "Organized with",
29 | "footer.organized.by": "by",
30 | "footer.hastnama.link": "Hastnama Creative Solutions",
31 | "footer.city": "in Tehran, Iran ",
32 | "core.team.milad.heydari": "Milad Heydari",
33 | "core.team.des.milad.heydari": "Founder of Reactconf. Tech-Lead & Co-Founder Hastnama Creative Solutions",
34 | "core.team.ali.hariri": "Ali Hariri",
35 | "core.team.des.ali.hariri": "Marketing & Idea Development",
36 | "core.team.majid.zamani": "Majid Zamani",
37 | "core.team.des.majid.zamani": "Coordinator",
38 | "core.team.behrouz.omran": "Behrouz Omran",
39 | "core.team.des.behrouz.omran": "Strategist Director",
40 | "core.team.pourya.sharifi": "Pourya Sharifi",
41 | "core.team.des.pourya.sharifi": "Reactconf Project Manager & CEO & Co-Founder Hastnama Creative Solutions",
42 | "friends.siamak.mokhtari": "Siamak Mokhtari",
43 | "friends.des.siamak.mokhtari": "Designer & Developer",
44 | "friends.samaneh.rabiee": "Samaneh Rabiee",
45 | "friends.des.samaneh.rabiee": "Graphic Designer",
46 | "friends.mehri.daei": "Mehri Daie",
47 | "friends.des.mehri.daei": "Web Designer",
48 | "form.title.firstname": "First Name",
49 | "form.title.lastname": "Last Name",
50 | "form.title.email": "E-Mail",
51 | "form.title.experience": "Your Experience",
52 | "form.title.phoneNumber": "Phone Number",
53 | "form.valid.fill.firstname": "Please input your first name!",
54 | "form.valid.fill.lastname": "Please input your last name!",
55 | "form.valid.fill.email": "Please input your E-mail!",
56 | "form.valid.fill.phoneNumber": "Please input your phone number!",
57 | "form.valid.fill.experience": "Please select your experience!",
58 | "form.valid.correct.email": "The input is not valid E-mail!"
59 | }
60 |
--------------------------------------------------------------------------------
/localization/locales/fa_IR.json:
--------------------------------------------------------------------------------
1 | {
2 | "reactconf.title": "بزرگ ترین همایش جاوا اسکریپت و ری اکت در ایران - ری اکت کانف",
3 | "reactconf.description": "بزرگ ترین همایش جاوا اسکریپت و ری اکت (ری اکت کانف) در ایران، برای تمام برنامه نویسانی که توسعه رابط کاربری و ری اکت را دوست دارند و با آن محصولات دیجیتالی جذاب توسعه می دهند. برگزاری و اجرا توسط کارگاه خلاقیت و نوآری هست نما.",
4 | "days.title": "روز",
5 | "main.title.first.line": "بزرگ ترین همایش",
6 | "main.title.between": " ",
7 | "main.title.second.part": " ",
8 | "main.title.second.line": "جاوا اسکریپت و ری اکت",
9 | "main.title.thrid.line": " نهم مرداد ماه",
10 | "main.title.forth.line": "ایران، تهران",
11 | "main.subtitle.hashtag": "#ریاکتکانف",
12 | "main.subtitle": "بزرگ ترین همایش جاوا اسکریپت و ری اکت (ری اکت کانف) در ایران، برای تمام برنامه نویسانی که توسعه رابط کاربری و ری اکت را دوست دارند و با آن محصولات دیجیتالی جذاب توسعه می دهند.",
13 | "speakers.title": "فراخوان جذب سخنران در ری اکت کانف ",
14 | "speakers.link.title": "ارسال پرپوزال",
15 | "speakers.subtitle": "شرایط ارسال پروپوزال در همایش ری اکت کانف",
16 | "speakers.description": "همایش ری اکت کانف بر اساس معرفی افراد جدید و تلنت هایی بوده است که زیاد شناخته شده نیستند اما بسیار باهوش و با سواد هستند بر همین اساس اگر فکر میکنید که تجربه ای در زمینه توسعه رابط کاربری Front-End دارید و یا تجربه توسعه در ریپازیتوری ای را دارید و یا اینکه در شرکت یا محصول خود چالشی را حل کرده اید که می تواند بیان کردن آن برای دیگر افراد کمکی به حساب بیاید، همایش ری اکت کانف بهترین فرصت است برای ارائه تجربه و همچنین دبیرخانه همایش با لبخند منتظر شماست تا به جمع سخنرانان پر انرژی این دوره بپیوندید. برای اینکار تنها کافیست پروپوزالی کوتاه از مفهوم اصلی سخنرانی خود به زبان فارسی یا انگلیسی برای ما از طریق گوگل یا حتی از طریق جیمیل همایش ارسال کنید. داوران ما بر اساس کیفیت موضوع، سطح تجربی موضوع و البته مهارت شما در سخنرانی پس از مکالمه، مقالات را رتبه بندی می کنند و بهترین پروپوزال ها برای روز همایش انتخاب می کنند. موضوع های سخنرانی می تواند شامل همه مباحث توسعه رابط کاربری دیتا استراکچر، الگوریتم، React، استایل دهی، تجربه شما در توسعه یک محصول، حتی موضوع هایی مثل مدیریت منابع انسانی، نحوه قراردادن بستن و… باشد. تا پایان اردیبهشت منتظرتون هستیم.",
17 | "sponsors.title": "ارتباط با دبیرخانه همایش",
18 | "sponsors.subtitle": "همایش ری اکت کانف یک همایش برنامه نویسی برای تمام کسانی است که سال هاست برنامه نویسی میکنند و یا می خواهند برنامه نویسی را شروع کنند. حضور برنامه نویسان و متخصصان صنعت نرم افزار مطرح ایرانی، شبکه سازی و نمایشگاه کار با حضور شرکت ها و استارتاپ های مطرح ایرانی برای کاریابی و ارتقا شغلی. مناسب برای کارآفرینان و سازمان ها برای جذب نیرو و دانشجویان برای کسب علم و کار مناسب. در حال حاضر پس از چندین سال تجربه برگزاری همایش، بیش از ۴۰۰۰ نفر دنبال کننده همایش هستند و محیطی شامل مجموعه ای از برنامه نویسان تشکیل شده است که فرصتی خوبی برای شبکه سازی، یادگیری و کسب تجربه های جدید است. اگر میخواهید شغل جدیدی پیدا کنید حتما شرکت ها و مجوعه های نرم افزاری زیادی در این همایش شرکت میکنند و به دنبال افرادی تلنتی مثل شما هستند و یا اینکه اگر میخواهید افرادی را که تجربه توسعه محصولات دیجیتالی زیادی را دارند با آنها ملاقات کنید و گپ و گفتی بزنید بازهم فرصت بسیار مناسبی است برای حضور و شبکه سازی در این همایش . اگر سوالی دارید و یا میخواهید اطلاعات بیشتری از همایش برنامه نویسی ری اکت کانف کسب کنید تنها کافیست با ایمیل همایش ارتباط برقرار کنید.",
19 | "sponsors.btn.title": "ارتباط با ما",
20 | "subscribe.title": "عضویت در خبرنامه",
21 | "subscribe.subtitle": "برای اطلاع از برنامه های اسپانسر شیپی با ما در تماس باشید برای اطلاع از برنامه های اسپانسر شیپی با ما در تماس باشید",
22 | "subscribe.btn.title": "همین حالا عضو بشین",
23 | "meet.people.title": "بخش کوچکی از هزاران کاربر همایش بزرگ و تخصصی ری اکت کانف",
24 | "partners.title": "برگزار کنندگان ری اکت کانف",
25 | "partners.friends.title": "حامیان پرانرژی ری اکت کانف ",
26 | "core.team.title": "تیم اصلی ری اکت کانف",
27 | "friends.team.title": "دوستان ری اکت کانف",
28 | "footer.organized": "برگزار کننده با",
29 | "footer.organized.by": "توسط",
30 | "footer.hastnama.link": "کارگاه خلاقیت و نوآوری هست نما",
31 | "footer.city": "تهران، جردن.",
32 | "core.team.milad.heydari": "میلاد حیدری",
33 | "core.team.des.milad.heydari": "بنیانگذار ری اکت کانف، مدیر فنی و هم بنیانگذار کارگاه خلاقیت و نوآوری هست نما",
34 | "core.team.ali.hariri": "علی حریری",
35 | "core.team.des.ali.hariri": "مدیر مارکتینگ ری اکت کانف",
36 | "core.team.majid.zamani": "مجید زمانی",
37 | "core.team.des.majid.zamani": "مدیر اجرایی",
38 | "core.team.behrouz.omran": "بهروز عمران",
39 | "core.team.des.behrouz.omran": "مدیر استراتژی",
40 | "core.team.pourya.sharifi": "پوریا شریفی",
41 | "core.team.des.pourya.sharifi": "مدیر پروژه ری اکت کانف، هم بنیانگذار و مدیرعامل کارگاه خلاقیت و نوآوری هست نما",
42 | "friends.siamak.mokhtari": "سیامک مختاری",
43 | "friends.des.siamak.mokhtari": "طراح و توسعه دهنده وب",
44 | "friends.samaneh.rabiee": "سمانه ربیعی",
45 | "friends.des.samaneh.rabiee": "طراح گرافیک",
46 | "friends.mehri.daei": "مهری دایی",
47 | "friends.des.mehri.daei": "توسعه دهنده وب",
48 | "form.title.firstname": "نام",
49 | "form.title.lastname": "نام خانوادگی",
50 | "form.title.email": "آدرس ایمیل",
51 | "form.title.experience": "تخصص شما",
52 | "form.title.phoneNumber": "شماره تماس",
53 | "form.valid.fill.firstname": "لطفا نام خود را وارد کنید!",
54 | "form.valid.fill.lastname": "لطفا نام خانوادگی خود را وارد کنید!",
55 | "form.valid.fill.email": "لطفا ایمیل خود را وارد کنید!",
56 | "form.valid.fill.phoneNumber": "لطفا شماره تماس خود را وارد کنید!",
57 | "form.valid.fill.experience": "لطفا تخصص خود را انتخاب کنید!",
58 | "form.valid.correct.email": "ایمیل وارد شده صحیح نمی باشد!",
59 | "software.engeering": "software"
60 | }
61 |
--------------------------------------------------------------------------------
/mock/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "cfp" :
3 | {
4 | "id":1,
5 | "avatar": "/static/images/speakerad.jpg",
6 | "className" :"hero",
7 | "slug": "speakers.subtitle",
8 | "description": "speakers.description",
9 | "hasLink":true,
10 | "linkTitle":"speakers.link.title",
11 | "url":"https://docs.google.com/forms/d/e/1FAIpQLSd_OSvbJL0GAjIeA0yRe8TLUmiWIiDrdJLCWXXgnLMSr52msw/viewform",
12 | "icons": [{
13 | "url": "https://www.gatsbyjs.org/",
14 | "icon": "gatsby"
15 | }, {
16 | "url": "https://graphql.org/",
17 | "icon": "graphql"
18 | },
19 | {
20 | "url": "https://sass-lang.com/",
21 | "icon": "sass"
22 | },
23 | {
24 | "url": "https://styled-components.com/",
25 | "icon": "styledComponents"
26 | },
27 | {
28 | "url": "https://storybook.js.org/",
29 | "icon": "storyBook"
30 | },
31 | {
32 | "url": "https://gohugo.io/documentation/",
33 | "icon": "hugo"
34 | },
35 | {
36 | "url": "https://developer.mozilla.org/en-US/docs/Web/CSS",
37 | "icon": "css"
38 | },
39 | {
40 | "url": "https://slack.com/intl/en-ie/",
41 | "icon": "slack"
42 | },
43 | {
44 | "url": "https://nodejs.org/en/",
45 | "icon": "node"
46 | },
47 | {
48 | "url": "https://reacttraining.com/react-router/",
49 | "icon": "reactRouter"
50 | },
51 | {
52 | "url": "https://reactjs.org/",
53 | "icon": "react"
54 | },
55 | {
56 | "url": "https://jestjs.io/",
57 | "icon": "jest"
58 | },
59 | {
60 | "url": "https://angular.io/",
61 | "icon": "angular"
62 | },
63 | {
64 | "url": "https://nodered.org/",
65 | "icon": "nodeRed"
66 | },
67 | {
68 | "url": "https://vuejs.org/",
69 | "icon": "vue"
70 | },
71 | {
72 | "url": "https://nuxtjs.org/",
73 | "icon": "nuxt"
74 | },
75 | {
76 | "url": "https://vuetifyjs.com/en/",
77 | "icon": "vuetify"
78 | },
79 | {
80 | "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript",
81 | "icon": "js"
82 | }
83 | ]
84 | },
85 | "peoples": [],
86 | "juries": [],
87 | "friends": [
88 | {
89 | "id":1,
90 | "avatar": "/static/images/people/ali.jpg",
91 | "slug": "core.team.ali.hariri",
92 | "description": "core.team.des.ali.hariri",
93 | "icons": [{
94 | "url": "https://www.linkedin.com/in/malihariri/",
95 | "icon": "linkedin"
96 | }]
97 | },
98 | {
99 | "id":2,
100 | "avatar": "/static/images/people/behrouz.jpg",
101 | "slug": "core.team.behrouz.omran",
102 | "description": "core.team.des.behrouz.omran",
103 | "icons": [{
104 | "url": "https://www.linkedin.com/in/malihariri/",
105 | "icon": "linkedin"
106 | }]
107 | },
108 | {
109 | "id":3,
110 | "avatar": "/static/images/people/siamak.jpg",
111 | "slug": "friends.siamak.mokhtari",
112 | "description": "friends.des.siamak.mokhtari",
113 | "icons": [{
114 | "url": "https://twitter.com/sia_mac",
115 | "icon": "twitter"
116 | }, {
117 | "url": "https://www.linkedin.com/in/siamakmokhtari/",
118 | "icon": "linkedin"
119 | },
120 | {
121 | "url": "https://www.github.com/siamak",
122 | "icon": "github"
123 | },
124 |
125 | {
126 | "url": "https://dribbble.com/siamak",
127 | "icon": "dribbble"
128 | }
129 | ]
130 | },
131 | {
132 | "id":4,
133 | "avatar": "/static/images/people/mehri.jpg",
134 | "slug": "friends.mehri.daei",
135 | "description": "friends.des.mehri.daei",
136 | "icons": [{
137 | "url": "https://twitter.com/mehridaie",
138 | "icon": "twitter"
139 | },{
140 | "url": "https://www.linkedin.com/in/mehridaei/",
141 | "icon": "linkedin"
142 | },{
143 | "url": "https://www.github.com/mehridaie",
144 | "icon": "github"
145 | },{
146 | "url": "https://mehridaei.com",
147 | "icon": "website"
148 | }
149 | ]
150 | },
151 | {
152 | "id":5,
153 | "avatar": "/static/images/people/samaneh.jpg",
154 | "slug": "friends.samaneh.rabiee",
155 | "description": "friends.des.samaneh.rabiee",
156 | "icons": [{
157 | "url": "https://www.linkedin.com/in/mehridaie/",
158 | "icon": "linkedin"
159 | }]
160 | }
161 | ],
162 | "team": [{
163 | "id":1,
164 | "avatar": "/static/images/people/milad.jpg",
165 | "slug": "core.team.milad.heydari",
166 | "description": "core.team.des.milad.heydari",
167 | "icons": [{
168 | "url": "http://www.linkedin.com/in/miladheydari",
169 | "icon": "linkedin"
170 | },
171 | {
172 | "url": "https://twitter.com/iammilaad",
173 | "icon": "twitter"
174 | },{
175 | "url": "http://www.instagram.com/iammilaad",
176 | "icon": "instagram"
177 | }, {
178 | "url": "https://github.com/miladbruce",
179 | "icon": "github"
180 | }
181 | ]
182 | }, {
183 | "id":2,
184 | "avatar": "/static/images/people/pourya.jpg",
185 | "slug": "core.team.pourya.sharifi",
186 | "description": "core.team.des.pourya.sharifi",
187 | "icons": [{
188 | "url": "https://www.linkedin.com/in/alaki",
189 | "icon": "linkedin"
190 | }, {
191 | "url": "https://twitter.com/alaki",
192 | "icon": "twitter"
193 | }]
194 | },
195 | {
196 | "id":3,
197 | "avatar": "/static/images/people/majid.jpg",
198 | "slug": "core.team.majid.zamani",
199 | "description": "core.team.des.majid.zamani",
200 | "icons": [{
201 | "url": "https://www.linkedin.com/in/majid-zamani-615006109/",
202 | "icon": "linkedin"
203 | }]
204 | }
205 | ],
206 | "partners" : [
207 | {
208 | "title": "ایده نگاران هست نما",
209 | "logo": "/static/images/partners/vip/hastnama.svg",
210 | "url": "https://hastnama.com"
211 | },
212 | {
213 | "title": "هست نما آکادمی",
214 | "logo": "/static/images/partners/vip/hastnama_academy.svg",
215 | "url": "https://hastnama.com/academy"
216 | },
217 | {
218 | "title": "آموزش برنامه نویسی برای کودکان",
219 | "logo": "/static/images/partners/vip/kidcoding.ir.svg",
220 | "url": "http://kidcoding.ir/"
221 | }
222 |
223 | ],
224 | "sponsors" : [
225 | {
226 | "title": "Siamak Mokhtari",
227 | "logo": "/static/images/partners/siamak.png",
228 | "url": "https://siamak.us"
229 | },
230 | {
231 | "title": "Virgool",
232 | "logo": "/static/images/partners/virgool.png",
233 | "url": "https://virgool.io"
234 | },
235 | {
236 | "title": "Webbranding",
237 | "logo": "/static/images/partners/webbranding.png",
238 | "url": "https://webbranding.org/"
239 | },
240 | {
241 | "title": "raychat",
242 | "logo": "/static/images/partners/raychat.png",
243 | "url": "https://raychat.io/"
244 | },
245 | {
246 | "title": "sazito",
247 | "logo": "/static/images/partners/sazito.png",
248 | "url": "https://sazito.com/"
249 | },
250 | {
251 | "title": "Tehran React Group",
252 | "logo": "/static/images/partners/reacttehran.png",
253 | "url": "https://t.me/tehranreact"
254 | },
255 | {
256 | "title": "macneed",
257 | "logo": "/static/images/partners/macneed.png",
258 | "url": "https://macneed.ir/"
259 | },
260 | {
261 | "title": "binosha",
262 | "logo": "/static/images/partners/Binosha.png",
263 | "url": "https://binosha.com"
264 | },
265 | {
266 | "title": "frontcast",
267 | "logo": "/static/images/partners/frontcast.png",
268 | "url": "http://frontcast.ir/"
269 | }
270 | ],
271 | "jobPositions" : [
272 | {
273 | "value": "Software Engineer",
274 | "label": "Software Engineer",
275 | "children": [
276 | {
277 | "value": "Mobile Developer",
278 | "label": "Mobile Developer"
279 | },
280 | {
281 | "value": "Frontend Developer",
282 | "label": "Frontend Developer"
283 | },
284 | {
285 | "value": "Backend Developer",
286 | "label": "Backend Developer"
287 | },
288 | {
289 | "value": "Full-Stack Developer",
290 | "label": "Full-Stack Developer"
291 | },
292 | {
293 | "value": "Engineering Manager",
294 | "label": "Engineering Manager"
295 | },
296 | {
297 | "value": "QA Engineer",
298 | "label": "QA Engineer"
299 | },
300 | {
301 | "value": "DevOps",
302 | "label": "DevOps"
303 | },
304 | {
305 | "value": "Software Architect",
306 | "label": "Software Architect"
307 | }
308 | ]
309 | },
310 | {
311 | "value": "Designer",
312 | "label": "Designer",
313 | "children": [
314 | {
315 | "value": "UI/UX Designer",
316 | "label": "UI/UX Designer"
317 | },
318 | {
319 | "value": "Visual Designer",
320 | "label": "Visual Designer"
321 | },
322 | {
323 | "value": "Creative Designer",
324 | "label": "Creative Designer"
325 | },
326 | {
327 | "value": "Graphic & Brand Designer",
328 | "label": "Graphic & Brand Designer"
329 | }
330 | ]
331 | },
332 | {
333 | "value": "Operations",
334 | "label": "Operations",
335 | "children": [
336 | {
337 | "value": "H.R.",
338 | "label": "H.R."
339 | },
340 | {
341 | "value": "Office Manager",
342 | "label": "Office Manager"
343 | },
344 | {
345 | "value": "Recruiter",
346 | "label": "Recruiter"
347 | },
348 | {
349 | "value": "Customer Service",
350 | "label": "Customer Service"
351 | },
352 | {
353 | "value": "Operations Manager",
354 | "label": "Operations Manager"
355 | }
356 | ]
357 | },
358 | {
359 | "value": "Sales",
360 | "label": "Sales",
361 | "children": [
362 | {
363 | "value": "Business Development",
364 | "label": "Business Development"
365 | },
366 | {
367 | "value": "Account Manager",
368 | "label": "Account Manager"
369 | },
370 | {
371 | "value": "Sales",
372 | "label": "Sales"
373 | },
374 | {
375 | "value": "Sales Engineer",
376 | "label": "Sales Engineer"
377 | }
378 | ]
379 | },
380 | {
381 | "value": "Marketing",
382 | "label": "Marketing",
383 | "children": [
384 | {
385 | "value": "Growth Hacker",
386 | "label": "Growth Hacker"
387 | },
388 | {
389 | "value": "Marketing Manager",
390 | "label": "Marketing Manager"
391 | },
392 | {
393 | "value": "Content Creator",
394 | "label": "Content Creator"
395 | },
396 | {
397 | "value": "Social Media Manager",
398 | "label": "Social Media Manager"
399 | }
400 | ]
401 | },
402 | {
403 | "value": "Finance",
404 | "label": "Finance",
405 | "children": [
406 | {
407 | "value": "Accountant",
408 | "label": "Accountant"
409 | },
410 | {
411 | "value": "Bookkeeper",
412 | "label": "Bookkeeper"
413 | },
414 | {
415 | "value": "Controller",
416 | "label": "Controller"
417 | },
418 | {
419 | "value": "Financial Analyst",
420 | "label": "Financial Analyst"
421 | }
422 | ]
423 | },
424 | {
425 | "value": "Other Engineering",
426 | "label": "Other Engineering",
427 | "children": [
428 | {
429 | "value": "Hardware Engineer",
430 | "label": "Hardware Engineer"
431 | },
432 | {
433 | "value": "Mechanical Engineer",
434 | "label": "Mechanical Engineer"
435 | },
436 | {
437 | "value": "Systems Engineer",
438 | "label": "Systems Engineer"
439 | }
440 | ]
441 | },
442 | {
443 | "value": "C-Level",
444 | "label": "C-Level",
445 | "children": [
446 | {
447 | "value": "CEO",
448 | "label": "CEO"
449 | },
450 | {
451 | "value": "CFO",
452 | "label": "CFO"
453 | },
454 | {
455 | "value": "CTO",
456 | "label": "CTO"
457 | },
458 | {
459 | "value": "CAO",
460 | "label": "CAO"
461 | },
462 | {
463 | "value": "CMO",
464 | "label": "CMO"
465 | }
466 | ]
467 | },
468 | {
469 | "value": "Other",
470 | "label": "Other",
471 | "children": [
472 | {
473 | "value": "Attorney",
474 | "label": "Attorney"
475 | },
476 | {
477 | "value": "Business Analyst",
478 | "label": "Business Analyst"
479 | },
480 | {
481 | "value": "Data Scientist",
482 | "label": "Data Scientist"
483 | },
484 | {
485 | "value": "Product Manager",
486 | "label": "Product Manager"
487 | },
488 | {
489 | "value": "Other",
490 | "label": "Other"
491 | }
492 | ]
493 | }
494 | ]
495 | }
496 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | const withSass = require("@zeit/next-sass");
2 | const { withPlugins } = require("next-compose-plugins");
3 | const withCss = require("@zeit/next-css");
4 | const withOffline = require("next-offline");
5 | const BrotliPlugin = require("brotli-webpack-plugin");
6 | const CompressionPlugin = require("compression-webpack-plugin");
7 | const withImages = require("next-images");
8 | const withBundleAnalyzer = require("@zeit/next-bundle-analyzer");
9 | const withAntd = require("./antd/antd-config");
10 | require("dotenv").config();
11 | const TerserPlugin = require("terser-webpack-plugin");
12 | const nextRuntimeDotenv = require("next-runtime-dotenv");
13 | const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
14 | const withENV = nextRuntimeDotenv({
15 | public: ["API_URL", "RANDOM_USER_LIMIT", "REACT_CONF_DATE"]
16 | });
17 | const {
18 | PHASE_PRODUCTION_BUILD,
19 | PHASE_PRODUCTION_SERVER,
20 | PHASE_EXPORT
21 | } = require("next/constants");
22 |
23 | const production = process.env.NODE_ENV === "production";
24 | const nextConfig = {
25 | exportPathMap: () => ({
26 | "/": { page: "/" },
27 | "/en": { page: "/" }
28 | }),
29 | analyzeServer: ["server", "both"].includes(process.env.BUNDLE_ANALYZE),
30 | analyzeBrowser: ["browser", "both"].includes(process.env.BUNDLE_ANALYZE),
31 | bundleAnalyzerConfig: {
32 | server: {
33 | analyzerMode: "static",
34 | reportFilename: "../bundles/server.html"
35 | },
36 | browser: {
37 | analyzerMode: "static",
38 | reportFilename: "../bundles/client.html"
39 | }
40 | },
41 | env: {
42 | API_URL: process.env.API_URL
43 | },
44 | publicRuntimeConfig: {
45 | API_URL: process.env.API_URL,
46 | RANDOM_USER_LIMIT: process.env.RANDOM_USER_LIMIT,
47 | REACT_CONF_DATE: process.env.REACT_CONF_DATE
48 | },
49 | distDir: "_next", // used to define the name of build dir, we need it to be _next, for serving gzip files
50 |
51 | // next js caches pages in dev mode, this config is used to increase cache time to have better dev experience
52 | // https://github.com/zeit/next.js/issues/1939
53 | onDemandEntries: {
54 | // Make sure entries are not getting disposed.
55 | maxInactiveAge: 1000 * 60 * 60,
56 | // number of pages that should be kept simultaneously without being disposed
57 | pagesBufferLength: 5
58 | },
59 | // webpack config
60 | webpack: (config, { dev }) => {
61 | if (production) {
62 | config.devtool = false;
63 | config.optimization.minimizer = [
64 | new OptimizeCSSAssetsPlugin({}),
65 | new TerserPlugin({
66 | parallel: true,
67 | sourceMap: false,
68 | terserOptions: {
69 | ecma: undefined,
70 | warnings: false,
71 | parse: {},
72 | compress: {},
73 | mangle: true, // Note `mangle.properties` is `false` by default.
74 | module: false,
75 | output: null,
76 | toplevel: false,
77 | nameCache: null,
78 | ie8: false,
79 | keep_classnames: undefined,
80 | keep_fnames: false,
81 | safari10: false
82 | }
83 | })
84 | ];
85 | for (const r of config.module.rules) {
86 | if (r.loader === "babel-loader") {
87 | r.options.sourceMaps = false;
88 | }
89 | }
90 | }
91 | !dev &&
92 | config.plugins.push(
93 | new BrotliPlugin({
94 | asset: "[path].br[query]",
95 | test: /\.js$|\.css$|\.html$/,
96 | threshold: 10240,
97 | minRatio: 0.7
98 | })
99 | );
100 |
101 | // Add gzip compression plugin
102 | !dev &&
103 | config.plugins.push(
104 | new CompressionPlugin({
105 | filename: "[path].gz[query]",
106 | algorithm: "gzip",
107 | test: /\.js$|\.css$|\.html$/,
108 | threshold: 10240,
109 | minRatio: 0.7
110 | })
111 | );
112 | return config;
113 | }
114 | };
115 |
116 | module.exports = withENV(
117 | withPlugins(
118 | [
119 | [withCss],
120 | [withSass],
121 | [withImages],
122 | [withAntd],
123 | [withBundleAnalyzer],
124 | [
125 | withOffline,
126 | {
127 | workboxOpts: {
128 | skipWaiting: true,
129 | runtimeCaching: [
130 | {
131 | urlPattern: /images/,
132 | handler: "CacheFirst"
133 | },
134 | {
135 | urlPattern: /fonts/,
136 | handler: "CacheFirst"
137 | },
138 | {
139 | urlPattern: /.*/,
140 | handler: "NetworkFirst"
141 | },
142 | {
143 | urlPattern: /api/,
144 | handler: "NetworkFirst",
145 | options: {
146 | cacheableResponse: {
147 | statuses: [0, 200],
148 | headers: {
149 | "x-test": "true"
150 | }
151 | }
152 | }
153 | }
154 | ]
155 | }
156 | },
157 | [PHASE_PRODUCTION_BUILD, PHASE_PRODUCTION_SERVER, PHASE_EXPORT]
158 | ]
159 | ],
160 | nextConfig
161 | )
162 | );
163 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "reactconf-iran-2020",
3 | "scripts": {
4 | "start": "cross-env NODE_ENV=development node server.js",
5 | "build": "cross-env NODE_ENV=production && next build",
6 | "server": "cross-env NODE_ENV=production && node server.js",
7 | "analyze": "cross-env BUNDLE_ANALYZE=both npm run build",
8 | "export": "cross-env NODE_ENV=production && next build && next export -o dist"
9 | },
10 | "dependencies": {
11 | "@next/bundle-analyzer": "^9.2.2",
12 | "@zeit/next-bundle-analyzer": "^0.1.2",
13 | "@zeit/next-css": "^1.0.1",
14 | "@zeit/next-sass": "^1.0.1",
15 | "antd": "^4.0.1",
16 | "axios": "^0.19.2",
17 | "babel-plugin-import": "^1.13.0",
18 | "babel-plugin-inline-react-svg": "^1.1.1",
19 | "brotli-webpack-plugin": "^1.1.0",
20 | "classnames": "^2.2.6",
21 | "compression-webpack-plugin": "^3.1.0",
22 | "cross-env": "^7.0.2",
23 | "dotenv": "^8.2.0",
24 | "express": "^4.17.1",
25 | "fs": "0.0.1-security",
26 | "install": "^0.13.0",
27 | "less": "^3.10.3",
28 | "less-loader": "^5.0.0",
29 | "less-vars-to-js": "^1.3.0",
30 | "lodash": "^4.17.15",
31 | "module-resolver": "^1.0.0",
32 | "moment-locales-webpack-plugin": "^1.2.0",
33 | "next": "^9.3.2",
34 | "next-compose-plugins": "^2.2.0",
35 | "next-images": "^1.3.1",
36 | "next-offline": "^5.0.0",
37 | "next-routes": "^1.4.2",
38 | "next-runtime-dotenv": "^1.2.0",
39 | "next-seo": "^4.4.0",
40 | "node-sass": "^4.12.0",
41 | "npm": "^6.10.3",
42 | "null-loader": "^3.0.0",
43 | "optimize-css-assets-webpack-plugin": "^5.0.3",
44 | "prettier": "^1.19.1",
45 | "rc-texty": "^0.2.0",
46 | "react": "^16.13.0",
47 | "react-css-grid": "^2.0.0-0",
48 | "react-dom": "^16.13.0",
49 | "react-intl": "^2.7.2",
50 | "react-lazyload": "^2.6.2",
51 | "react-scroll-parallax": "^2.1.2",
52 | "react-sticky-el": "^1.0.20",
53 | "styled-components": "^4.4.1",
54 | "superagent": "^5.1.0",
55 | "terser-webpack-plugin": "^2.3.5",
56 | "uglifyjs-webpack-plugin": "^2.2.0"
57 | },
58 | "devDependencies": {
59 | "babel-plugin-module-resolver": "^4.0.0",
60 | "babel-plugin-transform-remove-console": "^6.9.4"
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/pages/_app.js:
--------------------------------------------------------------------------------
1 | import React, { Fragment } from "react";
2 | import { IntlProvider } from "react-intl";
3 | import AppLocale from "localization";
4 | import get from "lodash/get";
5 | import { ConfigProvider } from "antd";
6 | import GlobalStyle from "styles/injectGlobal";
7 | import { IntlContextProvider } from "hooks/useIntl";
8 |
9 | function App(props) {
10 | const { Component, pageProps, locale } = props;
11 | const currentAppLocale = AppLocale[locale];
12 | return (
13 |
14 |
15 |
16 |
20 |
21 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | );
31 | }
32 |
33 | App.getInitialProps = async ({ Component, ctx }) => {
34 | let pageProps = {};
35 | if (Component.getInitialProps) {
36 | pageProps = await Component.getInitialProps({ ctx });
37 | }
38 | const originalUrl = get(ctx, "req.url", "");
39 | return {
40 | pageProps,
41 | locale: originalUrl.includes("/en") === true ? "en" : "fa"
42 | };
43 | };
44 |
45 | export default App;
46 |
--------------------------------------------------------------------------------
/pages/_document.js:
--------------------------------------------------------------------------------
1 | import Document, { Html, Head, Main, NextScript } from "next/document";
2 | import { ServerStyleSheet } from "styled-components";
3 | import React, { Fragment } from "react";
4 |
5 | export default class MyDocument extends Document {
6 | static getInitialProps({ renderPage }) {
7 | const sheet = new ServerStyleSheet();
8 |
9 | const page = renderPage(Component => props =>
10 | sheet.collectStyles( )
11 | );
12 |
13 | const styleElements = sheet.getStyleElement();
14 | return { ...page, styleElements };
15 | }
16 |
17 | render() {
18 | const { styleElements } = this.props;
19 |
20 | return (
21 |
22 |
23 | {styleElements}
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | );
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/pages/index.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState, Fragment } from "react";
2 | import People from "components/people";
3 | import Clients from "components/clients";
4 | import IntlMessage from "utils/intlMessage";
5 | import { shuffle } from "utils/shuffle";
6 | import Style from "partials/home/style";
7 | import data from "mock/data";
8 | import DoubleGrid from "components/layouts/doubleGrid";
9 | import SingleGrid from "components/layouts/singleGrid";
10 | import SponsorItem from "components/sponsorItem";
11 | import SubscribeForm from "components/subscribeForm";
12 | import MainLayout from "components/layouts/mainLayout";
13 | import { NextSeo } from "next-seo";
14 | import useIntl from "hooks/useIntl";
15 | import getConfig from "next/config";
16 | const {
17 | publicRuntimeConfig: { RANDOM_USER_LIMIT }
18 | } = getConfig();
19 |
20 | const { team, partners, sponsors, friends, cfp } = data;
21 |
22 | function Home({ locale }) {
23 | const intl = useIntl();
24 | const [randomUsers, setRandomUsers] = useState([]);
25 | useEffect(() => {
26 | import("mock/users.json").then(users => {
27 | const shuffleUsers = shuffle(users.default);
28 | shuffleUsers.length = RANDOM_USER_LIMIT || 250;
29 | setRandomUsers(shuffleUsers);
30 | });
31 | }, []);
32 | return (
33 |
34 |
41 |
98 |
99 | );
100 | }
101 | export default Home;
102 |
--------------------------------------------------------------------------------
/public/icons/android-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/android-icon-144x144.png
--------------------------------------------------------------------------------
/public/icons/android-icon-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/android-icon-192x192.png
--------------------------------------------------------------------------------
/public/icons/android-icon-36x36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/android-icon-36x36.png
--------------------------------------------------------------------------------
/public/icons/android-icon-48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/android-icon-48x48.png
--------------------------------------------------------------------------------
/public/icons/android-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/android-icon-72x72.png
--------------------------------------------------------------------------------
/public/icons/android-icon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/android-icon-96x96.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-114x114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-114x114.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-120x120.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-144x144.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-152x152.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-180x180.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-57x57.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-60x60.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-72x72.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-76x76.png
--------------------------------------------------------------------------------
/public/icons/apple-icon-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon-precomposed.png
--------------------------------------------------------------------------------
/public/icons/apple-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/apple-icon.png
--------------------------------------------------------------------------------
/public/icons/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 | #ffffff
--------------------------------------------------------------------------------
/public/icons/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/favicon-16x16.png
--------------------------------------------------------------------------------
/public/icons/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/favicon-32x32.png
--------------------------------------------------------------------------------
/public/icons/favicon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/favicon-96x96.png
--------------------------------------------------------------------------------
/public/icons/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/favicon.ico
--------------------------------------------------------------------------------
/public/icons/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "React Conf",
3 | "icons": [
4 | {
5 | "src": "/icons/android-icon-36x36.png",
6 | "sizes": "36x36",
7 | "type": "image.png",
8 | "density": "0.75"
9 | },
10 | {
11 | "src": "/icons/android-icon-48x48.png",
12 | "sizes": "48x48",
13 | "type": "image.png",
14 | "density": "1.0"
15 | },
16 | {
17 | "src": "/icons/android-icon-72x72.png",
18 | "sizes": "72x72",
19 | "type": "image.png",
20 | "density": "1.5"
21 | },
22 | {
23 | "src": "/icons/android-icon-96x96.png",
24 | "sizes": "96x96",
25 | "type": "image.png",
26 | "density": "2.0"
27 | },
28 | {
29 | "src": "/icons/android-icon-144x144.png",
30 | "sizes": "144x144",
31 | "type": "image.png",
32 | "density": "3.0"
33 | },
34 | {
35 | "src": "/icons/android-icon-192x192.png",
36 | "sizes": "192x192",
37 | "type": "image.png",
38 | "density": "4.0"
39 | }
40 | ]
41 | }
--------------------------------------------------------------------------------
/public/icons/ms-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/ms-icon-144x144.png
--------------------------------------------------------------------------------
/public/icons/ms-icon-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/ms-icon-150x150.png
--------------------------------------------------------------------------------
/public/icons/ms-icon-310x310.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/ms-icon-310x310.png
--------------------------------------------------------------------------------
/public/icons/ms-icon-70x70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/icons/ms-icon-70x70.png
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ReactConf",
3 | "icons": [
4 | {
5 | "src": "/icons/android-icon-36x36.png",
6 | "sizes": "36x36",
7 | "type": "image/png",
8 | "density": "0.75"
9 | },
10 | {
11 | "src": "/icons/android-icon-48x48.png",
12 | "sizes": "48x48",
13 | "type": "image/png",
14 | "density": "1.0"
15 | },
16 | {
17 | "src": "/icons/android-icon-72x72.png",
18 | "sizes": "72x72",
19 | "type": "image/png",
20 | "density": "1.5"
21 | },
22 | {
23 | "src": "/icons/android-icon-96x96.png",
24 | "sizes": "96x96",
25 | "type": "image/png",
26 | "density": "2.0"
27 | },
28 | {
29 | "src": "/icons/android-icon-144x144.png",
30 | "sizes": "144x144",
31 | "type": "image/png",
32 | "density": "3.0"
33 | },
34 | {
35 | "src": "/icons/android-icon-192x192.png",
36 | "sizes": "192x192",
37 | "type": "image/png",
38 | "density": "4.0"
39 | }
40 | ]
41 | }
--------------------------------------------------------------------------------
/public/sitemap.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 | https://reactconf.ir/
9 | 2020-03-30T17:02:21+00:00
10 | 1.00
11 |
12 |
13 | https://reactconf.ir/en
14 | 2020-03-30T17:02:21+00:00
15 | 0.80
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/public/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/favicon.ico
--------------------------------------------------------------------------------
/public/static/fonts/inter.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/inter.woff2
--------------------------------------------------------------------------------
/public/static/fonts/vazir/eot/Vazir-Black.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/eot/Vazir-Black.eot
--------------------------------------------------------------------------------
/public/static/fonts/vazir/eot/Vazir-Bold.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/eot/Vazir-Bold.eot
--------------------------------------------------------------------------------
/public/static/fonts/vazir/eot/Vazir-Light.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/eot/Vazir-Light.eot
--------------------------------------------------------------------------------
/public/static/fonts/vazir/eot/Vazir-Medium.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/eot/Vazir-Medium.eot
--------------------------------------------------------------------------------
/public/static/fonts/vazir/eot/Vazir-Thin.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/eot/Vazir-Thin.eot
--------------------------------------------------------------------------------
/public/static/fonts/vazir/eot/Vazir.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/eot/Vazir.eot
--------------------------------------------------------------------------------
/public/static/fonts/vazir/ttf/Vazir-Black.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/ttf/Vazir-Black.ttf
--------------------------------------------------------------------------------
/public/static/fonts/vazir/ttf/Vazir-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/ttf/Vazir-Bold.ttf
--------------------------------------------------------------------------------
/public/static/fonts/vazir/ttf/Vazir-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/ttf/Vazir-Light.ttf
--------------------------------------------------------------------------------
/public/static/fonts/vazir/ttf/Vazir-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/ttf/Vazir-Medium.ttf
--------------------------------------------------------------------------------
/public/static/fonts/vazir/ttf/Vazir-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/ttf/Vazir-Thin.ttf
--------------------------------------------------------------------------------
/public/static/fonts/vazir/ttf/Vazir.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/ttf/Vazir.ttf
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff/Vazir-Black.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff/Vazir-Black.woff
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff/Vazir-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff/Vazir-Bold.woff
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff/Vazir-Light.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff/Vazir-Light.woff
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff/Vazir-Medium.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff/Vazir-Medium.woff
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff/Vazir-Thin.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff/Vazir-Thin.woff
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff/Vazir.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff/Vazir.woff
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff/desktop.ini:
--------------------------------------------------------------------------------
1 | [LocalizedFileNames]
2 | Vazir-FD.woff=@Vazir-FD.woff,0
3 | Vazir-Bold-FD.woff=@Vazir-Bold-FD.woff,0
4 | Vazir-Black-FD.woff=@Vazir-Black-FD.woff,0
5 | Vazir-Thin-FD.woff=@Vazir-Thin-FD.woff,0
6 | Vazir-Medium-FD.woff=@Vazir-Medium-FD.woff,0
7 | Vazir-Light-FD.woff=@Vazir-Light-FD.woff,0
8 | Vazir-Bold.woff=@Vazir-Bold.woff,0
9 | Vazir-Black.woff=@Vazir-Black.woff,0
10 | Vazir.woff=@Vazir.woff,0
11 | Vazir-Thin.woff=@Vazir-Thin.woff,0
12 | Vazir-Medium.woff=@Vazir-Medium.woff,0
13 | Vazir-Light.woff=@Vazir-Light.woff,0
14 |
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff2/Vazir-Black.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff2/Vazir-Black.woff2
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff2/Vazir-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff2/Vazir-Bold.woff2
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff2/Vazir-Light.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff2/Vazir-Light.woff2
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff2/Vazir-Medium.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff2/Vazir-Medium.woff2
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff2/Vazir-Thin.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff2/Vazir-Thin.woff2
--------------------------------------------------------------------------------
/public/static/fonts/vazir/woff2/Vazir.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/fonts/vazir/woff2/Vazir.woff2
--------------------------------------------------------------------------------
/public/static/images/ReactConf.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | React_conf
5 | Created with Sketch.
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/public/static/images/contact.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/public/static/images/hall.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/hall.jpg
--------------------------------------------------------------------------------
/public/static/images/icon/apple-touch-icon-114x114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/apple-touch-icon-114x114.png
--------------------------------------------------------------------------------
/public/static/images/icon/apple-touch-icon-120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/apple-touch-icon-120x120.png
--------------------------------------------------------------------------------
/public/static/images/icon/apple-touch-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/apple-touch-icon-144x144.png
--------------------------------------------------------------------------------
/public/static/images/icon/apple-touch-icon-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/apple-touch-icon-152x152.png
--------------------------------------------------------------------------------
/public/static/images/icon/apple-touch-icon-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/apple-touch-icon-180x180.png
--------------------------------------------------------------------------------
/public/static/images/icon/apple-touch-icon-57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/apple-touch-icon-57x57.png
--------------------------------------------------------------------------------
/public/static/images/icon/apple-touch-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/apple-touch-icon-72x72.png
--------------------------------------------------------------------------------
/public/static/images/icon/apple-touch-icon-76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/apple-touch-icon-76x76.png
--------------------------------------------------------------------------------
/public/static/images/icon/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/apple-touch-icon.png
--------------------------------------------------------------------------------
/public/static/images/icon/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/icon/favicon.ico
--------------------------------------------------------------------------------
/public/static/images/like.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
8 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/public/static/images/partners/Binosha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/Binosha.png
--------------------------------------------------------------------------------
/public/static/images/partners/flerbo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/flerbo.png
--------------------------------------------------------------------------------
/public/static/images/partners/frontcast.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/frontcast.png
--------------------------------------------------------------------------------
/public/static/images/partners/karlib.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/public/static/images/partners/macneed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/macneed.png
--------------------------------------------------------------------------------
/public/static/images/partners/raychat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/raychat.png
--------------------------------------------------------------------------------
/public/static/images/partners/reacttehran.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/reacttehran.png
--------------------------------------------------------------------------------
/public/static/images/partners/sazito.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/sazito.png
--------------------------------------------------------------------------------
/public/static/images/partners/siamak.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/siamak.png
--------------------------------------------------------------------------------
/public/static/images/partners/vip/hastnama-color.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/public/static/images/partners/vip/hastnama.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/public/static/images/partners/virgool.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/virgool.png
--------------------------------------------------------------------------------
/public/static/images/partners/virgool.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | virgool
5 | Created with Sketch.
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/public/static/images/partners/webbranding.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/partners/webbranding.png
--------------------------------------------------------------------------------
/public/static/images/people/ali.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/people/ali.jpg
--------------------------------------------------------------------------------
/public/static/images/people/behrouz.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/people/behrouz.jpg
--------------------------------------------------------------------------------
/public/static/images/people/majid.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/people/majid.jpg
--------------------------------------------------------------------------------
/public/static/images/people/mehri.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/people/mehri.jpg
--------------------------------------------------------------------------------
/public/static/images/people/milad.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/people/milad.jpg
--------------------------------------------------------------------------------
/public/static/images/people/pourya.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/people/pourya.jpg
--------------------------------------------------------------------------------
/public/static/images/people/samaneh.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/people/samaneh.jpg
--------------------------------------------------------------------------------
/public/static/images/people/siamak.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/people/siamak.jpg
--------------------------------------------------------------------------------
/public/static/images/people/spearkes.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/people/spearkes.jpg
--------------------------------------------------------------------------------
/public/static/images/reactconf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/reactconf.png
--------------------------------------------------------------------------------
/public/static/images/speakerad.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/speakerad.jpg
--------------------------------------------------------------------------------
/public/static/images/subscribe.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/subscribe.jpg
--------------------------------------------------------------------------------
/public/static/images/subscribeIcon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/static/images/surprise.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/surprise.jpg
--------------------------------------------------------------------------------
/public/static/images/talking.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/talking.jpg
--------------------------------------------------------------------------------
/public/static/images/ticket.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/images/ticket.jpg
--------------------------------------------------------------------------------
/public/static/reactconf-iran-share.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/reactconf-iran-share.jpg
--------------------------------------------------------------------------------
/public/static/video/pr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/video/pr.gif
--------------------------------------------------------------------------------
/public/static/video/static.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/public/static/video/static.mp4
--------------------------------------------------------------------------------
/reactconf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ReactConf/nextjs-boilerplate-reactconf-ir2020/b67b1f86e55d5b87838303afa3623eb366d48d13/reactconf.png
--------------------------------------------------------------------------------
/registerServiceWorker.js:
--------------------------------------------------------------------------------
1 | // In production, we register a service worker to serve assets from local cache.
2 |
3 | // This lets the app load faster on subsequent visits in production, and gives
4 | // it offline capabilities. However, it also means that developers (and users)
5 | // will only see deployed updates on the "N+1" visit to a page, since previously
6 | // cached resources are updated in the background.
7 |
8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
9 | // This link also includes instructions on opting out of this behavior.
10 |
11 | const isLocalhost = Boolean(
12 | window.location.hostname === "localhost" ||
13 | // [::1] is the IPv6 localhost address.
14 | window.location.hostname === "[::1]" ||
15 | // 127.0.0.1/8 is considered localhost for IPv4.
16 | window.location.hostname.match(
17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
18 | )
19 | );
20 |
21 | export default function register() {
22 | if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) {
23 | // The URL constructor is available in all browsers that support SW.
24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
25 | if (publicUrl.origin !== window.location.origin) {
26 | // Our service worker won't work if PUBLIC_URL is on a different origin
27 | // from what our page is served on. This might happen if a CDN is used to
28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
29 | return;
30 | }
31 |
32 | window.addEventListener("load", () => {
33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
34 |
35 | if (isLocalhost) {
36 | // This is running on localhost. Lets check if a service worker still exists or not.
37 | checkValidServiceWorker(swUrl);
38 | } else {
39 | // Is not local host. Just register service worker
40 | registerValidSW(swUrl);
41 | }
42 | });
43 | }
44 | }
45 |
46 | function registerValidSW(swUrl) {
47 | navigator.serviceWorker
48 | .register(swUrl)
49 | .then(registration => {
50 | registration.onupdatefound = () => {
51 | const installingWorker = registration.installing;
52 | installingWorker.onstatechange = () => {
53 | if (installingWorker.state === "installed") {
54 | if (navigator.serviceWorker.controller) {
55 | // At this point, the old content will have been purged and
56 | // the fresh content will have been added to the cache.
57 | // It's the perfect time to display a "New content is
58 | // available; please refresh." message in your web app.
59 | console.log(
60 | "New content is available; please refresh."
61 | );
62 | } else {
63 | // At this point, everything has been precached.
64 | // It's the perfect time to display a
65 | // "Content is cached for offline use." message.
66 | console.log("Content is cached for offline use.");
67 | }
68 | }
69 | };
70 | };
71 | })
72 | .catch(error => {
73 | console.error("Error during service worker registration:", error);
74 | });
75 | }
76 |
77 | function checkValidServiceWorker(swUrl) {
78 | // Check if the service worker can be found. If it can't reload the page.
79 | fetch(swUrl)
80 | .then(response => {
81 | // Ensure service worker exists, and that we really are getting a JS file.
82 | if (
83 | response.status === 404 ||
84 | response.headers.get("content-type").indexOf("javascript") ===
85 | -1
86 | ) {
87 | // No service worker found. Probably a different app. Reload the page.
88 | navigator.serviceWorker.ready.then(registration => {
89 | registration.unregister().then(() => {
90 | window.location.reload();
91 | });
92 | });
93 | } else {
94 | // Service worker found. Proceed as normal.
95 | registerValidSW(swUrl);
96 | }
97 | })
98 | .catch(() => {
99 | console.log(
100 | "No internet connection found. App is running in offline mode."
101 | );
102 | });
103 | }
104 |
105 | export function unregister() {
106 | if ("serviceWorker" in navigator) {
107 | navigator.serviceWorker.ready.then(registration => {
108 | registration.unregister();
109 | });
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/routes.js:
--------------------------------------------------------------------------------
1 | const nextRoutes = require("next-routes");
2 | const routes = (module.exports = nextRoutes());
3 |
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const next = require("next");
3 | const routes = require("./routes");
4 | const app = next({ dev: process.env.NODE_ENV !== "production" });
5 | const handler = routes.getRequestHandler(app);
6 |
7 | app.prepare().then(() => {
8 | const server = express();
9 | server.get("/", (req, res) => {
10 | return app.render(req, res, "/", req.query);
11 | });
12 | server.get("/en", (req, res) => {
13 | return app.render(req, res, "/", req.query);
14 | });
15 | server.use(handler);
16 | const port = process.env.PORT || 4000;
17 | server.listen(port, err => {
18 | if (err) throw err;
19 | console.log(
20 | `> Env ${process.env.NODE_ENV} Ready on http://localhost:${port}`
21 | ); // eslint-disable-line no-console
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/styles/injectGlobal.js:
--------------------------------------------------------------------------------
1 | import { createGlobalStyle } from "styled-components";
2 | import { isRTL } from "utils/isRTL";
3 |
4 | export const fontFamily = {
5 | persian:
6 | "Vazir, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"",
7 | english:
8 | "Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\" "
9 | };
10 |
11 | const GlobalStyle = createGlobalStyle`
12 | @font-face {
13 | font-family: 'Inter';
14 | font-weight: 100 900;
15 | font-style: normal;
16 | font-named-instance: 'Regular';
17 | src: url("/static/fonts/inter.woff2") format("woff2");
18 | }
19 |
20 | ///vazir font
21 | @font-face {
22 | font-family: Vazir;
23 | src: url('static/fonts/vazir/eot/Vazir.eot');
24 | src: url('static/fonts/vazir/eot/Vazir.eot?#iefix') format('embedded-opentype'),
25 | url('static/fonts/vazir/woff2/Vazir.woff2') format('woff2'),
26 | url('static/fonts/vazir/woff/Vazir.woff') format('woff'),
27 | url('static/fonts/vazir/ttf/Vazir.ttf') format('truetype');
28 | font-weight: normal;
29 | font-style: normal;
30 | }
31 |
32 | @font-face {
33 | font-family: Vazir;
34 | src: url('static/fonts/vazir/eot/Vazir-Bold.eot');
35 | src: url('static/fonts/vazir/eot/Vazir-Bold.eot?#iefix') format('embedded-opentype'),
36 | url('static/fonts/vazir/woff2/Vazir-Bold.woff2') format('woff2'),
37 | url('static/fonts/vazir/woff/Vazir-Bold.woff') format('woff'),
38 | url('static/fonts/vazir/ttf/Vazir-Bold.ttf') format('truetype');
39 | font-weight: bold;
40 | font-style: normal;
41 | }
42 |
43 | @font-face {
44 | font-family: Vazir;
45 | src: url('static/fonts/vazir/eot/Vazir-Light.eot');
46 | src: url('static/fonts/vazir/eot/Vazir-Light.eot?#iefix') format('embedded-opentype'),
47 | url('static/fonts/vazir/woff2/Vazir-Light.woff2') format('woff2'),
48 | url('static/fonts/vazir/woff/Vazir-Light.woff') format('woff'),
49 | url('static/fonts/vazir/ttf/Vazir-Light.ttf') format('truetype');
50 | font-weight: 300;
51 | font-style: normal;
52 | }
53 |
54 | @font-face {
55 | font-family: Vazir;
56 | src: url('static/fonts/vazir/eot/Vazir-Medium.eot');
57 | src: url('static/fonts/vazir/eot/Vazir-Medium.eot?#iefix') format('embedded-opentype'),
58 | url('static/fonts/vazir/woff2/Vazir-Medium.woff2') format('woff2'),
59 | url('static/fonts/vazir/woff/Vazir-Medium.woff') format('woff'),
60 | url('static/fonts/vazir/ttf/Vazir-Medium.ttf') format('truetype');
61 | font-weight: 500;
62 | font-style:normal;
63 | }
64 |
65 | @font-face {
66 | font-family: Vazir;
67 | src: url('static/fonts/vazir/eot/Vazir-Thin.eot');
68 | src: url('static/fonts/vazir/eot/Vazir-Thin.eot?#iefix') format('embedded-opentype'),
69 | url('static/fonts/vazir/woff2/Vazir-Thin.woff2') format('woff2'),
70 | url('static/fonts/vazir/woff/Vazir-Thin.woff') format('woff'),
71 | url('static/fonts/vazir/ttf/Vazir-Thin.ttf') format('truetype');
72 | font-weight: 100;
73 | font-style:normal;
74 | }
75 |
76 | @font-face {
77 | font-family: Vazir;
78 | src: url('static/fonts/vazir/eot/Vazir-Black.eot');
79 | src: url('static/fonts/vazir/eot/Vazir-Black.eot?#iefix') format('embedded-opentype'),
80 | url('static/fonts/vazir/woff2/Vazir-Black.woff2') format('woff2'),
81 | url('static/fonts/vazir/woff/Vazir-Black.woff') format('woff'),
82 | url('static/fonts/vazir/ttf/Vazir-Black.ttf') format('truetype');
83 | font-weight: 900;
84 | font-style: style;
85 | }
86 | body {
87 | direction: ${({ locale }) => (isRTL(locale) ? "rtl" : "ltr")};
88 | font-family: ${({ locale }) =>
89 | isRTL(locale) ? fontFamily.persian : fontFamily.english};
90 | color: red;
91 | }
92 | .ant-message-notice-content {
93 | color:var(--foreground-color);
94 | box-shadow:
95 | 0 2.8px 2.2px rgba(0, 0, 0, 0.034),
96 | 0 6.7px 5.3px rgba(0, 0, 0, 0.048),
97 | 0 12.5px 10px rgba(0, 0, 0, 0.06),
98 | 0 22.3px 17.9px rgba(0, 0, 0, 0.072),
99 | 0 41.8px 33.4px rgba(0, 0, 0, 0.086),
100 | 0 100px 80px rgba(0, 0, 0, 0.12);
101 | background-color:#37383e;
102 | font-family: ${({ locale }) =>
103 | isRTL(locale) ? fontFamily.persian : fontFamily.english};
104 | }
105 | .ant-message .anticon {
106 | ${({ locale }) => (isRTL(locale) ? "margin-left: 8px" : "margin-right: 8px")}
107 | }
108 | .ant-form-item-explain, .ant-form-item-extra {
109 | padding-top:10px;
110 | }
111 |
112 | .ant-cascader-menus {
113 | font-family: 'Inter';
114 | }
115 | .ant-cascader-menu{
116 | padding-bottom:10px;
117 | .ant-cascader-menu-item-expand,.ant-cascader-menu-item {
118 | font-size:14px;
119 | }
120 | }
121 | .ant-cascader-picker .ant-cascader-input {
122 | border:none;
123 | font-size: 14px;
124 | padding:0px 11px;
125 | transition: background-color 5000s ease-in-out 0s;
126 | line-height: 50px;
127 | box-shadow: rgb(55, 56, 62) 0px 0px 0px 1000px inset;
128 | }
129 | .ant-cascader-picker {
130 | max-width:450px;
131 | width:100%;
132 | background-color:#37383e;
133 | color: var(--foreground-color);
134 | }
135 | .ant-cascader-picker:focus .ant-cascader-input {
136 | border-color:transparent;
137 | box-shadow:none;
138 | }
139 | .ant-cascader-picker-label {
140 | z-index:9999;
141 | }
142 | `;
143 | export default GlobalStyle;
144 |
--------------------------------------------------------------------------------
/styles/modules/colors.scss:
--------------------------------------------------------------------------------
1 | :root {
2 | --primary-color: #8C77F1;
3 | --secondary-color: #FFBA54;
4 | --background-color: #1a1a21;
5 | --foreground-color: #CFCED9;
6 | --light-gray-color: #A3A3A9;
7 | --gray-color: #4B4A53;
8 | --black-color: #33323E;
9 | }
10 |
--------------------------------------------------------------------------------
/styles/modules/grid.scss:
--------------------------------------------------------------------------------
1 | // Variables:
2 | $width-container: 75rem;
3 |
4 | .container {
5 | width: $width-container;
6 | max-width: 100%;
7 | margin: 0 auto;
8 | padding: 0 var(--gap);
9 | }
10 |
11 | .container-fluid,
12 | .container {
13 | margin-right: auto;
14 | margin-left: auto;
15 | }
16 |
17 | .container-fluid {
18 | padding-right: 80px;
19 | padding-left: 80px;
20 | &.l-0 {
21 | padding-left: 0;
22 | }
23 | &.r-0 {
24 | padding-right: 0;
25 | }
26 | @media only screen and (min-width: 48rem) and (max-width: 72rem) {
27 | padding-right: 40px;
28 | padding-left: 40px;
29 | }
30 | @media only screen and (max-width: 48rem) {
31 | padding-right: 20px;
32 | padding-left: 20px;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/styles/modules/timetable.scss:
--------------------------------------------------------------------------------
1 | .table {
2 | margin: 0 auto;
3 | }
4 |
5 | .table-head_featured {
6 | position: relative;
7 | color: #fefefe;
8 | background-color: var(--black-color) !important;
9 | border: 0;
10 | border-radius: var(--radius) var(--radius) 0 0;
11 | box-shadow: 0 1.5px 4px rgba(0, 0, 0, 0.24);
12 | }
13 |
14 | .table-row {
15 | background-color: var(--background-color);
16 |
17 | padding: var(--gap);
18 | &.is-break {
19 | background-color: var(--secondary-color) !important;
20 | .subject {
21 | color: var(--black-color) !important;
22 | }
23 | .summary {
24 | color: var(--gray-color) !important;
25 | }
26 | .gray {
27 | color: var(--black-color) !important;
28 | }
29 | }
30 | .wrap-row {
31 | display: flex;
32 | flex-direction: column-reverse;
33 | @media only screen and (min-width: 48rem) {
34 | display: grid;
35 | grid-template-columns: 3fr 1fr;
36 | grid-column-gap: calc(var(--gap) * 2);
37 | justify-items: stretch;
38 | align-items: center;
39 | }
40 | .side {
41 | text-align: center;
42 | &__row {
43 | display: block;
44 | margin-top: 0.5rem;
45 | }
46 | &__btn {
47 | display: inline-block;
48 | text-transform: uppercase;
49 | border: 1px solid var(--gray-color);
50 | color: darken(#6f6d75, 1);
51 | padding: 2px 12px;
52 | border-radius: 4px;
53 | min-width: 6rem;
54 | text-align: center;
55 | box-shadow: 0 1px 1px rgba(#666, 0.1);
56 | transition: 0.2s ease-in-out;
57 | &:hover {
58 | background-color: rgba(#fff, 0.1);
59 | color: darken(#6f6d75, 1);
60 | }
61 | &--icon {
62 | display: inline-block;
63 | width: 16px;
64 | height: 16px;
65 | vertical-align: -2px;
66 | margin-right: 0.35em;
67 | color: var(--secondary-color);
68 | }
69 | + .side__btn {
70 | margin-left: 0.5em;
71 | }
72 | }
73 | @media only screen and (max-width: 48rem) {
74 | margin-bottom: var(--baseline);
75 | }
76 | }
77 | .summary {
78 | font-size: 1rem;
79 | line-height: 1.3;
80 | margin-bottom: 0;
81 | color: var(--light-gray-color);
82 | }
83 | .subject {
84 | color: var(--foreground-color);
85 | .icons {
86 | display: inline-block;
87 | width: 1.25em;
88 | height: 1.25em;
89 | vertical-align: -1px;
90 | opacity: 0.95;
91 | margin-right: 0.25em;
92 | }
93 | }
94 | .speaker {
95 | margin-top: var(--baseline);
96 | img {
97 | display: inline-block;
98 | vertical-align: middle;
99 | background-color: var(--foreground-color);
100 | width: 2rem;
101 | height: 2rem;
102 | margin-right: 0.5rem;
103 | border-radius: 100%;
104 | }
105 | }
106 | }
107 | }
108 |
109 | .table-row:nth-of-type(odd) {
110 | background-color: #f6f6f6;
111 | .subject {
112 | color: var(--black-color);
113 | }
114 | .speaker, .summary {
115 | color: var(--black-color);
116 | }
117 | .gray {
118 | color: var(--black-color);
119 | }
120 | .side__btn {
121 | border-color: #b1b1b9;
122 | &--icon {
123 | color: var(--primary-color);
124 | }
125 | &:hover {
126 | background-color: rgba(#000, 0.1);
127 | }
128 | }
129 | }
130 |
131 | .table-row:last-of-type {
132 | border-radius: 0 0 var(--radius) var(--radius);
133 | }
134 |
135 | .table-row .gray {
136 | color: var(--foreground-color);
137 | font-weight: 900;
138 | font-size: 1.25rem;
139 | }
140 |
141 | .table-row h4 {
142 | margin: 0.5em auto;
143 | color: var(--black-color);
144 | }
145 |
--------------------------------------------------------------------------------
/styles/modules/typography.scss:
--------------------------------------------------------------------------------
1 | // Variables:
2 | $type-settings: (
3 | 320: (
4 | "ratio": 1.5,
5 | "base": 14,
6 | "types": (
7 | 1: (
8 | line-height: 1
9 | ),
10 | 2: (
11 | line-height: 1
12 | ),
13 | 3: (
14 | line-height: 1
15 | ),
16 | 4: (
17 | line-height: 2
18 | ),
19 | 5: (
20 | line-height: 3
21 | )
22 | )
23 | ),
24 | 576: (
25 | "ratio": 1.5,
26 | "base": 16,
27 | "types": (
28 | 1: (
29 | line-height: 1
30 | ),
31 | 2: (
32 | line-height: 1
33 | ),
34 | 3: (
35 | line-height: 2
36 | ),
37 | 4: (
38 | line-height: 2.5
39 | ),
40 | 5: (
41 | line-height: 3
42 | )
43 | )
44 | ),
45 | 768: (
46 | "ratio": 1.5,
47 | "base": 18,
48 | "types": (
49 | 1: (
50 | line-height: 1
51 | ),
52 | 2: (
53 | line-height: 1
54 | ),
55 | 3: (
56 | line-height: 2
57 | ),
58 | 4: (
59 | line-height: 3
60 | ),
61 | 5: (
62 | line-height: 4
63 | )
64 | )
65 | ),
66 | 992: (
67 | "ratio": 1.75,
68 | "base": 20,
69 | "types": (
70 | 1: (
71 | line-height: 1
72 | ),
73 | 2: (
74 | line-height: 2
75 | ),
76 | 3: (
77 | line-height: 2
78 | ),
79 | 4: (
80 | line-height: 4
81 | ),
82 | 5: (
83 | line-height: 6
84 | )
85 | )
86 | )
87 | );
88 |
89 | :root {
90 | --baseline: 1.75rem;
91 | --gap: 1.5rem;
92 | --radius: 0.25rem;
93 | }
94 |
95 | @media (min-width: 768px) and (max-width: 1440px) {
96 | :root {
97 | --baseline: 1.5rem;
98 | }
99 | }
100 | @media (max-width: 768px) {
101 | :root {
102 | --baseline: 1.25rem;
103 | }
104 | }
105 |
106 | // Functions:
107 |
108 | // poly-fluid-sizing
109 | // Generate linear interpolated size values through multiple break points
110 | // @param $property - A string CSS property name
111 | // @param $map - A SASS map of viewport unit and size value pairs
112 | // @requires function linear-interpolation
113 | // @requires function map-sort
114 | // @example: @include poly-fluid-sizing('font-size', (576px: 22px, 768px: 24px, 992px: 34px));
115 | @mixin poly-fluid-sizing($property, $map) {
116 | // Get the number of provided breakpoints
117 | $length: length(map-keys($map));
118 |
119 | // Error if the number of breakpoints is < 2
120 | @if ($length < 2) {
121 | @error "poly-fluid-sizing() $map requires at least values";
122 | }
123 |
124 | // Sort the map by viewport width (key)
125 | $map: map-sort($map);
126 | $keys: map-keys($map);
127 | $minItem: map-get($map, nth($keys, 1));
128 |
129 | // Minimum size
130 | font-size: map-get($minItem, "font-size");
131 | line-height: map-get($minItem, "line-height");
132 |
133 | // Interpolated size through breakpoints
134 | @for $i from 1 through ($length - 1) {
135 | $item: map-get($map, nth($keys, $i));
136 |
137 | @media (min-width: nth($keys,$i)) {
138 | font-size: linear-interpolation(
139 | (
140 | nth($keys, $i): map-get($item, "font-size"),
141 | nth($keys, ($i + 1)):
142 | map-get(
143 | map-get($map, nth($keys, ($i + 1))),
144 | "font-size"
145 | )
146 | )
147 | );
148 | line-height: map-get(
149 | map-get($map, nth($keys, ($i + 1))),
150 | "line-height"
151 | );
152 | }
153 | }
154 |
155 | // Maxmimum size
156 | @media (min-width: nth($keys,$length)) {
157 | $maxItem: map-get($map, nth($keys, $length));
158 | font-size: map-get($maxItem, "font-size");
159 | line-height: map-get($maxItem, "line-height");
160 | }
161 | }
162 |
163 | // linear-interpolation
164 | // Calculate the definition of a line between two points
165 | // @param $map - A SASS map of viewport widths and size value pairs
166 | // @returns A linear equation as a calc() function
167 | // @example: font-size: linear-interpolation((320px: 18px, 768px: 26px));
168 | @function linear-interpolation($map) {
169 | $keys: map-keys($map);
170 | @if (length($keys) != 2) {
171 | @error "linear-interpolation() $map must be exactly 2 values";
172 | }
173 | // The slope
174 | $m: (map-get($map, nth($keys, 2)) - map-get($map, nth($keys, 1)))/ (nth(
175 | $keys,
176 | 2
177 | ) - nth($keys, 1));
178 |
179 | // The y-intercept
180 | $b: map-get($map, nth($keys, 1)) - $m * nth($keys, 1);
181 |
182 | // Determine if the sign should be positive or negative
183 | $sign: "+";
184 | @if ($b < 0) {
185 | $sign: "-";
186 | $b: abs($b);
187 | }
188 |
189 | @return calc(#{$m * 100}vw #{$sign} #{$b});
190 | }
191 |
192 | // list-sort
193 | // Sort a SASS list
194 | // @param $list - A SASS list
195 | // @returns A sorted SASS list
196 | // @requires function list-remove
197 | @function list-sort($list) {
198 | $sortedlist: ();
199 | @while length($list) > 0 {
200 | $value: nth($list, 1);
201 | @each $item in $list {
202 | @if $item < $value {
203 | $value: $item;
204 | }
205 | }
206 | $sortedlist: append($sortedlist, $value, "space");
207 | $list: list-remove($list, index($list, $value));
208 | }
209 | @return $sortedlist;
210 | }
211 |
212 | // map-sort
213 | // Sort map by keys
214 | // @param $map - A SASS map
215 | // @returns A SASS map sorted by keys
216 | // @requires function list-sort
217 | @function map-sort($map) {
218 | $keys: list-sort(map-keys($map));
219 | $sortedMap: ();
220 | @each $key in $keys {
221 | $sortedMap: map-merge(
222 | $sortedMap,
223 | (
224 | $key: map-get($map, $key)
225 | )
226 | );
227 | }
228 | @return $sortedMap;
229 | }
230 |
231 | // list-remove
232 | // Remove an item from a list
233 | // @param $list - A SASS list
234 | // @param $index - The list index to remove
235 | // @returns A SASS list
236 | @function list-remove($list, $index) {
237 | $newList: ();
238 | @for $i from 1 through length($list) {
239 | @if $i != $index {
240 | $newList: append($newList, nth($list, $i), "space");
241 | }
242 | }
243 | @return $newList;
244 | }
245 |
246 | // modular-scale
247 | // Calc size with ratio
248 | // @param $value - Base of ratio
249 | // @param $ratio - 1.618 or something
250 | // @param $muliple - Number of Sequece
251 | // @returns scale
252 | @function modular-scale($value, $ratio, $multiple) {
253 | $modular-scale: $value;
254 | @if ($multiple == 0) {
255 | @return $modular-scale;
256 | }
257 | @for $i from 1 through $multiple {
258 | $modular-scale: $modular-scale * $ratio;
259 | }
260 | @return $modular-scale;
261 | }
262 |
263 | // type-scale
264 | // convert $type-settings to modular-scale function
265 | // @param $level - level rate
266 | // @param $_baseline - line-height "default"
267 | // @returns $typescale-map
268 | @function type-scale($level, $_baseline: var(--baseline)) {
269 | $typescale-map: ();
270 | @each $query, $options in $type-settings {
271 | $map: ();
272 | $ratio: map-get($options, "ratio");
273 | $base: map-get($options, "base");
274 | $types: map-get($options, "types");
275 | $getLevel: map-get($types, $level);
276 | $getLines: map-get($getLevel, "line-height");
277 | $fontSize: modular-scale($base, $ratio, $level - 1);
278 | $map: map-merge(
279 | $map,
280 | (
281 | $query *
282 | 1px:
283 | (
284 | font-size: $fontSize * 1px,
285 | line-height: line-height($getLines)
286 | )
287 | )
288 | );
289 | $typescale-map: map-merge($typescale-map, $map);
290 | }
291 | @return $typescale-map;
292 | }
293 |
294 | // line-height
295 | // Calc line-height with level
296 | // @param $level - line rate
297 | // @returns line-height
298 | @function line-height($level) {
299 | @return calc(#{$level} * var(--baseline));
300 | }
301 |
302 | // Styles:
303 | * {
304 | box-sizing: border-box;
305 | }
306 |
307 |
308 |
309 |
310 | body {
311 | line-height: var(--baseline);
312 | font-weight: 400;
313 | font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI",
314 | Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji",
315 | "Segoe UI Emoji", "Segoe UI Symbol";
316 | -webkit-font-smoothing: antialiased;
317 | text-rendering: optimizeLegibility;
318 | -webkit-font-smoothing: antialiased;
319 | -moz-osx-font-smoothing: grayscale;
320 | font-style:normal;
321 | }
322 |
323 | body {
324 | h1,
325 | h2,
326 | h3,
327 | h4 {
328 | margin: 0;
329 | font-weight: 700;
330 | margin-bottom: var(--baseline);
331 | }
332 |
333 |
334 | h1 {
335 | @include poly-fluid-sizing("font-size", type-scale(4));
336 | font-weight: 900;
337 | }
338 |
339 | h2 {
340 | @include poly-fluid-sizing("font-size", type-scale(3));
341 | // word-spacing: 0.03em;
342 | // letter-spacing: -0.032em;
343 | }
344 |
345 | h3 {
346 | @include poly-fluid-sizing("font-size", type-scale(2));
347 | // letter-spacing: -0.036em;
348 | }
349 |
350 | h4 {
351 | @include poly-fluid-sizing("font-size", type-scale(1));
352 | }
353 | }
354 |
355 | p,
356 | ul,
357 | ol {
358 | margin-top: 0;
359 | margin-bottom: var(--baseline);
360 | @include poly-fluid-sizing("font-size", type-scale(1));
361 | }
362 |
363 | /* Let's make sure all's aligned */
364 | pre,
365 | table,
366 | blockquote {
367 | margin-top: 0;
368 | margin-bottom: var(--baseline);
369 | }
370 |
371 | ul,
372 | ol {
373 | padding: 0;
374 | padding-left: var(--gap);
375 | list-style-type: disc;
376 | }
377 |
378 | ul ul,
379 | ol ol,
380 | ul ol,
381 | ol ul {
382 | margin-top: 0;
383 | margin-bottom: 0;
384 | }
385 |
386 | hr,
387 | .hr {
388 | margin: 0;
389 | padding: 0;
390 | padding-bottom: var(--baseline);
391 | border: 0;
392 | border-top: 1px solid #eee;
393 | }
394 |
395 | a,
396 | b,
397 | i,
398 | strong,
399 | em,
400 | small,
401 | code {
402 | line-height: var(--baseline);
403 | }
404 |
405 | sub,
406 | sup {
407 | line-height: var(--baseline);
408 | position: relative;
409 | vertical-align: baseline;
410 | }
411 |
412 | sup {
413 | top: -0.5em;
414 | }
415 |
416 | sub {
417 | bottom: -0.25em;
418 | }
419 |
420 | a {
421 | text-decoration: none;
422 | color: var(--primary-color);
423 | transition: 0.23s color cubic-bezier(0.19, 1, 0.22, 1);
424 | &:hover {
425 | color: var(--secondary-color);
426 | }
427 | }
428 |
--------------------------------------------------------------------------------
/styles/styles.scss:
--------------------------------------------------------------------------------
1 | @import "./modules/colors.scss";
2 | @import "./modules/grid.scss";
3 | @import "./modules/typography.scss";
4 |
5 | html,
6 | body {
7 | margin: 0;
8 | padding: 0;
9 | background: var(--background-color);
10 | color: var(--foreground-color) !important;
11 | font-style: normal;
12 | }
13 | body {
14 | a {
15 | color: var(--primary-color);
16 | &:hover {
17 | color: var(--secondary-color);
18 | }
19 | }
20 | }
21 |
22 | .fixed.btn {
23 | position: fixed;
24 | top: 0;
25 | z-index: 99999;
26 | width: 100%;
27 | max-width: 400px;
28 | border-radius: 0 !important;
29 | padding: 1rem 1.5rem !important;
30 | text-align: center;
31 | display: none !important;
32 | }
33 | .fixed.btn.show {
34 | display: block !important;
35 | }
36 | * {
37 | outline: 0;
38 | }
39 |
40 | ::selection {
41 | background-color: var(--secondary-color);
42 | color: #fff;
43 | }
44 |
45 | ::-webkit-scrollbar {
46 | width: 5px;
47 | }
48 | ::-webkit-scrollbar-track {
49 | box-shadow: inset 0 0 5px grey;
50 | border-radius: 10px;
51 | }
52 | ::-webkit-scrollbar-thumb {
53 | background: var(--secondary-color);
54 | border-radius: 10px;
55 | }
56 | ::-webkit-scrollbar-thumb:hover {
57 | background: var(--primary-color);
58 | }
59 |
60 | input:-webkit-autofill,
61 | input:-webkit-autofill:hover,
62 | input:-webkit-autofill:focus {
63 | color: var(--foreground-color);
64 | -webkit-text-fill-color: var(--foreground-color);
65 | border: 1px solid var(--foreground-color);
66 | }
67 |
68 | @import "./modules/timetable.scss";
69 |
--------------------------------------------------------------------------------
/utils/intlMessage.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { intlShape, injectIntl, FormattedMessage } from "react-intl";
3 |
4 | const InjectMassage = props => (
5 | msg} {...props} />
6 | );
7 |
8 | InjectMassage.propTypes = {
9 | intl: intlShape.isRequired
10 | };
11 | export default injectIntl(InjectMassage, {
12 | withRef: false
13 | });
14 |
--------------------------------------------------------------------------------
/utils/isRTL.js:
--------------------------------------------------------------------------------
1 | export function isRTL(locale) {
2 | return locale === "fa";
3 | }
4 |
--------------------------------------------------------------------------------
/utils/masonary.js:
--------------------------------------------------------------------------------
1 | import React, { useRef, useState, useEffect } from "react";
2 |
3 | export default function Masonry({ children, minWidth = 300 }) {
4 | const cols = [];
5 | const ref = useRef();
6 | const [numCols, setNumCols] = useState(3);
7 |
8 | const calcNumCols = () =>
9 | setNumCols(Math.floor(ref.current.offsetWidth / minWidth));
10 |
11 | const createCols = () => {
12 | for (let i = 0; i < numCols; i++) cols[i] = [];
13 | children.forEach((child, i) => {
14 | if (child) {
15 | cols[i % numCols].push(child);
16 | }
17 | });
18 | };
19 |
20 | useEffect(() => {
21 | calcNumCols();
22 | window.addEventListener(`resize`, calcNumCols);
23 | return () => window.removeEventListener(`resize`, calcNumCols);
24 | });
25 |
26 | createCols();
27 |
28 | return (
29 |
30 | {Array(numCols)
31 | .fill()
32 | .map((el, i) => (
33 |
34 | {cols[i]}
35 |
36 | ))}
37 |
38 | );
39 | }
40 |
--------------------------------------------------------------------------------
/utils/shuffle.js:
--------------------------------------------------------------------------------
1 | export function shuffle(array) {
2 | let counter = array.length,
3 | temp,
4 | index;
5 | while (counter--) {
6 | index = (Math.random() * counter) | 0;
7 | temp = array[counter];
8 | array[counter] = array[index];
9 | array[index] = temp;
10 | }
11 | return array;
12 | }
13 |
--------------------------------------------------------------------------------
/utils/utils.js:
--------------------------------------------------------------------------------
1 | function debounce(callback, wait, immediate = false) {
2 | let timeout = null;
3 |
4 | return function() {
5 | const callNow = immediate && !timeout;
6 | const next = () => callback.apply(this, arguments);
7 |
8 | clearTimeout(timeout);
9 | timeout = setTimeout(next, wait);
10 |
11 | if (callNow) {
12 | next();
13 | }
14 | };
15 | }
16 |
17 | var SmoothScroll = function(a, d, f) {
18 | var Site = {
19 | height: window.innerHeight,
20 | width: window.innerWidth
21 | };
22 | function c(c) {
23 | c.preventDefault();
24 | if (!p) {
25 | if (h.paginate && (u || (u = new Lethargy()), !u.check(c))) {
26 | v && clearTimeout(v);
27 | v = setTimeout(function() {
28 | u = null;
29 | }, 100);
30 | return;
31 | }
32 | c = c.detail
33 | ? c.wheelDelta
34 | ? (-c.wheelDelta / c.detail / 40) * (0 < c.detail ? 1 : -1)
35 | : c.detail / 3
36 | : -c.wheelDelta / 120;
37 | r += (c * d) / (h.paginate ? 3 : 1);
38 | r = Math.max(0, Math.min(r, a.scrollHeight - a.clientHeight));
39 | k =
40 | 0 < r - pageYOffset
41 | ? Math.ceil(r / Site.height) * Site.height
42 | : Math.floor(r / Site.height) * Site.height;
43 | l || g();
44 | }
45 | }
46 | function g(a) {
47 | a || (l = !0);
48 | if (l) {
49 | a = n;
50 | var c = (r - a) / f;
51 | h.paginate &&
52 | ((c = (k - a) / f), (r = 1 < Math.abs(c) ? a + 1.01 * c : k));
53 | n = c = a + c;
54 | scrollTo(0, c);
55 | Math.abs(c - a) > 0.25 / f
56 | ? z(g)
57 | : (h.paginate && (r = k),
58 | (n = r),
59 | scrollTo(0, r),
60 | (l = !1),
61 | v && clearTimeout(v),
62 | (v = setTimeout(function() {
63 | u = null;
64 | }, 100)));
65 | }
66 | }
67 | var h = this;
68 | h.paginate = !1;
69 | a == document &&
70 | (a =
71 | document.documentElement ||
72 | document.body.parentNode ||
73 | document.body);
74 | var n = 0,
75 | l = !1,
76 | r = pageYOffset,
77 | k = 0,
78 | u,
79 | v,
80 | y,
81 | A = 0,
82 | w = 0,
83 | p,
84 | q;
85 | h.scrollToY = function(a, c) {
86 | c
87 | ? ((r = a),
88 | (k = Math.round(a / Site.height) * Site.height),
89 | l || g())
90 | : ((r = n = a),
91 | (k = Math.round(a / Site.height) * Site.height),
92 | scrollTo(0, a));
93 | };
94 | h.reset = function() {
95 | k = r = n = pageYOffset;
96 | };
97 | var F = function(a) {
98 | if (
99 | {
100 | 37: 1,
101 | 38: 1,
102 | 39: 1,
103 | 40: 1,
104 | 32: 1,
105 | 33: 1,
106 | 34: 1,
107 | 35: 1,
108 | 36: 1
109 | }[a.keyCode]
110 | )
111 | return (
112 | console.log(a),
113 | (a = a || window.event),
114 | a.preventDefault && a.preventDefault(),
115 | (a.returnValue = !1)
116 | );
117 | };
118 | h.enableScrolling = function() {
119 | p &&
120 | ((document.onkeydown = null),
121 | bodyScrollLock.enableBodyScroll(Menu.menu),
122 | (p = !1));
123 | };
124 | h.disableScrolling = function() {
125 | p ||
126 | (bodyScrollLock.disableBodyScroll(Menu.menu),
127 | (document.onkeydown = F),
128 | (p = !0));
129 | };
130 | var O = debounce(function() {
131 | h.paginate &&
132 | !q &&
133 | ((n = pageYOffset),
134 | (k = Math.round(pageYOffset / Site.height) * Site.height),
135 | l || g());
136 | }, 250),
137 | z = (function() {
138 | return (
139 | window.requestAnimationFrame ||
140 | window.webkitRequestAnimationFrame ||
141 | window.mozRequestAnimationFrame ||
142 | window.oRequestAnimationFrame ||
143 | window.msRequestAnimationFrame ||
144 | function(a) {
145 | window.setTimeout(a, 20);
146 | }
147 | );
148 | })();
149 | a.addEventListener("mousewheel", c, {
150 | capture: !1,
151 | passive: !1
152 | });
153 | a.addEventListener("DOMMouseScroll", c, {
154 | capture: !1,
155 | passive: !1
156 | });
157 | a.addEventListener(
158 | "touchstart",
159 | function(a) {
160 | 1 == a.changedTouches.length &&
161 | (h.reset(), (A = a.changedTouches[0].screenY), (w = 0));
162 | q = !0;
163 | },
164 | !1
165 | );
166 | a.addEventListener(
167 | "touchmove",
168 | function(a) {
169 | if (1 == a.changedTouches.length) {
170 | var c = A;
171 | A = a.changedTouches[0].screenY;
172 | w += A - c;
173 | }
174 | },
175 | !1
176 | );
177 | a.addEventListener(
178 | "touchend",
179 | function(c) {
180 | h.paginate &&
181 | ((n = pageYOffset),
182 | (k =
183 | 0 < w
184 | ? Math.max(Math.floor(pageYOffset / Site.height), 0) *
185 | Site.height
186 | : Math.min(
187 | Math.ceil(pageYOffset / Site.height) *
188 | Site.height,
189 | a.scrollHeight - Site.height
190 | )),
191 | 0 < pageYOffset &&
192 | pageYOffset < a.scrollHeight - Site.height &&
193 | UserAgent.iOS &&
194 | (l || g()));
195 | q = c.touches.length;
196 | },
197 | !1
198 | );
199 | addEventListener("scroll", function(a) {
200 | y && (clearTimeout(y), (y = null));
201 | h.paginate &&
202 | (q ||
203 | (y = setTimeout(function() {
204 | n = pageYOffset;
205 | k = Math.round(pageYOffset / Site.height) * Site.height;
206 | l || g();
207 | }, 500)));
208 | });
209 | addEventListener("resize", O);
210 | };
211 | export { SmoothScroll };
212 |
--------------------------------------------------------------------------------