@ceed/ads 1.30.0 → 1.31.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 (71) hide show
  1. package/dist/Overview.md +5 -5
  2. package/dist/components/Calendar/utils/index.d.ts +1 -0
  3. package/dist/components/DatePicker/DatePicker.d.ts +4 -0
  4. package/dist/components/DateRangePicker/DateRangePicker.d.ts +4 -0
  5. package/dist/components/MonthRangePicker/MonthRangePicker.d.ts +8 -0
  6. package/dist/components/data-display/Avatar.md +85 -74
  7. package/dist/components/data-display/Badge.md +23 -5
  8. package/dist/components/data-display/Chip.md +49 -35
  9. package/dist/components/data-display/DataTable.md +93 -0
  10. package/dist/components/data-display/InfoSign.md +15 -5
  11. package/dist/components/data-display/Markdown.md +22 -26
  12. package/dist/components/data-display/Table.md +63 -53
  13. package/dist/components/data-display/Tooltip.md +70 -58
  14. package/dist/components/data-display/Typography.md +28 -11
  15. package/dist/components/feedback/Alert.md +86 -74
  16. package/dist/components/feedback/CircularProgress.md +20 -5
  17. package/dist/components/feedback/Dialog.md +8 -12
  18. package/dist/components/feedback/Modal.md +12 -16
  19. package/dist/components/feedback/Skeleton.md +20 -5
  20. package/dist/components/inputs/Autocomplete.md +8 -10
  21. package/dist/components/inputs/Button.md +107 -87
  22. package/dist/components/inputs/ButtonGroup.md +20 -5
  23. package/dist/components/inputs/Calendar.md +25 -5
  24. package/dist/components/inputs/Checkbox.md +171 -450
  25. package/dist/components/inputs/CurrencyInput.md +25 -5
  26. package/dist/components/inputs/DatePicker.md +59 -5
  27. package/dist/components/inputs/DateRangePicker.md +46 -5
  28. package/dist/components/inputs/FilterMenu.md +85 -9
  29. package/dist/components/inputs/FilterableCheckboxGroup.md +23 -8
  30. package/dist/components/inputs/FormControl.md +34 -6
  31. package/dist/components/inputs/IconButton.md +21 -5
  32. package/dist/components/inputs/Input.md +254 -68
  33. package/dist/components/inputs/MonthPicker.md +59 -5
  34. package/dist/components/inputs/MonthRangePicker.md +44 -5
  35. package/dist/components/inputs/PercentageInput.md +28 -5
  36. package/dist/components/inputs/RadioButton.md +26 -5
  37. package/dist/components/inputs/RadioList.md +23 -6
  38. package/dist/components/inputs/RadioTileGroup.md +40 -8
  39. package/dist/components/inputs/Select.md +59 -5
  40. package/dist/components/inputs/Slider.md +26 -5
  41. package/dist/components/inputs/Switch.md +23 -5
  42. package/dist/components/inputs/Textarea.md +27 -5
  43. package/dist/components/inputs/Uploader/Uploader.md +24 -5
  44. package/dist/components/layout/Box.md +66 -58
  45. package/dist/components/layout/Container.md +9 -13
  46. package/dist/components/layout/Grid.md +91 -75
  47. package/dist/components/layout/Stack.md +85 -70
  48. package/dist/components/navigation/Breadcrumbs.md +23 -14
  49. package/dist/components/navigation/Dropdown.md +29 -20
  50. package/dist/components/navigation/IconMenuButton.md +24 -11
  51. package/dist/components/navigation/InsetDrawer.md +16 -5
  52. package/dist/components/navigation/Link.md +30 -14
  53. package/dist/components/navigation/Menu.md +33 -20
  54. package/dist/components/navigation/MenuButton.md +26 -12
  55. package/dist/components/navigation/NavigationGroup.md +7 -11
  56. package/dist/components/navigation/NavigationItem.md +8 -12
  57. package/dist/components/navigation/Navigator.md +5 -9
  58. package/dist/components/navigation/Pagination.md +21 -12
  59. package/dist/components/navigation/ProfileMenu.md +17 -5
  60. package/dist/components/navigation/Stepper.md +18 -5
  61. package/dist/components/navigation/Tabs.md +37 -14
  62. package/dist/components/surfaces/Accordions.md +12 -16
  63. package/dist/components/surfaces/Card.md +59 -47
  64. package/dist/components/surfaces/Divider.md +70 -61
  65. package/dist/components/surfaces/Sheet.md +18 -5
  66. package/dist/index.browser.js +4 -4
  67. package/dist/index.browser.js.map +3 -3
  68. package/dist/index.cjs +99 -39
  69. package/dist/index.js +99 -39
  70. package/framer/index.js +1 -1
  71. package/package.json +1 -1
