@poodle-kit/ui 0.1.0 → 0.1.1

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/README.md ADDED
@@ -0,0 +1,151 @@
1
+ # @poodle-kit/ui
2
+
3
+ TypeScript와 Tailwind CSS로 만든 React UI 컴포넌트 라이브러리예요.
4
+
5
+ ## 📦 설치하기
6
+
7
+ ```bash
8
+ npm install @poodle-kit/ui
9
+ ```
10
+
11
+ ### 같이 필요한 패키지들
12
+
13
+ ```bash
14
+ npm install react@">=18" react-dom@">=18"
15
+ ```
16
+
17
+ ## 💡 사용 방법
18
+
19
+ ### 기본 예제
20
+
21
+ ```tsx
22
+ import { Button } from '@poodle-kit/ui';
23
+ import '@poodle-kit/ui/styles.css';
24
+
25
+ function App() {
26
+ return (
27
+ <Button
28
+ label="클릭해주세요"
29
+ variant="primary"
30
+ onClick={() => alert('클릭했어요!')}
31
+ />
32
+ );
33
+ }
34
+ ```
35
+
36
+ ### TypeScript와 함께 사용하기
37
+
38
+ ```tsx
39
+ import { Button, ButtonProps } from '@poodle-kit/ui';
40
+ import '@poodle-kit/ui/styles.css';
41
+
42
+ const MyButton: React.FC<ButtonProps> = (props) => {
43
+ return <Button {...props} />;
44
+ };
45
+ ```
46
+
47
+ ## 🎨 컴포넌트
48
+
49
+ ### Button
50
+
51
+ 다양한 스타일과 크기를 지원하는 버튼 컴포넌트예요.
52
+
53
+ #### Props
54
+
55
+ | Prop | 타입 | 기본값 | 설명 |
56
+ |------|------|---------|-------------|
57
+ | `label` | `string` | - | 버튼에 표시될 텍스트 **(필수)** |
58
+ | `variant` | `"primary" \| "secondary" \| "ghost" \| "danger"` | `"primary"` | 버튼의 스타일 종류 |
59
+ | `size` | `"sm" \| "md" \| "lg"` | `"md"` | 버튼의 크기 |
60
+ | `fullWidth` | `boolean` | `false` | 버튼을 전체 너비로 만들기 |
61
+ | `disabled` | `boolean` | `false` | 버튼 비활성화하기 |
62
+ | `onClick` | `() => void` | - | 클릭 이벤트 핸들러 |
63
+
64
+ 일반적인 HTML button 속성들도 모두 사용할 수 있어요.
65
+
66
+ #### 예제
67
+
68
+ **다양한 스타일**
69
+
70
+ ```tsx
71
+ <Button label="Primary" variant="primary" />
72
+ <Button label="Secondary" variant="secondary" />
73
+ <Button label="Ghost" variant="ghost" />
74
+ <Button label="Danger" variant="danger" />
75
+ ```
76
+
77
+ **다양한 크기**
78
+
79
+ ```tsx
80
+ <Button label="작아요" size="sm" />
81
+ <Button label="보통이에요" size="md" />
82
+ <Button label="커요" size="lg" />
83
+ ```
84
+
85
+ **전체 너비로 만들기**
86
+
87
+ ```tsx
88
+ <Button label="전체 너비 버튼" fullWidth />
89
+ ```
90
+
91
+ **비활성화 상태**
92
+
93
+ ```tsx
94
+ <Button label="비활성화된 버튼" disabled />
95
+ ```
96
+
97
+ ## 🎨 스타일링
98
+
99
+ 이 라이브러리는 Tailwind CSS를 사용해요. 스타일을 꼭 import 해주세요:
100
+
101
+ ```tsx
102
+ import '@poodle-kit/ui/styles.css';
103
+ ```
104
+
105
+ ### 커스텀 스타일 적용하기
106
+
107
+ className을 통해 추가 스타일을 적용할 수 있어요:
108
+
109
+ ```tsx
110
+ <Button
111
+ label="커스텀"
112
+ className="my-custom-class"
113
+ />
114
+ ```
115
+
116
+ ## 🔧 TypeScript 지원
117
+
118
+ TypeScript로 작성되어 완벽한 타입 정의를 제공해요.
119
+
120
+ ```tsx
121
+ import type { ButtonProps } from '@poodle-kit/ui';
122
+ ```
123
+
124
+ ## 🌐 브라우저 지원
125
+
126
+ - Chrome (최신 버전)
127
+ - Firefox (최신 버전)
128
+ - Safari (최신 버전)
129
+ - Edge (최신 버전)
130
+
131
+ ## 🛠️ 개발하기
132
+
133
+ ### 빌드
134
+
135
+ ```bash
136
+ npm run build
137
+ ```
138
+
139
+ ### Watch 모드
140
+
141
+ ```bash
142
+ npm run dev
143
+ ```
144
+
145
+ ## 📦 리포지토리
146
+
147
+ [GitHub](https://github.com/poodle-kit/poodle-kit/tree/main/packages/ui)
148
+
149
+ ## 📄 라이선스
150
+
151
+ MIT
package/dist/index.d.mts CHANGED
@@ -1,14 +1,15 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ButtonHTMLAttributes } from 'react';
2
+ import { ReactNode, ButtonHTMLAttributes } from 'react';
3
3
 
