diff --git a/frontend/core/package-lock.json b/frontend/core/package-lock.json index fa8a7c6..ddc0e91 100644 --- a/frontend/core/package-lock.json +++ b/frontend/core/package-lock.json @@ -22,6 +22,7 @@ "react-chartjs-2": "^5.2.0", "react-dom": "18.2.0", "react-icons": "^4.10.1", + "sass": "^1.72.0", "typescript": "5.1.6", "uuid": "^9.0.1" }, @@ -527,6 +528,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -721,6 +734,17 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -817,6 +841,40 @@ "pnpm": ">=7" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -1666,6 +1724,19 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -1921,6 +1992,11 @@ "node": ">= 4" } }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2009,6 +2085,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -2530,6 +2617,14 @@ } } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2904,6 +2999,17 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", @@ -3051,6 +3157,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sass": { + "version": "1.72.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", + "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -3886,6 +4008,15 @@ "color-convert": "^2.0.1" } }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4035,6 +4166,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4096,6 +4232,31 @@ "@kurkle/color": "^0.3.0" } }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, "client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -4736,6 +4897,12 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4907,6 +5074,11 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" }, + "immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -4971,6 +5143,14 @@ "has-bigints": "^1.0.1" } }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -5320,6 +5500,11 @@ "zod": "3.21.4" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5566,6 +5751,14 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, "reflect.getprototypeof": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", @@ -5656,6 +5849,16 @@ "is-regex": "^1.1.4" } }, + "sass": { + "version": "1.72.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", + "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, "scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", diff --git a/frontend/core/package.json b/frontend/core/package.json index d2d612c..0201e45 100644 --- a/frontend/core/package.json +++ b/frontend/core/package.json @@ -25,6 +25,7 @@ "react-chartjs-2": "^5.2.0", "react-dom": "18.2.0", "react-icons": "^4.10.1", + "sass": "^1.72.0", "typescript": "5.1.6", "uuid": "^9.0.1" }, diff --git a/frontend/core/public/assets/background-stars.svg b/frontend/core/public/assets/background-stars.svg new file mode 100644 index 0000000..daf083d --- /dev/null +++ b/frontend/core/public/assets/background-stars.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/core/public/assets/hero-overlay.svg b/frontend/core/public/assets/hero-overlay.svg new file mode 100644 index 0000000..72f7bfa --- /dev/null +++ b/frontend/core/public/assets/hero-overlay.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/core/public/assets/hero-rectangle.svg b/frontend/core/public/assets/hero-rectangle.svg new file mode 100644 index 0000000..e9ec8ae --- /dev/null +++ b/frontend/core/public/assets/hero-rectangle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/core/public/assets/hero-space.svg b/frontend/core/public/assets/hero-space.svg new file mode 100644 index 0000000..95f3f59 --- /dev/null +++ b/frontend/core/public/assets/hero-space.svg @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/core/src/app/globals.css b/frontend/core/src/app/globals.css index ba7c061..1d95abc 100644 --- a/frontend/core/src/app/globals.css +++ b/frontend/core/src/app/globals.css @@ -8,6 +8,7 @@ --popup-bg-color: #fefefe; --background-color: #fefefe; --hover-color: #f0f0f0; + --shadow-color: #eee; --primary-color: #7A72FF; --secondary-color: #1C3041; @@ -19,6 +20,7 @@ --overlay-color: #22222220; --content-bg-color: #fbfbfb; --border-color: #b6b6b6; + --border-color-light: #f9f9f9; --weak-border-color: #e2e2e290; --table-border-color: #e2e2e290; --font-color-light: white; @@ -36,6 +38,7 @@ /* z-index */ --z-index-modal: 10; + --z-index-public-header: 1; --z-index-popup: 1; --z-index-popup-menu: 3; --z-index-select: 1; diff --git a/frontend/core/src/app/page.module.css b/frontend/core/src/app/page.module.css deleted file mode 100644 index 5e052f7..0000000 --- a/frontend/core/src/app/page.module.css +++ /dev/null @@ -1,59 +0,0 @@ -.main { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - min-height: 100vh; -} - -.hero { - margin-bottom: 128px; - width: 100%; - min-height: 1338px; - background: #FAFAFA43; -} - -.copyContainer { - width: 100%; - min-height: 1338px; - background-image: url("/assets/eye-catch.svg"); - background-repeat: no-repeat; - background-size: contain; - background-position-x: center; - padding-top: 20%; -} - -.copy { - text-align: center; - font-size: 48px; - letter-spacing: 0.4rem; -} - -.copyDescription { - font-size: 24px; - color: var(--font-color-weak); - padding: 32px; - margin: 64px 0px; - margin-bottom: 32px; - text-align: center; - line-height: 2.2; -} - -.eyeCatch { - width: 100%; - height: 100%; -} - -.entryContainer { - display: flex; - justify-content: center; - padding: 32px; -} - -button.entry { - background: #2e2e2e; - font-size: 24px; - letter-spacing: 3px; - padding: 16px; - width: 360px; -} diff --git a/frontend/core/src/app/page.module.scss b/frontend/core/src/app/page.module.scss new file mode 100644 index 0000000..5e0b05e --- /dev/null +++ b/frontend/core/src/app/page.module.scss @@ -0,0 +1,310 @@ +@use '@/assets/stylesheets/mixin' as m; + +.main { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + min-height: 100vh; +} + +.hero { + position: relative; + width: 100%; + height: 100vh; + max-height: 1320px; + background-image: url("/assets/hero-rectangle.svg"); + background-repeat: no-repeat; + background-size: cover; + background-position-x: center; + overflow: hidden; + + @include m.lg { + height: 960px; + } +} + +.heroMoon { + position: absolute; + top: 10%; + left: 10%; + + @include m.lg { + display: none; + } +} + +.heroEarth { + position: absolute; + bottom: 0; + right: 0; + @include m.lg { + display: none; + } +} + +.heroSpace { + height: 100vh; + max-height: 1320px; + position: absolute; + left: -100vw; + width: 200vw; + display: flex; + background-image: url("/assets/hero-space.svg"); + animation: 300s linear 0s infinite running slide-space; +} + +.heroOverlay { + min-height: 1320px; + position: absolute; + background-image: url("/assets/hero-overlay.svg"); +} + +@keyframes slide-space { + from { + transform: translateX(0); + } + + to { + transform: translateX(100vw); + } +} + +.heroContainer { + position: absolute; + top: 20%; +} + +.copyContainer { + width: 560px; + color: var(--font-color-light); + @include m.lg { + width: 100%; + padding: 32px; + } +} + +.catchCopyText { + text-align: center; +} + +.catchBody { + margin: 64px 0; + + @include m.lg{ + width: 280px; + margin: 64px auto; + } +} + +.catchBodyText { + text-align: center; + @include m.xl { + margin-bottom: 16px; + } +} + + +.catchFooter { + padding: 0 128px; + @include m.lg { + padding: 0 16px; + } +} + +.copy { + text-align: center; + font-size: 48px; + letter-spacing: 0.4rem; +} + +.features { + margin: 64px 0; +} + +.background { + margin: 128px 0; + background-image: url("/assets/background-stars.svg"); + width: 100%; +} + +.price { + margin: 64px 0; + margin-bottom: 400px; +} + +.priceTable { + display: flex; + justify-content: center; + margin-top: 128px; + + @include m.lg { + flex-wrap: wrap; + } +} + +.priceHeaderTitle { + font-size: 18px; + text-align: center; +} + +.priceSubHeader { + margin-top: 32px; + text-align: center; + font-size: 12px; + + @include m.lg { + padding: 16px; + } +} + +.priceCol { + margin-right: 32px; + + @include m.lg { + margin: auto; + } +} + +.priceTag { + display: inline-block; + font-size: 12px; + margin-left: 16px; +} + +.planContainer { + border-radius: 8px; + border: 1px solid var(--border-color-light); + padding: 32px; + background: var(--background-color); + box-shadow: 1px 1px 8px 4px #f9f9f9; + width: 360px; + @include m.lg { + min-width: 100%; + } +} + +.priceHeader { +} + +.planPrice { + text-align: center; + padding: 64px; + font-size: 28px; + font-weight: bold; + letter-spacing: 0.2rem; + white-space: nowrap; +} + +.planRow { + text-align: center; + background: #f9f9f9; + border-bottom: 1px solid var(--background-color); + height: 58px; + + @include m.lg { + height: auto; + } +} + +.planRowHeader { + display: none; + @include m.lg { + display: block; + padding: 4px; + font-size: 12px; + background: var(--primary-color); + color: var(--font-color-light); + } +} + +.planRowBody { + padding: 16px; +} + +.planHeader { + width: 240px; +} + +.priceTableHeader { + @include m.lg{ + display: none; + } +} + +.priceTableHeaderHeader { + height: 232px; +} + +.priceTableHeaderRow { + text-align: center; + padding: 16px; + background: var(--background-color); + text-align: left; + border-bottom: 1px solid var(--background-color); + font-size: 14px; +} + +.review { + padding: 0 128px; + margin-bottom: 400px; + + @include m.lg { + padding: 0 16px; + } +} + +.reviewHeaderTitle { + font-size: 18px; + text-align: center; +} + +.reviewContent { + margin-top: 128px; + padding: 0 128px; + display: flex; + justify-content: space-evenly; + @include m.lg { + margin-top: 64px; + padding: 0 16px; + flex-wrap: wrap; + } +} + +.reviewCol { + width: 280px; + + @include m.lg { + min-width: 280px; + margin-bottom: 128px; + } +} + +.reviewProfile { + margin: 32px 0; + text-align: center; + font-weight: bold; +} + +.reviewAvatar { + display: flex; + justify-content: center; + align-items: center; +} + +.reviewAvatarImage { + height: 64px; + width: 64px; + border-radius: 50%; + object-fit: cover; +} + +.reviewFooter { + margin: 128px 0; + display: flex; + justify-content: center; +} + +.signUpButton { + width: 360px; +} diff --git a/frontend/core/src/app/page.tsx b/frontend/core/src/app/page.tsx index a0e7a15..e15abdf 100644 --- a/frontend/core/src/app/page.tsx +++ b/frontend/core/src/app/page.tsx @@ -1,67 +1,314 @@ -import styles from "./page.module.css"; +import styles from "./page.module.scss"; import Header from "@/components/shared/header/public"; import Footer from "@/components/shared/footer"; +import Image from "next/image"; import Button from "@/components/shared/button"; import Section from "@/components/section"; -import img1 from "@/assets/hero-features-1.png"; -import img2 from "@/assets/hero-features-2.png"; -import img3 from "@/assets/hero-features-3.png"; import Link from "next/link"; +import earth from "@/assets/hero-earth.svg"; +import moon from "@/assets/hero-moon.svg"; +import featuresNewProject from "@/assets/features-new-project.png"; +import featuresMilestone from "@/assets/features-milestone.png"; +import featuresDashoboard from "@/assets/features-dashboard.png"; +import featuresUI from "@/assets/features-ui.png"; +import reviewImage1 from "@/assets/review-1.jpg"; +import reviewImage2 from "@/assets/review-2.jpg"; +import reviewImage3 from "@/assets/review-3.jpg"; export default function Home() { return (
-
+
+ Moon + Earth +
+
+
+
-

