@charcoal-ui/react 4.0.0-beta.4 → 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 (122) 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 +9 -7
  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/index.d.ts.map +1 -1
  12. package/dist/components/FieldLabel/index.d.ts +1 -0
  13. package/dist/components/FieldLabel/index.d.ts.map +1 -1
  14. package/dist/components/IconButton/index.d.ts +7 -5
  15. package/dist/components/IconButton/index.d.ts.map +1 -1
  16. package/dist/components/LoadingSpinner/index.d.ts +1 -0
  17. package/dist/components/LoadingSpinner/index.d.ts.map +1 -1
  18. package/dist/components/Modal/Dialog/index.d.ts +6 -24
  19. package/dist/components/Modal/Dialog/index.d.ts.map +1 -1
  20. package/dist/components/Modal/ModalPlumbing.d.ts +10 -3
  21. package/dist/components/Modal/ModalPlumbing.d.ts.map +1 -1
  22. package/dist/components/Modal/index.d.ts +1 -1
  23. package/dist/components/Modal/index.d.ts.map +1 -1
  24. package/dist/components/Radio/index.d.ts +3 -5
  25. package/dist/components/Radio/index.d.ts.map +1 -1
  26. package/dist/components/SegmentedControl/index.d.ts +1 -0
  27. package/dist/components/SegmentedControl/index.d.ts.map +1 -1
  28. package/dist/components/Switch/SwitchInput/index.d.ts +9 -0
  29. package/dist/components/Switch/SwitchInput/index.d.ts.map +1 -0
  30. package/dist/components/Switch/SwitchWithLabel.d.ts +9 -0
  31. package/dist/components/Switch/SwitchWithLabel.d.ts.map +1 -0
  32. package/dist/components/Switch/index.d.ts +4 -15
  33. package/dist/components/Switch/index.d.ts.map +1 -1
  34. package/dist/components/TagItem/index.d.ts +14 -15
  35. package/dist/components/TagItem/index.d.ts.map +1 -1
  36. package/dist/components/TextArea/index.d.ts +28 -18
  37. package/dist/components/TextArea/index.d.ts.map +1 -1
  38. package/dist/components/TextField/index.d.ts +32 -19
  39. package/dist/components/TextField/index.d.ts.map +1 -1
  40. package/dist/index.cjs.js +390 -776
  41. package/dist/index.cjs.js.map +1 -1
  42. package/dist/index.css +732 -28
  43. package/dist/index.css.map +1 -1
  44. package/dist/index.d.ts +1 -2
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.esm.js +415 -799
  47. package/dist/index.esm.js.map +1 -1
  48. package/dist/styled.d.ts +4 -4
  49. package/package.json +11 -10
  50. package/src/_lib/useClassNames.ts +3 -9
  51. package/src/components/Checkbox/CheckboxInput/__snapshots__/index.story.storyshot +77 -0
  52. package/src/components/Checkbox/CheckboxInput/index.css +111 -0
  53. package/src/components/{CheckboxInput → Checkbox/CheckboxInput}/index.story.tsx +16 -0
  54. package/src/components/Checkbox/CheckboxInput/index.tsx +47 -0
  55. package/src/components/Checkbox/CheckboxWithLabel.tsx +24 -0
  56. package/src/components/Checkbox/__snapshots__/index.story.storyshot +53 -134
  57. package/src/components/Checkbox/index.css +2 -2
  58. package/src/components/Checkbox/index.story.tsx +16 -11
  59. package/src/components/Checkbox/index.tsx +23 -15
  60. package/src/components/Clickable/__snapshots__/index.story.storyshot +2 -78
  61. package/src/components/Clickable/index.css +41 -0
  62. package/src/components/Clickable/index.story.tsx +1 -1
  63. package/src/components/Clickable/index.tsx +25 -85
  64. package/src/components/DropdownSelector/ListItem/__snapshots__/index.story.storyshot +10 -135
  65. package/src/components/DropdownSelector/__snapshots__/index.story.storyshot +308 -1014
  66. package/src/components/DropdownSelector/index.tsx +9 -38
  67. package/src/components/FieldLabel/index.css +35 -0
  68. package/src/components/FieldLabel/index.tsx +15 -105
  69. package/src/components/IconButton/__snapshots__/index.story.storyshot +12 -288
  70. package/src/components/IconButton/index.css +118 -0
  71. package/src/components/IconButton/index.story.tsx +2 -2
  72. package/src/components/IconButton/index.tsx +41 -118
  73. package/src/components/LoadingSpinner/__snapshots__/LoadingSpinnerIcon.story.storyshot +2 -17
  74. package/src/components/LoadingSpinner/__snapshots__/index.story.storyshot +40 -128
  75. package/src/components/LoadingSpinner/index.css +42 -0
  76. package/src/components/LoadingSpinner/index.tsx +26 -52
  77. package/src/components/Modal/Dialog/index.css +44 -0
  78. package/src/components/Modal/Dialog/index.tsx +13 -57
  79. package/src/components/Modal/ModalPlumbing.css +40 -0
  80. package/src/components/Modal/ModalPlumbing.tsx +22 -61
  81. package/src/components/Modal/__snapshots__/index.story.storyshot +459 -1881
  82. package/src/components/Modal/index.css +36 -0
  83. package/src/components/Modal/index.tsx +26 -73
  84. package/src/components/Radio/__snapshots__/index.story.storyshot +50 -775
  85. package/src/components/Radio/index.css +97 -0
  86. package/src/components/Radio/index.story.tsx +1 -10
  87. package/src/components/Radio/index.test.tsx +0 -1
  88. package/src/components/Radio/index.tsx +50 -161
  89. package/src/components/SegmentedControl/__snapshots__/index.story.storyshot +30 -260
  90. package/src/components/SegmentedControl/index.css +50 -0
  91. package/src/components/SegmentedControl/index.tsx +20 -89
  92. package/src/components/Switch/SwitchInput/index.css +82 -0
  93. package/src/components/Switch/SwitchInput/index.tsx +40 -0
  94. package/src/components/Switch/SwitchWithLabel.tsx +24 -0
  95. package/src/components/Switch/__snapshots__/index.story.storyshot +29 -532
  96. package/src/components/Switch/index.css +23 -0
  97. package/src/components/Switch/index.story.tsx +5 -0
  98. package/src/components/Switch/index.tsx +43 -140
  99. package/src/components/TagItem/__snapshots__/index.story.storyshot +153 -1130
  100. package/src/components/TagItem/index.css +140 -0
  101. package/src/components/TagItem/index.story.tsx +1 -1
  102. package/src/components/TagItem/index.tsx +76 -220
  103. package/src/components/TextArea/__snapshots__/TextArea.story.storyshot +203 -1357
  104. package/src/components/TextArea/index.tsx +68 -91
  105. package/src/components/TextField/__snapshots__/TextField.story.storyshot +274 -1614
  106. package/src/components/TextField/index.tsx +77 -105
  107. package/src/index.ts +0 -7
  108. package/src/type.d.ts +6 -0
  109. package/dist/components/CheckboxInput/index.d.ts +0 -9
  110. package/dist/components/CheckboxInput/index.d.ts.map +0 -1
  111. package/dist/components/MultiSelect/context.d.ts +0 -14
  112. package/dist/components/MultiSelect/context.d.ts.map +0 -1
  113. package/dist/components/MultiSelect/index.d.ts +0 -36
  114. package/dist/components/MultiSelect/index.d.ts.map +0 -1
  115. package/src/components/CheckboxInput/__snapshots__/index.story.storyshot +0 -109
  116. package/src/components/CheckboxInput/index.css +0 -77
  117. package/src/components/CheckboxInput/index.tsx +0 -53
  118. package/src/components/MultiSelect/__snapshots__/index.story.storyshot +0 -1054
  119. package/src/components/MultiSelect/context.ts +0 -23
  120. package/src/components/MultiSelect/index.story.tsx +0 -112
  121. package/src/components/MultiSelect/index.test.tsx +0 -263
  122. package/src/components/MultiSelect/index.tsx +0 -282
