верстка
This commit is contained in:
96
.eslintrc.json
Normal file
96
.eslintrc.json
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"es2020": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends": ["eslint:recommended", "plugin:import/errors", "plugin:import/warnings"],
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 11,
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"no-console": "warn",
|
||||||
|
"semi": "warn",
|
||||||
|
"quotes": ["warn", "single"],
|
||||||
|
"array-callback-return": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
"allowImplicit": true,
|
||||||
|
"checkForEach": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-trailing-spaces": "warn",
|
||||||
|
"no-unused-vars": "warn",
|
||||||
|
"default-case": "warn",
|
||||||
|
"default-param-last": "warn",
|
||||||
|
"no-alert": "warn",
|
||||||
|
"no-constructor-return": "warn",
|
||||||
|
"no-else-return": "warn",
|
||||||
|
"no-empty-function": "warn",
|
||||||
|
"no-multi-spaces": "warn",
|
||||||
|
"no-multi-str": "warn",
|
||||||
|
"no-new": "warn",
|
||||||
|
"no-param-reassign": "warn",
|
||||||
|
"no-sequences": "warn",
|
||||||
|
"no-useless-concat": "warn",
|
||||||
|
"prefer-promise-reject-errors": "warn",
|
||||||
|
"require-await": "warn",
|
||||||
|
"wrap-iife": ["warn", "inside"],
|
||||||
|
"yoda": "warn",
|
||||||
|
"no-shadow": "warn",
|
||||||
|
"no-use-before-define": "warn",
|
||||||
|
"array-bracket-spacing": ["warn", "never"],
|
||||||
|
"block-spacing": ["warn", "never"],
|
||||||
|
"brace-style": ["warn", "1tbs", {"allowSingleLine": true}],
|
||||||
|
"capitalized-comments": ["warn"],
|
||||||
|
"comma-dangle": ["warn", "only-multiline"],
|
||||||
|
"comma-spacing": ["warn", {"before": false, "after": true}],
|
||||||
|
"computed-property-spacing": ["warn", "never"],
|
||||||
|
"eol-last": ["warn", "always"],
|
||||||
|
"func-call-spacing": ["warn", "never"],
|
||||||
|
"func-style": ["warn", "expression"],
|
||||||
|
"keyword-spacing": ["warn", {"before": true}],
|
||||||
|
"line-comment-position": ["warn", {"position": "above"}],
|
||||||
|
"lines-between-class-members": ["warn", "always"],
|
||||||
|
"max-len": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
"code": 120,
|
||||||
|
"ignoreComments": true,
|
||||||
|
"ignoreUrls": true,
|
||||||
|
"ignoreStrings": true,
|
||||||
|
"ignoreTemplateLiterals": true,
|
||||||
|
"ignoreRegExpLiterals": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"multiline-comment-style": ["warn", "starred-block"],
|
||||||
|
"new-cap": "warn",
|
||||||
|
"new-parens": "warn",
|
||||||
|
"newline-per-chained-call": ["warn", {"ignoreChainWithDepth": 3}],
|
||||||
|
"no-bitwise": "warn",
|
||||||
|
"no-inline-comments": "warn",
|
||||||
|
"no-lonely-if": "warn",
|
||||||
|
"no-multi-assign": "warn",
|
||||||
|
"no-multiple-empty-lines": ["warn", {"max": 1}],
|
||||||
|
"no-nested-ternary": "warn",
|
||||||
|
"no-plusplus": "warn",
|
||||||
|
"object-curly-spacing": ["warn", "never"],
|
||||||
|
"object-property-newline": ["warn", {"allowAllPropertiesOnSameLine": true}],
|
||||||
|
"key-spacing": ["warn", {"beforeColon": false, "afterColon": true}],
|
||||||
|
"space-before-blocks": "warn",
|
||||||
|
"space-before-function-paren": ["warn", "always"],
|
||||||
|
"space-in-parens": ["warn", "never"],
|
||||||
|
"space-infix-ops": "warn",
|
||||||
|
"arrow-parens": ["warn", "as-needed"],
|
||||||
|
"arrow-spacing": "warn",
|
||||||
|
"no-duplicate-imports": "warn",
|
||||||
|
"no-useless-computed-key": "warn",
|
||||||
|
"no-useless-constructor": "warn",
|
||||||
|
"no-var": "warn",
|
||||||
|
"prefer-const": "warn",
|
||||||
|
"prefer-rest-params": "warn",
|
||||||
|
"prefer-template": "warn",
|
||||||
|
"template-curly-spacing": "warn"
|
||||||
|
}
|
||||||
|
}
|
||||||
12
.prettierc.json
Normal file
12
.prettierc.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"printWidth": 120,
|
||||||
|
"tabWidth": 4,
|
||||||
|
"useTabs": false,
|
||||||
|
"semi": true,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "all",
|
||||||
|
"bracketSpacing": false,
|
||||||
|
"jsxBracketSameLine": false,
|
||||||
|
"arrowParens": "avoid",
|
||||||
|
"parser": "javascript"
|
||||||
|
}
|
||||||
23
jsconfig.json
Normal file
23
jsconfig.json
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"baseUrl": ".",
|
||||||
|
"module": "esnext",
|
||||||
|
"outDir": "./dist/",
|
||||||
|
"target": "es5",
|
||||||
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": false,
|
||||||
|
"noEmit": false,
|
||||||
|
"paths": {
|
||||||
|
"*": ["*"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"exclude": ["node_modules"],
|
||||||
|
"include": ["src/**/*.js"]
|
||||||
|
}
|
||||||
1202
package-lock.json
generated
1202
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -22,6 +22,8 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"clean-webpack-plugin": "^3.0.0",
|
"clean-webpack-plugin": "^3.0.0",
|
||||||
"css-loader": "^5.0.1",
|
"css-loader": "^5.0.1",
|
||||||
|
"eslint": "^7.19.0",
|
||||||
|
"eslint-plugin-import": "^2.22.1",
|
||||||
"favicons": "^6.2.0",
|
"favicons": "^6.2.0",
|
||||||
"favicons-webpack-plugin": "^5.0.1",
|
"favicons-webpack-plugin": "^5.0.1",
|
||||||
"file-loader": "^6.2.0",
|
"file-loader": "^6.2.0",
|
||||||
|
|||||||
@ -2,50 +2,33 @@
|
|||||||
<html lang="en" class="h-100">
|
<html lang="en" class="h-100">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
|
||||||
<link rel="manifest" href="/manifest.json">
|
|
||||||
<meta name="msapplication-TileColor" content="#ffffff">
|
|
||||||
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
|
|
||||||
<meta name="theme-color" content="#ffffff">
|
|
||||||
|
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Example for kids</title>
|
<title>Example for kids</title>
|
||||||
<link rel="stylesheet" type="text/css" href="./style.css">
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="h-100">
|
<body class="h-100">
|
||||||
<div class="container h-100">
|
<div class="container h-100">
|
||||||
<div class="row align-items-center justify-content-center h-100">
|
<div class="row align-items-center justify-content-center h-100">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="StartPage d-none">
|
<div class="row justify-content-center StartPage d-none">
|
||||||
|
<form id="start-form" class="col StartPage__container">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label" for="startPageNameInput">Введи свое имя:</label>
|
<label class="form-label" for="startPageNameInput">Введи свое имя:</label>
|
||||||
<input class="form-control" id="startPageNameInput" />
|
<input class="form-control" id="startPageNameInput" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button class="btn btn-success" id="start-button" type="button">Старт</button>
|
<button class="btn btn-success" id="start-button" type="submit" disabled>Старт</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="GamePage d-none">
|
<div class="GamePage d-none">
|
||||||
<div class="input-group example">
|
<div class="input-group example">
|
||||||
<input class="form-control" id="first-input" />
|
<input class="form-control" id="first-input" type="number" />
|
||||||
<span class="input-group-text" id="sign-span">+</span>
|
<span class="input-group-text" id="sign-span">+</span>
|
||||||
<input class="form-control" id="second-input" />
|
<input class="form-control" id="second-input" type="number" />
|
||||||
<span class="input-group-text">=</span>
|
<span class="input-group-text">=</span>
|
||||||
<input class="form-control" id="sum-input" />
|
<input class="form-control" id="sum-input" type="number" />
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-warning" id="check-button" type="button">Проверить</button>
|
<button class="btn btn-warning" id="check-button" type="button">Проверить</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
34
src/consts.js
Normal file
34
src/consts.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
export const LOCAL_DATA_KEY = 'example-for-kids';
|
||||||
|
export const START_PAGE = 'StartPage';
|
||||||
|
export const GAME_PAGE = 'GamePage';
|
||||||
|
export const RESULT_PAGE = 'ResultPage';
|
||||||
|
export const NO_DISPLAY_CLASS = 'd-none';
|
||||||
|
export const TEXT_SUCCESS_CLASS = 'text-success';
|
||||||
|
export const TEXT_DANGER_CLASS = 'text-danger';
|
||||||
|
export const NAME_INPUT_ID = 'startPageNameInput';
|
||||||
|
|
||||||
|
export const START_BUTTON_ID = 'start-button';
|
||||||
|
export const CHECK_BUTTON_ID = 'check-button';
|
||||||
|
export const REPEAT_BUTTON_ID = 'repeat-button';
|
||||||
|
|
||||||
|
export const START_FORM_ID = 'start-form';
|
||||||
|
|
||||||
|
export const FIRST_INPUT_ID = 'first-input';
|
||||||
|
export const SECOND_INPUT_ID = 'second-input';
|
||||||
|
export const SUM_INPUT_ID = 'sum-input';
|
||||||
|
export const RESULT_CONTAINER_ID = 'result-container';
|
||||||
|
export const SIGN_SPAN_ID = 'sign-span';
|
||||||
|
|
||||||
|
export const EXAMPLE_TYPE = {
|
||||||
|
PLUS: '+',
|
||||||
|
MINUS: '-',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const EVENTS = {
|
||||||
|
CLICK: 'click',
|
||||||
|
INPUT: 'input',
|
||||||
|
SUBMIT: 'submit',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const MAX_NUMBER = 10;
|
||||||
|
export const MAX_COUNT_EXAMPLES = 10;
|
||||||
@ -1,38 +1,28 @@
|
|||||||
import 'bootstrap';
|
import 'bootstrap';
|
||||||
import 'bootstrap/dist/css/bootstrap.min.css';
|
import 'bootstrap/dist/css/bootstrap.min.css';
|
||||||
|
import {
|
||||||
|
GAME_PAGE,
|
||||||
|
START_PAGE,
|
||||||
|
RESULT_PAGE,
|
||||||
|
FIRST_INPUT_ID,
|
||||||
|
SECOND_INPUT_ID,
|
||||||
|
SUM_INPUT_ID,
|
||||||
|
NAME_INPUT_ID,
|
||||||
|
CHECK_BUTTON_ID,
|
||||||
|
START_BUTTON_ID,
|
||||||
|
REPEAT_BUTTON_ID,
|
||||||
|
RESULT_CONTAINER_ID,
|
||||||
|
SIGN_SPAN_ID,
|
||||||
|
TEXT_SUCCESS_CLASS,
|
||||||
|
TEXT_DANGER_CLASS,
|
||||||
|
NO_DISPLAY_CLASS,
|
||||||
|
MAX_NUMBER,
|
||||||
|
EXAMPLE_TYPE,
|
||||||
|
MAX_COUNT_EXAMPLES,
|
||||||
|
EVENTS,
|
||||||
|
START_FORM_ID,
|
||||||
|
} from './consts';
|
||||||
import './style.css';
|
import './style.css';
|
||||||
// TODO скрыть переменные
|
|
||||||
|
|
||||||
const LOCAL_DATA_KEY = 'example-for-kids';
|
|
||||||
const START_PAGE = 'StartPage';
|
|
||||||
const GAME_PAGE = 'GamePage';
|
|
||||||
const RESULT_PAGE = 'ResultPage';
|
|
||||||
const NO_DISPLAY_CLASS = 'd-none';
|
|
||||||
const TEXT_SUCCESS_CLASS = 'text-success';
|
|
||||||
const TEXT_DANGER_CLASS = 'text-danger';
|
|
||||||
const NAME_INPUT_ID = 'startPageNameInput';
|
|
||||||
|
|
||||||
const START_BUTTON_ID = 'start-button';
|
|
||||||
const CHECK_BUTTON_ID = 'check-button';
|
|
||||||
const REPEAT_BUTTON_ID = 'repeat-button';
|
|
||||||
|
|
||||||
const FIRST_INPUT_ID = 'first-input';
|
|
||||||
const SECOND_INPUT_ID = 'second-input';
|
|
||||||
const SUM_INPUT_ID = 'sum-input';
|
|
||||||
const RESULT_CONTAINER_ID = 'result-container';
|
|
||||||
const SIGN_SPAN_ID = 'sign-span';
|
|
||||||
|
|
||||||
const EXAMPLE_TYPE = {
|
|
||||||
PLUS: '+',
|
|
||||||
MINUS: '-',
|
|
||||||
};
|
|
||||||
|
|
||||||
const EVENTS = {
|
|
||||||
CLICK: 'click',
|
|
||||||
};
|
|
||||||
|
|
||||||
const MAX_NUMBER = 10;
|
|
||||||
const MAX_COUNT_EXAMPLES = 10;
|
|
||||||
|
|
||||||
let store = {
|
let store = {
|
||||||
page: START_PAGE,
|
page: START_PAGE,
|
||||||
@ -54,11 +44,9 @@ const startButton = document.querySelector(`#${START_BUTTON_ID}`);
|
|||||||
const repeatButton = document.querySelector(`#${REPEAT_BUTTON_ID}`);
|
const repeatButton = document.querySelector(`#${REPEAT_BUTTON_ID}`);
|
||||||
const resultContainer = document.querySelector(`#${RESULT_CONTAINER_ID}`);
|
const resultContainer = document.querySelector(`#${RESULT_CONTAINER_ID}`);
|
||||||
const signSpan = document.querySelector(`#${SIGN_SPAN_ID}`);
|
const signSpan = document.querySelector(`#${SIGN_SPAN_ID}`);
|
||||||
|
const startForm = document.querySelector(`#${START_FORM_ID}`);
|
||||||
|
|
||||||
const getRandomNumber = (maxNumber) => Math.round(Math.random() * maxNumber);
|
const getRandomNumber = maxNumber => Math.round(Math.random() * maxNumber);
|
||||||
const getFirstNumber = () => getRandomNumber(MAX_NUMBER);
|
|
||||||
const getSecondNumber = (firstNumber) => getRandomNumber(MAX_NUMBER - firstNumber);
|
|
||||||
const getSum = (first, second) => first + second;
|
|
||||||
|
|
||||||
const getPlusExample = () => {
|
const getPlusExample = () => {
|
||||||
const first = getRandomNumber(MAX_NUMBER);
|
const first = getRandomNumber(MAX_NUMBER);
|
||||||
@ -80,7 +68,7 @@ const getMinusExample = () => {
|
|||||||
first,
|
first,
|
||||||
second,
|
second,
|
||||||
sum: first - second,
|
sum: first - second,
|
||||||
type: EXAMPLE_TYPE.MINUS
|
type: EXAMPLE_TYPE.MINUS,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -89,20 +77,9 @@ const getExample = () => {
|
|||||||
switch (exampleOrder) {
|
switch (exampleOrder) {
|
||||||
case 0:
|
case 0:
|
||||||
return getPlusExample();
|
return getPlusExample();
|
||||||
case 1:
|
default:
|
||||||
return getMinusExample();
|
return getMinusExample();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
const getData = (defaultData) => {
|
|
||||||
try {
|
|
||||||
return JSON.parse(localStorage.getItem(LOCAL_DATA_KEY)) || defaultData;
|
|
||||||
} catch (e) {
|
|
||||||
return defaultData;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const setData = (data) => {
|
|
||||||
localStorage.setItem(LOCAL_DATA_KEY, JSON.stringify(data));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const removeRandom = ({first, second, sum, type}) => {
|
const removeRandom = ({first, second, sum, type}) => {
|
||||||
@ -113,7 +90,7 @@ const removeRandom = ({first, second, sum, type}) => {
|
|||||||
sum: miss !== 2 ? sum : '',
|
sum: miss !== 2 ? sum : '',
|
||||||
type,
|
type,
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
||||||
const setInput = (input, value) => {
|
const setInput = (input, value) => {
|
||||||
input.value = value;
|
input.value = value;
|
||||||
@ -122,7 +99,7 @@ const setInput = (input, value) => {
|
|||||||
|
|
||||||
const setTextContainer = (container, value) => {
|
const setTextContainer = (container, value) => {
|
||||||
container.textContent = value;
|
container.textContent = value;
|
||||||
}
|
};
|
||||||
|
|
||||||
const setInputs = ({first, second, sum, type}) => {
|
const setInputs = ({first, second, sum, type}) => {
|
||||||
setInput(firstInput, first);
|
setInput(firstInput, first);
|
||||||
@ -210,7 +187,12 @@ const startGame = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
startButton.addEventListener(EVENTS.CLICK, () => {
|
nameInput.addEventListener(EVENTS.INPUT, () => {
|
||||||
|
startButton.disabled = !nameInput.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
startForm.addEventListener(EVENTS.SUBMIT, event => {
|
||||||
|
event.preventDefault();
|
||||||
startGame();
|
startGame();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
0
src/services/ExampleService.js
Normal file
0
src/services/ExampleService.js
Normal file
17
src/services/LocalDataService.js
Normal file
17
src/services/LocalDataService.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import {LOCAL_DATA_KEY} from '../consts';
|
||||||
|
|
||||||
|
const getData = defaultData => {
|
||||||
|
try {
|
||||||
|
return JSON.parse(localStorage.getItem(LOCAL_DATA_KEY)) || defaultData;
|
||||||
|
} catch (e) {
|
||||||
|
return defaultData;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const setData = data => {
|
||||||
|
localStorage.setItem(LOCAL_DATA_KEY, JSON.stringify(data));
|
||||||
|
};
|
||||||
|
|
||||||
|
export const LocalDataService = {
|
||||||
|
getData,
|
||||||
|
setData,
|
||||||
|
};
|
||||||
@ -1,3 +1,7 @@
|
|||||||
.input-group.example {
|
.input-group.example {
|
||||||
width: 240px;
|
width: 240px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.StartPage__container {
|
||||||
|
max-width: 350px;
|
||||||
|
}
|
||||||
|
|||||||
@ -39,7 +39,7 @@ module.exports = {
|
|||||||
new MiniCssExtractPlugin(),
|
new MiniCssExtractPlugin(),
|
||||||
new FaviconsWebpackPlugin({
|
new FaviconsWebpackPlugin({
|
||||||
logo: './public/icon-512x512.png',
|
logo: './public/icon-512x512.png',
|
||||||
manifest: './public/manifest.json'
|
manifest: './public/manifest.json',
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user