Turbo でより鮮明なゴール設定

-

- 理想の生活は何で満たす?大切な時間をときめくタスクでみたそう。 -
- Turbo はそんなあなたの希望を満たすアプリです。 -

-
+
+

+ 確実に夢をかなえる TODO アプリ +

+
+
+

+ Turboは確実に夢を叶えたいあなたへのタスク管理アプリです。 +

+

+ 目標を鮮明にイメージしてゴールへの歩みを加速させましょう。 +

+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+

料金

+

+ ※ + 学習用アプリなので、ダミーの料金表です。プランに関する機能は未実装です。 +

+
+
+
+
+
+
+
+
+ 複数プロジェクト +
+
+ ダッシュボード +
+
テーマ変更
+
+ リマインダー +
+
Web API
+
+
+
+
+
+
+
フリープラン
+
無料
+
+
+
+

複数プロジェクト

+

3つまで

+
+
+

ダッシュボード

+

+
+
+

テーマ変更

+

+
+
+

リマインダー

+

-

+
+
+

Web API

+

-

+
+
+
+
+
+
+
+
スタートプラン
+
+ 980円/ 月 +
+
+
+
+

複数プロジェクト

+

無制限

+
+
+

ダッシュボード

+

+
+
+

テーマ変更

+

+
+
+

