Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
ae6e98c
chore: 토론 템플릿 데이터셋 추가
jaeml06 Aug 30, 2025
44b253e
feat: 토론 템플릿 section 구현
jaeml06 Aug 30, 2025
55f2d60
feat: 렌딩페이지에 필요한 이미지 추가
jaeml06 Aug 31, 2025
6ecaff0
fix: 오산시 토론 - 초등부 템플릿 인코딩 문자열 수정
jaeml06 Aug 31, 2025
32273ae
feat: 리뷰 섹션 UI 피그마 시안에 맞게 수정
jaeml06 Aug 31, 2025
fa5a5fb
feat: 테이블 섹션 UI 피그마 시안에 맞게 수정
jaeml06 Aug 31, 2025
841740b
feat: 템플릿 섹션에 템플릿 추가하기 영역 추가
jaeml06 Aug 31, 2025
cd1cdd3
feat: 타이머 섹션 UI 피그마 시안에 맞게 수정
jaeml06 Aug 31, 2025
fe65b93
feat: 타임 테이블 섹션 UI 피그마 시안에 맞게 수정
jaeml06 Aug 31, 2025
d155507
feat: 렌딩 페이지 배경색 분리 추가
jaeml06 Aug 31, 2025
89ae5c4
feat: 렌딩 페이지 하단 스크롤 유도 컴포넌트 추가
jaeml06 Aug 31, 2025
47ec083
refactor: 작전시간 -> 작전 시간 으로 변경
jaeml06 Sep 2, 2025
7ba79f9
refactor: 객체 타입을 명시
jaeml06 Sep 2, 2025
86ff327
refactor: 맞춤법 수정
jaeml06 Sep 2, 2025
b28400c
refactor: 파일명 맞춤법 수정
jaeml06 Sep 2, 2025
b863a1e
refactor: 문자열 띄어쓰기 추가
jaeml06 Sep 2, 2025
b5bf70f
fix: 오탈자 수정
jaeml06 Sep 5, 2025
bf58e23
refactor: 스크롤 유도 UI 화정으로 인한 주석 삭제
jaeml06 Sep 5, 2025
56bb10d
refactor: 파일명을 맞춤법에 맞게 수정
jaeml06 Sep 5, 2025
71ba905
refactor: 띄어쓰기 추가
jaeml06 Sep 5, 2025
ac1327e
refactor: 매개변수명을 더 자세하게 작성
jaeml06 Sep 5, 2025
03b0848
refactor : 띄어쓰기 추가
jaeml06 Sep 5, 2025
6894a26
feat: 템플릿 등록 url 추가
jaeml06 Sep 6, 2025
9335929
feat: 이감 토론 유형 추가
jaeml06 Sep 6, 2025
45a6e19
refactor: 스타일 문법을 clsx사용하여 결합
jaeml06 Sep 6, 2025
bcfdbab
fix: 토론 템플릿 데이터 변경
jaeml06 Sep 6, 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
Binary file added src/assets/landing/bell_setting.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/bottom_arrow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/debate_info_setting.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/key_info.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/table_list.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/timebox_add_button.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/timebox_step.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/timebox_step_button.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/timeout_button.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/timer.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/timer_operation_time.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/timer_timebased.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/landing/two_timer.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/government.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/han_alm.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/hantomak.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/igam.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/jungseonto.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/kogito.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/kondae_time.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/nogotte.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/osansi.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/seobangjeongto.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/todallae.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/template_logo/visual.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
270 changes: 270 additions & 0 deletions src/constants/debate_template.ts

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/constants/urls.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ export const LANDING_URLS = {
'https://bustling-bathtub-b3a.notion.site/2071550c60cf80f18395e03440fba80a?source=copy_link',
TERMS_OF_SERVICE_URL:
'https://bustling-bathtub-b3a.notion.site/1b01550c60cf8020b34adff2d40cf605?source=copy_link',
TEMPLATE_REGISTER_URL: 'https://forms.gle/471ojcPqSdkWqVCaA',
} as const;
11 changes: 10 additions & 1 deletion src/page/LandingPage/LandingPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import TableSection from './components/TableSection';
import ReviewSection from './components/ReviewSection';
import ReportSection from './components/ReportSection';
import useLandingPageHandlers from './hooks/useLandingPageHandlers';