@@ -1,71 +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
- readOnly = false,
56
41
  assistiveText,
57
42
  maxLength,
58
43
  autoHeight = false,
59
44
  rows: initialRows = 4,
60
- ...restProps
61
- } = props
62
-
45
+ getCount = countCodePointsInString,
46
+ ...props
47
+ },
48
+ forwardRef
49
+ ) {
63
50
  const { visuallyHiddenProps } = useVisuallyHidden()
64
51
  const textareaRef = useRef<HTMLTextAreaElement>(null)
65
- const ariaRef = useRef<HTMLTextAreaElement>(null)
66
- const [count, setCount] = useState(
67
- countCodePointsInString(props.value ?? '')
68
- )
52
+ const textAreaRef = useRef<HTMLTextAreaElement>(null)
53
+ const [count, setCount] = useState(getCount(value ?? ''))
69
54
  const [rows, setRows] = useState(initialRows)
70
55
 
71
56
  const syncHeight = useCallback(
@@ -76,10 +61,11 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
76
61
  [initialRows]
77
62
  )
78
63
 
79
- const nonControlled = props.value === undefined
64
+ const nonControlled = value === undefined
80
65
  const handleChange = useCallback(
81
- (value: string) => {
82
- const count = countCodePointsInString(value)
66
+ (e: React.ChangeEvent<HTMLTextAreaElement>) => {
67
+ const value = e.target.value
68
+ const count = getCount(value)
83
69
  if (maxLength !== undefined && count > maxLength) {
84
70
  return
85
71
  }
@@ -91,32 +77,12 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
91
77
  }
92
78
  onChange?.(value)
93
79
  },
94
- [autoHeight, maxLength, nonControlled, onChange, syncHeight]
80
+ [autoHeight, getCount, maxLength, nonControlled, onChange, syncHeight]
95
81
  )
96
82
 
97
83
  useEffect(() => {
98
- setCount(countCodePointsInString(props.value ?? ''))
99
- }, [props.value])
100
-
101
- const {
102
- inputProps: ariaInputProps,
103
- labelProps,
104
- descriptionProps,
105
- errorMessageProps,
106
- } = useTextField(
107
- {
108
- inputElementType: 'textarea',
109
- isDisabled: disabled,
110
- isRequired: required,
111
- isReadOnly: readOnly,
112
- validationState: invalid ? 'invalid' : 'valid',
113
- description: !invalid && assistiveText,
114
- errorMessage: invalid && assistiveText,
115
- onChange: handleChange,
116
- ...props,
117
- },
118
- ariaRef
119
- )
84
+ setCount(getCount(value ?? ''))
85
+ }, [getCount, value])
120
86
 