@@ -1,11 +1,8 @@
1
1
  # Input
2
2
 
3
- Input 컴포넌트는 사용자로부터 텍스트 입력을 받기 위한 기본 컴포넌트입니다. 다양한 스타일, 크기 및 기능을 지원합니다.
3
+ ## Introduction
4
4
 
5
- > 💡 **Form 구성 내장 prop 사용을 권장합니다**
6
- >
7
- > 이 컴포넌트는 `label`, `helperText` 등의 Form 요소를 자체적으로 지원합니다.
8
- > Form을 구성할 때 Typography로 별도의 label이나 helperText를 만드는 대신, 컴포넌트의 내장 prop을 사용하세요.
5
+ Input is a single-line text field component for capturing user input. Built on Joy UI's Input with Framer Motion animation support, it includes built-in form field composition (`label`, `helperText`, `error`) so you can build complete form fields without manual `FormControl` wrappers. It supports clearable inputs, password visibility toggling, and start/end decorators.
9
6
 
10
7
  ```tsx
11
8
  <Input />
@@ -34,17 +31,33 @@ Input 컴포넌트는 사용자로부터 텍스트 입력을 받기 위한 기
34
31
  | sx | — | — |
35
32
  | className | — | — |
36
33
 
37
- ## 기본형
34
+ > **Use built-in form props**
35
+ >
36
+ > This component natively supports `label` and `helperText` props.
37
+ > When building forms, use these built-in props instead of manually composing labels and helper text with Typography.
38
38
 
39
- Input의 기본 형태입니다. 사용자의 텍스트 입력을 받는 단일 라인 필드입니다.
39
+ ## Usage
40
40
 
41
41
  ```tsx
42
- <Input />
42
+ import { Input } from '@ceed/ads';
43
+
44
+ function MyComponent() {
45
+ const [value, setValue] = useState('');
46
+
47
+ return (
48
+ <Input
49
+ label="Name"
50
+ placeholder="Enter your name"
51
+ value={value}
52
+ onChange={(e) => setValue(e.target.value)}
53
+ />
54
+ );
55
+ }
43
56
  ```
44
57
 
45
- ## 변형(Variants)
58
+ ## Variants
46
59
 
47
- Input 가지 변형을 지원합니다: `solid`, `soft`, `outlined`, `plain`
60
+ Input supports four visual styles: `outlined` (default), `solid`, `soft`, and `plain`.
48
61
 
49
62
  ```tsx
50
63
  <>
@@ -55,9 +68,9 @@ Input은 네 가지 변형을 지원합니다: `solid`, `soft`, `outlined`, `pla
55
68
  </>
56
69
  ```
57
70
 
58
- ## 크기(Sizes)
71
+ ## Sizes
59
72
 
60
- Input은 가지 크기를 지원합니다: `sm`, `md`, `lg`
73
+ Three sizes are available: `sm`, `md` (default), and `lg`.
61
74
 
62
75
  ```tsx
63
76
  <>
@@ -67,13 +80,11 @@ Input은 세 가지 크기를 지원합니다: `sm`, `md`, `lg`
67
80
  </>
68
81
  ```
69
82
 
70
- ## 레이블 도움말 텍스트
71
-
72
- Input 컴포넌트에 `label`과 `helperText` 속성을 추가하여 사용자에게 추가 정보를 제공할 수 있습니다.
83
+ ## Label and Helper Text
73
84
 
74
- ### 레이블(Label)
85
+ ### Label
75
86
 
76
- `label` 속성을 사용하여 Input 위에 레이블을 표시할 있습니다.
87
+ The `label` prop renders a form label above the input.
77
88
 
78
89
  ```tsx
79
90
  <>
@@ -81,9 +92,9 @@ Input 컴포넌트에 `label`과 `helperText` 속성을 추가하여 사용자
81
92
  </>
82
93
  ```
