@pantoia/ui 0.1.0 → 0.2.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.
Files changed (63) hide show
  1. package/accordion/AGENTS.md +5 -5
  2. package/accordion/index.tsx +17 -9
  3. package/alert-dialog/AGENTS.md +7 -7
  4. package/alert-dialog/index.tsx +20 -10
  5. package/badge/AGENTS.md +5 -5
  6. package/badge/index.tsx +7 -7
  7. package/button/AGENTS.md +7 -7
  8. package/button/index.tsx +36 -36
  9. package/callout/AGENTS.md +4 -5
  10. package/callout/index.tsx +13 -14
  11. package/checkbox/AGENTS.md +5 -5
  12. package/checkbox/index.tsx +15 -13
  13. package/combobox/AGENTS.md +13 -13
  14. package/combobox/index.tsx +82 -38
  15. package/command-palette/AGENTS.md +3 -2
  16. package/command-palette/index.tsx +4 -2
  17. package/dialog/AGENTS.md +6 -6
  18. package/dialog/index.tsx +11 -5
  19. package/dist/index.js +63 -34
  20. package/drawer/AGENTS.md +5 -5
  21. package/drawer/index.tsx +8 -4
  22. package/dropdown-menu/AGENTS.md +12 -12
  23. package/dropdown-menu/index.tsx +23 -11
  24. package/field/AGENTS.md +8 -8
  25. package/field/index.tsx +27 -9
  26. package/input/AGENTS.md +4 -4
  27. package/input/index.tsx +8 -8
  28. package/kbd/AGENTS.md +1 -1
  29. package/kbd/index.tsx +6 -2
  30. package/label/AGENTS.md +1 -1
  31. package/label/index.tsx +3 -1
  32. package/number-field/AGENTS.md +6 -6
  33. package/number-field/index.tsx +22 -16
  34. package/package.json +3 -6
  35. package/popover/AGENTS.md +4 -4
  36. package/popover/index.tsx +14 -4
  37. package/press.css +7 -7
  38. package/radio-group/AGENTS.md +8 -8
  39. package/radio-group/index.tsx +20 -16
  40. package/registry.json +3 -51
  41. package/select/AGENTS.md +10 -10
  42. package/select/index.tsx +41 -23
  43. package/styles.css +291 -139
  44. package/switch/AGENTS.md +4 -4
  45. package/switch/index.tsx +13 -13
  46. package/table/AGENTS.md +9 -9
  47. package/table/index.tsx +17 -7
  48. package/tabs/AGENTS.md +4 -4
  49. package/tabs/index.module.css +1 -1
  50. package/tabs/index.tsx +17 -9
  51. package/textarea/AGENTS.md +4 -4
  52. package/textarea/index.tsx +8 -8
  53. package/toast/AGENTS.md +5 -13
  54. package/toast/index.tsx +31 -37
  55. package/toggle/AGENTS.md +4 -4
  56. package/toggle/index.tsx +10 -9
  57. package/tooltip/AGENTS.md +2 -2
  58. package/tooltip/index.tsx +14 -4
  59. package/code-block/AGENTS.md +0 -60
  60. package/code-block/index.module.css +0 -46
  61. package/code-block/index.tsx +0 -127
  62. package/copy-button/AGENTS.md +0 -43
  63. package/copy-button/index.tsx +0 -119
@@ -3,7 +3,7 @@
3
3
  ```
4
4
  받기 npx @pantoia/ui add number-field
5
5
  층 ui
6
- 파일 number-field/index.tsx · number-field/AGENTS.md
6
+ 파일 number-field/index.tsx, number-field/AGENTS.md
7
7
  ```
8
8
 
9
9
  ## 부위
@@ -34,15 +34,15 @@
34
34
  | `readOnly` | `boolean` | |
35
35
  | `className` | `string` | |
36
36
 
37
- ## 변형 — `numberField`
37
+ ## 변형 - `numberField`
38
38
 
39
- 슬롯 `root` · `step` · `input`
39
+ 슬롯 `root`, `step`, `input`
40
40
 
41
41
  | 축 | 값 | 기본 |
42
42
  |---|---|---|
43
- | `surface` | `bare` · `well` | `bare` |
44
- | `size` | `sm` · `md` · `lg` | `md` |
45
- | `readonly` | `true` | — |
43
+ | `surface` | `bare`, `well` | `bare` |
44
+ | `size` | `sm`, `md`, `lg` | `md` |
45
+ | `readonly` | `true` | - |
46
46
 