リマインダー

+

+
+
+

Web API

+

-

+
+
+
+
+
+
+
+
プレミアムプラン
+
+ 1,980円/ 月 +
+
+
+
+

複数プロジェクト

+

無制限

+
+
+

ダッシュボード

+

+
+
+

テーマ変更

+

+
+
+

リマインダー

+

+
+
+

Web API

+

+
+
+
+
+
+
+
+
+
+

ユーザーの声

+
+
+
+
+
+ アバター +
+
+

Roberto Dixon

+

ソフトウェアエンジニア

+
+
+
+

+ Turbo は自分の目標を管理するのに最適なツールです。 +
+
+ わかりやすい UI で登録したその日からすぐに活躍してくれました。 +

+
+
+
+
+
+ アバター +
+
+

Carolyn Obrien

+

英語教師

+
+
+
+

+ Turbo + で自分の仕事とプライベートをうまくバランスできるようになりました。 +
+
+ 仕事もプライベートもお互いに干渉するものですが、Turbo + でそれらをまとめて管理できます。 +

+
+
+
+
+
+ アバター +
+
+

Edward Hopkins

+

写真家

+
+
+
+

+ Turboのリマインド機能で常に長期の計画を意識しながら自分のプロジェクトを進めることができます。 +
+
+ 長期の計画でも迷子にならずに進むのに最適なツールです。 +

