From 3fbf78c79a25faf61b31614aefe4f26a04f570eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8F=99=EA=B7=9C?= <54929514+Donggggg@users.noreply.github.com> Date: Tue, 22 Jun 2021 21:40:09 +0900 Subject: [PATCH] =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20?= =?UTF-8?q?=EC=97=B0=EC=8A=B5=20=EA=B5=AC=ED=98=84=20(#52)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 스크립트 연습 라우터 연결 * 영어 입력 활성화 * 영어 오타 분석 추출 기능 구현 * 스크립트 연습 결과창 연동 구현 * 스크립트 연습 진행 정보창 업데이트 * 스크립트 연습 결과 최종 정보 출력 구현 * 스크립트 연습 구현 완료 * 전체적인 ui 개선 --- front/src/App.js | 7 +- front/src/app/store.js | 2 + front/src/components/DetailMenu.js | 4 +- front/src/components/PracticeBox.js | 7 +- front/src/components/PracticeResult.js | 19 ++ front/src/components/ProgressBox.js | 41 ++-- front/src/components/Title.js | 2 +- front/src/features/practices/keys/index.js | 3 +- .../practices/scripts/PracticeScript.js | 47 +++++ .../practices/scripts/PracticeScriptTask.js | 186 ++++++++++++++++++ .../features/practices/scripts/scriptSlice.js | 84 ++++++++ .../practices/sentences/PracticeSentence.js | 2 +- .../features/practices/sentences/Sentence.js | 8 +- front/src/features/practices/words/index.js | 3 +- front/src/features/scripts/AddScript.js | 2 +- front/src/features/scripts/ShowScript.js | 40 ++-- front/src/sass/common/_practice.scss | 25 +++ front/src/sass/common/_result.scss | 0 front/src/sass/common/_script.scss | 2 +- front/src/sass/main.css | 23 +++ front/src/sass/main.css.map | 5 +- front/src/sass/main.scss | 3 +- package.json | 1 + 23 files changed, 470 insertions(+), 46 deletions(-) create mode 100644 front/src/components/PracticeResult.js create mode 100644 front/src/features/practices/scripts/PracticeScript.js create mode 100644 front/src/features/practices/scripts/PracticeScriptTask.js create mode 100644 front/src/features/practices/scripts/scriptSlice.js create mode 100644 front/src/sass/common/_result.scss create mode 100644 package.json diff --git a/front/src/App.js b/front/src/App.js index 9b3ae0c..4750b1e 100644 --- a/front/src/App.js +++ b/front/src/App.js @@ -8,6 +8,8 @@ import ParagraphPractice from "./features/practices/paragraphs"; import WordPractice from "./features/practices/words"; import KeyPractice from "./features/practices/keys"; import PracticeSentence from "./features/practices/sentences/PracticeSentence" +import PracticeScript from "./features/practices/scripts/PracticeScript" +import PracticeResult from "./components/PracticeResult" function App() { return ( @@ -21,7 +23,10 @@ function App() { - + + + + diff --git a/front/src/app/store.js b/front/src/app/store.js index e36f365..bb01ba2 100644 --- a/front/src/app/store.js +++ b/front/src/app/store.js @@ -3,6 +3,7 @@ import keyboardsReducer from '../features/keyboards/KeyboardsSlice'; import wordsReducer from '../features/practices/words/wordsSlice'; import keysReducer from '../features/practices/keys/keysSlice'; import sentenceReducer from '../features/practices/sentences/sentenceSlice'; +import scriptReducer from '../features/practices/scripts/scriptSlice'; export default configureStore({ reducer: { @@ -10,5 +11,6 @@ export default configureStore({ words: wordsReducer, keys: keysReducer, sentence: sentenceReducer, + script: scriptReducer, } }); diff --git a/front/src/components/DetailMenu.js b/front/src/components/DetailMenu.js index 4822def..7ee07c9 100644 --- a/front/src/components/DetailMenu.js +++ b/front/src/components/DetailMenu.js @@ -25,8 +25,8 @@ function DetailMenu({onChoose}) { href: '/practice-word' }, { title: '문장연습', href: '/practice-sentence' }, - { title: '스크팁트 연습', - href: '/practice-script' }]; + { title: '스크립트 연습', + href: '/practice-script/list' }]; const PracticeList = PracticeModes.map((menu,index) =>
  • {menu.title}
  • diff --git a/front/src/components/PracticeBox.js b/front/src/components/PracticeBox.js index 62a9a47..b69ff2e 100644 --- a/front/src/components/PracticeBox.js +++ b/front/src/components/PracticeBox.js @@ -3,8 +3,9 @@ import '../sass/main.css' import PropTypes from 'prop-types'; import ProgressBox from '../components/ProgressBox'; import PracticeSentenceTask from '../features/practices/sentences/PracticeSentenceTask'; +import PracticeScriptTask from '../features/practices/scripts/PracticeScriptTask'; -function PracticeBox({information}) { +function PracticeBox({type, information}) { const boxes = information.map((item, index) => (
    {boxes}
    - + {type == "sentence" && } + {type == "script" && } ); } PracticeBox.propTypes = { + type: PropTypes.string, information: PropTypes.array, }; diff --git a/front/src/components/PracticeResult.js b/front/src/components/PracticeResult.js new file mode 100644 index 0000000..52e6bc4 --- /dev/null +++ b/front/src/components/PracticeResult.js @@ -0,0 +1,19 @@ +import React from "react"; +import "../sass/main.css"; +import { useLocation } from "react-router-dom"; + +function PracticeResult() { + const location = useLocation(); + return ( +
    + 최종 타수 : {location.state.typeSpeed} +
      + {location.state.scriptList.map((item, idx) => { + return
    • {item.name}
    • ; + })} +
    +
    + ); +} + +export default PracticeResult; diff --git a/front/src/components/ProgressBox.js b/front/src/components/ProgressBox.js index 48c2801..7bde6c8 100644 --- a/front/src/components/ProgressBox.js +++ b/front/src/components/ProgressBox.js @@ -5,22 +5,35 @@ import ProgressBar from "@ramonak/react-progress-bar"; function ProgressBox ({title, figure, id}) { var progressPercent = String(figure).replace("%", ''); - return ( -
    -
    -
    {title}
    -
    - + if (title == "스크립트명") + return ( +
    +
    +
    {title}
    +
    +
    {figure}
    +
    -
    {figure}
    -
    - ); + ); + else + return ( +
    +
    +
    {title}
    +
    + +
    +
    +
    {figure}
    +
    + ); } ProgressBox.propTypes = { diff --git a/front/src/components/Title.js b/front/src/components/Title.js index ba83c2d..f832d64 100644 --- a/front/src/components/Title.js +++ b/front/src/components/Title.js @@ -14,7 +14,7 @@ function Title({title}) { } const TitleStyle = { - width: '100%', + width: '94%', color: '#828282', fontWeight: '400', fontSize: '27.5px', diff --git a/front/src/features/practices/keys/index.js b/front/src/features/practices/keys/index.js index 39cd0bb..0604605 100644 --- a/front/src/features/practices/keys/index.js +++ b/front/src/features/practices/keys/index.js @@ -25,6 +25,7 @@ import ProgressBar from "@ramonak/react-progress-bar"; import useSound from 'use-sound'; import keySoundAsset from '../../../mechanicalKeyboard.mp3'; import style from '../words/index.module.scss'; +import '../../../sass/main.css'; function Header() { const dispatch = useDispatch(); @@ -137,7 +138,7 @@ function KeysPractice() { )); return ( -
    +
    diff --git a/front/src/features/practices/scripts/PracticeScript.js b/front/src/features/practices/scripts/PracticeScript.js new file mode 100644 index 0000000..3f57333 --- /dev/null +++ b/front/src/features/practices/scripts/PracticeScript.js @@ -0,0 +1,47 @@ +import React, {useState, useEffect} from 'react'; +import useInterval from '@use-it/interval' +import '../../../sass/main.css' +import Title from '../../../components/Title'; +import PracticeBox from '../../../components/PracticeBox'; +import { useSelector, useDispatch } from 'react-redux'; +import { initState, selectProgressPercent, selectTypeCount, updateTypeSpeed, selectTitle} from "./scriptSlice"; + +function PracticeScript() { + const dispatch = useDispatch(); + const progressPecent = useSelector(selectProgressPercent); + const typeCount = useSelector(selectTypeCount); + const [tick, setTick] = useState(0); // 시작 후 흐른 시간 + const [typeSpeed, setTypeSpeed] = useState(0); + const [maxTypeSpeed, setMaxTypeSpeed] = useState(0); + const [praticeInformation, setPractiveInformation] = useState([]); + const title = useSelector(selectTitle); + + useEffect(() => { + dispatch(initState()); + }, []); + + useEffect(() => { + setPractiveInformation([ + { title: "진행도", figure: progressPecent, id: "noBorder" }, + { title: "현재 타수", figure: typeSpeed }, + { title: "최대 타수", figure: maxTypeSpeed }, + { title: "스크립트명", figure: title }, + ]); + }, [tick]); + + useInterval(() => { + setTypeSpeed(parseInt(typeCount / tick * 60) | 0); + setMaxTypeSpeed(Math.max(typeSpeed, maxTypeSpeed)); + setTick(tick + 0.1); + dispatch(updateTypeSpeed(typeSpeed)); + }, 100); + + return ( +
    + + <PracticeBox type = "script" information = {praticeInformation}/> + </div> + ); +} + +export default PracticeScript; \ No newline at end of file diff --git a/front/src/features/practices/scripts/PracticeScriptTask.js b/front/src/features/practices/scripts/PracticeScriptTask.js new file mode 100644 index 0000000..b558b56 --- /dev/null +++ b/front/src/features/practices/scripts/PracticeScriptTask.js @@ -0,0 +1,186 @@ +import React from "react"; +import { useCallback, useEffect, useState, useRef } from "react"; +import Sentence from "../sentences/Sentence"; +import useSound from "use-sound"; +import keySoundAsset from "../../../mechanicalKeyboard.mp3"; +import { KoreanInputMethod, inko } from "../../../helpers/KoreanInputMethod"; +import { useSelector, useDispatch } from "react-redux"; +import { + incrementProgressPercent, + incrementTypeCount, + selectWrongTyping, + selectTypeSpeed, + updateTitle, +} from "./scriptSlice"; +import { useHistory, useLocation } from 'react-router-dom'; +import axios from 'axios' + +function PracticeScriptTask() { + const dispatch = useDispatch(); + const [playKeyPress] = useSound(keySoundAsset, { + volume: 0.25, + interrupt: true, + }); + const step = useRef(0); + const history = useHistory(); + const [script, setScript] = useState([]); + const [language, setLanguage] = useState("english"); + const [userInput, setUserInput] = useState(""); + const [koreanBuffer, setKoreanBuffer] = useState(""); + const [finishedResult, setFinishedResult] = useState(""); + const [finishedInput, setFinishedInput] = useState(""); + const [currentResult, setCurrentResult] = useState(""); + const [currentInput, setCurrentInput] = useState(""); + const [inProgress, setInProgress] = useState(true); + const wrongTyping = useSelector(selectWrongTyping); + const typeSpeed = useSelector(selectTypeSpeed); + const location = useLocation(); + + const onKeyDown = useCallback( + (event) => { + if (inProgress) return; + var flag = false; + playKeyPress(); + if (event.code === "Space") event.preventDefault(); + if (event.code === "CapsLock") { + if (language === "korean") setKoreanBuffer(""); + setLanguage(language === "korean" ? "english" : "korean"); + return; + } + dispatch(incrementTypeCount()); + + if (event.code === "Enter" || userInput.length >= script[step.current].length) { + if (userInput.length < script[step.current].length) return; + setFinishedResult(script[step.current]); + setFinishedInput(userInput); + setUserInput(""); + setKoreanBuffer(""); + setCurrentInput(""); + setCurrentResult(script[step.current + 1]); + dispatch( + incrementProgressPercent(((step.current + 1) / script.length) * 100) + ); + flag = true; + step.current = step.current + 1; + return; + } + + if (language === "korean") { + setKoreanBuffer((buf) => { + const { nextUserInput, nextBuf } = KoreanInputMethod( + buf, + event, + userInput + ); + if (nextUserInput !== userInput) { + if (!flag) setUserInput(nextUserInput); + } + return nextBuf; + }); + return; + } + + setUserInput((body) => { + if (event.key === "Backspace") { + event.preventDefault(); // for firefox browser + return body.slice(0, -1); + } + + if (event.key === "Enter") { + return body.concat("\n"); + } + + if (event.key.length > 1) return body; + + return body.concat(event.key); + }); + }, + [playKeyPress, language, userInput, inProgress, script] + ); + + useEffect(() => { + setCurrentResult(script[step.current]); + const id = Number(location.pathname.split("=")[1]); + setInProgress(true); + axios({ + method: 'get', + url: `http://soongcom.kro.kr:3001/practice/script?id=${id}` + }) + .then(function(response){ + const {content, name} = response.data.script; + var sentences = []; + + if (content.indexOf("\n") < 0) { + for (var startIndex = 0;startIndex < content.length;startIndex += 80) + sentences.push(content.substr(startIndex, 80)); + } else sentences = content.split("\n"); + + setInProgress(false); + setScript(sentences); + dispatch(updateTitle(name)); + }); + }, []); + + useEffect(() => { + if(inProgress) return; + if (script.length > 0 && script.length <= step.current) { + if (Object.keys(wrongTyping).length != 0) { + axios + .post("http://soongcom.kro.kr:3001/practice/script/complete", { + wrongTyping: wrongTyping, + }) + .then(function (response) { + const { list } = response.data; + history.push({ + pathname: "/practice-result", + state: { typeSpeed: typeSpeed, scriptList: list }, + }); + }) + .catch(function (error) { + console.log(error); + }); + } + else { + history.push({ + pathname: "/practice-result", + state: { typeSpeed: typeSpeed }, + }); + } + setInProgress(true); + return; + } + setCurrentResult(script[step.current]); + setCurrentInput(userInput + inko.en2ko(koreanBuffer)); + }); + + useEffect(() => { + document.body.addEventListener("keydown", onKeyDown); + return () => { + document.body.removeEventListener("keydown", onKeyDown); + }; + }, [onKeyDown]); + + const sentences = script + .slice(step.current + 1, step.current + 5) + .map((item, index) => <Sentence sentence={item} key={index} />); + + return ( + <div className="sentence-task"> + <Sentence + type="finished-result" + sentence={finishedResult} + input={finishedInput} + /> + <Sentence type="finished-input" sentence={finishedInput} /> + <Sentence + type="current-result" + sentence={currentResult} + input={currentInput} + /> + <Sentence type="current-input" sentence={currentInput} /> + {sentences} + </div> + ); +} + +export default PracticeScriptTask; diff --git a/front/src/features/practices/scripts/scriptSlice.js b/front/src/features/practices/scripts/scriptSlice.js new file mode 100644 index 0000000..1695fc9 --- /dev/null +++ b/front/src/features/practices/scripts/scriptSlice.js @@ -0,0 +1,84 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const slice = createSlice({ + name: "script", + initialState: { + progressPecent: 0, + totalCharacters: 0, + currentCharacters: 0, + totalWrongCharacters: 0, + wrongCharacters: 0, + typeCount: 0, + typeSpeed: 0, + title: "", + wrongTyping: null, + }, + reducers: { + initState: (state) => { + state.progressPecent = 0; + state.totalCharacters = 0; + state.currentCharacters = 0; + state.totalWrongCharacters = 0; + state.wrongCharacters = 0; + state.typeCount = 0; + state.typeSpeed = 0; + state.title = "", + state.wrongTyping = {}; + }, + incrementProgressPercent: (state, action) => { + state.progressPecent = action.payload; + state.totalWrongCharacters += state.wrongCharacters; + state.wrongCharacters = 0; + state.totalCharacters += state.currentCharacters; + state.currentCharacters = 0; + }, + incrementWrongCharacters: (state, action) => { + state.wrongCharacters = action.payload; + }, + incrementCurrentCharacters: (state, action) => { + state.currentCharacters = action.payload; + }, + incrementTypeCount: (state) => { + state.typeCount += 1; + }, + addWrongTyping: (state, action) => { + const key = action.payload; + state.wrongTyping[key] = + state.wrongTyping[key] == undefined ? 1 : state.wrongTyping[key] + 1; + }, + updateTypeSpeed: (state, action) => { + state.typeSpeed = action.payload; + }, + updateTitle: (state, action) => { + state.title = action.payload; + }, + }, +}); +export const { + initState, + incrementProgressPercent, + incrementWrongCharacters, + incrementCurrentCharacters, + incrementTypeCount, + updateTypeSpeed, + addWrongTyping, + updateTitle +} = slice.actions; + +export const selectProgressPercent = (state) => + parseInt(state.script.progressPecent) + "%"; +export const selectAccuracyPercent = (state) => { + const accuracy = parseInt( + (((state.script.totalCharacters + state.script.currentCharacters) - + (state.script.totalWrongCharacters + state.script.wrongCharacters)) / + (state.script.totalCharacters+ state.script.currentCharacters)) * + 100 + ); + return accuracy ? accuracy + "%" : "100%"; +}; +export const selectTypeCount = (state) => state.script.typeCount; +export const selectTypeSpeed = (state) => state.script.typeSpeed; +export const selectWrongTyping = (state) => state.script.wrongTyping; +export const selectTitle = (state) => state.script.title; + +export default slice.reducer; \ No newline at end of file diff --git a/front/src/features/practices/sentences/PracticeSentence.js b/front/src/features/practices/sentences/PracticeSentence.js index 7a666a9..c5d9cfe 100644 --- a/front/src/features/practices/sentences/PracticeSentence.js +++ b/front/src/features/practices/sentences/PracticeSentence.js @@ -38,7 +38,7 @@ function PracticeSentence() { return ( <div className="content"> <Title title="문장연습" /> - <PracticeBox information = {praticeInformation}/> + <PracticeBox type = "sentence" information = {praticeInformation}/> </div> ); } diff --git a/front/src/features/practices/sentences/Sentence.js b/front/src/features/practices/sentences/Sentence.js index e5afc7b..af8b1aa 100644 --- a/front/src/features/practices/sentences/Sentence.js +++ b/front/src/features/practices/sentences/Sentence.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { useDispatch } from 'react-redux'; import { incrementWrongCharacters, incrementCurrentCharacters } from './sentenceSlice'; import Cursor from '../../../assets/cursor.gif'; +import { addWrongTyping } from '../scripts/scriptSlice'; Sentence.defaultProps = { type: 'sentence', @@ -10,7 +11,7 @@ Sentence.defaultProps = { }; function Sentence ({type, sentence, input}) { - var currentSentence, wrongCount = 0; + var currentSentence, wrongCount = 0, wrongTyping; const dispatch = useDispatch(); if (type == "current-result" || type == "finished-result") { @@ -23,6 +24,7 @@ function Sentence ({type, sentence, input}) { if (input[index] != sentence[index]) { answerStyle = "different"; wrongCount++; + wrongTyping = sentence[index]; } } else { if (input[index] != sentence[index]) { @@ -50,10 +52,14 @@ function Sentence ({type, sentence, input}) { useEffect(() => { if (type == "current-result") { + const regExp = /^[a-zA-Z]*$/; dispatch(incrementWrongCharacters(wrongCount)); dispatch(incrementCurrentCharacters(input.length)); + if(wrongTyping && regExp.test(wrongTyping)) + dispatch(addWrongTyping(wrongTyping)); } }); + return ( <div className={type}> {currentSentence} diff --git a/front/src/features/practices/words/index.js b/front/src/features/practices/words/index.js index 32ce3a7..89ed37e 100644 --- a/front/src/features/practices/words/index.js +++ b/front/src/features/practices/words/index.js @@ -25,6 +25,7 @@ import ProgressBar from "@ramonak/react-progress-bar"; import useSound from 'use-sound'; import keySoundAsset from '../../../mechanicalKeyboard.mp3'; import style from './index.module.scss'; +import '../../../sass/main.css'; function Header() { const dispatch = useDispatch(); @@ -137,7 +138,7 @@ function WordsPractice() { )); return ( - <div className="noselect"> + <div className="content2"> <Header /> <div className={style.BodyContainer}> <div className={style.Body}> diff --git a/front/src/features/scripts/AddScript.js b/front/src/features/scripts/AddScript.js index 993fca1..edb76aa 100644 --- a/front/src/features/scripts/AddScript.js +++ b/front/src/features/scripts/AddScript.js @@ -31,7 +31,7 @@ function AddScript() { } return ( - <div > + <div className="content"> <Title title = '스크립트 등록'/> <form id='script-add-form'> <p> diff --git a/front/src/features/scripts/ShowScript.js b/front/src/features/scripts/ShowScript.js index e0019a6..2b5f45e 100644 --- a/front/src/features/scripts/ShowScript.js +++ b/front/src/features/scripts/ShowScript.js @@ -2,6 +2,7 @@ import axios from 'axios'; import React, { useState } from 'react'; import Title from '../../components/Title'; import {useEffect} from "react" +import { Link } from "react-router-dom"; import '../../sass/main.css'; function ShowScript() { @@ -13,11 +14,7 @@ function ShowScript() { url: 'http://soongcom.kro.kr:3001/practice/list' }) .then(function(response){ - console.log(response.data.list); setPractices(response.data.list); - // for(let i = 0 ; i < response.data.list.length ; i++){ - // tempData[tempData.length] = response.data.list[i].name; - // } }); } @@ -26,27 +23,36 @@ function ShowScript() { }, []); return ( - <div> - <Title title = '스크립트 연습'/> + <div className="content"> + <Title title="스크립트 연습" /> <form className="ListForm"> <div className="TabSetting"> <div className="NavyTab"> - <button className="NavyButton" type="button">탐색</button> + <button className="NavyButton" type="button"> + 탐색 + </button> <div className="Line"></div> - <button className="NavyButton" type="button">인기</button> + <button className="NavyButton" type="button"> + 인기 + </button> </div> - <input className="SearchTab" - type="text" - placeholder="스크립트를 찾아보세요!"> - </input> + <input + className="SearchTab" + type="text" + placeholder="스크립트를 찾아보세요!" + ></input> </div> <div className="ListBody"> <ul className="ScriptList"> - { - practices.map((practice, idx) => ( - <li className="ScriptListItem" key={`PRACTICE_LI_${idx}_${practice.date}`}>{practice.name}</li> - )) - } + {practices.map((practice, idx) => ( + <Link + className="ScriptListItem" + to={`/practice-script/id=${practice.id}`} + key={`PRACTICE_LI_${idx}_${practice.date}`} + > + {practice.name} + </Link> + ))} </ul> </div> </form> diff --git a/front/src/sass/common/_practice.scss b/front/src/sass/common/_practice.scss index 9849ff9..dda2ff9 100644 --- a/front/src/sass/common/_practice.scss +++ b/front/src/sass/common/_practice.scss @@ -3,6 +3,7 @@ $Grey4: #BDBDBD; $Grey5: #E0E0E0; $Primary: #47A5C7; $PrimaryDark: #2B6D90; +$PrimaryLight: #7BC5C5; .content { position:absolute; @@ -14,6 +15,16 @@ $PrimaryDark: #2B6D90; align-items: center; } +.content2 { + position:absolute; + top: 100px; + width: 100%; + height: 70%; + // display: flex; + // flex-direction: column; + // align-items: center; +} + .practice-box { width: 70%; flex: 1; @@ -51,11 +62,25 @@ $PrimaryDark: #2B6D90; font-size: 16px; font-weight: 700; } + .name { + font-size: 14px; + font-weight: 700; + color:white; + margin-left: 10px; + } .progress-border { border: 2px solid $Grey5; border-radius: 2px; margin-right: 10px; } + .text-box { + margin-right: 10px; + margin-top: 4px; + background-color: $PrimaryLight; + border-radius: 16px; + padding-top: 2px; + padding-bottom: 2px; + } } .figure { flex:1; diff --git a/front/src/sass/common/_result.scss b/front/src/sass/common/_result.scss new file mode 100644 index 0000000..e69de29 diff --git a/front/src/sass/common/_script.scss b/front/src/sass/common/_script.scss index d2a9848..616b044 100644 --- a/front/src/sass/common/_script.scss +++ b/front/src/sass/common/_script.scss @@ -151,4 +151,4 @@ padding-left: 0px; color: #47A5C7; } -} +} \ No newline at end of file diff --git a/front/src/sass/main.css b/front/src/sass/main.css index 63f79ac..54fc15b 100644 --- a/front/src/sass/main.css +++ b/front/src/sass/main.css @@ -15,6 +15,13 @@ align-items: center; } +.content2 { + position: absolute; + top: 100px; + width: 100%; + height: 70%; +} + .practice-box { width: 70%; -webkit-box-flex: 1; @@ -75,12 +82,28 @@ font-weight: 700; } +.progress-box .left-content .name { + font-size: 14px; + font-weight: 700; + color: white; + margin-left: 10px; +} + .progress-box .left-content .progress-border { border: 2px solid #E0E0E0; border-radius: 2px; margin-right: 10px; } +.progress-box .left-content .text-box { + margin-right: 10px; + margin-top: 4px; + background-color: #7BC5C5; + border-radius: 16px; + padding-top: 2px; + padding-bottom: 2px; +} + .progress-box .figure { -webkit-box-flex: 1; -ms-flex: 1; diff --git a/front/src/sass/main.css.map b/front/src/sass/main.css.map index 86b27d0..306cc1f 100644 --- a/front/src/sass/main.css.map +++ b/front/src/sass/main.css.map @@ -1,10 +1,11 @@ { "version": 3, - "mappings": "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", + "mappings": "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", "sources": [ "main.scss", "common/_practice.scss", - "common/_script.scss" + "common/_script.scss", + "common/_result.scss" ], "names": [], "file": "main.css" diff --git a/front/src/sass/main.scss b/front/src/sass/main.scss index e021676..5149af4 100644 --- a/front/src/sass/main.scss +++ b/front/src/sass/main.scss @@ -1,2 +1,3 @@ @import 'common/practice'; -@import 'common/script'; \ No newline at end of file +@import 'common/script'; +@import 'common/result'; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/package.json @@ -0,0 +1 @@ +{}