Skip to content

elast-ui-lab/elast-ui

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

105 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Ask DeepWiki

πŸ”― elast-ui


πŸ’­ "μ»€μŠ€ν…€μ΄ μ‰¬μš΄ UI μ–΄λ”” μ—†μ„κΉŒ?"
πŸ’­ "μœ μ§€λ³΄μˆ˜κ°€ κ°„νŽΈν•œ UIκ°€ μžˆμ—ˆμœΌλ©΄ μ’‹κ² μ–΄."
πŸ’­ "UI λΌμ΄λΈŒλŸ¬λ¦¬λ„ 곡뢀λ₯Ό ν•΄μ•Ό ν•˜λ‹€λ‹ˆ..."

elast-uiλŠ” 이런 κ³ λ―Όμ—μ„œ μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.
직관적이지 μ•Šμ€ UI μ»΄ν¬λ„ŒνŠΈμ™€ λ³΅μž‘ν•œ μœ μ§€λ³΄μˆ˜ μž‘μ—…μ€ κ°œλ°œμžμ—κ²Œ 큰 λΆ€λ‹΄μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

λ§Žμ€ UI λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 기본적인 κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€λ§Œ, ν•„μš”μ— 따라 자유둭게 μŠ€νƒ€μΌμ„ λ³€κ²½ν•˜κ±°λ‚˜ μ»΄ν¬λ„ŒνŠΈλ₯Ό ν™•μž₯ν•˜λŠ” 데 μ œμ•½μ΄ λ”°λ₯΄λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. 반면, μ§€λ‚˜μΉ˜κ²Œ μœ μ—°ν•œ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 일관성을 μžƒκ³  λ³΅μž‘λ„κ°€ λ†’μ•„μ Έ, μœ μ§€λ³΄μˆ˜μ— 어렀움을 κ²ͺ게 λ©λ‹ˆλ‹€.

μš°λ¦¬λŠ” μ–΄λ–»κ²Œ ν•˜λ©΄ 더 μ‰½κ²Œ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆμ„κΉŒ κ°œλ°œμžλ“€μ΄ 더 λΉ λ₯΄κ²Œ μž‘μ—…ν•  수 μžˆμ„κΉŒλ₯Ό κ³ λ―Όν–ˆκ³ 
κ·Έ ν•΄λ‹΅μœΌλ‘œ νƒ„μƒν•œ 것이 elast-uiμž…λ‹ˆλ‹€.



➰ Why elast-ui?

직관적인 μ»€μŠ€ν„°λ§ˆμ΄μ§•

elast-uiλŠ” μ»΄ν¬λ„ŒνŠΈμ˜ μ»€μŠ€ν„°λ§ˆμ΄μ§•μ΄ 쉽고 μ§κ΄€μ μž…λ‹ˆλ‹€. κ°œλ°œμžκ°€ CSSλ‚˜ μŠ€νƒ€μΌλ§μ„ λ³΅μž‘ν•˜κ²Œ 닀루지 μ•Šκ³ λ„ μžμ‹ λ§Œμ˜ μŠ€νƒ€μΌμ„ μ‰½κ²Œ μ μš©ν•  수 μžˆλŠ” ꡬ쑰λ₯Ό κ°–μΆ”κ³  μžˆμŠ΅λ‹ˆλ‹€.

μœ μ—°ν•œ μŠ€νƒ€μΌλ§ (TailwindCSS 기반)

TailwindCSSλ₯Ό 기반으둜 λ§Œλ“€μ–΄μ Έ μžˆμ–΄, 클래슀 기반의 μœ μ—°ν•œ μŠ€νƒ€μΌλ§μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μžλŠ” λΉ λ₯΄κ²Œ μŠ€νƒ€μΌμ„ λ³€κ²½ν•˜κ±°λ‚˜ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

TypeScript 지원

TypeScript둜 κ°œλ°œλ˜μ–΄ νƒ€μž… μ•ˆμ „μ„±μ΄ 보μž₯되며, κ°œλ°œμžκ°€ 컴파일 μ‹œ 였λ₯˜λ₯Ό 미리 감지할 수 μžˆμ–΄ μ•ˆμ •μ μΈ 개발 ν™˜κ²½μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μš΄ ꡬ쑰

elast-uiλŠ” μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ³  읽기 μ‰½κ²Œ μ„€κ³„ν•˜μ—¬, μœ μ§€λ³΄μˆ˜μ™€ ν™•μž₯이 μš©μ΄ν•©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ 규λͺ¨κ°€ 컀지더라도 μ‰½κ²Œ 관리할 수 μžˆλŠ” ꡬ쑰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.



βœ”οΈ Installation

elast-ui의 더 직관적이고 μœ μ—°ν•œ UIλ₯Ό 톡해 생산성과 가독성을 λ†’μ—¬λ³΄μ„Έμš”.

pnpm

pnpm add elast-ui