+
+
+
+
- +
+ +
-
-
-
-
+
); diff --git a/frontend/core/src/assets/features-dashboard.png b/frontend/core/src/assets/features-dashboard.png new file mode 100644 index 0000000..87cd30a Binary files /dev/null and b/frontend/core/src/assets/features-dashboard.png differ diff --git a/frontend/core/src/assets/features-milestone-2.png b/frontend/core/src/assets/features-milestone-2.png new file mode 100644 index 0000000..44c8427 Binary files /dev/null and b/frontend/core/src/assets/features-milestone-2.png differ diff --git a/frontend/core/src/assets/features-milestone.png b/frontend/core/src/assets/features-milestone.png new file mode 100644 index 0000000..77a8599 Binary files /dev/null and b/frontend/core/src/assets/features-milestone.png differ diff --git a/frontend/core/src/assets/features-new-project.png b/frontend/core/src/assets/features-new-project.png new file mode 100644 index 0000000..0da1b8b Binary files /dev/null and b/frontend/core/src/assets/features-new-project.png differ diff --git a/frontend/core/src/assets/features-ui.png b/frontend/core/src/assets/features-ui.png new file mode 100644 index 0000000..217e2be Binary files /dev/null and b/frontend/core/src/assets/features-ui.png differ diff --git a/frontend/core/src/assets/hero-earth.svg b/frontend/core/src/assets/hero-earth.svg new file mode 100644 index 0000000..79f4f66 --- /dev/null +++ b/frontend/core/src/assets/hero-earth.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/core/src/assets/hero-moon.svg b/frontend/core/src/assets/hero-moon.svg new file mode 100644 index 0000000..b79fffc --- /dev/null +++ b/frontend/core/src/assets/hero-moon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/core/src/assets/hero-space.svg b/frontend/core/src/assets/hero-space.svg new file mode 100644 index 0000000..485e1ba --- /dev/null +++ b/frontend/core/src/assets/hero-space.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/core/src/assets/logo.png b/frontend/core/src/assets/logo.png new file mode 100644 index 0000000..1156215 Binary files /dev/null and b/frontend/core/src/assets/logo.png differ diff --git a/frontend/core/src/assets/review-1.jpg b/frontend/core/src/assets/review-1.jpg new file mode 100644 index 0000000..fb92652 Binary files /dev/null and b/frontend/core/src/assets/review-1.jpg differ diff --git a/frontend/core/src/assets/review-2.jpg b/frontend/core/src/assets/review-2.jpg new file mode 100644 index 0000000..402ac41 Binary files /dev/null and b/frontend/core/src/assets/review-2.jpg differ diff --git a/frontend/core/src/assets/review-3.jpg b/frontend/core/src/assets/review-3.jpg new file mode 100644 index 0000000..53023f8 Binary files /dev/null and b/frontend/core/src/assets/review-3.jpg differ diff --git a/frontend/core/src/assets/stylesheets/mixin.scss b/frontend/core/src/assets/stylesheets/mixin.scss new file mode 100644 index 0000000..e9620c5 --- /dev/null +++ b/frontend/core/src/assets/stylesheets/mixin.scss @@ -0,0 +1,27 @@ +@use 'variable' as v; + +// Small devices +@mixin sm { + @media (max-width: #{v.$screen-sm-min}) { + @content + } +} + +// Medium devices +@mixin md { + @media (max-width: #{v.$screen-md-min}) { + @content + }} + +// Large devices +@mixin lg { + @media (max-width: #{v.$screen-lg-min}) { + @content + }} + +// Extra large devices +@mixin xl { + @media (max-width: #{v.$screen-xl-min}) { + @content + }} + diff --git a/frontend/core/src/assets/stylesheets/variable.scss b/frontend/core/src/assets/stylesheets/variable.scss new file mode 100644 index 0000000..7f37436 --- /dev/null +++ b/frontend/core/src/assets/stylesheets/variable.scss @@ -0,0 +1,4 @@ +$screen-sm-min: 576px; +$screen-md-min: 768px; +$screen-lg-min: 992px; +$screen-xl-min: 1200px; diff --git a/frontend/core/src/components/section/index.module.css b/frontend/core/src/components/section/index.module.css deleted file mode 100644 index 1ea163c..0000000 --- a/frontend/core/src/components/section/index.module.css +++ /dev/null @@ -1,26 +0,0 @@ -.section { - width: 100%; -} - -.content { - margin: auto; - max-width: 1920px; - display: flex; - margin-bottom: 128px; - margin-top: 32px; - width: 100%; - justify-content: space-evenly; -} - -.sectionTitle { - font-size: 32px; - margin-bottom: 16px; -} - -.sectionContent { - font-size: 20px; - line-height: 2.5; - margin: 32px; - padding: 32px; - color: var(--font-color-weak); -} diff --git a/frontend/core/src/components/section/index.module.scss b/frontend/core/src/components/section/index.module.scss new file mode 100644 index 0000000..fc7fa5b --- /dev/null +++ b/frontend/core/src/components/section/index.module.scss @@ -0,0 +1,107 @@ +@use '@/assets/stylesheets/mixin' as m; + +.section { + width: 100%; +} + +.content { + margin: auto; + max-width: 1920px; + margin-bottom: 128px; + margin-top: 32px; + width: 100%; + justify-content: space-evenly; + + @include m.lg { + margin-bottom: 64px; + } +} + +.sectionTitle { + font-size: 18px; + margin-bottom: 16px; + text-align: center; +} + +.description { + font-size: 20px; + line-height: 2.5; + margin: 32px auto; + width: 480px; + color: var(--font-color-dark); + + @include m.lg { + width: 100%; + } + + @include m.sm { + font-size: 16px; + line-height: 1.8; + } +} + +.descriptionText { + @include m.lg { + width: 60%; + margin: auto; + } + + @include m.sm { + width: 100%; + } +} + +.body { + padding: 128px 32px; + + @include m.lg { + margin-bottom: 64px 16px; + } +} + +.segment { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 128px; + + @include m.lg { + flex-wrap: wrap; + margin-bottom: 64px; + } +} + +.left { + flex: 1; + color: var(--color-font); + padding: 64px; + + @include m.lg { + min-width: 100%; + padding: 0; + margin-bottom: 64px; + } +} + +.right { + position: relative; + flex: 1; + width: 900px; + height: 566px; + + @include m.lg { + min-width: 100%; + min-width: 300px; + } + + @include m.sm { + height: 188px; + } +} + +.image { + display: block; + border-radius: 8px; + box-shadow: 1px 1px 4px 8px var(--shadow-color); +} + diff --git a/frontend/core/src/components/section/index.tsx b/frontend/core/src/components/section/index.tsx index ad0eb3b..7c50205 100644 --- a/frontend/core/src/components/section/index.tsx +++ b/frontend/core/src/components/section/index.tsx @@ -1,40 +1,51 @@ -import styles from "./index.module.css"; +import styles from "./index.module.scss"; import Image, { StaticImageData } from "next/image"; -interface Props { - title: string; +interface Element { description: string[]; image: StaticImageData; - imageAlt: string; + alt: string; } -export default function Section({ - title, - description, - image, - imageAlt, -}: Props) { +interface Props { + title: string; + elements: Element[]; +} + +export default function Section({ title, elements }: Props) { return (
-
+

