Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
9affec8
style: ์ž„๋Œ€์ธ ์‹ ๋ขฐ์„ฑ ๊ธ€๊ผด ํฌ๊ธฐ ๋ณ€์ˆ˜ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
b09a96d
feat: ๋Œ€์œ„๋ณ€์ œ ์ด๋ ฅ ๋ฐ ๋‹ค์ฃผํƒ์ž ์ˆ˜, ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ํด๋ž˜์Šค ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
22a38c5
feat: ์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๊ด€๋ จ ๋ฐ์ดํ„ฐ ๋ฐ ์ด์œ  ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
b853215
feat: ์‹ ๋ขฐ๋„ ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
0764765
feat: ์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ์„น์…˜ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ ๋ฐ ์ธ๋ฑ์Šค ํŒŒ์ผ์— ๋‚ด๋ณด๋‚ด๊ธฐ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
93a4e56
feat: ๋ฉ”์ธ ํŽ˜์ด์ง€์— ์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ์„น์…˜ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
986b742
refactor: ์œ„ํ—˜๋„ ์ฐจํŠธ ๋ฐ•์Šค์— ์ œ๋ชฉ ์†์„ฑ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
081aeb0
chore: ๋ฉ”์ธ ํŽ˜์ด์ง€์— ํ™ˆ ์•„์ด์ฝ˜ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
cc336d8
feat: ๋งค๋ฌผ ํƒ€์ž… ์ƒ‰์ƒ ์ •์˜
Dobbymin Aug 21, 2025
00df347
feat: ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
f0225c3
feat: ๋งค๋ฌผ ํƒ€์ž… ์ •์˜ ๋ฐ ์ธ๋ฑ์Šค ํŒŒ์ผ์— ๋‚ด๋ณด๋‚ด๊ธฐ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
af564b1
feat: ๋งค๋ฌผ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
6745e8f
feat: ๋งค๋ฌผ ๋ฆฌ์ŠคํŠธ ๋ฐ•์Šค ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
6f03a70
feat: ๋งค๋ฌผ ํƒ€์ž… ์ƒ‰์ƒ ์ƒ์„ฑ ๋ฐ ์ƒ‰์ƒ ์ •๋ณด ์ถ”๊ฐ€ ํ•จ์ˆ˜ ๊ตฌํ˜„
Dobbymin Aug 21, 2025
a2f379b
chore: ์œ„ํ—˜๋„ ์ฐจํŠธ์—์„œ ๋””๋ฒ„๊น… ๋กœ๊ทธ ์ œ๊ฑฐ
Dobbymin Aug 21, 2025
785b7e0
feat: ๋Œ€์ฒด ๋งค๋ฌผ ์„น์…˜ ๋ฐ ์œ„ํ—˜ ์ ์ˆ˜ ์‹ ๋ขฐ๋„ ๋น„๊ต ์ฐจํŠธ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
0e32223
feat: ์ž„๋Œ€์ธ ๋งค๋ฌผ ์„น์…˜ ๋ฐ ์œ„ํ—˜ ์ ์ˆ˜ ์‹ ๋ขฐ๋„ ๋น„๊ต ์ฐจํŠธ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„
Dobbymin Aug 21, 2025
16bac0d
feat: ์œ„ํ—˜๋„ ์ฐจํŠธ์— ์ œ๋ชฉ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
5b2b7c7
feat: ๋ฉ”์ธ ํŽ˜์ด์ง€์— ๋Œ€์ฒด ๋งค๋ฌผ ์„น์…˜ ๋ฐ ์ž„๋Œ€์ธ ๋งค๋ฌผ ์„น์…˜ ์ถ”๊ฐ€
Dobbymin Aug 21, 2025
631624d
deploy: PR ์ƒ์„ฑ ์‹œ ์‘๋‹ต ๊ฒ€์ฆ ๋ฐ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์กฐ์ •, ํƒ€์ž„์•„์›ƒ ์‹œ๊ฐ„ ์ฆ๊ฐ€
Dobbymin Aug 21, 2025
c9815fa
refactor: ๋งค๋ฌผ ๋ฆฌ์ŠคํŠธ ๋ฐ•์Šค์—์„œ ๋งค๋ฌผ ํƒ€์ž… ์ƒ‰์ƒ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ƒ์ˆ˜์—์„œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ
Dobbymin Aug 21, 2025
83ec631
refactor: ๋งค๋ฌผ ๋ฆฌ์ŠคํŠธ ๋ฐ•์Šค์—์„œ ์ƒ‰์ƒ ์ •๋ณด ์ถ”๊ฐ€๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ์œผ๋กœ ๋ณ€๊ฒฝ
Dobbymin Aug 21, 2025
24480f8
refactor: ๋งค๋ฌผ ํƒ€์ž… ์ƒ‰์ƒ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋™์  ํ•ด์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝ
Dobbymin Aug 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 30 additions & 4 deletions .github/workflows/auto-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ jobs:

// 429 ์—๋Ÿฌ (Rate Limit)์ธ ๊ฒฝ์šฐ ์žฌ์‹œ๋„ ๋Œ€๊ธฐ
if (response.status === 429 && attempt < maxRetries) {
const waitTime = Math.pow(2, attempt) * 1000; // ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„
const waitTime = Math.pow(2, attempt) * 2000;
console.log(`Rate limit ์ดˆ๊ณผ. ${waitTime}ms ํ›„ ์žฌ์‹œ๋„...`);
await new Promise(resolve => setTimeout(resolve, waitTime));
lastError = error;
Expand Down Expand Up @@ -199,9 +199,20 @@ jobs:
throw new Error(`Invalid or empty text response from Gemini.\nParts: ${JSON.stringify(candidate.content.parts)}`);
}

// ์‘๋‹ต ๊ฒ€์ฆ - ์ตœ์†Œ ๊ธธ์ด ํ™•์ธ
if (aiResponse.length < 100) {
throw new Error(`Generated response is too short (${aiResponse.length} characters). This might indicate an incomplete response.`);
}

aiResponse = aiResponse.replace(/^```markdown\n/, '').replace(/\n```$/, '');
console.log('Generated PR body:', aiResponse);
console.log('Generated PR body length:', aiResponse.length);
console.log('Generated PR body preview:', aiResponse.substring(0, 200) + '...');

// ์ถœ๋ ฅ ์„ค์ • ์ „์— ์ž ์‹œ ๋Œ€๊ธฐ
await new Promise(resolve => setTimeout(resolve, 1000));

core.setOutput('body', aiResponse);
console.log('PR body successfully set to output');
return; // ์„ฑ๊ณต ์‹œ ํ•จ์ˆ˜ ์ข…๋ฃŒ

} catch (error) {
Expand All @@ -213,7 +224,7 @@ jobs:
}

// ๋งˆ์ง€๋ง‰ ์‹œ๋„๊ฐ€ ์•„๋‹ˆ๋ฉด ์ž ์‹œ ๋Œ€๊ธฐ
const waitTime = 1000 * attempt;
const waitTime = 2000 * attempt; // ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ฆ๊ฐ€
console.log(`${waitTime}ms ํ›„ ์žฌ์‹œ๋„...`);
await new Promise(resolve => setTimeout(resolve, waitTime));
}
Expand All @@ -224,16 +235,31 @@ jobs:
return;
env:
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
timeout-minutes: 10 # ํƒ€์ž„์•„์›ƒ ์‹œ๊ฐ„ ์ฆ๊ฐ€

- name: Create Pull Request
if: steps.check_pr.outputs.exists == 'false'
env:
GH_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
PR_BODY: ${{ steps.generate-body.outputs.body }}
run: |
# PR body๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
if [ -z "$PR_BODY" ]; then
echo "Error: PR body is empty. Skipping PR creation."
exit 1
fi

