Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
617247a
feat: 공통 inputBox 컴포넌트 구현
jaeu5325 Jan 28, 2026
d4c516a
feat: 코드 컨벤션에 맞춰 수정
jaeu5325 Feb 2, 2026
1baf502
feat: defaultValue 값 오류 수정
jaeu5325 Feb 3, 2026
dd8a233
Update src/shared/ui/inputBox/inputBox.tsx
jaeu5325 Feb 18, 2026
1f1df74
feat/tabs코드오류수정
jaeu5325 Feb 25, 2026
41b0ade
feat : test
jaeu5325 Feb 25, 2026
2c0becf
feat/dev 내용 pull
jaeu5325 Mar 10, 2026
e7a88db
feat/shared-tabs 코드컨벤션 수정
jaeu5325 Mar 11, 2026
57fb44d
feat: tabs수정사항 반영
jaeu5325 Mar 17, 2026
46a1ed1
feat/수정사항 반영
jaeu5325 Mar 21, 2026
16212bd
Merge branch 'dev' of https://github.com/ajou-industry-matching/aim-f…
jaeu5325 Mar 28, 2026
3d9e882
feat: lists & tables 구현 v1
jaeu5325 Mar 28, 2026
407b599
feat: avatars 구현 v1
jaeu5325 Mar 28, 2026
d8a72fd
feat: lists & tables 구현 v2
jaeu5325 Mar 28, 2026
ab8ea0e
Merge branch 'feat/shared-list' of https://github.com/ajou-industry-m…
jaeu5325 Mar 28, 2026
fad55fa
feat: avatars 구현 v2
jaeu5325 Mar 28, 2026
13f1912
feat: emptyStates 구현 v1
jaeu5325 Mar 28, 2026
65a4240
feat: lists & tables 아이콘 수정
jaeu5325 Mar 28, 2026
75c65a2
Merge branch 'feat/shared-list' of https://github.com/ajou-industry-m…
jaeu5325 Mar 28, 2026
120165a
feat: avatars 아이콘 수정
jaeu5325 Mar 28, 2026
b35110c
Merge branch 'feat/shared-avatars' of https://github.com/ajou-industr…
jaeu5325 Mar 28, 2026
fe19606
Update src/shared/ui/lists/lists.stories.tsx
jaeu5325 Mar 28, 2026
f0eb700
Update Storybook import path for emptyStates
jaeu5325 Mar 28, 2026
0b0a672
feat: emptyStates 피드백반영 v1
jaeu5325 Mar 30, 2026
5ec4a0c
feat: emptyStates 피드백반영 v2
jaeu5325 Mar 30, 2026
3934d3e
chore: empty-states.stories.tsx 병합 충돌 해결
jaeu5325 Mar 30, 2026
006b1dd
feat: avatars 수정사항반영
jaeu5325 Mar 31, 2026
519684b
Merge branch 'feat/shared-avatars' of https://github.com/ajou-industr…
jaeu5325 Mar 31, 2026
55039d4
feat: lists 수정사항반영
jaeu5325 Mar 31, 2026
a3b93c9
Merge branch 'feat/shared-list' of https://github.com/ajou-industry-m…
jaeu5325 Mar 31, 2026
d6b6021
Merge branch 'feat/shared-avatars' of https://github.com/ajou-industr…
jaeu5325 Mar 31, 2026
467f112
feat: progress bar 구현 v1
jaeu5325 Apr 4, 2026
930f16c
merge: 머지 충돌 해결
sebeeeen Apr 6, 2026
4c95c61
fix: Next.js 호환성 개선
sebeeeen Apr 6, 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
3 changes: 3 additions & 0 deletions next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ const nextConfig: NextConfig = {
allowedDevOrigins: ["10.250.174.185", "10.250.203.166"],
output: "export",
trailingSlash: true,
images: {
unoptimized: true, // static export 환경에서 next/image 사용 시 필요
},
};

export default nextConfig;
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions src/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -244,3 +244,37 @@ body {
.shadow-lg {
box-shadow: var(--shadow-lg);
}

@layer utilities {
/* 프로그레스 바 빗살무늬 배경 */
.bg-stripes {
background-image: linear-gradient(
45deg,
rgba(255, 255, 255, 0.15) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, 0.15) 50%,
rgba(255, 255, 255, 0.15) 75%,
transparent 75%,
transparent
);
background-size: 1rem 1rem; /* 빗살무늬 크기 조절 */
}

/* 프로그레스 바 빗살무늬 애니메이션 */
@keyframes progress-stripes {
0% { background-position: 1rem 0; }
100% { background-position: 0 0; }
}
.animate-progress-stripes {
animation: progress-stripes 1s linear infinite;
}

/* 스켈레톤 로더 애니메이션 */
@keyframes shimmer {
100% { transform: translateX(100%); }
}
.animate-shimmer {
animation: shimmer 1.5s infinite;
}
}
7 changes: 2 additions & 5 deletions src/shared/ui/avatars/avatars.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React from "react";
import Image from "next/image";
// 1. 공통 아이콘 Import 추가
import { UserSolidIcon } from "../icons";

