@1d1s/design-system 0.2.33 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AchievementBadge/AchievementBadge.d.ts +29 -0
- package/dist/components/AchievementBadge/AchievementBadge.stories.d.ts +9 -0
- package/dist/components/AchievementBadge/index.d.ts +1 -0
- package/dist/components/Banner/Banner.d.ts +36 -0
- package/dist/components/Banner/Banner.stories.d.ts +9 -0
- package/dist/components/Banner/index.d.ts +1 -0
- package/dist/components/BottomNav/BottomNav.d.ts +34 -0
- package/dist/components/BottomNav/BottomNav.stories.d.ts +7 -0
- package/dist/components/BottomNav/index.d.ts +1 -0
- package/dist/components/Button/Button.d.ts +23 -11
- package/dist/components/Button/Button.stories.d.ts +7 -7
- package/dist/components/Card/Card.d.ts +51 -0
- package/dist/components/Card/Card.stories.d.ts +8 -0
- package/dist/components/Card/index.d.ts +1 -0
- package/dist/components/Checkbox/Checkbox.d.ts +9 -4
- package/dist/components/Checkbox/Checkbox.stories.d.ts +2 -1
- package/dist/components/CircleAvatar/CircleAvatar.d.ts +30 -2
- package/dist/components/CircleAvatar/CircleAvatar.stories.d.ts +5 -0
- package/dist/components/CircularProgress/CircularProgress.d.ts +23 -16
- package/dist/components/CircularProgress/CircularProgress.stories.d.ts +5 -2
- package/dist/components/CommentRow/CommentRow.d.ts +30 -0
- package/dist/components/CommentRow/CommentRow.stories.d.ts +8 -0
- package/dist/components/CommentRow/index.d.ts +1 -0
- package/dist/components/Dropdown/Dropdown.d.ts +24 -45
- package/dist/components/Dropdown/Dropdown.stories.d.ts +8 -4
- package/dist/components/Dropdown/DropdownMenu.d.ts +29 -0
- package/dist/components/Dropdown/MultiSelect.d.ts +26 -0
- package/dist/components/Dropdown/index.d.ts +2 -0
- package/dist/components/Heatmap/Heatmap.d.ts +35 -0
- package/dist/components/Heatmap/Heatmap.stories.d.ts +8 -0
- package/dist/components/Heatmap/index.d.ts +1 -0
- package/dist/components/Icons/Home.d.ts +2 -0
- package/dist/components/Icons/LayoutGrid.d.ts +2 -0
- package/dist/components/Icons/index.d.ts +2 -0
- package/dist/components/ProgressBar/ProgressBar.d.ts +20 -3
- package/dist/components/ProgressBar/ProgressBar.stories.d.ts +1 -0
- package/dist/components/Radio/Radio.d.ts +46 -0
- package/dist/components/Radio/Radio.stories.d.ts +9 -0
- package/dist/components/Radio/index.d.ts +1 -0
- package/dist/components/SectionHeader/SectionHeader.d.ts +31 -0
- package/dist/components/SectionHeader/SectionHeader.stories.d.ts +9 -0
- package/dist/components/SectionHeader/index.d.ts +1 -0
- package/dist/components/StatCard/StatCard.d.ts +29 -0
- package/dist/components/StatCard/StatCard.stories.d.ts +9 -0
- package/dist/components/StatCard/index.d.ts +1 -0
- package/dist/components/StatusBadge/StatusBadge.d.ts +28 -0
- package/dist/components/StatusBadge/StatusBadge.stories.d.ts +8 -0
- package/dist/components/StatusBadge/index.d.ts +1 -0
- package/dist/components/Streak/StreakChip.d.ts +20 -0
- package/dist/components/Streak/StreakChip.stories.d.ts +8 -0
- package/dist/components/Streak/StreakHero.d.ts +23 -0
- package/dist/components/Streak/StreakHero.stories.d.ts +8 -0
- package/dist/components/Streak/index.d.ts +2 -1
- package/dist/components/Stripe/Stripe.d.ts +29 -0
- package/dist/components/Stripe/Stripe.stories.d.ts +9 -0
- package/dist/components/Stripe/index.d.ts +1 -0
- package/dist/components/Tabs/Tabs.d.ts +37 -0
- package/dist/components/Tabs/Tabs.stories.d.ts +9 -0
- package/dist/components/Tabs/index.d.ts +1 -0
- package/dist/components/Tag/ChallengeTag.d.ts +19 -0
- package/dist/components/Tag/ChallengeTag.stories.d.ts +8 -0
- package/dist/components/Tag/FilterChip.d.ts +25 -0
- package/dist/components/Tag/Tag.d.ts +16 -14
- package/dist/components/Tag/Tag.stories.d.ts +6 -1
- package/dist/components/Tag/index.d.ts +2 -0
- package/dist/components/Text/Text.d.ts +2 -2
- package/dist/components/TextField/TextArea.d.ts +23 -0
- package/dist/components/TextField/TextArea.stories.d.ts +10 -0
- package/dist/components/TextField/TextField.d.ts +30 -13
- package/dist/components/TextField/TextField.stories.d.ts +7 -4
- package/dist/components/TextField/index.d.ts +1 -0
- package/dist/components/Toggle/Toggle.d.ts +14 -13
- package/dist/components/Toggle/Toggle.stories.d.ts +5 -5
- package/dist/components/TopNav/TopNav.d.ts +55 -0
- package/dist/components/TopNav/TopNav.stories.d.ts +8 -0
- package/dist/components/TopNav/index.d.ts +1 -0
- package/dist/components/index.d.ts +14 -25
- package/dist/index.es.js +3053 -11804
- package/dist/index.umd.js +1 -45
- package/package.json +2 -25
- package/src/styles/animation.css +109 -35
- package/src/styles/colors.css +25 -2
- package/src/styles/globals.css +1 -3
- package/src/styles/shadow.css +11 -1
- package/src/styles/shape.css +4 -0
- package/src/styles/typography.css +31 -11
- package/dist/components/Accordion/Accordion.d.ts +0 -47
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -8
- package/dist/components/Accordion/index.d.ts +0 -1
- package/dist/components/AppHeader/AppHeader.d.ts +0 -26
- package/dist/components/AppHeader/AppHeader.stories.d.ts +0 -9
- package/dist/components/AppHeader/index.d.ts +0 -1
- package/dist/components/AvatarImagePicker/AvatarImagePicker.d.ts +0 -24
- package/dist/components/AvatarImagePicker/AvatarImagePicker.stories.d.ts +0 -7
- package/dist/components/AvatarImagePicker/index.d.ts +0 -1
- package/dist/components/BannerCarousel/BannerCarousel.d.ts +0 -42
- package/dist/components/BannerCarousel/BannerCarousel.stories.d.ts +0 -10
- package/dist/components/BannerCarousel/index.d.ts +0 -1
- package/dist/components/Calendar/Calendar.d.ts +0 -4
- package/dist/components/Calendar/Calendar.stories.d.ts +0 -15
- package/dist/components/Calendar/index.d.ts +0 -1
- package/dist/components/CheckContainer/CheckContainer.d.ts +0 -17
- package/dist/components/CheckContainer/CheckContainer.stories.d.ts +0 -9
- package/dist/components/CheckContainer/index.d.ts +0 -1
- package/dist/components/CheckList/CheckList.d.ts +0 -37
- package/dist/components/CheckList/CheckList.stories.d.ts +0 -9
- package/dist/components/CheckList/index.d.ts +0 -1
- package/dist/components/CommentThread/CommentThread.d.ts +0 -31
- package/dist/components/CommentThread/CommentThread.stories.d.ts +0 -9
- package/dist/components/CommentThread/index.d.ts +0 -1
- package/dist/components/DatePicker/DatePicker.d.ts +0 -26
- package/dist/components/DatePicker/DatePicker.stories.d.ts +0 -7
- package/dist/components/DatePicker/index.d.ts +0 -1
- package/dist/components/Dialog/Dialog.d.ts +0 -13
- package/dist/components/Dialog/Dialog.stories.d.ts +0 -9
- package/dist/components/Dialog/index.d.ts +0 -1
- package/dist/components/GoalAddList/GoalAddList.d.ts +0 -16
- package/dist/components/GoalAddList/GoalAddList.stories.d.ts +0 -7
- package/dist/components/GoalAddList/index.d.ts +0 -1
- package/dist/components/ImagePicker/ImagePicker.d.ts +0 -50
- package/dist/components/ImagePicker/ImagePicker.stories.d.ts +0 -8
- package/dist/components/ImagePicker/index.d.ts +0 -1
- package/dist/components/ImagePlaceholder/ImagePlaceholder.d.ts +0 -11
- package/dist/components/ImagePlaceholder/index.d.ts +0 -1
- package/dist/components/InfoButton/InfoButton.d.ts +0 -20
- package/dist/components/InfoButton/InfoButton.stories.d.ts +0 -9
- package/dist/components/InfoButton/index.d.ts +0 -1
- package/dist/components/Layout/Layout.d.ts +0 -69
- package/dist/components/Layout/Layout.stories.d.ts +0 -7
- package/dist/components/Layout/LayoutContext.d.ts +0 -12
- package/dist/components/Layout/index.d.ts +0 -2
- package/dist/components/PageWatermark/PageWatermark.d.ts +0 -1
- package/dist/components/PageWatermark/PageWatermark.stories.d.ts +0 -6
- package/dist/components/PageWatermark/index.d.ts +0 -1
- package/dist/components/Pagination/Pagination.d.ts +0 -14
- package/dist/components/Pagination/Pagination.stories.d.ts +0 -9
- package/dist/components/Pagination/index.d.ts +0 -1
- package/dist/components/Profile/Profile.d.ts +0 -37
- package/dist/components/Profile/Profile.stories.d.ts +0 -12
- package/dist/components/Profile/index.d.ts +0 -1
- package/dist/components/RightSidebar/RightSidebar.d.ts +0 -41
- package/dist/components/RightSidebar/RightSidebar.stories.d.ts +0 -14
- package/dist/components/RightSidebar/index.d.ts +0 -1
- package/dist/components/ScheduleCalendar/ScheduleCalendar.d.ts +0 -31
- package/dist/components/ScheduleCalendar/ScheduleCalendar.stories.d.ts +0 -10
- package/dist/components/ScheduleCalendar/index.d.ts +0 -1
- package/dist/components/StatContainer/StatContainer.d.ts +0 -15
- package/dist/components/StatContainer/StatContainer.stories.d.ts +0 -7
- package/dist/components/StatContainer/index.d.ts +0 -1
- package/dist/components/StepIndicator/StepIndicator.d.ts +0 -19
- package/dist/components/StepIndicator/StepIndicator.stories.d.ts +0 -10
- package/dist/components/StepIndicator/index.d.ts +0 -1
- package/dist/components/Streak/Streak.d.ts +0 -31
- package/dist/components/Streak/Streak.stories.d.ts +0 -12
- package/dist/components/ToggleGroup/ToggleGroup.d.ts +0 -21
- package/dist/components/ToggleGroup/ToggleGroup.stories.d.ts +0 -8
- package/dist/components/ToggleGroup/index.d.ts +0 -1
- package/dist/components/Tooltip/Tooltip.d.ts +0 -7
- package/dist/components/Tooltip/Tooltip.stories.d.ts +0 -7
- package/dist/components/Tooltip/index.d.ts +0 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { VariantProps } from 'class-variance-authority';
|
|
3
|
+
declare const badgeVariants: (props?: ({
|
|
4
|
+
tone?: "main" | "peach" | "mint" | "blue" | "green" | "gray" | null | undefined;
|
|
5
|
+
layout?: "vertical" | "horizontal" | null | undefined;
|
|
6
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
7
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
8
|
+
export interface AchievementBadgeProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children">, VariantProps<typeof badgeVariants> {
|
|
9
|
+
/** 배지 이모지 또는 아이콘 */
|
|
10
|
+
emoji: React.ReactNode;
|
|
11
|
+
/** 배지 라벨 */
|
|
12
|
+
label: React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* AchievementBadge
|
|
16
|
+
* 마이페이지 / 프로필에 사용하는 업적 배지.
|
|
17
|
+
*
|
|
18
|
+
* @param tone `main` (default) · `peach` · `mint` · `blue` · `green` · `gray`
|
|
19
|
+
* @param layout `vertical` (default) · `horizontal`
|
|
20
|
+
* @param size `sm` · `md` (default) · `lg`
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <AchievementBadge emoji="🔥" label="14일 연속" tone="main" />
|
|
25
|
+
* <AchievementBadge emoji="🏆" label="첫 완주" tone="peach" layout="horizontal" />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function AchievementBadge({ emoji, label, tone, layout, size, className, ...props }: AchievementBadgeProps): React.ReactElement;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { AchievementBadge } from './AchievementBadge';
|
|
3
|
+
declare const meta: Meta<typeof AchievementBadge>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof AchievementBadge>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const Tones: Story;
|
|
8
|
+
export declare const Horizontal: Story;
|
|
9
|
+
export declare const Sizes: Story;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './AchievementBadge';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { VariantProps } from 'class-variance-authority';
|
|
3
|
+
import { StatusBadgeKind } from '../StatusBadge';
|
|
4
|
+
declare const bannerVariants: (props?: ({
|
|
5
|
+
tone?: "mint" | "blue" | "gray" | "orange" | "purple" | null | undefined;
|
|
6
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
7
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
8
|
+
export interface BannerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title">, VariantProps<typeof bannerVariants> {
|
|
9
|
+
/** 좌상단 상태 라벨 (NEW/HOT/TIP) — string도 허용 */
|
|
10
|
+
kind?: StatusBadgeKind | string;
|
|
11
|
+
/** 제목 — `\n`은 줄바꿈으로 렌더링됨 */
|
|
12
|
+
title: React.ReactNode;
|
|
13
|
+
/** 부제 */
|
|
14
|
+
subtitle?: React.ReactNode;
|
|
15
|
+
/** 우측 슬롯 (CTA / 데코) */
|
|
16
|
+
action?: React.ReactNode;
|
|
17
|
+
/** 사용자 정의 background (CSS 값). 지정 시 tone 무시 */
|
|
18
|
+
bg?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Banner
|
|
22
|
+
* 풀블리드 그라디언트 히어로 배너 — 홈/마이페이지 등.
|
|
23
|
+
*
|
|
24
|
+
* @param tone `orange` (default) · `mint` · `blue` · `purple` · `gray`
|
|
25
|
+
* @param size `sm` · `md` (default) · `lg`
|
|
26
|
+
* @param kind 좌상단 상태 라벨 (StatusBadge inline 형태)
|
|
27
|
+
* @param bg CSS background — 지정 시 tone 무시
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* <Banner kind="NEW" title={'5월 챌린지\n시즌 오픈!'} subtitle="함께 도전할 챌린저를 찾아보세요" />
|
|
32
|
+
* <Banner tone="mint" kind="TIP" title="꾸준함이 실력이 됩니다" />
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function Banner({ kind, title, subtitle, action, tone, size, bg, className, style, ...props }: BannerProps): React.ReactElement;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { Banner } from './Banner';
|
|
3
|
+
declare const meta: Meta<typeof Banner>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof Banner>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const Tones: Story;
|
|
8
|
+
export declare const WithAction: Story;
|
|
9
|
+
export declare const CustomBg: Story;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Banner';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface BottomNavItem {
|
|
3
|
+
id: string;
|
|
4
|
+
/** 아이콘 노드 (또는 active/inactive 분기용 함수) */
|
|
5
|
+
icon: React.ReactNode | ((active: boolean) => React.ReactNode);
|
|
6
|
+
label: React.ReactNode;
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
}
|
|
9
|
+
export interface BottomNavProps extends Omit<React.HTMLAttributes<HTMLElement>, "children" | "onChange"> {
|
|
10
|
+
items: BottomNavItem[];
|
|
11
|
+
/** 활성 항목의 id */
|
|
12
|
+
activeId?: string;
|
|
13
|
+
/** 항목 클릭 시 호출 (item.onClick보다 먼저 호출됨) */
|
|
14
|
+
onChange?: (id: string) => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* BottomNav
|
|
18
|
+
* 모바일 하단 sticky 내비게이션. 4개 탭이 일반적이지만 가변.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <BottomNav
|
|
23
|
+
* activeId={tab}
|
|
24
|
+
* onChange={setTab}
|
|
25
|
+
* items={[
|
|
26
|
+
* { id: 'home', icon: <Home />, label: '홈' },
|
|
27
|
+
* { id: 'challenge', icon: <Grid />, label: '챌린지' },
|
|
28
|
+
* { id: 'diary', icon: <Book />, label: '일지' },
|
|
29
|
+
* { id: 'mypage', icon: <User />, label: '마이' },
|
|
30
|
+
* ]}
|
|
31
|
+
* />
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function BottomNav({ items, activeId, onChange, className, ...props }: BottomNavProps): React.ReactElement;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { BottomNav } from './BottomNav';
|
|
3
|
+
declare const meta: Meta<typeof BottomNav>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof BottomNav>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const ActiveStrokeBoost: Story;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './BottomNav';
|
|
@@ -1,21 +1,33 @@
|
|
|
1
1
|
import { VariantProps } from 'class-variance-authority';
|
|
2
|
-
declare const
|
|
3
|
-
variant?: "
|
|
4
|
-
size?: "
|
|
2
|
+
declare const buttonVariants: (props?: ({
|
|
3
|
+
variant?: "primary" | "secondary" | "soft" | "ghost" | "danger" | null | undefined;
|
|
4
|
+
size?: "sm" | "md" | "lg" | "icon" | "xs" | "xl" | null | undefined;
|
|
5
|
+
pill?: boolean | null | undefined;
|
|
6
|
+
fullWidth?: boolean | null | undefined;
|
|
5
7
|
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
6
|
-
export interface ButtonProps extends React.ComponentProps<"button">, VariantProps<typeof
|
|
8
|
+
export interface ButtonProps extends Omit<React.ComponentProps<"button">, "size">, VariantProps<typeof buttonVariants> {
|
|
9
|
+
/** asChild로 렌더링하면 자식 엘리먼트에 버튼 props를 머지 (Radix Slot) */
|
|
7
10
|
asChild?: boolean;
|
|
11
|
+
/** 라벨 좌측 아이콘 */
|
|
12
|
+
iconLeft?: React.ReactNode;
|
|
13
|
+
/** 라벨 우측 아이콘 */
|
|
14
|
+
iconRight?: React.ReactNode;
|
|
8
15
|
}
|
|
9
16
|
/**
|
|
10
|
-
* Button
|
|
11
|
-
* 커스텀 버튼 컴포넌트
|
|
12
|
-
* @param variant 버튼스타일 : default, outlined, secondary, ghost
|
|
13
|
-
* @param size 버튼 크기 : small, medium, large, icon
|
|
17
|
+
* Button v3
|
|
14
18
|
*
|
|
15
|
-
* @
|
|
19
|
+
* @param variant `primary` (default) · `secondary` · `soft` · `ghost` · `danger`
|
|
20
|
+
* @param size `xs` · `sm` · `md` (default) · `lg` · `xl` · `icon`
|
|
21
|
+
* @param pill 둥근 알약형 (rounded-full)
|
|
22
|
+
* @param fullWidth 부모 너비 100%
|
|
23
|
+
* @param iconLeft / iconRight 라벨 양옆 아이콘
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
16
26
|
* ```tsx
|
|
17
|
-
* <Button variant="
|
|
27
|
+
* <Button variant="primary" size="lg" iconLeft={<Plus />}>
|
|
28
|
+
* 새 챌린지
|
|
29
|
+
* </Button>
|
|
18
30
|
* ```
|
|
19
31
|
*/
|
|
20
|
-
export declare function Button({ className, variant, size, asChild, disabled, ...props }: ButtonProps): React.ReactElement;
|
|
32
|
+
export declare function Button({ className, variant, size, pill, fullWidth, asChild, disabled, iconLeft, iconRight, children, ...props }: ButtonProps): React.ReactElement;
|
|
21
33
|
export {};
|
|
@@ -3,11 +3,11 @@ import { Button } from './Button';
|
|
|
3
3
|
declare const meta: Meta<typeof Button>;
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof Button>;
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const
|
|
10
|
-
export declare const
|
|
11
|
-
export declare const
|
|
6
|
+
export declare const Primary: Story;
|
|
7
|
+
export declare const Sizes: Story;
|
|
8
|
+
export declare const Variants: Story;
|
|
9
|
+
export declare const WithIcons: Story;
|
|
10
|
+
export declare const Pill: Story;
|
|
11
|
+
export declare const FullWidth: Story;
|
|
12
|
+
export declare const IconOnly: Story;
|
|
12
13
|
export declare const Disabled: Story;
|
|
13
|
-
export declare const Icon: Story;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { VariantProps } from 'class-variance-authority';
|
|
3
|
+
declare const cardVariants: (props?: ({
|
|
4
|
+
radius?: "sm" | "md" | "lg" | "xl" | null | undefined;
|
|
5
|
+
interactive?: boolean | null | undefined;
|
|
6
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
7
|
+
export interface CardProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Card
|
|
11
|
+
* 흰 배경 + 얇은 보더 + 라운드 컨테이너. 챌린지/일지/스탯 카드의 베이스.
|
|
12
|
+
*
|
|
13
|
+
* @param radius `sm`(8) · `md`(12) · `lg`(14, default) · `xl`(16)
|
|
14
|
+
* @param interactive hover lift + shadow
|
|
15
|
+
*/
|
|
16
|
+
export declare function Card({ radius, interactive, className, ...props }: CardProps): React.ReactElement;
|
|
17
|
+
export declare namespace Card {
|
|
18
|
+
var Thumb: typeof CardThumb;
|
|
19
|
+
var Body: typeof CardBody;
|
|
20
|
+
var Title: typeof CardTitle;
|
|
21
|
+
var Meta: typeof CardMeta;
|
|
22
|
+
var Overlay: typeof CardOverlay;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Card.Thumb
|
|
26
|
+
* 카드 상단 이미지/플레이스홀더 영역. height/aspect 직접 지정.
|
|
27
|
+
*/
|
|
28
|
+
export declare function CardThumb({ className, children, ...props }: React.HTMLAttributes<HTMLDivElement>): React.ReactElement;
|
|
29
|
+
/**
|
|
30
|
+
* Card.Body
|
|
31
|
+
* 카드 하단 텍스트 영역.
|
|
32
|
+
*/
|
|
33
|
+
export declare function CardBody({ className, children, ...props }: React.HTMLAttributes<HTMLDivElement>): React.ReactElement;
|
|
34
|
+
/**
|
|
35
|
+
* Card.Title
|
|
36
|
+
* 카드 본문 큰 라벨.
|
|
37
|
+
*/
|
|
38
|
+
export declare function CardTitle({ className, children, ...props }: React.HTMLAttributes<HTMLDivElement>): React.ReactElement;
|
|
39
|
+
/**
|
|
40
|
+
* Card.Meta
|
|
41
|
+
* 카드 하단 메타 라인 (좌/우 분할).
|
|
42
|
+
*/
|
|
43
|
+
export declare function CardMeta({ className, children, ...props }: React.HTMLAttributes<HTMLDivElement>): React.ReactElement;
|
|
44
|
+
/**
|
|
45
|
+
* Card.Overlay
|
|
46
|
+
* 썸네일 위에 절대 위치로 얹는 라벨 (퍼센트/이모지 등).
|
|
47
|
+
*/
|
|
48
|
+
export declare function CardOverlay({ className, children, position, ...props }: React.HTMLAttributes<HTMLDivElement> & {
|
|
49
|
+
position?: "top-left" | "top-right" | "bottom-left" | "bottom-right";
|
|
50
|
+
}): React.ReactElement;
|
|
51
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { Card } from './Card';
|
|
3
|
+
declare const meta: Meta<typeof Card>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof Card>;
|
|
6
|
+
export declare const Empty: Story;
|
|
7
|
+
export declare const ChallengeCard: Story;
|
|
8
|
+
export declare const DiaryCard: Story;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Card';
|
|
@@ -2,13 +2,18 @@ import * as React from "react";
|
|
|
2
2
|
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
|
|
3
3
|
export interface CheckboxProps extends React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> {
|
|
4
4
|
label?: string;
|
|
5
|
+
/** 읽기 전용 — 클릭/포커스 비활성, 시각은 유지 */
|
|
5
6
|
readOnly?: boolean;
|
|
6
7
|
}
|
|
7
8
|
/**
|
|
8
|
-
* Checkbox
|
|
9
|
-
*
|
|
9
|
+
* Checkbox v3
|
|
10
|
+
* 18×18 박스, 체크 시 brand 컬러로 채움.
|
|
11
|
+
* 체크되면 라벨이 자동으로 회색 + 취소선 처리됨 (체크리스트 스타일).
|
|
10
12
|
*
|
|
11
|
-
* @
|
|
12
|
-
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <Checkbox label="아침 30분 러닝" defaultChecked />
|
|
16
|
+
* <Checkbox label="물 2L 마시기" />
|
|
17
|
+
* ```
|
|
13
18
|
*/
|
|
14
19
|
export declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -4,7 +4,8 @@ declare const meta: Meta<typeof Checkbox>;
|
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof Checkbox>;
|
|
6
6
|
export declare const Default: Story;
|
|
7
|
+
export declare const Checked: Story;
|
|
7
8
|
export declare const WithoutLabel: Story;
|
|
8
9
|
export declare const Disabled: Story;
|
|
9
10
|
export declare const ReadOnly: Story;
|
|
10
|
-
export declare const
|
|
11
|
+
export declare const TodoList: Story;
|
|
@@ -1,8 +1,36 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
+
import { StripeTone } from '../Stripe';
|
|
3
|
+
export type CircleAvatarSize = "xs" | "sm" | "md" | "lg" | "xl";
|
|
4
|
+
export type CircleAvatarTone = StripeTone;
|
|
2
5
|
interface CircleAvatarProps {
|
|
6
|
+
/** 사이즈 — 프리셋 또는 px 숫자 (default `"md"` = 40) */
|
|
7
|
+
size?: CircleAvatarSize | number;
|
|
8
|
+
/** 이미지가 없을 때 보여줄 줄무늬 톤 — 프리셋 또는 CSS color 문자열 */
|
|
9
|
+
tone?: CircleAvatarTone | string;
|
|
10
|
+
/** 외곽선 (main-200 컬러). size>40일 때 3px, 아니면 2px */
|
|
11
|
+
ring?: boolean;
|
|
12
|
+
/** 이미지 URL — 비어있거나 로드 실패 시 톤 Stripe 패턴으로 fallback */
|
|
3
13
|
imageUrl?: string;
|
|
4
|
-
|
|
14
|
+
/** Stripe 대신 보여줄 커스텀 fallback (이니셜·이모지 등) */
|
|
15
|
+
fallback?: React.ReactNode;
|
|
16
|
+
/** alt 텍스트 */
|
|
17
|
+
alt?: string;
|
|
5
18
|
className?: string;
|
|
6
19
|
}
|
|
7
|
-
|
|
20
|
+
/**
|
|
21
|
+
* CircleAvatar
|
|
22
|
+
* 원형 아바타 — 이미지 또는 톤 Stripe 패턴.
|
|
23
|
+
*
|
|
24
|
+
* @param size `xs`(24)·`sm`(32)·`md`(40, default)·`lg`(56)·`xl`(76)·또는 px 숫자
|
|
25
|
+
* @param tone Stripe 컬러 — `peach`(default)·`cream`·`mint`·`blue`·`sky`·`rose`·`gray`·또는 CSS color
|
|
26
|
+
* @param ring main-200 외곽선 (size>40 → 3px, 이하 → 2px)
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```tsx
|
|
30
|
+
* <CircleAvatar size="lg" tone="mint" ring />
|
|
31
|
+
* <CircleAvatar imageUrl="/me.jpg" size="md" />
|
|
32
|
+
* <CircleAvatar size={48} tone="#ffbaba" ring />
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function CircleAvatar({ size, tone, ring, imageUrl, fallback, alt, className, }: CircleAvatarProps): React.ReactElement;
|
|
8
36
|
export {};
|
|
@@ -4,4 +4,9 @@ declare const meta: Meta<typeof CircleAvatar>;
|
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof CircleAvatar>;
|
|
6
6
|
export declare const Default: Story;
|
|
7
|
+
export declare const Sizes: Story;
|
|
8
|
+
export declare const Tones: Story;
|
|
9
|
+
export declare const CustomTone: Story;
|
|
10
|
+
export declare const NumericSize: Story;
|
|
7
11
|
export declare const WithImage: Story;
|
|
12
|
+
export declare const WithFallbackNode: Story;
|
|
@@ -1,27 +1,34 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
6
|
-
export type CircularProgressVariants = VariantProps<typeof circularProgressVariants>;
|
|
7
|
-
interface CircularProgressProps extends CircularProgressVariants {
|
|
2
|
+
export type CircularProgressSize = "sm" | "md" | "lg" | "xl";
|
|
3
|
+
export interface CircularProgressProps {
|
|
4
|
+
/** 진행률 0~100 */
|
|
8
5
|
value: number;
|
|
6
|
+
/** 사이즈 프리셋 또는 픽셀 단위 직경 */
|
|
7
|
+
size?: CircularProgressSize | number;
|
|
8
|
+
/** stroke 두께(px). 미지정 시 size 프리셋 값 또는 직경의 1/10 */
|
|
9
|
+
stroke?: number;
|
|
10
|
+
/** 채움 색 — 미지정 시 brand */
|
|
11
|
+
color?: string;
|
|
12
|
+
/** 트랙 색 — 미지정 시 gray-100 */
|
|
13
|
+
trackColor?: string;
|
|
14
|
+
/** 가운데 퍼센트 텍스트 */
|
|
9
15
|
showPercentage?: boolean;
|
|
16
|
+
/** 가운데에 들어갈 커스텀 노드 (showPercentage보다 우선) */
|
|
17
|
+
centerSlot?: React.ReactNode;
|
|
10
18
|
className?: string;
|
|
11
19
|
}
|
|
12
20
|
/**
|
|
13
|
-
* CircularProgress
|
|
14
|
-
* 원형 진행률
|
|
21
|
+
* CircularProgress v3
|
|
22
|
+
* 원형 진행률 — track + fill 2-arc SVG.
|
|
15
23
|
*
|
|
16
|
-
* @param
|
|
17
|
-
* @param
|
|
18
|
-
* @param
|
|
19
|
-
* @param className 추가 클래스 이름
|
|
24
|
+
* @param size `sm`(48) · `md`(72, default) · `lg`(100) · `xl`(140) · 또는 숫자(px)
|
|
25
|
+
* @param stroke stroke 두께 (px)
|
|
26
|
+
* @param color 채움 색
|
|
20
27
|
*
|
|
21
|
-
* @example
|
|
28
|
+
* @example
|
|
22
29
|
* ```tsx
|
|
23
|
-
* <CircularProgress value={75} size="
|
|
30
|
+
* <CircularProgress value={75} size="lg" />
|
|
31
|
+
* <CircularProgress value={62} size={120} stroke={10} />
|
|
24
32
|
* ```
|
|
25
33
|
*/
|
|
26
|
-
export declare function CircularProgress({ value, size, showPercentage, className, }: CircularProgressProps): React.ReactElement;
|
|
27
|
-
export {};
|
|
34
|
+
export declare function CircularProgress({ value, size, stroke, color, trackColor, showPercentage, centerSlot, className, }: CircularProgressProps): React.ReactElement;
|
|
@@ -4,5 +4,8 @@ declare const meta: Meta<typeof CircularProgress>;
|
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof CircularProgress>;
|
|
6
6
|
export declare const Default: Story;
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
7
|
+
export declare const Sizes: Story;
|
|
8
|
+
export declare const CustomSize: Story;
|
|
9
|
+
export declare const CustomColor: Story;
|
|
10
|
+
export declare const NoLabel: Story;
|
|
11
|
+
export declare const CustomCenter: Story;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface CommentRowProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
3
|
+
/** 좌측 아바타 슬롯 (CircleAvatar 등). 미지정 시 imageUrl로 자동 생성 */
|
|
4
|
+
avatar?: React.ReactNode;
|
|
5
|
+
/** avatar 미지정 시 사용할 이미지 URL */
|
|
6
|
+
imageUrl?: string;
|
|
7
|
+
/** 작성자 이름 */
|
|
8
|
+
author: React.ReactNode;
|
|
9
|
+
/** 댓글 본문 */
|
|
10
|
+
text: React.ReactNode;
|
|
11
|
+
/** 작성 시간 (예: "1시간 전") */
|
|
12
|
+
time?: React.ReactNode;
|
|
13
|
+
/** 하단 구분선 표시 (default `true`) */
|
|
14
|
+
divider?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* CommentRow
|
|
18
|
+
* 한 줄 댓글 — 응원 / 단순 댓글 리스트용. 중첩이 필요하면 `CommentThread` 사용.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <CommentRow
|
|
23
|
+
* imageUrl="/users/min.jpg"
|
|
24
|
+
* author="새벽러너"
|
|
25
|
+
* text="5km 축하드려요! 🏃"
|
|
26
|
+
* time="1시간 전"
|
|
27
|
+
* />
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function CommentRow({ avatar, imageUrl, author, text, time, divider, className, ...props }: CommentRowProps): React.ReactElement;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { CommentRow } from './CommentRow';
|
|
3
|
+
declare const meta: Meta<typeof CommentRow>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof CommentRow>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const Thread: Story;
|
|
8
|
+
export declare const NoDivider: Story;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CommentRow';
|
|
@@ -1,53 +1,32 @@
|
|
|
1
|
+
import { VariantProps } from 'class-variance-authority';
|
|
1
2
|
import * as React from "react";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
declare const dropdownTriggerVariants: (props?: ({
|
|
4
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
5
|
+
open?: boolean | null | undefined;
|
|
6
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
7
|
+
export interface DropdownProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "size" | "value">, VariantProps<typeof dropdownTriggerVariants> {
|
|
8
|
+
/** 라벨 (위) */
|
|
9
|
+
label?: React.ReactNode;
|
|
10
|
+
/** 현재 선택값 */
|
|
11
|
+
value?: React.ReactNode;
|
|
12
|
+
/** 미선택 시 표시할 placeholder */
|
|
13
|
+
placeholder?: React.ReactNode;
|
|
14
|
+
/** 부모 너비 100%. false면 240px */
|
|
15
|
+
full?: boolean;
|
|
16
|
+
}
|
|
6
17
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
18
|
+
* Dropdown
|
|
19
|
+
* 셀렉트형 버튼 — 우측 chevron, open 상태에서 brand 보더 + main 글로우.
|
|
9
20
|
*
|
|
10
|
-
* @
|
|
11
|
-
*
|
|
12
|
-
* <SelectTrigger className="w-[180px]">
|
|
13
|
-
* <SelectValue placeholder="값을 선택해주세요" />
|
|
14
|
-
* </SelectTrigger>
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
|
-
declare function SelectTrigger({ className, size, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
|
|
18
|
-
size?: "sm" | "default";
|
|
19
|
-
}): React.ReactElement;
|
|
20
|
-
/**
|
|
21
|
-
* SelectItem
|
|
22
|
-
* Select 기본 아이템 컴포넌트
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```tsx
|
|
26
|
-
* <SelectItem value="option1">value1</SelectItem>
|
|
27
|
-
* ```
|
|
28
|
-
*/
|
|
29
|
-
declare function SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>): React.ReactElement;
|
|
30
|
-
/**
|
|
31
|
-
* SelectSeparator
|
|
32
|
-
* Select 구분선 컴포넌트
|
|
33
|
-
*/
|
|
34
|
-
declare function SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>): React.ReactElement;
|
|
35
|
-
declare function SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>): React.ReactElement;
|
|
36
|
-
declare function SelectScrollDownButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>): React.ReactElement;
|
|
37
|
-
/**
|
|
38
|
-
* SelectContent
|
|
39
|
-
* Select 기본 컨텐츠 컴포넌트
|
|
21
|
+
* @param size `sm` · `md` (default) · `lg`
|
|
22
|
+
* @param open 메뉴 열림 시각 상태 (실제 메뉴 렌더링은 별도)
|
|
40
23
|
*
|
|
41
24
|
* @example
|
|
42
25
|
* ```tsx
|
|
43
|
-
* <
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* <SelectItem value="option2">Option 2</SelectItem>
|
|
47
|
-
* </SelectGroup>
|
|
48
|
-
* </SelectContent>
|
|
26
|
+
* <Dropdown value="인기순" />
|
|
27
|
+
* <Dropdown placeholder="카테고리 선택" />
|
|
28
|
+
* <Dropdown value="운동" open />
|
|
49
29
|
* ```
|
|
50
30
|
*/
|
|
51
|
-
declare
|
|
52
|
-
|
|
53
|
-
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
|
|
31
|
+
export declare const Dropdown: React.ForwardRefExoticComponent<DropdownProps & React.RefAttributes<HTMLButtonElement>>;
|
|
32
|
+
export {};
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import {
|
|
3
|
-
declare const meta: Meta<typeof
|
|
2
|
+
import { Dropdown } from './Dropdown';
|
|
3
|
+
declare const meta: Meta<typeof Dropdown>;
|
|
4
4
|
export default meta;
|
|
5
|
-
type Story = StoryObj<typeof
|
|
5
|
+
type Story = StoryObj<typeof Dropdown>;
|
|
6
6
|
export declare const Default: Story;
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const Sizes: Story;
|
|
8
|
+
export declare const States: Story;
|
|
9
|
+
export declare const Interactive: Story;
|
|
10
|
+
export declare const MenuOnly: Story;
|
|
11
|
+
export declare const Multi: Story;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface DropdownMenuItem {
|
|
3
|
+
value: string;
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface DropdownMenuProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "onSelect" | "children"> {
|
|
8
|
+
items: DropdownMenuItem[];
|
|
9
|
+
/** 현재 선택된 value */
|
|
10
|
+
value?: string;
|
|
11
|
+
/** 선택 시 콜백 */
|
|
12
|
+
onSelect?: (value: string) => void;
|
|
13
|
+
/** 메뉴 너비 (default 240) */
|
|
14
|
+
width?: number | string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* DropdownMenu
|
|
18
|
+
* Dropdown 트리거 아래 띄우는 항목 목록 — 선택된 항목은 brand + check.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <DropdownMenu
|
|
23
|
+
* items={[{ value: 'recent', label: '최신순' }, { value: 'popular', label: '인기순' }]}
|
|
24
|
+
* value="popular"
|
|
25
|
+
* onSelect={(v) => setSort(v)}
|
|
26
|
+
* />
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function DropdownMenu({ items, value, onSelect, width, className, style, ...props }: DropdownMenuProps): React.ReactElement;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface MultiSelectProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "children"> {
|
|
3
|
+
/** 선택된 값 라벨 배열 */
|
|
4
|
+
selected: string[];
|
|
5
|
+
/** placeholder 텍스트 (예: "카테고리 선택", "4 외 더 추가") */
|
|
6
|
+
placeholder?: React.ReactNode;
|
|
7
|
+
/** 칩 X 버튼 클릭 시 콜백 */
|
|
8
|
+
onRemove?: (value: string) => void;
|
|
9
|
+
/** 클릭 시 콜백 (메뉴 열기 등) */
|
|
10
|
+
onAddClick?: () => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* MultiSelect
|
|
14
|
+
* 선택된 값을 brand-soft 칩 묶음으로 보여주는 multi-tag 입력. 칩에 X 버튼.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <MultiSelect
|
|
19
|
+
* selected={['운동', '건강']}
|
|
20
|
+
* placeholder="4 외 더 추가"
|
|
21
|
+
* onRemove={(v) => setTags(tags.filter(t => t !== v))}
|
|
22
|
+
* onAddClick={openMenu}
|
|
23
|
+
* />
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function MultiSelect({ selected, placeholder, onRemove, onAddClick, className, ...props }: MultiSelectProps): React.ReactElement;
|