83
94
 
84
- ### 도움말 텍스트(Helper Text)
95
+ ### Helper Text
85
96
 
86
- `helperText` 속성을 사용하여 Input 아래에 추가 정보를 제공할 수 있습니다.
97
+ The `helperText` prop renders descriptive text below the input.
87
98
 
88
99
  ```tsx
89
100
  <>
@@ -91,19 +102,19 @@ Input 컴포넌트에 `label`과 `helperText` 속성을 추가하여 사용자
91
102
  </>
92
103
  ```
93
104
 
94
- ## 상태(States)
105
+ ## States
95
106
 
96
- ### 비활성화(Disabled)
107
+ ### Disabled
97
108
 
98
- `disabled` 속성을 사용하여 Input을 비활성화할 있습니다.
109
+ A disabled input cannot be focused or interacted with.
99
110
 
100
111
  ```tsx
101
112
  <Input disabled />
102
113
  ```
103
114
 
104
- ### 오류 상태(Error)
115
+ ### Error
105
116
 
106
- `error` 속성을 사용하여 오류 상태를 표시할 있습니다.
117
+ Set `error` to visually indicate a validation failure. Combine with `helperText` to display an error message.
107
118
 
108
119
  ```tsx
109
120
  <>
@@ -111,9 +122,9 @@ Input 컴포넌트에 `label`과 `helperText` 속성을 추가하여 사용자
111
122
  </>
112
123
  ```
113
124
 
114
- ### 필수 값(Required)
125
+ ### Required
115
126
 
116
- `required` 속성을 사용하여 필수 입력 필드임을 표시할 있습니다.
127
+ Set `required` to mark the field as required. An asterisk is added to the label automatically.
117
128
 
118
129
  ```tsx
119
130
  <Input
@@ -124,9 +135,9 @@ Input 컴포넌트에 `label`과 `helperText` 속성을 추가하여 사용자
124
135
  />
125
136
  ```
126
137
 
127
- ## 장식자(Decorators)
138
+ ## Decorators
128
139
 
129
- Input 컴포넌트는 `startDecorator`와 `endDecorator` 속성을 통해 입력 필드의 시작과 부분에 아이콘, 버튼 또는 기타 요소를 추가할 있습니다.
140
+ Use `startDecorator` and `endDecorator` to add icons, buttons, or other elements at the start or end of the input field.
130
141
 
131
142
  ```tsx
132
143
  <Stack spacing={3}>
@@ -166,7 +177,7 @@ width: 300
166
177
  </Stack>
167
178
  ```
168
179
 
169
- `endDecorator`와 `enableClearable`을 함께 사용하면 다음과 같습니다:
180
+ When using `endDecorator` together with `enableClearable`, both elements are displayed side by side:
170
181
 
171
182
  ```tsx
172
183
  <Input
@@ -177,9 +188,9 @@ width: 300
177
188
  />
178
189
  ```
179
190
 
180
- ## 지울 수 있는 입력(Clearable Input)
191
+ ## Clearable Input
181
192
 
182
- `enableClearable` 속성을 사용하여 Input에 내용을 지울 있는 버튼을 추가할 있습니다.
193
+ Set `enableClearable` to show a clear button when the input has a value. Clicking the button clears the input content.
183
194
 
184
195
  ```tsx
185
196
  <>
@@ -187,9 +198,16 @@ width: 300
187
198
  </>
188
199
  ```
189
200
 
190
- ## 비밀번호 입력(Password Input)
201
+ ```tsx
202
+ <Input
203
+ enableClearable
204
+ placeholder="Type something and clear it"
205
+ />
206
+ ```
207
+
208
+ ## Password Input
191
209
 
192
- `type="password"` 속성을 사용하면 비밀번호 입력 필드가 생성되며, 자동으로 비밀번호 표시/숨김 토글 버튼이 추가됩니다.
210
+ Setting `type="password"` creates a password field with an automatic visibility toggle button.
193
211
 
194
212
  ```tsx
195
213
  <Stack spacing={3}>
@@ -204,26 +222,17 @@ width: 300
204
222
  </Stack>
205
223
  ```
206
224
 
207
- ### 비밀번호 토글 비활성화
225
+ ### Disabling the Password Toggle
208
226
 