Expand Down Expand Up @@ -124,11 +125,7 @@ export const Avatar = ({
<div className={avatarClasses} onClick={onClick}>
{/* 1. 이미지 우선 렌더링 */}
{src ? (
<img
src={src}
alt={name || "User avatar"}
className="w-full h-full object-cover rounded-full"
/>
<Image src={src} alt={name || "User avatar"} fill className="object-cover rounded-full" />
) : /* 2. 이미지가 없으면 이름 이니셜 */
name ? (
<span className={`${avatarTextSizeClasses[size]} tracking-tight`}>{getInitial(name)}</span>
Expand Down
7 changes: 5 additions & 2 deletions src/shared/ui/lists/lists.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React from "react";
import Image from "next/image";
// 공통 아이콘 Import 추가
import { ChevronRightIcon, InboxIcon } from "../icons";

Expand Down Expand Up @@ -169,10 +170,12 @@ export const ListItem = ({

{/* 썸네일 이미지 */}
{imageUrl && (
<img
<Image
src={imageUrl}
alt={title}
className="w-[48px] h-[48px] rounded-[8px] object-cover flex-shrink-0 border border-[color:var(--color-gray-200,#E5E5E5)]"
width={48}
height={48}
className="rounded-[8px] object-cover flex-shrink-0 border border-[color:var(--color-gray-200,#E5E5E5)]"
/>
)}

Expand Down
126 changes: 126 additions & 0 deletions src/shared/ui/progress/progress.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import type { Meta, StoryObj } from "@storybook/nextjs";
import { ProgressBar, CircularProgress, Spinner, Skeleton } from "./progress";

// ==========================================
// Meta
// ==========================================
const meta = {
title: "Shared/UI/Progress",
component: ProgressBar,
parameters: {
layout: "padded",
componentSubtitle: "시스템의 진행 상태나 로딩 상태를 시각적으로 보여주는 컴포넌트들",
},
tags: ["autodocs"],
argTypes: {
value: {
control: { type: "range", min: 0, max: 100 },
description: "진행률 (0~100)",
},
variant: {
control: "select",
options: ["primary", "success", "warning", "error"],
description: "프로그레스 바의 색상 테마",
},
size: {
control: "select",
options: ["thin", "medium", "thick"],
description: "프로그레스 바의 두께",
},
hasStripes: { control: "boolean", description: "빗살무늬 패턴 적용 여부" },
isAnimated: { control: "boolean", description: "빗살무늬 애니메이션 적용 여부" },
labelPosition: {
control: "select",
options: ["none", "top", "inside"],
description: "라벨(퍼센트) 표시 위치",
},
},
} satisfies Meta<typeof ProgressBar>;

export default meta;
type Story = StoryObj<typeof meta>;

// ==========================================
// ProgressBar Stories
// ==========================================
export const DefaultBar: Story = {
args: {
value: 45,
variant: "primary",
size: "medium",
hasStripes: false,
isAnimated: false,
labelPosition: "none",
},
};

export const StripedAnimatedBar: Story = {
args: {
value: 75,
variant: "primary",
size: "thick",
hasStripes: true,
isAnimated: true,
labelPosition: "inside",
},
};

// ==========================================
// Circular Progress
// ==========================================
export const Circular: StoryObj<typeof CircularProgress> = {
render: () => (
<div className="flex items-end gap-8">
<CircularProgress value={25} size="small" />
<CircularProgress value={45} size="medium" />
<CircularProgress value={75} size="large" />
</div>
),
};

// ==========================================
// Spinner
// ==========================================
export const LoadingSpinner: StoryObj<typeof Spinner> = {
render: () => (
<div className="flex items-end gap-8">
<Spinner size="small" />
<Spinner size="medium" />
<Spinner size="large" />
</div>
),
};

// ==========================================
// Skeleton Loader
// ==========================================
export const SkeletonLoader: StoryObj<typeof Skeleton> = {
render: () => (
<div className="flex flex-col gap-8 max-w-[400px]">
<div>
<h3 className="text-sm font-bold mb-4">🏗️ Card Skeleton Example</h3>
<div className="border border-[color:var(--color-gray-200,#E5E5E5)] rounded-xl p-4 flex flex-col gap-4 w-full">
{/* Image placeholder */}
<Skeleton shape="rectangle" />

<div className="flex flex-col gap-2 mt-2">
{/* Title */}
<Skeleton shape="title" />
{/* Lines */}
<Skeleton shape="text" className="w-[90%]" />
<Skeleton shape="text" className="w-[70%]" />
</div>

{/* Avatar + Meta */}
<div className="flex items-center gap-3 mt-4">
<Skeleton shape="circle" />
<div className="flex flex-col gap-2 flex-1">
<Skeleton shape="text" className="w-[40%]" />
<Skeleton shape="text" className="w-[30%]" />
</div>
</div>
</div>
</div>
</div>
),
};
Loading