@charcoal-ui/react 3.5.0 → 3.7.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 (100) hide show
  1. package/dist/_lib/compat.d.ts +1 -0
  2. package/dist/_lib/compat.d.ts.map +1 -1
  3. package/dist/components/Button/StyledButton.d.ts +12 -0
  4. package/dist/components/Button/StyledButton.d.ts.map +1 -0
  5. package/dist/components/Button/index.d.ts +2 -2
  6. package/dist/components/Button/index.d.ts.map +1 -1
  7. package/dist/components/Button/lib/variantToBackground.d.ts +3 -0
  8. package/dist/components/Button/lib/variantToBackground.d.ts.map +1 -0
  9. package/dist/components/Button/lib/variantToFont.d.ts +3 -0
  10. package/dist/components/Button/lib/variantToFont.d.ts.map +1 -0
  11. package/dist/components/Checkbox/index.d.ts.map +1 -1
  12. package/dist/components/Checkbox/index.story.d.ts +6 -15
  13. package/dist/components/Checkbox/index.story.d.ts.map +1 -1
  14. package/dist/components/Clickable/index.story.d.ts +4 -6
  15. package/dist/components/Clickable/index.story.d.ts.map +1 -1
  16. package/dist/components/DropdownSelector/DropdownMenuItem.d.ts.map +1 -1
  17. package/dist/components/DropdownSelector/ListItem/index.d.ts.map +1 -1
  18. package/dist/components/DropdownSelector/Popover/index.d.ts.map +1 -1
  19. package/dist/components/DropdownSelector/index.d.ts.map +1 -1
  20. package/dist/components/DropdownSelector/index.story.d.ts +1 -0
  21. package/dist/components/DropdownSelector/index.story.d.ts.map +1 -1
  22. package/dist/components/FieldLabel/index.d.ts.map +1 -1
  23. package/dist/components/Icon/index.story.d.ts +1 -1
  24. package/dist/components/IconButton/index.d.ts.map +1 -1
  25. package/dist/components/LoadingSpinner/index.d.ts.map +1 -1
  26. package/dist/components/Modal/ModalPlumbing.d.ts.map +1 -1
  27. package/dist/components/Modal/index.d.ts.map +1 -1
  28. package/dist/components/Modal/index.story.d.ts +1 -0
  29. package/dist/components/Modal/index.story.d.ts.map +1 -1
  30. package/dist/components/MultiSelect/index.d.ts.map +1 -1
  31. package/dist/components/MultiSelect/index.story.d.ts +2 -0
  32. package/dist/components/MultiSelect/index.story.d.ts.map +1 -1
  33. package/dist/components/Radio/index.d.ts.map +1 -1
  34. package/dist/components/SegmentedControl/RadioGroupContext.d.ts +1 -1
  35. package/dist/components/SegmentedControl/RadioGroupContext.d.ts.map +1 -1
  36. package/dist/components/SegmentedControl/index.d.ts.map +1 -1
  37. package/dist/components/Switch/index.d.ts.map +1 -1
  38. package/dist/components/TagItem/index.d.ts.map +1 -1
  39. package/dist/components/TextField/TextField.story.d.ts.map +1 -1
  40. package/dist/components/TextField/index.d.ts.map +1 -1
  41. package/dist/index.cjs.js +1026 -384
  42. package/dist/index.cjs.js.map +1 -1
  43. package/dist/index.esm.js +991 -349
  44. package/dist/index.esm.js.map +1 -1
  45. package/dist/styled.d.ts +4 -4
  46. package/package.json +18 -21
  47. package/src/_lib/compat.ts +8 -0
  48. package/src/components/Button/StyledButton.tsx +66 -0
  49. package/src/components/Button/__snapshots__/index.story.storyshot +312 -592
  50. package/src/components/Button/index.tsx +14 -70
  51. package/src/components/Button/lib/variantToBackground.tsx +19 -0
  52. package/src/components/Button/lib/variantToFont.tsx +19 -0
  53. package/src/components/Checkbox/__snapshots__/index.story.storyshot +209 -40
  54. package/src/components/Checkbox/index.story.tsx +82 -64
  55. package/src/components/Checkbox/index.tsx +47 -17
  56. package/src/components/Clickable/__snapshots__/index.story.storyshot +4 -0
  57. package/src/components/Clickable/index.story.tsx +12 -9
  58. package/src/components/Clickable/index.tsx +1 -0
  59. package/src/components/DropdownSelector/DropdownMenuItem.tsx +6 -3
  60. package/src/components/DropdownSelector/ListItem/__snapshots__/index.story.storyshot +3 -10
  61. package/src/components/DropdownSelector/ListItem/index.tsx +6 -4
  62. package/src/components/DropdownSelector/MenuItemGroup/index.tsx +1 -1
  63. package/src/components/DropdownSelector/MenuList/__snapshots__/index.story.storyshot +4 -13
  64. package/src/components/DropdownSelector/Popover/__snapshots__/index.story.storyshot +20 -37
  65. package/src/components/DropdownSelector/Popover/index.tsx +5 -8
  66. package/src/components/DropdownSelector/__snapshots__/index.story.storyshot +227 -294
  67. package/src/components/DropdownSelector/index.story.tsx +33 -0
  68. package/src/components/DropdownSelector/index.tsx +63 -20
  69. package/src/components/FieldLabel/index.tsx +77 -12
  70. package/src/components/IconButton/__snapshots__/index.story.storyshot +30 -54
  71. package/src/components/IconButton/index.tsx +51 -26
  72. package/src/components/LoadingSpinner/index.tsx +3 -6
  73. package/src/components/Modal/Dialog/index.tsx +1 -1
  74. package/src/components/Modal/ModalPlumbing.tsx +26 -5
  75. package/src/components/Modal/__snapshots__/index.story.storyshot +2450 -108
  76. package/src/components/Modal/index.story.tsx +27 -0
  77. package/src/components/Modal/index.tsx +19 -4
  78. package/src/components/MultiSelect/__snapshots__/index.story.storyshot +528 -25
  79. package/src/components/MultiSelect/index.story.tsx +60 -0
  80. package/src/components/MultiSelect/index.tsx +82 -22
  81. package/src/components/Radio/__snapshots__/index.story.storyshot +32 -49
  82. package/src/components/Radio/index.tsx +71 -23
  83. package/src/components/SegmentedControl/RadioGroupContext.tsx +1 -1
  84. package/src/components/SegmentedControl/__snapshots__/index.story.storyshot +9 -10
  85. package/src/components/SegmentedControl/index.tsx +36 -16
  86. package/src/components/Switch/__snapshots__/index.story.storyshot +6 -18
  87. package/src/components/Switch/index.tsx +10 -15
  88. package/src/components/TagItem/__snapshots__/index.story.storyshot +39 -158
  89. package/src/components/TagItem/index.tsx +84 -19
  90. package/src/components/TextArea/__snapshots__/TextArea.story.storyshot +55 -91
  91. package/src/components/TextField/TextField.story.tsx +35 -18
  92. package/src/components/TextField/__snapshots__/TextField.story.storyshot +92 -148
  93. package/src/components/TextField/index.tsx +0 -1
  94. package/dist/components/Checkbox/performance.test.d.ts +0 -4
  95. package/dist/components/Checkbox/performance.test.d.ts.map +0 -1
  96. package/dist/components/Checkbox/snapshot.test.d.ts +0 -2
  97. package/dist/components/Checkbox/snapshot.test.d.ts.map +0 -1
  98. package/src/components/Checkbox/__snapshots__/snapshot.test.tsx.snap +0 -763
  99. package/src/components/Checkbox/performance.test.tsx +0 -30
  100. package/src/components/Checkbox/snapshot.test.tsx +0 -66
