Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
a9b39ed
feat: Radio(basic) 컴포넌트를 구현합니다
rkdcodus Oct 1, 2025
4b32e07
fix: interaction 함수에 borderRadius inherit 속성을 추가합니다
rkdcodus Oct 1, 2025
207c47b
docs: Radio(basic) 컴포넌트 스토리북을 작성합니다
rkdcodus Oct 1, 2025
17ea064
refactor: Radio 컴포넌트에서 ComponentPropsWithoutRef를 확장하여 구현합니다.
rkdcodus Oct 2, 2025
4b0271f
move: Radio 컴포넌트를 radioBasic 폴더로 이동합니다
rkdcodus Oct 2, 2025
12c73cd
feat: RadioContent(empty, left, non-checked) 컴포넌트 스타일을 구현합니다
rkdcodus Oct 2, 2025
27d75c0
fix: Radio(basic) 컴포넌트에서 checked, disabled 조건 여부에 따른 색상을 수정합니다
rkdcodus Oct 3, 2025
576b1bd
docs: Radio(basic) 컴포넌트 checked 스토리를 작성합니다
rkdcodus Oct 3, 2025
9869c91
feat: RadioContent 컴포넌트 (empty, left, checked) 스타일을 구현합니다
rkdcodus Oct 3, 2025
47e3cc6
feat: RadioContent에 left, right 속성에 따른 레이블 위치, 서브 레이블을 구현합니다
rkdcodus Oct 3, 2025
61a8cfc
fix: SUB_LABEL_SIZE 임포트 경로로 인한 버그를 수정합니다
rkdcodus Oct 3, 2025
1181295
fix: align이 right일 때의 서브 레이블 위치를 수정합니다
rkdcodus Oct 3, 2025
df2df93
feat: outline RadioContent 컴포넌트 스타일을 추가합니다
rkdcodus Oct 3, 2025
e5b4d5c
fix: RADIO_CONTAINER_SIZE에 borderRadius 속성을 추가합니다
rkdcodus Oct 3, 2025
7091720
docs: outline RadioContent를 스토리를 추가합니다
rkdcodus Oct 3, 2025
57fcc46
feat: outline RadioContent에서 disabled 일 때 border Color를 수정합니다
rkdcodus Oct 3, 2025
66805da
refactor: style 컴포넌트명을 수정합니다
rkdcodus Oct 3, 2025
bdfebff
fix: interaction 스프레드 시 발생하는 타입에러를 해결합니다
rkdcodus Oct 3, 2025
a517759
feat: scheme 토큰화 및 반응형으로 구현합니다
rkdcodus Oct 3, 2025
7256538
feat: Radio 컴포넌트에 cursor pointer 효과를 추가합니다
rkdcodus Oct 3, 2025
5ca8b1f
feat: interaction에 pointerEvents none 속성을 추가합니다
rkdcodus Oct 3, 2025
ce95916
fix: subLabel에 하이퍼링크가 들어올 경우, 커서 모양으로 링크를 분별하기 위해 cursor 스타일을 default…
rkdcodus Oct 3, 2025
3842fa9
docs: RadioContent의 하이퍼링크가 달린 레이블 스토리를 작성합니다
rkdcodus Oct 3, 2025
6e80840
refactor: Radio 컴포넌트에 반응형 토큰을 사용합니다
rkdcodus Oct 4, 2025
399dcf1
fix: Radio 컴포넌트 체크 스타일 버그를 수정합니다
rkdcodus Oct 4, 2025
d212c5a
Merge branch 'dev' of https://github.com/JECT-Study/JECT-Official-Web…
rkdcodus Dec 3, 2025
5a338cc
refactor: 린트 수정 및 토큰 구조를 맞게 수정합니다
rkdcodus Dec 5, 2025
8e27754
fix: 하이퍼링크 안되는 버그를 수정합니다
rkdcodus Dec 8, 2025
eb41a72
fix: grid 컨테이너에 align-items center 속성을 추가합니다
rkdcodus Dec 8, 2025
ef88115
fix: interaction에서 발생하는 타입 에러를 수정합니다
rkdcodus Dec 8, 2025
e841db5
refactor: Radio 컴포넌트 구조를 변경합니다
rkdcodus Dec 8, 2025
2f7e9b9
feat: checked, onChange, defaultChecked 타입을 명시합니다
rkdcodus Dec 8, 2025
aea98ac
feat: controlled component 케이스를 위한 RadioGroup, Context를 생성합니다
rkdcodus Dec 8, 2025
960ac88
Merge branch 'dev' of https://github.com/JECT-Study/JECT-Official-Web…
rkdcodus Jan 8, 2026
2e9fc0c
fix: Interaction 유틸함수 import 에러를 수정합니다.
rkdcodus Jan 8, 2026
e6d9e3c
refactor: RadioRoot를 label에서 div 태그로 변경하고 사용하지 않는 props를 제거합니다.
rkdcodus Jan 8, 2026
50cd572
fix: Radio.Root에서 받은 disabled 속성을 Radio.Basic으로 전달받을 수 있도록 수정합니다
rkdcodus Jan 8, 2026
079d20a
feat: 레이블이 줄바꿈되지 않도록 witheSpace 속성을 nowrap으로 설정합니다
rkdcodus Jan 12, 2026
f1d156c
refactor: radio 컴포넌트명을 수정합니다.
rkdcodus Jan 12, 2026
a910310
docs: 라디오 컴포넌트 스토리를 수정합니다
rkdcodus Jan 12, 2026
c54ae6a
fix: 브라우저 탭 전환 시에도 정확한 타이머 수행을 할 수 있도록 useCountdownTimer 함수를 수정합니다.
rkdcodus Jan 16, 2026
ec33fba
fix: 인증번호 재발송 제한 안내 토스트 추가
rkdcodus Jan 21, 2026
cd8456a
fix: 휴대폰 번호 형식 검증 로직을 추가합니다.
rkdcodus Jan 21, 2026
e434159
fix: 프로필 작성 페이지의 셀렉트 필드 포커스 이탈 시 셀렉트 목록이 닫히도록 수정합니다
rkdcodus Jan 27, 2026
c482156
feat: 지원서 작성 페이지 내 데이터 필드 추가 (#372)
WonJuneKim Feb 3, 2026
e7efbdb
Merge pull request #236 from JECT-Study/feat/221-radio
rkdcodus Feb 18, 2026
6edd349
fix: 인증번호 에러 토스트 문구를 수정합니다.
rkdcodus Feb 19, 2026
e0d4c80
Merge pull request #380 from JECT-Study/fix/373-apply-flow-bug
rkdcodus Feb 24, 2026
fb8da3e
release: 디자인 시스템 QA 대응 및 추가 디자인 시스템 구현 (#397)
ccconac Mar 12, 2026
df17f08
fix: 랜딩 페이지 통계 수치 및 문구 업데이트
itwillbeoptimal Mar 17, 2026
65cf870
feat: 5기 모집 알림 신청 버튼 활성화 및 링크 연결
itwillbeoptimal Mar 17, 2026
953bdc9
Merge pull request #404 from JECT-Study/feat/402-update-landing-stats…
itwillbeoptimal Mar 18, 2026
44abb37
fix: 지원 안내 페이지 섹션 너비 및 링크 레이아웃 수정
itwillbeoptimal Mar 18, 2026
d11629c
fix: 공통 에러 페이지 헤더 영역 침범 문제 및 패딩 수정
itwillbeoptimal Mar 18, 2026
5f9d232
fix: JDS 2차 QA 대응 (#408)
ccconac Mar 19, 2026
cc2bae6
Merge pull request #410 from JECT-Study/fix/409-apply-guide-and-error…
itwillbeoptimal Mar 22, 2026
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
8 changes: 8 additions & 0 deletions .changeset/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Changesets

Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets)

We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
11 changes: 11 additions & 0 deletions .changeset/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"$schema": "https://unpkg.com/@changesets/config@3.1.2/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [],
"access": "restricted",
"baseBranch": "dev",
"updateInternalDependencies": "patch",
"ignore": []
}
47 changes: 47 additions & 0 deletions .github/workflows/jds.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Release JDS Package

on:
push:
branches:
- dev
- 'refactor/jds'
paths:
- 'packages/jds/**'
- '.changeset/**'

concurrency: ${{ github.workflow }}-${{ github.ref }}

jobs:
release:
name: Release JDS
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write

steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'npm'

- name: Install Dependencies
run: npm ci

- name: Build JDS Only
run: npm run build --workspace=@jects/jds

- name: Publish to NPM
id: changesets
uses: changesets/action@v1
with:
publish: npx changeset publish
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
15 changes: 15 additions & 0 deletions apps/web/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# ject-official-website-client

## 0.0.1

### Patch Changes

- Updated dependencies [050b727]
- @jects/jds@0.0.1

## 0.0.1-next.0

### Patch Changes

- Updated dependencies [050b727]
- @ject/jds@1.0.0-next.0
6 changes: 3 additions & 3 deletions apps/web/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ject-official-website-client",
"private": true,
"version": "0.0.0",
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite",
Expand All @@ -20,7 +20,7 @@
"@emotion/react": "^11",
"@emotion/styled": "^11",
"@hookform/resolvers": "^4.1.3",
"@ject/jds": "*",
"@jects/jds": "0.0.1",
"@sentry/react": "^9.12.0",
"@sentry/vite-plugin": "^3.3.1",
"@tailwindcss/vite": "^4.0.0",
Expand All @@ -35,7 +35,7 @@
"react": "^18.3.1",
"react-device-detect": "^2.2.3",
"react-dom": "^18.3.1",
"react-error-boundary": "^6.0.0",
"react-error-boundary": "6.0.0",
"react-hook-form": "^7.54.2",
"react-router-dom": "^7.1.5",
"tailwindcss": "^4.0.0",
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import "./instrument";

import { ToastProvider } from "@ject/jds";
import { JDSThemeProvider } from "@ject/jds/theme";
import { ToastProvider } from "@jects/jds";
import { JDSThemeProvider } from "@jects/jds/theme";
import { MutationCache, QueryCache, QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
import { Suspense, useState } from "react";
Expand Down
1 change: 1 addition & 0 deletions apps/web/src/apis/apply/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ export const questionSchema = z.object({
inputType: questionInputTypeSchema,
isRequired: z.boolean(),
title: z.string(),
subtitle: z.string().nullable(),
label: z.string(),
selectOptions: z.array(z.string()).nullable(),
inputHint: z.string(),
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/common/footer/Footer.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Footer as FooterJds, Logo } from "@ject/jds";
import { Footer as FooterJds, Logo } from "@jects/jds";

function Footer() {
return (
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/components/gnb/GlobalNavigationBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import {
Logo,
SegmentedControl,
useGlobalNavigationVariant,
} from "@ject/jds";
import { useMediaQueryFlags } from "@ject/jds/hooks";
} from "@jects/jds";
import { useMediaQueryFlags } from "@jects/jds/hooks";
import type { MouseEvent } from "react";
import { useState } from "react";
import { useNavigate, useLocation } from "react-router-dom";
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/gnb/Menus.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { MegaMenu, MenuItem } from "@ject/jds";
import { MegaMenu, MenuItem } from "@jects/jds";
import type { MouseEvent } from "react";
import { useNavigate } from "react-router-dom";

Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/gnb/Sidebar.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Divider, IconButton, Label, MenuItem } from "@ject/jds";
import { Divider, IconButton, Label, MenuItem } from "@jects/jds";
import type { Dispatch, MouseEvent, SetStateAction } from "react";
import { useEffect } from "react";
import { createPortal } from "react-dom";
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/layout/ApplyLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BlockButton, LabelButton } from "@ject/jds";
import { BlockButton, LabelButton } from "@jects/jds";
import type { FallbackProps } from "react-error-boundary";
import { Outlet, useNavigate } from "react-router-dom";

Expand Down
6 changes: 4 additions & 2 deletions apps/web/src/components/main/sections/CycleSection.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Banner } from "@ject/jds";
import { Banner } from "@jects/jds";

import cycleVisionBannerImage from "@/assets/images/cycle-vision-banner.png";

Expand All @@ -9,7 +9,9 @@ const CycleSection = () => {
src={cycleVisionBannerImage}
isReadonly
title={"IT 생태계의\n선순환을 목표로 하는 젝트"}
subtitle={"사적인 이윤을 추구하지 않고,\n발생한 수익은 운영과 구성원을 위한 인프라에 재투자합니다."}
subtitle={
"사적인 이윤을 추구하지 않고,\n발생한 수익은 운영과 구성원을 위한 인프라에 재투자합니다."
}
/>
</section>
);
Expand Down
20 changes: 10 additions & 10 deletions apps/web/src/components/main/sections/HeroSection.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Hero, Icon, Label } from "@ject/jds";
import { Hero, Icon, Label } from "@jects/jds";
import { useEffect, useState } from "react";