209
- 비밀번호 입력 필드의 토글 버튼은 `disableTogglePasswordButton` 속성을 사용하여 비활성화할 있습니다.
227
+ Use `disableTogglePasswordButton` to hide the visibility toggle button on password inputs.
210
228
 
211
229
  ```tsx
212
- <Stack spacing={3}>
213
- <Typography level="body-md">Default password input with toggle button:</Typography>
214
- <Input {...args} placeholder="Enter password" type="password" label="Password" />
215
-
216
- <Typography level="body-md">Disabled password input:</Typography>
217
- <Input {...args} placeholder="Enter password" type="password" label="Disabled Password" disabled />
218
-
219
- <Typography level="body-md">Password input with toggle button disabled:</Typography>
220
- <Input {...args} placeholder="Enter password" type="password" label="No Toggle" disableTogglePasswordButton />
221
- </Stack>
230
+ <Input type="password" disableTogglePasswordButton placeholder="Password" />
222
231
  ```
223
232
 
224
- ### 비밀번호 입력의 제한 사항
233
+ ### Password Input Limitations
225
234
 
226
- 비밀번호 입력 필드(`type="password"`)에서는 `endDecorator`를 사용할 없습니다. 이는 비밀번호 토글 버튼이 해당 위치를 차지하기 때문입니다.
235
+ Password inputs (`type="password"`) do not support custom `endDecorator` because the password toggle button occupies that slot. If you provide `endDecorator` with a password input, the component logs a warning and ignores it.
227
236
 
228
237
  ```tsx
229
238
  <Stack spacing={3}>
@@ -235,9 +244,9 @@ width: 300
235
244
  </Stack>
236
245
  ```
237
246
 
238
- ## 폼 컨트롤(Form Control)
247
+ ## Form Control
239
248
 
240
- Input 컴포넌트는 `label`, `helperText`, `error` 속성을 조합하여 완전한 컨트롤을 구성할 수 있습니다.
249
+ Combining `label`, `helperText`, and `error` produces a complete form field.
241
250
 
242
251
  ```tsx
243
252
  <>
@@ -246,11 +255,25 @@ Input 컴포넌트는 `label`, `helperText`, `error` 속성을 조합하여 완
246
255
  </>
247
256
  ```
248
257
 
249
- ## 상태 관리
258
+ ```tsx
259
+ <Input
260
+ label="Email"
261
+ helperText="We'll never share your email"
262
+ required
263
+ />
264
+
265
+ <Input
266
+ label="Email"
267
+ error
268
+ helperText="Invalid email address"
269
+ />
270
+ ```
271
+
272
+ ## Controlled / Uncontrolled
250
273
 
251
- ### 제어 컴포넌트(Controlled Component)
274
+ ### Controlled
252
275
 
253
- Input은 React의 제어 컴포넌트로 사용할 수 있습니다. `value`와 `onChange` 속성을 사용하여 상태를 관리합니다.
276
+ Use `value` and `onChange` for controlled behavior.
254
277
 
255
278
  ```tsx
256
279
  <>
@@ -258,31 +281,194 @@ Input은 React의 제어 컴포넌트로 사용할 수 있습니다. `value`와
258
281
  </>
259
282
  ```
260
283
 
261
- ### 비제어 컴포넌트(Uncontrolled Component)
284
+ ```tsx
285
+ const [value, setValue] = useState('');
286
+
287
+ <Input
288
+ value={value}
289
+ onChange={(e) => setValue(e.target.value)}
290
+ placeholder="Controlled input"
291
+ />
292
+ ```
293
+
294
+ ### Uncontrolled
295
+
296
+ Use `defaultValue` for uncontrolled behavior.
297
+
298
+ ```tsx
299
+ <Input defaultValue="Initial value" placeholder="Uncontrolled input" />
300
+ ```
301
+
302
+ ## Search Field
303
+
304
+ ```tsx
305
+ import { Input } from '@ceed/ads';
306
+ import SearchIcon from '@mui/icons-material/Search';
307
+
308
+ function SearchField({ onSearch }) {
309
+ const [query, setQuery] = useState('');
310
+
311
+ return (
312
+ <Input
313
+ placeholder="Search..."
314
+ startDecorator={<SearchIcon />}
315
+ enableClearable
316
+ value={query}
317
+ onChange={(e) => {
318
+ setQuery(e.target.value);
319
+ onSearch(e.target.value);
320
+ }}
321
+ />
322
+ );
323
+ }
324
+ ```
325
+
326
+ ## Login Form
327
+
328
+ ```tsx
329
+ import { Input, Button, Stack } from '@ceed/ads';
330
+
331
+ function LoginForm({ onSubmit }) {
332
+ return (
333
+ <form onSubmit={onSubmit}>
334
+ <Stack spacing={2}>
335
+ <Input
336
+ label="Email"
337
+ type="email"
338
+ required
339
+ placeholder="Enter your email"
340
+ />
341
+ <Input
342
+ label="Password"
343
+ type="password"
344
+ required
345
+ placeholder="Enter your password"
346
+ />
347
+ <Button type="submit">Sign In</Button>
348
+ </Stack>
349
+ </form>
350
+ );
351
+ }
352
+ ```
353
+
354
+ ## Form with Validation
262
355
 