@@ -154,3 +154,63 @@ Playground.args = {
154
154
  invalid: false,
155
155
  variant: 'default',
156
156
  }
157
+
158
+ export const Invalid: Story<PlaygroundProps> = ({ className, ...props }) => {
159
+ const [selected, setSelected] = useState<string[]>([])
160
+
161
+ return (
162
+ <StyledMultiSelectGroup
163
+ {...props}
164
+ selected={selected}
165
+ onChange={setSelected}
166
+ invalid
167
+ >
168
+ {[1, 2, 3, 4].map((idx) => (
169
+ <MultiSelect
170
+ value={`選択肢${idx}`}
171
+ variant={props.variant}
172
+ key={idx}
173
+ className={className}
174
+ >
175
+ 選択肢{idx}
176
+ </MultiSelect>
177
+ ))}
178
+ </StyledMultiSelectGroup>
179
+ )
180
+ }
181
+ Invalid.args = {
182
+ name: 'defaultName',
183
+ label: '',
184
+ disabled: false,
185
+ readonly: false,
186
+ variant: 'default',
187
+ }
188
+
189
+ export const Overlay: Story<PlaygroundProps> = ({ className, ...props }) => {
190
+ const [selected, setSelected] = useState<string[]>([])
191
+
192
+ return (
193
+ <StyledMultiSelectGroup
194
+ {...props}
195
+ selected={selected}
196
+ onChange={setSelected}
197
+ >
198
+ {[1, 2, 3, 4].map((idx) => (
199
+ <MultiSelect
200
+ value={`選択肢${idx}`}
201
+ variant="overlay"
202
+ key={idx}
203
+ className={className}
204
+ >
205
+ 選択肢{idx}
206
+ </MultiSelect>
207
+ ))}
208
+ </StyledMultiSelectGroup>
209
+ )
210
+ }
211
+ Overlay.args = {
212
+ name: 'defaultName',
213
+ label: '',
214
+ disabled: false,
215
+ readonly: false,
216
+ }
@@ -2,8 +2,7 @@ import { ChangeEvent, useCallback, useContext, forwardRef, memo } from 'react'
2
2
  import * as React from 'react'