4
4
  type Variant = "primary" | "secondary" | "ghost" | "danger";
5
5
  type Size = "sm" | "md" | "lg";
6
6
  type ButtonProps = {
7
- label: string;
7
+ label?: string;
8
+ children?: ReactNode;
8
9
  variant?: Variant;
9
10
  size?: Size;
10
11
  fullWidth?: boolean;
11
- } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children">;
12
- declare function Button({ label, variant, size, fullWidth, className, ...rest }: ButtonProps): react_jsx_runtime.JSX.Element;
12
+ } & ButtonHTMLAttributes<HTMLButtonElement>;
13
+ declare function Button({ label, children, variant, size, fullWidth, className, ...rest }: ButtonProps): react_jsx_runtime.JSX.Element;
13
14
 
14
15
  export { Button, type ButtonProps };
package/dist/index.d.ts CHANGED
@@ -1,14 +1,15 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ButtonHTMLAttributes } from 'react';
2
+ import { ReactNode, ButtonHTMLAttributes } from 'react';
3
3
 
4
4
  type Variant = "primary" | "secondary" | "ghost" | "danger";
5
5
  type Size = "sm" | "md" | "lg";
6
6
  type ButtonProps = {
7
- label: string;
7
+ label?: string;
8
+ children?: ReactNode;
8
9
  variant?: Variant;
9
10
  size?: Size;
10
11
  fullWidth?: boolean;
11
- } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children">;
12
- declare function Button({ label, variant, size, fullWidth, className, ...rest }: ButtonProps): react_jsx_runtime.JSX.Element;
12
+ } & ButtonHTMLAttributes<HTMLButtonElement>;
13
+ declare function Button({ label, children, variant, size, fullWidth, className, ...rest }: ButtonProps): react_jsx_runtime.JSX.Element;
13
14
 
14
15
  export { Button, type ButtonProps };
package/dist/index.js CHANGED
@@ -43,6 +43,7 @@ function cx(...classes) {
43
43
  }
