@charcoal-ui/react 4.0.0-beta.3 → 4.0.0-beta.5

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 (176) hide show
  1. package/dist/_lib/useClassNames.d.ts +2 -2
  2. package/dist/_lib/useClassNames.d.ts.map +1 -1
  3. package/dist/components/Checkbox/CheckboxInput/index.d.ts +11 -0
  4. package/dist/components/Checkbox/CheckboxInput/index.d.ts.map +1 -0
  5. package/dist/components/Checkbox/CheckboxWithLabel.d.ts +9 -0
  6. package/dist/components/Checkbox/CheckboxWithLabel.d.ts.map +1 -0
  7. package/dist/components/Checkbox/index.d.ts +12 -21
  8. package/dist/components/Checkbox/index.d.ts.map +1 -1
  9. package/dist/components/Clickable/index.d.ts +10 -13
  10. package/dist/components/Clickable/index.d.ts.map +1 -1
  11. package/dist/components/DropdownSelector/Popover/index.d.ts +1 -2
  12. package/dist/components/DropdownSelector/Popover/index.d.ts.map +1 -1
  13. package/dist/components/DropdownSelector/index.d.ts.map +1 -1
  14. package/dist/components/FieldLabel/index.d.ts +1 -0
  15. package/dist/components/FieldLabel/index.d.ts.map +1 -1
  16. package/dist/components/IconButton/index.d.ts +7 -5
  17. package/dist/components/IconButton/index.d.ts.map +1 -1
  18. package/dist/components/LoadingSpinner/index.d.ts +1 -0
  19. package/dist/components/LoadingSpinner/index.d.ts.map +1 -1
  20. package/dist/components/Modal/Dialog/index.d.ts +6 -24
  21. package/dist/components/Modal/Dialog/index.d.ts.map +1 -1
  22. package/dist/components/Modal/ModalPlumbing.d.ts +10 -3
  23. package/dist/components/Modal/ModalPlumbing.d.ts.map +1 -1
  24. package/dist/components/Modal/index.d.ts +2 -2
  25. package/dist/components/Modal/index.d.ts.map +1 -1
  26. package/dist/components/Modal/useCustomModalOverlay.d.ts.map +1 -1
  27. package/dist/components/Radio/index.d.ts +6 -8
  28. package/dist/components/Radio/index.d.ts.map +1 -1
  29. package/dist/components/SegmentedControl/index.d.ts +1 -0
  30. package/dist/components/SegmentedControl/index.d.ts.map +1 -1
  31. package/dist/components/Switch/SwitchInput/index.d.ts +9 -0
  32. package/dist/components/Switch/SwitchInput/index.d.ts.map +1 -0
  33. package/dist/components/Switch/SwitchWithLabel.d.ts +9 -0
  34. package/dist/components/Switch/SwitchWithLabel.d.ts.map +1 -0
  35. package/dist/components/Switch/index.d.ts +4 -15
  36. package/dist/components/Switch/index.d.ts.map +1 -1
  37. package/dist/components/TagItem/index.d.ts +14 -15
  38. package/dist/components/TagItem/index.d.ts.map +1 -1
  39. package/dist/components/TextArea/index.d.ts +28 -18
  40. package/dist/components/TextArea/index.d.ts.map +1 -1
  41. package/dist/components/TextField/index.d.ts +32 -19
  42. package/dist/components/TextField/index.d.ts.map +1 -1
  43. package/dist/core/CharcoalProvider.d.ts +1 -1
  44. package/dist/core/CharcoalProvider.d.ts.map +1 -1
  45. package/dist/index.cjs.js +456 -1079
  46. package/dist/index.cjs.js.map +1 -1
  47. package/dist/index.css +790 -0
  48. package/dist/index.css.map +1 -1
  49. package/dist/index.d.ts +1 -2
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.esm.js +454 -1075
  52. package/dist/index.esm.js.map +1 -1
  53. package/dist/styled.d.ts +4 -4
  54. package/package.json +17 -19
  55. package/src/_lib/useClassNames.ts +3 -9
  56. package/src/components/Checkbox/CheckboxInput/__snapshots__/index.story.storyshot +77 -0
  57. package/src/components/Checkbox/CheckboxInput/index.css +111 -0
  58. package/src/components/Checkbox/CheckboxInput/index.story.tsx +51 -0
  59. package/src/components/Checkbox/CheckboxInput/index.tsx +47 -0
  60. package/src/components/Checkbox/CheckboxWithLabel.tsx +24 -0
  61. package/src/components/Checkbox/__snapshots__/index.story.storyshot +103 -538
  62. package/src/components/Checkbox/index.css +21 -0
  63. package/src/components/Checkbox/index.story.tsx +48 -78
  64. package/src/components/Checkbox/index.tsx +32 -162
  65. package/src/components/Clickable/__snapshots__/index.story.storyshot +2 -78
  66. package/src/components/Clickable/index.css +41 -0
  67. package/src/components/Clickable/index.story.tsx +1 -1
  68. package/src/components/Clickable/index.tsx +25 -85
  69. package/src/components/DropdownSelector/ListItem/__snapshots__/index.story.storyshot +10 -135
  70. package/src/components/DropdownSelector/Popover/index.tsx +1 -2
  71. package/src/components/DropdownSelector/__snapshots__/index.story.storyshot +308 -1014
  72. package/src/components/DropdownSelector/index.tsx +9 -38
  73. package/src/components/FieldLabel/index.css +35 -0
  74. package/src/components/FieldLabel/index.tsx +15 -105
  75. package/src/components/IconButton/__snapshots__/index.story.storyshot +18 -296
  76. package/src/components/IconButton/index.css +118 -0
  77. package/src/components/IconButton/index.story.tsx +16 -39
  78. package/src/components/IconButton/index.tsx +41 -118
  79. package/src/components/LoadingSpinner/__snapshots__/LoadingSpinnerIcon.story.storyshot +2 -17
  80. package/src/components/LoadingSpinner/__snapshots__/index.story.storyshot +79 -29
  81. package/src/components/LoadingSpinner/index.css +42 -0
  82. package/src/components/LoadingSpinner/index.story.tsx +18 -7
  83. package/src/components/LoadingSpinner/index.tsx +26 -52
  84. package/src/components/Modal/Dialog/index.css +44 -0
  85. package/src/components/Modal/Dialog/index.tsx +13 -57
  86. package/src/components/Modal/ModalPlumbing.css +40 -0
  87. package/src/components/Modal/ModalPlumbing.tsx +22 -61
  88. package/src/components/Modal/__snapshots__/index.story.storyshot +459 -1881
  89. package/src/components/Modal/index.css +36 -0
  90. package/src/components/Modal/index.tsx +27 -74
  91. package/src/components/Modal/useCustomModalOverlay.tsx +5 -4
  92. package/src/components/Radio/__snapshots__/index.story.storyshot +51 -776
  93. package/src/components/Radio/index.css +97 -0
  94. package/src/components/Radio/index.story.tsx +20 -30
  95. package/src/components/Radio/index.test.tsx +0 -1
  96. package/src/components/Radio/index.tsx +60 -170
  97. package/src/components/SegmentedControl/__snapshots__/index.story.storyshot +30 -260
  98. package/src/components/SegmentedControl/index.css +50 -0
  99. package/src/components/SegmentedControl/index.tsx +20 -89
  100. package/src/components/Switch/SwitchInput/index.css +82 -0
  101. package/src/components/Switch/SwitchInput/index.tsx +40 -0
  102. package/src/components/Switch/SwitchWithLabel.tsx +24 -0
  103. package/src/components/Switch/__snapshots__/index.story.storyshot +34 -538
  104. package/src/components/Switch/index.css +23 -0
  105. package/src/components/Switch/index.story.tsx +15 -18
  106. package/src/components/Switch/index.tsx +43 -140
  107. package/src/components/TagItem/__snapshots__/index.story.storyshot +212 -1063
  108. package/src/components/TagItem/index.css +140 -0
  109. package/src/components/TagItem/index.story.tsx +44 -161
  110. package/src/components/TagItem/index.tsx +76 -220
  111. package/src/components/TextArea/TextArea.story.tsx +62 -24
  112. package/src/components/TextArea/__snapshots__/TextArea.story.storyshot +1024 -792
  113. package/src/components/TextArea/index.tsx +68 -89
  114. package/src/components/TextField/TextField.story.tsx +77 -67
  115. package/src/components/TextField/__snapshots__/TextField.story.storyshot +1152 -1274
  116. package/src/components/TextField/index.tsx +77 -103
  117. package/src/components/a11y.test.tsx +1 -1
  118. package/src/core/CharcoalProvider.tsx +1 -1
  119. package/src/index.ts +0 -7
  120. package/src/type.d.ts +6 -0
  121. package/dist/components/Button/index.story.d.ts +0 -22
  122. package/dist/components/Button/index.story.d.ts.map +0 -1
  123. package/dist/components/Button/index.test.d.ts +0 -2
  124. package/dist/components/Button/index.test.d.ts.map +0 -1
  125. package/dist/components/Checkbox/index.story.d.ts +0 -8
  126. package/dist/components/Checkbox/index.story.d.ts.map +0 -1
  127. package/dist/components/Clickable/index.story.d.ts +0 -6
  128. package/dist/components/Clickable/index.story.d.ts.map +0 -1
  129. package/dist/components/DropdownSelector/ListItem/index.story.d.ts +0 -9
  130. package/dist/components/DropdownSelector/ListItem/index.story.d.ts.map +0 -1
  131. package/dist/components/DropdownSelector/MenuList/index.story.d.ts +0 -8
  132. package/dist/components/DropdownSelector/MenuList/index.story.d.ts.map +0 -1
  133. package/dist/components/DropdownSelector/Popover/index.story.d.ts +0 -5
  134. package/dist/components/DropdownSelector/Popover/index.story.d.ts.map +0 -1
  135. package/dist/components/DropdownSelector/index.story.d.ts +0 -19
  136. package/dist/components/DropdownSelector/index.story.d.ts.map +0 -1
  137. package/dist/components/Icon/index.story.d.ts +0 -6
  138. package/dist/components/Icon/index.story.d.ts.map +0 -1
  139. package/dist/components/IconButton/index.story.d.ts +0 -9
  140. package/dist/components/IconButton/index.story.d.ts.map +0 -1
  141. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts +0 -8
  142. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts.map +0 -1
  143. package/dist/components/LoadingSpinner/index.story.d.ts +0 -6
  144. package/dist/components/LoadingSpinner/index.story.d.ts.map +0 -1
  145. package/dist/components/Modal/index.story.d.ts +0 -21
  146. package/dist/components/Modal/index.story.d.ts.map +0 -1
  147. package/dist/components/MultiSelect/context.d.ts +0 -14
  148. package/dist/components/MultiSelect/context.d.ts.map +0 -1
  149. package/dist/components/MultiSelect/index.d.ts +0 -36
  150. package/dist/components/MultiSelect/index.d.ts.map +0 -1
  151. package/dist/components/MultiSelect/index.story.d.ts +0 -82
  152. package/dist/components/MultiSelect/index.story.d.ts.map +0 -1
  153. package/dist/components/MultiSelect/index.test.d.ts +0 -2
  154. package/dist/components/MultiSelect/index.test.d.ts.map +0 -1
  155. package/dist/components/Radio/index.story.d.ts +0 -26
  156. package/dist/components/Radio/index.story.d.ts.map +0 -1
  157. package/dist/components/Radio/index.test.d.ts +0 -2
  158. package/dist/components/Radio/index.test.d.ts.map +0 -1
  159. package/dist/components/SegmentedControl/index.story.d.ts +0 -7
  160. package/dist/components/SegmentedControl/index.story.d.ts.map +0 -1
  161. package/dist/components/Switch/index.story.d.ts +0 -9
  162. package/dist/components/Switch/index.story.d.ts.map +0 -1
  163. package/dist/components/TagItem/index.story.d.ts +0 -16
  164. package/dist/components/TagItem/index.story.d.ts.map +0 -1
  165. package/dist/components/TextArea/TextArea.story.d.ts +0 -9
  166. package/dist/components/TextArea/TextArea.story.d.ts.map +0 -1
  167. package/dist/components/TextField/TextField.story.d.ts +0 -22
  168. package/dist/components/TextField/TextField.story.d.ts.map +0 -1
  169. package/dist/components/a11y.test.d.ts +0 -2
  170. package/dist/components/a11y.test.d.ts.map +0 -1
  171. package/src/components/LoadingSpinner/LoadingSpinnerIcon.story.tsx +0 -13
  172. package/src/components/MultiSelect/__snapshots__/index.story.storyshot +0 -1066
  173. package/src/components/MultiSelect/context.ts +0 -23
  174. package/src/components/MultiSelect/index.story.tsx +0 -216
  175. package/src/components/MultiSelect/index.test.tsx +0 -263
  176. package/src/components/MultiSelect/index.tsx +0 -281