3
3
  import styled, { css } from 'styled-components'
4
4
  import warning from 'warning'
5
- import { theme } from '../../styled'
6
- import { disabledSelector, px } from '@charcoal-ui/utils'
5
+ import { px } from '@charcoal-ui/utils'
7
6
 
8
7
  import { MultiSelectGroupContext } from './context'
9
8
 
@@ -92,17 +91,36 @@ const MultiSelectRoot = styled.label`
92
91
  align-items: center;
93
92
  position: relative;
94
93
  cursor: pointer;
95
- ${disabledSelector} {
94
+ gap: ${({ theme }) => px(theme.spacing[4])};
95
+ &:disabled,
96
+ &[aria-disabled]:not([aria-disabled='false']) {
97
+ opacity: 0.32;
96
98
  cursor: default;
97
99
  }
98
- gap: ${({ theme }) => px(theme.spacing[4])};
99
- ${theme((o) => o.disabled)}
100
100
  `
101
101
 
102
102
  const MultiSelectLabel = styled.div`
103
103
  display: flex;
104
104
  align-items: center;
105
- ${theme((o) => [o.typography(14), o.font.text2])}
105
+ font-size: 14px;
106
+ line-height: 22px;
107
+ display: flow-root;
108
+ color: var(--charcoal-text2);
109
+
110
+ &::before {
111
+ display: block;
112
+ width: 0;
113
+ height: 0;
114
+ content: '';
115
+ margin-top: -4px;
116
+ }
117
+ &::after {
118
+ display: block;
119
+ width: 0;
120
+ height: 0;
121
+ content: '';
122
+ margin-bottom: -4px;
123
+ }
106
124
  `
107
125
 
108
126
  const MultiSelectInput = styled.input.attrs({ type: 'checkbox' })<{
@@ -115,18 +133,55 @@ const MultiSelectInput = styled.input.attrs({ type: 'checkbox' })<{
115
133
  width: 20px;
116
134
  height: 20px;
117
135
  margin: 0;
136
+ background-color: var(--charcoal-text3);
137
+ border-radius: 999999px;
138
+ transition: 0.2s background-color, 0.2s box-shadow;
118
139
 
119
140
  &:checked {
120
- ${theme((o) => o.bg.brand.hover.press)}
141
+ background-color: var(--charcoal-brand);
142
+ &:hover {
143
+ &:not(:disabled):not([aria-disabled]),
144
+ &[aria-disabled='false'] {
145
+ background-color: var(--charcoal-brand-hover);
146
+ }
147
+ }
148
+
149
+ &:active {
150
+ &:not(:disabled):not([aria-disabled]),
151
+ &[aria-disabled='false'] {
152
+ background-color: var(--charcoal-brand-press);
153
+ }
154
+ }
155
+ }
156
+
157
+ &:hover {
158
+ &:not(:disabled):not([aria-disabled]),
159
+ &[aria-disabled='false'] {
160
+ background-color: var(--charcoal-text3-hover);
161
+ }
162
+ }
163
+
164
+ &:active {
165
+ &:not(:disabled):not([aria-disabled]),
166
+ &[aria-disabled='false'] {
167
+ background-color: var(--charcoal-text3-press);
168
+ }
121
169
  }
122
170
 
123
171
  ${({ invalid, overlay }) =>
124
- theme((o) => [
125
- o.bg.text3.hover.press,
126
- o.borderRadius('oval'),
127
- invalid && !overlay && o.outline.assertive,
128
- overlay && o.bg.surface4,
129
- ])};
172
+ invalid &&
173
+ !overlay &&
174
+ css`
175
+ &:not(:disabled):not([aria-disabled]),
176
+ &[aria-disabled='false'] {
177
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
178
+ }
179
+ `}
180
+ ${({ overlay }) =>
181
+ overlay &&
182
+ css`
183
+ background-color: var(--charcoal-surface4);
184
+ `}
130
185
  }