echo "PR body length: ${#PR_BODY}"
echo "PR body preview: ${PR_BODY:0:200}..."

# ์ž ์‹œ ๋Œ€๊ธฐ ํ›„ PR ์ƒ์„ฑ
sleep 2

gh pr create \
--base main \
--head ${{ github.ref_name }} \
--title "${{ github.ref_name }}" \
--body "$PR_BODY" \
--assignee ${{ github.actor }}
--assignee ${{ github.actor }}

echo "Pull Request created successfully!"
Binary file added src/features/main/_assets/Home.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
50 changes: 50 additions & 0 deletions src/features/main/components/common/Pagination.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';

import { Button } from '@/shared';

type Props = {
currentPage: number;
setCurrentPage: (page: number) => void;
totalPages: number;
};

export const Pagination = ({ currentPage, setCurrentPage, totalPages }: Props) => {
return (
<div className='mt-6 flex items-center justify-center gap-2'>
<Button
variant='ghost'
size='icon'
onClick={() => setCurrentPage(Math.max(1, currentPage - 1))}
disabled={currentPage === 1}
className='size-8 rounded-full text-gray-600 hover:bg-gray-100 disabled:opacity-50'
>
<ChevronLeftIcon className='size-4' />
</Button>

{Array.from({ length: totalPages }, (_, i) => i + 1).map((page) => (
<Button
variant='ghost'
key={page}
onClick={() => setCurrentPage(page)}
className={`size-8 rounded-full ${
currentPage === page
? 'bg-lighthouse-blue text-white'
: 'text-[#6B7684] hover:bg-[#E6E8EA]'
}`}
>
{page}
</Button>
))}
Comment on lines +24 to +37
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ๋ชจ๋“  ํŽ˜์ด์ง€ ๋ฒ„ํŠผ์„ ๋ Œ๋”๋งํ•˜๋ฉด UI๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 100๊ฐœ์˜ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด 100๊ฐœ์˜ ๋ฒ„ํŠผ์ด ๋ชจ๋‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํŽ˜์ด์ง€ ์ฃผ๋ณ€์˜ ์ผ๋ถ€ ํŽ˜์ด์ง€๋งŒ ํ‘œ์‹œํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” '...'์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™•์žฅ์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.


<Button
variant='ghost'
size='icon'
onClick={() => setCurrentPage(Math.min(totalPages, currentPage + 1))}
disabled={currentPage === totalPages}
className='size-8 rounded-full text-gray-600 hover:bg-gray-100 disabled:opacity-50'
>
<ChevronRightIcon className='size-4' />
</Button>
</div>
);
};
1 change: 1 addition & 0 deletions src/features/main/components/common/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ export * from './ChartGrid';
export * from './ChartLineItem';
export * from './LegendLine';
export * from './Needle';
export * from './Pagination';
5 changes: 3 additions & 2 deletions src/features/main/components/features/chart/RiskChartBox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@ import { Needle } from '../../common';

type Props = {
riskScore: number;
title: string;
};