263
- `defaultValue` 속성을 사용하여 비제어 컴포넌트로도 사용 가능합니다.
356
+ ```tsx
357
+ import { useState } from 'react';
358
+ import { Input, Button, Stack } from '@ceed/ads';
359
+
360
+ function ValidatedForm() {
361
+ const [email, setEmail] = useState('');
362
+ const [submitted, setSubmitted] = useState(false);
363
+ const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
364
+
365
+ return (
366
+ <form onSubmit={(e) => { e.preventDefault(); setSubmitted(true); }}>
367
+ <Stack spacing={2}>
368
+ <Input
369
+ label="Email"
370
+ required
371
+ value={email}
372
+ onChange={(e) => setEmail(e.target.value)}
373
+ error={submitted && !isValid}
374
+ helperText={submitted && !isValid ? 'Please enter a valid email' : undefined}
375
+ placeholder="user@example.com"
376
+ />
377
+ <Button type="submit">Submit</Button>
378
+ </Stack>
379
+ </form>
380
+ );
381
+ }
382
+ ```
264
383
 
265
- ## 접근성(Accessibility)
384
+ ## Props and Customization
385
+
386
+ ### Key Props
387
+
388
+ | Prop | Type | Default | Description |
389
+ | ----------------------------- | -------------------------------------------------------------- | ------------ | ------------------------------------------------------------------------------- |
390
+ | `label` | `ReactNode` | - | Label text displayed above the input |
391
+ | `helperText` | `ReactNode` | - | Helper text displayed below the input |
392
+ | `error` | `boolean` | `false` | Applies danger color to indicate validation error |
393
+ | `enableClearable` | `boolean` | `false` | Shows a clear button when the input has a value |
394
+ | `disableTogglePasswordButton` | `boolean` | `false` | Hides the password visibility toggle (only applies when `type="password"`) |
395
+ | `value` | `string` | - | Input value for controlled mode |
396
+ | `defaultValue` | `string` | - | Initial value for uncontrolled mode |
397
+ | `onChange` | `(event: ChangeEvent<HTMLInputElement>) => void` | - | Callback when the input value changes |
398
+ | `placeholder` | `string` | - | Placeholder text when the input is empty |
399
+ | `type` | `string` | `'text'` | HTML input type (`text`, `password`, `email`, `number`, etc.) |
400
+ | `disabled` | `boolean` | `false` | Disables the input |
401
+ | `readOnly` | `boolean` | `false` | Makes the input read-only (focusable but not editable) |
402
+ | `required` | `boolean` | `false` | Marks the field as required (adds asterisk to label) |
403
+ | `name` | `string` | - | HTML name attribute for form submission |
404
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Input size |
405
+ | `variant` | `'outlined' \| 'solid' \| 'soft' \| 'plain'` | `'outlined'` | Visual style variant |
406
+ | `color` | `'primary' \| 'neutral' \| 'danger' \| 'success' \| 'warning'` | `'neutral'` | Color scheme |
407
+ | `startDecorator` | `ReactNode` | - | Content rendered at the start of the input |
408
+ | `endDecorator` | `ReactNode` | - | Content rendered at the end of the input (not supported with `type="password"`) |
409
+ | `sx` | `SxProps` | - | Custom styles using the MUI system |
410
+
411
+ > **Note**: Input also accepts all Joy UI Input props and Framer Motion props.
412
+
413
+ ## Best Practices
414
+
415
+ 1. **Use built-in `label` and `helperText`** instead of wrapping with FormControl manually.
266
416
 