@@ -1,70 +1,56 @@
1
- import { useTextField } from '@react-aria/textfield'
2
1
  import { useVisuallyHidden } from '@react-aria/visually-hidden'
3
2
  import { forwardRef, useCallback, useEffect, useRef, useState } from 'react'
4
3
  import styled, { css } from 'styled-components'
5
- import { FieldLabelProps } from '../FieldLabel'
4
+ import FieldLabel from '../FieldLabel'
6
5
  import { countCodePointsInString, mergeRefs } from '../../_lib'
7
- import { ReactAreaUseTextFieldCompat } from '../../_lib/compat'
8
- import { AssistiveText, TextFieldLabel } from '../TextField'
6
+ import { AssistiveText } from '../TextField'
9
7
  import { useFocusWithClick } from '../TextField/useFocusWithClick'
10
- import { mergeProps } from '@react-aria/utils'
11
-
12
- type DOMProps = Omit<
13
- React.TextareaHTMLAttributes<HTMLTextAreaElement>,
14
- // react-ariaのhookは、onChangeが`(v: string) => void`想定
15
- | 'onChange'
16
- // ReactAreaUseTextFieldCompatに書いてあるような事情で、ここにあるイベントハンドラの型をゆるめる
17
- | keyof ReactAreaUseTextFieldCompat
18
- >
19
-
20
- export interface TextAreaProps
21
- extends Pick<FieldLabelProps, 'label' | 'requiredText' | 'subLabel'>,
22
- DOMProps,
23
- ReactAreaUseTextFieldCompat {
24
- readonly autoHeight?: boolean
25
- readonly rows?: number
26
-
27
- // <input> 要素は number とか string[] もありうるが、今はこれしか想定してない
28
- readonly defaultValue?: string
29
- readonly value?: string
30
- readonly onChange?: (value: string) => void
31
-
32
- // react-ariaの型定義のせいでHTMLTextAreaElementにできない
33
- readonly onKeyDown?: (event: React.KeyboardEvent<Element>) => void
34
- readonly onFocus?: (event: React.FocusEvent<Element>) => void
35
- readonly onBlur?: (event: React.FocusEvent<Element>) => void
36
-
37
- readonly showCount?: boolean
38
- readonly showLabel?: boolean
39
- readonly assistiveText?: string
40
- readonly invalid?: boolean
41
- }
8
+ import { useId } from '@react-aria/utils'
9
+
10
+ export type TextAreaProps = {
11
+ value?: string
12
+ onChange?: (value: string) => void
13
+
14
+ showCount?: boolean
15
+ showLabel?: boolean
16
+ assistiveText?: string
17
+ invalid?: boolean
18
+
19
+ label?: string
20
+ requiredText?: string
21
+ disabled?: boolean
22
+ subLabel?: React.ReactNode
23
+ autoHeight?: boolean
24
+
25
+ getCount?: (value: string) => number
26
+ } & Omit<React.ComponentPropsWithoutRef<'textarea'>, 'onChange'>
42
27
 