131
186
  `
132
187
 
@@ -141,20 +196,25 @@ const MultiSelectInputOverlay = styled.div<{
141
196
  display: flex;
142
197
  align-items: center;
143
198
  justify-content: center;
144
-
199
+ width: 24px;
200
+ height: 24px;
201
+ border-radius: 999999px;
202
+ color: var(--charcoal-text5);
203
+ transition: 0.2s box-shadow;
145
204
  ${({ invalid, overlay }) =>
146
- theme((o) => [
147
- o.width.px(24),
148
- o.height.px(24),
149
- o.borderRadius('oval'),
150
- o.font.text5,
151
- invalid && overlay && o.outline.assertive,
152
- ])}
205
+ invalid &&
206
+ overlay &&
207
+ css`
208
+ &:not(:disabled):not([aria-disabled]),
209
+ &[aria-disabled='false'] {
210
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
211
+ }
212
+ `}
153
213
 
154
214
  ${({ overlay }) =>
155
215
  overlay &&
156
216
  css`
157
- border-color: ${({ theme }) => theme.color.text5};
217
+ border-color: var(--charcoal-text5);
158
218
  border-width: 2px;
159
219
  border-style: solid;
160
220
  `}
@@ -13,7 +13,7 @@ exports[`Storyshots Radio Default 1`] = `
13
13
  }
14
14
 
15
15
  .c1:disabled,