yarn

yarn add elast-ui

npm

npm install elast-ui

πŸ”§ 개발 ν™˜κ²½ μ„€μ •

이 ν”„λ‘œμ νŠΈλŠ” pnpm 기반의 λͺ¨λ…Έλ ˆν¬λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ 단계λ₯Ό 따라 개발 ν™˜κ²½μ„ μ„€μ •ν•˜μ„Έμš”.

μš”κ΅¬μ‚¬μ–‘

  • Node.js >= 16.14.0 (pnpm의 μ΅œμ†Œ μš”κ΅¬μ‚¬μ–‘)
  • pnpm >= 8.0.0

ν”„λ‘œμ νŠΈ μ„€μΉ˜ 및 μ‹€ν–‰

  1. μ €μž₯μ†Œ λ³΅μ œν•˜κΈ°
git clone https://github.com/your-username/elast-ui.git
cd elast-ui
  1. μ˜μ‘΄μ„± μ„€μΉ˜ν•˜κΈ°
pnpm install
  1. 개발 μ„œλ²„ μ‹œμž‘ν•˜κΈ°
# Core νŒ¨ν‚€μ§€ κ°μ‹œ λͺ¨λ“œ 및 Playground μ‹€ν–‰
pnpm dev

νŒ¨ν‚€μ§€ ꡬ쑰

  • packages/core: 핡심 UI μ»΄ν¬λ„ŒνŠΈ 라이브러리
  • packages/playground: μ»΄ν¬λ„ŒνŠΈ ν…ŒμŠ€νŠΈ 및 κ°œλ°œμ„ μœ„ν•œ 데λͺ¨ μ•±



β˜‘οΈ Components

INDEX

Select

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에 μ—λŸ¬ λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€

Keyboard Navigation

  • Enter: ν˜„μž¬ 포컀슀된 μ˜΅μ…˜μ„ μ„ νƒν•©λ‹ˆλ‹€.
  • ArrowUp / ArrowDown: λ“œλ‘­λ‹€μš΄μ—μ„œ μœ„/μ•„λž˜λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
  • Escape: λ“œλ‘­λ‹€μš΄μ„ λ‹«μŠ΅λ‹ˆλ‹€.

Error

required 속성이 μžˆλŠ” 경우, μœ νš¨μ„± 검사λ₯Ό ν†΅κ³Όν•˜μ§€ λͺ»ν•  λ•Œ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

<Select.Error>선택은 ν•„μˆ˜ ν•­λͺ©μž…λ‹ˆλ‹€.</Select.Error>

required

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>

Dataset을 μ΄μš©ν•œ μƒνƒœλ³„ μŠ€νƒ€μΌλ§

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

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에 μ—λŸ¬ λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

Keyboard Navigation

  • Enter: ν˜„μž¬ 포컀슀된 μ˜΅μ…˜μ„ μ„ νƒν•©λ‹ˆλ‹€.
  • ArrowUp / ArrowDown: λ“œλ‘­λ‹€μš΄μ—μ„œ μœ„/μ•„λž˜λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
  • Escape: λ“œλ‘­λ‹€μš΄μ„ λ‹«μŠ΅λ‹ˆλ‹€.

Error

required 속성이 μ§€μ •λœ 경우, μœ νš¨μ„± 검사에 μ‹€νŒ¨ν•˜λ©΄ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

<ComboBox.Error>μ˜΅μ…˜μ„ μ„ νƒν•˜μ„Έμš”.</ComboBox.Error>

Dataset을 μ΄μš©ν•œ μƒνƒœλ³„ μŠ€νƒ€μΌλ§

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

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: μŠ€νƒ€μΌμ„ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆλŠ” 클래슀 λ„€μž„μ„ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

Keyboard Navigation

  • Enter: ν˜„μž¬ 포컀슀된 μ˜΅μ…˜μ„ μ„ νƒν•©λ‹ˆλ‹€.
  • ArrowUp / ArrowDown: λ“œλ‘­λ‹€μš΄μ—μ„œ μœ„/μ•„λž˜λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
  • Escape: λ“œλ‘­λ‹€μš΄μ„ λ‹«μŠ΅λ‹ˆλ‹€.

Focus와 Selection μƒνƒœ μŠ€νƒ€μΌλ§

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

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

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: μŠ€νƒ€μΌμ„ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•˜κΈ° μœ„ν•΄ 클래슀λͺ…을 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

Keyboard Navigation

  • 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

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: μŠ€νƒ€μΌμ„ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•˜κΈ° μœ„ν•΄ 클래슀λͺ…을 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

Dataset을 μ΄μš©ν•œ μƒνƒœλ³„ μŠ€νƒ€μΌλ§

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 콜백 ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ©°, μƒˆλ‘œμš΄ μƒνƒœκ°’μ΄ μ „λ‹¬λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μžλŠ” μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

About

UI library designed for ease of use and effortless modification

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published