267
- Input 컴포넌트는 웹 접근성 표준을 준수합니다:
417
+ ```tsx
418
+ // ✅ Good
419
+ <Input label="Email" helperText="Enter your work email" />
420
+
421
+ // ❌ Bad
422
+ <FormControl>
423
+ <FormLabel>Email</FormLabel>
424
+ <Input />
425
+ <FormHelperText>Enter your work email</FormHelperText>
426
+ </FormControl>
427
+ ```
268
428
 
269
- - 적절한 레이블과 연결되어 있습니다.
270
- - 키보드 탐색이 가능합니다.
271
- - 오류 상태는 시각적으로 명확하게 표시됩니다.
429
+ 2. **Choose the right input type** for the data being captured.
272
430
 
273
- ## 테스팅(Testing)
431
+ ```tsx
432
+ // ✅ Good: Appropriate types
433
+ <Input type="email" label="Email" />
434
+ <Input type="password" label="Password" />
435
+ <Input type="tel" label="Phone" />
274
436
 
275
- ### Testing Library 참고사항
437
+ // Bad: Generic text for everything
438
+ <Input type="text" label="Email" />
439
+ ```
276
440
 
277
- - `type="password"` 속성을 가진 Input을 Testing Library로 찾을 때는 항상 `textbox` 역할(role)로 찾아야 합니다.
278
- - 이는 ARIA 명세에 따라 `password` 입력이 특별한 role을 갖지 않고 기본적으로 `textbox` role을 사용하기 때문입니다.
441
+ 3. **Always provide labels** for accessibility. If a visible label is not appropriate, use `aria-label`.
279
442
 
280
443
  ```tsx
281
- // 비밀번호 입력 필드를 찾는 예시
282
- const passwordInput = screen.getByRole('textbox', { name: /비밀번호/i });
444
+ // Good: Visible label
445
+ <Input label="Search" />
446
+
447
+ // ✅ Good: Hidden label for icon-only inputs
448
+ <Input aria-label="Search" startDecorator={<SearchIcon />} />
449
+
450
+ // ❌ Bad: No label at all
451
+ <Input placeholder="Search..." />
283
452
  ```
284
453
 
285
- **참고 이슈:**
454
+ 4. **Use `enableClearable` for search and filter inputs** where users frequently need to clear and re-enter values.
455
+
456
+ 5. **Do not use `endDecorator` with password inputs.** The password toggle button occupies the end slot. Use `startDecorator` instead for additional icons.
457
+
458
+ ## Accessibility
459
+
460
+ - **Label association**: The `label` prop automatically connects the label to the input via `htmlFor`/`id` pairing.
461
+ - **Keyboard navigation**: Standard keyboard support — Tab to focus, type to input, Escape to blur (when applicable).
462
+ - **Error announcement**: When `error` is set, `aria-invalid` is applied. Pair with `helperText` so assistive technology announces the error.
463
+ - **Required state**: The `required` prop adds `aria-required` and a visible asterisk to the label.
464
+ - **Password toggle**: The visibility toggle button is keyboard-accessible and includes an appropriate `aria-label`.
465
+
466
+ ## Testing Notes
467
+
468
+ When using Testing Library, always query password inputs by `textbox` role:
469
+
470
+ ```tsx
471
+ const passwordInput = screen.getByRole('textbox', { name: /password/i });
472
+ ```
286
473
 
287
- - [W3C ARIA: Should there be a role=password?](https://github.com/w3c/aria/issues/935)
288
- - [Testing Library: How to find password inputs](https://github.com/testing-library/dom-testing-library/issues/567)
474
+ This is because the ARIA specification does not define a `password` rolepassword inputs use the default `textbox` role.
@@ -229,6 +229,18 @@ The `displayFormat` prop controls what users see in the input field, independent
229
229
  setValue6(e.target.value);
230
230
  args.onChange?.(e);
231
231
  }} />