{title}

-
- {description.map((line, index) => - index === description.length - 1 ? ( - line - ) : ( - <> - {line} -
- - ), - )} +
+ {elements.map((ele, index) => { + return ( +
+
+
+ {ele.description.map((line) => { + return ( +

+ {line} +

+ ); + })} +
+
+
+ {ele.alt} +
+
+ ); + })}
-
- {imageAlt} -
); diff --git a/frontend/core/src/components/shared/button/index.module.css b/frontend/core/src/components/shared/button/index.module.css index c84337c..fdf0298 100644 --- a/frontend/core/src/components/shared/button/index.module.css +++ b/frontend/core/src/components/shared/button/index.module.css @@ -23,4 +23,6 @@ } .secondary { + background: var(--secondary-color); + color: var(--font-color-light); } diff --git a/frontend/core/src/components/shared/footer/index.module.css b/frontend/core/src/components/shared/footer/index.module.scss similarity index 72% rename from frontend/core/src/components/shared/footer/index.module.css rename to frontend/core/src/components/shared/footer/index.module.scss index eced692..788d8f1 100644 --- a/frontend/core/src/components/shared/footer/index.module.css +++ b/frontend/core/src/components/shared/footer/index.module.scss @@ -1,3 +1,5 @@ +@use '@/assets/stylesheets/mixin' as m; + .footer { background: var(--bg-color-light-2); width: 100%; @@ -12,8 +14,12 @@ width: 100%; background: #f9f9f9; -} + @include m.lg { + flex-wrap: wrap; + padding: 16px; + } +} .logo { font-size: 24px; @@ -25,14 +31,25 @@ .menu { display: flex; margin-right: 16px; + + @include m.lg { + flex-wrap: wrap; + } } .menuItem { margin-right: 16px; + @include m.lg { + margin-bottom: 64px; + } } .left { margin-right: auto; + + @include m.lg { + margin-bottom: 64px; + } } .right { diff --git a/frontend/core/src/components/shared/footer/index.tsx b/frontend/core/src/components/shared/footer/index.tsx index b57cacf..e436608 100644 --- a/frontend/core/src/components/shared/footer/index.tsx +++ b/frontend/core/src/components/shared/footer/index.tsx @@ -1,4 +1,4 @@ -import styles from "./index.module.css"; +import styles from "./index.module.scss"; import Link from "next/link"; const footerMenus = [ diff --git a/frontend/core/src/components/shared/header/public/index.module.css b/frontend/core/src/components/shared/header/public/index.module.css deleted file mode 100644 index e84ddb9..0000000 --- a/frontend/core/src/components/shared/header/public/index.module.css +++ /dev/null @@ -1,32 +0,0 @@ -.header { - display: flex; - justify-content: space-between; - width: 100%; - padding: 16px; - - position: absolute; - top: 0px; -} - -.logo { - display: flex; -} - -.logo a { - color: var(--font-color); - text-decoration: none; -} - -.menu { - display: flex; - margin-right: 16px; -} - -.menuItem { - margin-right: 16px; -} - -.right { - display: flex; - align-items: center; -} diff --git a/frontend/core/src/components/shared/header/public/index.module.scss b/frontend/core/src/components/shared/header/public/index.module.scss new file mode 100644 index 0000000..07c5a27 --- /dev/null +++ b/frontend/core/src/components/shared/header/public/index.module.scss @@ -0,0 +1,64 @@ +@use '@/assets/stylesheets/mixin' as m; + +.header { + display: flex; + justify-content: space-between; + width: 100%; + padding: 16px; + + position: absolute; + top: 0px; + color: white; + + z-index: var(--z-index-public-header); +} + +.logo { + display: flex; +} + +.logo a { + color: var(--font-color); + text-decoration: none; +} + +.logoContent { + display: flex; + align-items: center; +} + +.menu { + display: flex; + margin-right: 16px; + + @include m.lg { + display: none; + } +} + +.menuItem { + margin-right: 16px; +} + +.right { + display: flex; + align-items: center; +} + +.actions { + display: flex; + align-items: center; + justify-content: space-between; + min-width: 240px; + + @include m.lg { + justify-content: flex-end; + } +} + +.signup { + @include m.lg { + display: none; + } +} + diff --git a/frontend/core/src/components/shared/header/public/index.tsx b/frontend/core/src/components/shared/header/public/index.tsx index 41aea67..d33299c 100644 --- a/frontend/core/src/components/shared/header/public/index.tsx +++ b/frontend/core/src/components/shared/header/public/index.tsx @@ -1,26 +1,33 @@ -import styles from "./index.module.css"; +import styles from "./index.module.scss"; import Link from "next/link"; import Button from "@/components/shared/button"; +import Image from "next/image"; +import logo from "@/assets/logo.png"; export default function Header() { return (
-

Turbo

+
+ ロゴ +

Turbo

+
- - - +
+ + + + + + +
);