import heroBackground from "@/assets/images/hero-background.png";
Expand All @@ -23,7 +23,7 @@ const RotatingText = () => {

useEffect(() => {
const interval = setInterval(() => {
setCurrentIndex((prev) => prev + 1);
setCurrentIndex(prev => prev + 1);
}, ANIMATION_CYCLE_MS);
return () => clearInterval(interval);
}, []);
Expand All @@ -49,17 +49,17 @@ const RotatingText = () => {
}, [currentIndex, isTransitioning]);

return (
<span className="inline-flex h-[1.2em] overflow-hidden align-middle">
<span className='inline-flex h-[1.2em] overflow-hidden align-middle'>
<span
className="flex flex-col ease-(--semantic-motion-bouncy)"
className='flex flex-col ease-(--semantic-motion-bouncy)'
style={{
transform: `translateY(-${currentIndex * 100}%)`,
transition: isTransitioning ? `transform ${ANIMATION_DURATION_MS}ms` : "none",
}}
>
{extendedItems.map((item, index) => (
<span key={index} className="flex h-[1.2em] items-center justify-center gap-2">
<Icon name={item.icon} size="4xl" color="currentColor" />
<span key={index} className='flex h-[1.2em] items-center justify-center gap-2'>
<Icon name={item.icon} size='4xl' color='currentColor' />
<span>{item.text}</span>
</span>
))}
Expand Down Expand Up @@ -89,19 +89,19 @@ const HeroSection = () => {
<div
className='absolute inset-0 z-2'
style={{
background: "linear-gradient(180deg, transparent 0%, transparent 50%, var(--semantic-surface-static-inverse-standard) 100%)",
background:
"linear-gradient(180deg, transparent 0%, transparent 50%, var(--semantic-surface-static-inverse-standard) 100%)",
}}
/>

<div className='relative z-10 flex h-full flex-col items-center justify-center'>
<div
style={{
background:
"radial-gradient(33.77% 43.9% at 50% 50%, #191B2480 0%, #191B2400 100%)",
background: "radial-gradient(33.77% 43.9% at 50% 50%, #191B2480 0%, #191B2400 100%)",
}}
>
<Hero size='xs' textAlign='center' color='white'>
<span className="flex flex-col items-center">
<span className='flex flex-col items-center'>
<span>젝트에서</span>
<RotatingText />
<span>경험해보세요.</span>
Expand Down
54 changes: 37 additions & 17 deletions apps/web/src/components/main/sections/IntroSection.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,30 @@
import { Callout, ContentBadge, EmptyState, Hero, Icon, Image, Label, LabelButton, Title as JdsTitle } from "@ject/jds";
import {
Callout,
ContentBadge,
EmptyState,
Hero,
Icon,
Image,
Label,
LabelButton,
Title as JdsTitle,
} from "@jects/jds";
import { useNavigate } from "react-router-dom";

import introTeamMeetingImage from "@/assets/images/intro-team-meeting.png";
import { positionData, programData, statData } from "@/constants/mainPageData";

const wrapperClassName = "gap-(--semantic-spacing-48) flex w-full max-w-[922px] flex-col items-start";
const wrapperClassName =
"gap-(--semantic-spacing-48) flex w-full max-w-[922px] flex-col items-start";

const positionCardStyles = {
green: "bg-[var(--semantic-theme-green-alpha-subtlest)] border-[var(--semantic-theme-green-alpha-subtler)]",
green:
"bg-[var(--semantic-theme-green-alpha-subtlest)] border-[var(--semantic-theme-green-alpha-subtler)]",
sky: "bg-[var(--semantic-theme-sky-alpha-subtlest)] border-[var(--semantic-theme-sky-alpha-subtler)]",
orange: "bg-[var(--semantic-theme-orange-alpha-subtlest)] border-[var(--semantic-theme-orange-alpha-subtler)]",
purple: "bg-[var(--semantic-theme-purple-alpha-subtlest)] border-[var(--semantic-theme-purple-alpha-subtler)]",
orange:
"bg-[var(--semantic-theme-orange-alpha-subtlest)] border-[var(--semantic-theme-orange-alpha-subtler)]",
purple:
"bg-[var(--semantic-theme-purple-alpha-subtlest)] border-[var(--semantic-theme-purple-alpha-subtler)]",
} as const;

const IntroSection = () => {
Expand All @@ -33,7 +47,9 @@ const IntroSection = () => {

<div className='flex flex-col items-start gap-(--semantic-spacing-40)'>
<div className='flex flex-col items-start gap-(--semantic-spacing-24)'>
<Hero size='xs' textAlign='left'>IT 동아리 젝트</Hero>
<Hero size='xs' textAlign='left'>
IT 동아리 젝트
</Hero>
<div className='flex flex-col gap-(--semantic-spacing-8)'>
<p className='body-lg font-(--primitive-font-weight-body-bold) text-(--semantic-object-normal)'>
젝트는 개발, 기획(매니지먼트), 디자인 관련 포지션의 팀원들이 한 팀이 되어 실제
Expand All @@ -47,22 +63,22 @@ const IntroSection = () => {
</div>

<div className='flex w-full flex-col gap-(--semantic-spacing-10)'>
<div className='grid w-full grid-cols-1 gap-(--semantic-spacing-16) tablet:grid-cols-2 desktop:grid-cols-3'>
<div className='tablet:grid-cols-2 desktop:grid-cols-3 grid w-full grid-cols-1 gap-(--semantic-spacing-16)'>
{statData.map(({ id, title, description, isFullWidth }) => (
<Callout.Basic
key={id}
hierarchy='primary'
variant='hint'
size='lg'
title={title}
className={isFullWidth ? 'tablet:col-span-2 desktop:col-span-1' : undefined}
className={isFullWidth ? "tablet:col-span-2 desktop:col-span-1" : undefined}
>
{description}
</Callout.Basic>
))}
</div>
<Label as='span' size='sm' weight='normal' color='var(--semantic-object-assistive)'>
*현 3기 기준, 진행 완료 및 진행중 프로젝트 포함.
*현 4기 기준, 진행 완료 및 진행중 프로젝트 포함.
</Label>
</div>

Expand All @@ -79,13 +95,15 @@ const IntroSection = () => {

{/* 다양한 포지션들이 젝트와 함께합니다 */}
<div className={wrapperClassName}>
<Hero size='xs' textAlign='left'>다양한 포지션들이 젝트와 함께합니다</Hero>
<Hero size='xs' textAlign='left'>
다양한 포지션들이 젝트와 함께합니다
</Hero>

<div className='grid w-full grid-cols-1 gap-(--semantic-spacing-16) tablet:grid-cols-2'>
<div className='tablet:grid-cols-2 grid w-full grid-cols-1 gap-(--semantic-spacing-16)'>
{positionData.map(({ id, title, icon, description, tags, themeColor }) => (
<div
key={id}
className={`flex flex-col gap-(--semantic-spacing-16) rounded-(--semantic-radius-6) px-(--semantic-spacing-24) py-(--semantic-spacing-20) border ${positionCardStyles[themeColor]}`}
className={`flex flex-col gap-(--semantic-spacing-16) rounded-(--semantic-radius-6) border px-(--semantic-spacing-24) py-(--semantic-spacing-20) ${positionCardStyles[themeColor]}`}
>
<div className='flex items-center gap-(--semantic-spacing-8)'>
<Icon name={icon} size='2xl' />
Expand All @@ -97,7 +115,7 @@ const IntroSection = () => {
{description}
</p>
<div className='flex flex-wrap gap-(--semantic-spacing-8)'>
{tags.map((tag) => (
{tags.map(tag => (
<ContentBadge.Theme
key={tag}
variant={themeColor}
Expand All @@ -116,21 +134,23 @@ const IntroSection = () => {

{/* 프로그램들 */}
<div className={wrapperClassName}>
<Hero size='xs' textAlign='left'>구성원들의 성장을 돕는 프로그램들을 운영합니다</Hero>
<Hero size='xs' textAlign='left'>
구성원들의 성장을 돕는 프로그램들을 운영합니다
</Hero>

<div className='grid w-full grid-cols-1 gap-(--semantic-spacing-16) tablet:grid-cols-2'>
<div className='tablet:grid-cols-2 grid w-full grid-cols-1 gap-(--semantic-spacing-16)'>
{programData.map(({ id, title, description }) => (
<Callout.Basic
key={id}
hierarchy={id === 1 ? 'accent' : 'secondary'}
hierarchy={id === 1 ? "accent" : "secondary"}
variant='hint'
size='md'
title={`${id}. ${title}`}
>
{description}
</Callout.Basic>
))}
<div className='col-span-full tablet:col-span-1 [&>div]:max-w-full! [&>div]:w-full [&>div]:h-full'>
<div className='tablet:col-span-1 col-span-full [&>div]:h-full [&>div]:w-full [&>div]:max-w-full!'>
<EmptyState
variant='outlined'
header='그 밖에 더 많은 활동들이 기다리고 있어요...'
Expand Down
Loading
Loading