π "컀μ€ν μ΄ μ¬μ΄ UI μ΄λ μμκΉ?"
π "μ μ§λ³΄μκ° κ°νΈν UIκ° μμμΌλ©΄ μ’κ² μ΄."
π "UI λΌμ΄λΈλ¬λ¦¬λ 곡λΆλ₯Ό ν΄μΌ νλ€λ..."
elast-uiλ μ΄λ° κ³ λ―Όμμ μμνμ΅λλ€.
μ§κ΄μ μ΄μ§ μμ UI μ»΄ν¬λνΈμ 볡μ‘ν μ μ§λ³΄μ μμ μ κ°λ°μμκ² ν° λΆλ΄μ΄μμ΅λλ€.
λ§μ UI λΌμ΄λΈλ¬λ¦¬κ° κΈ°λ³Έμ μΈ κΈ°λ₯μ μ 곡νμ§λ§, νμμ λ°λΌ μμ λ‘κ² μ€νμΌμ λ³κ²½νκ±°λ μ»΄ν¬λνΈλ₯Ό νμ₯νλ λ° μ μ½μ΄ λ°λ₯΄λ κ²½μ°κ° λ§μ΅λλ€. λ°λ©΄, μ§λμΉκ² μ μ°ν λΌμ΄λΈλ¬λ¦¬λ μΌκ΄μ±μ μκ³ λ³΅μ‘λκ° λμμ Έ, μ μ§λ³΄μμ μ΄λ €μμ κ²ͺκ² λ©λλ€.
μ°λ¦¬λ μ΄λ»κ² νλ©΄ λ μ½κ² 컀μ€ν°λ§μ΄μ§ν μ μμκΉ κ°λ°μλ€μ΄ λ λΉ λ₯΄κ² μμ ν μ μμκΉλ₯Ό κ³ λ―Όνκ³
κ·Έ ν΄λ΅μΌλ‘ νμν κ²μ΄ elast-uiμ λλ€.
elast-uiλ μ»΄ν¬λνΈμ 컀μ€ν°λ§μ΄μ§μ΄ μ½κ³ μ§κ΄μ μ λλ€. κ°λ°μκ° CSSλ μ€νμΌλ§μ 볡μ‘νκ² λ€λ£¨μ§ μκ³ λ μμ λ§μ μ€νμΌμ μ½κ² μ μ©ν μ μλ ꡬ쑰λ₯Ό κ°μΆκ³ μμ΅λλ€.
TailwindCSSλ₯Ό κΈ°λ°μΌλ‘ λ§λ€μ΄μ Έ μμ΄, ν΄λμ€ κΈ°λ°μ μ μ°ν μ€νμΌλ§μ μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μλ λΉ λ₯΄κ² μ€νμΌμ λ³κ²½νκ±°λ νμ₯ν μ μμ΅λλ€.
TypeScriptλ‘ κ°λ°λμ΄ νμ μμ μ±μ΄ 보μ₯λλ©°, κ°λ°μκ° μ»΄νμΌ μ μ€λ₯λ₯Ό 미리 κ°μ§ν μ μμ΄ μμ μ μΈ κ°λ° νκ²½μ μ 곡ν©λλ€.
elast-uiλ μ½λλ₯Ό κ°κ²°νκ³ μ½κΈ° μ½κ² μ€κ³νμ¬, μ μ§λ³΄μμ νμ₯μ΄ μ©μ΄ν©λλ€. νλ‘μ νΈ κ·λͺ¨κ° 컀μ§λλΌλ μ½κ² κ΄λ¦¬ν μ μλ ꡬ쑰λ₯Ό μ 곡ν©λλ€.
elast-uiμ λ μ§κ΄μ μ΄κ³ μ μ°ν UIλ₯Ό ν΅ν΄ μμ°μ±κ³Ό κ°λ μ±μ λμ¬λ³΄μΈμ.
pnpm add elast-uiyarn add elast-uinpm install elast-uiμ΄ νλ‘μ νΈλ pnpm κΈ°λ°μ λͺ¨λ Έλ ν¬λ‘ ꡬμ±λμ΄ μμ΅λλ€. λ€μ λ¨κ³λ₯Ό λ°λΌ κ°λ° νκ²½μ μ€μ νμΈμ.
- Node.js >= 16.14.0 (pnpmμ μ΅μ μꡬμ¬μ)
- pnpm >= 8.0.0
- μ μ₯μ 볡μ νκΈ°
git clone https://github.com/your-username/elast-ui.git
cd elast-ui- μμ‘΄μ± μ€μΉνκΈ°
pnpm install- κ°λ° μλ² μμνκΈ°
# Core ν¨ν€μ§ κ°μ λͺ¨λ λ° Playground μ€ν
pnpm devpackages/core: ν΅μ¬ UI μ»΄ν¬λνΈ λΌμ΄λΈλ¬λ¦¬packages/playground: μ»΄ν¬λνΈ ν μ€νΈ λ° κ°λ°μ μν λ°λͺ¨ μ±
Select μ»΄ν¬λνΈλ λ€μκ³Ό κ°μ μλΈ μ»΄ν¬λνΈλ€λ‘ ꡬμ±λ©λλ€.
Select: μ 체 μ λ νΈ λ°μ€λ₯Ό κ΄λ¦¬νλ λ£¨νΈ μ»΄ν¬λνΈSelect.Trigger: λλ‘λ€μ΄μ μ΄κ³ λ«λ λ²νΌ μνSelect.OptionWrapper: λλ‘λ€μ΄μ μ΅μ λ€μ κ°μΈλ λνΌSelect.Option: κ°λ³ μ΅μ μμ΄ν Select.Error: μ ν¨μ± κ²μ¬μ λ°λ₯Έ μλ¬ λ©μμ§λ₯Ό νμνλ μ»΄ν¬λνΈ
import React, { useState } from 'react';
import { Select } from 'elast-ui';
const Example = () => {
const [selectedValue, setSelectedValue] = useState<string>('');
const handleChange = (value: string) => {
setSelectedValue(value);
};
return (
<form>
<Select value={selectedValue} onValueChange={handleChange} required>
<Select.Trigger>μ΅μ
μ μ ννμΈμ</Select.Trigger>
<Select.OptionWrapper>
<Select.Option value="option1">μ΅μ
1</Select.Option>
<Select.Option value="option2">μ΅μ
2</Select.Option>
<Select.Option value="option3">μ΅μ
3</Select.Option>
</Select.OptionWrapper>
<Select.Error>νμ νλͺ©μ
λλ€.</Select.Error>
</Select>
<button type="submit">μ μΆ</button>
</form>
);
};
export default Example;value: κΈ°λ³ΈμΌλ‘ μ νλ κ°μ μ§μ ν©λλ€.onValueChange: μ νλ κ°μ΄ λ³κ²½λ λ νΈμΆλλ μ½λ°± ν¨μμ λλ€. μ΅μ μ μ ννκ±°λ λ³κ²½νλ©΄onValueChangeν¨μκ° νΈμΆλλ©°, μ½λ°± ν¨μμ μΈμλ‘ μ νλ κ°μ΄ μ λ¬λ©λλ€.required: μ ν νλλ₯Ό νμλ‘ μ€μ ν λ μ¬μ©ν©λλ€.requiredμμ±μ΄ μ€μ λ κ²½μ°, μ΅μ μ μ ννμ§ μμΌλ©΄Select.Errorμ μλ¬ λ©μμ§κ° νμλ©λλ€
- Enter: νμ¬ ν¬μ»€μ€λ μ΅μ μ μ νν©λλ€.
- ArrowUp / ArrowDown: λλ‘λ€μ΄μμ μ/μλλ‘ μ΄λν©λλ€.
- Escape: λλ‘λ€μ΄μ λ«μ΅λλ€.
required μμ±μ΄ μλ κ²½μ°, μ ν¨μ± κ²μ¬λ₯Ό ν΅κ³Όνμ§ λͺ»ν λ μλ¬ λ©μμ§λ₯Ό νμν©λλ€.
<Select.Error>μ νμ νμ νλͺ©μ
λλ€.</Select.Error>formμ¬μ© μ formνκ·Έλ₯Ό μ°Έμ‘°νμ§ μμλ required μ΅μ λ§ μ§μ νλ©΄ νμ μ λ ₯κ°μ μ€μ κ°λ₯ν©λλ€.
requiredμ€μ μ, μ΅μ μ μ ννμ§ μμ κ²½μ°<Select.Erorr>κ° νμλλ©°,<Select.Erorr>μ»΄ν¬λνΈλ₯Ό μ΄μ©ν΄ μλ¬ λ©μμ§λ₯Ό μ€μ ν μ μμ΅λλ€.
<Select required>
<Select.Trigger>...</Select.Trigger>
<Select.OptionWrapper>
<Select.Option value="1">μ΅μ
1</Select.Option>
<Select.Option value="2">μ΅μ
2</Select.Option>
<Select.Option value="3">μ΅μ
3</Select.Option>
</Select.OptionWrapper>
<Select.Error>νμ μ
λ ₯κ°μ
λλ€.</Select.Error>
</Select>Select μ»΄ν¬λνΈλ κ°μ ν΄λμ€(pseudo-class)λ₯Ό μ½κ² μ€νμΌλ§ν μ μλλ‘ data-* μμ±μ μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ νΉμ μν(μ: μ νλ¨, ν¬μ»€μ€λ¨ λ±)λ₯Ό μλ³νκ³ , κ·Έμ λ§λ μ€νμΌμ μ μ©ν μ μμ΅λλ€.
data-selected: νμ¬ μ νλ μ΅μ data-focused: ν¬μ»€μ€λ μ΅μ (ν€λ³΄λλ₯Ό μ΄μ©ν μ ν μ νμ¬ ν¬μ»€μ€λ μ΅μ κ°)
<Select>
<Select.Trigger>
<Arrow />
</Select.Trigger>
<Select.OptionWrapper>
{selectList.map((option: any, index: number) => (
<Select.Option
className="data-[focused]:bg-[#ededed] data-[selected]:bg-blue-100"
key={`${option.name}-${index}`}
value={option.value}
>
{option.name}
</Select.Option>
))}
</Select.OptionWrapper>
</Select>ComboBox μ»΄ν¬λνΈλ ν€λ³΄λμ λ§μ°μ€λ₯Ό μ¬μ©νμ¬ μ΅μ
μ μ νν μ μλ UI μμμ
λλ€. ComboBoxλ μ¬λ¬ μλΈ μ»΄ν¬λνΈλ‘ ꡬμ±λλ©°, κ°κ°μ μν μ ν΅ν΄ μ¬μ©μ μ
λ ₯, λλ‘λ€μ΄ μ΅μ
μ ν λ° μ ν¨μ± κ²μ¬λ₯Ό μ§μν©λλ€.
ComboBox: μ 체 μ»΄ν¬λνΈλ₯Ό κ°μΈλ λ£¨νΈ μ»΄ν¬λνΈComboBox.Input: κ²μ λλ μ΅μ μ μ λ ₯νλ νλComboBox.OptionWrapper: λλ‘λ€μ΄μμ μ΅μ λ€μ κ°μΈλ 컨ν μ΄λComboBox.Option: κ°λ³ μ΅μ νλͺ©ComboBox.Error: μ ν¨μ± κ²μ¬ μ€ν¨ μ μλ¬ λ©μμ§λ₯Ό νμνλ μ»΄ν¬λνΈ
import React, { useState } from 'react';
import { ComboBox } from 'elast-ui';
const Example = () => {
const [selectedValue, setSelectedValue] = useState<string>('');
const handleChange = (value: string) => {
setSelectedValue(value);
};
return (
<form>
<ComboBox value={selectedValue} onValueChange={handleChange} required>
<ComboBox.Input placeholder="μ΅μ
μ μ
λ ₯νκ±°λ μ ννμΈμ" />
<ComboBox.OptionWrapper>
<ComboBox.Option value="option1">μ΅μ
1</ComboBox.Option>
<ComboBox.Option value="option2">μ΅μ
2</ComboBox.Option>
<ComboBox.Option value="option3">μ΅μ
3</ComboBox.Option>
</ComboBox.OptionWrapper>
<ComboBox.Error>νμ νλͺ©μ
λλ€.</ComboBox.Error>
</ComboBox>
<button type="submit">μ μΆ</button>
</form>
);
};
export default Example;value: μ νλ κ°μ μ μ₯ν©λλ€.onValueChange: μ΅μ μ΄ λ³κ²½λ λ νΈμΆλλ μ½λ°± ν¨μμ λλ€. μ νλ κ°μ΄onValueChangeμ μΈμλ‘ μ λ¬λ©λλ€.required: νμ μ λ ₯ νλλ‘ μ€μ νλ©΄, κ°μ΄ μμ λComboBox.Errorμ μλ¬ λ©μμ§κ° νμλ©λλ€.
- Enter: νμ¬ ν¬μ»€μ€λ μ΅μ μ μ νν©λλ€.
- ArrowUp / ArrowDown: λλ‘λ€μ΄μμ μ/μλλ‘ μ΄λν©λλ€.
- Escape: λλ‘λ€μ΄μ λ«μ΅λλ€.
required μμ±μ΄ μ§μ λ κ²½μ°, μ ν¨μ± κ²μ¬μ μ€ν¨νλ©΄ μλ¬ λ©μμ§λ₯Ό νμν©λλ€.
<ComboBox.Error>μ΅μ
μ μ ννμΈμ.</ComboBox.Error>ComboBox.Optionμ κ°μ ν΄λμ€(pseudo-class) μνλ₯Ό μ€νμΌλ§νκΈ° μν΄ data-* μμ±μ μ§μν©λλ€.
data-focused: ν€λ³΄λλ‘ νμ μ€ ν¬μ»€μ€λ μ΅μ data-selected: νμ¬ μ νλ μ΅μ
<ComboBox.OptionWrapper>
<ComboBox.Option
className="data-[focused]:bg-[#ededed] data-[selected]:bg-blue-100"
value="option1"
>
μ΅μ
1
</ComboBox.Option>
</ComboBox.OptionWrapper>Dropdown μ»΄ν¬λνΈλ μ¬λ¬ μ΅μ
μ€ νλλ₯Ό μ νν μ μλ UI μμμ
λλ€. Dropdownμ μ¬λ¬ μλΈ μ»΄ν¬λνΈλ‘ ꡬμ±λμ΄ μμΌλ©°, κ°κ°μ μν μ ν΅ν΄ λλ‘λ€μ΄ λ©λ΄ νμ, νλͺ© μ ν λ° ν€λ³΄λ λ΄λΉκ²μ΄μ
μ μ§μν©λλ€.
Dropdown: μ 체 μ»΄ν¬λνΈλ₯Ό κ°μΈλ λ£¨νΈ μ»΄ν¬λνΈDropdown.Trigger: λλ‘λ€μ΄μ μ΄κ±°λ λ«λ λ²νΌ μν μ νλ μ»΄ν¬λνΈDropdown.ItemWrapper: λλ‘λ€μ΄μμ μ΅μ λ€μ κ°μΈλ 컨ν μ΄λDropdown.Item: κ°λ³ μ΅μ νλͺ©
import React, { useState } from 'react';
import { Dropdown } from 'elast-ui';
const Example = () => {
const [selectedValue, setSelectedValue] = useState<string>('');
const handleChange = (value: string) => {
setSelectedValue(value);
};
return (
<Dropdown onValueChange={handleChange}>
<Dropdown.Trigger>μ΅μ
μ ν</Dropdown.Trigger>
<Dropdown.ItemWrapper>
<Dropdown.Item value="option1">μ΅μ
1</Dropdown.Item>
<Dropdown.Item value="option2">μ΅μ
2</Dropdown.Item>
<Dropdown.Item value="option3">μ΅μ
3</Dropdown.Item>
</Dropdown.ItemWrapper>
</Dropdown>
);
};
export default Example;onValueChange: μ νν κ°μ΄ λ³κ²½λ λ νΈμΆλλ μ½λ°± ν¨μμ λλ€. μ νλ κ°μ΄onValueChangeμ μΈμλ‘ μ λ¬λ©λλ€.className: μ€νμΌμ 컀μ€ν°λ§μ΄μ§ν μ μλ ν΄λμ€ λ€μμ μ λ¬ν μ μμ΅λλ€.
- Enter: νμ¬ ν¬μ»€μ€λ μ΅μ μ μ νν©λλ€.
- ArrowUp / ArrowDown: λλ‘λ€μ΄μμ μ/μλλ‘ μ΄λν©λλ€.
- Escape: λλ‘λ€μ΄μ λ«μ΅λλ€.
Dropdown.Itemμ μνλ₯Ό ꡬλΆνκΈ° μν΄ data-* μμ±μ μ§μν©λλ€.
data-focused: ν€λ³΄λλ‘ νμ μ€ ν¬μ»€μ€λ νλͺ©data-selected: νμ¬ μ νλ νλͺ©
<Dropdown.ItemWrapper>
<Dropdown.Item
className="data-[focused]:bg-[#ededed] data-[selected]:bg-blue-100"
value="option1"
>
μ΅μ
1
</Dropdown.Item>
</Dropdown.ItemWrapper>Dropdown.Triggerμ Dropdown.Itemμ onClick μ΄λ²€νΈλ₯Ό ν΅ν΄ κ°κ° λλ‘λ€μ΄μ μ΄κ±°λ λ«κ³ , νλͺ©μ μ νν μ μμ΅λλ€.
Tabs μ»΄ν¬λνΈλ μ¬λ¬ κ°μ νκ³Ό κ·Έμ λμνλ μ½ν
μΈ λ₯Ό νμνλ UI μμμ
λλ€. κ° νμ ν΄λ¦νλ©΄ ν΄λΉνλ μ½ν
μΈ λ‘ μ νλλ©°, Tabs, TabsWrapper, Tab, ContentWrapper, Contentλ‘ κ΅¬μ±λμ΄ μμ΅λλ€.
Tabs: μ 체 ν μμ€ν μ κ°μΈλ λ£¨νΈ μ»΄ν¬λνΈTabsWrapper: ν νλͺ©μ κ°μΈλ 컨ν μ΄λTab: κ°λ³ ν νλͺ©ContentWrapper: ν μ νμ λ°λΌ μ½ν μΈ λ₯Ό νμνλ 컨ν μ΄λContent: κ° νμ μ°κ²°λ κ°λ³ μ½ν μΈ
import React, { useState } from 'react';
import { Tabs } from 'elast-ui';
const Example = () => {
const [activeTab, setActiveTab] = useState<number>(0);
const handleTabChange = (index: number) => {
setActiveTab(index);
};
return (
<Tabs defaultIndex={activeTab} onValueChange={handleTabChange}>
<Tabs.TabsWrapper>
<Tabs.Tab>ν 1</Tabs.Tab>
<Tabs.Tab>ν 2</Tabs.Tab>
<Tabs.Tab>ν 3</Tabs.Tab>
</Tabs.TabsWrapper>
<Tabs.ContentWrapper>
<Tabs.Content>ν 1μ λ΄μ©</Tabs.Content>
<Tabs.Content>ν 2μ λ΄μ©</Tabs.Content>
<Tabs.Content>ν 3μ λ΄μ©</Tabs.Content>
</Tabs.ContentWrapper>
</Tabs>
);
};
export default Example;defaultIndex: μ²μμ νμ±νλ νμ μΈλ±μ€λ₯Ό μ€μ ν©λλ€. κΈ°λ³Έκ°μ0μ λλ€.onValueChange: νμ΄ λ³κ²½λ λ νΈμΆλλ μ½λ°± ν¨μμ λλ€. μ νλ νμ μΈλ±μ€κ° μΈμλ‘ μ λ¬λ©λλ€.
Tabs.Tabμ νμ νμ± μνλ₯Ό μ€νμΌλ§νκΈ° μν΄ data-* μμ±μ μ§μν©λλ€.
data-tabindex: νμ μΈλ±μ€λ₯Ό λνλ λλ€.data-selected: νμ¬ μ νλ νμ λΆμ¬λλ μμ±μ λλ€.
<Tabs.TabsWrapper>
<Tabs.Tab className="data-[selected]:font-bold" data-tabindex={0}>
ν 1
</Tabs.Tab>
<Tabs.Tab className="data-[selected]:font-bold" data-tabindex={1}>
ν 2
</Tabs.Tab>
</Tabs.TabsWrapper>TabsWrapper λ΄λΆμ κ° Tabμ ν΄λ¦ μ ν΄λΉ νμ νμ±ννλ©°, onClick μ΄λ²€νΈλ₯Ό ν΅ν΄ TabsContextμ μ€μ λ μΈλ±μ€λ₯Ό μ
λ°μ΄νΈν©λλ€. κ° νμ ν΄λ¦ μ΄λ²€νΈ μΈμλ ν€λ³΄λλ‘ λ΄λΉκ²μ΄μ
ν μ μμ΅λλ€.
Modal μ»΄ν¬λνΈλ μ¬μ©μκ° νΉμ μ΄λ²€νΈλ₯Ό νΈλ¦¬κ±°νμ λ λνλλ νμ
UI μμμ
λλ€. μ΄ μ»΄ν¬λνΈλ μ¬λ¬ μλΈ μ»΄ν¬λνΈλ‘ ꡬμ±λμ΄ μμΌλ©°, λͺ¨λ¬μ ꡬ쑰μ μ½ν
μΈ λ₯Ό μ μν μ μμ΅λλ€.
Modal: λͺ¨λ¬μ κ°μΈλ λ£¨νΈ μ»΄ν¬λνΈλ‘,openμμ±μ λ°λΌ λͺ¨λ¬μ νμνκ±°λ μ¨κΉλλ€.Modal.Container: λͺ¨λ¬μ λ©μΈ μ½ν μΈ λ₯Ό κ°μΈλ 컨ν μ΄λModal.Title: λͺ¨λ¬μ μ λͺ©μ νμνλ μ»΄ν¬λνΈModal.Content: λͺ¨λ¬μ λ³Έλ¬Έ λ΄μ©μ νμνλ μ»΄ν¬λνΈ
import React, { useState } from 'react';
import { Modal } from 'elast-ui';
const Example = () => {
const [isOpen, setIsOpen] = useState(false);
const handleOpen = () => setIsOpen(true);
const handleClose = () => setIsOpen(false);
return (
<>
<button onClick={handleOpen}>λͺ¨λ¬ μ΄κΈ°</button>
<Modal open={isOpen} onClose={handleClose}>
<Modal.Container>
<Modal.Title>λͺ¨λ¬ μ λͺ©</Modal.Title>
<Modal.Content>λͺ¨λ¬μ λ³Έλ¬Έ λ΄μ©μ
λλ€.</Modal.Content>
</Modal.Container>
</Modal>
</>
);
};
export default Example;open: λͺ¨λ¬μ μ΄μ§ μ¬λΆλ₯Ό μ μ΄νλ μμ±μ λλ€.trueμΌ κ²½μ° λͺ¨λ¬μ΄ νμλ©λλ€.onClose: λͺ¨λ¬μ΄ λ«ν λ μ€νλλ μ½λ°± ν¨μμ λλ€.className: μ€νμΌμ 컀μ€ν°λ§μ΄μ§νκΈ° μν΄ ν΄λμ€λͺ μ μ λ¬ν μ μμ΅λλ€.
- Escape: λͺ¨λ¬μ΄ μ΄λ € μμ λ
Escapeν€λ₯Ό λλ₯΄λ©΄ λͺ¨λ¬μ΄ λ«νλλ€.
λͺ¨λ¬μ΄ μ΄λ¦¬λ©΄ λ΄λΆμ ν¬μ»€μ€κ° μ΄λνμ¬ νλ©΄ 리λμ κ°μ 보쑰 λꡬλ₯Ό μ¬μ©ν λλ λͺ¨λ¬μ΄ ν¨κ³Όμ μΌλ‘ μλν©λλ€. λͺ¨λ¬μ΄ λ«νλ©΄ ν¬μ»€μ€λ μλ μλ μμΉλ‘ λμκ°λλ€.
κ° μλΈ μ»΄ν¬λνΈλ className μμ±μ ν΅ν΄ μ€νμΌμ μ½κ² νμ₯ν μ μμ΅λλ€. νμμ λ°λΌ Modal.Container, Modal.Title, Modal.Contentλ₯Ό 컀μ€ν°λ§μ΄μ§ν μ μμ΅λλ€.
<Modal.Container className="p-4 bg-white rounded-lg shadow-lg">
<Modal.Title className="text-xl font-bold">λͺ¨λ¬ μ λͺ©</Modal.Title>
<Modal.Content className="text-gray-700">λͺ¨λ¬ λ³Έλ¬Έμ
λλ€.</Modal.Content>
</Modal.Container>Switch μ»΄ν¬λνΈλ μ¬μ©μκ° μνλ₯Ό ν κΈν μ μλ UI μμμ
λλ€. 체ν¬λ μνμ λ°λΌ μ€νμΌμ λ³κ²½ν μ μμΌλ©°, μ¬μ©μ μΈν°λμ
μ λ°λΌ μν λ³κ²½μ μ²λ¦¬ν μ μμ΅λλ€.
import React, { useState } from 'react';
import { Switch } from 'elast-ui';
const Example = () => {
const [isChecked, setIsChecked] = useState(false);
const handleChange = (newState: boolean) => {
setIsChecked(newState);
};
return (
<>
<Switch checked={isChecked} onCheckedChange={handleChange}>
{isChecked ? 'ON' : 'OFF'}
</Switch>
</>
);
};
export default Example;checked: μ€μμΉμ νμ¬ μνλ₯Ό λνλ΄λ©°,trueμΌ κ²½μ° μ€μμΉκ° νμ±νλ μνμ λλ€.onCheckedChange: μ€μμΉ μνκ° λ³κ²½λ λ νΈμΆλλ μ½λ°± ν¨μμ λλ€. μλ‘μ΄ μνκ°μ΄ ν¨μμ μΈμλ‘ μ λ¬λ©λλ€.id: μ€μμΉ μ»΄ν¬λνΈμ κ³ μ ν μλ³μλ₯Ό λΆμ¬ν μ μμ΅λλ€.className: μ€νμΌμ 컀μ€ν°λ§μ΄μ§νκΈ° μν΄ ν΄λμ€λͺ μ μ λ¬ν μ μμ΅λλ€.
Switch μ»΄ν¬λνΈλ κ°μ ν΄λμ€(pseudo-class) μνλ₯Ό μ€νμΌλ§νκΈ° μν΄ data-checked μμ±μ μ§μν©λλ€.
<Switch
checked={isChecked}
onCheckedChange={handleChange}
className="data-[checked]:bg-green-500 data-[checked]:text-white"
>
{isChecked ? 'ON' : 'OFF'}
</Switch>μ μμ μμ data-checked μμ±μ μ΄μ©ν΄ 체ν¬λ μνμ λ°λ₯Έ μ€νμΌλ§μ μ μ©ν μ μμ΅λλ€.
μ€μμΉλ ν΄λ¦ μ΄λ²€νΈλ₯Ό ν΅ν΄ μνκ° λ³κ²½λ©λλ€. onCheckedChange μ½λ°± ν¨μκ° μ€νλλ©°, μλ‘μ΄ μνκ°μ΄ μ λ¬λ©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μλ μ€μμΉμ μνλ₯Ό μ μ΄ν μ μμ΅λλ€.