232
+ <MonthPicker {...args} value={value6} label="MMM YYYY" name="MMM YYYY" displayFormat="MMM YYYY" onChange={e => {
233
+ setValue6(e.target.value);
234
+ args.onChange?.(e);
235
+ }} />
236
+ <MonthPicker {...args} value={value6} label="MMM YYYY (en-US)" name="MMM YYYY (en-US)" displayFormat="MMM YYYY" locale="en-US" onChange={e => {
237
+ setValue6(e.target.value);
238
+ args.onChange?.(e);
239
+ }} />
240
+ <MonthPicker {...args} value={value6} label="MMM YYYY (ko-KR)" name="MMM YYYY (ko-KR)" displayFormat="MMM YYYY" locale="ko-KR" onChange={e => {
241
+ setValue6(e.target.value);
242
+ args.onChange?.(e);
243
+ }} />
232
244
  </Stack>
233
245
  ```
234
246
 
@@ -248,9 +260,7 @@ A controlled example with an external reset button to clear the selected value.
248
260
  </div>
249
261
  ```
250
262
 
251
- ## Common Use Cases
252
-
253
- ### Billing Period Selection
263
+ ## Billing Period Selection
254
264
 
255
265
  ```tsx
256
266
  function BillingPeriodSelector() {
@@ -268,7 +278,7 @@ function BillingPeriodSelector() {
268
278
  }
269
279
  ```
270
280
 
271
- ### Report Month Filter with Display Format
281
+ ## Report Month Filter with Display Format
272
282
 
273
283
  ```tsx
274
284
  function ReportFilter() {
@@ -286,7 +296,7 @@ function ReportFilter() {
286
296
  }
287
297
  ```
288
298
 
289
- ### Credit Card Expiry
299
+ ## Credit Card Expiry
290
300
 
291
301
  ```tsx
292
302
  function CreditCardExpiry() {
@@ -359,6 +369,50 @@ const handleChange = (e) => {
359
369
  };
360
370
  ```
361
371
 
372
+ ## Props and Customization
373
+
374
+ ### Key Props
375
+
376
+ | Prop | Type | Default | Description |
377
+ | --------------- | ------------------------------------------------------- | -------------- | ---------------------------------------------------------------------------------------------------------- |
378
+ | `value` | `string` | - | Selected month string in `format` (controlled mode) |
379
+ | `defaultValue` | `string` | `''` | Initial month string (uncontrolled mode) |
380
+ | `onChange` | `(event: { target: { name?, value: string } }) => void` | - | Callback when the month changes |
381
+ | `format` | `string` | `'YYYY/MM/DD'` | Format of the `value` and `onChange` value |
382
+ | `displayFormat` | `string` | `'YYYY/MM'` | Format displayed in the input field. Supports `MMM` (short month name) and `MMMM` (full month name) tokens |
383
+ | `label` | `ReactNode` | - | Form label displayed above the input |
384
+ | `helperText` | `ReactNode` | - | Helper text displayed below the input |
385
+ | `error` | `boolean` | `false` | Applies danger color to indicate validation error |
386
+ | `required` | `boolean` | `false` | Marks the field as required |
387
+ | `disabled` | `boolean` | `false` | Disables the entire component |
388
+ | `name` | `string` | - | HTML name attribute for form submission |
389
+ | `minDate` | `string` | - | Minimum selectable month (in `format`) |
390
+ | `maxDate` | `string` | - | Maximum selectable month (in `format`) |
391
+ | `disableFuture` | `boolean` | `false` | Disables all future months |
392
+ | `disablePast` | `boolean` | `false` | Disables all past months |
393
+ | `locale` | `string` | `'default'` | Locale for month names (BCP 47 format) |
394
+
395
+ ### Alphabetic Month Tokens (MMM / MMMM)
396
+
397
+ The `displayFormat` prop supports alphabetic month tokens for more human-readable month display:
398
+
399
+ | Token | Output | Example |
400
+ | ------ | ---------------------- | ------------------------------ |
401
+ | `MMM` | Abbreviated month name | `Jan`, `Feb`, `Apr` |
402
+ | `MMMM` | Full month name | `January`, `February`, `April` |
403
+
404
+ Use the `locale` prop to control the language of month names.
405
+
406
+ ```tsx
407
+ <MonthPicker displayFormat="MMM YYYY" locale="en-US" />
408
+ // → "Apr 2026"
409
+
410
+ <MonthPicker displayFormat="MMMM YYYY" locale="ko-KR" />
411
+ // → "4월 2026"
412
+ ```
413
+
414
+ > **Note**: MonthPicker also accepts all Input props (e.g., `size`, `variant`, `color`, `sx`).
415
+
362
416
  ## Accessibility