16
- .c1[aria-disabled]:not([aria-disabled=false]) {
16
+ .c1[aria-disabled]:not([aria-disabled='false']) {
17
17
  opacity: 0.32;
18
18
  }
19
19
 
@@ -30,44 +30,38 @@ exports[`Storyshots Radio Default 1`] = `
30
30
  cursor: pointer;
31
31
  border-radius: 999999px;
32
32
  background-color: var(--charcoal-surface1);
33
- -webkit-transition: 0.2s background-color;
34
- transition: 0.2s background-color;
35
- -webkit-transition: 0.2s box-shadow;
36
- transition: 0.2s box-shadow;
37
- -webkit-transition: all 0.2s !important;
38
- transition: all 0.2s !important;
33
+ -webkit-transition: 0.2s background-color,0.2s box-shadow;
34
+ transition: 0.2s background-color,0.2s box-shadow;
39
35
  }
40
36
 
41
- .c2[type='radio']:hover:not(:disabled):not([aria-disabled]),
42
- .c2[type='radio']:hover[aria-disabled=false] {
37
+ .c2[type='radio']:not(:disabled):not([aria-disabled]):hover,
38
+ .c2[type='radio'][aria-disabled='false']:hover {
43
39
  background-color: var(--charcoal-surface1-hover);
44
40
  }
45
41
 
46
- .c2[type='radio']:active:not(:disabled):not([aria-disabled]),
47
- .c2[type='radio']:active[aria-disabled=false] {
42
+ .c2[type='radio']:not(:disabled):not([aria-disabled]):active,
43
+ .c2[type='radio'][aria-disabled='false']:active {
48
44
  background-color: var(--charcoal-surface1-press);
49
45
  }
50
46
 
47
+ .c2[type='radio']:not(:disabled):not([aria-disabled]):focus,
48
+ .c2[type='radio'][aria-disabled='false']:focus,
49
+ .c2[type='radio']:not(:disabled):not([aria-disabled]):active,
50
+ .c2[type='radio'][aria-disabled='false']:active,
51
+ .c2[type='radio']:not(:disabled):not([aria-disabled]):focus-visible,
52
+ .c2[type='radio'][aria-disabled='false']:focus-visible {
53
+ outline: none;
54
+ box-shadow: 0 0 0 4px rgba(0,150,250,0.32);
55
+ }
56
+
51
57
  .c2[type='radio']:not(:checked) {
52
58
  border-width: 2px;
53
59
  border-style: solid;
54
- border-color: #858585;
60
+ border-color: var(--charcoal-text3);
55
61
  }
56
62
 
57
63
  .c2[type='radio']:checked {
58
64
  background-color: var(--charcoal-brand);
59
- -webkit-transition: 0.2s background-color;
60
- transition: 0.2s background-color;
61
- }
62
-
63
- .c2[type='radio']:checked:hover:not(:disabled):not([aria-disabled]),
64
- .c2[type='radio']:checked:hover[aria-disabled=false] {
65
- background-color: var(--charcoal-brand-hover);
66
- }
67
-
68
- .c2[type='radio']:checked:active:not(:disabled):not([aria-disabled]),
69
- .c2[type='radio']:checked:active[aria-disabled=false] {
70
- background-color: var(--charcoal-brand-press);
71
65
  }
72
66
 
73
67
  .c2[type='radio']:checked::after {
@@ -78,39 +72,28 @@ exports[`Storyshots Radio Default 1`] = `
78
72
  pointer-events: none;
79
73
  background-color: var(--charcoal-text5);
80
74
  border-radius: 999999px;
81
- -webkit-transition: 0.2s background-color;
82
- transition: 0.2s background-color;
83
- }
84
-
85
- .c2[type='radio']:checked::after:hover:not(:disabled):not([aria-disabled]),
86
- .c2[type='radio']:checked::after:hover[aria-disabled=false] {
87
- background-color: var(--charcoal-text5-hover);
75
+ -webkit-transition: 0.2s background-color,0.2s box-shadow;
76
+ transition: 0.2s background-color,0.2s box-shadow;
88
77
  }
89
78
 
