From bdbb441a3de43f6b561907e7f54fb13ad4cac40c Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Sun, 30 Jul 2023 21:36:32 +0900 Subject: [PATCH 01/22] =?UTF-8?q?fix:=20lint=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 926756e..99df7f1 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -4,23 +4,24 @@ module.exports = { es2021: true, }, extends: [ - "standard-with-typescript", - "plugin:react/recommended", - "prettier", - "plugin:prettier/recommended", - "plugin:storybook/recommended", + 'standard-with-typescript', + 'plugin:react/recommended', + 'prettier', + 'plugin:prettier/recommended', + 'plugin:storybook/recommended', + 'eslint-config-prettier', ], parserOptions: { - ecmaVersion: "latest", - sourceType: "module", - project: "./tsconfig.json", + ecmaVersion: 'latest', + sourceType: 'module', + project: './tsconfig.json', }, - plugins: ["react", "@typescript-eslint"], + plugins: ['react', '@typescript-eslint'], rules: { - "react/react-in-jsx-scope": "off", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/triple-slash-reference": "off", - "@typescript-eslint/no-non-null-assertion": "off", + 'react/react-in-jsx-scope': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/triple-slash-reference': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', }, - ignorePatterns: [".eslintrc.cjs", "vite.config.ts"], + ignorePatterns: ['.eslintrc.cjs', 'vite.config.ts'], }; From 6be2277b3321fb9a7a1dbcc29390ae395410d8fa Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Sat, 5 Aug 2023 14:24:49 +0900 Subject: [PATCH 02/22] =?UTF-8?q?feat:=20=EC=B6=94=EC=96=B5=EC=9D=98=20?= =?UTF-8?q?=EC=A1=B0=EA=B0=81=20=EC=96=91=EC=8B=9D=EC=9D=84=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A0=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 2 +- src/App.tsx | 413 ++++++++++++++++++++++++++++++++++++- src/component/Click.css.ts | 72 +++++++ src/component/Click.tsx | 106 ++++++++++ src/index.css | 2 +- tsconfig.json | 2 +- tsconfig.node.json | 3 +- 7 files changed, 594 insertions(+), 6 deletions(-) create mode 100644 src/component/Click.css.ts create mode 100644 src/component/Click.tsx diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 99df7f1..870bd85 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -14,7 +14,7 @@ module.exports = { parserOptions: { ecmaVersion: 'latest', sourceType: 'module', - project: './tsconfig.json', + //project: './tsconfig.json', }, plugins: ['react', '@typescript-eslint'], rules: { diff --git a/src/App.tsx b/src/App.tsx index 2a73e54..fc386d1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,416 @@ import './App.css'; +import Click from './component/Click'; + +// App.tsx or App.js function App() { - return

hello, world!

; -} + const handleClick = () => { + console.log("CLICK") + window.location.href = 'https://www.google.com'; + }; + return ( +
+ +
+ 2022.11.23 + 버튼 +
+ 강원도에서의 겨울 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ + +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ + +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ + +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ + +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ + +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ + +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ + +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ 2023.07.23 + 버튼 +
+ 강원도에서의 여름 + + 국경의 긴 터널을 빠져나오자, 설국이었다. + 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. + 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. + 눈의 냉기가 흘러들었다. + 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" + 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
+ +
+ ); +} export default App; diff --git a/src/component/Click.css.ts b/src/component/Click.css.ts new file mode 100644 index 0000000..de6a5ce --- /dev/null +++ b/src/component/Click.css.ts @@ -0,0 +1,72 @@ +import { style } from '@vanilla-extract/css'; + +export const click = style({ + position: 'relative', + width: '100%', + height: '180px', + borderRadius: '4px', + boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)', + padding: '16px', + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + gap: '8px', + background: 'transparent', + zIndex: '100', +}); + +export const date = style({ + fontSize: '12px', + color: 'gray', + margin: 0, +}); + +export const heading = style({ + fontSize: '16px', + fontWeight: 'bold', + color: 'black', + margin: 0, +}); + +export const description = style({ + fontSize: '12px', + color: 'gray', + margin: 0, + overflow: 'hidden', + textAlign: 'left' +}); + +export const button = style({ + backgroundColor: 'transparent', + border: '1px solid #0070f3', + borderRadius: '4px', + color: '#0070f3', + cursor: 'pointer', + padding: '6px 12px', + textAlign: 'center', +}); + +export const image = style({ + width: '100%', + borderRadius: '4px', +}); + +export const cardImage = style({ + width: '100%', + borderRadius: '4px', +}); + +export const avatarImage = style({ + borderRadius: '50%', +}); + +export const backgroundImage = style({ + position: 'absolute', + width: '100%', + height: '100%', + top: '0', + left: '0', + opacity: '0.25' +}); + + diff --git a/src/component/Click.tsx b/src/component/Click.tsx new file mode 100644 index 0000000..d96d47d --- /dev/null +++ b/src/component/Click.tsx @@ -0,0 +1,106 @@ +import type { ReactNode } from 'react'; +import { createContext, useContext } from 'react'; +import { + click, + date, + heading, + button, + backgroundImage, + description, +} from './Click.css'; + +interface ClickContextProps { + onClick?: () => void; +} + +const ClickContext = createContext({}); + +function useClickContext(): ClickContextProps { + const context = useContext(ClickContext); + + if (!context.onClick) { + throw new Error( + 'Child components of Click cannot be rendered outside the Click component!' + ); + } + + return context; +} + +interface ChildrenProps { + children: ReactNode; +} + +interface ClickProps extends ChildrenProps { + onClick?: () => void; +} + +const Click = ({ children, onClick }: ClickProps) => { + return ( + +
+ {children} +
+
+ ); +}; + +interface DateProps extends ChildrenProps {} + +const Date = ({ children }: DateProps) => { + return

{children}

; +}; + +Click.Date = Date; + +interface HeadingProps extends ChildrenProps {} + +const Heading = ({ children }: HeadingProps) => { + return

{children}

; +}; + +Click.Heading = Heading; + +interface DescriptionProps extends ChildrenProps {} + +const Description = ({ children }: DescriptionProps) => { + return
{children}
; +}; + +Click.Description = Description; + +interface ButtonProps extends ChildrenProps {} + +const Button = ({ children }: ButtonProps) => { + const { onClick } = useClickContext(); + + return ( + + ); +}; + +Click.Button = Button; + +interface ImageProps { + src: string; + alt: string; + type?: string; +} + +const Image = ({ src, alt, type }: ImageProps) => { + useClickContext(); + + return ( + {alt} + ); +}; + +Click.Image = Image; + +export default Click; diff --git a/src/index.css b/src/index.css index 2c3fac6..12e77c9 100644 --- a/src/index.css +++ b/src/index.css @@ -5,7 +5,7 @@ color-scheme: light dark; color: rgba(255, 255, 255, 0.87); - background-color: #242424; + background-color: #dad7d7; font-synthesis: none; text-rendering: optimizeLegibility; diff --git a/tsconfig.json b/tsconfig.json index 376bd0b..b22b621 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,6 +20,6 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true }, - "include": ["src/**/*"], + "include": ["src/**/*.tsx", "src/**/*.ts",], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/tsconfig.node.json b/tsconfig.node.json index 3bd178a..bde2807 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -5,6 +5,7 @@ "skipLibCheck": true, "module": "ESNext", "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "allowImportingTsExtensions": false } } From 935d459ba5ec6579d148fae30ce1275b31ac4d7d Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Sun, 6 Aug 2023 20:31:59 +0900 Subject: [PATCH 03/22] =?UTF-8?q?fix:=20baseUrl=EC=9D=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/fetchApi.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/fetchApi.ts b/src/utils/fetchApi.ts index 4f6eb77..a64d357 100644 --- a/src/utils/fetchApi.ts +++ b/src/utils/fetchApi.ts @@ -1,7 +1,8 @@ -const baseURL = 'localhost:3000'; +const baseURL = 'http://localhost:3000' export async function fetchApi(url, options = {}) { - + // 토큰을 가져와서 헤더에 넣어주는 경우 고려 + // header에 Authorization: Bearer {token} 추가만 하면 됨 const defaultOptions = { method: 'GET', headers: { From deabee0a4333afe90389745ce33956e0cd65609a Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Sun, 6 Aug 2023 21:00:41 +0900 Subject: [PATCH 04/22] =?UTF-8?q?feat:=20=EC=A3=BC=EB=A7=88=EB=93=B1=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B3=B5=ED=86=B5=EB=90=9C=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=EC=9D=84=20=EB=B6=84=EB=A6=AC=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.tsx | 18 ++++++++++++++++-- src/pages/Kaleidoscope.tsx | 7 +++++++ src/pages/Layout.css.ts | 15 +++++++++++++++ src/pages/Layout.tsx | 14 ++++++++++++++ 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/pages/Kaleidoscope.tsx create mode 100644 src/pages/Layout.css.ts create mode 100644 src/pages/Layout.tsx diff --git a/src/main.tsx b/src/main.tsx index 2cc1f84..b0f16a4 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,24 @@ import ReactDOM from 'react-dom/client'; -import App from './App'; import './index.css'; import { StrictMode } from 'react'; +import { createBrowserRouter, RouterProvider } from 'react-router-dom'; +import Kaleidoscope from './pages/kaleidoscope'; +import Layout from './pages/Layout'; + +const router = createBrowserRouter([ + { + path: '/', + element: ( + + + + ), + }, +]); + ReactDOM.createRoot(document.getElementById('root')!).render( - + ); diff --git a/src/pages/Kaleidoscope.tsx b/src/pages/Kaleidoscope.tsx new file mode 100644 index 0000000..b08403d --- /dev/null +++ b/src/pages/Kaleidoscope.tsx @@ -0,0 +1,7 @@ +const Kaleidoscope = () => { + return ( +
kaleidoscope
+ ) +} + +export default Kaleidoscope \ No newline at end of file diff --git a/src/pages/Layout.css.ts b/src/pages/Layout.css.ts new file mode 100644 index 0000000..0daf9aa --- /dev/null +++ b/src/pages/Layout.css.ts @@ -0,0 +1,15 @@ +import { style } from "@vanilla-extract/css"; + +export const navBar = style({ + position: 'fixed', + bottom: 0, + left: 0, + width: '100%', + height: '56px', + backgroundColor: 'lightblue', + display: 'flex', + justifyContent: 'space-around', + alignItems: 'center', + padding: '10px', + zIndex: 100, +}); \ No newline at end of file diff --git a/src/pages/Layout.tsx b/src/pages/Layout.tsx new file mode 100644 index 0000000..13b4cb1 --- /dev/null +++ b/src/pages/Layout.tsx @@ -0,0 +1,14 @@ +import { navBar } from "./Layout.css"; + +const Layout = ({ children }) => { + return ( +
+ + {children} +
+ ); +}; + +export default Layout; \ No newline at end of file From 4839b7626d4b3212bc03b0c268242063685f4175 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Mon, 7 Aug 2023 10:29:12 +0900 Subject: [PATCH 05/22] =?UTF-8?q?feat:=20=EC=A3=BC=EB=A7=88=EB=93=B1=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=9D=98=20=EC=A0=9C=EB=AA=A9=20?= =?UTF-8?q?=EB=B0=8F=20=EC=83=81=EB=8B=A8=20=ED=83=9C=EA=B7=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=99=84=EC=84=B1=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.css | 35 +++++---------------- src/component/Select.css.ts | 43 ++++++++++++++++++++++++++ src/component/Select.tsx | 58 +++++++++++++++++++++++++++++++++++ src/index.css | 21 +++++-------- src/pages/Kaleidoscope.css.ts | 29 ++++++++++++++++++ src/pages/Kaleidoscope.tsx | 42 ++++++++++++++++++++++--- src/pages/Layout.css.ts | 2 +- src/pages/Layout.tsx | 10 ++++-- 8 files changed, 190 insertions(+), 50 deletions(-) create mode 100644 src/component/Select.css.ts create mode 100644 src/component/Select.tsx create mode 100644 src/pages/Kaleidoscope.css.ts diff --git a/src/App.css b/src/App.css index b9d355d..5c70994 100644 --- a/src/App.css +++ b/src/App.css @@ -1,36 +1,15 @@ #root { max-width: 1280px; - margin: 0 auto; - padding: 2rem; + box-sizing: border-box; text-align: center; + width: 100%; + height: 100%; } -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } +body { + font-family: 'Roboto', sans-serif; + width: 100vw; + margin: 0; } .card { diff --git a/src/component/Select.css.ts b/src/component/Select.css.ts new file mode 100644 index 0000000..ccb962a --- /dev/null +++ b/src/component/Select.css.ts @@ -0,0 +1,43 @@ +import { style } from '@vanilla-extract/css'; + +export const scrollableContainer = style({ + display: 'flex', + overflowX: 'auto', + height: '80px', + padding: '0px 12px', + zIndex: 1, + background: 'white', + '::-webkit-scrollbar': { + display: 'none', + }, +}); + +export const tagStyle = style({ + minWidth: '60px', + width: '60px', + padding: '5px 10px', + margin: '0 5px', + backgroundColor: 'white', + color: 'black', + fontSize: '14px', + fontWeight: 'bold', + textAlign: 'center', + borderRadius: '5px', + border: '1px solid #ccc', + cursor: 'pointer', +}); + +export const selectedTagStyle = style({ + backgroundColor: 'black', + color: 'white', + minWidth: '60px', + width: '60px', + padding: '5px 10px', + margin: '0 5px', + fontSize: '14px', + fontWeight: 'bold', + textAlign: 'center', + borderRadius: '5px', + border: '1px solid #ccc', + cursor: 'pointer', +}); diff --git a/src/component/Select.tsx b/src/component/Select.tsx new file mode 100644 index 0000000..940fce7 --- /dev/null +++ b/src/component/Select.tsx @@ -0,0 +1,58 @@ +import { ReactNode, createContext, useContext, useState } from 'react'; + +interface SelectContextProps { + selected: string; + setSelected: (value: string) => void; +} + +const SelectContext = createContext(null); + +interface SelectProps { + children: ReactNode; + defaultOption: string; + className?: string; +} + +const Select = ({ children, defaultOption, className }: SelectProps) => { + const [selected, setSelected] = useState(defaultOption); + + const contextValue: SelectContextProps = { + selected, + setSelected, + }; + + return ( + +
    {children}