121
87
  useEffect(() => {
122
88
  if (autoHeight && textareaRef.current !== null) {
@@ -126,31 +92,44 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
126
92
 
127
93
  const containerRef = useRef(null)
128
94
 
129
- useFocusWithClick(containerRef, ariaRef)
95
+ useFocusWithClick(containerRef, textAreaRef)
130
96
 
131
- 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
132
103
 
133
104
  return (
134
105
  <TextFieldRoot className={className} isDisabled={disabled}>
135
- <TextFieldLabel
106
+ <FieldLabel
107
+ htmlFor={textAreaId}
108
+ id={labelledbyId}
136
109
  label={label}
137
- requiredText={requiredText}
138
110
  required={required}
111
+ requiredText={requiredText}
139
112
  subLabel={subLabel}
140
- {...labelProps}
141
113
  {...(!showLabel ? visuallyHiddenProps : {})}
142
114
  />
143
115
  <StyledTextareaContainer
116
+ aria-disabled={disabled === true ? 'true' : undefined}
117
+ invalid={props.invalid === true}
144
118
  ref={containerRef}
145
- invalid={invalid}
146
119
  rows={showCount ? rows + 1 : rows}
147
- aria-disabled={disabled === true ? 'true' : undefined}
148
120
  >
149
121
  <StyledTextarea
150
- ref={mergeRefs(textareaRef, forwardRef, ariaRef)}
151
- rows={rows}
122
+ aria-describedby={showAssistiveText ? describedbyId : undefined}
123
+ aria-invalid={props.invalid}
124
+ aria-labelledby={labelledbyId}
125
+ id={textAreaId}
126
+ maxLength={maxLength}
152
127
  noBottomPadding={showCount}
153
- {...inputProps}
128
+ onChange={handleChange}
129
+ ref={mergeRefs(forwardRef, textAreaRef)}
130
+ rows={rows}
131
+ value={value}
132
+ {...props}
154
133
  />
155
134
  {showCount && (
156
135
  <MultiLineCounter>
@@ -158,11 +137,8 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
158
137
  </MultiLineCounter>
159
138
  )}
160
139
  </StyledTextareaContainer>
161
- {assistiveText != null && assistiveText.length !== 0 && (
162
- <AssistiveText
163
- invalid={invalid}
164
- {...(invalid ? errorMessageProps : descriptionProps)}
165
- >
140
+ {showAssistiveText && (
141
+ <AssistiveText invalid={props.invalid === true} id={describedbyId}>
166
142
  {assistiveText}
167
143
  </AssistiveText>
168
144
  )}
@@ -174,8 +150,9 @@ const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
174
150
  export default TextArea
175
151
 
176
152
  const TextFieldRoot = styled.div<{ isDisabled: boolean }>`
177
- display: flex;
178
- flex-direction: column;
153
+ display: grid;
154
+ grid-template-columns: 1fr;
155
+ grid-gap: 4px;
179
156
 
180
157
  ${(p) => p.isDisabled && { opacity: p.theme.elementEffect.disabled.opacity }}
181
158
  `