From d9393d352294cc000dfa115f16e3a0c5c846c316 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Thu, 2 May 2024 13:59:47 +0300
Subject: [PATCH 01/23] feat: add folder structure (#2)
---
src/styles/mixins.scss | 0
src/styles/normalize.css | 351 +++++++++++++++++++++++++++++++++++++++
src/styles/style.css | 0
3 files changed, 351 insertions(+)
create mode 100644 src/styles/mixins.scss
create mode 100644 src/styles/normalize.css
create mode 100644 src/styles/style.css
diff --git a/src/styles/mixins.scss b/src/styles/mixins.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/styles/normalize.css b/src/styles/normalize.css
new file mode 100644
index 0000000..2768db4
--- /dev/null
+++ b/src/styles/normalize.css
@@ -0,0 +1,351 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+ ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+html {
+ line-height: 1.15; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/* Sections
+ ========================================================================== */
+
+/**
+ * Remove the margin in all browsers.
+ */
+
+body {
+ margin: 0;
+}
+
+/**
+ * Render the `main` element consistently in IE.
+ */
+
+main {
+ display: block;
+}
+
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Remove the gray background on active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+}
+
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+code,
+kbd,
+samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+
+/**
+ * Add the correct font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove the border on images inside links in IE 10.
+ */
+
+img {
+ border-style: none;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+}
+
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+button,
+input {
+ /* 1 */
+ overflow: visible;
+}
+
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+button,
+select {
+ /* 1 */
+ text-transform: none;
+}
+
+/**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+button,
+[type='button'],
+[type='reset'],
+[type='submit'] {
+ -webkit-appearance: button;
+}
+
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+
+button::-moz-focus-inner,
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+}
+
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+button:-moz-focusring,
+[type='button']:-moz-focusring,
+[type='reset']:-moz-focusring,
+[type='submit']:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+
+/**
+ * Correct the padding in Firefox.
+ */
+
+fieldset {
+ padding: 0.35em 0.75em 0.625em;
+}
+
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+}
+
+/**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+progress {
+ vertical-align: baseline;
+}
+
+/**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+[type='checkbox'],
+[type='radio'] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+[type='search'] {
+ -webkit-appearance: textfield; /* 1 */
+ outline-offset: -2px; /* 2 */
+}
+
+/**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+[type='search']::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button; /* 1 */
+ font: inherit; /* 2 */
+}
+
+/* Interactive
+ ========================================================================== */
+
+/*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+details {
+ display: block;
+}
+
+/*
+ * Add the correct display in all browsers.
+ */
+
+summary {
+ display: list-item;
+}
+
+/* Misc
+ ========================================================================== */
+
+/**
+ * Add the correct display in IE 10+.
+ */
+
+template {
+ display: none;
+}
+
+/**
+ * Add the correct display in IE 10.
+ */
+
+[hidden] {
+ display: none;
+}
diff --git a/src/styles/style.css b/src/styles/style.css
new file mode 100644
index 0000000..e69de29
From 1ba532418e65267331867229ff902091a4ab5e1e Mon Sep 17 00:00:00 2001
From: Vadzim <49336945+comtvset@users.noreply.github.com>
Date: Thu, 2 May 2024 13:01:26 +0200
Subject: [PATCH 02/23] Dt 32 create project commerce tools (#5)
* DT-32 test PR
* DT-32 test PR
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d416b84..42cebdb 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
-# eCommerce-Application
\ No newline at end of file
+# eCommerce-Application
+test
\ No newline at end of file
From 72e15e02036e95ca4df695f761c59cc15745445b Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Thu, 2 May 2024 14:56:28 +0300
Subject: [PATCH 03/23] DT-88 / init project (#4)
---
package.json | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
create mode 100644 package.json
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..2cebcdf
--- /dev/null
+++ b/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "ecommerce",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "keywords": [
+ "RSS",
+ "ecommerce",
+ "Final task"
+ ],
+ "description": "RSS Final [task](https://github.com/rolling-scopes-school/tasks/tree/master/tasks/eCommerce-Application)",
+ "main": "./src/main.tsx",
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged",
+ "pre-push": "npx validate-branch-name"
+ }
+ },
+ "lint-staged": {
+ "*.{tsx,ts}": "npm run lint:fix"
+ },
+ "scripts": {
+
+ },
+ "license": "ISC",
+ "dependencies": {
+
+ },
+ "devDependencies": {
+
+ }
+}
From 7ddd3fd78bd61ea2a2fa0f56b285f90eec78395d Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Thu, 2 May 2024 14:56:54 +0300
Subject: [PATCH 04/23] DT-30 / add PR template (#3)
* DT-30 / add PR template
* DT-30 / delete jira link, update structure
---
.github/pull_request_template.md | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 .github/pull_request_template.md
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..2246047
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,6 @@
+1. Acceptance criteria:
+-
+-
+2. Screenshot (not technical tasks):
+
+3. Comments
From 6abbb12384d762a9da88115ff821cb702d657323 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Fri, 3 May 2024 14:06:37 +0300
Subject: [PATCH 05/23] DT-57 add eslint script (#11)
---
package.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/package.json b/package.json
index 2cebcdf..39ddc2d 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,7 @@
"*.{tsx,ts}": "npm run lint:fix"
},
"scripts": {
+ "lint": "eslint --cache . --ext ts,tsx --report-unused-disable-directives --max-warnings 0"
},
"license": "ISC",
From 251f795a9adbbf6712547aaf3cea745057472722 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Fri, 3 May 2024 14:07:08 +0300
Subject: [PATCH 06/23] DT-51 add type scrypt (#7)
---
package.json | 29 +++++++++++++++++++++++++++--
tsconfig.json | 27 +++++++++++++++++++++++++++
tsconfig.node.json | 11 +++++++++++
3 files changed, 65 insertions(+), 2 deletions(-)
create mode 100644 tsconfig.json
create mode 100644 tsconfig.node.json
diff --git a/package.json b/package.json
index 39ddc2d..85c708c 100644
--- a/package.json
+++ b/package.json
@@ -25,9 +25,34 @@
},
"license": "ISC",
"dependencies": {
-
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
},
"devDependencies": {
-
+ "@types/react": "^18.2.66",
+ "@types/react-dom": "^18.2.22",
+ "@typescript-eslint/eslint-plugin": "^7.2.0",
+ "@typescript-eslint/parser": "^7.2.0",
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "eslint": "^8.57.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.6",
+ "typescript": "^5.2.2",
+ "vite": "^5.2.0",
+ "@stylistic/eslint-plugin-js": "^1.7.2",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-config-airbnb-base": "^15.0.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-import": "^2.29.1",
+ "eslint-plugin-prettier": "^5.1.3",
+ "eslint-plugin-react": "^7.34.1",
+ "eslint-plugin-simple-import-sort": "^10.0.0",
+ "eslint-plugin-unicorn": "^50.0.1",
+ "eslint-plugin-unused-imports": "^3.0.0",
+ "husky": "^9.0.11",
+ "lint-staged": "^15.2.0",
+ "prettier": "^3.2.4",
+ "pretty-quick": "^4.0.0",
+ "sass": "^1.75.0"
}
}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..3fe9ac3
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noImplicitAny": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"],
+ "exclude": ["dist", "node_modules"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..97ede7e
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true,
+ "strict": true
+ },
+ "include": ["vite.config.ts"]
+}
From 671e88d3f76c4316942f0f1e4ee9173421ddde46 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Fri, 3 May 2024 14:07:27 +0300
Subject: [PATCH 07/23] DT-54 add husky (#10)
---
.husky/pre-commit | 3 +++
.husky/pre-push | 1 +
2 files changed, 4 insertions(+)
create mode 100644 .husky/pre-commit
create mode 100644 .husky/pre-push
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 0000000..2d0a86a
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,3 @@
+npm run format
+npm run ci:format
+
diff --git a/.husky/pre-push b/.husky/pre-push
new file mode 100644
index 0000000..3867a0f
--- /dev/null
+++ b/.husky/pre-push
@@ -0,0 +1 @@
+npm run lint
From d84932cdf6623b2df210f0ffaa3e81ef311d8e24 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Fri, 3 May 2024 14:07:46 +0300
Subject: [PATCH 08/23] DT-53 add prettier (#9)
---
.lintstagedrs | 4 ++++
.prettierignore | 5 +++++
.prettierrc | 5 +++++
3 files changed, 14 insertions(+)
create mode 100644 .lintstagedrs
create mode 100644 .prettierignore
create mode 100644 .prettierrc
diff --git a/.lintstagedrs b/.lintstagedrs
new file mode 100644
index 0000000..45f8716
--- /dev/null
+++ b/.lintstagedrs
@@ -0,0 +1,4 @@
+{
+ "*.{json,tsx,ts,html}": ["prettier --write --ignore-unknown"],
+ "*.{tsx,ts}": ["eslint --quiet --fix"]
+}
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..ba327f8
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,5 @@
+# Add files here to ignore them from prettier formatting
+/dist
+node_modules
+**/*.mp3
+**/*.jpg
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..c43ec27
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,5 @@
+trailingComma: 'all'
+tabWidth: 2
+semi: true
+singleQuote: true
+printWidth: 170
From e01f8523eca9481314e0ba6fd46e853a549fc52b Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Fri, 3 May 2024 14:08:18 +0300
Subject: [PATCH 09/23] DT-52 add eslint (#8)
---
.eslintignore | 13 +++++++++++
.eslintrc.cjs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 78 insertions(+)
create mode 100644 .eslintignore
create mode 100644 .eslintrc.cjs
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..8aabf83
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,13 @@
+/**/node_modules/*
+node_modules/
+
+dist/
+build/
+out//**/node_modules/*
+node_modules/
+
+dist/
+build/
+out/
+**/*.cjs
+!**/*.ts
\ No newline at end of file
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..4c6e15b
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,65 @@
+module.exports = {
+ root: true,
+ env: { browser: true, es2020: true },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:@typescript-eslint/eslint-recommended',
+ 'plugin:@typescript-eslint/strict-type-checked',
+ 'plugin:react-hooks/recommended',
+ 'plugin:@typescript-eslint/stylistic-type-checked',
+ 'plugin:react/recommended',
+ 'plugin:react/jsx-runtime',
+ 'plugin:prettier/recommended',
+ 'airbnb',
+ ],
+ ignorePatterns: ['dist', '.eslintrc.cjs', 'node_modules', 'build', 'public', 'assets'],
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ ecmaVersion: 6,
+ sourceType: 'module',
+ },
+ plugins: ['react-refresh', '@typescript-eslint', 'unused-imports', 'simple-import-sort', 'prettier', 'unicorn', '@stylistic/js'],
+ rules: {
+ 'react-refresh/only-export-components': [
+ 'warn',
+ {
+ allowConstantExport: true,
+ },
+ ],
+ eqeqeq: 'error',
+ 'no-console': 'warn',
+ 'no-undef': 'off',
+ 'no-unused-vars': 'off',
+ 'prettier/prettier': 'error',
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
+ '@typescript-eslint/explicit-function-return-type': 'off',
+ '@typescript-eslint/no-explicit-any': 'error',
+ '@typescript-eslint/no-unused-vars': 'warn',
+ 'no-use-before-define': 'off',
+ '@typescript-eslint/no-use-before-define': 'error',
+ 'implicit-arrow-linebreak': 'off',
+ 'import/no-extraneous-dependencies': [
+ 'error',
+ {
+ devDependencies: true,
+ },
+ ],
+ 'no-shadow': 'off',
+ '@typescript-eslint/no-shadow': ['error'],
+ 'object-curly-newline': [
+ 'error',
+ {
+ ObjectExpression: 'always',
+ ObjectPattern: {
+ multiline: true,
+ },
+ ImportDeclaration: 'never',
+ ExportDeclaration: {
+ multiline: true,
+ minProperties: 3,
+ },
+ },
+ ],
+ },
+ noInlineConfig: true,
+};
From 964f6ead0cb5bfa4bd1a0d2a61a2ea2dce25f382 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Fri, 3 May 2024 14:12:09 +0300
Subject: [PATCH 10/23] DT-50_setupVite (#6)
* DT-50 setup and configure vite
* DT-50 add dev/prod settings
---
package.json | 7 +++++--
src/vite-env.d.ts | 1 +
vite.config.ts | 13 +++++++++++++
3 files changed, 19 insertions(+), 2 deletions(-)
create mode 100644 src/vite-env.d.ts
create mode 100644 vite.config.ts
diff --git a/package.json b/package.json
index 85c708c..49cb868 100644
--- a/package.json
+++ b/package.json
@@ -20,13 +20,16 @@
"*.{tsx,ts}": "npm run lint:fix"
},
"scripts": {
- "lint": "eslint --cache . --ext ts,tsx --report-unused-disable-directives --max-warnings 0"
-
+ "lint": "eslint --cache . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
},
"license": "ISC",
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
+ "vite-tsconfig-paths": "^4.3.2"
},
"devDependencies": {
"@types/react": "^18.2.66",
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..779f8ae
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,13 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react-swc';
+import tsconfigPaths from 'vite-tsconfig-paths';
+
+export default defineConfig({
+ base: 'comtvset/eCommerce/',
+ plugins: [tsconfigPaths(), react()],
+ css: {
+ modules: {
+ localsConvention: 'camelCase',
+ },
+ },
+});
From f184a5a8ab2843ce078cf9f10b74226bbdc8984b Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Sat, 4 May 2024 12:36:13 +0300
Subject: [PATCH 11/23] DT-79 add detailed description how to run project (#16)
---
README.md | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 42cebdb..6031181 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,15 @@
# eCommerce-Application
-test
\ No newline at end of file
+
+## Setup project locally
+
+1. Install Node.js version >= 20.0.0
+0. Clone this [repository](https://github.com/comtvset/eCommerce-Application)
+0. Go to the root of project
+0. To install all dependencies run code
+```
+npm i
+```
+5. Run project in browser locally
+```
+npm run dev
+```
\ No newline at end of file
From 5dad12b0da041d69b0f821c3b5ae68af69ace642 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Sat, 4 May 2024 12:36:48 +0300
Subject: [PATCH 12/23] DT-90_huskyScript (#13)
* DT-90 add husky script
* DT-90 change according to fresh husky doc
---
package.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 49cb868..256ff45 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,8 @@
"lint": "eslint --cache . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"dev": "vite",
"build": "tsc && vite build",
- "preview": "vite preview"
+ "preview": "vite preview",
+ "prepare": "husky || true"
},
"license": "ISC",
"dependencies": {
From 62d444ae30916ce0b1947d03d0bc6e30ec267ab5 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Sat, 4 May 2024 12:38:07 +0300
Subject: [PATCH 13/23] DT-58 add script prettier (#12)
---
package.json | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 256ff45..850c07a 100644
--- a/package.json
+++ b/package.json
@@ -20,10 +20,12 @@
"*.{tsx,ts}": "npm run lint:fix"
},
"scripts": {
- "lint": "eslint --cache . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview",
+ "lint": "eslint --cache . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "format": "npx prettier . --cache --write src/**/*.*",
+ "ci:format": "prettier . --check"
"prepare": "husky || true"
},
"license": "ISC",
From f1311d2d39c1a8710326c6e6339ad0fcd33f8c9e Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Sat, 4 May 2024 12:40:29 +0300
Subject: [PATCH 14/23] DT-78 describe all availabe scripts (#14)
---
README.md | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)
diff --git a/README.md b/README.md
index 6031181..c88d890 100644
--- a/README.md
+++ b/README.md
@@ -12,4 +12,100 @@ npm i
5. Run project in browser locally
```
npm run dev
+```
+
+# Scripts:
+The project has a few scripts for working with different tools. The common rules how to use them.
+1. Open package.json
+2. Find section '_scripts_'
+3. Select the tool you want to apply
+4. Open terminal and run command like: npm run ...
+
+Example:
+```
+// run Eslint
+npm run lint
+```
+
+## List of scripts
+### dev
+
+to run the whole project in browser using development mode
+
+Example:
+```
+npm run dev
+```
+
+### build
+
+to create deployment build for production
+
+Example:
+```
+npm run build
+```
+
+### preview
+
+previewing the build locally
+
+Example:
+```
+npm run preview
+```
+
+### prepare
+
+automatically added by *husky init* command to prevent fail
+
+Example:
+```
+npm run prepare
+```
+
+
+### lint
+
+start check of code quality with additional params. At the end you can find list of errors/warning in the terminal:
+
+--cache - check only changed files
+
+--ext - check only file with specified extentions
+
+--report-unused-disable-directives
+This option causes ESLint to report directive comments like // eslint-disable-line when no errors would have been reported on that line anyway.
+
+--max-warnings - Number of warnings to trigger nonzero exit code
+
+
+Example:
+```
+npm run lint
+```
+
+### format
+
+start check of code quality with additional params. At the end you can find list of errors/warning in the terminal:
+
+--cache - check only changed files
+
+--write - format a certain file
+
+Example:
+```
+npm run format
+```
+
+### ci:format
+
+start check of code quality with additional params. At the end you can find list of errors/warning in the terminal:
+
+--cache - check only changed files
+
+--write - to format a file in-place
+
+Example:
+```
+npm run ci:format
```
\ No newline at end of file
From 30ee139d1185142469c85f046bdb309bf7ed4f50 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Sat, 4 May 2024 12:41:40 +0300
Subject: [PATCH 15/23] DT-77 add comprehensive description (#15)
---
README.md | 45 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index c88d890..943fe47 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,48 @@
# eCommerce-Application
+It's a comprehensive online shopping portal that provides an interactive and seamless experience to users. From product discovery to checkout, the application ensures a smooth journey for the user, enhancing their engagement and boosting their purchasing confidence
+
+## Goals
+
+1. Sell products via site
+
+2. RSS students demonstrate acquired knowledge and ability to work in a team.
+
+## Pages
+
+1. Login and Registration pages 🖥️
+2. Main page 🏠
+3. Catalog Product page 📋
+4. Detailed Product page 🔎
+5. User Profile page 👤
+6. Basket page 🛒
+7. About Us page 🙋♂️🙋♀️
+
+## Technology Stack
+
+0. TypeScript
+0. React
+0. Vite
+0. Loadash
+0. AntDesign
+0. SCSS
+0. HTML
+0. CSS
+1. CommerceTools - a leading provider of commerce solutions for B2C and B2B enterprises. CommerceTools offers a cloud-native, microservices-based commerce platform that enables brands to create unique and engaging digital commerce experiences.
+2. Loadash
+0. Linters: ESLint, Prettier, airbnb rules
+0. Husky
+0. git
+0. Jest
+
+## Organization
+
+0. Agile / Scrum
+0. Jira (Board, Dashboard, Releases, Sprint, Pocker Planning, Automation)
+0. Confluence (Knoledge Base, MoMs, Agreements, Roles and Responsibilitties etc..)
+0. GitHub (Pull Request, workflow, Review)
+
+
## Setup project locally
1. Install Node.js version >= 20.0.0
@@ -108,4 +151,4 @@ start check of code quality with additional params. At the end you can find list
Example:
```
npm run ci:format
-```
\ No newline at end of file
+```
From 3a93fcd2ddc3694f1bb6d6a284fd7b4a34002367 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Mon, 6 May 2024 11:40:40 +0300
Subject: [PATCH 16/23] DT-91 fix trailing comma (#17)
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 850c07a..2275a08 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
"preview": "vite preview",
"lint": "eslint --cache . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"format": "npx prettier . --cache --write src/**/*.*",
- "ci:format": "prettier . --check"
+ "ci:format": "prettier . --check",
"prepare": "husky || true"
},
"license": "ISC",
From 43c6ea4685d83f0dd067147ad328f1d34677ac48 Mon Sep 17 00:00:00 2001
From: Vadzim <49336945+comtvset@users.noreply.github.com>
Date: Mon, 6 May 2024 20:15:45 +0200
Subject: [PATCH 17/23] DT-92 add .gitignore file (#18)
---
.gitignore | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 111 insertions(+)
create mode 100644 .gitignore
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c0d0b84
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,111 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# Visual Studio
+.vscode/
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# TypeScript v1 declaration files
+typings/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+
+# Next.js build output
+.next
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and *not* Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+.DS_Store
+
+# do not track package-lock.json file
+package-lock.json
\ No newline at end of file
From 3fac6c151ea58316a274d9367550d857d0b4e93b Mon Sep 17 00:00:00 2001
From: Vadzim <49336945+comtvset@users.noreply.github.com>
Date: Mon, 6 May 2024 20:16:18 +0200
Subject: [PATCH 18/23] DT-55 Install and configure Vitest and add 1 file of
test (#19)
---
package.json | 13 +++++++------
src/tests/example.test.ts | 6 ++++++
2 files changed, 13 insertions(+), 6 deletions(-)
create mode 100644 src/tests/example.test.ts
diff --git a/package.json b/package.json
index 2275a08..15b0ab4 100644
--- a/package.json
+++ b/package.json
@@ -35,23 +35,21 @@
"vite-tsconfig-paths": "^4.3.2"
},
"devDependencies": {
+ "@stylistic/eslint-plugin-js": "^1.7.2",
"@types/react": "^18.2.66",
"@types/react-dom": "^18.2.22",
"@typescript-eslint/eslint-plugin": "^7.2.0",
"@typescript-eslint/parser": "^7.2.0",
"@vitejs/plugin-react-swc": "^3.5.0",
"eslint": "^8.57.0",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-react-refresh": "^0.4.6",
- "typescript": "^5.2.2",
- "vite": "^5.2.0",
- "@stylistic/eslint-plugin-js": "^1.7.2",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-react": "^7.34.1",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.6",
"eslint-plugin-simple-import-sort": "^10.0.0",
"eslint-plugin-unicorn": "^50.0.1",
"eslint-plugin-unused-imports": "^3.0.0",
@@ -59,6 +57,9 @@
"lint-staged": "^15.2.0",
"prettier": "^3.2.4",
"pretty-quick": "^4.0.0",
- "sass": "^1.75.0"
+ "sass": "^1.75.0",
+ "typescript": "^5.2.2",
+ "vite": "^5.2.0",
+ "vitest": "^1.6.0"
}
}
diff --git a/src/tests/example.test.ts b/src/tests/example.test.ts
new file mode 100644
index 0000000..7610cb1
--- /dev/null
+++ b/src/tests/example.test.ts
@@ -0,0 +1,6 @@
+import { expect, test } from 'vitest';
+
+test('Example test', () => {
+ const result = 1 + 1;
+ expect(result).toEqual(2);
+});
From 495c3c8a2d6395f348df5cf0e55c7cf1cbbbeac1 Mon Sep 17 00:00:00 2001
From: Vadzim <49336945+comtvset@users.noreply.github.com>
Date: Tue, 7 May 2024 14:12:46 +0200
Subject: [PATCH 19/23] DT-60 add script run test (#20)
* DT-60 add script run test
* DT-60 add discription about test in README.md
---
.husky/pre-push | 1 +
README.md | 11 ++++++++++-
package.json | 3 ++-
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/.husky/pre-push b/.husky/pre-push
index 3867a0f..aba8440 100644
--- a/.husky/pre-push
+++ b/.husky/pre-push
@@ -1 +1,2 @@
npm run lint
+npm test
\ No newline at end of file
diff --git a/README.md b/README.md
index 943fe47..18ec30d 100644
--- a/README.md
+++ b/README.md
@@ -100,7 +100,7 @@ npm run preview
### prepare
-automatically added by *husky init* command to prevent fail
+automatically added by *husky init* command to prevent fail
Example:
```
@@ -152,3 +152,12 @@ Example:
```
npm run ci:format
```
+
+### test
+
+to run the test
+
+Example:
+```
+npm run test
+```
\ No newline at end of file
diff --git a/package.json b/package.json
index 15b0ab4..7bcefec 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,8 @@
"lint": "eslint --cache . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"format": "npx prettier . --cache --write src/**/*.*",
"ci:format": "prettier . --check",
- "prepare": "husky || true"
+ "prepare": "husky || true",
+ "test": "vitest"
},
"license": "ISC",
"dependencies": {
From 412f9b6dc591b0c201bbb2127c591278c09b61b4 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Wed, 8 May 2024 12:19:00 +0300
Subject: [PATCH 20/23] Dt 94 eslint failed (#22)
* DT-94 fix eslint bug + run prettier
* DT-94 delete running test becuase they didn't finish at all
* DT-94 run test with coverage
---
.eslintrc.cjs | 1 +
.github/pull_request_template.md | 2 ++
.husky/pre-push | 2 +-
README.md | 62 +++++++++++++++++++-------------
package.json | 3 +-
5 files changed, 43 insertions(+), 27 deletions(-)
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 4c6e15b..f3d5f0c 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -17,6 +17,7 @@ module.exports = {
parserOptions: {
ecmaVersion: 6,
sourceType: 'module',
+ project: ['./tsconfig.json', './tsconfig.node.json'],
},
plugins: ['react-refresh', '@typescript-eslint', 'unused-imports', 'simple-import-sort', 'prettier', 'unicorn', '@stylistic/js'],
rules: {
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 2246047..e8e9944 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,6 +1,8 @@
1. Acceptance criteria:
+
-
-
+
2. Screenshot (not technical tasks):
3. Comments
diff --git a/.husky/pre-push b/.husky/pre-push
index aba8440..a84cc5a 100644
--- a/.husky/pre-push
+++ b/.husky/pre-push
@@ -1,2 +1,2 @@
npm run lint
-npm test
\ No newline at end of file
+npm test
diff --git a/README.md b/README.md
index 18ec30d..46ef1b4 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ It's a comprehensive online shopping portal that provides an interactive and sea
2. RSS students demonstrate acquired knowledge and ability to work in a team.
-## Pages
+## Pages
1. Login and Registration pages 🖥️
2. Main page 🏠
@@ -21,61 +21,68 @@ It's a comprehensive online shopping portal that provides an interactive and sea
## Technology Stack
0. TypeScript
-0. React
-0. Vite
-0. Loadash
-0. AntDesign
-0. SCSS
-0. HTML
-0. CSS
-1. CommerceTools - a leading provider of commerce solutions for B2C and B2B enterprises. CommerceTools offers a cloud-native, microservices-based commerce platform that enables brands to create unique and engaging digital commerce experiences.
-2. Loadash
-0. Linters: ESLint, Prettier, airbnb rules
-0. Husky
-0. git
-0. Jest
+1. React
+2. Vite
+3. Loadash
+4. AntDesign
+5. SCSS
+6. HTML
+7. CSS
+8. CommerceTools - a leading provider of commerce solutions for B2C and B2B enterprises. CommerceTools offers a cloud-native, microservices-based commerce platform that enables brands to create unique and engaging digital commerce experiences.
+9. Loadash
+10. Linters: ESLint, Prettier, airbnb rules
+11. Husky
+12. git
+13. Jest
## Organization
0. Agile / Scrum
-0. Jira (Board, Dashboard, Releases, Sprint, Pocker Planning, Automation)
-0. Confluence (Knoledge Base, MoMs, Agreements, Roles and Responsibilitties etc..)
-0. GitHub (Pull Request, workflow, Review)
-
+1. Jira (Board, Dashboard, Releases, Sprint, Pocker Planning, Automation)
+2. Confluence (Knoledge Base, MoMs, Agreements, Roles and Responsibilitties etc..)
+3. GitHub (Pull Request, workflow, Review)
## Setup project locally
1. Install Node.js version >= 20.0.0
-0. Clone this [repository](https://github.com/comtvset/eCommerce-Application)
-0. Go to the root of project
-0. To install all dependencies run code
+2. Clone this [repository](https://github.com/comtvset/eCommerce-Application)
+3. Go to the root of project
+4. To install all dependencies run code
+
```
npm i
```
+
5. Run project in browser locally
+
```
npm run dev
```
# Scripts:
+
The project has a few scripts for working with different tools. The common rules how to use them.
+
1. Open package.json
2. Find section '_scripts_'
3. Select the tool you want to apply
4. Open terminal and run command like: npm run ...
Example:
+
```
// run Eslint
npm run lint
```
## List of scripts
+
### dev
to run the whole project in browser using development mode
Example:
+
```
npm run dev
```
@@ -85,6 +92,7 @@ npm run dev
to create deployment build for production
Example:
+
```
npm run build
```
@@ -94,20 +102,21 @@ npm run build
previewing the build locally
Example:
+
```
npm run preview
```
### prepare
-automatically added by *husky init* command to prevent fail
+automatically added by _husky init_ command to prevent fail
Example:
+
```
npm run prepare
```
-
### lint
start check of code quality with additional params. At the end you can find list of errors/warning in the terminal:
@@ -121,8 +130,8 @@ This option causes ESLint to report directive comments like // eslint-disable-li
--max-warnings - Number of warnings to trigger nonzero exit code
-
Example:
+
```
npm run lint
```
@@ -136,6 +145,7 @@ start check of code quality with additional params. At the end you can find list
--write - format a certain file
Example:
+
```
npm run format
```
@@ -149,6 +159,7 @@ start check of code quality with additional params. At the end you can find list
--write - to format a file in-place
Example:
+
```
npm run ci:format
```
@@ -158,6 +169,7 @@ npm run ci:format
to run the test
Example:
+
```
npm run test
-```
\ No newline at end of file
+```
diff --git a/package.json b/package.json
index 7bcefec..c5db3e7 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,7 @@
"format": "npx prettier . --cache --write src/**/*.*",
"ci:format": "prettier . --check",
"prepare": "husky || true",
- "test": "vitest"
+ "test": "vitest run --coverage"
},
"license": "ISC",
"dependencies": {
@@ -42,6 +42,7 @@
"@typescript-eslint/eslint-plugin": "^7.2.0",
"@typescript-eslint/parser": "^7.2.0",
"@vitejs/plugin-react-swc": "^3.5.0",
+ "@vitest/coverage-v8": "^1.6.0",
"eslint": "^8.57.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-base": "^15.0.0",
From 917e4196afc2f14af5513b033fa83f5cdb8f8a85 Mon Sep 17 00:00:00 2001
From: Maria <99416741+maria-akulova@users.noreply.github.com>
Date: Wed, 15 May 2024 11:14:41 +0300
Subject: [PATCH 21/23] DT-111 rss validation registration form (#27)
* DT-127_mainFile (#23)
* DT-127 add index.html, index.tsx, index.css, App.tsx files
* add Eslint rules, add one plugin, add styles, add absolute path
* add Eslint rule, add different path to tsconfig
* DT-131 add full path to project and correct mistakes in README.md (#24)
* DT-131 add full path to project and correct mistakes in README.md
* DT-131 clean path
* DT-132 add folders for Pages and Components (#25)
* DT-111 add registration form with all fields
* DT-111 fix format issue
* DT-111 fix: rename files
---------
Co-authored-by: MARGO06 <118379169+MARGO06@users.noreply.github.com>
Co-authored-by: Vadzim <49336945+comtvset@users.noreply.github.com>
---
.eslintrc.cjs | 17 +++++++++++++
README.md | 15 ++++++------
index.html | 10 ++++++++
package.json | 1 +
src/App.tsx | 22 +++++++++++++++++
.../input/input.tsx} | 0
src/index.scss | 23 ++++++++++++++++++
src/index.tsx | 14 +++++++++++
.../registrationPage/registration.module.scss | 8 ++++++
.../registrationPage/registrationPage.tsx | 17 +++++++++++++
src/public/OpenSans-Regular.ttf | Bin 0 -> 130832 bytes
src/styles/_mixins.scss | 0
src/styles/_variables.scss | 6 +++++
tsconfig.json | 5 ++++
vite.config.ts | 2 +-
15 files changed, 131 insertions(+), 9 deletions(-)
create mode 100644 index.html
create mode 100644 src/App.tsx
rename src/{styles/mixins.scss => components/input/input.tsx} (100%)
create mode 100644 src/index.scss
create mode 100644 src/index.tsx
create mode 100644 src/logic/registrationPage/registration.module.scss
create mode 100644 src/logic/registrationPage/registrationPage.tsx
create mode 100644 src/public/OpenSans-Regular.ttf
create mode 100644 src/styles/_mixins.scss
create mode 100644 src/styles/_variables.scss
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index f3d5f0c..ac54717 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -11,6 +11,7 @@ module.exports = {
'plugin:react/jsx-runtime',
'plugin:prettier/recommended',
'airbnb',
+ 'plugin:react/jsx-runtime',
],
ignorePatterns: ['dist', '.eslintrc.cjs', 'node_modules', 'build', 'public', 'assets'],
parser: '@typescript-eslint/parser',
@@ -39,6 +40,17 @@ module.exports = {
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'error',
'implicit-arrow-linebreak': 'off',
+ 'react/jsx-filename-extension': [1, { extensions: ['.js', '.ts', '.tsx', '.jsx'] }],
+ 'import/prefer-default-export': 'off',
+ 'react/function-component-definition': [
+ 2,
+ {
+ namedComponents: 'arrow-function',
+ unnamedComponents: 'arrow-function',
+ },
+ ],
+ 'arrow-body-style': 'off',
+ 'import/no-unresolved': 'error',
'import/no-extraneous-dependencies': [
'error',
{
@@ -62,5 +74,10 @@ module.exports = {
},
],
},
+ settings: {
+ 'import/resolver': {
+ typescript: {},
+ },
+ },
noInlineConfig: true,
};
diff --git a/README.md b/README.md
index 46ef1b4..ef7a446 100644
--- a/README.md
+++ b/README.md
@@ -29,17 +29,16 @@ It's a comprehensive online shopping portal that provides an interactive and sea
6. HTML
7. CSS
8. CommerceTools - a leading provider of commerce solutions for B2C and B2B enterprises. CommerceTools offers a cloud-native, microservices-based commerce platform that enables brands to create unique and engaging digital commerce experiences.
-9. Loadash
-10. Linters: ESLint, Prettier, airbnb rules
-11. Husky
-12. git
-13. Jest
+9. Linters: ESLint, Prettier, airbnb rules
+10. Husky
+11. git
+12. Jest
## Organization
0. Agile / Scrum
-1. Jira (Board, Dashboard, Releases, Sprint, Pocker Planning, Automation)
-2. Confluence (Knoledge Base, MoMs, Agreements, Roles and Responsibilitties etc..)
+1. Jira (Board, Dashboard, Releases, Sprint, Poker Planning, Automation)
+2. Confluence (Knowledge Base, MoMs, Agreements, Roles and Responsibilities etc..)
3. GitHub (Pull Request, workflow, Review)
## Setup project locally
@@ -123,7 +122,7 @@ start check of code quality with additional params. At the end you can find list
--cache - check only changed files
---ext - check only file with specified extentions
+--ext - check only file with specified extensions
--report-unused-disable-directives
This option causes ESLint to report directive comments like // eslint-disable-line when no errors would have been reported on that line anyway.
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..7e8dd75
--- /dev/null
+++ b/index.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+ Cozy House
+
+
+
+
diff --git a/package.json b/package.json
index c5db3e7..7329fc6 100644
--- a/package.json
+++ b/package.json
@@ -47,6 +47,7 @@
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^9.1.0",
+ "eslint-import-resolver-typescript": "^3.6.1",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-react": "^7.34.1",
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 0000000..77740d6
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,22 @@
+import { useState } from 'react';
+import { RegistrationPage } from './logic/registrationPage/RegistrationPage.tsx';
+
+export const App = () => {
+ const [showRegistration, setShowRegistration] = useState(false);
+
+ return (
+
+ {!showRegistration && (
+
+ )}
+ {showRegistration && }
+
+ );
+};
diff --git a/src/styles/mixins.scss b/src/components/input/input.tsx
similarity index 100%
rename from src/styles/mixins.scss
rename to src/components/input/input.tsx
diff --git a/src/index.scss b/src/index.scss
new file mode 100644
index 0000000..8c17801
--- /dev/null
+++ b/src/index.scss
@@ -0,0 +1,23 @@
+@import 'src/styles/normalize';
+@import 'src/styles/variables';
+
+@font-face {
+ font-family: 'Open Sans', sans-serif;
+ src: url(src/public/OpenSans-Regular.ttf) format('truetype');
+}
+
+html {
+ font-size: 10px;
+}
+
+body {
+ background-color: $backgroundColor;
+ color: $primaryTextColor;
+ font-family: 'Open Sans', sans-serif;
+ font-weight: 400;
+}
+
+#root {
+ max-width: $maxWidthDesktop;
+ margin: 0 auto;
+}
diff --git a/src/index.tsx b/src/index.tsx
new file mode 100644
index 0000000..9a950c1
--- /dev/null
+++ b/src/index.tsx
@@ -0,0 +1,14 @@
+import { createRoot } from 'react-dom/client';
+import React from 'react';
+import { App } from 'src/App.tsx';
+import 'src/index.scss';
+
+const rootElement = document.createElement('div');
+rootElement.id = 'root';
+document.body.appendChild(rootElement);
+
+createRoot(rootElement).render(
+
+
+ ,
+);
diff --git a/src/logic/registrationPage/registration.module.scss b/src/logic/registrationPage/registration.module.scss
new file mode 100644
index 0000000..1e067ee
--- /dev/null
+++ b/src/logic/registrationPage/registration.module.scss
@@ -0,0 +1,8 @@
+.registration {
+ margin-top: 2vh;
+ display: flex;
+ flex-direction: column;
+ flex-wrap: nowrap;
+ align-items: center;
+ gap: 1vh;
+}
diff --git a/src/logic/registrationPage/registrationPage.tsx b/src/logic/registrationPage/registrationPage.tsx
new file mode 100644
index 0000000..739295d
--- /dev/null
+++ b/src/logic/registrationPage/registrationPage.tsx
@@ -0,0 +1,17 @@
+import style from './Registration.module.scss';
+
+export const RegistrationPage = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/public/OpenSans-Regular.ttf b/src/public/OpenSans-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..67803bb642742643c9525b6d25b8ade89383232c
GIT binary patch
literal 130832
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