+
+ ); +}; + +interface OptionProps { + value: string; + children: ReactNode; + className?: { selectedTagStyle: string; tagStyle: string }; +} + +const Option = ({ value, children, className }: OptionProps) => { + const context = useContext(SelectContext); + if (context === undefined) { + throw new Error('은 Select 아래에서만 사용 가능!!'); + } + + const { selected, setSelected } = context; + const { selectedTagStyle, tagStyle } = className; + + const isSelected = selected === value; + const optionClassName = `${isSelected ? selectedTagStyle : tagStyle}`; + + return ( +
  • setSelected(value)} className={`${optionClassName}`}> + {children} +
  • + ); +}; + +Select.Option = Option; + +export default Select; diff --git a/src/index.css b/src/index.css index 12e77c9..9a7755b 100644 --- a/src/index.css +++ b/src/index.css @@ -1,5 +1,4 @@ :root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; font-weight: 400; @@ -26,6 +25,7 @@ a:hover { body { margin: 0; display: flex; + width: 100vw; place-items: center; min-width: 320px; min-height: 100vh; @@ -36,6 +36,12 @@ h1 { line-height: 1.1; } +ul { + list-style: none; + padding: 0; + margin: 0; +} + button { border-radius: 8px; border: 1px solid transparent; @@ -54,16 +60,3 @@ button:focus, button:focus-visible { outline: 4px auto -webkit-focus-ring-color; } - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/src/pages/Kaleidoscope.css.ts b/src/pages/Kaleidoscope.css.ts new file mode 100644 index 0000000..f5bb1d9 --- /dev/null +++ b/src/pages/Kaleidoscope.css.ts @@ -0,0 +1,29 @@ +import { style } from '@vanilla-extract/css'; + +export const pageWrapper = style({ + display: 'flex', + flexDirection: 'column', + height: '100vh', + width: '100vw', + backgroundColor: 'white', +}); + +export const pageTitle = style({ + fontFamily: 'SF Pro Display', + fontSize: '24px', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + padding: '0 20px', +}); + +export const blurText = style({ + fontWeight: 'normal', + fontSize: '20px', + color: 'rgba(0, 0, 0, 0.6)', +}); + +export const boldText = style({ + fontWeight: 'bold', + fontSize: '26px', + color: 'black', +}); diff --git a/src/pages/Kaleidoscope.tsx b/src/pages/Kaleidoscope.tsx index b08403d..9a86ece 100644 --- a/src/pages/Kaleidoscope.tsx +++ b/src/pages/Kaleidoscope.tsx @@ -1,7 +1,41 @@ +import Select from '../component/Select'; +import { + scrollableContainer, + selectedTagStyle, + tagStyle, +} from '../component/Select.css'; +import { boldText, pageTitle, pageWrapper } from './Kaleidoscope.css'; + +const options = [ + { value: '전부', label: '전부' }, + { value: '추억', label: '추억' }, + { value: '후회', label: '후회' }, + { value: '혼자', label: '혼자' }, + { value: '같이', label: '같이' }, +]; + const Kaleidoscope = () => { return ( -
    kaleidoscope
    - ) -} + <> +
    +

    + 기억 +

    + + +
    + + ); +}; -export default Kaleidoscope \ No newline at end of file +export default Kaleidoscope; diff --git a/src/pages/Layout.css.ts b/src/pages/Layout.css.ts index 0daf9aa..b24a9b4 100644 --- a/src/pages/Layout.css.ts +++ b/src/pages/Layout.css.ts @@ -6,7 +6,7 @@ export const navBar = style({ left: 0, width: '100%', height: '56px', - backgroundColor: 'lightblue', + backgroundColor: '#9BACB4', display: 'flex', justifyContent: 'space-around', alignItems: 'center', diff --git a/src/pages/Layout.tsx b/src/pages/Layout.tsx index 13b4cb1..ea3e4a2 100644 --- a/src/pages/Layout.tsx +++ b/src/pages/Layout.tsx @@ -2,12 +2,16 @@ import { navBar } from "./Layout.css"; const Layout = ({ children }) => { return ( -
    + <> {children} -
    + ); }; From 15d5e7ea00679b6ef3751d240da43a5cbd178ea2 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Mon, 7 Aug 2023 10:46:10 +0900 Subject: [PATCH 06/22] =?UTF-8?q?refactor:=20=EC=83=81=EB=8B=A8=20?= =?UTF-8?q?=ED=83=AD=20css=EB=A5=BC=20=EC=88=98=EC=A0=95=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/component/Select.css.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/component/Select.css.ts b/src/component/Select.css.ts index ccb962a..cb33927 100644 --- a/src/component/Select.css.ts +++ b/src/component/Select.css.ts @@ -2,8 +2,9 @@ import { style } from '@vanilla-extract/css'; export const scrollableContainer = style({ display: 'flex', + justifyContent: 'stretch', overflowX: 'auto', - height: '80px', + height: '65px', padding: '0px 12px', zIndex: 1, background: 'white', @@ -13,6 +14,9 @@ export const scrollableContainer = style({ }); export const tagStyle = style({ + display: 'flex', + justifyContent: 'center', + alignItems: 'center', minWidth: '60px', width: '60px', padding: '5px 10px', @@ -28,6 +32,9 @@ export const tagStyle = style({ }); export const selectedTagStyle = style({ + display: 'flex', + justifyContent: 'center', + alignItems: 'center', backgroundColor: 'black', color: 'white', minWidth: '60px', From fa031b2eae90a6e3839eee9c58ebb6fbfdbee943 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Tue, 8 Aug 2023 00:05:47 +0900 Subject: [PATCH 07/22] =?UTF-8?q?feat:=20=EA=B0=81=EA=B0=81=EC=9D=98=20?= =?UTF-8?q?=EA=B8=B0=EC=96=B5=EA=B3=BC=20=EA=B8=B0=EC=96=B5=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=9D=98=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/component/{Click.css.ts => Card.css.ts} | 32 +++--- src/component/Card.tsx | 93 +++++++++++++++++ src/component/Click.tsx | 106 -------------------- src/pages/Kaleidoscope.css.ts | 13 +++ src/pages/Kaleidoscope.tsx | 34 ++++++- 5 files changed, 158 insertions(+), 120 deletions(-) rename src/component/{Click.css.ts => Card.css.ts} (67%) create mode 100644 src/component/Card.tsx delete mode 100644 src/component/Click.tsx diff --git a/src/component/Click.css.ts b/src/component/Card.css.ts similarity index 67% rename from src/component/Click.css.ts rename to src/component/Card.css.ts index de6a5ce..8e40c82 100644 --- a/src/component/Click.css.ts +++ b/src/component/Card.css.ts @@ -1,12 +1,12 @@ import { style } from '@vanilla-extract/css'; -export const click = style({ +export const card = style({ position: 'relative', - width: '100%', height: '180px', borderRadius: '4px', - boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)', + boxShadow: '0 4px 6px rgba(0, 0, 0, 0.2)', padding: '16px', + marginBottom: '8px', display: 'flex', flexDirection: 'column', alignItems: 'flex-start', @@ -33,16 +33,24 @@ export const description = style({ color: 'gray', margin: 0, overflow: 'hidden', - textAlign: 'left' + display: '-webkit-box', + WebkitLineClamp: 3, + WebkitBoxOrient: 'vertical', + textAlign: 'left', }); -export const button = style({ - backgroundColor: 'transparent', - border: '1px solid #0070f3', +export const category = style({ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + backgroundColor: 'black', + border: '1px solid #333a', borderRadius: '4px', - color: '#0070f3', - cursor: 'pointer', - padding: '6px 12px', + color: 'white', + width: '36px', + height: '24px', + fontSize: '12px', + padding: '0px', textAlign: 'center', }); @@ -66,7 +74,5 @@ export const backgroundImage = style({ height: '100%', top: '0', left: '0', - opacity: '0.25' + opacity: '0.25', }); - - diff --git a/src/component/Card.tsx b/src/component/Card.tsx new file mode 100644 index 0000000..b299020 --- /dev/null +++ b/src/component/Card.tsx @@ -0,0 +1,93 @@ +import type { ReactNode } from 'react'; +import { createContext, useContext } from 'react'; +import { + card, + date, + heading, + button, + backgroundImage, + description, + category, +} from './Card.css'; + +interface CardContextProps { + onClick?: () => void; +} + +const CardContext = createContext({}); + +function useCardContext(): CardContextProps { + const context = useContext(CardContext); + + if (!context.onClick) { + throw new Error( + 'Child components of Card cannot be rendered outside the Card component!' + ); + } + + return context; +} + +interface ChildrenProps { + children: ReactNode; +} + +interface CardProps extends ChildrenProps { + onClick?: () => void; +} + +const Card = ({ children, onClick }: CardProps) => { + return ( + +
    + {children} +
    +
    + ); +}; + +const Date = ({ children }: ChildrenProps) => { + return

    {children}

    ; +}; + +Card.Date = Date; + +const Heading = ({ children }: ChildrenProps) => { + return

    {children}

    ; +}; + +Card.Heading = Heading; + +const Description = ({ children }: ChildrenProps) => { + return
    {children}
    ; +}; + +Card.Description = Description; + +const Category = ({ children }: ChildrenProps) => { + return
    {children}
    ; +}; + +Card.Category = Category; + +interface ImageProps { + src: string; + alt: string; + type?: string; +} + +const Image = ({ src, alt, type }: ImageProps) => { + useCardContext(); + + return ( + {alt} + ); +}; + +Card.Image = Image; + +export default Card; diff --git a/src/component/Click.tsx b/src/component/Click.tsx deleted file mode 100644 index d96d47d..0000000 --- a/src/component/Click.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import type { ReactNode } from 'react'; -import { createContext, useContext } from 'react'; -import { - click, - date, - heading, - button, - backgroundImage, - description, -} from './Click.css'; - -interface ClickContextProps { - onClick?: () => void; -} - -const ClickContext = createContext({}); - -function useClickContext(): ClickContextProps { - const context = useContext(ClickContext); - - if (!context.onClick) { - throw new Error( - 'Child components of Click cannot be rendered outside the Click component!' - ); - } - - return context; -} - -interface ChildrenProps { - children: ReactNode; -} - -interface ClickProps extends ChildrenProps { - onClick?: () => void; -} - -const Click = ({ children, onClick }: ClickProps) => { - return ( - -
    - {children} -
    -
    - ); -}; - -interface DateProps extends ChildrenProps {} - -const Date = ({ children }: DateProps) => { - return

    {children}

    ; -}; - -Click.Date = Date; - -interface HeadingProps extends ChildrenProps {} - -const Heading = ({ children }: HeadingProps) => { - return

    {children}

    ; -}; - -Click.Heading = Heading; - -interface DescriptionProps extends ChildrenProps {} - -const Description = ({ children }: DescriptionProps) => { - return
    {children}
    ; -}; - -Click.Description = Description; - -interface ButtonProps extends ChildrenProps {} - -const Button = ({ children }: ButtonProps) => { - const { onClick } = useClickContext(); - - return ( - - ); -}; - -Click.Button = Button; - -interface ImageProps { - src: string; - alt: string; - type?: string; -} - -const Image = ({ src, alt, type }: ImageProps) => { - useClickContext(); - - return ( - {alt} - ); -}; - -Click.Image = Image; - -export default Click; diff --git a/src/pages/Kaleidoscope.css.ts b/src/pages/Kaleidoscope.css.ts index f5bb1d9..c45ac90 100644 --- a/src/pages/Kaleidoscope.css.ts +++ b/src/pages/Kaleidoscope.css.ts @@ -27,3 +27,16 @@ export const boldText = style({ fontSize: '26px', color: 'black', }); + +export const pageContent = style({ + display: 'flex', + flexDirection: 'column', + overflow: 'scroll', + padding: '16px', +}); + +export const cardHeader = style({ + display: 'flex', + width: '100%', + justifyContent: 'space-between', +}); diff --git a/src/pages/Kaleidoscope.tsx b/src/pages/Kaleidoscope.tsx index 9a86ece..24864eb 100644 --- a/src/pages/Kaleidoscope.tsx +++ b/src/pages/Kaleidoscope.tsx @@ -1,10 +1,17 @@ +import Card from '../component/Card'; import Select from '../component/Select'; import { scrollableContainer, selectedTagStyle, tagStyle, } from '../component/Select.css'; -import { boldText, pageTitle, pageWrapper } from './Kaleidoscope.css'; +import { + boldText, + cardHeader, + pageContent, + pageTitle, + pageWrapper, +} from './Kaleidoscope.css'; const options = [ { value: '전부', label: '전부' }, @@ -33,6 +40,31 @@ const Kaleidoscope = () => {
    ))} + +
    + {[1, 2, 3, 1, 2, 3].map((m) => ( + {}}> +
    + 2022.11.23 + 여행 +
    + 강원도에서의 겨울 + + 국경의 긴 터널을 빠져나오자, 설국이었다. 밤의 아랫쪽이 하얘졌다. + 신호소에 기차가 멈춰 섰다. 건너편 좌석의 여자가 일어서 + 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. 눈의 냉기가 + 흘러들었다. 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, + "역장니임, 역장니임ー" 등불을 들고 천천히 눈을 밟고 온 남자는 + 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. + + +
    + ))} +
    ); From 4b9bc6f31cdea99cdad05a2e482777a7c04ccb51 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:32:23 +0900 Subject: [PATCH 08/22] =?UTF-8?q?feat:=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=8C=EC=9D=BC=EC=9D=84=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 5 + mockServer/package.json | 10 + mockServer/yarn.lock | 424 ++++++++++++++++++++++++++++++++++ package.json | 8 +- src/App.css | 29 +-- src/App.tsx | 416 --------------------------------- src/assets/Calender.svg | 8 + src/assets/Place.svg | 3 + src/assets/Star.svg | 5 + src/index.css | 72 ++---- src/pages/Kaleidoscope.css.ts | 42 ---- src/pages/Kaleidoscope.tsx | 73 ------ src/vite-env.d.ts | 1 + tsconfig.json | 3 +- tsconfig.node.json | 6 +- vite.config.ts | 7 +- yarn.lock | 317 ++++++++++++++++++++++++- 17 files changed, 819 insertions(+), 610 deletions(-) create mode 100644 mockServer/package.json create mode 100644 mockServer/yarn.lock create mode 100644 src/assets/Calender.svg create mode 100644 src/assets/Place.svg create mode 100644 src/assets/Star.svg delete mode 100644 src/pages/Kaleidoscope.css.ts delete mode 100644 src/pages/Kaleidoscope.tsx diff --git a/index.html b/index.html index 96e1ec4..97194af 100644 --- a/index.html +++ b/index.html @@ -7,6 +7,11 @@
    + + diff --git a/mockServer/package.json b/mockServer/package.json new file mode 100644 index 0000000..c0aca09 --- /dev/null +++ b/mockServer/package.json @@ -0,0 +1,10 @@ +{ + "name": "mockserver", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.18.2" + } +} diff --git a/mockServer/yarn.lock b/mockServer/yarn.lock new file mode 100644 index 0000000..f6f8c4a --- /dev/null +++ b/mockServer/yarn.lock @@ -0,0 +1,424 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== diff --git a/package.json b/package.json index ceb5759..adaf4b3 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,12 @@ "build-storybook": "storybook build" }, "dependencies": { + "@react-google-maps/api": "^2.19.2", + "@tanstack/react-query": "^4.32.5", "@vanilla-extract/css": "^1.12.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-router-dom": "^6.14.2" }, "devDependencies": { "@storybook/addon-essentials": "^7.1.0", @@ -47,6 +50,7 @@ "prettier": "^3.0.0", "storybook": "^7.1.0", "typescript": "^5.1.6", - "vite": "^4.4.5" + "vite": "^4.4.5", + "vite-plugin-svgr": "^3.2.0" } } diff --git a/src/App.css b/src/App.css index 5c70994..d62b652 100644 --- a/src/App.css +++ b/src/App.css @@ -1,21 +1,24 @@ -#root { - max-width: 1280px; +/* 요소 기본 스타일 초기화 */ +* { + margin: 0; + padding: 0; box-sizing: border-box; - text-align: center; - width: 100%; - height: 100%; } +/* 브라우저 기본 스타일 초기화 */ +html, body { - font-family: 'Roboto', sans-serif; - width: 100vw; + height: 100%; + font-size: 16px; margin: 0; } -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; +body { + line-height: 1.5; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, + Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #333; + background-color: #fff; } diff --git a/src/App.tsx b/src/App.tsx index fc386d1..e69de29 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,416 +0,0 @@ -import './App.css'; -import Click from './component/Click'; - -// App.tsx or App.js - -function App() { - const handleClick = () => { - console.log("CLICK") - window.location.href = 'https://www.google.com'; - }; - return ( -
    - -
    - 2022.11.23 - 버튼 -
    - 강원도에서의 겨울 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - 2023.07.23 - 버튼 -
    - 강원도에서의 여름 - - 국경의 긴 터널을 빠져나오자, 설국이었다. - 밤의 아랫쪽이 하얘졌다. 신호소에 기차가 멈춰 섰다. - 건너편 좌석의 여자가 일어서 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. - 눈의 냉기가 흘러들었다. - 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" - 등불을 들고 천천히 눈을 밟고 온 남자는 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - -
    - ); -} -export default App; diff --git a/src/assets/Calender.svg b/src/assets/Calender.svg new file mode 100644 index 0000000..d424f8c --- /dev/null +++ b/src/assets/Calender.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/Place.svg b/src/assets/Place.svg new file mode 100644 index 0000000..d9f4ff3 --- /dev/null +++ b/src/assets/Place.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/Star.svg b/src/assets/Star.svg new file mode 100644 index 0000000..1b650a2 --- /dev/null +++ b/src/assets/Star.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/index.css b/src/index.css index 9a7755b..d62b652 100644 --- a/src/index.css +++ b/src/index.css @@ -1,62 +1,24 @@ -:root { - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #dad7d7; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { +/* 요소 기본 스타일 초기화 */ +* { margin: 0; - display: flex; - width: 100vw; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; + padding: 0; + box-sizing: border-box; } -ul { - list-style: none; - padding: 0; +/* 브라우저 기본 스타일 초기화 */ +html, +body { + height: 100%; + font-size: 16px; margin: 0; } -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; +body { + line-height: 1.5; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, + Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #333; + background-color: #fff; } diff --git a/src/pages/Kaleidoscope.css.ts b/src/pages/Kaleidoscope.css.ts deleted file mode 100644 index c45ac90..0000000 --- a/src/pages/Kaleidoscope.css.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -export const pageWrapper = style({ - display: 'flex', - flexDirection: 'column', - height: '100vh', - width: '100vw', - backgroundColor: 'white', -}); - -export const pageTitle = style({ - fontFamily: 'SF Pro Display', - fontSize: '24px', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - padding: '0 20px', -}); - -export const blurText = style({ - fontWeight: 'normal', - fontSize: '20px', - color: 'rgba(0, 0, 0, 0.6)', -}); - -export const boldText = style({ - fontWeight: 'bold', - fontSize: '26px', - color: 'black', -}); - -export const pageContent = style({ - display: 'flex', - flexDirection: 'column', - overflow: 'scroll', - padding: '16px', -}); - -export const cardHeader = style({ - display: 'flex', - width: '100%', - justifyContent: 'space-between', -}); diff --git a/src/pages/Kaleidoscope.tsx b/src/pages/Kaleidoscope.tsx deleted file mode 100644 index 24864eb..0000000 --- a/src/pages/Kaleidoscope.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import Card from '../component/Card'; -import Select from '../component/Select'; -import { - scrollableContainer, - selectedTagStyle, - tagStyle, -} from '../component/Select.css'; -import { - boldText, - cardHeader, - pageContent, - pageTitle, - pageWrapper, -} from './Kaleidoscope.css'; - -const options = [ - { value: '전부', label: '전부' }, - { value: '추억', label: '추억' }, - { value: '후회', label: '후회' }, - { value: '혼자', label: '혼자' }, - { value: '같이', label: '같이' }, -]; - -const Kaleidoscope = () => { - return ( - <> -
    -

    - 기억 -

    - - - -
    - {[1, 2, 3, 1, 2, 3].map((m) => ( - {}}> -
    - 2022.11.23 - 여행 -
    - 강원도에서의 겨울 - - 국경의 긴 터널을 빠져나오자, 설국이었다. 밤의 아랫쪽이 하얘졌다. - 신호소에 기차가 멈춰 섰다. 건너편 좌석의 여자가 일어서 - 다가오더니, 시마무라 앞의 유리창을 열어젖혔다. 눈의 냉기가 - 흘러들었다. 여자는 한껏 창 밖으로 몸을 내밀어 멀리 외치는 듯이, - "역장니임, 역장니임ー" 등불을 들고 천천히 눈을 밟고 온 남자는 - 목도리를 콧등까지 두르고, 귀에 모자의 모피를 드리우고 있었다. - - -
    - ))} -
    -
    - - ); -}; - -export default Kaleidoscope; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 11f02fe..b1f45c7 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1 +1,2 @@ /// +/// diff --git a/tsconfig.json b/tsconfig.json index b22b621..a010911 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ "lib": ["ES2020", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, + "types": ["vite-plugin-svgr/client"], /* Bundler mode */ "moduleResolution": "node", @@ -20,6 +21,6 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true }, - "include": ["src/**/*.tsx", "src/**/*.ts",], + "include": ["src/**/*.tsx", "src/**/*.ts"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/tsconfig.node.json b/tsconfig.node.json index bde2807..5a59017 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -5,7 +5,7 @@ "skipLibCheck": true, "module": "ESNext", "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "allowImportingTsExtensions": false - } + "allowSyntheticDefaultImports": true + }, + "include":["src/**/*"] } diff --git a/vite.config.ts b/vite.config.ts index 8dc6f09..cd07011 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,9 @@ import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; -import react from '@vitejs/plugin-react' +import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; +import svgr from 'vite-plugin-svgr'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react(), vanillaExtractPlugin()], -}) + plugins: [react(), vanillaExtractPlugin(), svgr()], +}); diff --git a/yarn.lock b/yarn.lock index 83e2da9..6d2115f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,6 +29,14 @@ dependencies: "@babel/highlight" "^7.22.5" +"@babel/code-frame@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" + integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== + dependencies: + "@babel/highlight" "^7.22.10" + chalk "^2.4.2" + "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" @@ -55,6 +63,27 @@ json5 "^2.2.2" semver "^6.3.1" +"@babel/core@^7.21.3": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.10.tgz#aad442c7bcd1582252cb4576747ace35bc122f35" + integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.10" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.10" + "@babel/parser" "^7.22.10" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.10" + "@babel/types" "^7.22.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.1" + "@babel/generator@^7.12.11", "@babel/generator@^7.22.0", "@babel/generator@^7.22.7", "@babel/generator@^7.22.9": version "7.22.9" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz" @@ -65,6 +94,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" + integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== + dependencies: + "@babel/types" "^7.22.10" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" @@ -79,6 +118,17 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-compilation-targets@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" + integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": version "7.22.9" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz" @@ -245,6 +295,15 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helpers@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.10.tgz#ae6005c539dfbcb5cd71fb51bfc8a52ba63bc37a" + integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.10" + "@babel/types" "^7.22.10" + "@babel/helpers@^7.22.6": version "7.22.6" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz" @@ -254,6 +313,15 @@ "@babel/traverse" "^7.22.6" "@babel/types" "^7.22.5" +"@babel/highlight@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" + integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/highlight@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" @@ -268,6 +336,11 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz" integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== +"@babel/parser@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" + integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz" @@ -1055,6 +1128,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.10.tgz#20252acb240e746d27c2e82b4484f199cf8141aa" + integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== + dependencies: + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.10" + "@babel/types" "^7.22.10" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.20.7", "@babel/types@^7.22.0", "@babel/types@^7.22.5", "@babel/types@^7.4.4": version "7.22.5" resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz" @@ -1064,6 +1153,15 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" +"@babel/types@^7.21.3", "@babel/types@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" + integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz" @@ -1351,6 +1449,21 @@ resolved "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz" integrity sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ== +"@googlemaps/js-api-loader@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@googlemaps/js-api-loader/-/js-api-loader-1.16.2.tgz#3fe748e21243f8e8322c677a5525c569ae9cdbe9" + integrity sha512-psGw5u0QM6humao48Hn4lrChOM2/rA43ZCm3tKK9qQsEj1/VzqkCqnvGfEOshDbBQflydfaRovbKwZMF4AyqbA== + dependencies: + fast-deep-equal "^3.1.3" + +"@googlemaps/markerclusterer@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@googlemaps/markerclusterer/-/markerclusterer-2.3.2.tgz#b311c26a0c0e8bb6325759ea690aef68c7150d8a" + integrity sha512-zb9OQP8XscZp2Npt1uQUYnGKu1miuq4DPP28JyDuFd6HV17HCEcjV9MtBi4muG/iVRXXvuHW9bRCnHbao9ITfw== + dependencies: + fast-deep-equal "^3.1.3" + supercluster "^8.0.1" + "@humanwhocodes/config-array@^0.11.10": version "0.11.10" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" @@ -1545,6 +1658,33 @@ picocolors "^1.0.0" tslib "^2.6.0" +"@react-google-maps/api@^2.19.2": + version "2.19.2" + resolved "https://registry.yarnpkg.com/@react-google-maps/api/-/api-2.19.2.tgz#678dc1871fbab72cd46d338eed687a36bf556ab1" + integrity sha512-Vt57XWzCKfsUjKOmFUl2erVVfOePkPK5OigF/f+q7UuV/Nm9KDDy1PMFBx+wNahEqOd6a32BxfsykEhBnbU9wQ== + dependencies: + "@googlemaps/js-api-loader" "1.16.2" + "@googlemaps/markerclusterer" "2.3.2" + "@react-google-maps/infobox" "2.19.2" + "@react-google-maps/marker-clusterer" "2.19.2" + "@types/google.maps" "3.53.5" + invariant "2.2.4" + +"@react-google-maps/infobox@2.19.2": + version "2.19.2" + resolved "https://registry.yarnpkg.com/@react-google-maps/infobox/-/infobox-2.19.2.tgz#b6bda962a4fa1074fdd3dfd63bc4c7d68b1dd745" + integrity sha512-6wvBqeJsQ/eFSvoxg+9VoncQvNoVCdmxzxRpLvmjPD+nNC6mHM0vJH1xSqaKijkMrfLJT0nfkTGpovrF896jwg== + +"@react-google-maps/marker-clusterer@2.19.2": + version "2.19.2" + resolved "https://registry.yarnpkg.com/@react-google-maps/marker-clusterer/-/marker-clusterer-2.19.2.tgz#24d9fb9aa555bb063ba5fe82f80fcd7d48662184" + integrity sha512-x9ibmsP0ZVqzyCo1Pitbw+4b6iEXRw/r1TCy3vOUR3eKrzWLnHYZMR325BkZW2r8fnuWE/V3Fp4QZOP9qYORCw== + +"@remix-run/router@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.7.2.tgz#cba1cf0a04bc04cb66027c51fa600e9cbc388bc8" + integrity sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A== + "@rollup/pluginutils@^5.0.2": version "5.0.2" resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz" @@ -2272,6 +2412,101 @@ "@types/express" "^4.7.0" file-system-cache "2.3.0" +"@svgr/babel-plugin-add-jsx-attribute@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-7.0.0.tgz#80856c1b7a3b7422d232f6e079f0beb90c4a13e9" + integrity sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q== + +"@svgr/babel-plugin-remove-jsx-attribute@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-7.0.0.tgz#91da77a009dc38e8d30da45d9b62ef8736f2d90a" + integrity sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-7.0.0.tgz#5154ff1213509e36ab315974c8c2fd48dafb827b" + integrity sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-7.0.0.tgz#7e72f44ee57fdbcb02fb0d4a7629466c5242725e" + integrity sha512-i6MaAqIZXDOJeikJuzocByBf8zO+meLwfQ/qMHIjCcvpnfvWf82PFvredEZElErB5glQFJa2KVKk8N2xV6tRRA== + +"@svgr/babel-plugin-svg-dynamic-title@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-7.0.0.tgz#8caf0449c678ea29be756b89960b2b16c9f33f00" + integrity sha512-BoVSh6ge3SLLpKC0pmmN9DFlqgFy4NxNgdZNLPNJWBUU7TQpDWeBuyVuDW88iXydb5Cv0ReC+ffa5h3VrKfk1w== + +"@svgr/babel-plugin-svg-em-dimensions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-7.0.0.tgz#4db6b5af6d29e93db236b1a013fa953754071d41" + integrity sha512-tNDcBa+hYn0gO+GkP/AuNKdVtMufVhU9fdzu+vUQsR18RIJ9RWe7h/pSBY338RO08wArntwbDk5WhQBmhf2PaA== + +"@svgr/babel-plugin-transform-react-native-svg@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-7.0.0.tgz#236995e58b5e36ff06365d5310509ce5391aeec9" + integrity sha512-qw54u8ljCJYL2KtBOjI5z7Nzg8LnSvQOP5hPKj77H4VQL4+HdKbAT5pnkkZLmHKYwzsIHSYKXxHouD8zZamCFQ== + +"@svgr/babel-plugin-transform-svg-component@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-7.0.0.tgz#a9b62730acf10d22a2aa57e0f701c0ecbc270430" + integrity sha512-CcFECkDj98daOg9jE3Bh3uyD9kzevCAnZ+UtzG6+BQG/jOQ2OA3jHnX6iG4G1MCJkUQFnUvEv33NvQfqrb/F3A== + +"@svgr/babel-preset@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-7.0.0.tgz#55aaca4cec2ff6515a571715b6b6fa98675b66d9" + integrity sha512-EX/NHeFa30j5UjldQGVQikuuQNHUdGmbh9kEpBKofGUtF0GUPJ4T4rhoYiqDAOmBOxojyot36JIFiDUHUK1ilQ== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^7.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^7.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^7.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^7.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "^7.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "^7.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "^7.0.0" + "@svgr/babel-plugin-transform-svg-component" "^7.0.0" + +"@svgr/core@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-7.0.0.tgz#def863d2670c682615583c80b408e83c095c2233" + integrity sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "^7.0.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + +"@svgr/hast-util-to-babel-ast@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-7.0.0.tgz#d457dfbe74ebc1e5a6daf97ded49e9576a3a00cf" + integrity sha512-42Ej9sDDEmsJKjrfQ1PHmiDiHagh/u9AHO9QWbeNx4KmD9yS5d1XHmXUNINfUcykAU+4431Cn+k6Vn5mWBYimQ== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/plugin-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-7.0.0.tgz#b9e0c7d05bc890d70163ac0490ba8c41f1afab90" + integrity sha512-SWlTpPQmBUtLKxXWgpv8syzqIU8XgFRvyhfkam2So8b3BE0OS0HPe5UfmlJ2KIC+a7dpuuYovPR2WAQuSyMoPw== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "^7.0.0" + "@svgr/hast-util-to-babel-ast" "^7.0.0" + svg-parser "^2.0.4" + +"@tanstack/query-core@4.32.5": + version "4.32.5" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.32.5.tgz#1c9da404ba4906c35b3998ba03ea4ab44019750c" + integrity sha512-UOxiDYmzYWD21ASIUnW3w+Nq3LcW1BPFFfIyZOor6UsRl76KGLlvUhJ402/dof1JxcQFPK7nZ5iUGPVqLiT8zg== + +"@tanstack/react-query@^4.32.5": + version "4.32.5" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.32.5.tgz#666abcf6cbeb8475e44f91a4279302f69b2f4ee9" + integrity sha512-4tR0GxyyKhLpYvbglOGpWVqHS+t3bs7yy89DuTgJvnKLnaS5UW2sbfAzlV9JtwL7s5Z8eW2q2EDMcAtutb0lAw== + dependencies: + "@tanstack/query-core" "4.32.5" + use-sync-external-store "^1.2.0" + "@testing-library/dom@^9.0.0": version "9.3.1" resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz" @@ -2419,6 +2654,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/google.maps@3.53.5": + version "3.53.5" + resolved "https://registry.yarnpkg.com/@types/google.maps/-/google.maps-3.53.5.tgz#0f3010ab4eabe46721f3604462196975b640aab9" + integrity sha512-HoRq4Te8J6krH7hj+TfdYepqegoKZCj3kkaK5gf+ySFSHLvyqYkDvkrtbcVJXQ6QBphQ0h1TF7p4J6sOh4r/zg== + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" @@ -3316,12 +3556,17 @@ camelcase@^5.3.1: resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-lite@^1.0.30001503: version "1.0.30001517" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz" integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3547,6 +3792,16 @@ core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig@^8.1.3: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -3836,6 +4091,11 @@ enhanced-resolve@^5.12.0: graceful-fs "^4.2.4" tapable "^2.2.0" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + envinfo@^7.7.3: version "7.10.0" resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz" @@ -5013,6 +5273,13 @@ internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" +invariant@2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + ip@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" @@ -5520,6 +5787,11 @@ jsonfile@^6.0.1: object.assign "^4.1.4" object.values "^1.1.6" +kdbush@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-4.0.2.tgz#2f7b7246328b4657dd122b6c7f025fbc2c868e39" + integrity sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA== + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" @@ -5607,7 +5879,7 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -6574,6 +6846,21 @@ react-refresh@^0.14.0: resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-router-dom@^6.14.2: + version "6.14.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.14.2.tgz#88f520118b91aa60233bd08dbd3fdcaea3a68488" + integrity sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg== + dependencies: + "@remix-run/router" "1.7.2" + react-router "6.14.2" + +react-router@6.14.2: + version "6.14.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.14.2.tgz#1f60994d8c369de7b8ba7a78d8f7ec23df76b300" + integrity sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ== + dependencies: + "@remix-run/router" "1.7.2" + react@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" @@ -7197,6 +7484,13 @@ strip-json-comments@^3.0.1, strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +supercluster@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-8.0.1.tgz#9946ba123538e9e9ab15de472531f604e7372df5" + integrity sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ== + dependencies: + kdbush "^4.0.2" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -7223,6 +7517,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + synchronous-promise@^2.0.15: version "2.0.17" resolved "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz" @@ -7623,6 +7922,11 @@ use-resize-observer@^9.1.0: dependencies: "@juggle/resize-observer" "^3.3.1" +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" @@ -7685,6 +7989,15 @@ vite-node@^0.28.5: source-map-support "^0.5.21" vite "^3.0.0 || ^4.0.0" +vite-plugin-svgr@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-3.2.0.tgz#920375aaf6635091c9ac8e467825f92d32544476" + integrity sha512-Uvq6niTvhqJU6ga78qLKBFJSDvxWhOnyfQSoKpDPMAGxJPo5S3+9hyjExE5YDj6Lpa4uaLkGc1cBgxXov+LjSw== + dependencies: + "@rollup/pluginutils" "^5.0.2" + "@svgr/core" "^7.0.0" + "@svgr/plugin-jsx" "^7.0.0" + "vite@^3.0.0 || ^4.0.0", vite@^4.4.5: version "4.4.6" resolved "https://registry.npmjs.org/vite/-/vite-4.4.6.tgz" From 9892f1aeacc977636d38e460adc39c13cd20c2c0 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:34:18 +0900 Subject: [PATCH 09/22] =?UTF-8?q?feat:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EB=9D=BC=EC=9A=B0=ED=84=B0=EB=A5=BC=20=EC=A0=81=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20tanstack=20query=EB=A5=BC=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.tsx | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index b0f16a4..373bdd7 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,24 +1,54 @@ import ReactDOM from 'react-dom/client'; import './index.css'; -import { StrictMode } from 'react'; +import { StrictMode, Suspense } from 'react'; import { createBrowserRouter, RouterProvider } from 'react-router-dom'; -import Kaleidoscope from './pages/kaleidoscope'; +import Kaleidoscope from './pages/Kaleidoscope/Kaleidoscope'; import Layout from './pages/Layout'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import Memory from './pages/Memory/Memory'; +import Main from './component/Main'; +import MemoryMap from './pages/Map/MemoryMap'; const router = createBrowserRouter([ { - path: '/', + path: '/kaleidoscope', element: ( ), }, + { + path: '/memory/:id', + element: ( + + loading...}> + + + + ), + }, + { + path: '/map', + element: ( + + + + ), + }, + { + path: '/main', + element:
    , + }, ]); +const queryClient = new QueryClient(); + ReactDOM.createRoot(document.getElementById('root')!).render( - + + + ); From 928db38ea05f40252830820e927102afec76b205 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:35:42 +0900 Subject: [PATCH 10/22] =?UTF-8?q?refactor:=20=EB=A9=94=EC=9D=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EB=A5=BC=20=EC=82=AD=EC=A0=9C=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index 373bdd7..859f4eb 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -7,7 +7,6 @@ import Kaleidoscope from './pages/Kaleidoscope/Kaleidoscope'; import Layout from './pages/Layout'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import Memory from './pages/Memory/Memory'; -import Main from './component/Main'; import MemoryMap from './pages/Map/MemoryMap'; const router = createBrowserRouter([ @@ -37,10 +36,6 @@ const router = createBrowserRouter([ ), }, - { - path: '/main', - element:
    , - }, ]); const queryClient = new QueryClient(); From 7ce05a8b6d55522eae25f249f6a9ae403ac78c39 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:36:11 +0900 Subject: [PATCH 11/22] =?UTF-8?q?feat:=20=EC=A3=BC=EB=A7=88=EB=93=B1=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=B9=B4=EB=93=9C=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EB=A5=BC=20=EA=B5=AC=ED=98=84=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/component/Card.css.ts | 36 ++++++++++++++++++++++++++++++++---- src/component/Card.tsx | 5 +++-- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/component/Card.css.ts b/src/component/Card.css.ts index 8e40c82..02e1c89 100644 --- a/src/component/Card.css.ts +++ b/src/component/Card.css.ts @@ -1,8 +1,8 @@ -import { style } from '@vanilla-extract/css'; +import { style, keyframes } from '@vanilla-extract/css'; export const card = style({ position: 'relative', - height: '180px', + height: '120px', borderRadius: '4px', boxShadow: '0 4px 6px rgba(0, 0, 0, 0.2)', padding: '16px', @@ -12,7 +12,7 @@ export const card = style({ alignItems: 'flex-start', gap: '8px', background: 'transparent', - zIndex: '100', + //zIndex: '100', }); export const date = style({ @@ -34,7 +34,7 @@ export const description = style({ margin: 0, overflow: 'hidden', display: '-webkit-box', - WebkitLineClamp: 3, + WebkitLineClamp: 1, WebkitBoxOrient: 'vertical', textAlign: 'left', }); @@ -76,3 +76,31 @@ export const backgroundImage = style({ left: '0', opacity: '0.25', }); + +const skeletonPulse = keyframes({ + '0%': { + backgroundColor: '#E0E0E0', + }, + '50%': { + backgroundColor: '#F0F0F0', + }, + '100%': { + backgroundColor: '#E0E0E0', + }, +}); + +const skeleton = style({ + backgroundColor: '#E0E0E0', + borderRadius: '4px', + animation: `${skeletonPulse} 1.5s ease-in-out infinite`, +}); + +export const skeletonDate = style([date, skeleton]); +export const skeletonCategory = style([category, skeleton]); +export const skeletonHeading = style([heading, skeleton, { height: '16px' }]); +export const skeletonDescription = style([ + description, + skeleton, + { height: '12px' }, +]); +export const skeletonImage = style([image, skeleton]); diff --git a/src/component/Card.tsx b/src/component/Card.tsx index b299020..0d1bd4e 100644 --- a/src/component/Card.tsx +++ b/src/component/Card.tsx @@ -4,7 +4,6 @@ import { card, date, heading, - button, backgroundImage, description, category, @@ -77,10 +76,12 @@ interface ImageProps { } const Image = ({ src, alt, type }: ImageProps) => { - useCardContext(); + const context = useCardContext(); + const { onClick } = context; return ( {alt} Date: Wed, 23 Aug 2023 18:36:47 +0900 Subject: [PATCH 12/22] =?UTF-8?q?feat:=20Tag=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=EB=A5=BC=20=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/component/Tag.css.ts | 6 ++++++ src/component/Tag.tsx | 11 +++++++++++ 2 files changed, 17 insertions(+) create mode 100644 src/component/Tag.css.ts create mode 100644 src/component/Tag.tsx diff --git a/src/component/Tag.css.ts b/src/component/Tag.css.ts new file mode 100644 index 0000000..fc0779a --- /dev/null +++ b/src/component/Tag.css.ts @@ -0,0 +1,6 @@ +import { style } from '@vanilla-extract/css'; + +export const tagStyle = style({ + display: 'inline-block', + fontSize: '8px', +}); diff --git a/src/component/Tag.tsx b/src/component/Tag.tsx new file mode 100644 index 0000000..392200a --- /dev/null +++ b/src/component/Tag.tsx @@ -0,0 +1,11 @@ +import { tagStyle } from './Tag.css'; + +const Tag = ({ color, children }) => { + return ( +
    + #{children} +
    + ); +}; + +export default Tag; From 9f54762c999e2948736fbbd24c10d89d92a343eb Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:37:30 +0900 Subject: [PATCH 13/22] =?UTF-8?q?feat:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=EC=9D=84=20=EC=9C=84=ED=95=9C=20=ED=9B=85?= =?UTF-8?q?=EC=9D=84=20=EB=B6=84=EB=A6=AC=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/usePageNavigate.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/hooks/usePageNavigate.ts diff --git a/src/hooks/usePageNavigate.ts b/src/hooks/usePageNavigate.ts new file mode 100644 index 0000000..68046ac --- /dev/null +++ b/src/hooks/usePageNavigate.ts @@ -0,0 +1,23 @@ +import { useNavigate } from 'react-router-dom'; + +export const usePageNavigate = () => { + const navigate = useNavigate(); + + const goToKaleidoscopePage = () => { + navigate(`/kaleidoscope`); + }; + + const goToMemoryPage = (memoryId) => { + navigate(`/memory/${memoryId}`); + }; + + const goToMemoryMapPage = () => { + navigate(`/map`); + }; + + return { + goToKaleidoscopePage, + goToMemoryPage, + goToMemoryMapPage, + }; +}; From 62a769b14f55dedc40292ee1fa03945e1d925a52 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:37:50 +0900 Subject: [PATCH 14/22] =?UTF-8?q?feat:=20=EB=AC=B4=ED=95=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A1=A4=EC=97=90=20=EC=82=AC=EC=9A=A9=ED=95=A0=20?= =?UTF-8?q?=ED=9B=85=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useIntersectionObserver.ts | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/hooks/useIntersectionObserver.ts diff --git a/src/hooks/useIntersectionObserver.ts b/src/hooks/useIntersectionObserver.ts new file mode 100644 index 0000000..0bd412a --- /dev/null +++ b/src/hooks/useIntersectionObserver.ts @@ -0,0 +1,40 @@ +import { useEffect, useState } from 'react'; +import { InfiniteQueryObserverResult } from '@tanstack/react-query'; + +interface useIntersectionObserverProps { + threshold?: number; + hasNextPage: boolean | undefined; + fetchNextPage: () => Promise; +} + +export function useIntersectionObserver({ + threshold = 0.1, + hasNextPage, + fetchNextPage, +}: useIntersectionObserverProps) { + //관찰 요소 => 스크롤 최하단 div요소에 setTarget을 ref로 넘겨줌 + const [target, setTarget] = useState(null); + + const observerCallback: IntersectionObserverCallback = (entries) => { + entries.forEach((entry) => { + //target 관찰 0 => 다음페이지 호출 + if (entry.isIntersecting && hasNextPage) { + fetchNextPage(); + } + }); + }; + + useEffect(() => { + if (!target) return; + + const observer = new IntersectionObserver(observerCallback, { + threshold, + }); + + observer.observe(target); + + return () => observer.unobserve(target); + }, [observerCallback, threshold, target]); + + return { setTarget }; +} From 595814dcf5b1dc6f149822f22976b9fc128e4d48 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:39:54 +0900 Subject: [PATCH 15/22] =?UTF-8?q?feat:=20=EC=A3=BC=EB=A7=88=EB=93=B1=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=ED=95=A0=20=ED=9B=85=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=9C?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Kaleidoscope/hooks/useInfiniteMemories.ts | 27 +++++++++++++++++++ src/pages/Kaleidoscope/hooks/useMemories.ts | 9 +++++++ src/types/memory.ts | 20 ++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/pages/Kaleidoscope/hooks/useInfiniteMemories.ts create mode 100644 src/pages/Kaleidoscope/hooks/useMemories.ts create mode 100644 src/types/memory.ts diff --git a/src/pages/Kaleidoscope/hooks/useInfiniteMemories.ts b/src/pages/Kaleidoscope/hooks/useInfiniteMemories.ts new file mode 100644 index 0000000..7e9f02d --- /dev/null +++ b/src/pages/Kaleidoscope/hooks/useInfiniteMemories.ts @@ -0,0 +1,27 @@ +import { + UseInfiniteQueryResult, + useInfiniteQuery, +} from '@tanstack/react-query'; +import { fetchApi } from '../../../utils/fetchApi'; +import { Memory } from '../../../types/memory'; +import { FilterOption } from '../../../constant/filterBar'; + +interface PageData { + data: Memory[]; + nextPage: number; +} + +export function useMemories( + filter: FilterOption +): UseInfiniteQueryResult { + return useInfiniteQuery( + ['memories', filter], + async ({ pageParam = 1 }) => { + const url = `/memories?page=${pageParam}&${filter}`; + return fetchApi(url); + }, + { + getNextPageParam: (lastPage) => lastPage.nextPage, + } + ); +} diff --git a/src/pages/Kaleidoscope/hooks/useMemories.ts b/src/pages/Kaleidoscope/hooks/useMemories.ts new file mode 100644 index 0000000..6e2bc2b --- /dev/null +++ b/src/pages/Kaleidoscope/hooks/useMemories.ts @@ -0,0 +1,9 @@ +import { memories } from '../../../hooks/queries/memories'; + +export function useMemories() { + return memories({ + options: { + suspense: true, + }, + }); +} diff --git a/src/types/memory.ts b/src/types/memory.ts new file mode 100644 index 0000000..938a0fe --- /dev/null +++ b/src/types/memory.ts @@ -0,0 +1,20 @@ +export interface Memory { + id: number; + title: string; + content: string; + category: string; + tags: Tag[]; + visitedAt: string; + star: number; + images: string[]; + location: { + latitude: number; + longitude: number; + }; +} + +export interface Tag { + id: number; + name: string; + color: string; +} From 886ff35b8afce0a035fe14612d5a0e1399fbc615 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:40:45 +0900 Subject: [PATCH 16/22] =?UTF-8?q?feat:=20=EA=B8=B0=EC=96=B5=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=9A=94=EC=B2=AD=ED=95=A0=20?= =?UTF-8?q?=ED=9B=85=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/queries/memory.ts | 13 +++++++++++++ src/pages/Memory/hooks/useMemory.ts | 11 +++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/hooks/queries/memory.ts create mode 100644 src/pages/Memory/hooks/useMemory.ts diff --git a/src/hooks/queries/memory.ts b/src/hooks/queries/memory.ts new file mode 100644 index 0000000..06cd4bb --- /dev/null +++ b/src/hooks/queries/memory.ts @@ -0,0 +1,13 @@ +import { useQuery } from '@tanstack/react-query'; +import { fetchApi } from '../../utils/fetchApi'; + +export function memory(memoryId: string, { options = {} } = {}) { + return useQuery( + ['memory', memoryId], + () => { + const url = `/memory/${memoryId}`; // url의 id 부분을 변수로 변경 + return fetchApi(url); + }, + { ...options } + ); +} diff --git a/src/pages/Memory/hooks/useMemory.ts b/src/pages/Memory/hooks/useMemory.ts new file mode 100644 index 0000000..e1e6b27 --- /dev/null +++ b/src/pages/Memory/hooks/useMemory.ts @@ -0,0 +1,11 @@ +import { UseQueryResult } from '@tanstack/react-query'; +import { memory } from '../../../hooks/queries/memory'; +import { Memory } from '../../../types/memory'; + +export function useMemory(id: string): UseQueryResult { + return memory(id, { + options: { + suspense: true, + }, + }); +} From de3c4914a96c8faa61229aaeb4a0bee36ee99d13 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:41:11 +0900 Subject: [PATCH 17/22] =?UTF-8?q?feat:=20=EB=AA=A8=EB=8B=AC=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A5=BC=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/component/Modal.css.ts | 86 ++++++++++++++++++++++++++++++++++++++ src/component/Modal.tsx | 64 ++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 src/component/Modal.css.ts create mode 100644 src/component/Modal.tsx diff --git a/src/component/Modal.css.ts b/src/component/Modal.css.ts new file mode 100644 index 0000000..c497b6c --- /dev/null +++ b/src/component/Modal.css.ts @@ -0,0 +1,86 @@ +import { style } from '@vanilla-extract/css'; + +export const modal = style({ + display: 'none', + position: 'fixed', + margin: 'auto', + zIndex: 1, + width: '100%', + height: '100%', + overflow: 'auto', + backgroundColor: 'rgba(0, 0, 0, 0.4)', +}); + +export const openedModal = style({ + display: 'flex', + flexDirection: 'column', + position: 'fixed', + width: '100%', + height: '100%', + backgroundColor: 'rgba(0, 0, 0, 0.4)', +}); + +export const modalContent = style({ + position: 'relative', + margin: 'auto 0px', + backgroundColor: '#fefefe', + border: '1px solid #888', + borderRadius: '4px', +}); + +export const modalHeader = style({ + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + backgroundColor: '#f1f1f1', + padding: '10px', + borderBottom: '1px solid #ccc', + fontWeight: 'bold', +}); + +export const modalHeaderButton = style({ + background: 'transparent', + border: 'none', + fontSize: '1.5em', + fontWeight: 'bold', + cursor: 'pointer', +}); + +export const modalBody = style({ + position: 'relative', + display: 'flex', + flexDirection: 'column', +}); + +export const modalFooter = style({ + display: 'flex', + justifyContent: 'flex-end', + alignItems: 'center', + backgroundColor: '#f1f1f1', + padding: '10px', + borderTop: '1px solid #ccc', +}); + +export const modalFooterButton = style({ + backgroundColor: '#44336', + border: 'none', + color: 'white', + fontWeight: 'bold', + textAlign: 'center', + textDecoration: 'none', + display: 'inline-block', + fontSize: '14px', + margin: '4px 2px', + cursor: 'pointer', + padding: '10px 20px', + borderRadius: '4px', +}); + +export const dimmed = style({ + position: 'fixed', + top: '0', + left: '0', + width: '100%', + height: '100%', + background: 'rgba(0, 0, 0, 0.5)', +}); diff --git a/src/component/Modal.tsx b/src/component/Modal.tsx new file mode 100644 index 0000000..32ebadf --- /dev/null +++ b/src/component/Modal.tsx @@ -0,0 +1,64 @@ +import { createContext, useContext, ReactNode } from 'react'; +import { + dimmed, + modal, + modalBody, + modalFooter, + modalHeader, + openedModal, +} from './Modal.css'; + +type ModalContextType = { + isOpened: boolean; + closeModal: () => void; +}; + +const ModalContext = createContext({ + isOpened: false, + closeModal: () => {}, +}); + +const Modal = ({ children, closeModal, isOpened }) => { + return ( + +
    +
    {children}
    +
    +
    + ); +}; + +type ModalComponentProps = { + children: ReactNode; +}; + +Modal.Dimmed = () => { + const { closeModal } = useContext(ModalContext); + return
    ; +}; + +Modal.Header = ({ children }: ModalComponentProps) => { + const { closeModal } = useContext(ModalContext); + return ( +
    + {children} + +
    + ); +}; + +Modal.Body = ({ children }: ModalComponentProps) => { + return
    {children}
    ; +}; + +Modal.Footer = ({ children }: ModalComponentProps) => { + const { closeModal } = useContext(ModalContext); + return ( +
    + {children} + +
    + ); +}; + +export default Modal; From 0466abc693b85bbc5dd9caa2fe2865959f282b85 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:41:40 +0900 Subject: [PATCH 18/22] =?UTF-8?q?feat:=20=EC=A3=BC=EB=A7=88=EB=93=B1=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=83=81=EB=8B=A8=20=EB=B0=94?= =?UTF-8?q?=EB=A5=BC=20=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/component/Select.css.ts | 5 ++++- src/component/Select.tsx | 21 ++++++++++++++++----- src/constant/filterBar.ts | 9 +++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 src/constant/filterBar.ts diff --git a/src/component/Select.css.ts b/src/component/Select.css.ts index cb33927..91e1299 100644 --- a/src/component/Select.css.ts +++ b/src/component/Select.css.ts @@ -3,11 +3,14 @@ import { style } from '@vanilla-extract/css'; export const scrollableContainer = style({ display: 'flex', justifyContent: 'stretch', + width: '100%', overflowX: 'auto', - height: '65px', + height: '32px', padding: '0px 12px', zIndex: 1, background: 'white', + position: 'sticky', + top: '0', '::-webkit-scrollbar': { display: 'none', }, diff --git a/src/component/Select.tsx b/src/component/Select.tsx index 940fce7..fdc2096 100644 --- a/src/component/Select.tsx +++ b/src/component/Select.tsx @@ -2,7 +2,7 @@ import { ReactNode, createContext, useContext, useState } from 'react'; interface SelectContextProps { selected: string; - setSelected: (value: string) => void; + onSelect: (value: string) => void; } const SelectContext = createContext(null); @@ -10,15 +10,26 @@ const SelectContext = createContext(null); interface SelectProps { children: ReactNode; defaultOption: string; + onChange: (value: string) => void; className?: string; } -const Select = ({ children, defaultOption, className }: SelectProps) => { +const Select = ({ + children, + defaultOption, + onChange, + className, +}: SelectProps) => { const [selected, setSelected] = useState(defaultOption); + const handleChange = (value) => { + setSelected(value); + if (onChange) onChange(value); + }; + const contextValue: SelectContextProps = { selected, - setSelected, + onSelect: handleChange, }; return ( @@ -40,14 +51,14 @@ const Option = ({ value, children, className }: OptionProps) => { throw new Error('은 Select 아래에서만 사용 가능!!'); } - const { selected, setSelected } = context; + const { selected, onSelect } = context; const { selectedTagStyle, tagStyle } = className; const isSelected = selected === value; const optionClassName = `${isSelected ? selectedTagStyle : tagStyle}`; return ( -
  • setSelected(value)} className={`${optionClassName}`}> +
  • onSelect(value)} className={`${optionClassName}`}> {children}
  • ); diff --git a/src/constant/filterBar.ts b/src/constant/filterBar.ts new file mode 100644 index 0000000..06e01c8 --- /dev/null +++ b/src/constant/filterBar.ts @@ -0,0 +1,9 @@ +export const options = [ + { value: '', label: '전부' }, + { value: 'min=3', label: '추억' }, + { value: 'min=1&max=3', label: '후회' }, + { value: '혼자', label: '혼자' }, + { value: '같이', label: '같이' }, +] as const; + +export type FilterOption = (typeof options)[number]['label']; From f726ae78446c611a67cbc9dd7169116f42c49658 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:42:24 +0900 Subject: [PATCH 19/22] =?UTF-8?q?feat:=20=EC=A3=BC=EB=A7=88=EB=93=B1=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A5=BC=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Kaleidoscope/Kaleidoscope.css.ts | 51 ++++++++++++++++ src/pages/Kaleidoscope/Kaleidoscope.tsx | 70 ++++++++++++++++++++++ src/pages/Kaleidoscope/MemoriesList.tsx | 53 ++++++++++++++++ src/pages/Layout.css.ts | 7 +-- src/pages/Layout.tsx | 26 ++++---- 5 files changed, 193 insertions(+), 14 deletions(-) create mode 100644 src/pages/Kaleidoscope/Kaleidoscope.css.ts create mode 100644 src/pages/Kaleidoscope/Kaleidoscope.tsx create mode 100644 src/pages/Kaleidoscope/MemoriesList.tsx diff --git a/src/pages/Kaleidoscope/Kaleidoscope.css.ts b/src/pages/Kaleidoscope/Kaleidoscope.css.ts new file mode 100644 index 0000000..9d2ff0a --- /dev/null +++ b/src/pages/Kaleidoscope/Kaleidoscope.css.ts @@ -0,0 +1,51 @@ +import { style } from '@vanilla-extract/css'; + +export const pageWrapper = style({ + marginTop: '16px', + display: 'flex', + flexDirection: 'column', + overflowY: 'scroll', + height: '100%', + backgroundColor: 'white', +}); + +export const MemoryPageWrapper = style({ + marginTop: '16px', + display: 'flex', + flexDirection: 'column', + backgroundColor: 'white', +}); + +export const pageTitle = style({ + fontFamily: 'SF Pro Display', + fontSize: '24px', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + padding: '0 20px', +}); + +export const blurText = style({ + fontWeight: 'normal', + fontSize: '20px', + color: 'rgba(0, 0, 0, 0.6)', +}); + +export const boldText = style({ + fontWeight: 'bold', + fontSize: '26px', + color: 'black', +}); + +export const pageContent = style({ + height: '100%', + display: 'flex', + flexDirection: 'column', + overflow: 'scroll', + padding: '16px', +}); + +export const cardHeader = style({ + display: 'flex', + width: '100%', + justifyContent: 'space-between', +}); diff --git a/src/pages/Kaleidoscope/Kaleidoscope.tsx b/src/pages/Kaleidoscope/Kaleidoscope.tsx new file mode 100644 index 0000000..e849468 --- /dev/null +++ b/src/pages/Kaleidoscope/Kaleidoscope.tsx @@ -0,0 +1,70 @@ +import { Suspense, useState } from 'react'; +import Select from '../../component/Select'; +import { + scrollableContainer, + selectedTagStyle, + tagStyle, +} from '../../component/Select.css'; +import { + boldText, + pageContent, + pageTitle, + pageWrapper, +} from './Kaleidoscope.css'; +import MemoryList from './MemoriesList'; +import { FilterOption, options } from '../../constant/filterBar'; + +const Kaleidoscope = () => { + const [selectedOption, setSelectedOption] = useState('전부'); + + const handleSelectChange = (value: FilterOption) => { + setSelectedOption(value); + }; + + return ( + <> +
    +

    + 주마등 +

    + + +
    + }> + + +
    +
    + + ); +}; + +export default Kaleidoscope; + +const TmpLoader = () => { + return ( +
    + 로딩중... +
    + ); +}; diff --git a/src/pages/Kaleidoscope/MemoriesList.tsx b/src/pages/Kaleidoscope/MemoriesList.tsx new file mode 100644 index 0000000..52caf5a --- /dev/null +++ b/src/pages/Kaleidoscope/MemoriesList.tsx @@ -0,0 +1,53 @@ +import { cardHeader } from './Kaleidoscope.css'; +import Card from '../../component/Card'; +import { useMemories } from './hooks/useInfiniteMemories'; +import { useIntersectionObserver } from '../../hooks/useIntersectionObserver'; +import { Fragment } from 'react'; +import { usePageNavigate } from '../../hooks/usePageNavigate'; +import { FilterOption } from '../../constant/filterBar'; + +type MemoryListProps = { + selectedOption: FilterOption; +}; + +const MemoryList = ({ selectedOption }: MemoryListProps) => { + console.log(selectedOption); + const { data, fetchNextPage, hasNextPage } = useMemories(selectedOption); + const { goToMemoryPage } = usePageNavigate(); + const { setTarget } = useIntersectionObserver({ + hasNextPage, + fetchNextPage, + }); + + return ( + <> + {data?.pages.map((page, pageIndex) => ( + + {page.data.map((memory) => ( + { + goToMemoryPage(memory.id); + }} + > +
    + {memory.visitedAt} + {memory.category} +
    + {memory.title} + {memory.content} + +
    + ))} +
    + ))} +
    + + ); +}; + +export default MemoryList; diff --git a/src/pages/Layout.css.ts b/src/pages/Layout.css.ts index b24a9b4..3abb9b4 100644 --- a/src/pages/Layout.css.ts +++ b/src/pages/Layout.css.ts @@ -1,7 +1,7 @@ -import { style } from "@vanilla-extract/css"; +import { style } from '@vanilla-extract/css'; export const navBar = style({ - position: 'fixed', + position: 'sticky', bottom: 0, left: 0, width: '100%', @@ -10,6 +10,5 @@ export const navBar = style({ display: 'flex', justifyContent: 'space-around', alignItems: 'center', - padding: '10px', zIndex: 100, -}); \ No newline at end of file +}); diff --git a/src/pages/Layout.tsx b/src/pages/Layout.tsx index ea3e4a2..5118337 100644 --- a/src/pages/Layout.tsx +++ b/src/pages/Layout.tsx @@ -1,18 +1,24 @@ -import { navBar } from "./Layout.css"; +import { usePageNavigate } from '../hooks/usePageNavigate'; +import { navBar } from './Layout.css'; const Layout = ({ children }) => { + const { goToKaleidoscopePage, goToMemoryMapPage } = usePageNavigate(); return ( <> - - {children} +
    + {children} + +
    ); }; -export default Layout; \ No newline at end of file +export default Layout; From 0e207d9b8a4f5581238de2a2f33d90b424bf6425 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:42:48 +0900 Subject: [PATCH 20/22] =?UTF-8?q?feat:=20=EA=B8=B0=EC=96=B5=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EB=A5=BC=20=EA=B5=AC=ED=98=84=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/component/Map.tsx | 63 +++++++++++++++ src/pages/Memory/Memory.css.ts | 50 ++++++++++++ src/pages/Memory/Memory.tsx | 137 +++++++++++++++++++++++++++++++++ 3 files changed, 250 insertions(+) create mode 100644 src/component/Map.tsx create mode 100644 src/pages/Memory/Memory.css.ts create mode 100644 src/pages/Memory/Memory.tsx diff --git a/src/component/Map.tsx b/src/component/Map.tsx new file mode 100644 index 0000000..e3798d9 --- /dev/null +++ b/src/component/Map.tsx @@ -0,0 +1,63 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import { GoogleMap, Marker, useJsApiLoader } from '@react-google-maps/api'; + +const containerStyle = { + minWidth: '100%', + minHeight: '40vh', + height: '100%', +}; + +function Map({ center }) { + const { isLoaded } = useJsApiLoader({ + id: 'google-map-script', + googleMapsApiKey: 'AIzaSyBgdt7wA-iBp5bQ8oW-SL-1cYIthSUFvrA', + }); + + const [map, setMap] = useState(null); + + const onLoad = useCallback(function callback(map) { + // const marker = new window.google.maps.Marker({ + // position: center, + // map, + // title: 'Hello World!', + // optimized: true, + // }); + // const infoWindow = new window.google.maps.InfoWindow({ + // content: 'Hello World!', + // }); + // infoWindow.open({ + // anchor: marker, + // map, + // }); + // marker.setMap(map); + // setMap(map); + }, []); + + const onUnmount = useCallback(function callback(map) { + setMap(null); + }, []); + + useEffect(() => { + if (map) { + map.panTo(center); + map.setZoom(14); + } + }, [map, center]); + + return isLoaded ? ( + + {/* Child components, such as markers, info windows, etc. */} + + + ) : ( + <> + ); +} + +export default React.memo(Map); diff --git a/src/pages/Memory/Memory.css.ts b/src/pages/Memory/Memory.css.ts new file mode 100644 index 0000000..982d2c6 --- /dev/null +++ b/src/pages/Memory/Memory.css.ts @@ -0,0 +1,50 @@ +import { style } from '@vanilla-extract/css'; + +export const wrapper = style({ + height: '100%', + display: 'flex', + flexDirection: 'column', + backgroundColor: 'white', + overflow: 'scroll', +}); + +export const imageWrapper = style({ + height: '50%', + position: 'relative', + padding: '16px', +}); + +export const image = style({ + width: '100%', + height: '100%', + borderRadius: '8px', + objectFit: 'fill', + imageResolution: 'from-image', +}); + +export const contentWrapper = style({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-between', + padding: '16px', +}); + +export const description = style({ + color: 'black', + textAlign: 'left', + fontSize: '14px', + lineHeight: '1.5', + overflow: 'hidden', + display: '-webkit-box', + WebkitLineClamp: 4, +}); + +export const categoryTag = style({ + fontSize: '12px', + fontWeight: 'bold', + borderRadius: '4px', + padding: '2px 4px', + backgroundColor: 'black', + color: 'white', + margin: 0, +}); diff --git a/src/pages/Memory/Memory.tsx b/src/pages/Memory/Memory.tsx new file mode 100644 index 0000000..29e923d --- /dev/null +++ b/src/pages/Memory/Memory.tsx @@ -0,0 +1,137 @@ +import { Fragment, useState } from 'react'; +import { date, heading } from '../../component/Card.css'; +import Map from '../../component/Map'; +import { + MemoryPageWrapper, + boldText, + pageTitle, +} from '../Kaleidoscope/Kaleidoscope.css'; +import { + categoryTag, + contentWrapper, + description, + image, + imageWrapper, + wrapper, +} from './Memory.css'; +import Modal from '../../component/Modal'; +import { useMemory } from './hooks/useMemory'; +import { useParams } from 'react-router-dom'; +import { modalContent } from '../../component/Modal.css'; +import Tag from '../../component/Tag'; +import { ReactComponent as Star } from '../../assets/star.svg'; +import { ReactComponent as Calender } from '../../assets/calender.svg'; +import { ReactComponent as Place } from '../../assets/place.svg'; +const Memory = () => { + const { id } = useParams(); + const { data } = useMemory(id); + + const [isOpened, setIsOpened] = useState(false); + + const openModal = () => { + setIsOpened(true); + }; + + const closeModal = () => { + setIsOpened(false); + }; + + const memoryLocation = { + lat: data.location.latitude, + lng: data.location.longitude, + }; + + return ( + <> +
    +

    + 기억 +

    +
    +
    +
    + +

    {data.visitedAt}

    +
    +
    + +

    + 장소 +

    +
    +
    + +
    +
    + random +
    +
    +
    +

    {data.title}

    +

    {data.category}

    +
    + +

    {data.content}

    +
    +
    + {data.tags.map((tag) => ( + + {tag.name} + + ))} +
    + +
    +
    + +

    {data.star} ratings

    +
    +
    +
    +
    + + + +
    + 장소 + + + + 모달 푸터 영역입니다. +
    +
    +
    + + ); +}; + +export default Memory; From 9e549015b185727f3621d7226f907414c7c50384 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:43:07 +0900 Subject: [PATCH 21/22] =?UTF-8?q?feat:=20=EC=A7=80=EB=8F=84=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EB=A5=BC=20=EA=B5=AC=ED=98=84=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Map/MemoryMap.tsx | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/pages/Map/MemoryMap.tsx diff --git a/src/pages/Map/MemoryMap.tsx b/src/pages/Map/MemoryMap.tsx new file mode 100644 index 0000000..5874d9d --- /dev/null +++ b/src/pages/Map/MemoryMap.tsx @@ -0,0 +1,28 @@ +import Map from '../../component/Map'; +import { + boldText, + pageTitle, + pageWrapper, +} from '../Kaleidoscope/Kaleidoscope.css'; + +const MemoryMap = () => { + const center = { + lat: 37.5665, + lng: 126.978, + }; + + return ( + <> +
    +

    + 지도 +

    +
    + +
    +
    + + ); +}; + +export default MemoryMap; From c1b647dffb879f5567e99b079e84b84abe04d998 Mon Sep 17 00:00:00 2001 From: afds4567 <33995840+afds4567@users.noreply.github.com> Date: Wed, 23 Aug 2023 18:43:18 +0900 Subject: [PATCH 22/22] =?UTF-8?q?feat:=20=EC=9E=84=EC=8B=9C=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=EB=A5=BC=20=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mockServer/mockData.js | 669 ++++++++++++++++++++++++++++++++++ mockServer/server.ts | 73 ++++ src/constant/path.ts | 4 + src/hooks/queries/memories.ts | 13 + 4 files changed, 759 insertions(+) create mode 100644 mockServer/mockData.js create mode 100644 mockServer/server.ts create mode 100644 src/constant/path.ts create mode 100644 src/hooks/queries/memories.ts diff --git a/mockServer/mockData.js b/mockServer/mockData.js new file mode 100644 index 0000000..b272f24 --- /dev/null +++ b/mockServer/mockData.js @@ -0,0 +1,669 @@ +const mockData = { + memories: [ + { + id: '1', + title: '(추억)얌샘김밥 갔다온 건에 대하여..', + category: '여행', + tags: [ + { + id: 1, + name: '분식', + color: 'red', + }, + ], + visitedAt: '2023-07-14', + content: + '봄은 동틀 무렵. 산 능선이 점점 하얗게 변하면서 조금씩 밝아지고, 그 위로 보랏빛 구름이 가늘게 떠 있는 풍경이 멋있다. 여름은 밤. 달이 뜨면 더할 나위 없이 좋고, 칠흑같이 어두운 밤에도 반딧불이가 반짝반짝 여기저기에서 날아다니는 광경이 근사하다. 반딧불이가 한 마리나 두 마리 희미하게 빛을 내며 지나가는 것도 운치 있다. 비 오는 밤도 좋다. ', + star: 5, + images: [ + 'https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8Mnx8fGVufDB8fHx8fA%3D%3D&w=1000&q=80', + ], + location: { + latitude: 37.5741, + longitude: 126.9768, + }, + }, + { + id: '2', + title: '(후회)1얌샘김밥 갔다온 건에 대하여2..', + category: '음식점', + tags: [ + { + id: 1, + name: '분식', + color: 'blue', + }, + ], + visitedAt: '2023-07-14', + content: + '최고의 시간이었고, 최악의 시간이었다. 지혜의 시대였고, 어리석음의 시대였다. 믿음의 세기였고, 불신의 세기였다. 빛의 계절이었고, 어둠의 계절이었다. 희망의 봄이었고, 절망의 겨울이었다. 우리 앞에 모든 것이 있었고, 우리 앞에 아무것도 없었다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1444723121867-7a241cacace9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2940&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '3', + title: '(추억)마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'yellow', + }, + ], + visitedAt: '2023-07-15', + content: + '그래서 우리는 계속 앞으로 나아가는 것이다. 흐름을 거슬러가는 조각배처럼, 끊임없이 과거로 떠밀려가면서도.', + star: 4, + images: [ + 'https://images.unsplash.com/photo-1514565131-fce0801e5785?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2156&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '4', + title: '(후회)마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + content: + ' 겨울은 새벽녘. 눈이 내리면 더없이 좋고, 서리가 하얗게 내린 것도 멋있다. 아주 추운 날 급하게 피운 숯을 들고 지나가는 모습은 그 나름대로 겨울에 어울리는 풍경이다. 이때 숯을 뜨겁게 피우지 않으면 화로 속이 금방 흰 재로 변해 버려 좋지 않다', + star: 2, + images: [ + 'https://images.unsplash.com/photo-1444084316824-dc26d6657664?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2070&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '5', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + content: + '가을은 해 질 녘. 석양이 비추고 산봉우리가 가깝게 보일 때 까마귀가 둥지를 향해 세 마리나 네 마리, 아니면 두 마리씩 떼 지어 날아가는 모습에 가슴이 뭉클해진다. 기러기가 줄지어 저 멀리로 날아가는 광경은 한층 더 정취 있다. 해가 진 후 바람 소리나 벌레 소리가 들려오는 것도 기분 좋다.', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1540959733332-eab4deabeeaf?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2094&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + + { + id: '6', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: ['a1s2d3f4g5.png'], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '7', + title: '얌샘김밥 갔다온 건에 대하여5..', + category: '여행', + tags: [ + { + id: 1, + name: '분식', + color: '000FFF', + }, + ], + visitedAt: '2023-07-14', + content: + '봄은 동틀 무렵. 산 능선이 점점 하얗게 변하면서 조금씩 밝아지고, 그 위로 보랏빛 구름이 가늘게 떠 있는 풍경이 멋있다. 여름은 밤. 달이 뜨면 더할 나위 없이 좋고, 칠흑같이 어두운 밤에도 반딧불이가 반짝반짝 여기저기에서 날아다니는 광경이 근사하다. 반딧불이가 한 마리나 두 마리 희미하게 빛을 내며 지나가는 것도 운치 있다. 비 오는 밤도 좋다. 가을은 해 질 녘. 석양이 비추고 산봉우리가 가깝게 보일 때 까마귀가 둥지를 향해 세 마리나 네 마리, 아니면 두 마리씩 떼 지어 날아가는 모습에 가슴이 뭉클해진다. 기러기가 줄지어 저 멀리로 날아가는 광경은 한층 더 정취 있다. 해가 진 후 바람 소리나 벌레 소리가 들려오는 것도 기분 좋다. 겨울은 새벽녘. 눈이 내리면 더없이 좋고, 서리가 하얗게 내린 것도 멋있다. 아주 추운 날 급하게 피운 숯을 들고 지나가는 모습은 그 나름대로 겨울에 어울리는 풍경이다. 이때 숯을 뜨겁게 피우지 않으면 화로 속이 금방 흰 재로 변해 버려 좋지 않다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8Mnx8fGVufDB8fHx8fA%3D%3D&w=1000&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '8', + title: '얌샘김밥 갔다온 건에 대하여6..', + category: '음식점', + tags: [ + { + id: 1, + name: '분식', + color: '000FFF', + }, + ], + visitedAt: '2023-07-14', + content: + '최고의 시간이었고, 최악의 시간이었다. 지혜의 시대였고, 어리석음의 시대였다. 믿음의 세기였고, 불신의 세기였다. 빛의 계절이었고, 어둠의 계절이었다. 희망의 봄이었고, 절망의 겨울이었다. 우리 앞에 모든 것이 있었고, 우리 앞에 아무것도 없었다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1444723121867-7a241cacace9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2940&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '9', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + content: + '그래서 우리는 계속 앞으로 나아가는 것이다. 흐름을 거슬러가는 조각배처럼, 끊임없이 과거로 떠밀려가면서도.', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1514565131-fce0801e5785?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2156&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '10', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1444084316824-dc26d6657664?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2070&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '11', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1540959733332-eab4deabeeaf?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2094&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + + { + id: '12', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: ['a1s2d3f4g5.png'], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '13', + title: '얌샘김밥 갔다온 건에 대하여..', + category: '여행', + tags: [ + { + id: 1, + name: '분식', + color: '000FFF', + }, + ], + visitedAt: '2023-07-14', + content: + '봄은 동틀 무렵. 산 능선이 점점 하얗게 변하면서 조금씩 밝아지고, 그 위로 보랏빛 구름이 가늘게 떠 있는 풍경이 멋있다. 여름은 밤. 달이 뜨면 더할 나위 없이 좋고, 칠흑같이 어두운 밤에도 반딧불이가 반짝반짝 여기저기에서 날아다니는 광경이 근사하다. 반딧불이가 한 마리나 두 마리 희미하게 빛을 내며 지나가는 것도 운치 있다. 비 오는 밤도 좋다. 가을은 해 질 녘. 석양이 비추고 산봉우리가 가깝게 보일 때 까마귀가 둥지를 향해 세 마리나 네 마리, 아니면 두 마리씩 떼 지어 날아가는 모습에 가슴이 뭉클해진다. 기러기가 줄지어 저 멀리로 날아가는 광경은 한층 더 정취 있다. 해가 진 후 바람 소리나 벌레 소리가 들려오는 것도 기분 좋다. 겨울은 새벽녘. 눈이 내리면 더없이 좋고, 서리가 하얗게 내린 것도 멋있다. 아주 추운 날 급하게 피운 숯을 들고 지나가는 모습은 그 나름대로 겨울에 어울리는 풍경이다. 이때 숯을 뜨겁게 피우지 않으면 화로 속이 금방 흰 재로 변해 버려 좋지 않다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8Mnx8fGVufDB8fHx8fA%3D%3D&w=1000&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '14', + title: '얌샘김밥 갔다온 건에 대하여2..', + category: '음식점', + tags: [ + { + id: 1, + name: '분식', + color: '000FFF', + }, + ], + visitedAt: '2023-07-14', + content: + '최고의 시간이었고, 최악의 시간이었다. 지혜의 시대였고, 어리석음의 시대였다. 믿음의 세기였고, 불신의 세기였다. 빛의 계절이었고, 어둠의 계절이었다. 희망의 봄이었고, 절망의 겨울이었다. 우리 앞에 모든 것이 있었고, 우리 앞에 아무것도 없었다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1444723121867-7a241cacace9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2940&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '15', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + content: + '그래서 우리는 계속 앞으로 나아가는 것이다. 흐름을 거슬러가는 조각배처럼, 끊임없이 과거로 떠밀려가면서도.', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1514565131-fce0801e5785?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2156&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '16', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1444084316824-dc26d6657664?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2070&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '17', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1540959733332-eab4deabeeaf?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2094&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + + { + id: '18', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: ['a1s2d3f4g5.png'], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '19', + title: '얌샘김밥 갔다온 건에 대하여12..', + category: '여행', + tags: [ + { + id: 1, + name: '분식', + color: '000FFF', + }, + ], + visitedAt: '2023-07-14', + content: + '봄은 동틀 무렵. 산 능선이 점점 하얗게 변하면서 조금씩 밝아지고, 그 위로 보랏빛 구름이 가늘게 떠 있는 풍경이 멋있다. 여름은 밤. 달이 뜨면 더할 나위 없이 좋고, 칠흑같이 어두운 밤에도 반딧불이가 반짝반짝 여기저기에서 날아다니는 광경이 근사하다. 반딧불이가 한 마리나 두 마리 희미하게 빛을 내며 지나가는 것도 운치 있다. 비 오는 밤도 좋다. 가을은 해 질 녘. 석양이 비추고 산봉우리가 가깝게 보일 때 까마귀가 둥지를 향해 세 마리나 네 마리, 아니면 두 마리씩 떼 지어 날아가는 모습에 가슴이 뭉클해진다. 기러기가 줄지어 저 멀리로 날아가는 광경은 한층 더 정취 있다. 해가 진 후 바람 소리나 벌레 소리가 들려오는 것도 기분 좋다. 겨울은 새벽녘. 눈이 내리면 더없이 좋고, 서리가 하얗게 내린 것도 멋있다. 아주 추운 날 급하게 피운 숯을 들고 지나가는 모습은 그 나름대로 겨울에 어울리는 풍경이다. 이때 숯을 뜨겁게 피우지 않으면 화로 속이 금방 흰 재로 변해 버려 좋지 않다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8Mnx8fGVufDB8fHx8fA%3D%3D&w=1000&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '20', + title: '얌샘김밥 갔다온 건에 대하여..', + category: '여행', + tags: [ + { + id: 1, + name: '분식', + color: '000FFF', + }, + ], + visitedAt: '2023-07-14', + content: + '봄은 동틀 무렵. 산 능선이 점점 하얗게 변하면서 조금씩 밝아지고, 그 위로 보랏빛 구름이 가늘게 떠 있는 풍경이 멋있다. 여름은 밤. 달이 뜨면 더할 나위 없이 좋고, 칠흑같이 어두운 밤에도 반딧불이가 반짝반짝 여기저기에서 날아다니는 광경이 근사하다. 반딧불이가 한 마리나 두 마리 희미하게 빛을 내며 지나가는 것도 운치 있다. 비 오는 밤도 좋다. 가을은 해 질 녘. 석양이 비추고 산봉우리가 가깝게 보일 때 까마귀가 둥지를 향해 세 마리나 네 마리, 아니면 두 마리씩 떼 지어 날아가는 모습에 가슴이 뭉클해진다. 기러기가 줄지어 저 멀리로 날아가는 광경은 한층 더 정취 있다. 해가 진 후 바람 소리나 벌레 소리가 들려오는 것도 기분 좋다. 겨울은 새벽녘. 눈이 내리면 더없이 좋고, 서리가 하얗게 내린 것도 멋있다. 아주 추운 날 급하게 피운 숯을 들고 지나가는 모습은 그 나름대로 겨울에 어울리는 풍경이다. 이때 숯을 뜨겁게 피우지 않으면 화로 속이 금방 흰 재로 변해 버려 좋지 않다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8Mnx8fGVufDB8fHx8fA%3D%3D&w=1000&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '21', + title: '얌샘김밥 갔다온 건에 대하여2..', + category: '음식점', + tags: [ + { + id: 1, + name: '분식', + color: '000FFF', + }, + ], + visitedAt: '2023-07-14', + content: + '최고의 시간이었고, 최악의 시간이었다. 지혜의 시대였고, 어리석음의 시대였다. 믿음의 세기였고, 불신의 세기였다. 빛의 계절이었고, 어둠의 계절이었다. 희망의 봄이었고, 절망의 겨울이었다. 우리 앞에 모든 것이 있었고, 우리 앞에 아무것도 없었다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1444723121867-7a241cacace9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2940&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '22', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + content: + '그래서 우리는 계속 앞으로 나아가는 것이다. 흐름을 거슬러가는 조각배처럼, 끊임없이 과거로 떠밀려가면서도.', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1514565131-fce0801e5785?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2156&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '23', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1444084316824-dc26d6657664?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2070&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '24', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1540959733332-eab4deabeeaf?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2094&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + + { + id: '25', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: ['a1s2d3f4g5.png'], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '26', + title: '얌샘김밥 갔다온 건에 대하여5..', + category: '여행', + tags: [ + { + id: 1, + name: '분식', + color: '000FFF', + }, + ], + visitedAt: '2023-07-14', + content: + '봄은 동틀 무렵. 산 능선이 점점 하얗게 변하면서 조금씩 밝아지고, 그 위로 보랏빛 구름이 가늘게 떠 있는 풍경이 멋있다. 여름은 밤. 달이 뜨면 더할 나위 없이 좋고, 칠흑같이 어두운 밤에도 반딧불이가 반짝반짝 여기저기에서 날아다니는 광경이 근사하다. 반딧불이가 한 마리나 두 마리 희미하게 빛을 내며 지나가는 것도 운치 있다. 비 오는 밤도 좋다. 가을은 해 질 녘. 석양이 비추고 산봉우리가 가깝게 보일 때 까마귀가 둥지를 향해 세 마리나 네 마리, 아니면 두 마리씩 떼 지어 날아가는 모습에 가슴이 뭉클해진다. 기러기가 줄지어 저 멀리로 날아가는 광경은 한층 더 정취 있다. 해가 진 후 바람 소리나 벌레 소리가 들려오는 것도 기분 좋다. 겨울은 새벽녘. 눈이 내리면 더없이 좋고, 서리가 하얗게 내린 것도 멋있다. 아주 추운 날 급하게 피운 숯을 들고 지나가는 모습은 그 나름대로 겨울에 어울리는 풍경이다. 이때 숯을 뜨겁게 피우지 않으면 화로 속이 금방 흰 재로 변해 버려 좋지 않다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8Mnx8fGVufDB8fHx8fA%3D%3D&w=1000&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '27', + title: '얌샘김밥 갔다온 건에 대하여6..', + category: '음식점', + tags: [ + { + id: 1, + name: '분식', + color: '000FFF', + }, + ], + visitedAt: '2023-07-14', + content: + '최고의 시간이었고, 최악의 시간이었다. 지혜의 시대였고, 어리석음의 시대였다. 믿음의 세기였고, 불신의 세기였다. 빛의 계절이었고, 어둠의 계절이었다. 희망의 봄이었고, 절망의 겨울이었다. 우리 앞에 모든 것이 있었고, 우리 앞에 아무것도 없었다', + star: 1, + images: [ + 'https://images.unsplash.com/photo-1444723121867-7a241cacace9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2940&q=80', + ], + location: { + latitude: 132.32, + longitude: 82.2123, + }, + }, + { + id: '28', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + content: + '그래서 우리는 계속 앞으로 나아가는 것이다. 흐름을 거슬러가는 조각배처럼, 끊임없이 과거로 떠밀려가면서도.', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1514565131-fce0801e5785?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2156&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '29', + title: '마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1444084316824-dc26d6657664?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2070&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + { + id: '30', + title: '마지막 마카롱 카페에서 휴식', + category: '카페', + tags: [ + { + id: 2, + name: '디저트', + color: 'FF00FF', + }, + ], + visitedAt: '2023-07-15', + star: 3, + images: [ + 'https://images.unsplash.com/photo-1540959733332-eab4deabeeaf?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2094&q=80', + ], + location: { + latitude: 132.43, + longitude: 82.102, + }, + }, + ], + pageSize: 10, +}; + +module.exports = mockData; diff --git a/mockServer/server.ts b/mockServer/server.ts new file mode 100644 index 0000000..54e31b5 --- /dev/null +++ b/mockServer/server.ts @@ -0,0 +1,73 @@ +const mockData = require('./mockData'); + +const express = require('express'); +const app = express(); +const cors = require('cors'); + +const PORT = 3000; // 포트 번호를 원하는 숫자로 변경 가능 + +// 데이터를 저장할 배열 (임시로 메모리에 저장) +app.use(cors()); +// Parse incoming JSON data +app.use(express.json()); + +// 새로운 메모리 추가 +app.post('/memories', (req, res) => { + const newMemory = req.body; + mockData.push(newMemory); + res.status(201).json({ message: 'Memory added successfully' }); +}); + +// 모든 메모리 조회 +app.get('/memories', (req, res) => { + const { page = 1 } = req.query; + // params로 'memories?min=1&max=3&category=cafe&page=0&size=10'와 같이 전달된 쿼리스트링을 받아올 수 있음 + const { min, max, category, size } = req.query; + + const pageSize = 10; // 페이지당 항목 수 + const startIndex = (page - 1) * pageSize; + const endIndex = startIndex + pageSize; + + // 전체 데이터 배열 + const allMemories = mockData.memories; + + // 현재 페이지에 해당하는 데이터 추출 + const paginatedMemories = allMemories + .filter((memory) => { + if (min && max) { + return memory.star >= min && memory.star <= max; + } + if (min) { + return memory.star >= min; + } + if (category) { + return memory.category === category; + } + return true; + }) + .slice(startIndex, endIndex); + + // 전체 페이지 수 계산 + const totalPages = Math.ceil(allMemories.length / pageSize); + + // 응답 데이터 구성 + const response = { + data: paginatedMemories, + nextPage: page < totalPages ? parseInt(page) + 1 : null, + totalPages, + }; + + res.status(200).json(response); +}); + +// 특정 메모리 조회 +app.get('/memory/:id', (req, res) => { + const { id } = req.params; + const memory = mockData.memories.find((memory) => memory.id === id); + res.status(200).json(memory); +}); + +// 서버 시작 +app.listen(PORT, () => { + console.log(`Server is running on port ${PORT}`); +}); diff --git a/src/constant/path.ts b/src/constant/path.ts new file mode 100644 index 0000000..2775a93 --- /dev/null +++ b/src/constant/path.ts @@ -0,0 +1,4 @@ +export const NAVIGATE_PATH = { + kaleidoscopePage: `/kaleidoscope`, + memoryPage: `/memory`, +} as const; diff --git a/src/hooks/queries/memories.ts b/src/hooks/queries/memories.ts new file mode 100644 index 0000000..c977a29 --- /dev/null +++ b/src/hooks/queries/memories.ts @@ -0,0 +1,13 @@ +import { useQuery } from '@tanstack/react-query'; +import { fetchApi } from '../../utils/fetchApi'; + +export function memories({ options = {} } = {}) { + return useQuery( + ['memories'], + () => { + const url = '/memories'; + return fetchApi(url); + }, + { ...options } + ); +}