47
47
  ## 함께 받는 것
48
48
 
@@ -9,21 +9,22 @@ export const numberField = tv({
9
9
  slots: {
10
10
  root: 'flex items-center rounded-r8'
11
11
  + ' transition-state'
12
- + ' invalid-within:ring-2 invalid-within:ring-danger'
13
- + ' has-disabled:bg-disabled has-disabled:cursor-not-allowed'
12
+ + ' invalid-within:ring-2 invalid-within:ring-line-danger'
13
+ + ' has-disabled:bg-bg-neutral-disabled has-disabled:cursor-not-allowed'
14
14
  + ' has-focus-visible:outline-2 has-focus-visible:outline-offset-2'
15
- + ' has-focus-visible:outline-ring',
16
- step: 'text-fg-muted grid shrink-0 place-items-center rounded-r8'
17
- + ' transition-state press press-shrink enabled:hover:bg-hover'
18
- + ' disabled:text-fg-disabled disabled:cursor-not-allowed',
19
- input: 'text-value text-fg w-full min-w-0 bg-transparent text-center outline-none'
20
- + ' disabled:text-fg-disabled disabled:cursor-not-allowed',
15
+ + ' has-focus-visible:outline-line-focus-ring',
16
+ step: 'text-foreground-muted grid shrink-0 place-items-center rounded-r8'
17
+ + ' transition-state press press-shrink enabled:not-aria-disabled:hover:bg-bg-neutral-hover'
18
+ + ' disabled:text-foreground-disabled disabled:cursor-not-allowed'
19
+ + ' aria-disabled:text-foreground-disabled aria-disabled:cursor-not-allowed',
20
+ input: 'text-value text-foreground w-full min-w-0 bg-transparent text-center outline-none'
21
+ + ' disabled:text-foreground-disabled disabled:cursor-not-allowed',
21
22
  },
22
23
 
23
24
  variants: {
24
25
  surface: {
25
26
  bare: { root: 'bg-transparent ring-1 ring-inset ring-line-strong' },
26
- well: { root: 'bg-well' },
27
+ well: { root: 'bg-background-well' },
27
28
  },
28
29
  size: {
29
30
  sm: { root: 'h-8', step: 'size-8' },
@@ -31,7 +32,7 @@ export const numberField = tv({
31
32
  lg: { root: 'h-10', step: 'size-10', input: 'text-t16' },
32
33
  },
33
34
  readonly: {
34
- true: { root: 'bg-well', input: 'text-fg-muted' },
35
+ true: { root: 'bg-background-well', input: 'text-foreground-muted' },
35
36
  },
36
37
  },
37
38
 
@@ -55,8 +56,11 @@ function snap(n: number, min: number, step: number) {
55
56
  function useHold(step: () => void, blocked: boolean) {
56
57
  const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)
57
58
  const beat = useRef<ReturnType<typeof setInterval> | undefined>(undefined)
59
+ const latest = useRef(step)
58
60
  const [pressed, setPressed] = useState(false)
59
61
 
62
+ useEffect(() => { latest.current = step })
63
+
60
64
  const stop = () => {
61
65
  clearTimeout(timer.current)
62
66
  clearInterval(beat.current)
@@ -68,12 +72,12 @@ function useHold(step: () => void, blocked: boolean) {
68
72
  const onPointerDown = (e: ReactPointerEvent<HTMLButtonElement>) => {
69
73
  if (e.button !== 0 || blocked) return
70
74
 
71
- step()
75
+ latest.current()
72
76
  setPressed(true)
73
77
  e.currentTarget.setPointerCapture(e.pointerId)
74
78
 
75
79
  timer.current = setTimeout(() => {
76
- beat.current = setInterval(step, HOLD_EVERY)
80
+ beat.current = setInterval(() => { latest.current() }, HOLD_EVERY)
77
81
  }, HOLD_DELAY)
78
82
  }
79
83
 
@@ -132,8 +136,8 @@ export function NumberField(props: NumberFieldProps) {
132
136
  const atMin = current !== undefined && current <= min
133
137
  const atMax = current !== undefined && current >= max
134
138
 
135
- const down = useHold(() => { setTyping(null); set(from - step) }, blocked)
136
- const up = useHold(() => { setTyping(null); set(from + step) }, blocked)
139
+ const down = useHold(() => { setTyping(null); set(from - step) }, blocked || atMin)
140
+ const up = useHold(() => { setTyping(null); set(from + step) }, blocked || atMax)
137
141
 
138
142
  const onKeyDown = (e: ReactKeyboardEvent<HTMLInputElement>) => {
139
143
  if (blocked) return
@@ -180,7 +184,8 @@ export function NumberField(props: NumberFieldProps) {
180
184
  <button
181
185
  type="button"
182
186
  aria-label={decrementLabel}
183
- disabled={blocked || atMin}
187
+ disabled={blocked}
188
+ aria-disabled={atMin || undefined}
184
189
  data-pressed={down.pressed ? '' : undefined}
185
190
  className={ui.step()}
186
191
  onPointerDown={down.onPointerDown}
@@ -212,7 +217,8 @@ export function NumberField(props: NumberFieldProps) {
212
217
  <button
213
218
  type="button"
214
219
  aria-label={incrementLabel}
215
- disabled={blocked || atMax}
220
+ disabled={blocked}
221
+ aria-disabled={atMax || undefined}
216
222
  data-pressed={up.pressed ? '' : undefined}
217
223
  className={ui.step()}
218
224
  onPointerDown={up.onPointerDown}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pantoia/ui",
3
- "version": "0.1.0",
4
- "description": "Pantoia 디자인 시스템 — 소스를 복사해 가는 컴포넌트 스물여덟",
3
+ "version": "0.2.0",
4
+ "description": "Pantoia Design System",
5
5
  "homepage": "https://design.pantoia.com",
6
6
  "repository": {
7
7
  "type": "git",
@@ -43,7 +43,6 @@
43
43
  },
44
44
  "scripts": {
45
45
  "prepack": "tsc cli/index.ts --ignoreConfig --outDir dist --target es2022 --module esnext --moduleResolution bundler --skipLibCheck --types node",
46
- "lint": "eslint . --max-warnings 0",
47
46
  "typecheck": "tsc --noEmit"
48
47
  },
49
48
  "dependencies": {
@@ -60,14 +59,12 @@
60
59
  "tailwindcss": "^4.3.3"
61
60
  },
62
61
  "devDependencies": {
63
- "@pantoia/eslint-config": "*",
64
62
  "@pantoia/typescript-config": "*",
65
63
  "@types/node": "26.4.0",
66
64
  "@types/react": "19.2.18",
67
65
  "@types/react-dom": "19.2.5",
68
- "eslint": "10.9.1",
69
66
  "react": "19.2.8",
70
67
  "react-dom": "19.2.8",
71
- "typescript": "6.0.3"
68
+ "typescript": "7.0.2"
72
69
  }
73
70
  }
package/popover/AGENTS.md CHANGED
@@ -3,7 +3,7 @@
3
3
  ```
4
4
  받기 npx @pantoia/ui add popover
5
5
  층 ui
6
- 파일 popover/index.tsx · popover/AGENTS.md
6
+ 파일 popover/index.tsx, popover/AGENTS.md
7
7
  ```
8
8
 
9
9
  ## 부위
@@ -11,9 +11,9 @@
11
11
  | 이름 | props |
12
12
  |---|---|
13
13
  | `Popover` | `PopoverProps` |
14
- | `PopoverTrigger` | — |
15
- | `PopoverAnchor` | — |
16
- | `PopoverClose` | — |
14
+ | `PopoverTrigger` | - |
15
+ | `PopoverAnchor` | - |
16
+ | `PopoverClose` | - |
17
17
  | `PopoverContent` | `PopoverContentProps` |
18
18
 
19
19
  ### `PopoverTrigger`
package/popover/index.tsx CHANGED
@@ -38,6 +38,12 @@ export interface PopoverContentProps extends Omit<ComponentProps<typeof PopoverP
38
38
  arrow?: boolean
39
39
  }
40
40
 
41
+ const popoverContent = tv({
42
+ base: 'float text-foreground rounded-float z-overlay p-4'
43
+ + ' open:animate-enter closed:animate-exit'
44
+ + ' focus-visible:outline-none',
45
+ })
46
+
41
47
  export function PopoverContent({
42
48
  side = 'bottom',
43
49
  align = 'center',
@@ -54,12 +60,16 @@ export function PopoverContent({
54
60
  align={align}
55
61
  sideOffset={8}
56
62
  arrowPadding={16}
57
- className={tv({ base: 'bg-float text-fg rounded-float shadow-s3 z-overlay p-4'
58
- + ' open:animate-enter closed:animate-exit'
59
- + ' focus-visible:outline-none' })({ className })}
63
+ className={popoverContent({ className })}
60
64
  >
61
65
  {children}
62
- {arrow && <PopoverPrimitive.Arrow className="fill-float" width={12} height={6} />}
66
+ {arrow && (
67
+ <PopoverPrimitive.Arrow asChild width={12} height={6}>
68
+ <svg viewBox="0 0 12 6" preserveAspectRatio="none" className="fill-background-panel -translate-y-px">
69
+ <path d="M0 0L4.58579 4.58579C5.36683 5.36683 6.63316 5.36684 7.41421 4.58579L12 0" className="stroke-line stroke-1" />
70
+ </svg>
71
+ </PopoverPrimitive.Arrow>
72
+ )}
63
73
  </PopoverPrimitive.Content>
64
74
  </PopoverPrimitive.Portal>
65
75
  )
package/press.css CHANGED
@@ -1,5 +1,5 @@
1
- :root, .light { --pressed-dim: rgba(0,23,51,0.12); }
2
- .dark { --pressed-dim: rgba(209,209,253,0.14); }
1
+ :root, .light { --pds-pressed-dim: rgba(0,23,51,0.12); }
2
+ .dark { --pds-pressed-dim: rgba(209,209,253,0.14); }
3
3
 
4
4
  :root { --scale-press: 0.97; }
5
5
 
@@ -15,22 +15,22 @@
15
15
  position: absolute;
16
16
  inset: 0;
17
17
  border-radius: inherit;
18
- background: var(--pressed-dim);
18
+ background: var(--pds-pressed-dim);
19
19
  opacity: 0;
20
20
  pointer-events: none;
21
21
  transition: opacity var(--dur-state) var(--ease-state);
22
22
  }
23
23
 
24
- &:active:not(:disabled)::after,
25
- &[data-pressed]:not(:disabled)::after {
24
+ &:active:not(:disabled):not([aria-disabled="true"])::after,
25
+ &[data-pressed]:not(:disabled):not([aria-disabled="true"])::after {
26
26
  opacity: 1;
27
27
  transition-duration: 0s;
28
28
  }
29
29
  }
30
30
 
31
31
  @utility press-shrink {
32
- &:active:not(:disabled),
33
- &[data-pressed]:not(:disabled) {
32
+ &:active:not(:disabled):not([aria-disabled="true"]),
33
+ &[data-pressed]:not(:disabled):not([aria-disabled="true"]) {
34
34
  scale: var(--scale-press);
35
35
  transition-duration: 0s;
36
36
  }
@@ -3,7 +3,7 @@
3
3
  ```
4
4
  받기 npx @pantoia/ui add radio-group
5
5
  층 ui
6
- 파일 radio-group/index.tsx · radio-group/AGENTS.md
6
+ 파일 radio-group/index.tsx, radio-group/AGENTS.md
7
7
  ```
8
8
 
9
9
  ## 부위
@@ -12,8 +12,8 @@
12
12
  |---|---|
13
13
  | `RadioGroup` | `RadioGroupProps` |
14
14
  | `RadioGroupItem` | `RadioGroupItemProps` |
15
- | `RadioGroupItemLabel` | — |
16
- | `RadioGroupItemDescription` | — |
15
+ | `RadioGroupItemLabel` | - |
16
+ | `RadioGroupItemDescription` | - |
17
17
 
18
18
  ### `RadioGroupItemLabel`
19
19
 
@@ -33,7 +33,7 @@
33
33
 
34
34
  ### `RadioColor`
35
35
 
36
- `'control' | 'info' | 'success' | 'warning' | 'danger'`
36
+ `'neutral' | 'info' | 'success' | 'warning' | 'danger'`
37
37
 
38
38
  ### `RadioItemContext`
39
39
 
@@ -64,17 +64,17 @@
64
64
  | `className` | `string` | |
65
65
  | `children` | `ReactNode` | |
66
66
 
67
- ## 변형 — `radioGroupItem`
67
+ ## 변형 - `radioGroupItem`
68
68
 
69
- 슬롯 `root` · `control`
69
+ 슬롯 `root`, `control`
70
70
 
71
71
  | 축 | 값 | 기본 |
72
72
  |---|---|---|
73
- | `color` | `control` · `info` · `success` · `warning` · `danger` | `control` |
73
+ | `color` | `neutral`, `info`, `success`, `warning`, `danger` | `neutral` |
74
74
 
75
75
  ## 함께 받는 것
76
76
 
77
- `label` · `tv`
77
+ `label`, `tv`
78
78
 
79
79
  ## npm 의존
80
80
 
@@ -6,9 +6,9 @@ import { createContext, use, useId, type ReactNode } from 'react'
6
6
  import { Label } from '../label'
7
7
  import { tv } from '../tv'
8
8
 
9
- export type RadioColor = 'control' | 'info' | 'success' | 'warning' | 'danger'
9
+ export type RadioColor = 'neutral' | 'info' | 'success' | 'warning' | 'danger'
10
10
 
11
- const ColorContext = createContext<RadioColor>('control')
11
+ const ColorContext = createContext<RadioColor>('neutral')
12
12
 
13
13
  export interface RadioItemContext {
14
14
  id: string
@@ -25,23 +25,23 @@ export const radioGroupItem = tv({
25
25
  + ' bg-transparent transition-state press press-shrink'
26
26
  + ' inline-flex items-center justify-center'
27
27
  + ' checked:ring-2'
28
- + ' in-invalid:ring-2 in-invalid:ring-danger'
29
- + ' focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring'
30
- + ' disabled:ring-line disabled:bg-disabled disabled:cursor-not-allowed'
31
- + ' checked:disabled:bg-control-on-disabled checked:disabled:ring-control-on-disabled',
28
+ + ' in-invalid:ring-2 in-invalid:ring-line-danger'
29
+ + ' focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-line-focus-ring'
30
+ + ' disabled:ring-line disabled:bg-bg-neutral-disabled disabled:cursor-not-allowed'
31
+ + ' checked:disabled:bg-bg-neutral-solid-checked-disabled checked:disabled:ring-transparent',
32
32
  },
33
33
 
34
34
  variants: {
35
35
  color: {
36
- control: { control: 'checked:bg-control-on checked:ring-control-on' },
37
- info: { control: 'checked:bg-info checked:ring-info' },
38
- success: { control: 'checked:bg-success checked:ring-success' },
39
- warning: { control: 'checked:bg-warning checked:ring-warning' },
40
- danger: { control: 'checked:bg-danger checked:ring-danger' },
36
+ neutral: { control: 'checked:bg-bg-neutral-solid checked:ring-line-neutral-solid' },
37
+ info: { control: 'checked:bg-bg-info-solid checked:ring-line-info' },
38
+ success: { control: 'checked:bg-bg-success-solid checked:ring-line-success' },
39
+ warning: { control: 'checked:bg-bg-warning-solid checked:ring-line-warning' },
40
+ danger: { control: 'checked:bg-bg-danger-solid checked:ring-line-danger' },
41
41
  },
42
42
  },
43
43
 
44
- defaultVariants: { color: 'control' },
44
+ defaultVariants: { color: 'neutral' },
45
45
  })
46
46
 
47
47
  export interface RadioGroupProps {
@@ -54,11 +54,13 @@ export interface RadioGroupProps {
54
54
  children?: ReactNode
55
55
  }
56
56
 
57
+ const radioGroup = tv({ base: 'flex flex-col gap-3' })
58
+
57
59
  export function RadioGroup({
58
60
  value,
59
61
  defaultValue,
60
62
  onValueChange,
61
- color = 'control',
63
+ color = 'neutral',
62
64
  disabled = false,
63
65
  className,
64
66
  children,
@@ -72,7 +74,7 @@ export function RadioGroup({
72
74
  defaultValue={defaultValue}
73
75
  onValueChange={onValueChange}
74
76
  disabled={disabled}
75
- className={tv({ base: 'flex flex-col gap-3' })({ className })}
77
+ className={radioGroup({ className })}
76
78
  >
77
79
  {children}
78
80
  </RadioGroupPrimitive.Root>
@@ -103,7 +105,7 @@ export function RadioGroupItem({ value, disabled, className, children }: RadioGr
103
105
  aria-describedby={`${id}-description`}
104
106
  className={ui.control()}
105
107
  >
106
- <RadioGroupPrimitive.Indicator className="text-fg-on-control size-2.5 rounded-full bg-current" />
108
+ <RadioGroupPrimitive.Indicator className="text-fg-neutral-solid-contrast size-2.5 rounded-full bg-current" />
107
109
  </RadioGroupPrimitive.Item>
108
110
 
109
111
  <div className="flex min-w-0 flex-col gap-0.5">
@@ -124,6 +126,8 @@ export function RadioGroupItemLabel({ className, children }: { className?: strin
124
126
  )
125
127
  }
126
128
 
129
+ const radioGroupItemDescription = tv({ base: 'text-caption text-foreground-subtle' })
130
+
127
131
  export function RadioGroupItemDescription({ className, children }: { className?: string, children?: ReactNode }) {
128
132
  const ctx = use(ItemContext)
129
133
 
@@ -131,7 +135,7 @@ export function RadioGroupItemDescription({ className, children }: { className?:
131
135
  <p
132
136
  id={ctx?.descriptionId}
133
137
  data-description
134
- className={tv({ base: 'text-caption text-fg-subtle' })({ className })}
138
+ className={radioGroupItemDescription({ className })}
135
139
  >
136
140
  {children}
137
141
  </p>
package/registry.json CHANGED
@@ -169,35 +169,6 @@
169
169
  "layer": "ui"
170
170
  }
171
171
  },
172
- {
173
- "name": "code-block",
174
- "type": "registry:ui",
175
- "title": "CodeBlock",
176
- "files": [
177
- {
178
- "path": "code-block/index.tsx",
179
- "type": "registry:ui"
180
- },
181
- {
182
- "path": "code-block/index.module.css",
183
- "type": "registry:ui"
184
- },
185
- {
186
- "path": "code-block/AGENTS.md",
187
- "type": "registry:file",
188
- "target": "code-block/AGENTS.md"
189
- }
190
- ],
191
- "dependencies": [
192
- "lucide-react"
193
- ],
194
- "registryDependencies": [
195
- "tv"
196
- ],
197
- "meta": {
198
- "layer": "ui"
199
- }
200
- },
201
172
  {
202
173
  "name": "combobox",
203
174
  "type": "registry:ui",
@@ -251,28 +222,6 @@
251
222
  "layer": "derived"
252
223
  }
253
224
  },
254
- {
255
- "name": "copy-button",
256
- "type": "registry:ui",
257
- "title": "CopyButton",
258
- "files": [
259
- {
260
- "path": "copy-button/index.tsx",
261
- "type": "registry:ui"
262
- },
263
- {
264
- "path": "copy-button/AGENTS.md",
265
- "type": "registry:file",
266
- "target": "copy-button/AGENTS.md"
267
- }
268
- ],
269
- "registryDependencies": [
270
- "button"
271
- ],
272
- "meta": {
273
- "layer": "derived"
274
- }
275
- },
276
225
  {
277
226
  "name": "dialog",
278
227
  "type": "registry:ui",
@@ -667,6 +616,9 @@
667
616
  "dependencies": [
668
617
  "sonner"
669
618
  ],
619
+ "registryDependencies": [
620
+ "tv"
621
+ ],
670
622
  "meta": {
671
623
  "layer": "ui"
672
624
  }
package/select/AGENTS.md CHANGED
@@ -3,7 +3,7 @@
3
3
  ```
4
4
  받기 npx @pantoia/ui add select
5
5
  층 ui
6
- 파일 select/index.tsx · select/AGENTS.md
6
+ 파일 select/index.tsx, select/AGENTS.md
7
7
  ```
8
8
 
9
9
  ## 부위
@@ -11,11 +11,11 @@
11
11
  | 이름 | props |
12
12
  |---|---|
13
13
  | `Select` | `SelectProps` |
14
- | `SelectGroup` | — |
15
- | `SelectItem` | — |
16
- | `SelectItemText` | — |
17
- | `SelectItemDescription` | — |
18
- | `SelectSeparator` | — |
14
+ | `SelectGroup` | - |
15
+ | `SelectItem` | - |
16
+ | `SelectItemText` | - |
17
+ | `SelectItemDescription` | - |
18
+ | `SelectSeparator` | - |
19
19
 
20
20
  ### `SelectGroup`
21
21
 
@@ -74,12 +74,12 @@
74
74
  | `arrow` | `boolean` | |
75
75
  | `children` | `ReactNode` | |
76
76
 
77
- ## 변형 — `selectTrigger`
77
+ ## 변형 - `selectTrigger`
78
78
 
79
79
  | 축 | 값 | 기본 |
80
80
  |---|---|---|
81
- | `surface` | `bare` · `well` | `bare` |
82
- | `size` | `sm` · `md` · `lg` | `md` |
81
+ | `surface` | `bare`, `well` | `bare` |
82
+ | `size` | `sm`, `md`, `lg` | `md` |
83
83
 
84
84
  ## 함께 받는 것
85
85
 
@@ -87,4 +87,4 @@
87
87
 
88
88
  ## npm 의존
89
89
 
90
- `lucide-react` · `radix-ui`
90
+ `lucide-react`, `radix-ui`