43
28
  const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
44
- function TextAreaInner({ onChange, ...props }, forwardRef) {
45
- const {
29
+ function TextAreaInner(
30
+ {
31
+ onChange,
46
32
  className,
33
+ value,
47
34
  showCount = false,
48
35
  showLabel = false,
49
- label,
36
+ label = '',
50
37
  requiredText,
51
38
  subLabel,
52
39
  disabled = false,
53
40
  required,
54
- invalid = false,
55
41
  assistiveText,
56
42
  maxLength,
57
43
  autoHeight = false,
58
44
  rows: initialRows = 4,
59
- ...restProps
60
- } = props
61
-
45
+ getCount = countCodePointsInString,
46
+ ...props
47
+ },
48
+ forwardRef
49
+ ) {
62
50
  const { visuallyHiddenProps } = useVisuallyHidden()
63
51
  const textareaRef = useRef<HTMLTextAreaElement>(null)
64
- const ariaRef = useRef<HTMLTextAreaElement>(null)
65
- const [count, setCount] = useState(
66
- countCodePointsInString(props.value ?? '')
67
- )
52
+ const textAreaRef = useRef<HTMLTextAreaElement>(null)
53
+ const [count, setCount] = useState(getCount(value ?? ''))
68
54
  const [rows, setRows] = useState(initialRows)
69
55
 
70
56
  const syncHeight = useCallback(
@@ -75,10 +61,11 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
75
61
  [initialRows]
76
62
  )
77
63
 
78
- const nonControlled = props.value === undefined
64
+ const nonControlled = value === undefined
79
65
  const handleChange = useCallback(
80
- (value: string) => {
81
- const count = countCodePointsInString(value)
66
+ (e: React.ChangeEvent<HTMLTextAreaElement>) => {
67
+ const value = e.target.value
68
+ const count = getCount(value)
82
69
  if (maxLength !== undefined && count > maxLength) {
83
70
  return
84
71
  }
@@ -90,31 +77,12 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
90
77
  }
91
78
  onChange?.(value)
92
79
  },
93
- [autoHeight, maxLength, nonControlled, onChange, syncHeight]
80
+ [autoHeight, getCount, maxLength, nonControlled, onChange, syncHeight]
94
81
  )
95
82
 
96
83
  useEffect(() => {
97
- setCount(countCodePointsInString(props.value ?? ''))
98
- }, [props.value])
99
-
100
- const {
101
- inputProps: ariaInputProps,
102
- labelProps,
103
- descriptionProps,
104
- errorMessageProps,
105
- } = useTextField(
106
- {
107
- inputElementType: 'textarea',
108
- isDisabled: disabled,
109
- isRequired: required,
110
- validationState: invalid ? 'invalid' : 'valid',
111
- description: !invalid && assistiveText,
112
- errorMessage: invalid && assistiveText,
113
- onChange: handleChange,
114
- ...props,
115
- },
116
- ariaRef
117
- )
84
+ setCount(getCount(value ?? ''))
85
+ }, [getCount, value])
118
86
 