363
417
 
364
418
  - The input has `role="textbox"` and the calendar toggle button has `aria-label="Toggle Calendar"` for screen reader identification.
@@ -217,9 +217,7 @@ A controlled example with an external reset button to clear the selected range.
217
217
  </div>
218
218
  ```
219
219
 
220
- ## Common Use Cases
221
-
222
- ### Fiscal Period Report
220
+ ## Fiscal Period Report
223
221
 
224
222
  ```tsx
225
223
  function FiscalReportSelector() {
@@ -248,7 +246,7 @@ function FiscalReportSelector() {
248
246
  }
249
247
  ```
250
248
 
251
- ### Subscription Duration with Month Count
249
+ ## Subscription Duration with Month Count
252
250
 
253
251
  ```tsx
254
252
  function SubscriptionForm() {
@@ -279,7 +277,7 @@ function SubscriptionForm() {
279
277
  }
280
278
  ```
281
279
 
282
- ### Year-over-Year Comparison
280
+ ## Year-over-Year Comparison
283
281
 
284
282
  ```tsx
285
283
  function YearOverYearComparison() {
@@ -363,6 +361,47 @@ const handleSubmit = () => {
363
361
  <MonthRangePicker format="YYYY-MM" />
364
362
  ```
365
363
 
364
+ ## Props and Customization
365
+
366
+ ### Key Props
367
+
368
+ | Prop | Type | Default | Description |
369
+ | --------------- | ------------------------------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------- |
370
+ | `value` | `string` | - | Selected month range string in `format` (controlled mode) |
371
+ | `defaultValue` | `string` | `''` | Initial month range string (uncontrolled mode) |
372
+ | `onChange` | `(event: { target: { name?, value: string } }) => void` | - | Callback when the month range changes |
373
+ | `format` | `string` | `'YYYY/MM'` | Format of the `value` and `onChange` value |
374
+ | `displayFormat` | `string` | same as `format` | Format displayed in the input field. Supports `MMM` (short month name) and `MMMM` (full month name) tokens |
375
+ | `locale` | `string` | `'default'` | Locale for month names when using `MMM`/`MMMM` tokens in `displayFormat` (BCP 47 format, e.g., `'en-US'`, `'ko-KR'`) |
376
+ | `label` | `ReactNode` | - | Form label displayed above the input |
377
+ | `helperText` | `ReactNode` | - | Helper text displayed below the input |
378
+ | `error` | `boolean` | `false` | Applies danger color to indicate validation error |
379
+ | `required` | `boolean` | `false` | Marks the field as required |
380
+ | `disabled` | `boolean` | `false` | Disables the entire component |
381
+ | `name` | `string` | - | HTML name attribute for form submission |
382
+ | `minDate` | `string` | - | Minimum selectable month (in `format`) |
383
+ | `maxDate` | `string` | - | Maximum selectable month (in `format`) |
384
+ | `disableFuture` | `boolean` | `false` | Disables all future months |
385
+ | `disablePast` | `boolean` | `false` | Disables all past months |
386
+
387
+ ### Alphabetic Month Tokens (MMM / MMMM)
388
+
389
+ The `displayFormat` prop supports alphabetic month tokens for more human-readable month display:
390
+
391
+ | Token | Output | Example |
392
+ | ------ | ---------------------- | ------------------------------ |
393
+ | `MMM` | Abbreviated month name | `Jan`, `Feb`, `Apr` |
394
+ | `MMMM` | Full month name | `January`, `February`, `April` |
395
+
396
+ When `displayFormat` contains `MMM` or `MMMM`, the input becomes **read-only** and the user must select months through the calendar popup. Use the `locale` prop to control the language of month names.
397
+
398
+ ```tsx
399
+ <MonthRangePicker displayFormat="MMM YYYY" locale="en-US" />
400
+ // → "Apr 2026 - May 2026"
401
+ ```
402
+
403
+ > **Note**: MonthRangePicker also accepts all Input props (e.g., `size`, `variant`, `color`, `sx`).
404
+
366
405
  ## Accessibility
367
406
 
368
407
  - The input has `role="textbox"` and the calendar toggle button has `aria-label="Toggle Calendar"` for screen reader identification.