44
44
  function Button({
45
45
  label,
46
+ children,
46
47
  variant = "primary",
47
48
  size = "md",
48
49
  fullWidth = false,
@@ -61,7 +62,7 @@ function Button({
61
62
  className
62
63
  ),
63
64
  ...rest,
64
- children: label
65
+ children: children || label
65
66
  }
66
67
  );
67
68
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/Button.tsx"],"sourcesContent":["// Tailwind CSS\nimport './tailwind.css';\n\n// Components\nexport { Button } from './components/Button';\nexport type { ButtonProps } from './components/Button';\n","import type { ButtonHTMLAttributes } from \"react\";\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nexport type ButtonProps = {\n label: string;\n variant?: Variant;\n size?: Size;\n fullWidth?: boolean;\n} & Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\">;\n\nconst base =\n \"inline-flex items-center justify-center rounded-lg font-semibold \" +\n \"transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 \" +\n \"disabled:opacity-50 disabled:cursor-not-allowed\";\n\nconst sizes: Record<Size, string> = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-sm\",\n lg: \"h-12 px-5 text-base\",\n};\n\nconst variants: Record<Variant, string> = {\n primary:\n \"bg-blue-600 text-white hover:bg-blue-700 focus-visible:ring-blue-600 shadow-sm\",\n secondary:\n \"bg-gray-100 text-gray-900 hover:bg-gray-200 focus-visible:ring-gray-400 border border-gray-200\",\n ghost:\n \"bg-transparent text-gray-900 hover:bg-gray-100 focus-visible:ring-gray-400\",\n danger:\n \"bg-red-600 text-white hover:bg-red-700 focus-visible:ring-red-600 shadow-sm\",\n};\n\n// className 합치기(외부 라이브러리 없이)\nfunction cx(...classes: Array<string | undefined | false>) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport function Button({\n label,\n variant = \"primary\",\n size = \"md\",\n fullWidth = false,\n className,\n ...rest\n}: ButtonProps) {\n return (\n <button\n type=\"button\"\n className={cx(\n base,\n sizes[size],\n variants[variant],\n fullWidth && \"w-full\",\n className\n )}\n {...rest}\n >\n {label}\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACgDI;AApCJ,IAAM,OACJ;AAIF,IAAM,QAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,WAAoC;AAAA,EACxC,SACE;AAAA,EACF,WACE;AAAA,EACF,OACE;AAAA,EACF,QACE;AACJ;AAGA,SAAS,MAAM,SAA4C;AACzD,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAgB;AACd,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,MAAM,IAAI;AAAA,QACV,SAAS,OAAO;AAAA,QAChB,aAAa;AAAA,QACb;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/Button.tsx"],"sourcesContent":["// Tailwind CSS\nimport './tailwind.css';\n\n// Components\nexport { Button } from './components/Button';\nexport type { ButtonProps } from './components/Button';\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nexport type ButtonProps = {\n label?: string;\n children?: ReactNode;\n variant?: Variant;\n size?: Size;\n fullWidth?: boolean;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst base =\n \"inline-flex items-center justify-center rounded-lg font-semibold \" +\n \"transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 \" +\n \"disabled:opacity-50 disabled:cursor-not-allowed\";\n\nconst sizes: Record<Size, string> = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-sm\",\n lg: \"h-12 px-5 text-base\",\n};\n\nconst variants: Record<Variant, string> = {\n primary:\n \"bg-blue-600 text-white hover:bg-blue-700 focus-visible:ring-blue-600 shadow-sm\",\n secondary:\n \"bg-gray-100 text-gray-900 hover:bg-gray-200 focus-visible:ring-gray-400 border border-gray-200\",\n ghost:\n \"bg-transparent text-gray-900 hover:bg-gray-100 focus-visible:ring-gray-400\",\n danger:\n \"bg-red-600 text-white hover:bg-red-700 focus-visible:ring-red-600 shadow-sm\",\n};\n\n// className 합치기(외부 라이브러리 없이)\nfunction cx(...classes: Array<string | undefined | false>) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport function Button({\n label,\n children,\n variant = \"primary\",\n size = \"md\",\n fullWidth = false,\n className,\n ...rest\n}: ButtonProps) {\n return (\n <button\n type=\"button\"\n className={cx(\n base,\n sizes[size],\n variants[variant],\n fullWidth && \"w-full\",\n className\n )}\n {...rest}\n >\n {children || label}\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACkDI;AArCJ,IAAM,OACJ;AAIF,IAAM,QAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,WAAoC;AAAA,EACxC,SACE;AAAA,EACF,WACE;AAAA,EACF,OACE;AAAA,EACF,QACE;AACJ;AAGA,SAAS,MAAM,SAA4C;AACzD,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAgB;AACd,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,MAAM,IAAI;AAAA,QACV,SAAS,OAAO;AAAA,QAChB,aAAa;AAAA,QACb;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,sBAAY;AAAA;AAAA,EACf;AAEJ;","names":[]}
package/dist/index.mjs CHANGED
@@ -17,6 +17,7 @@ function cx(...classes) {
17
17
  }
18
18
  function Button({
19
19
  label,
20
+ children,
20
21
  variant = "primary",
21
22
  size = "md",
22
23
  fullWidth = false,
@@ -35,7 +36,7 @@ function Button({
35
36
  className
36
37
  ),
37
38
  ...rest,
38
- children: label
39
+ children: children || label
39
40
  }
40
41
  );
41
42
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Button.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes } from \"react\";\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nexport type ButtonProps = {\n label: string;\n variant?: Variant;\n size?: Size;\n fullWidth?: boolean;\n} & Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\">;\n\nconst base =\n \"inline-flex items-center justify-center rounded-lg font-semibold \" +\n \"transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 \" +\n \"disabled:opacity-50 disabled:cursor-not-allowed\";\n\nconst sizes: Record<Size, string> = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-sm\",\n lg: \"h-12 px-5 text-base\",\n};\n\nconst variants: Record<Variant, string> = {\n primary:\n \"bg-blue-600 text-white hover:bg-blue-700 focus-visible:ring-blue-600 shadow-sm\",\n secondary:\n \"bg-gray-100 text-gray-900 hover:bg-gray-200 focus-visible:ring-gray-400 border border-gray-200\",\n ghost:\n \"bg-transparent text-gray-900 hover:bg-gray-100 focus-visible:ring-gray-400\",\n danger:\n \"bg-red-600 text-white hover:bg-red-700 focus-visible:ring-red-600 shadow-sm\",\n};\n\n// className 합치기(외부 라이브러리 없이)\nfunction cx(...classes: Array<string | undefined | false>) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport function Button({\n label,\n variant = \"primary\",\n size = \"md\",\n fullWidth = false,\n className,\n ...rest\n}: ButtonProps) {\n return (\n <button\n type=\"button\"\n className={cx(\n base,\n sizes[size],\n variants[variant],\n fullWidth && \"w-full\",\n className\n )}\n {...rest}\n >\n {label}\n </button>\n );\n}\n"],"mappings":";AAgDI;AApCJ,IAAM,OACJ;AAIF,IAAM,QAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,WAAoC;AAAA,EACxC,SACE;AAAA,EACF,WACE;AAAA,EACF,OACE;AAAA,EACF,QACE;AACJ;AAGA,SAAS,MAAM,SAA4C;AACzD,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAgB;AACd,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,MAAM,IAAI;AAAA,QACV,SAAS,OAAO;AAAA,QAChB,aAAa;AAAA,QACb;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/components/Button.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes, ReactNode } from \"react\";\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\ntype Size = \"sm\" | \"md\" | \"lg\";\n\nexport type ButtonProps = {\n label?: string;\n children?: ReactNode;\n variant?: Variant;\n size?: Size;\n fullWidth?: boolean;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst base =\n \"inline-flex items-center justify-center rounded-lg font-semibold \" +\n \"transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 \" +\n \"disabled:opacity-50 disabled:cursor-not-allowed\";\n\nconst sizes: Record<Size, string> = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-sm\",\n lg: \"h-12 px-5 text-base\",\n};\n\nconst variants: Record<Variant, string> = {\n primary:\n \"bg-blue-600 text-white hover:bg-blue-700 focus-visible:ring-blue-600 shadow-sm\",\n secondary:\n \"bg-gray-100 text-gray-900 hover:bg-gray-200 focus-visible:ring-gray-400 border border-gray-200\",\n ghost:\n \"bg-transparent text-gray-900 hover:bg-gray-100 focus-visible:ring-gray-400\",\n danger:\n \"bg-red-600 text-white hover:bg-red-700 focus-visible:ring-red-600 shadow-sm\",\n};\n\n// className 합치기(외부 라이브러리 없이)\nfunction cx(...classes: Array<string | undefined | false>) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport function Button({\n label,\n children,\n variant = \"primary\",\n size = \"md\",\n fullWidth = false,\n className,\n ...rest\n}: ButtonProps) {\n return (\n <button\n type=\"button\"\n className={cx(\n base,\n sizes[size],\n variants[variant],\n fullWidth && \"w-full\",\n className\n )}\n {...rest}\n >\n {children || label}\n </button>\n );\n}\n"],"mappings":";AAkDI;AArCJ,IAAM,OACJ;AAIF,IAAM,QAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,WAAoC;AAAA,EACxC,SACE;AAAA,EACF,WACE;AAAA,EACF,OACE;AAAA,EACF,QACE;AACJ;AAGA,SAAS,MAAM,SAA4C;AACzD,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAgB;AACd,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,MAAM,IAAI;AAAA,QACV,SAAS,OAAO;AAAA,QAChB,aAAa;AAAA,QACb;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,sBAAY;AAAA;AAAA,EACf;AAEJ;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poodle-kit/ui",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "React UI component library with Tailwind CSS",
5
5
  "author": "",
6
6
  "license": "MIT",
@@ -19,9 +19,9 @@
19
19
  "types": "./dist/index.d.ts",
20
20
  "exports": {
21
21
  ".": {
22
- "require": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
23
  "import": "./dist/index.mjs",
24
- "types": "./dist/index.d.ts"
24
+ "require": "./dist/index.js"
25
25
  },
26
26
  "./styles.css": "./dist/index.css"
27
27
  },