90
- .c2[type='radio']:checked::after:active:not(:disabled):not([aria-disabled]),
91
- .c2[type='radio']:checked::after:active[aria-disabled=false] {
92
- background-color: var(--charcoal-text5-press);
79
+ .c2[type='radio']:checked:not(:disabled):not([aria-disabled]):hover,
80
+ .c2[type='radio']:checked[aria-disabled='false']:hover {
81
+ background-color: var(--charcoal-brand-hover);
93
82
  }
94
83
 
95
- .c2[type='radio']:not(:disabled):not([aria-disabled]):focus,
96
- .c2[type='radio'][aria-disabled=false]:focus,
97
- .c2[type='radio']:not(:disabled):not([aria-disabled]):active,
98
- .c2[type='radio'][aria-disabled=false]:active {
99
- outline: none;
100
- box-shadow: 0 0 0 4px rgba(0,150,250,0.32);
84
+ .c2[type='radio']:checked:not(:disabled):not([aria-disabled]):hover::after,
85
+ .c2[type='radio']:checked[aria-disabled='false']:hover::after {
86
+ background-color: var(--charcoal-text5-hover);
101
87
  }
102
88
 
103
- .c2[type='radio']:not(:disabled):not([aria-disabled]):focus:not(:focus-visible),
104
- .c2[type='radio'][aria-disabled=false]:focus:not(:focus-visible),
105
- .c2[type='radio']:not(:disabled):not([aria-disabled]):active:not(:focus-visible),
106
- .c2[type='radio'][aria-disabled=false]:active:not(:focus-visible) {
107
- outline: none;
89
+ .c2[type='radio']:checked:not(:disabled):not([aria-disabled]):active,
90
+ .c2[type='radio']:checked[aria-disabled='false']:active {
91
+ background-color: var(--charcoal-brand-press);
108
92
  }
109
93
 
110
- .c2[type='radio']:not(:disabled):not([aria-disabled]):focus-visible,
111
- .c2[type='radio'][aria-disabled=false]:focus-visible {
112
- outline: none;
113
- box-shadow: 0 0 0 4px rgba(0,150,250,0.32);
94
+ .c2[type='radio']:checked:not(:disabled):not([aria-disabled]):active::after,
95
+ .c2[type='radio']:checked[aria-disabled='false']:active::after {
96
+ background-color: var(--charcoal-text5-press);
114
97
  }
115
98
 
116
99
  .c3 {
@@ -1,9 +1,7 @@
1
1
  import { memo, forwardRef, useCallback, useContext } from 'react'
2
2
  import * as React from 'react'
3
- import styled from 'styled-components'
3
+ import styled, { css } from 'styled-components'
4
4
  import warning from 'warning'
5
- import { theme } from '../../styled'
6
- import { px } from '@charcoal-ui/utils'
7
5
 
8
6
  export type RadioProps = React.PropsWithChildren<{
9
7
  value: string
@@ -62,11 +60,14 @@ export default memo(Radio)
62
60
  const RadioRoot = styled.label`
63
61
  display: grid;
64
62
  grid-template-columns: auto 1fr;
65
- grid-gap: ${({ theme }) => px(theme.spacing[4])};
63
+ grid-gap: 4px;
66
64
  align-items: center;
67
65
  cursor: pointer;
68
66
 
69
- ${theme((o) => [o.disabled])}
67
+ &:disabled,
68
+ &[aria-disabled]:not([aria-disabled='false']) {
69
+ opacity: 0.32;
70
+ }
70
71
  `
71
72
 
72
73
  export const RadioInput = styled.input.attrs({ type: 'radio' })<{
@@ -84,43 +85,90 @@ export const RadioInput = styled.input.attrs({ type: 'radio' })<{
84
85
  width: 20px;
85
86
  height: 20px;
86
87
  cursor: pointer;
87
-
88
- ${({ invalid = false }) =>
89
- theme((o) => [
90
- o.borderRadius('oval'),
91
- o.bg.surface1.hover.press,
92
- invalid && o.outline.assertive,
93
- ])};
88
+ border-radius: 999999px;
89
+ background-color: var(--charcoal-surface1);
90
+ transition: 0.2s background-color, 0.2s box-shadow;
91
+
92
+ &:not(:disabled):not([aria-disabled]),
93
+ &[aria-disabled='false'] {
94
+ ${({ invalid = false }) =>
95
+ invalid &&
96
+ css`
97
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
98
+ `}
99
+
100
+ &:hover {
101
+ background-color: var(--charcoal-surface1-hover);
102
+ }
103
+ &:active {
104
+ background-color: var(--charcoal-surface1-press);
105
+ }
106
+ &:focus,
107
+ &:active,
108
+ &:focus-visible {
109
+ outline: none;
110
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
111
+ }
112
+ }
94
113
 
95
114
  &:not(:checked) {
96
115
  border-width: 2px;
97
116
  border-style: solid;
98
- border-color: ${({ theme }) => theme.color.text3};
117
+ border-color: var(--charcoal-text3);
99
118
  }
100
119
 
101
120
  &:checked {
102
- ${theme((o) => o.bg.brand.hover.press)}
103
-
121
+ background-color: var(--charcoal-brand);
104
122
  &::after {
105
123
  content: '';
106
124
  display: block;
107
125
  width: 8px;
108
126
  height: 8px;
109
127
  pointer-events: none;
128
+ background-color: var(--charcoal-text5);
129
+ border-radius: 999999px;
130
+ transition: 0.2s background-color, 0.2s box-shadow;
131
+ }
110
132
 
111
- ${theme((o) => [o.bg.text5.hover.press, o.borderRadius('oval')])}
133
+ &:not(:disabled):not([aria-disabled]),
134
+ &[aria-disabled='false'] {
135
+ &:hover {
136
+ background-color: var(--charcoal-brand-hover);
137
+ &::after {
138
+ background-color: var(--charcoal-text5-hover);
139
+ }
140
+ }
141
+ &:active {
142
+ background-color: var(--charcoal-brand-press);
143
+ &::after {
144
+ background-color: var(--charcoal-text5-press);
145
+ }
146
+ }
112
147
  }
113
148
  }
114
-
115
- ${theme((o) => o.outline.default.focus)}
116
-
117
- /* FIXME: o.outline.default.focus の transition に o.bg.brand の transition が打ち消されてしまう */
118
- transition: all 0.2s !important;
119
149
  }
120
150
  `
121
151
 
122
152
  const RadioLabel = styled.div`
123
- ${theme((o) => [o.typography(14), o.font.text2])}
153
+ font-size: 14px;
154
+ line-height: 22px;
155
+ display: flow-root;
156
+ color: var(--charcoal-text2);
157
+
158
+ &::before {
159
+ display: block;
160
+ width: 0;
161
+ height: 0;
162
+ content: '';
163
+ margin-top: -4px;
164
+ }
165
+ &::after {
166
+ display: block;
167
+ width: 0;
168
+ height: 0;
169
+ content: '';
170
+ margin-bottom: -4px;
171
+ }
124
172
  `
125
173
 
126
174
  export type RadioGroupProps = React.PropsWithChildren<{
@@ -138,7 +186,7 @@ export type RadioGroupProps = React.PropsWithChildren<{
138
186
  const StyledRadioGroup = styled.div`
139
187
  display: grid;
140
188
  grid-template-columns: 1fr;
141
- grid-gap: ${({ theme }) => px(theme.spacing[8])};
189
+ grid-gap: 8px;
142
190
  `
143
191
 
144
192
  interface RadioGroupContext {
@@ -1,6 +1,6 @@
1
1
  import { createContext, useContext } from 'react'
2
2
  import * as React from 'react'
3
- import { RadioGroupState } from 'react-stately'
3
+ import type { RadioGroupState } from '@react-stately/radio'
4
4
 
5
5
  const RadioContext = createContext<RadioGroupState | null>(null)
6
6
 
@@ -33,12 +33,8 @@ exports[`Storyshots SegmentedControl Object Segments 1`] = `
33
33
  }
34
34
 
35
35
  .c1:disabled,
36
- .c1[aria-disabled]:not([aria-disabled=false]) {
36
+ .c1[aria-disabled]:not([aria-disabled='false']) {
37
37
  cursor: default;
38
- }
39
-
40
- .c1:disabled,
41
- .c1[aria-disabled]:not([aria-disabled=false]) {
42
38
  opacity: 0.32;
43
39
  }
44
40
 
@@ -129,6 +125,7 @@ exports[`Storyshots SegmentedControl Object Segments 1`] = `
129
125
  onTouchEnd={[Function]}
130
126
  onTouchMove={[Function]}
131
127
  onTouchStart={[Function]}
128
+ required={false}
132
129
  tabIndex={0}
133
130
  type="radio"
134
131
  value="option1"
@@ -167,6 +164,7 @@ exports[`Storyshots SegmentedControl Object Segments 1`] = `
167
164
  onTouchEnd={[Function]}
168
165
  onTouchMove={[Function]}
169
166
  onTouchStart={[Function]}
167
+ required={false}
170
168
  tabIndex={0}
171
169
  type="radio"
172
170
  value="option2"
@@ -205,6 +203,7 @@ exports[`Storyshots SegmentedControl Object Segments 1`] = `
205
203
  onTouchEnd={[Function]}
206
204
  onTouchMove={[Function]}
207
205
  onTouchStart={[Function]}
206
+ required={false}
208
207
  tabIndex={0}
209
208
  type="radio"
210
209
  value="option3"
@@ -242,6 +241,7 @@ exports[`Storyshots SegmentedControl Object Segments 1`] = `
242
241
  onTouchEnd={[Function]}
243
242
  onTouchMove={[Function]}
244
243
  onTouchStart={[Function]}
244
+ required={false}
245
245
  type="radio"
246
246
  value="option4"
247
247
  />
@@ -292,12 +292,8 @@ exports[`Storyshots SegmentedControl String Segments 1`] = `
292
292
  }
293
293
 
294
294
  .c1:disabled,
295
- .c1[aria-disabled]:not([aria-disabled=false]) {
295
+ .c1[aria-disabled]:not([aria-disabled='false']) {
296
296
  cursor: default;
297
- }
298
-
299
- .c1:disabled,
300
- .c1[aria-disabled]:not([aria-disabled=false]) {
301
297
  opacity: 0.32;
302
298
  }
303
299
 
@@ -388,6 +384,7 @@ exports[`Storyshots SegmentedControl String Segments 1`] = `
388
384
  onTouchEnd={[Function]}
389
385
  onTouchMove={[Function]}
390
386
  onTouchStart={[Function]}
387
+ required={false}
391
388
  tabIndex={0}
392
389
  type="radio"
393
390
  value="option1"
@@ -426,6 +423,7 @@ exports[`Storyshots SegmentedControl String Segments 1`] = `
426
423
  onTouchEnd={[Function]}
427
424
  onTouchMove={[Function]}
428
425
  onTouchStart={[Function]}
426
+ required={false}
429
427
  tabIndex={0}
430
428
  type="radio"
431
429
  value="option2"
@@ -464,6 +462,7 @@ exports[`Storyshots SegmentedControl String Segments 1`] = `
464
462
  onTouchEnd={[Function]}
465
463
  onTouchMove={[Function]}
466
464
  onTouchStart={[Function]}
465
+ required={false}
467
466
  tabIndex={0}
468
467
  type="radio"
469
468
  value="option3"
@@ -1,17 +1,15 @@
1
1
  import { ReactNode, forwardRef, memo, useMemo, useRef } from 'react'
2
2
  import * as React from 'react'
3
- import { useRadioGroupState } from 'react-stately'
3
+ import { useRadioGroupState } from '@react-stately/radio'
4
4
  import {
5
5
  AriaRadioGroupProps,
6
6
  AriaRadioProps,
7
7
  useRadio,
8
8
  useRadioGroup,
9
9
  } from '@react-aria/radio'
10
- import styled from 'styled-components'
11
- import { disabledSelector } from '@charcoal-ui/utils'
10
+ import styled, { css } from 'styled-components'
12
11
 
13
12
  import { RadioProvider, useRadioContext } from './RadioGroupContext'
14
- import { theme } from '../../styled'
15
13
 
16
14
  type SegmentedControlItem = {
17
15
  label: React.ReactNode
@@ -120,7 +118,8 @@ const SegmentedControlRoot = styled.div`
120
118
  display: inline-flex;
121
119
  align-items: center;
122
120
 
123
- ${theme((o) => [o.bg.surface3, o.borderRadius(16)])}
121
+ background-color: var(--charcoal-surface3);
122
+ border-radius: 16px;
124
123
  `
125
124
 
126
125
  const SegmentedRoot = styled.label<{ checked?: boolean }>`
@@ -130,18 +129,22 @@ const SegmentedRoot = styled.label<{ checked?: boolean }>`
130
129
  cursor: pointer;
131
130
  height: 32px;
132
131
 
133
- ${disabledSelector} {
132
+ padding-right: 16px;
133
+ padding-left: 16px;
134
+ border-radius: 16px;
135
+ &:disabled,
136
+ &[aria-disabled]:not([aria-disabled='false']) {
134
137
  cursor: default;
138
+ opacity: 0.32;
135
139
  }
136
-
137
- ${({ checked }) =>
138
- theme((o) => [
139
- o.padding.horizontal(16),
140
- o.borderRadius(16),
141
- o.disabled,
142
- checked === true && o.bg.brand,
143
- checked === true ? o.font.text5 : o.font.text2,
144
- ])}
140
+ color: var(--charcoal-text2);
141
+
142
+ ${({ checked = false }) =>
143
+ checked &&
144
+ css`
145
+ background-color: var(--charcoal-brand);
146
+ color: var(--charcoal-text5);
147
+ `}
145
148
  `
146
149
  const SegmentedInput = styled.input`
147
150
  position: absolute;
@@ -165,5 +168,22 @@ const RadioLabel = styled.div`
165
168
  height: 22px;
166
169
  `
167
170
  const SegmentedLabelInner = styled.div`
168
- ${theme((o) => [o.typography(14)])}
171
+ font-size: 14px;
172
+ line-height: 22px;
173
+ display: flow-root;
174
+
175
+ &::before {
176
+ display: block;
177
+ width: 0;
178
+ height: 0;
179
+ content: '';
180
+ margin-top: -4px;
181
+ }
182
+ &::after {
183
+ display: block;
184
+ width: 0;
185
+ height: 0;
186
+ content: '';
187
+ margin-bottom: -4px;
188
+ }
169
189
  `