119
87
  useEffect(() => {
120
88
  if (autoHeight && textareaRef.current !== null) {
@@ -124,31 +92,44 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
124
92
 
125
93
  const containerRef = useRef(null)
126
94
 
127
- useFocusWithClick(containerRef, ariaRef)
95
+ useFocusWithClick(containerRef, textAreaRef)
128
96
 
129
- const inputProps = mergeProps(restProps, ariaInputProps)
97
+ const textAreaId = useId(props.id)
98
+ const describedbyId = useId()
99
+ const labelledbyId = useId()
100
+
101
+ const showAssistiveText =
102
+ assistiveText != null && assistiveText.length !== 0
130
103
 
131
104
  return (
132
105
  <TextFieldRoot className={className} isDisabled={disabled}>
133
- <TextFieldLabel
106
+ <FieldLabel
107
+ htmlFor={textAreaId}
108
+ id={labelledbyId}
134
109
  label={label}
135
- requiredText={requiredText}
136
110
  required={required}
111
+ requiredText={requiredText}
137
112
  subLabel={subLabel}
138
- {...labelProps}
139
113
  {...(!showLabel ? visuallyHiddenProps : {})}
140
114
  />
141
115
  <StyledTextareaContainer
116
+ aria-disabled={disabled === true ? 'true' : undefined}
117
+ invalid={props.invalid === true}
142
118
  ref={containerRef}
143
- invalid={invalid}
144
119
  rows={showCount ? rows + 1 : rows}
145
- aria-disabled={disabled === true ? 'true' : undefined}
146
120
  >
147
121
  <StyledTextarea
148
- ref={mergeRefs(textareaRef, forwardRef, ariaRef)}
149
- rows={rows}
122
+ aria-describedby={showAssistiveText ? describedbyId : undefined}
123
+ aria-invalid={props.invalid}
124
+ aria-labelledby={labelledbyId}
125
+ id={textAreaId}
126
+ maxLength={maxLength}
150
127
  noBottomPadding={showCount}
151
- {...inputProps}
128
+ onChange={handleChange}
129
+ ref={mergeRefs(forwardRef, textAreaRef)}
130
+ rows={rows}
131
+ value={value}
132
+ {...props}
152
133
  />
153
134
  {showCount && (
154
135
  <MultiLineCounter>
@@ -156,11 +137,8 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
156
137
  </MultiLineCounter>
157
138
  )}
158
139
  </StyledTextareaContainer>
159
- {assistiveText != null && assistiveText.length !== 0 && (
160
- <AssistiveText
161
- invalid={invalid}
162
- {...(invalid ? errorMessageProps : descriptionProps)}
163
- >
140
+ {showAssistiveText && (
141
+ <AssistiveText invalid={props.invalid === true} id={describedbyId}>
164
142
  {assistiveText}
165
143
  </AssistiveText>
166
144
  )}
@@ -172,8 +150,9 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
172
150
  export default TextArea
173
151
 
174
152
  const TextFieldRoot = styled.div<{ isDisabled: boolean }>`
175
- display: flex;
176
- flex-direction: column;
153
+ display: grid;
154
+ grid-template-columns: 1fr;
155
+ grid-gap: 4px;
177
156
 
178
157
  ${(p) => p.isDisabled && { opacity: p.theme.elementEffect.disabled.opacity }}
179
158
  `
@@ -1,83 +1,94 @@
1
1
  import styled from 'styled-components'
2
2
  import Clickable from '../Clickable'
3
3
  import TextField from '.'
4
- import { px } from '@charcoal-ui/utils'
5
- import IconButton from '../IconButton'
6
- import { useCallback, useState } from 'react'
4
+ import { useState } from 'react'
7
5
  import { Meta, StoryObj } from '@storybook/react'
8
6
 
9
7
  export default {
10
8
  title: 'TextField',
11
9
  component: TextField,
12
- argTypes: {},
10
+ parameters: {
11
+ layout: 'centered',
12
+ },
13
+ } as Meta<typeof TextField>
14
+
15
+ export const Default: StoryObj<typeof TextField> = {
13
16
  args: {
14
17
  showLabel: false,
15
18
  assistiveText: '',
16
19
  disabled: false,
17
20
  required: false,
18
21
  invalid: false,
22
+ readOnly: false,
19
23
  label: 'Label',
20
24
  requiredText: '*必須',
21
25
  subLabel: <Clickable>Text Link</Clickable>,
22
26
  placeholder: 'TextField',
23
27
  },
24
- render: function Render(args) {
25
- return (
26
- <Container>
27
- <TextField {...args} />
28
- </Container>
29
- )
28
+ render(args) {
29
+ return <TextField {...args} />
30
30
  },
31
- } as Meta<typeof TextField>
31
+ }
32
32
 
33
- const Container = styled.div`
34
- display: grid;
35
- gap: ${({ theme }) => px(theme.spacing[24])};
36
- `
33
+ export const Label: StoryObj<typeof TextField> = {
34
+ render() {
35
+ return <TextField showLabel label="Label" />
36
+ },
37
+ }
37
38
 
38
- export const Default = {}
39
+ export const Placeholder: StoryObj<typeof TextField> = {
40
+ render() {
41
+ return <TextField label="Label" placeholder="Placeholder" />
42
+ },
43
+ }
39
44
 
40
- export const Number: StoryObj<typeof TextField> = {
41
- render: function Render(args) {
42
- const [count, setCount] = useState(0)
45
+ export const RequiredText: StoryObj<typeof TextField> = {
46
+ render() {
47
+ return <TextField label="Label" showLabel required requiredText="*必須" />
48
+ },
49
+ }
50
+
51
+ export const AssistiveText: StoryObj<typeof TextField> = {
52
+ render() {
53
+ return <TextField label="Label" assistiveText="説明が入ります" />
54
+ },
55
+ }
56
+
57
+ export const SubLabel: StoryObj<typeof TextField> = {
58
+ render() {
43
59
  return (
44
- <Container>
45
- <TextField
46
- {...args}
47
- type="number"
48
- value={count.toString()}
49
- onChange={(value) => setCount(parseInt(value))}
50
- onWheel={(e) => {
51
- e.currentTarget.blur()
52
- e.stopPropagation()
53
- }}
54
- />
55
- </Container>
60
+ <TextField label="Label" subLabel={<Clickable>Text Link</Clickable>} />
56
61
  )
57
62
  },
58
63
  }
59
64
 
60
- export const HasLabel = {
61
- args: {
62
- showLabel: true,
63
- assistiveText: 'Assistive text',
64
- required: true,
65
+ export const ShowCount = {
66
+ render() {
67
+ return <TextField label="Label" showCount maxLength={100} />
65
68
  },
66
69
  }
67
70
 
68
- export const HasCount = {
69
- args: {
70
- showCount: true,
71
- maxLength: 100,
71
+ export const Disabled: StoryObj<typeof TextField> = {
72
+ render() {
73
+ return <TextField label="Label" disabled />
72
74
  },
73
75
  }
74
76
 
75
- export const HasAffix: StoryObj<typeof TextField> = {
76
- args: {
77
- showCount: true,
78
- maxLength: 200,
79
- prefix: '/home/john/',
80
- suffix: '.png',
77
+ export const Invalid: StoryObj<typeof TextField> = {
78
+ render() {
79
+ return <TextField label="Label" invalid assistiveText="エラーメッセージ" />
80
+ },
81
+ }
82
+
83
+ export const ReadOnly: StoryObj<typeof TextField> = {
84
+ render() {
85
+ return <TextField label="Label" readOnly value="読み取り専用" />
86
+ },
87
+ }
88
+
89
+ export const Affix: StoryObj<typeof TextField> = {
90
+ render() {
91
+ return <TextField label="Label" prefix="/home/john/" suffix=".png" />
81
92
  },
82
93
  }
83
94
 
@@ -87,35 +98,34 @@ const PrefixIconWrap = styled.div`
87
98
  color: ${({ theme }) => theme.color.text3};
88
99
  `
89
100
 
90
- export const PrefixIcon: StoryObj<typeof TextField> = {
91
- render: function Render(args) {
92
- const [value, setValue] = useState('')
93
- const handleChange = useCallback((value: string) => {
94
- setValue(value)
95
- }, [])
96
- const handleClear = useCallback(() => {
97
- setValue('')
98
- }, [])
101
+ export const Prefix: StoryObj<typeof TextField> = {
102
+ render() {
99
103
  return (
100
104
  <TextField
101
- {...args}
102
105
  label="Label"
103
- placeholder="作品を検索"
104
- value={value}
105
- onChange={handleChange}
106
106
  prefix={
107
107
  <PrefixIconWrap>
108
108
  <pixiv-icon name="16/Search" />
109
109
  </PrefixIconWrap>
110
110
  }
111
- suffix={
112
- <IconButton
113
- variant="Overlay"
114
- icon={'16/Remove'}
115
- size="XS"
116
- onClick={handleClear}
117
- />
118
- }
111
+ />
112
+ )
113
+ },
114
+ }
115
+
116
+ export const Number: StoryObj<typeof TextField> = {
117
+ render: function Render(args) {
118
+ const [count, setCount] = useState(0)
119
+ return (
120
+ <TextField
121
+ {...args}
122
+ type="number"
123
+ value={count.toString()}
124
+ onChange={(value) => setCount(parseInt(value))}
125
+ onWheel={(e) => {
126
+ e.currentTarget.blur()
127
+ e.stopPropagation()
128
+ }}
119
129
  />
120
130
  )
121
131
  },