import TemplateSelection from './components/TemplateSelection';
import ScrollHint from './components/ScrollHint';
export default function LandingPage() {
const {
handleStartWithoutLogin,
Expand All @@ -28,6 +29,10 @@ export default function LandingPage() {
onStartWithoutLogin={handleStartWithoutLogin}
onDashboardButtonClicked={handleDashboardButtonClick}
/>
<ScrollHint />
{/*템플릿 선택 화면 */}
<TemplateSelection />

{/* 시간표 설정화면 */}
<TimeTableSection />
</div>
Expand All @@ -42,8 +47,12 @@ export default function LandingPage() {
<div className="flex w-[95%] max-w-[1226px] flex-col gap-96 py-48 md:w-[64%]">
{/* 홈 설정 */}
<TableSection onLogin={handleTableSectionLoginButtonClick} />
</div>
<div className="flex w-full flex-col items-center bg-black py-48">
Copy link
Contributor

Choose a reason for hiding this comment

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

아하 홈설정에 리뷰가 원래 함께 들어가 있었는데 이번에 바뀌면서 분리를 한 것이군요?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

넵 기존에는 배경색이 둘다 같아서 같이 두었는데 이번에 배경색이 변경되면서 분리되었습니다

{/* 리뷰 */}
<ReviewSection onStartWithoutLogin={handleStartWithoutLogin} />
</div>
<div className="flex w-[95%] max-w-[1226px] flex-col gap-96 py-48 md:w-[64%]">
{/* 버그 및 불편사항 제보 */}
<ReportSection />
</div>
Expand Down
21 changes: 13 additions & 8 deletions src/page/LandingPage/components/ReviewSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@ export default function ReviewSection({
onStartWithoutLogin,
}: ReviewSectionProps) {
return (
<section id="section4" className="flex flex-col items-center gap-24">
<div className="flex flex-col items-center justify-center gap-1 text-[min(max(1.4rem,3vw),2.8rem)] font-bold">
<section
id="section4"
className="flex w-[95%] max-w-[1226px] flex-col gap-24 md:w-[64%]"
>
<div className="flex flex-col items-center justify-center gap-1 text-[min(max(1.4rem,3vw),2.8rem)] font-bold text-neutral-100">
<h1>이미 많은 사람들이 디베이트 타이머로</h1>
<h1>더 나은 토론환경을 만들고 있어요.</h1>
</div>
Expand All @@ -19,12 +22,14 @@ export default function ReviewSection({
<ReviewCard key={review.user} {...review} />
))}
</div>
<button
className="rounded-full border border-neutral-300 bg-brand px-20 py-2 text-[min(max(0.875rem,1.25vw),1.2rem)] font-medium text-default-black transition-all duration-100 hover:bg-semantic-table hover:text-default-white"
onClick={onStartWithoutLogin}
>
비회원으로 시작하기
</button>
<div className="flex w-full justify-center">
<button
className="rounded-full border border-neutral-300 bg-brand px-20 py-2 text-[min(max(0.875rem,1.25vw),1.2rem)] font-medium text-default-black transition-all duration-100 hover:bg-semantic-table hover:text-default-white"
onClick={onStartWithoutLogin}
>
비회원으로 시작하기
</button>
</div>
</section>
);
}
48 changes: 48 additions & 0 deletions src/page/LandingPage/components/ScrollHint.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { useEffect, useState } from 'react';
import arrowDown from '../../../assets/landing/bottom_arrow.png';
type ScrollHintProps = {
topThreshold?: number; //최상단 판정 임계값 (px)
};

export default function ScrollHint({ topThreshold = 10 }: ScrollHintProps) {
Copy link
Contributor

Choose a reason for hiding this comment

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

width가 700 px인 경우에는 아래와 같이 스크롤 유도 컴포넌트와 글자가 겹치게 되네요 .. 😂 스크롤 유도 컴포넌트를 없애거나 아니면 스크롤 유도 컴포넌트 다음에 다음 요소가 뜨도록 높이 조정이 필요할 것 같아요
image

Copy link
Contributor Author

Choose a reason for hiding this comment

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

이 부분은 회의에서 배경을 지정해서 스크롤 유도 컴포넌트를 위로 띄우는 방식으로 결정을 했었습니다.
image

대충 이런 느낌입니다.

const [visible, setVisible] = useState(true);

useEffect(() => {
const onScroll = () => {
const atTop = window.scrollY <= topThreshold;
// 최상단이면 보이고, 아니면 숨김
setVisible(atTop);
};
onScroll();

window.addEventListener('scroll', onScroll, { passive: true });
return () => window.removeEventListener('scroll', onScroll);
}, [topThreshold]);

return (
<div
className={`
pointer-events-none fixed inset-x-0 bottom-10 flex justify-center
transition-all duration-300
${visible ? 'translate-y-0 opacity-100' : 'translate-y-2 opacity-0'}
`}
aria-hidden={!visible}
>
<div
className={`
pointer-events-auto flex items-center gap-2 rounded-full
bg-default-white/90 px-4 py-2 text-[min(max(0.85rem,1.2vw),1rem)] font-medium shadow-[0_6px_18px_rgba(0,0,0,0.12)]
ring-1
ring-black/5 backdrop-blur
transition-colors hover:bg-default-white
`}
>
<img
src={arrowDown}
alt="아래로 스크롤"
className="pointer-events-auto h-4 w-20 animate-bounce"
/>
</div>
</div>
);
}
17 changes: 9 additions & 8 deletions src/page/LandingPage/components/TableSection.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import section301 from '../../../assets/landing/section3-1.png';
import section302 from '../../../assets/landing/section3-2.png';
import section301 from '../../../assets/landing/debate_info_setting.png';
import section302 from '../../../assets/landing/table_list.png';

interface TableSectionProps {
onLogin: () => void;
Expand All @@ -14,21 +14,23 @@ export default function TableSection({ onLogin }: TableSectionProps) {
<span className="absolute bottom-0 left-0 z-0 h-4 w-full bg-brand/70"></span>
</div>
<h2 className="mt-4 text-left text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
토론 정보 관리 및 기록
토론 정보 <br />
관리 및 기록
</h2>
</div>
<div className="flex flex-row items-center justify-center gap-8 px-4">
<img src={section301} alt="section301" className="flex w-1/2" />
<div className="flex w-1/2 flex-col items-center gap-4">
<h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
종소리 설정
토론 기본 정보 설정
</h3>
<p className="text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
원하는 종소리만 골라서 설정할 수 있어요.
시간표 이름부터 주제까지!
</p>
</div>
<img src={section301} alt="section301" className="flex w-1/2" />
</div>
<div className="flex flex-row items-center justify-center gap-8 px-4">
<img src={section302} alt="section302" className="flex w-1/2" />
<div className="flex w-1/2 flex-col items-center gap-4">
<h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
시간표 목록
Expand All @@ -37,12 +39,11 @@ export default function TableSection({ onLogin }: TableSectionProps) {
내가 만든 시간표를 저장하고 싶나요?
</p>
</div>
<img src={section302} alt="section302" className="flex w-1/2" />
</div>

<div className="flex flex-col items-center justify-center gap-1 text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
Copy link
Contributor

Choose a reason for hiding this comment

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

바꾸는 김에 로그인해 주세요.로 띄어쓰기 해주면 좋을 것 같아요!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

수정했습니다

<p>시간표를 저장하려면,</p>
<p>디베이트 타이머에 로그인해보세요!</p>
<p>디베이트 타이머에 로그인해 보세요!</p>
<button
className="mt-14 rounded-full border border-neutral-300 bg-brand px-5 py-2 text-[min(max(0.875rem,1.25vw),1.2rem)] font-medium text-default-black transition-all duration-100 hover:bg-semantic-table hover:text-default-white"
onClick={onLogin}
Expand Down
30 changes: 30 additions & 0 deletions src/page/LandingPage/components/TemplateApplicationSection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import section501 from '../../../assets/landing/section5-1.png';
import { LANDING_URLS } from '../../../constants/urls';

export default function TemplateApplicationSection() {
return (
<section className="flex flex-row justify-between gap-1">
<div className="flex flex-col items-start justify-center gap-4">
<p className="text-[min(max(1.2rem,2vw),2.3rem)] font-semibold">
템플릿 신청하기
</p>
<p className="text-[min(max(0.875rem,1.25vw),1.2rem)] text-neutral-400">
새로운 템플릿도 신청해 볼까요?
</p>
<button
onClick={() =>
window.open(
LANDING_URLS.TEMPLATE_REGISTER_URL,
'_blank',
'noopener,noreferrer',
)
}
className="rounded-full border border-neutral-300 bg-neutral-200 px-9 py-2 text-[min(max(0.875rem,1.25vw),1.2rem)] font-medium text-default-black transition-all duration-100 hover:bg-brand"
>
신청하기
</button>
</div>
<img src={section501} alt="section501" className="w-[30%]" />
</section>
);
}
63 changes: 63 additions & 0 deletions src/page/LandingPage/components/TemplateCard.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { DebateTemplate } from '../../../type/type';
import clsx from 'clsx';

export default function TemplateCard({
title,
subtitle,
logoSrc,
actions,
className,
}: DebateTemplate) {
return (
<article
className={clsx(
'flex flex-col rounded-3xl border-4 border-white bg-gradient-to-b from-default-white to-brand',
'ring-3 ring-brand/20',
'p-6 shadow-[0_0_32px_rgba(255,165,0,0.1)] md:p-7',
className,
)}
>
{/* 헤더 */}
<div className="flex justify-between">
<div className="flex flex-col gap-2">
<h3 className="text-[min(max(0.9rem,1.4vw),1.1rem)] font-semibold leading-tight">
{title}
</h3>
<p className="mt-1 min-h-[1.25rem] text-[min(max(0.75rem,1.1vw),0.9rem)] text-neutral-700">
{subtitle ?? ''}
</p>
</div>

{/* 로고 */}
{logoSrc && (
<img
src={logoSrc}
alt={`${title} 로고`}
className="h-12 w-12 shrink-0 rounded-full object-contain"
/>
)}
</div>

{/* 액션 리스트 */}
<ul className="mt-5 flex flex-col gap-1">
{actions.map((action, index) => (
<li key={`${action.label}-${index}`}>
<div className="flex items-center justify-between gap-3 rounded-md bg-white px-3 py-2">
<span className="truncate text-[min(max(0.75rem,1.1vw),0.9rem)] font-medium text-neutral-800">
{action.label}
</span>

<a
href={action.href}
className="shrink-0 rounded-full border border-neutral-300 bg-brand px-4 py-1.5 text-[min(max(0.75rem,1.1vw),0.9rem)] font-medium text-default-black transition-colors duration-100 hover:bg-semantic-table hover:text-white"
aria-label={`${action.label} 토론하기`}
>
토론하기
</a>
</div>
</li>
))}
</ul>
</article>
);
}
17 changes: 17 additions & 0 deletions src/page/LandingPage/components/TemplateList.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { DebateTemplate } from '../../../type/type';
import TemplateCard from './TemplateCard';

interface TemplateListProps {
data: DebateTemplate[];
}
export default function TemplateList({ data }: TemplateListProps) {
return (
<div
className={'grid grid-cols-2 gap-5 lg:grid-cols-3'} // 2열, lg에서 3열
>
{data.map((template) => (
<TemplateCard key={template.title} {...template} />
))}
</div>
);
}
21 changes: 21 additions & 0 deletions src/page/LandingPage/components/TemplateSelection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { DEBATE_TEMPLATE } from '../../../constants/debate_template';
import TemplateApplicationSection from './TemplateApplicationSection';
import TemplateList from './TemplateList';

export default function TemplateSelection() {
return (
<section id="template-selection" className="flex flex-col gap-12">
<div>
<h2 className="mt-4 text-left text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
다양한 토론 템플릿을 원클릭으로 만나보세요!
</h2>
</div>
<TemplateList data={DEBATE_TEMPLATE.ONE} />
<div className="mx-auto h-px w-11/12 bg-neutral-200" /> {/* 구분선 */}
<TemplateList data={DEBATE_TEMPLATE.TWO} />
<div className="mx-auto h-px w-11/12 bg-neutral-200" />
<TemplateList data={DEBATE_TEMPLATE.THREE} />
<TemplateApplicationSection />
</section>
);
}
69 changes: 48 additions & 21 deletions src/page/LandingPage/components/TimeTableSection.tsx
Original file line number Diff line number Diff line change
@@ -1,32 +1,59 @@
import section101 from '../../../assets/landing/section1-1.png';
import section102 from '../../../assets/landing/section1-2.png';

import timeboxStep from '../../../assets/landing/timebox_step.png';
import timeboxButtons from '../../../assets/landing/timebox_step_button.png';
import bellSetting from '../../../assets/landing/bell_setting.png';
import twoTimer from '../../../assets/landing/two_timer.png';
import timeboxAddButton from '../../../assets/landing/timebox_add_button.png';
export default function TimeTableSection() {
return (
<section id="section1" className="flex flex-col gap-24">
<div>
<div className="relative inline-block text-[min(max(0.875rem,1.5vw),1.4rem)] font-semibold">
<span className="relative z-10">시간표 설정 화면</span>
<span className="relative z-10">시간표 설정화면</span>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

라벨 표기 어색한 띄어쓰기

“시간표 설정화면” → “시간표 설정 화면”이 자연스럽습니다.

-          <span className="relative z-10">시간표 설정화면</span>
+          <span className="relative z-10">시간표 설정 화면</span>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<span className="relative z-10">시간표 설정화면</span>
<span className="relative z-10">시간표 설정 화면</span>
🤖 Prompt for AI Agents
In src/page/LandingPage/components/TimeTableSection.tsx around line 11, the
label text "시간표 설정화면" has awkward spacing; change it to "시간표 설정 화면" to use
natural Korean spacing. Update the span content to the corrected string and run
a quick UI/text check to ensure line breaks or CSS don't rejoin the words.

<span className="absolute bottom-0 left-0 z-0 h-4 w-full bg-brand/70"></span>
</div>
<h1 className="mt-4 text-left text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
드래그 앤 드롭으로
<br /> 간편하게 시간표 구성
</h1>
<h2 className="mt-4 text-left text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
간편한 시간표 구성
</h2>
</div>

<img src={section101} alt="section101" className="w-full" />
<img src={section102} alt="section102" className="mt-5 w-full" />
<div className="flex flex-col items-center gap-1">
<p className="mb-2 text-center text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
두 가지 타이머
</p>
<p className="text-center text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
일반형과 자유토론형 타이머로,
</p>
<p className="text-center text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
다양한 토론 방식을 지원해요.
</p>
<div className="flex flex-row items-center justify-center gap-8 px-4">
<img src={timeboxStep} alt="section301" className="flex w-1/2" />
<img src={timeboxButtons} alt="section301" className="flex w-1/3" />
</div>
Comment on lines +18 to +21
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

모바일 가독성·접근성 개선(반응형 방향/alt/지연로딩)

  • 모바일에서 2열 강제는 과도한 축소를 유발합니다. md 이상에서만 가로 배치하세요.
  • alt="section301"은 의미가 없습니다. 묘사형 alt 또는 장식이면 alt="".
  • 이미지 lazy/async로 LCP 이외 지연 로딩.
-      <div className="flex flex-row items-center justify-center gap-8 px-4">
-        <img src={timeboxStep} alt="section301" className="flex w-1/2" />
-        <img src={timeboxButtons} alt="section301" className="flex w-1/3" />
+      <div className="flex flex-col items-center justify-center gap-8 px-4 md:flex-row">
+        <img
+          src={timeboxStep}
+          alt="시간표 단계 안내 화면"
+          loading="lazy"
+          decoding="async"
+          className="w-full md:w-1/2"
+        />
+        <img
+          src={timeboxButtons}
+          alt="시간표 단계별 버튼 모음"
+          loading="lazy"
+          decoding="async"
+          className="w-full md:w-1/3"
+        />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div className="flex flex-row items-center justify-center gap-8 px-4">
<img src={timeboxStep} alt="section301" className="flex w-1/2" />
<img src={timeboxButtons} alt="section301" className="flex w-1/3" />
</div>
<div className="flex flex-col items-center justify-center gap-8 px-4 md:flex-row">
<img
src={timeboxStep}
alt="시간표 단계 안내 화면"
loading="lazy"
decoding="async"
className="w-full md:w-1/2"
/>
<img
src={timeboxButtons}
alt="시간표 단계별 버튼 모음"
loading="lazy"
decoding="async"
className="w-full md:w-1/3"
/>
</div>
🤖 Prompt for AI Agents
In src/page/LandingPage/components/TimeTableSection.tsx around lines 18-21, the
current two-column layout forces excessive shrink on mobile and both img tags
use a non-descriptive alt and no lazy loading; update the container classes so
the images stack vertically on small screens and switch to horizontal only at md
(e.g., flex-col on small, md:flex-row), replace alt="section301" with meaningful
descriptive alt text for the primary informative image (or alt="" if purely
decorative) and provide an appropriate alt for the other image, and add
loading="lazy" and decoding="async" to images that are not critical LCP (keep
the LCP image eager or add fetchPriority="high") so non-LCP assets load
deferred.

<div className="mt-4 flex items-center gap-4">
<h2 className="text-left text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
시간표 추가
</h2>
<img
src={timeboxAddButton}
alt="시간표 추가 버튼"
className="h-[min(max(1.7rem,3vw),2.7rem)] w-auto"
/>
Comment on lines +23 to +30
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

헤딩 계층(A11y) 및 아이콘 대체텍스트

  • 섹션 내 보조 타이틀은 h3가 적절합니다.
  • 옆의 버튼 이미지는 장식에 가깝다면 스크린리더 제외 처리.
-        <h2 className="text-left text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
+        <h3 className="text-left text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
           시간표 추가
-        </h2>
+        </h3>
         <img
           src={timeboxAddButton}
-          alt="시간표 추가 버튼"
+          alt=""
+          aria-hidden="true"
           className="h-[min(max(1.7rem,3vw),2.7rem)] w-auto"
         />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<h2 className="text-left text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
시간표 추가
</h2>
<img
src={timeboxAddButton}
alt="시간표 추가 버튼"
className="h-[min(max(1.7rem,3vw),2.7rem)] w-auto"
/>
<h3 className="text-left text-[min(max(1.25rem,2.75vw),2.5rem)] font-bold">
시간표 추가
</h3>
<img
src={timeboxAddButton}
alt=""
aria-hidden="true"
className="h-[min(max(1.7rem,3vw),2.7rem)] w-auto"
/>
🤖 Prompt for AI Agents
In src/page/LandingPage/components/TimeTableSection.tsx around lines 23 to 30,
change the section heading from an h2 to an h3 to preserve correct heading
hierarchy for the section, and treat the adjacent button image as decorative by
removing non-empty alt text and marking it hidden from assistive technology
(e.g., set alt="" and add aria-hidden="true" or role="presentation"); if the
image is inside an interactive element ensure the interactive element has
accessible label text (aria-label or visually-hidden text) instead of relying on
the image alt.

</div>
<div className="flex flex-row items-center justify-center gap-8 px-4">
<img src={twoTimer} alt="section302" className="flex w-1/2" />
<div className="flex w-1/2 flex-col items-center gap-4">
<h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
두가지 타이머
</h3>
<p className="text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
일반형과 자유토론형 타이머로,
<br />
다양한 토론 방식을 지원해요.
</p>
</div>
Comment on lines +32 to +43
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

반응형 방향 전환 및 카피 띄어쓰기

  • 모바일 세로, md 이상 가로 배치 권장.
  • “두가지” → “두 가지”.
-      <div className="flex flex-row items-center justify-center gap-8 px-4">
-        <img src={twoTimer} alt="section302" className="flex w-1/2" />
-        <div className="flex w-1/2 flex-col items-center gap-4">
+      <div className="flex flex-col items-center justify-center gap-8 px-4 md:flex-row">
+        <img
+          src={twoTimer}
+          alt="두 가지 타이머 화면"
+          loading="lazy"
+          decoding="async"
+          className="w-full md:w-1/2"
+        />
+        <div className="flex w-full flex-col items-center gap-4 md:w-1/2">
           <h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
-            두가지 타이머
+            두 가지 타이머
           </h3>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div className="flex flex-row items-center justify-center gap-8 px-4">
<img src={twoTimer} alt="section302" className="flex w-1/2" />
<div className="flex w-1/2 flex-col items-center gap-4">
<h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
두가지 타이머
</h3>
<p className="text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
일반형과 자유토론형 타이머로,
<br />
다양한 토론 방식을 지원해요.
</p>
</div>
<div className="flex flex-col items-center justify-center gap-8 px-4 md:flex-row">
<img
src={twoTimer}
alt="두 가지 타이머 화면"
loading="lazy"
decoding="async"
className="w-full md:w-1/2"
/>
<div className="flex w-full flex-col items-center gap-4 md:w-1/2">
<h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
가지 타이머
</h3>
<p className="text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
일반형과 자유토론형 타이머로,
<br />
다양한 토론 방식을 지원해요.
</p>
</div>
🤖 Prompt for AI Agents
In src/page/LandingPage/components/TimeTableSection.tsx around lines 32 to 43,
the layout should be vertical on mobile and horizontal from md up and the copy
needs spacing: change the container classes from "flex flex-row items-center
justify-center gap-8 px-4" to "flex flex-col md:flex-row items-center
justify-center gap-8 px-4" and update child sizing from fixed halves to
responsive widths (e.g., img class to "w-full md:w-1/2" and the text wrapper to
"w-full md:w-1/2") so they stack on small screens and sit side-by-side on md+,
and change the heading text "두가지 타이머" to "두 가지 타이머" (add the space). Ensure any
line-breaks or spacing in the paragraph still render correctly with the
responsive layout.

</div>
<div className="flex flex-row items-center justify-center gap-8 px-4">
<div className="flex w-1/2 flex-col items-center gap-4">
<h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
종소리 설정
</h3>
<p className="text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
시간에 따른 종소리를 내마음대로
<br />
커스터마이징 할 수 있어요.
</p>
</div>
<img src={bellSetting} alt="section302" className="flex w-1/2" />
</div>
Comment on lines +45 to 57
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

⚠️ Potential issue

텍스트 품질·접근성(띄어쓰기/외래어·alt/lazy)

  • “내마음대로” → “내 마음대로”.
  • “커스터마이징 할 수 있어요.” → “커스터마이징할 수 있어요.” 또는 “사용자 지정할 수 있어요.”(권장).
  • alt 구체화 및 lazy/async.
-      <div className="flex flex-row items-center justify-center gap-8 px-4">
-        <div className="flex w-1/2 flex-col items-center gap-4">
+      <div className="flex flex-col items-center justify-center gap-8 px-4 md:flex-row">
+        <div className="flex w-full flex-col items-center gap-4 md:w-1/2">
           <h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
             종소리 설정
           </h3>
           <p className="text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
-            시간에 따른 종소리를 내마음대로
+            시간에 따른 종소리를 내 마음대로
             <br />
-            커스터마이징 할 수 있어요.
+            사용자 지정할 수 있어요.
           </p>
         </div>
-        <img src={bellSetting} alt="section302" className="flex w-1/2" />
+        <img
+          src={bellSetting}
+          alt="종소리 설정 화면"
+          loading="lazy"
+          decoding="async"
+          className="w-full md:w-1/2"
+        />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div className="flex flex-row items-center justify-center gap-8 px-4">
<div className="flex w-1/2 flex-col items-center gap-4">
<h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
종소리 설정
</h3>
<p className="text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
시간에 따른 종소리를 내마음대로
<br />
커스터마이징 있어요.
</p>
</div>
<img src={bellSetting} alt="section302" className="flex w-1/2" />
</div>
<div className="flex flex-col items-center justify-center gap-8 px-4 md:flex-row">
<div className="flex w-full flex-col items-center gap-4 md:w-1/2">
<h3 className="text-[min(max(1.1rem,1.75vw),1.8rem)] font-semibold">
종소리 설정
</h3>
<p className="text-[min(max(0.875rem,1.5vw),1.4rem)] font-medium text-neutral-600">
시간에 따른 종소리를 마음대로
<br />
사용자 지정할 있어요.
</p>
</div>
<img
src={bellSetting}
alt="종소리 설정 화면"
loading="lazy"
decoding="async"
className="w-full md:w-1/2"
/>
</div>
🤖 Prompt for AI Agents
In src/page/LandingPage/components/TimeTableSection.tsx around lines 45 to 57,
fix Korean spacing and accessibility: change “내마음대로” to “내 마음대로” and replace
“커스터마이징 할 수 있어요.” with either “커스터마이징할 수 있어요.” or preferably “사용자 지정할 수 있어요.”,
and improve the img element by providing a more descriptive alt (e.g., “시간별 종소리
설정 일러스트” or similar) and enable lazy loading (add loading="lazy" or switch to an
image component that supports async/lazy loading).

</section>
);
Expand Down
Loading