diff --git a/src/api.js b/src/api.js
index a7120f8..a85affd 100644
--- a/src/api.js
+++ b/src/api.js
@@ -769,3 +769,59 @@ export function tarotPatchReading(id, body) {
export function tarotDeleteReading(id) {
return apiDelete(`/api/tarot/readings/${id}`);
}
+
+// ====== Saju ======
+
+export function sajuInterpret(body) {
+ return apiPost('/api/saju/interpret', body);
+}
+
+export function sajuListReadings({ page = 1, size = 20, favorite } = {}) {
+ const qs = new URLSearchParams();
+ qs.set('page', page);
+ qs.set('size', size);
+ if (favorite !== undefined) qs.set('favorite', favorite);
+ return apiGet(`/api/saju/readings?${qs.toString()}`);
+}
+
+export function sajuGetReading(id) {
+ return apiGet(`/api/saju/readings/${id}`);
+}
+
+export function sajuPatchReading(id, body) {
+ return apiPatch(`/api/saju/readings/${id}`, body);
+}
+
+export function sajuDeleteReading(id) {
+ return apiDelete(`/api/saju/readings/${id}`);
+}
+
+export function sajuCurrentFortune(readingId) {
+ return apiGet(`/api/saju/current-fortune?reading_id=${readingId}`);
+}
+
+// ====== Compatibility ======
+
+export function compatInterpret(body) {
+ return apiPost('/api/saju/compat/interpret', body);
+}
+
+export function compatListReadings({ page = 1, size = 20, favorite } = {}) {
+ const qs = new URLSearchParams();
+ qs.set('page', page);
+ qs.set('size', size);
+ if (favorite !== undefined) qs.set('favorite', favorite);
+ return apiGet(`/api/saju/compat/readings?${qs.toString()}`);
+}
+
+export function compatGetReading(id) {
+ return apiGet(`/api/saju/compat/readings/${id}`);
+}
+
+export function compatPatchReading(id, body) {
+ return apiPatch(`/api/saju/compat/readings/${id}`, body);
+}
+
+export function compatDeleteReading(id) {
+ return apiDelete(`/api/saju/compat/readings/${id}`);
+}
diff --git a/src/components/Icons.jsx b/src/components/Icons.jsx
index d33463d..6ce1796 100644
--- a/src/components/Icons.jsx
+++ b/src/components/Icons.jsx
@@ -143,3 +143,13 @@ export const IconTarot = () =>
>
);
+
+export const IconSaju = () =>
+ svg(
+ <>
+
+
+
+
+ >
+ );
diff --git a/src/pages/saju/Compatibility.jsx b/src/pages/saju/Compatibility.jsx
new file mode 100644
index 0000000..e67e0c0
--- /dev/null
+++ b/src/pages/saju/Compatibility.jsx
@@ -0,0 +1,10 @@
+import React from 'react';
+
+export default function Compatibility() {
+ return (
+
+
궁합 분석
+
UI 시안 적용 대기 중...
+
+ );
+}
diff --git a/src/pages/saju/CompatibilityResult.jsx b/src/pages/saju/CompatibilityResult.jsx
new file mode 100644
index 0000000..c5c9056
--- /dev/null
+++ b/src/pages/saju/CompatibilityResult.jsx
@@ -0,0 +1,10 @@
+import React from 'react';
+
+export default function CompatibilityResult() {
+ return (
+
+
궁합 분석 결과
+
UI 시안 적용 대기 중...
+
+ );
+}
diff --git a/src/pages/saju/Saju.jsx b/src/pages/saju/Saju.jsx
new file mode 100644
index 0000000..b40e443
--- /dev/null
+++ b/src/pages/saju/Saju.jsx
@@ -0,0 +1,10 @@
+import React from 'react';
+
+export default function Saju() {
+ return (
+
+
사주 분석
+
UI 시안 적용 대기 중...
+
+ );
+}
diff --git a/src/pages/saju/SajuResult.jsx b/src/pages/saju/SajuResult.jsx
new file mode 100644
index 0000000..a37bac5
--- /dev/null
+++ b/src/pages/saju/SajuResult.jsx
@@ -0,0 +1,10 @@
+import React from 'react';
+
+export default function SajuResult() {
+ return (
+
+
사주 분석 결과
+
UI 시안 적용 대기 중...
+
+ );
+}
diff --git a/src/routes.jsx b/src/routes.jsx
index 284a422..e744f02 100644
--- a/src/routes.jsx
+++ b/src/routes.jsx
@@ -12,6 +12,7 @@ import {
IconInsta,
IconPortfolio,
IconTarot,
+ IconSaju,
} from './components/Icons';
const Home = lazy(() => import('./pages/home/Home'));
@@ -34,6 +35,10 @@ const Tarot = lazy(() => import('./pages/tarot/Tarot'));
const TarotTodayCard = lazy(() => import('./pages/tarot/TodayCard'));
const TarotReading = lazy(() => import('./pages/tarot/Reading'));
const TarotHistory = lazy(() => import('./pages/tarot/History'));
+const Saju = lazy(() => import('./pages/saju/Saju'));
+const SajuResult = lazy(() => import('./pages/saju/SajuResult'));
+const Compatibility = lazy(() => import('./pages/saju/Compatibility'));
+const CompatibilityResult = lazy(() => import('./pages/saju/CompatibilityResult'));
export const navLinks = [
{
@@ -153,6 +158,15 @@ export const navLinks = [
icon: ,
accent: '#a78bfa',
},
+ {
+ id: 'saju',
+ label: 'Saju',
+ path: '/saju',
+ subtitle: 'DESTINY',
+ description: '사주와 궁합으로 운명을 분석하는 동양 이학 랩',
+ icon: ,
+ accent: '#d4a574',
+ },
];
export const appRoutes = [
@@ -240,4 +254,20 @@ export const appRoutes = [
path: 'tarot/history',
element: ,
},
+ {
+ path: 'saju',
+ element: ,
+ },
+ {
+ path: 'saju/result',
+ element: ,
+ },
+ {
+ path: 'saju/compatibility',
+ element: ,
+ },
+ {
+ path: 'saju/compatibility/result',
+ element: ,
+ },
];