export const RiskChartBox = ({ riskScore }: Props) => {
export const RiskChartBox = ({ riskScore, title }: Props) => {
const gaugeData: GaugeData = getGaugeData(riskScore);

const scoreColorClass = getRiskScoreColorClass(riskScore);
Expand All @@ -24,7 +25,7 @@ export const RiskChartBox = ({ riskScore }: Props) => {

return (
<div className='w-full rounded-lg bg-white p-6'>
<h3 className='mb-2 text-2xl font-bold text-gray-900'>์ „์„ธ ๊ณ„์•ฝ ์ตœ์ข… ์œ„ํ—˜๋„</h3>
<h3 className='mb-2 text-2xl font-bold text-gray-900'>{title}</h3>
<p className='text-md mb-6 flex items-center gap-2 text-gray-600'>
<span className='font-semibold'>์œ„ํ—˜ ์ ์ˆ˜ :</span>
<span className={`font-semibold ${scoreColorClass}`}>{riskScore}</span>
Expand Down
2 changes: 2 additions & 0 deletions src/features/main/components/features/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
export * from './form';
export * from './chart';
export * from './reliability';
export * from './property';
60 changes: 60 additions & 0 deletions src/features/main/components/features/property/PropertyListBox.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { useState } from 'react';

import HomeIcon from '../../../_assets/Home.webp';
import type { Property } from '../../../types';
import { getPropertyTypeColor } from '../../../utils';
import { Pagination } from '../../common';

type Props = {
properties: Property[];
title: string;
};
Comment on lines +8 to +11
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

properties prop์œผ๋กœ addColorsToProperties์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ „๋‹ฌ๋˜๋ฏ€๋กœ, typeColor ์†์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ณ  typeColor๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด prop ํƒ€์ž…์„ (Property & { typeColor: string })[]๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Suggested change
type Props = {
properties: Property[];
title: string;
};
type Props = {
properties: (Property & { typeColor: string })[];
title: string;
};


export const PropertyListBox = ({ properties, title }: Props) => {
const [currentPage, setCurrentPage] = useState(1);
const itemsPerPage = 5;
const totalPages = Math.ceil(properties.length / itemsPerPage);

const startIndex = (currentPage - 1) * itemsPerPage;
const endIndex = startIndex + itemsPerPage;
const currentProperties = properties.slice(startIndex, endIndex);

return (
<div className='w-full rounded-lg bg-white p-6'>
<h3 className='mb-4 text-2xl font-bold text-gray-900'>{title}</h3>

<div className='space-y-4'>
{currentProperties.map((property) => (
<div key={property.id} className='flex items-start justify-center gap-3'>
<img src={HomeIcon} alt='home' className='mt-1 h-[19px] w-[15px]' />

<div className='flex flex-1 flex-col gap-1'>
{/* ๋งค๋ฌผ ํƒ€์ž… ๋ผ๋ฒจ */}
<div className='flex items-center gap-3'>
<span
className='flex h-6 w-16 items-center justify-center rounded-xs text-sm font-medium text-white'
style={{
backgroundColor: getPropertyTypeColor(property.type),
}}
>
{property.type}
</span>
<span className='text-lg font-medium text-gray-900'>{property.buildingName}</span>
</div>

{/* ์ƒ์„ธ ์ฃผ์†Œ */}
<span className='text-sm text-gray-500'>{property.address}</span>
</div>
</div>
))}
</div>

{/* ํŽ˜์ด์ง€๋„ค์ด์…˜ */}
<Pagination
currentPage={currentPage}
setCurrentPage={setCurrentPage}
totalPages={totalPages}
/>
</div>
);
};
1 change: 1 addition & 0 deletions src/features/main/components/features/property/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './PropertyListBox';
23 changes: 23 additions & 0 deletions src/features/main/components/features/reliability/GradeBox.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { getTrustGradeColorClass } from '@/shared';

import { LANDLORD_TRUST_DATA } from '../../../mock';

export const GradeBox = () => {
return (
<div className='flex flex-col gap-2'>
<h1 className='text-3xl font-bold'>์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰</h1>
<span className='text-md flex gap-2 font-semibold'>
<span className='text-black'>์œ„ํ—˜์ ์ˆ˜ :</span>
<span className='text-chart-green'>{LANDLORD_TRUST_DATA.trustScore}</span>
<span className='text-black'>์ </span>
</span>
<div className='flex w-full items-center justify-center'>
<span
className={`text-landlord-reliability font-semibold ${getTrustGradeColorClass(LANDLORD_TRUST_DATA.grade)}`}
>
{LANDLORD_TRUST_DATA.grade}
</span>
</div>
</div>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { LANDLORD_TRUST_DATA } from '../../../mock';

export const MultiHouseBox = () => {
return (
<div>
<h1 className='text-3xl font-bold'>๋‹ค์ฃผํƒ์ž</h1>
<div className='flex w-full items-end justify-center'>
<span className='text-landlord-reliability font-bold text-blue-500'>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

์ƒ‰์ƒ ๊ฐ’์ด text-blue-500์œผ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์ฃผํƒ์ž ์ˆ˜์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” getMultiHouseColorClass ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฏธ shared/utils/chart/chart-colors.ts์— ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋‹ˆ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ํ–ฅํ›„ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ์„ ์ ์šฉํ•˜๋ ค๋ฉด ํŒŒ์ผ ์ƒ๋‹จ์— import { getMultiHouseColorClass } from '@/shared';๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Suggested change
<span className='text-landlord-reliability font-bold text-blue-500'>
<span className={`text-landlord-reliability font-bold ${getMultiHouseColorClass(LANDLORD_TRUST_DATA.ownedUnsoldCount)}`}>

{LANDLORD_TRUST_DATA.ownedUnsoldCount}
</span>
<span className='mb-25 text-5xl font-semibold text-black'>์ฑ„</span>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

mb-25๋Š” Tailwind CSS์˜ ๊ธฐ๋ณธ ์ŠคํŽ˜์ด์‹ฑ ์Šค์ผ€์ผ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์˜๋„ํ•œ ๊ฐ’์ด mb-2.5 (10px) ๋˜๋Š” ๋‹ค๋ฅธ ํ‘œ์ค€ ๊ฐ’์ด ์•„๋‹Œ์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ปค์Šคํ…€ ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค๋ฉด tailwind.config.js์— ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์ธ๋ผ์ธ ์Šคํƒ€์ผ style={{ marginBottom: '...' }}์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์ฃผ์„ธ์š”. ์ •์˜๋˜์ง€ ์•Š์€ ํด๋ž˜์Šค๋Š” ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

</div>
</div>
);
};
24 changes: 24 additions & 0 deletions src/features/main/components/features/reliability/ReasonBox.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { RELIABILITY_REASONS } from '../../../mock';

export const ReasonBox = () => {
return (
<div className='flex w-full flex-col gap-2 pb-3'>
<h1 className='text-3xl font-bold'>์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰ ์‚ฌ์œ </h1>
{RELIABILITY_REASONS.map((reason, index) => (
<div
key={`${reason.name}-${reason.percent}-${index}`}
className='flex items-center gap-5 py-3 text-center font-semibold'
>
<div className='size-1 rounded-full bg-black' />
<span className='flex items-center gap-2 text-gray-900'>
<span className='text-lg text-lighthouse-blue'>{reason.name}</span>
<div className='flex items-center gap-1'>
<span className='font-medium text-red-500'>{reason.percent}</span>
<span className='text-black'>%</span>
</div>
</span>
</div>
))}
</div>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { getSubrogationColorClass } from '@/shared';

import { LANDLORD_TRUST_DATA } from '../../../mock';

export const SubrogationPaymentBox = () => {
return (
<div>
<h1 className='text-3xl font-bold'>๋Œ€์œ„๋ณ€์ œ ์ด๋ ฅ</h1>
<div className='flex w-full items-end justify-center'>
<span
className={`text-landlord-reliability font-bold ${getSubrogationColorClass(LANDLORD_TRUST_DATA.subrogationCount)}`}
>
{LANDLORD_TRUST_DATA.subrogationCount}
</span>
<span className='mb-25 text-5xl font-semibold text-black'>ํšŒ</span>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

mb-25๋Š” Tailwind CSS์˜ ๊ธฐ๋ณธ ์ŠคํŽ˜์ด์‹ฑ ์Šค์ผ€์ผ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. MultiHouseBox.tsx์™€ ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์˜๋„ํ•œ ๊ฐ’์ด ํ‘œ์ค€ ์ŠคํŽ˜์ด์‹ฑ ๊ฐ’ ์ค‘ ํ•˜๋‚˜์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.

</div>
</div>
);
};
4 changes: 4 additions & 0 deletions src/features/main/components/features/reliability/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export * from './GradeBox';
export * from './ReasonBox';
export * from './SubrogationPaymentBox';
export * from './MultiHouseBox';
1 change: 1 addition & 0 deletions src/features/main/constants/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from './form-type';
export * from './house-type';
export * from './property-type';
24 changes: 24 additions & 0 deletions src/features/main/constants/property-type.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// ๊ธฐ๋ณธ ๋งค๋ฌผ ํƒ€์ž…๋ณ„ ์ƒ‰์ƒ ์ •์˜
export const PROPERTY_TYPE_COLORS = {
์˜คํ”ผ์Šคํ…”: '#B27373', // ์ ๊ฐˆ์ƒ‰
์›๋ฃธ: '#73B286', // ์—ฐํ•œ ์ดˆ๋ก์ƒ‰
ํˆฌ๋ฃธ: '#7573B2', // ๋ณด๋ผ์ƒ‰
์•„ํŒŒํŠธ: '#B273AE', // ์—ฐํ•œ ๋ถ„ํ™์ƒ‰
๋ณต์ธต: '#739EB2', // ์ฒญ๋ก์ƒ‰
๋นŒ๋ผ: '#FFA500', // ์ฃผํ™ฉ์ƒ‰
๋‹จ๋…์ฃผํƒ: '#32CD32', // ๋ผ์ž„์ƒ‰
} as const;

// ๋™์  ์ƒ‰์ƒ ์ƒ์„ฑ์„ ์œ„ํ•œ fallback ์ƒ‰์ƒ ๋ฐฐ์—ด
export const FALLBACK_COLORS = [
'#FF6B6B', // ๋นจ๊ฐ„์ƒ‰
'#4ECDC4', // ์ฒญ๋ก์ƒ‰
'#45B7D1', // ํŒŒ๋ž€์ƒ‰
'#96CEB4', // ์—ฐํ•œ ์ดˆ๋ก์ƒ‰
'#FFEAA7', // ์—ฐํ•œ ๋…ธ๋ž€์ƒ‰
'#DDA0DD', // ์—ฐํ•œ ๋ณด๋ผ์ƒ‰
'#98D8C8', // ๋ฏผํŠธ์ƒ‰
'#F7DC6F', // ๋…ธ๋ž€์ƒ‰
'#BB8FCE', // ์—ฐํ•œ ๋ณด๋ผ์ƒ‰
'#85C1E9', // ํ•˜๋Š˜์ƒ‰
] as const;
2 changes: 2 additions & 0 deletions src/features/main/mock/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
export * from './chart-data.mock';
export * from './landlord-reliability.mock';
export * from './property-data.mock';
export * from './risk-analysis.mock';
33 changes: 33 additions & 0 deletions src/features/main/mock/landlord-reliability.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// ์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰, ๋Œ€์œ„๋ณ€์ œ ์ด๋ ฅ, ๋‹ค์ฃผํƒ์ž
export const LANDLORD_TRUST_DATA = {
trustScore: 85,
subrogationCount: 0,
arrearsCount: 0,
litigationCount: 0,
ownedUnsoldCount: 2,
grade: 'A',
};

// ์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰ ์‚ฌ์œ 
export const RELIABILITY_REASONS = [
{
name: '์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰ ์‚ฌ์œ ',
percent: 25,
},
{
name: '์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰ ์‚ฌ์œ ',
percent: 20,
},
{
name: '์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰ ์‚ฌ์œ ',
percent: 18,
},
{
name: '์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰ ์‚ฌ์œ ',
percent: 15,
},
{
name: '์ž„๋Œ€์ธ ์‹ ๋ขฐ๋„ ๋“ฑ๊ธ‰ ์‚ฌ์œ ',
percent: 12,
},
];
Loading
Loading