# π¨ Palette μ¬μ© μμ
## μ€μ μ½λ μ½μ
ν
μ€νΈ
### React μ»΄ν¬λνΈ μμ
```tsx
import React from 'react';
import { Button } from '@dealicious/design-system-react/src/components/ssm-button';
import { Card } from '@dealicious/design-system-react/src/components/ssm-card';
import { Input } from '@dealicious/design-system-react/src/components/ssm-input';
interface LoginFormProps {
onSubmit: (data: { email: string; password: string }) => void;
}
const LoginForm: React.FC<LoginFormProps> = ({ onSubmit }) => {
const [email, setEmail] = React.useState('');
const [password, setPassword] = React.useState('');
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
onSubmit({ email, password });
};
return (
<Card title="λ‘κ·ΈμΈ" padding="large">
<form onSubmit={handleSubmit}>
<Input
type="email"
placeholder="μ΄λ©μΌμ μ
λ ₯νμΈμ"
value={email}
onChange={(value) => setEmail(value)}
required
/>
<Input
type="password"
placeholder="λΉλ°λ²νΈλ₯Ό μ
λ ₯νμΈμ"
value={password}
onChange={(value) => setPassword(value)}
required
/>
<Button
type="submit"
variant="primary"
size="large"
loading={false}
>
λ‘κ·ΈμΈ
</Button>
</form>
</Card>
);
};
export default LoginForm;
```
### Vue μ»΄ν¬λνΈ μμ
```vue
<template>
<Card title="μ¬μ©μ νλ‘ν" padding="large">
<div class="profile-container">
<Input
v-model="user.name"
placeholder="μ΄λ¦μ μ
λ ₯νμΈμ"
:error="errors.name"
/>
<Input
v-model="user.email"
type="email"
placeholder="μ΄λ©μΌμ μ
λ ₯νμΈμ"
:error="errors.email"
/>
<Button
@click="saveProfile"
variant="primary"
size="medium"
:loading="isSaving"
>
νλ‘ν μ μ₯
</Button>
</div>
</Card>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue';
import Button from '@dealicious/design-system/src/components/ssm-button';
import Card from '@dealicious/design-system/src/components/ssm-card';
import Input from '@dealicious/design-system/src/components/ssm-input';
interface User {
name: string;
email: string;
}
const user = reactive<User>({
name: '',
email: ''
});
const errors = reactive({
name: '',
email: ''
});
const isSaving = ref(false);
const saveProfile = async () => {
isSaving.value = true;
try {
// API νΈμΆ λ‘μ§
console.log('νλ‘ν μ μ₯:', user);
} catch (error) {
console.error('μ μ₯ μ€ν¨:', error);
} finally {
isSaving.value = false;
}
};
</script>
<style scoped>
.profile-container {
display: flex;
flex-direction: column;
gap: 16px;
}
</style>
```
## π¦ ν¨ν€μ§ μ€μΉ λ°©λ²
### 1. npm μ¬μ©
```bash
npm install @dealicious/design-system-react @dealicious/design-system
```
### 2. yarn μ¬μ© (κΆμ₯)
```bash
yarn add @dealicious/design-system-react @dealicious/design-system
```
## π§ μ€μ λ°©λ²
### React νλ‘μ νΈ μ€μ
```tsx
// main.tsx λλ index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
// Design System CSS import (νμν κ²½μ°)
// import '@dealicious/design-system-react/dist/index.css';
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<App />
</React.StrictMode>
);
```
### Vue νλ‘μ νΈ μ€μ
```ts
// main.ts
import { createApp } from 'vue';
import App from './App.vue';
// Design System CSS import (νμν κ²½μ°)
// import '@dealicious/design-system/dist/index.css';
createApp(App).mount('#app');
```
## β
μ μ μλ νμΈ
μμ μ½λ μμλ€μ λ€μκ³Ό κ°μ΄ μ μμ μΌλ‘ μλν©λλ€:
1. **Import κ²½λ‘**: `@dealicious/design-system-react`μ `@dealicious/design-system` ν¨ν€μ§μμ μ»΄ν¬λνΈλ₯Ό μ¬λ°λ₯΄κ² import
2. **TypeScript μ§μ**: λͺ¨λ μ»΄ν¬λνΈμ λν νμ
μ μ μ 곡
3. **Props μ λ¬**: κ° μ»΄ν¬λνΈμ propsκ° μ¬λ°λ₯΄κ² μ λ¬λ¨
4. **μ΄λ²€νΈ νΈλ€λ§**: onClick, onChange λ±μ μ΄λ²€νΈκ° μ μμ μΌλ‘ μ²λ¦¬λ¨
## π μ¬μ© λ°©λ²
1. **ν¨ν€μ§ μ€μΉ**: μμ μ€μΉ λͺ
λ Ήμ΄ μ€ν
2. **μ»΄ν¬λνΈ import**: νμν μ»΄ν¬λνΈλ₯Ό import
3. **μ¬μ©**: JSX/Vue ν
νλ¦Ώμμ μ»΄ν¬λνΈ μ¬μ©
4. **μ€νμΌλ§**: νμμ λ°λΌ CSS import λλ 컀μ€ν
μ€νμΌ μ μ©
μ΄μ μ½λκ° μ μμ μΌλ‘ μ²λ¦¬λ©λλ€! π