@charcoal-ui/react 6.0.1 → 6.1.0-beta.1

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 (60) hide show
  1. package/dist/components/Notification/NotificationItem.cjs +30 -0
  2. package/dist/components/Notification/NotificationItem.cjs.map +1 -0
  3. package/dist/components/Notification/NotificationItem.d.ts +15 -0
  4. package/dist/components/Notification/NotificationItem.d.ts.map +1 -0
  5. package/dist/components/Notification/NotificationItem.js +30 -0
  6. package/dist/components/Notification/NotificationItem.js.map +1 -0
  7. package/dist/components/Notification/NotificationRegion.cjs +50 -0
  8. package/dist/components/Notification/NotificationRegion.cjs.map +1 -0
  9. package/dist/components/Notification/NotificationRegion.d.ts +14 -0
  10. package/dist/components/Notification/NotificationRegion.d.ts.map +1 -0
  11. package/dist/components/Notification/NotificationRegion.js +50 -0
  12. package/dist/components/Notification/NotificationRegion.js.map +1 -0
  13. package/dist/components/Notification/Snackbar/index.d.ts +45 -0
  14. package/dist/components/Notification/Snackbar/index.d.ts.map +1 -0
  15. package/dist/components/Notification/Snackbar/index2.cjs +99 -0
  16. package/dist/components/Notification/Snackbar/index2.cjs.map +1 -0
  17. package/dist/components/Notification/Snackbar/index2.js +94 -0
  18. package/dist/components/Notification/Snackbar/index2.js.map +1 -0
  19. package/dist/components/Notification/Toast/index.d.ts +28 -0
  20. package/dist/components/Notification/Toast/index.d.ts.map +1 -0
  21. package/dist/components/Notification/Toast/index2.cjs +86 -0
  22. package/dist/components/Notification/Toast/index2.cjs.map +1 -0
  23. package/dist/components/Notification/Toast/index2.js +81 -0
  24. package/dist/components/Notification/Toast/index2.js.map +1 -0
  25. package/dist/components/Notification/types.d.ts +27 -0
  26. package/dist/components/Notification/types.d.ts.map +1 -0
  27. package/dist/components/Notification/useNotificationQueue.cjs +155 -0
  28. package/dist/components/Notification/useNotificationQueue.cjs.map +1 -0
  29. package/dist/components/Notification/useNotificationQueue.d.ts +16 -0
  30. package/dist/components/Notification/useNotificationQueue.d.ts.map +1 -0
  31. package/dist/components/Notification/useNotificationQueue.js +155 -0
  32. package/dist/components/Notification/useNotificationQueue.js.map +1 -0
  33. package/dist/components/Pagination/index2.js +52 -60
  34. package/dist/components/Pagination/index2.js.map +1 -1
  35. package/dist/index.cjs +6 -0
  36. package/dist/index.css +1608 -1432
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3 -1
  40. package/dist/layered.css +1608 -1432
  41. package/dist/layered.css.map +1 -1
  42. package/package.json +5 -5
  43. package/src/__tests__/css-output.test.ts +39 -6
  44. package/src/components/Notification/NotificationItem.tsx +51 -0
  45. package/src/components/Notification/NotificationRegion.tsx +76 -0
  46. package/src/components/Notification/Snackbar/__snapshots__/index.css.snap +69 -0
  47. package/src/components/Notification/Snackbar/index.css +68 -0
  48. package/src/components/Notification/Snackbar/index.story.tsx +213 -0
  49. package/src/components/Notification/Snackbar/index.test.tsx +344 -0
  50. package/src/components/Notification/Snackbar/index.tsx +131 -0
  51. package/src/components/Notification/Toast/__snapshots__/index.css.snap +62 -0
  52. package/src/components/Notification/Toast/index.css +61 -0
  53. package/src/components/Notification/Toast/index.story.tsx +174 -0
  54. package/src/components/Notification/Toast/index.test.tsx +263 -0
  55. package/src/components/Notification/Toast/index.tsx +86 -0
  56. package/src/components/Notification/__snapshots__/layout.css.snap +47 -0
  57. package/src/components/Notification/layout.css +46 -0
  58. package/src/components/Notification/types.ts +28 -0
  59. package/src/components/Notification/useNotificationQueue.ts +235 -0
  60. package/src/index.ts +19 -0
package/dist/index.css CHANGED
@@ -6,714 +6,1057 @@
6
6
  box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
7
7
  transition: 0.2s box-shadow;
8
8
  }
9
- .charcoal-tag-item {
10
- --charcoal-tag-item-color: var(--charcoal-color-text-on-primary-default);
11
- --charcoal-tag-item-size: 40px;
12
- --charcoal-tag-item-padding-left: 24px;
13
- --charcoal-tag-item-padding-right: 24px;
14
- --charcoal-tag-item-bg: ;
15
-
16
- isolation: isolate;
17
- position: relative;
9
+ .charcoal-clickable {
10
+ cursor: pointer;
18
11
 
12
+ /* Reset button appearance */
19
13
  -webkit-appearance: none;
20
-
21
14
  -moz-appearance: none;
22
-
23
15
  appearance: none;
24
- outline: none;
16
+ background: transparent;
17
+ padding: 0;
25
18
  border-style: none;
19
+ outline: none;
20
+ color: inherit;
21
+ text-rendering: inherit;
22
+ letter-spacing: inherit;
23
+ word-spacing: inherit;
24
+ text-decoration: none;
26
25
 
27
- display: inline-flex;
28
- gap: 8px;
29
- align-items: center;
30
- justify-content: center;
26
+ /* Change the font styles in all browsers. */
27
+ font: inherit;
31
28
 
32
- text-decoration: none;
33
- cursor: pointer;
34
- overflow: hidden;
29
+ /* Remove the margin in Firefox and Safari. */
30
+ margin: 0;
35
31
 
36
- color: var(--charcoal-tag-item-color);
37
- height: var(--charcoal-tag-item-size);
38
- padding-top: 4px;
39
- padding-bottom: 4px;
40
- padding-left: var(--charcoal-tag-item-padding-left);
41
- padding-right: var(--charcoal-tag-item-padding-right);
42
- box-sizing: border-box;
43
- border-radius: 4px;
32
+ /* Show the overflow in Edge. */
33
+ overflow: visible;
44
34
 
45
- transition: 0.2s box-shadow;
35
+ /* Remove the inheritance of text transform in Firefox. */
36
+ text-transform: none;
46
37
  }
47
38
 
48
- .charcoal-tag-item[data-size='M'] {
49
- --charcoal-tag-item-size: 40px;
50
- --charcoal-tag-item-padding-left: 24px;
51
- --charcoal-tag-item-padding-right: 24px;
52
- }
53
-
54
- .charcoal-tag-item[data-size='S'] {
55
- --charcoal-tag-item-size: 32px;
56
- --charcoal-tag-item-padding-left: 16px;
57
- --charcoal-tag-item-padding-right: 16px;
39
+ .charcoal-clickable:disabled,
40
+ .charcoal-clickable[aria-disabled]:not([aria-disabled='false']) {
41
+ cursor: default;
58
42
  }
59
43
 
60
- .charcoal-tag-item[data-state='inactive'] {
61
- --charcoal-tag-item-color: var(--charcoal-color-text-secondary-default);
44
+ .charcoal-clickable:focus {
45
+ outline: none;
62
46
  }
63
47
 
64
- .charcoal-tag-item[data-state='active'] {
65
- --charcoal-tag-item-padding-left: 16px;
66
- --charcoal-tag-item-padding-right: 8px;
48
+ .charcoal-clickable::-moz-focus-inner {
49
+ border-style: none;
50
+ padding: 0;
67
51
  }
52
+ .charcoal-button {
53
+ -webkit-appearance: none;
54
+ -moz-appearance: none;
55
+ appearance: none;
56
+ background-image: none;
57
+ box-sizing: border-box;
58
+ padding: 0 24px;
59
+ border-style: none;
60
+ outline: none;
61
+ text-rendering: inherit;
62
+ letter-spacing: inherit;
63
+ word-spacing: inherit;
64
+ text-decoration: none;
65
+ font-family: inherit;
66
+ font-style: inherit;
67
+ font-variant: inherit;
68
+ margin: 0;
69
+ overflow: visible;
70
+ text-transform: none;
71
+ width: -moz-min-content;
72
+ width: min-content;
73
+ display: inline-grid;
74
+ align-items: center;
75
+ justify-content: center;
76
+ cursor: pointer;
77
+ -webkit-user-select: none;
78
+ -moz-user-select: none;
79
+ user-select: none;
80
+ white-space: nowrap;
81
+ border-radius: 999999px;
82
+ font-size: 14px;
83
+ line-height: 22px;
84
+ font-weight: bold;
85
+ color: var(--charcoal-color-text-default);
86
+ background-color: var(
87
+ --charcoal-color-container-secondary-default-a,
88
+ transparent
89
+ );
90
+ transition:
91
+ 0.2s color,
92
+ 0.2s background-color,
93
+ 0.2s box-shadow;
94
+ height: 40px;
95
+ }
68
96
 
69
- .charcoal-tag-item:disabled,
70
- .charcoal-tag-item[aria-disabled]:not([aria-disabled='false']) {
71
- opacity: 0.32;
97
+ .charcoal-button:disabled,
98
+ .charcoal-button[aria-disabled]:not([aria-disabled='false']) {
72
99
  cursor: default;
100
+ opacity: 0.32;
73
101
  }
74
102
 
75
- .charcoal-tag-item:not(:disabled):not([aria-disabled]):focus-visible,
76
- .charcoal-tag-item[aria-disabled='false']:focus-visible {
103
+ .charcoal-button:not(:disabled):not([aria-disabled]):focus-visible,
104
+ .charcoal-button[aria-disabled='false']:focus-visible {
77
105
  outline: none;
78
106
  box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
79
107
  }
80
108
 
81
- .charcoal-tag-item:not(:disabled):not([aria-disabled]):focus,
82
- .charcoal-tag-item[aria-disabled='false']:focus {
83
- outline: none;
84
- box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
109
+ .charcoal-button:not(:disabled):not([aria-disabled]):hover,
110
+ .charcoal-button[aria-disabled='false']:hover {
111
+ color: var(--charcoal-color-text-hover);
112
+ background-color: var(--charcoal-color-container-secondary-hover-a);
85
113
  }
86
114
 
87
- .charcoal-tag-item:not(:disabled):not([aria-disabled]):focus:not(:focus-visible),
88
- .charcoal-tag-item[aria-disabled='false']:focus:not(:focus-visible) {
89
- box-shadow: none;
115
+ .charcoal-button:not(:disabled):not([aria-disabled]):active,
116
+ .charcoal-button[aria-disabled='false']:active,
117
+ .charcoal-button[data-active='true'] {
118
+ color: var(--charcoal-color-text-press);
119
+ background-color: var(--charcoal-color-container-secondary-press-a);
90
120
  }
91
121
 
92
- .charcoal-tag-item__bg {
93
- background-color: var(--charcoal-tag-item-bg);
94
- }
95
-
96
- .charcoal-tag-item__bg[data-bg-variant='image'] {
97
- background-color: var(--charcoal-color-container-on-img-default);
122
+ .charcoal-button[data-variant='Primary'] {
123
+ color: var(--charcoal-color-text-on-primary-default);
124
+ background-color: var(--charcoal-color-container-primary-default);
98
125
  }
99
126
 
100
- .charcoal-tag-item__bg[data-bg-variant='image']::before {
101
- content: '';
102
- position: absolute;
103
- z-index: 1;
104
- top: 0;
105
- left: 0;
106
- width: 100%;
107
- height: 100%;
108
- background-position: center;
109
- background-size: cover;
110
- background-image: var(--charcoal-tag-item-bg);
111
- mix-blend-mode: overlay;
127
+ .charcoal-button[data-variant='Primary']:hover:not(:disabled):not([aria-disabled]),
128
+ .charcoal-button[data-variant='Primary']:hover[aria-disabled='false'] {
129
+ color: var(--charcoal-color-text-on-primary-hover);
130
+ background-color: var(--charcoal-color-container-primary-hover);
112
131
  }
113
132
 
114
- .charcoal-tag-item__bg[data-state='inactive'] {
115
- background-color: var(--charcoal-color-container-secondary-default);
133
+ .charcoal-button[data-variant='Primary']:active:not(:disabled):not([aria-disabled]),
134
+ .charcoal-button[data-variant='Primary']:active[aria-disabled='false'],
135
+ .charcoal-button[data-variant='Primary'][data-active='true'] {
136
+ color: var(--charcoal-color-text-on-primary-press);
137
+ background-color: var(--charcoal-color-container-primary-press);
138
+ }
139
+
140
+ .charcoal-button[data-variant='Overlay'] {
141
+ color: var(--charcoal-color-text-on-on-img-default);
142
+ background-color: var(--charcoal-color-container-on-img-default);
116
143
  }
117
144
 
118
- .charcoal-tag-item__label {
119
- height: 100%;
120
- display: flex;
121
- flex-direction: column;
122
- align-items: center;
123
- justify-content: center;
124
- }
145
+ .charcoal-button[data-variant='Overlay']:hover:not(:disabled):not([aria-disabled]),
146
+ .charcoal-button[data-variant='Overlay']:hover[aria-disabled='false'] {
147
+ color: var(--charcoal-color-text-on-on-img-hover);
148
+ background-color: var(--charcoal-color-container-on-img-hover);
149
+ }
125
150
 
126
- .charcoal-tag-item__label[data-has-translate='true'] {
127
- justify-content: space-between;
151
+ .charcoal-button[data-variant='Overlay']:active:not(:disabled):not([aria-disabled]),
152
+ .charcoal-button[data-variant='Overlay']:active[aria-disabled='false'],
153
+ .charcoal-button[data-variant='Overlay'][data-active='true'] {
154
+ color: var(--charcoal-color-text-on-on-img-press);
155
+ background-color: var(--charcoal-color-container-on-img-press);
156
+ }
157
+
158
+ .charcoal-button[data-variant='Navigation'] {
159
+ color: var(--charcoal-color-text-on-hud-default);
160
+ background-color: var(--charcoal-color-container-hud-default);
128
161
  }
129
162
 
130
- .charcoal-tag-item__label__translated {
131
- --charcoal-tag-item-text-font-size: 12px;
132
- --charcoal-tag-item-text-line-height: 20px;
133
- font-weight: bold;
134
- }
163
+ .charcoal-button[data-variant='Navigation']:hover:not(:disabled):not([aria-disabled]),
164
+ .charcoal-button[data-variant='Navigation']:hover[aria-disabled='false'] {
165
+ color: var(--charcoal-color-text-on-hud-hover);
166
+ background-color: var(--charcoal-color-container-hud-hover);
167
+ }
135
168
 
136
- .charcoal-tag-item__label__translated::before {
137
- display: none;
138
- }
169
+ .charcoal-button[data-variant='Navigation']:active:not(:disabled):not([aria-disabled]),
170
+ .charcoal-button[data-variant='Navigation']:active[aria-disabled='false'],
171
+ .charcoal-button[data-variant='Navigation'][data-active='true'] {
172
+ color: var(--charcoal-color-text-on-hud-press);
173
+ background-color: var(--charcoal-color-container-hud-press);
174
+ }
139
175
 
140
- .charcoal-tag-item__label__text {
141
- --charcoal-tag-item-text-font-size: 14px;
142
- --charcoal-tag-item-text-line-height: 22px;
176
+ .charcoal-button[data-variant='Danger'] {
177
+ color: var(--charcoal-color-text-on-negative-default);
178
+ background-color: var(--charcoal-color-container-negative-default);
179
+ }
143
180
 
144
- max-width: 152px;
145
- overflow: hidden;
146
- font-weight: bold;
181
+ .charcoal-button[data-variant='Danger']:hover:not(:disabled):not([aria-disabled]),
182
+ .charcoal-button[data-variant='Danger']:hover[aria-disabled='false'] {
183
+ color: var(--charcoal-color-text-on-negative-hover);
184
+ background-color: var(--charcoal-color-container-negative-hover);
185
+ }
147
186
 
148
- color: inherit;
149
- white-space: nowrap;
150
- text-overflow: ellipsis;
151
- }
187
+ .charcoal-button[data-variant='Danger']:active:not(:disabled):not([aria-disabled]),
188
+ .charcoal-button[data-variant='Danger']:active[aria-disabled='false'],
189
+ .charcoal-button[data-variant='Danger'][data-active='true'] {
190
+ color: var(--charcoal-color-text-on-negative-press);
191
+ background-color: var(--charcoal-color-container-negative-press);
192
+ }
152
193
 
153
- .charcoal-tag-item__label__text[data-has-translate='true'] {
154
- --charcoal-tag-item-text-font-size: 10px;
155
- --charcoal-tag-item-text-line-height: 14px;
156
- font-weight: normal;
194
+ .charcoal-button[data-size='S'] {
195
+ padding: 0 16px;
196
+ height: 32px;
157
197
  }
158
198
 
159
- /* Kept flat: different class name from .charcoal-tag-item__label__text (note: "labe" typo in original) */
160
- .charcoal-tag-item__labe__text[data-has-translate='true']::after {
161
- display: none;
162
- }
163
- .charcoal-modal-header-root {
164
- height: 64px;
165
- display: grid;
166
- align-content: center;
167
- justify-content: center;
168
- }
169
-
170
- @media (max-width: 743px) {
171
- .charcoal-modal-header-root[data-bottom-sheet='true'],
172
- .charcoal-modal-header-root[data-bottom-sheet='full'] {
173
- height: 48px;
199
+ .charcoal-button[data-full-width='true'] {
200
+ width: 100%;
174
201
  }
175
- }
176
-
177
- .charcoal-modal-header-title {
178
- color: var(--charcoal-color-text-default);
179
- font-size: 16px;
180
- line-height: 24px;
181
- font-weight: bold;
182
- display: flow-root;
183
- }
184
-
185
- .charcoal-modal-align {
186
- padding-left: 16px;
187
- padding-right: 16px;
188
- }
202
+ .charcoal-icon-button {
203
+ cursor: pointer;
204
+ -webkit-appearance: none;
205
+ -moz-appearance: none;
206
+ appearance: none;
207
+ background: transparent;
208
+ padding: 0;
209
+ border-style: none;
210
+ outline: none;
211
+ color: inherit;
212
+ text-rendering: inherit;
213
+ letter-spacing: inherit;
214
+ word-spacing: inherit;
215
+ text-decoration: none;
216
+ font: inherit;
217
+ margin: 0;
218
+ overflow: visible;
219
+ text-transform: none;
189
220
 
190
- .charcoal-modal-body {
191
- padding-bottom: 40px;
192
- }
221
+ -webkit-user-select: none;
193
222
 
194
- .charcoal-modal-buttons {
195
- display: grid;
196
- grid-auto-flow: row;
197
- grid-row-gap: 8px;
223
+ -moz-user-select: none;
198
224
 
199
- padding-top: 16px;
200
- padding-left: 16px;
201
- padding-right: 16px;
202
- }
203
- .charcoal-hint-text {
204
- background-color: var(--charcoal-color-container-secondary-default);
205
- border-radius: 8px;
206
- padding: 12px 16px;
225
+ user-select: none;
207
226
  display: flex;
208
- align-items: flex-start;
227
+ align-items: center;
228
+ justify-content: center;
229
+ border-radius: 999999px;
230
+ transition:
231
+ 0.2s background-color,
232
+ 0.2s box-shadow;
209
233
  }
210
234
 
211
- .charcoal-hint-text[data-context='page'] {
212
- justify-content: center;
235
+ .charcoal-icon-button:disabled,
236
+ .charcoal-icon-button[aria-disabled]:not([aria-disabled='false']) {
237
+ cursor: default;
238
+ opacity: 0.32;
213
239
  }
214
240
 
215
- @media (min-width: 744px) {
216
-
217
- .charcoal-hint-text[data-context='page'] {
218
- padding: 20px 40px
241
+ .charcoal-icon-button:focus {
242
+ outline: none;
219
243
  }
220
- }
221
-
222
- .charcoal-hint-text-icon {
223
- display: flex;
224
- align-items: center;
225
- color: var(--charcoal-color-icon-tertiary-default);
226
- height: 22px;
227
- margin: 0 4px 0 0;
228
- }
229
-
230
- .charcoal-hint-text-message {
231
- color: var(--charcoal-color-text-secondary-default);
232
- font-size: 14px;
233
- line-height: 22px;
234
- display: flow-root;
235
- margin: 0;
236
- min-width: 0;
237
- overflow-wrap: break-word;
238
- }
239
- .charcoal-loading-spinner {
240
- box-sizing: content-box;
241
- margin: auto;
242
- padding: 16px;
243
- border-radius: 8px;
244
- font-size: 48px;
245
- width: 48px;
246
- height: 48px;
247
- opacity: 0.84;
248
- color: var(--charcoal-color-icon-tertiary-default);
249
- background-color: var(--charcoal-color-background-default);
250
- }
251
244
 
252
- .charcoal-loading-spinner[data-transparent='true'] {
253
- background-color: transparent;
245
+ .charcoal-icon-button::-moz-focus-inner {
246
+ border-style: none;
247
+ padding: 0;
254
248
  }
255
249
 
256
- @keyframes charcoal-loading-spinner-icon-scale-out {
257
- from {
258
- transform: scale(0);
259
- opacity: 1;
260
- }
261
- to {
262
- transform: scale(1);
263
- opacity: 0;
250
+ .charcoal-icon-button[data-size='XS'] {
251
+ width: 20px;
252
+ height: 20px;
264
253
  }
265
- }
266
254
 
267
- .charcoal-loading-spinner-icon {
268
- width: 1em;
269
- height: 1em;
270
- border-radius: 1em;
271
- background-color: currentColor;
272
- animation: charcoal-loading-spinner-icon-scale-out 1s infinite both ease-out;
273
- }
255
+ .charcoal-icon-button[data-size='S'] {
256
+ width: 32px;
257
+ height: 32px;
258
+ }
274
259
 
275
- .charcoal-loading-spinner-icon[data-reset-animation] {
276
- animation: none;
260
+ .charcoal-icon-button[data-size='M'] {
261
+ width: 40px;
262
+ height: 40px;
277
263
  }
278
264
 
279
- .charcoal-loading-spinner-icon[data-once='true'] {
280
- animation-iteration-count: 1;
265
+ .charcoal-icon-button[data-variant='Default'] {
266
+ color: var(--charcoal-color-icon-tertiary-default);
267
+ background-color: transparent;
281
268
  }
282
- .charcoal-carousel {
283
- --charcoal-carousel-gap: 0px;
284
269
 
285
- position: relative;
286
- display: block;
287
- }
270
+ .charcoal-icon-button[data-variant='Default'][data-active='true']:not(:disabled):not([aria-disabled]),
271
+ .charcoal-icon-button[data-variant='Default'][data-active='true'][aria-disabled='false'] {
272
+ color: var(--charcoal-color-icon-tertiary-press);
273
+ background-color: var(--charcoal-color-container-press-a);
274
+ }
288
275
 
289
- .charcoal-carousel[data-full-width='true'] {
290
- width: 100vw;
291
- margin-inline: calc(50% - 50vw);
276
+ .charcoal-icon-button[data-variant='Default'][data-active='false']:not(:disabled):not([aria-disabled]):hover,
277
+ .charcoal-icon-button[data-variant='Default'][data-active='false'][aria-disabled='false']:hover {
278
+ color: var(--charcoal-color-icon-tertiary-hover);
279
+ background-color: var(--charcoal-color-container-hover-a);
280
+ }
281
+
282
+ .charcoal-icon-button[data-variant='Default'][data-active='false']:not(:disabled):not([aria-disabled]):active,
283
+ .charcoal-icon-button[data-variant='Default'][data-active='false'][aria-disabled='false']:active {
284
+ color: var(--charcoal-color-icon-tertiary-press);
285
+ background-color: var(--charcoal-color-container-press-a);
286
+ }
287
+
288
+ .charcoal-icon-button[data-variant='Overlay'] {
289
+ color: var(--charcoal-color-icon-on-on-img-default);
290
+ background-color: var(--charcoal-color-container-on-img-default);
292
291
  }
293
292
 
294
- .charcoal-carousel__viewport {
295
- position: relative;
296
- }
293
+ .charcoal-icon-button[data-variant='Overlay'][data-active='true']:not(:disabled):not([aria-disabled]),
294
+ .charcoal-icon-button[data-variant='Overlay'][data-active='true'][aria-disabled='false'] {
295
+ color: var(--charcoal-color-icon-on-on-img-press);
296
+ background-color: var(--charcoal-color-container-on-img-press);
297
+ }
297
298
 
298
- /* フォーカスリングは scroller ではなく viewport に描く。scroller に置くと
299
- hasGradient の mask(mask-clip: border-box)で外側の box-shadow ごと消えるため。 */
299
+ .charcoal-icon-button[data-variant='Overlay'][data-active='false']:not(:disabled):not([aria-disabled]):hover,
300
+ .charcoal-icon-button[data-variant='Overlay'][data-active='false'][aria-disabled='false']:hover {
301
+ color: var(--charcoal-color-icon-on-on-img-hover);
302
+ background-color: var(--charcoal-color-container-on-img-hover);
303
+ }
300
304
 
301
- .charcoal-carousel__viewport[data-focus-visible] {
305
+ .charcoal-icon-button[data-variant='Overlay'][data-active='false']:not(:disabled):not([aria-disabled]):active,
306
+ .charcoal-icon-button[data-variant='Overlay'][data-active='false'][aria-disabled='false']:active {
307
+ color: var(--charcoal-color-icon-on-on-img-press);
308
+ background-color: var(--charcoal-color-container-on-img-press);
309
+ }
310
+
311
+ .charcoal-icon-button:not(:disabled):not([aria-disabled]):focus,
312
+ .charcoal-icon-button[aria-disabled='false']:focus {
313
+ outline: none;
302
314
  box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
303
315
  }
304
316
 
305
- /* スライド間隔は gap prop(--charcoal-carousel-gap)で注入する。
306
- スライド寸法は sandbox 同様、利用者が children 側で持つ。 */
307
- .charcoal-carousel__scroller {
308
- position: relative;
309
- display: flex;
310
- gap: var(--charcoal-carousel-gap);
311
- overflow-x: auto;
312
- overflow-y: hidden;
313
- overscroll-behavior-x: contain;
314
- scroll-behavior: smooth;
315
- scrollbar-width: none;
316
- outline: none;
317
- }
318
- .charcoal-carousel__scroller::-webkit-scrollbar {
319
- display: none;
317
+ .charcoal-icon-button:not(:disabled):not([aria-disabled]):focus-visible,
318
+ .charcoal-icon-button[aria-disabled='false']:focus-visible {
319
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
320
320
  }
321
321
 
322
- /* スクロールスナップ type は prop(scrollSnap.type)で scroller に出し分ける。
323
- align は基底 .charcoal-carousel__item の後(後述)に置く(no-descending-specificity 回避)。
324
- 未指定時の既定(M=none / S=mandatory / align=center)は JS 側で data 属性に解決する。 */
325
- .charcoal-carousel[data-scroll-snap-type='none'] .charcoal-carousel__scroller {
326
- scroll-snap-type: none;
322
+ .charcoal-icon-button:not(:disabled):not([aria-disabled]):focus:not(:focus-visible),
323
+ .charcoal-icon-button[aria-disabled='false']:focus:not(:focus-visible) {
324
+ box-shadow: none;
325
+ }
326
+ .charcoal-radio__label {
327
+ display: grid;
328
+ grid-template-columns: auto 1fr;
329
+ grid-gap: 4px;
330
+ align-items: center;
331
+ cursor: pointer;
327
332
  }
328
333
 
329
- .charcoal-carousel[data-scroll-snap-type='proximity']
330
- .charcoal-carousel__scroller {
331
- scroll-snap-type: x proximity;
332
- }
334
+ .charcoal-radio__label[aria-disabled]:not([aria-disabled='false']) {
335
+ opacity: 0.32;
336
+ cursor: default;
337
+ }
333
338
 
334
- .charcoal-carousel[data-scroll-snap-type='mandatory']
335
- .charcoal-carousel__scroller {
336
- scroll-snap-type: x mandatory;
339
+ .charcoal-radio__label_div {
340
+ font-size: 14px;
341
+ line-height: 22px;
342
+ color: var(--charcoal-color-text-default);
337
343
  }
338
-
339
- /* グラデーション: mask で端のアイテム自体を透明へフェードさせる(下の背景色を
340
- 問わない)。mask の色はアルファとしてだけ効く(#000=表示 / transparent=透過)。
341
- 左フェード・右フェードの 2 レイヤーを intersect で合成し、はみ出して
342
- スクロール可能な側のみ data-can-prev/next で 72px のフェード帯を枠内に置く。
343
- 無効な側はフェード帯ごと枠外へスライドして隠す(mask-image と違い
344
- mask-position は補間可能なので、切替が 0.2s のフェードになる)。 */
345
- .charcoal-carousel[data-has-gradient='true'] .charcoal-carousel__scroller {
346
- -webkit-mask-image:
347
- linear-gradient(to right, transparent, #000 72px),
348
- linear-gradient(to left, transparent, #000 72px);
349
- mask-image:
350
- linear-gradient(to right, transparent, #000 72px),
351
- linear-gradient(to left, transparent, #000 72px);
352
- /* 枠外へ 72px スライドしても反対側の端が欠けないよう、レイヤー幅に 72px 足す */
353
- -webkit-mask-size: calc(100% + 72px) 100%;
354
- mask-size: calc(100% + 72px) 100%;
355
- -webkit-mask-repeat: no-repeat;
356
- mask-repeat: no-repeat;
357
- -webkit-mask-composite: source-in, xor;
358
- mask-composite: intersect;
359
- -webkit-mask-position:
360
- -72px 0,
361
- 0 0;
362
- mask-position:
363
- -72px 0,
364
- 0 0;
365
- /* 0.2s ease-in は react-sandbox の LeftGradient と同じ値 */
366
- transition: 0.2s ease-in mask-position;
367
- }
368
-
369
- .charcoal-carousel[data-has-gradient='true'][data-can-prev='true']
370
- .charcoal-carousel__scroller {
371
- -webkit-mask-position:
372
- 0 0,
373
- 0 0;
374
- mask-position:
375
- 0 0,
376
- 0 0;
377
- }
378
-
379
- .charcoal-carousel[data-has-gradient='true'][data-can-next='true']
380
- .charcoal-carousel__scroller {
381
- -webkit-mask-position:
382
- -72px 0,
383
- -72px 0;
384
- mask-position:
385
- -72px 0,
386
- -72px 0;
387
- }
388
-
389
- .charcoal-carousel[data-has-gradient='true'][data-can-prev='true'][data-can-next='true']
390
- .charcoal-carousel__scroller {
391
- -webkit-mask-position:
392
- 0 0,
393
- -72px 0;
394
- mask-position:
395
- 0 0,
396
- -72px 0;
344
+ .charcoal-radio-group {
345
+ display: grid;
346
+ grid-template-columns: 1fr;
347
+ grid-gap: 8px;
397
348
  }
398
-
399
- .charcoal-carousel__item {
400
- flex: 0 0 auto;
401
- min-width: 0;
349
+ .charcoal-switch__label {
350
+ display: inline-grid;
351
+ grid-template-columns: auto 1fr;
352
+ align-items: center;
353
+ cursor: pointer;
354
+ outline: 0;
355
+ gap: 4px;
402
356
  }
403
357
 
404
- .charcoal-carousel[data-size='S'] .charcoal-carousel__item {
405
- flex: 0 0 100%;
406
- }
358
+ .charcoal-switch__label[aria-disabled='true'] {
359
+ opacity: 0.32;
360
+ cursor: default;
361
+ }
407
362
 
408
- /* scroll-snap-align prop(scrollSnap.align)で出し分ける。基底 .charcoal-carousel__item
409
- より後に置くことで no-descending-specificity を回避する。 */
410
- .charcoal-carousel[data-scroll-snap-align='center'] .charcoal-carousel__item {
411
- scroll-snap-align: center;
412
- }
363
+ .charcoal-switch__label[aria-disabled='true'] > input {
364
+ opacity: 1;
365
+ }
413
366
 
414
- .charcoal-carousel[data-scroll-snap-align='start'] .charcoal-carousel__item {
415
- scroll-snap-align: start;
367
+ .charcoal-switch__label_div {
368
+ font-size: 14px;
369
+ line-height: 22px;
370
+ color: var(--charcoal-color-text-default);
416
371
  }
417
-
418
- /* ── Navigation Buttons (charcoal IconButton, variant=Overlay size=S) ── */
419
-
420
- /* マスクの透過域と同じ 72px 1fr 72px グリッド。各ボタンは 72px ゾーンの中央に置く。 */
421
- .charcoal-carousel__navigation {
422
- position: absolute;
423
- inset: 0;
424
- pointer-events: none;
372
+ .charcoal-multi-select {
425
373
  display: grid;
426
- grid-template-columns: 72px 1fr 72px;
374
+ grid-template-columns: auto 1fr;
427
375
  align-items: center;
428
- /* アイテム内のコンテンツより上にボタンを表示する */
429
- z-index: 1;
430
- /* sandbox 同様、通常は隠してカルーセル hover 時にフェードイン表示する。 */
431
- opacity: 0;
432
- transition: 0.4s opacity;
376
+ position: relative;
377
+ cursor: pointer;
378
+ gap: 4px;
433
379
  }
434
- .charcoal-carousel__navigation[data-visible='false'] {
435
- display: none;
436
- }
437
380
 
438
- /* hover で表示。キーボード操作でも到達できるよう、キーボード由来のフォーカスが
439
- カルーセル内にある間も表示する(:focus-within だとクリックで残ったフォーカスでも
440
- 表示され続けるため、react-aria が付与する data 属性で判定する)。 */
441
- .charcoal-carousel:hover .charcoal-carousel__navigation,
442
- .charcoal-carousel[data-focus-visible-within] .charcoal-carousel__navigation {
443
- opacity: 1;
444
- }
381
+ .charcoal-multi-select:disabled,
382
+ .charcoal-multi-select[aria-disabled]:not([aria-disabled='false']) {
383
+ opacity: 0.32;
384
+ cursor: default;
385
+ }
445
386
 
446
- .charcoal-carousel__navigation__item {
447
- pointer-events: auto;
387
+ .charcoal-multi-select-label {
388
+ display: flow-root;
389
+ align-items: center;
390
+ font-size: 14px;
391
+ line-height: 22px;
392
+ color: var(--charcoal-color-text-default);
448
393
  }
449
394
 
450
- /* ヒットエリアをグリッド端列(= mask のフェード帯と同じ 72px)全体へ広げる。
451
- 擬似要素上のクリックは元の button に届くため、帯のどこを押してもページ送りになる。
452
- position: absolute の基準は positioned な .charcoal-carousel__navigation(inset: 0)。 */
453
-
454
- .charcoal-carousel__navigation__item::after {
395
+ .charcoal-multi-select-label::before {
396
+ display: block;
397
+ width: 0;
398
+ height: 0;
455
399
  content: '';
456
- position: absolute;
457
- top: 0;
458
- bottom: 0;
459
- width: 72px;
400
+ margin-top: -4px;
460
401
  }
461
402
 
462
- .charcoal-carousel__navigation__item[data-direction='prev'] {
463
- grid-column: 1;
464
- justify-self: center;
403
+ .charcoal-multi-select-label::after {
404
+ display: block;
405
+ width: 0;
406
+ height: 0;
407
+ content: '';
408
+ margin-bottom: -4px;
465
409
  }
466
410
 
467
- .charcoal-carousel__navigation__item[data-direction='prev']::after {
468
- left: 0;
469
- }
411
+ .charcoal-multi-select-input[type='checkbox'] {
412
+ -webkit-appearance: none;
413
+ -moz-appearance: none;
414
+ appearance: none;
415
+ display: block;
416
+ width: 20px;
417
+ height: 20px;
418
+ margin: 0;
419
+ background-color: var(--charcoal-color-container-neutral-default);
420
+ border-radius: 999999px;
421
+ transition:
422
+ 0.2s background-color,
423
+ 0.2s box-shadow;
424
+ }
470
425
 
471
- .charcoal-carousel__navigation__item[data-direction='next'] {
472
- grid-column: 3;
473
- justify-self: center;
426
+ .charcoal-multi-select-input[type='checkbox']:checked {
427
+ background-color: var(--charcoal-color-container-primary-default);
474
428
  }
475
429
 
476
- .charcoal-carousel__navigation__item[data-direction='next']::after {
477
- right: 0;
478
- }
430
+ .charcoal-multi-select-input[type='checkbox']:focus {
431
+ outline: none;
432
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
433
+ }
479
434
 
480
- /* スクロール端では非表示。IconButton の disabled スタイル(opacity:0.32)より
481
- 高い詳細度で打ち消すため、ルートを前置する。 */
482
- .charcoal-carousel .charcoal-carousel__navigation__item[data-hidden='true'] {
483
- opacity: 0;
484
- pointer-events: none;
485
- }
435
+ .charcoal-multi-select-input[type='checkbox']:focus-visible {
436
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
437
+ }
486
438
 
487
- /* タッチデバイスではナビゲーションボタンを出さず、スワイプ操作に委ねる。 */
488
- @media (hover: none) and (pointer: coarse) {
489
- .charcoal-carousel__navigation {
490
- display: none;
439
+ .charcoal-multi-select-input[type='checkbox']:focus:not(:focus-visible) {
440
+ box-shadow: none;
491
441
  }
492
- }
493
442
 
494
- /* ── Indicator: JS Fallback ── */
443
+ .charcoal-multi-select-input[type='checkbox']:hover:not(:disabled):not([aria-disabled]),
444
+ .charcoal-multi-select-input[type='checkbox']:hover[aria-disabled='false'] {
445
+ background-color: var(--charcoal-color-container-neutral-hover);
446
+ }
495
447
 
496
- .charcoal-carousel__indicator {
497
- display: flex;
498
- justify-content: center;
499
- align-items: center;
500
- height: 40px;
501
- gap: 8px;
502
- }
448
+ .charcoal-multi-select-input[type='checkbox']:active:not(:disabled):not([aria-disabled]),
449
+ .charcoal-multi-select-input[type='checkbox']:active[aria-disabled='false'] {
450
+ background-color: var(--charcoal-color-container-neutral-press);
451
+ }
503
452
 
504
- .charcoal-carousel__indicator[data-visible='false'] {
505
- display: none;
453
+ .charcoal-multi-select-input[type='checkbox']:checked:hover:not(:disabled):not([aria-disabled]),
454
+ .charcoal-multi-select-input[type='checkbox']:checked:hover[aria-disabled='false'] {
455
+ background-color: var(--charcoal-color-container-primary-hover);
506
456
  }
507
457
 
508
- .charcoal-carousel__indicator__item {
509
- -webkit-appearance: none;
510
- -moz-appearance: none;
511
- appearance: none;
512
- box-sizing: border-box;
513
- width: 8px;
514
- height: 8px;
515
- padding: 0;
516
- border: 0;
517
- border-radius: 50%;
518
- background-color: var(--charcoal-color-text-tertiary-default);
519
- cursor: pointer;
520
- transition: 0.2s background-color;
521
- }
458
+ .charcoal-multi-select-input[type='checkbox']:checked:active:not(:disabled):not([aria-disabled]),
459
+ .charcoal-multi-select-input[type='checkbox']:checked:active[aria-disabled='false'] {
460
+ background-color: var(--charcoal-color-container-primary-press);
461
+ }
522
462
 
523
- .charcoal-carousel__indicator__item:hover {
524
- background-color: var(--charcoal-color-text-secondary-default);
463
+ .charcoal-multi-select-input[type='checkbox'][aria-invalid='true'][data-overlay='false']:not(:disabled):not(
464
+ [aria-disabled]
465
+ ) {
466
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
525
467
  }
526
468
 
527
- .charcoal-carousel__indicator__item:focus-visible {
528
- outline: 2px solid rgba(0, 150, 250, 0.56);
529
- outline-offset: 2px;
469
+ .charcoal-multi-select-input[type='checkbox'][aria-invalid='true'][data-overlay='false'][aria-disabled='false'] {
470
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
530
471
  }
531
472
 
532
- .charcoal-carousel__indicator__item[data-active='true'] {
533
- background-color: var(--charcoal-color-text-default);
473
+ .charcoal-multi-select-input[type='checkbox'][data-overlay='true'] {
474
+ background-color: var(--charcoal-color-container-on-img-default);
534
475
  }
535
476
 
536
- /* ── CSS Scroll Markers (progressive enhancement) ── */
477
+ .charcoal-multi-select-overlay {
478
+ position: absolute;
479
+ top: -2px;
480
+ left: -2px;
481
+ box-sizing: border-box;
482
+ display: flex;
483
+ align-items: center;
484
+ justify-content: center;
485
+ width: 24px;
486
+ height: 24px;
487
+ border-radius: 999999px;
488
+ color: var(--charcoal-color-icon-on-primary-default);
489
+ transition: 0.2s box-shadow;
490
+ }
537
491
 
538
- /* CSS Scroll Markers / Anchor Positioning は新しい仕様で、stylelint がプロパティ・
539
- 擬似要素・擬似クラスを未知と判定するため、この @supports ブロックでは該当ルールを無効化する。 */
540
- /* stylelint-disable property-no-unknown, selector-pseudo-element-no-unknown, selector-pseudo-class-no-unknown */
541
- @supports (scroll-marker-group: after) {
542
- .charcoal-carousel[data-indicator='true'] {
543
- padding-bottom: 40px;
492
+ .charcoal-multi-select-overlay[aria-invalid='true'][data-overlay='true']:not(:disabled):not(
493
+ [aria-disabled]
494
+ ) {
495
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
544
496
  }
545
497
 
546
- .charcoal-carousel__scroller {
547
- anchor-name: --charcoal-carousel;
548
- scroll-marker-group: after;
498
+ .charcoal-multi-select-overlay[aria-invalid='true'][data-overlay='true'][aria-disabled='false'] {
499
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
549
500
  }
550
501
 
551
- .charcoal-carousel__scroller::scroll-button(*) {
552
- content: none;
553
- }
502
+ .charcoal-multi-select-overlay[data-overlay='true'] {
503
+ border-color: var(--charcoal-color-border-hud);
504
+ border-width: 2px;
505
+ border-style: solid;
506
+ }
507
+ .charcoal-text-field-root {
508
+ display: grid;
509
+ grid-template-columns: 1fr;
510
+ grid-gap: 4px;
511
+ }
554
512
 
555
- .charcoal-carousel__scroller::scroll-marker-group {
556
- display: flex;
557
- justify-content: center;
558
- align-items: center;
559
- height: 40px;
560
- gap: 8px;
513
+ .charcoal-text-field-root[aria-disabled='true'] {
514
+ opacity: 0.32;
515
+ }
561
516
 
562
- position: absolute;
563
- position-anchor: --charcoal-carousel;
564
- top: anchor(bottom);
565
- justify-self: anchor-center;
566
- }
517
+ .charcoal-text-field-container {
518
+ display: flex;
519
+ height: 40px;
520
+ transition:
521
+ 0.2s background-color,
522
+ 0.2s box-shadow;
523
+ color: var(--charcoal-color-text-secondary-default);
524
+ background-color: var(--charcoal-color-container-secondary-default-a);
525
+ border-radius: 4px;
526
+ padding: 0 8px;
527
+ line-height: 22px;
528
+ font-size: 14px;
529
+ }
567
530
 
568
- .charcoal-carousel[data-indicator='false'] .charcoal-carousel__scroller {
569
- scroll-marker-group: none;
531
+ .charcoal-text-field-container[data-invalid='true'] {
532
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
570
533
  }
571
534
 
572
- .charcoal-carousel__item::scroll-marker {
573
- content: '';
574
- width: 8px;
575
- height: 8px;
576
- border: 0;
577
- border-radius: 50%;
578
- background-color: var(--charcoal-color-text-tertiary-default);
579
- cursor: pointer;
580
- transition: 0.2s background-color;
535
+ .charcoal-text-field-container:not([aria-disabled='true']):hover {
536
+ background-color: var(--charcoal-color-container-secondary-hover-a);
581
537
  }
582
538
 
583
- .charcoal-carousel__item::scroll-marker:hover {
584
- background-color: var(--charcoal-color-text-secondary-default);
585
- }
586
-
587
- .charcoal-carousel__item::scroll-marker:focus {
588
- outline: 2px solid rgba(0, 150, 250, 0.56);
589
- outline-offset: 2px;
590
- }
591
-
592
- .charcoal-carousel__item::scroll-marker:target-current {
593
- background-color: var(--charcoal-color-text-default);
594
- }
539
+ .charcoal-text-field-container:not([aria-disabled='true']):focus-within {
540
+ outline: none;
541
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
542
+ }
595
543
 
596
- .charcoal-carousel__indicator {
597
- display: none;
544
+ .charcoal-text-field-container:not([aria-disabled='true'])[data-invalid='true']:focus-within {
545
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
598
546
  }
547
+
548
+ .charcoal-text-field-prefix {
549
+ display: flex;
550
+ align-items: center;
551
+ margin-right: 4px;
599
552
  }
600
- /* stylelint-enable property-no-unknown, selector-pseudo-element-no-unknown, selector-pseudo-class-no-unknown */
601
- .charcoal-pagination {
553
+
554
+ .charcoal-text-field-suffix {
602
555
  display: flex;
603
- justify-content: center;
604
556
  align-items: center;
557
+ gap: 8px;
558
+ margin-left: 4px;
605
559
  }
606
560
 
607
- .charcoal-pagination[data-size='S'] .charcoal-pagination-button {
608
- min-width: 32px;
609
- min-height: 32px;
610
- }
561
+ .charcoal-text-field-input-root {
562
+ flex: 1;
563
+ min-width: 0;
564
+ overflow: hidden;
565
+ }
611
566
 
612
- .charcoal-pagination[data-size='M'] .charcoal-pagination-button {
613
- min-width: 40px;
614
- min-height: 40px;
615
- }
567
+ .charcoal-text-field-input {
568
+ border: none;
569
+ box-sizing: border-box;
570
+ outline: none;
571
+ font-family: inherit;
616
572
 
617
- /* stylelint-disable no-descending-specificity */
618
- .charcoal-pagination-button {
619
- cursor: pointer;
573
+ /* Prevent zooming for iOS Safari */
574
+ transform-origin: top left;
575
+ transform: scale(0.875);
576
+ width: calc(100% / 0.875);
577
+ height: calc(100% / 0.875);
578
+ font-size: calc(14px / 0.875);
579
+ line-height: calc(22px / 0.875);
580
+ padding-left: 0;
581
+ padding-right: 0;
582
+ border-radius: calc(4px / 0.875);
583
+
584
+ /* Display box-shadow for iOS Safari */
620
585
  -webkit-appearance: none;
621
586
  -moz-appearance: none;
622
587
  appearance: none;
623
- padding: 0;
624
- border-style: none;
625
- outline: none;
626
- text-decoration: none;
627
- font-family: inherit;
628
- font-style: inherit;
629
- font-variant: inherit;
630
- margin: 0;
631
- -webkit-user-select: none;
632
- -moz-user-select: none;
633
- user-select: none;
588
+ background: transparent;
634
589
 
635
- display: flex;
636
- align-items: center;
637
- justify-content: center;
638
- font-size: 14px;
639
- font-weight: 700;
640
- line-height: 22px;
590
+ color: var(--charcoal-color-text-secondary-default);
591
+ }
641
592
 
642
- /* HACK:
643
- * Safari doesn't correctly repaint the elements when they're reordered in response to interaction.
644
- * This forces it to repaint them. This doesn't work if put on the parents either, has to be here.
645
- */
646
- /* stylelint-disable-next-line property-no-vendor-prefix */
647
- -webkit-transform: translateZ(0);
593
+ .charcoal-text-field-input::-moz-placeholder {
594
+ color: var(--charcoal-color-text-placeholder-default);
595
+ }
596
+
597
+ .charcoal-text-field-input::placeholder {
598
+ color: var(--charcoal-color-text-placeholder-default);
599
+ }
648
600
 
601
+ .charcoal-text-field-line-counter {
602
+ line-height: 22px;
603
+ font-size: 14px;
649
604
  color: var(--charcoal-color-text-tertiary-default);
650
- background-color: transparent;
651
- border-radius: 20px;
652
- transition:
653
- 0.2s background-color,
654
- 0.2s box-shadow;
655
605
  }
656
- .charcoal-pagination-button:focus {
657
- outline: none;
658
- }
659
- .charcoal-pagination-button::-moz-focus-inner {
660
- border-style: none;
661
- padding: 0;
606
+ .charcoal-icon {
607
+ display: inline-flex;
608
+ width: var(--charcoal-icon-size);
609
+ height: var(--charcoal-icon-size);
610
+ }
611
+
612
+ pixiv-icon:not(:defined) {
613
+ --pixiv-icon-base: 24px;
614
+ --pixiv-icon-scale: 1;
615
+ --pixiv-icon-size: calc(var(--pixiv-icon-base) * var(--pixiv-icon-scale));
616
+
617
+ display: inline-flex;
618
+ /* --charcoal-icon-size がセットされていればそれを優先、
619
+ なければ name / scale から導出した --pixiv-icon-size をフォールバック */
620
+ width: var(--charcoal-icon-size, var(--pixiv-icon-size));
621
+ height: var(--charcoal-icon-size, var(--pixiv-icon-size));
622
+ }
623
+
624
+ pixiv-icon:not(:defined)[name^='16/'] {
625
+ --pixiv-icon-base: 16px;
626
+ --pixiv-icon-size: 16px;
662
627
  }
663
- .charcoal-pagination-button[hidden] {
664
- visibility: hidden;
665
- display: block;
628
+
629
+ pixiv-icon:not(:defined)[name^='24/'][scale='2'] {
630
+ --pixiv-icon-scale: 2;
631
+ }
632
+
633
+ pixiv-icon:not(:defined)[name^='24/'][scale='3'] {
634
+ --pixiv-icon-scale: 3;
635
+ }
636
+
637
+ pixiv-icon:not(:defined)[name^='32/'] {
638
+ --pixiv-icon-base: 32px;
639
+ --pixiv-icon-size: 32px;
666
640
  }
667
- .charcoal-pagination-button:not(:disabled):not([aria-disabled]):hover,
668
- .charcoal-pagination-button[aria-disabled='false']:hover {
669
- color: var(--charcoal-color-text-tertiary-default);
670
- background-color: var(--charcoal-color-container-secondary-default);
641
+
642
+ pixiv-icon:not(:defined)[name^='Inline/'] {
643
+ --pixiv-icon-base: 16px;
671
644
  }
672
- .charcoal-pagination-button:not(:disabled):not([aria-disabled]):active,
673
- .charcoal-pagination-button[aria-disabled='false']:active {
674
- color: var(--charcoal-color-text-tertiary-press);
675
- background-color: var(--charcoal-color-container-tertiary-press);
645
+
646
+ pixiv-icon:not(:defined)[name^='Inline/'][scale='2'] {
647
+ --pixiv-icon-scale: 2;
648
+ }
649
+ .charcoal-text-area-root {
650
+ display: grid;
651
+ grid-template-columns: 1fr;
652
+ grid-gap: 4px;
653
+ }
654
+
655
+ .charcoal-text-area-root[aria-disabled='true'] {
656
+ opacity: 0.32;
676
657
  }
677
- .charcoal-pagination-button:not(:disabled):not([aria-disabled]):focus,
678
- .charcoal-pagination-button[aria-disabled='false']:focus {
658
+
659
+ .charcoal-text-area-container {
660
+ /* Runtime variable overridden by the React component. */
661
+ --charcoal-text-area-rows: 4;
662
+
663
+ position: relative;
664
+ overflow: hidden;
665
+
666
+ color: var(--charcoal-color-text-secondary-default);
667
+ background-color: var(--charcoal-color-container-secondary-default-a);
668
+ border-radius: 4px;
669
+ transition:
670
+ 0.2s background-color,
671
+ 0.2s box-shadow;
672
+ height: calc(22px * var(--charcoal-text-area-rows) + 18px);
673
+ }
674
+
675
+ .charcoal-text-area-container[aria-invalid='true'] {
676
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
677
+ }
678
+
679
+ .charcoal-text-area-container:focus-within {
679
680
  outline: none;
680
681
  box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
681
682
  }
682
- .charcoal-pagination-button:not(:disabled):not([aria-disabled]):focus-visible,
683
- .charcoal-pagination-button[aria-disabled='false']:focus-visible {
684
- box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
683
+
684
+ .charcoal-text-area-container:has([data-no-bottom-padding='true']) {
685
+ height: calc(22px * (var(--charcoal-text-area-rows) + 1) + 18px);
685
686
  }
686
- .charcoal-pagination-button:not(:disabled):not([aria-disabled]):focus:not(:focus-visible),
687
- .charcoal-pagination-button[aria-disabled='false']:focus:not(:focus-visible) {
688
- box-shadow: none;
687
+
688
+ .charcoal-text-area-container:not([aria-disabled='true']):hover {
689
+ background-color: var(--charcoal-color-container-secondary-hover-a);
689
690
  }
690
- .charcoal-pagination-button[aria-current] {
691
- cursor: default;
692
- background-color: var(--charcoal-color-container-hud-default);
693
- color: var(--charcoal-color-text-on-hud-default);
691
+
692
+ .charcoal-text-area-container[aria-invalid='true']:focus-within {
693
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
694
694
  }
695
- .charcoal-pagination-button[aria-current]:not(:disabled):not([aria-disabled]):hover,
696
- .charcoal-pagination-button[aria-current]:not(:disabled):not([aria-disabled]):active {
697
- background-color: var(--charcoal-color-container-hud-default);
698
- color: var(--charcoal-color-text-on-hud-default);
695
+
696
+ .charcoal-text-area-textarea {
697
+ border: none;
698
+ outline: none;
699
+ resize: none;
700
+ font-family: inherit;
701
+ color: inherit;
702
+ box-sizing: border-box;
703
+
704
+ /* Prevent zooming for iOS Safari */
705
+ --charcoal-textarea-safari-prevent-zoom-scale: 0.875;
706
+ --charcoal-textarea-line-height: calc(
707
+ 22px / var(--charcoal-textarea-safari-prevent-zoom-scale)
708
+ );
709
+ --charcoal-textarea-padding-y: calc(
710
+ 8px / var(--charcoal-textarea-safari-prevent-zoom-scale)
711
+ );
712
+ --charcoal-textarea-padding-x: calc(
713
+ 9px / var(--charcoal-textarea-safari-prevent-zoom-scale)
714
+ );
715
+
716
+ transform-origin: top left;
717
+ transform: scale(var(--charcoal-textarea-safari-prevent-zoom-scale));
718
+ width: calc(100% / var(--charcoal-textarea-safari-prevent-zoom-scale));
719
+ font-size: calc(14px / var(--charcoal-textarea-safari-prevent-zoom-scale));
720
+ line-height: var(--charcoal-textarea-line-height);
721
+ padding: var(--charcoal-textarea-padding-y) var(--charcoal-textarea-padding-x);
722
+ height: calc(
723
+ var(--charcoal-textarea-line-height) * var(--charcoal-text-area-rows) +
724
+ var(--charcoal-textarea-padding-y) * 2
725
+ );
726
+
727
+ /* Display box-shadow for iOS Safari */
728
+ -webkit-appearance: none;
729
+ -moz-appearance: none;
730
+ appearance: none;
731
+
732
+ background: none;
733
+ }
734
+
735
+ .charcoal-text-area-textarea[data-no-bottom-padding='true'] {
736
+ padding: var(--charcoal-textarea-padding-y)
737
+ var(--charcoal-textarea-padding-x) 0;
738
+ height: calc(
739
+ var(--charcoal-textarea-line-height) * var(--charcoal-text-area-rows) +
740
+ var(--charcoal-textarea-padding-y)
741
+ );
742
+ }
743
+
744
+ .charcoal-text-area-textarea::-moz-placeholder {
745
+ color: var(--charcoal-color-text-placeholder-default);
746
+ }
747
+
748
+ .charcoal-text-area-textarea::placeholder {
749
+ color: var(--charcoal-color-text-placeholder-default);
750
+ }
751
+
752
+ .charcoal-text-area-counter {
753
+ position: absolute;
754
+ bottom: 9px;
755
+ right: 8px;
756
+
757
+ line-height: 22px;
758
+ font-size: 14px;
759
+ color: var(--charcoal-color-text-tertiary-default);
760
+ }
761
+ .charcoal-modal-background {
762
+ overflow: auto;
763
+ display: flex;
764
+ position: fixed;
765
+ top: 0;
766
+ left: 0;
767
+ width: 100%;
768
+ height: 100%;
769
+ justify-content: center;
770
+ padding: 40px 0;
771
+ box-sizing: border-box;
772
+
773
+ background-color: var(--charcoal-color-background-overlay);
774
+ }
775
+
776
+ @media (max-width: 743px) {
777
+ .charcoal-modal-background[data-bottom-sheet='true'],
778
+ .charcoal-modal-background[data-bottom-sheet='full'] {
779
+ padding: 0;
699
780
  }
700
- /* stylelint-enable no-descending-specificity */
781
+ }
701
782
 
702
- .charcoal-pagination-nav-button[data-hidden] {
703
- visibility: hidden;
783
+ /* easeOutQuart。duration は useTransitionPresence の MODAL_TRANSITION_DURATION_MS と一致させること。
784
+ transition は entering / exiting に限定し、開いたままテーマ切り替え等で
785
+ 色や transform が変わってもアニメーションしないようにする */
786
+ .charcoal-modal-background[data-animation] {
787
+ overflow: hidden;
704
788
  }
705
789
 
706
- .charcoal-pagination-spacer,
707
- .charcoal-pagination-spacer:hover,
708
- .charcoal-pagination-spacer:active {
709
- cursor: default;
710
- color: var(--charcoal-color-text-tertiary-default);
711
- background: none;
790
+ .charcoal-modal-background[data-animation='entering'],
791
+ .charcoal-modal-background[data-animation='exiting'] {
792
+ transition: background-color 400ms cubic-bezier(0.25, 1, 0.5, 1);
793
+ }
794
+
795
+ /* 閉じアニメーション中はクリックを下のページへ通す(transitionend が来ない環境で
796
+ 透明なオーバーレイがタップを奪い続けるのも防ぐ) */
797
+ .charcoal-modal-background[data-animation='exited'],
798
+ .charcoal-modal-background[data-animation='exiting'] {
799
+ background-color: transparent;
800
+ pointer-events: none;
801
+ }
802
+
803
+ .charcoal-modal-background[data-animation='entered'] {
804
+ overflow: auto;
805
+ }
806
+
807
+ .charcoal-modal-background[data-animation='entering'] > .charcoal-modal-dialog,
808
+ .charcoal-modal-background[data-animation='exiting'] > .charcoal-modal-dialog {
809
+ transition: transform 400ms cubic-bezier(0.25, 1, 0.5, 1);
810
+ }
811
+
812
+ .charcoal-modal-background[data-animation='exited'] > .charcoal-modal-dialog,
813
+ .charcoal-modal-background[data-animation='exiting'] > .charcoal-modal-dialog {
814
+ transform: translateY(100%);
815
+ }
816
+
817
+ .charcoal-modal-close-button {
818
+ position: absolute;
819
+ top: 8px;
820
+ right: 8px;
821
+
822
+ color: var(--charcoal-color-text-tertiary-default);
823
+ transition: 0.2s color;
824
+ }
825
+
826
+ .charcoal-modal-title {
827
+ margin: 0;
828
+ font-weight: inherit;
829
+ font-size: inherit;
830
+ }
831
+ .charcoal-loading-spinner {
832
+ box-sizing: content-box;
833
+ margin: auto;
834
+ padding: 16px;
835
+ border-radius: 8px;
836
+ font-size: 48px;
837
+ width: 48px;
838
+ height: 48px;
839
+ opacity: 0.84;
840
+ color: var(--charcoal-color-icon-tertiary-default);
841
+ background-color: var(--charcoal-color-background-default);
842
+ }
843
+
844
+ .charcoal-loading-spinner[data-transparent='true'] {
845
+ background-color: transparent;
712
846
  }
713
847
 
714
- .charcoal-pagination-spacer.charcoal-icon-button:disabled {
848
+ @keyframes charcoal-loading-spinner-icon-scale-out {
849
+ from {
850
+ transform: scale(0);
715
851
  opacity: 1;
716
852
  }
853
+ to {
854
+ transform: scale(1);
855
+ opacity: 0;
856
+ }
857
+ }
858
+
859
+ .charcoal-loading-spinner-icon {
860
+ width: 1em;
861
+ height: 1em;
862
+ border-radius: 1em;
863
+ background-color: currentColor;
864
+ animation: charcoal-loading-spinner-icon-scale-out 1s infinite both ease-out;
865
+ }
866
+
867
+ .charcoal-loading-spinner-icon[data-reset-animation] {
868
+ animation: none;
869
+ }
870
+
871
+ .charcoal-loading-spinner-icon[data-once='true'] {
872
+ animation-iteration-count: 1;
873
+ }
874
+ .charcoal-dropdown-selector-root {
875
+ display: grid;
876
+ grid-template-columns: 1fr;
877
+ grid-gap: 4px;
878
+ width: 100%;
879
+ }
880
+
881
+ .charcoal-dropdown-selector-root[aria-disabled='true'] {
882
+ cursor: default;
883
+ opacity: 0.32;
884
+ }
885
+
886
+ .charcoal-dropdown-selector-button {
887
+ display: grid;
888
+ grid-template-columns: 1fr auto;
889
+ justify-content: space-between;
890
+ align-items: center;
891
+
892
+ height: 40px;
893
+ width: 100%;
894
+ box-sizing: border-box;
895
+ border: none;
896
+ cursor: pointer;
897
+ gap: 4px;
898
+
899
+ padding-right: 8px;
900
+ padding-left: 8px;
901
+ background-color: var(--charcoal-color-container-secondary-default-a);
902
+ border-radius: 4px;
903
+
904
+ transition:
905
+ 0.2s box-shadow,
906
+ 0.2s background-color;
907
+ }
908
+
909
+ .charcoal-dropdown-selector-button:disabled {
910
+ cursor: default;
911
+ }
912
+
913
+ .charcoal-dropdown-selector-button:not(:disabled):focus {
914
+ outline: none;
915
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
916
+ }
917
+
918
+ .charcoal-dropdown-selector-button:not(:disabled):focus-visible {
919
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
920
+ }
921
+
922
+ .charcoal-dropdown-selector-button:not(:disabled)[data-active='true'],
923
+ .charcoal-dropdown-selector-button:not(:disabled):active {
924
+ background-color: var(--charcoal-color-container-secondary-press-a);
925
+ }
926
+
927
+ .charcoal-dropdown-selector-button:not(:disabled):hover {
928
+ background-color: var(--charcoal-color-container-secondary-hover-a);
929
+ }
930
+
931
+ .charcoal-dropdown-selector-button:not(:disabled):focus:not(:focus-visible) {
932
+ box-shadow: none;
933
+ }
934
+
935
+ .charcoal-dropdown-selector-button[aria-invalid='true'],
936
+ .charcoal-dropdown-selector-button:not(:disabled)[aria-invalid='true']:focus:not(:focus-visible) {
937
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
938
+ }
939
+
940
+ .charcoal-ui-dropdown-selector-text {
941
+ text-align: left;
942
+ font-size: 14px;
943
+ line-height: 22px;
944
+ display: flow-root;
945
+ color: var(--charcoal-color-text-default);
946
+ overflow: hidden;
947
+ text-overflow: ellipsis;
948
+ white-space: nowrap;
949
+ }
950
+
951
+ .charcoal-ui-dropdown-selector-text[data-placeholder='true'] {
952
+ color: var(--charcoal-color-text-placeholder-default);
953
+ }
954
+
955
+ .charcoal-ui-dropdown-selector-icon {
956
+ color: var(--charcoal-color-icon-secondary-default);
957
+ }
958
+ .charcoal-modal-header-root {
959
+ height: 64px;
960
+ display: grid;
961
+ align-content: center;
962
+ justify-content: center;
963
+ }
964
+
965
+ @media (max-width: 743px) {
966
+ .charcoal-modal-header-root[data-bottom-sheet='true'],
967
+ .charcoal-modal-header-root[data-bottom-sheet='full'] {
968
+ height: 48px;
969
+ }
970
+ }
971
+
972
+ .charcoal-modal-header-title {
973
+ color: var(--charcoal-color-text-default);
974
+ font-size: 16px;
975
+ line-height: 24px;
976
+ font-weight: bold;
977
+ display: flow-root;
978
+ }
979
+
980
+ .charcoal-modal-align {
981
+ padding-left: 16px;
982
+ padding-right: 16px;
983
+ }
984
+
985
+ .charcoal-modal-body {
986
+ padding-bottom: 40px;
987
+ }
988
+
989
+ .charcoal-modal-buttons {
990
+ display: grid;
991
+ grid-auto-flow: row;
992
+ grid-row-gap: 8px;
993
+
994
+ padding-top: 16px;
995
+ padding-left: 16px;
996
+ padding-right: 16px;
997
+ }
998
+ .charcoal-checkbox__label {
999
+ position: relative;
1000
+ cursor: pointer;
1001
+ display: flex;
1002
+ gap: 4px;
1003
+ }
1004
+
1005
+ .charcoal-checkbox__label[aria-disabled='true'] {
1006
+ cursor: default;
1007
+ opacity: 0.32;
1008
+ }
1009
+
1010
+ .charcoal-checkbox__label[aria-disabled='true'] > input {
1011
+ opacity: 1;
1012
+ }
1013
+
1014
+ .charcoal-checkbox__label_div {
1015
+ flex: 1;
1016
+ color: var(--charcoal-color-text-default);
1017
+ font-size: 14px;
1018
+ line-height: 20px;
1019
+ }
1020
+ .charcoal-dropdown-selector-menu-item {
1021
+ font-size: 14px;
1022
+ line-height: 22px;
1023
+ color: var(--charcoal-color-text-secondary-default);
1024
+ padding: 9px 0;
1025
+
1026
+ display: flex;
1027
+ align-items: center;
1028
+ width: 100%;
1029
+ margin-left: 20px;
1030
+ }
1031
+
1032
+ .charcoal-dropdown-selector-menu-item[data-selected='true'] {
1033
+ margin-left: 0px;
1034
+ }
1035
+
1036
+ .charcoal-dropdown-selector-menu-item-icon {
1037
+ color: var(--charcoal-color-text-secondary-default);
1038
+ padding-right: 4px;
1039
+ }
1040
+
1041
+ .charcoal-dropdown-selector-menu-item-container {
1042
+ display: flex;
1043
+ align-items: center;
1044
+ }
1045
+
1046
+ .charcoal-dropdown-selector-menu-secondary {
1047
+ font-size: 12px;
1048
+ line-height: 20px;
1049
+ color: var(--charcoal-color-text-tertiary-default);
1050
+ padding-bottom: 9px;
1051
+
1052
+ display: flex;
1053
+ align-items: center;
1054
+ margin-left: 20px;
1055
+ }
1056
+
1057
+ .charcoal-dropdown-selector-menu-fullwidth {
1058
+ width: 100%;
1059
+ }
717
1060
  .charcoal-text-ellipsis {
718
1061
  /* Runtime variables overridden by the React component. */
719
1062
  --charcoal-text-ellipsis-line-limit: 1;
@@ -738,799 +1081,710 @@
738
1081
  text-overflow: ellipsis;
739
1082
  white-space: nowrap;
740
1083
  }
741
- .charcoal-button {
742
- -webkit-appearance: none;
743
- -moz-appearance: none;
744
- appearance: none;
745
- background-image: none;
746
- box-sizing: border-box;
747
- padding: 0 24px;
748
- border-style: none;
749
- outline: none;
750
- text-rendering: inherit;
751
- letter-spacing: inherit;
752
- word-spacing: inherit;
753
- text-decoration: none;
754
- font-family: inherit;
755
- font-style: inherit;
756
- font-variant: inherit;
757
- margin: 0;
758
- overflow: visible;
759
- text-transform: none;
760
- width: -moz-min-content;
761
- width: min-content;
762
- display: inline-grid;
763
- align-items: center;
764
- justify-content: center;
765
- cursor: pointer;
766
- -webkit-user-select: none;
767
- -moz-user-select: none;
768
- user-select: none;
769
- white-space: nowrap;
770
- border-radius: 999999px;
771
- font-size: 14px;
772
- line-height: 22px;
773
- font-weight: bold;
774
- color: var(--charcoal-color-text-default);
775
- background-color: var(
776
- --charcoal-color-container-secondary-default-a,
777
- transparent
778
- );
779
- transition:
780
- 0.2s color,
781
- 0.2s background-color,
782
- 0.2s box-shadow;
783
- height: 40px;
784
- }
785
-
786
- .charcoal-button:disabled,
787
- .charcoal-button[aria-disabled]:not([aria-disabled='false']) {
788
- cursor: default;
789
- opacity: 0.32;
790
- }
791
-
792
- .charcoal-button:not(:disabled):not([aria-disabled]):focus-visible,
793
- .charcoal-button[aria-disabled='false']:focus-visible {
794
- outline: none;
795
- box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
796
- }
797
-
798
- .charcoal-button:not(:disabled):not([aria-disabled]):hover,
799
- .charcoal-button[aria-disabled='false']:hover {
800
- color: var(--charcoal-color-text-hover);
801
- background-color: var(--charcoal-color-container-secondary-hover-a);
802
- }
803
-
804
- .charcoal-button:not(:disabled):not([aria-disabled]):active,
805
- .charcoal-button[aria-disabled='false']:active,
806
- .charcoal-button[data-active='true'] {
807
- color: var(--charcoal-color-text-press);
808
- background-color: var(--charcoal-color-container-secondary-press-a);
809
- }
810
-
811
- .charcoal-button[data-variant='Primary'] {
812
- color: var(--charcoal-color-text-on-primary-default);
813
- background-color: var(--charcoal-color-container-primary-default);
814
- }
815
-
816
- .charcoal-button[data-variant='Primary']:hover:not(:disabled):not([aria-disabled]),
817
- .charcoal-button[data-variant='Primary']:hover[aria-disabled='false'] {
818
- color: var(--charcoal-color-text-on-primary-hover);
819
- background-color: var(--charcoal-color-container-primary-hover);
820
- }
821
-
822
- .charcoal-button[data-variant='Primary']:active:not(:disabled):not([aria-disabled]),
823
- .charcoal-button[data-variant='Primary']:active[aria-disabled='false'],
824
- .charcoal-button[data-variant='Primary'][data-active='true'] {
825
- color: var(--charcoal-color-text-on-primary-press);
826
- background-color: var(--charcoal-color-container-primary-press);
827
- }
828
-
829
- .charcoal-button[data-variant='Overlay'] {
830
- color: var(--charcoal-color-text-on-on-img-default);
831
- background-color: var(--charcoal-color-container-on-img-default);
832
- }
833
-
834
- .charcoal-button[data-variant='Overlay']:hover:not(:disabled):not([aria-disabled]),
835
- .charcoal-button[data-variant='Overlay']:hover[aria-disabled='false'] {
836
- color: var(--charcoal-color-text-on-on-img-hover);
837
- background-color: var(--charcoal-color-container-on-img-hover);
838
- }
839
-
840
- .charcoal-button[data-variant='Overlay']:active:not(:disabled):not([aria-disabled]),
841
- .charcoal-button[data-variant='Overlay']:active[aria-disabled='false'],
842
- .charcoal-button[data-variant='Overlay'][data-active='true'] {
843
- color: var(--charcoal-color-text-on-on-img-press);
844
- background-color: var(--charcoal-color-container-on-img-press);
845
- }
846
-
847
- .charcoal-button[data-variant='Navigation'] {
848
- color: var(--charcoal-color-text-on-hud-default);
849
- background-color: var(--charcoal-color-container-hud-default);
850
- }
851
-
852
- .charcoal-button[data-variant='Navigation']:hover:not(:disabled):not([aria-disabled]),
853
- .charcoal-button[data-variant='Navigation']:hover[aria-disabled='false'] {
854
- color: var(--charcoal-color-text-on-hud-hover);
855
- background-color: var(--charcoal-color-container-hud-hover);
856
- }
857
-
858
- .charcoal-button[data-variant='Navigation']:active:not(:disabled):not([aria-disabled]),
859
- .charcoal-button[data-variant='Navigation']:active[aria-disabled='false'],
860
- .charcoal-button[data-variant='Navigation'][data-active='true'] {
861
- color: var(--charcoal-color-text-on-hud-press);
862
- background-color: var(--charcoal-color-container-hud-press);
863
- }
864
-
865
- .charcoal-button[data-variant='Danger'] {
866
- color: var(--charcoal-color-text-on-negative-default);
867
- background-color: var(--charcoal-color-container-negative-default);
868
- }
869
-
870
- .charcoal-button[data-variant='Danger']:hover:not(:disabled):not([aria-disabled]),
871
- .charcoal-button[data-variant='Danger']:hover[aria-disabled='false'] {
872
- color: var(--charcoal-color-text-on-negative-hover);
873
- background-color: var(--charcoal-color-container-negative-hover);
874
- }
875
-
876
- .charcoal-button[data-variant='Danger']:active:not(:disabled):not([aria-disabled]),
877
- .charcoal-button[data-variant='Danger']:active[aria-disabled='false'],
878
- .charcoal-button[data-variant='Danger'][data-active='true'] {
879
- color: var(--charcoal-color-text-on-negative-press);
880
- background-color: var(--charcoal-color-container-negative-press);
881
- }
1084
+ .charcoal-tag-item {
1085
+ --charcoal-tag-item-color: var(--charcoal-color-text-on-primary-default);
1086
+ --charcoal-tag-item-size: 40px;
1087
+ --charcoal-tag-item-padding-left: 24px;
1088
+ --charcoal-tag-item-padding-right: 24px;
1089
+ --charcoal-tag-item-bg: ;
882
1090
 
883
- .charcoal-button[data-size='S'] {
884
- padding: 0 16px;
885
- height: 32px;
886
- }
1091
+ isolation: isolate;
1092
+ position: relative;
887
1093
 
888
- .charcoal-button[data-full-width='true'] {
889
- width: 100%;
890
- }
891
- .charcoal-icon-button {
892
- cursor: pointer;
893
1094
  -webkit-appearance: none;
1095
+
894
1096
  -moz-appearance: none;
1097
+
895
1098
  appearance: none;
896
- background: transparent;
897
- padding: 0;
898
- border-style: none;
899
1099
  outline: none;
900
- color: inherit;
901
- text-rendering: inherit;
902
- letter-spacing: inherit;
903
- word-spacing: inherit;
904
- text-decoration: none;
905
- font: inherit;
906
- margin: 0;
907
- overflow: visible;
908
- text-transform: none;
909
-
910
- -webkit-user-select: none;
911
-
912
- -moz-user-select: none;
1100
+ border-style: none;
913
1101
 
914
- user-select: none;
915
- display: flex;
1102
+ display: inline-flex;
1103
+ gap: 8px;
916
1104
  align-items: center;
917
1105
  justify-content: center;
918
- border-radius: 999999px;
919
- transition:
920
- 0.2s background-color,
921
- 0.2s box-shadow;
922
- }
923
-
924
- .charcoal-icon-button:disabled,
925
- .charcoal-icon-button[aria-disabled]:not([aria-disabled='false']) {
926
- cursor: default;
927
- opacity: 0.32;
928
- }
929
-
930
- .charcoal-icon-button:focus {
931
- outline: none;
932
- }
933
-
934
- .charcoal-icon-button::-moz-focus-inner {
935
- border-style: none;
936
- padding: 0;
937
- }
938
1106
 
939
- .charcoal-icon-button[data-size='XS'] {
940
- width: 20px;
941
- height: 20px;
942
- }
1107
+ text-decoration: none;
1108
+ cursor: pointer;
1109
+ overflow: hidden;
943
1110
 
944
- .charcoal-icon-button[data-size='S'] {
945
- width: 32px;
946
- height: 32px;
947
- }
1111
+ color: var(--charcoal-tag-item-color);
1112
+ height: var(--charcoal-tag-item-size);
1113
+ padding-top: 4px;
1114
+ padding-bottom: 4px;
1115
+ padding-left: var(--charcoal-tag-item-padding-left);
1116
+ padding-right: var(--charcoal-tag-item-padding-right);
1117
+ box-sizing: border-box;
1118
+ border-radius: 4px;
948
1119
 
949
- .charcoal-icon-button[data-size='M'] {
950
- width: 40px;
951
- height: 40px;
952
- }
1120
+ transition: 0.2s box-shadow;
1121
+ }
953
1122
 
954
- .charcoal-icon-button[data-variant='Default'] {
955
- color: var(--charcoal-color-icon-tertiary-default);
956
- background-color: transparent;
1123
+ .charcoal-tag-item[data-size='M'] {
1124
+ --charcoal-tag-item-size: 40px;
1125
+ --charcoal-tag-item-padding-left: 24px;
1126
+ --charcoal-tag-item-padding-right: 24px;
957
1127
  }
958
1128
 
959
- .charcoal-icon-button[data-variant='Default'][data-active='true']:not(:disabled):not([aria-disabled]),
960
- .charcoal-icon-button[data-variant='Default'][data-active='true'][aria-disabled='false'] {
961
- color: var(--charcoal-color-icon-tertiary-press);
962
- background-color: var(--charcoal-color-container-press-a);
963
- }
964
-
965
- .charcoal-icon-button[data-variant='Default'][data-active='false']:not(:disabled):not([aria-disabled]):hover,
966
- .charcoal-icon-button[data-variant='Default'][data-active='false'][aria-disabled='false']:hover {
967
- color: var(--charcoal-color-icon-tertiary-hover);
968
- background-color: var(--charcoal-color-container-hover-a);
969
- }
970
-
971
- .charcoal-icon-button[data-variant='Default'][data-active='false']:not(:disabled):not([aria-disabled]):active,
972
- .charcoal-icon-button[data-variant='Default'][data-active='false'][aria-disabled='false']:active {
973
- color: var(--charcoal-color-icon-tertiary-press);
974
- background-color: var(--charcoal-color-container-press-a);
975
- }
976
-
977
- .charcoal-icon-button[data-variant='Overlay'] {
978
- color: var(--charcoal-color-icon-on-on-img-default);
979
- background-color: var(--charcoal-color-container-on-img-default);
1129
+ .charcoal-tag-item[data-size='S'] {
1130
+ --charcoal-tag-item-size: 32px;
1131
+ --charcoal-tag-item-padding-left: 16px;
1132
+ --charcoal-tag-item-padding-right: 16px;
980
1133
  }
981
1134
 
982
- .charcoal-icon-button[data-variant='Overlay'][data-active='true']:not(:disabled):not([aria-disabled]),
983
- .charcoal-icon-button[data-variant='Overlay'][data-active='true'][aria-disabled='false'] {
984
- color: var(--charcoal-color-icon-on-on-img-press);
985
- background-color: var(--charcoal-color-container-on-img-press);
986
- }
1135
+ .charcoal-tag-item[data-state='inactive'] {
1136
+ --charcoal-tag-item-color: var(--charcoal-color-text-secondary-default);
1137
+ }
987
1138
 
988
- .charcoal-icon-button[data-variant='Overlay'][data-active='false']:not(:disabled):not([aria-disabled]):hover,
989
- .charcoal-icon-button[data-variant='Overlay'][data-active='false'][aria-disabled='false']:hover {
990
- color: var(--charcoal-color-icon-on-on-img-hover);
991
- background-color: var(--charcoal-color-container-on-img-hover);
992
- }
1139
+ .charcoal-tag-item[data-state='active'] {
1140
+ --charcoal-tag-item-padding-left: 16px;
1141
+ --charcoal-tag-item-padding-right: 8px;
1142
+ }
993
1143
 
994
- .charcoal-icon-button[data-variant='Overlay'][data-active='false']:not(:disabled):not([aria-disabled]):active,
995
- .charcoal-icon-button[data-variant='Overlay'][data-active='false'][aria-disabled='false']:active {
996
- color: var(--charcoal-color-icon-on-on-img-press);
997
- background-color: var(--charcoal-color-container-on-img-press);
998
- }
1144
+ .charcoal-tag-item:disabled,
1145
+ .charcoal-tag-item[aria-disabled]:not([aria-disabled='false']) {
1146
+ opacity: 0.32;
1147
+ cursor: default;
1148
+ }
999
1149
 
1000
- .charcoal-icon-button:not(:disabled):not([aria-disabled]):focus,
1001
- .charcoal-icon-button[aria-disabled='false']:focus {
1150
+ .charcoal-tag-item:not(:disabled):not([aria-disabled]):focus-visible,
1151
+ .charcoal-tag-item[aria-disabled='false']:focus-visible {
1002
1152
  outline: none;
1003
1153
  box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1004
1154
  }
1005
1155
 
1006
- .charcoal-icon-button:not(:disabled):not([aria-disabled]):focus-visible,
1007
- .charcoal-icon-button[aria-disabled='false']:focus-visible {
1156
+ .charcoal-tag-item:not(:disabled):not([aria-disabled]):focus,
1157
+ .charcoal-tag-item[aria-disabled='false']:focus {
1158
+ outline: none;
1008
1159
  box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1009
1160
  }
1010
1161
 
1011
- .charcoal-icon-button:not(:disabled):not([aria-disabled]):focus:not(:focus-visible),
1012
- .charcoal-icon-button[aria-disabled='false']:focus:not(:focus-visible) {
1162
+ .charcoal-tag-item:not(:disabled):not([aria-disabled]):focus:not(:focus-visible),
1163
+ .charcoal-tag-item[aria-disabled='false']:focus:not(:focus-visible) {
1013
1164
  box-shadow: none;
1014
1165
  }
1015
- .charcoal-radio__label {
1016
- display: grid;
1017
- grid-template-columns: auto 1fr;
1018
- grid-gap: 4px;
1019
- align-items: center;
1020
- cursor: pointer;
1166
+
1167
+ .charcoal-tag-item__bg {
1168
+ background-color: var(--charcoal-tag-item-bg);
1021
1169
  }
1022
1170
 
1023
- .charcoal-radio__label[aria-disabled]:not([aria-disabled='false']) {
1024
- opacity: 0.32;
1025
- cursor: default;
1171
+ .charcoal-tag-item__bg[data-bg-variant='image'] {
1172
+ background-color: var(--charcoal-color-container-on-img-default);
1026
1173
  }
1027
1174
 
1028
- .charcoal-radio__label_div {
1029
- font-size: 14px;
1030
- line-height: 22px;
1031
- color: var(--charcoal-color-text-default);
1175
+ .charcoal-tag-item__bg[data-bg-variant='image']::before {
1176
+ content: '';
1177
+ position: absolute;
1178
+ z-index: 1;
1179
+ top: 0;
1180
+ left: 0;
1181
+ width: 100%;
1182
+ height: 100%;
1183
+ background-position: center;
1184
+ background-size: cover;
1185
+ background-image: var(--charcoal-tag-item-bg);
1186
+ mix-blend-mode: overlay;
1187
+ }
1188
+
1189
+ .charcoal-tag-item__bg[data-state='inactive'] {
1190
+ background-color: var(--charcoal-color-container-secondary-default);
1191
+ }
1192
+
1193
+ .charcoal-tag-item__label {
1194
+ height: 100%;
1195
+ display: flex;
1196
+ flex-direction: column;
1197
+ align-items: center;
1198
+ justify-content: center;
1032
1199
  }
1033
- .charcoal-radio-group {
1034
- display: grid;
1035
- grid-template-columns: 1fr;
1036
- grid-gap: 8px;
1200
+
1201
+ .charcoal-tag-item__label[data-has-translate='true'] {
1202
+ justify-content: space-between;
1203
+ }
1204
+
1205
+ .charcoal-tag-item__label__translated {
1206
+ --charcoal-tag-item-text-font-size: 12px;
1207
+ --charcoal-tag-item-text-line-height: 20px;
1208
+ font-weight: bold;
1037
1209
  }
1038
- .charcoal-switch__label {
1039
- display: inline-grid;
1040
- grid-template-columns: auto 1fr;
1041
- align-items: center;
1042
- cursor: pointer;
1043
- outline: 0;
1044
- gap: 4px;
1210
+
1211
+ .charcoal-tag-item__label__translated::before {
1212
+ display: none;
1213
+ }
1214
+
1215
+ .charcoal-tag-item__label__text {
1216
+ --charcoal-tag-item-text-font-size: 14px;
1217
+ --charcoal-tag-item-text-line-height: 22px;
1218
+
1219
+ max-width: 152px;
1220
+ overflow: hidden;
1221
+ font-weight: bold;
1222
+
1223
+ color: inherit;
1224
+ white-space: nowrap;
1225
+ text-overflow: ellipsis;
1045
1226
  }
1046
1227
 
1047
- .charcoal-switch__label[aria-disabled='true'] {
1048
- opacity: 0.32;
1049
- cursor: default;
1228
+ .charcoal-tag-item__label__text[data-has-translate='true'] {
1229
+ --charcoal-tag-item-text-font-size: 10px;
1230
+ --charcoal-tag-item-text-line-height: 14px;
1231
+ font-weight: normal;
1050
1232
  }
1051
1233
 
1052
- .charcoal-switch__label[aria-disabled='true'] > input {
1053
- opacity: 1;
1054
- }
1234
+ /* Kept flat: different class name from .charcoal-tag-item__label__text (note: "labe" typo in original) */
1235
+ .charcoal-tag-item__labe__text[data-has-translate='true']::after {
1236
+ display: none;
1237
+ }
1238
+ .charcoal-menu-item-group {
1239
+ display: block;
1240
+ }
1055
1241
 
1056
- .charcoal-switch__label_div {
1057
- font-size: 14px;
1058
- line-height: 22px;
1059
- color: var(--charcoal-color-text-default);
1242
+ .charcoal-menu-item-group > span {
1243
+ display: block;
1244
+ color: var(--charcoal-color-text-tertiary-default);
1245
+ font-size: 12px;
1246
+ font-weight: bold;
1247
+ padding: 12px 0 8px 16px;
1060
1248
  }
1061
- .charcoal-multi-select {
1249
+
1250
+ .charcoal-menu-item-group > ul {
1251
+ padding-left: 0;
1252
+ margin: 0;
1253
+ box-sizing: border-box;
1254
+ list-style: none;
1255
+ overflow: hidden;
1256
+ }
1257
+ .charcoal-notification-region {
1258
+ position: fixed;
1259
+ left: 0;
1260
+ right: 0;
1062
1261
  display: grid;
1063
- grid-template-columns: auto 1fr;
1064
- align-items: center;
1065
- position: relative;
1066
- cursor: pointer;
1067
- gap: 4px;
1262
+ justify-content: center;
1263
+ pointer-events: none;
1264
+ box-sizing: border-box;
1068
1265
  }
1069
1266
 
1070
- .charcoal-multi-select:disabled,
1071
- .charcoal-multi-select[aria-disabled]:not([aria-disabled='false']) {
1072
- opacity: 0.32;
1073
- cursor: default;
1074
- }
1267
+ .charcoal-notification {
1268
+ box-sizing: border-box;
1269
+ border-radius: var(--charcoal-radius-oval);
1270
+ width: -moz-fit-content;
1271
+ width: fit-content;
1272
+ max-width: calc(100vw - var(--charcoal-space-46));
1273
+ display: flex;
1274
+ align-items: center;
1275
+ justify-content: center;
1276
+ gap: var(--charcoal-space-20);
1277
+ pointer-events: auto;
1278
+ }
1075
1279
 
1076
- .charcoal-multi-select-label {
1077
- display: flow-root;
1280
+ .charcoal-notification-content {
1281
+ display: flex;
1078
1282
  align-items: center;
1079
- font-size: 14px;
1080
- line-height: 22px;
1081
- color: var(--charcoal-color-text-default);
1283
+ min-width: 0;
1082
1284
  }
1083
1285
 
1084
- .charcoal-multi-select-label::before {
1085
- display: block;
1086
- width: 0;
1087
- height: 0;
1088
- content: '';
1089
- margin-top: -4px;
1286
+ .charcoal-notification-label {
1287
+ min-width: 0;
1288
+ overflow: hidden;
1289
+ overflow-wrap: break-word;
1290
+ display: -webkit-box;
1291
+ -webkit-box-orient: vertical;
1292
+ -webkit-line-clamp: 2;
1293
+ font-size: var(--charcoal-text-font-size-caption-m);
1294
+ font-weight: var(--charcoal-text-font-weight-bold);
1295
+ line-height: var(--charcoal-text-line-height-caption-m);
1296
+ }
1297
+
1298
+ @media (prefers-reduced-motion: reduce) {
1299
+ .charcoal-notification,
1300
+ .charcoal-notification[data-exiting='true'] {
1301
+ animation: none;
1090
1302
  }
1303
+ }
1304
+ .charcoal-snackbar-region {
1305
+ --charcoal-snackbar-offset: 16px;
1306
+ }
1091
1307
 
1092
- .charcoal-multi-select-label::after {
1093
- display: block;
1094
- width: 0;
1095
- height: 0;
1096
- content: '';
1097
- margin-bottom: -4px;
1308
+ .charcoal-snackbar-region[data-position='top'] {
1309
+ --charcoal-snackbar-enter-offset: calc(-1 * var(--charcoal-space-30));
1310
+
1311
+ top: calc(
1312
+ env(safe-area-inset-top, 0px) + max(var(--charcoal-snackbar-offset), 16px)
1313
+ );
1098
1314
  }
1099
1315
 
1100
- .charcoal-multi-select-input[type='checkbox'] {
1101
- -webkit-appearance: none;
1102
- -moz-appearance: none;
1103
- appearance: none;
1104
- display: block;
1105
- width: 20px;
1106
- height: 20px;
1107
- margin: 0;
1108
- background-color: var(--charcoal-color-container-neutral-default);
1109
- border-radius: 999999px;
1110
- transition:
1111
- 0.2s background-color,
1112
- 0.2s box-shadow;
1113
- }
1316
+ .charcoal-snackbar-region[data-position='bottom'] {
1317
+ --charcoal-snackbar-enter-offset: var(--charcoal-space-30);
1114
1318
 
1115
- .charcoal-multi-select-input[type='checkbox']:checked {
1116
- background-color: var(--charcoal-color-container-primary-default);
1319
+ bottom: calc(
1320
+ env(safe-area-inset-bottom, 0px) +
1321
+ max(var(--charcoal-snackbar-offset), 16px)
1322
+ );
1117
1323
  }
1118
1324
 
1119
- .charcoal-multi-select-input[type='checkbox']:focus {
1120
- outline: none;
1121
- box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1325
+ .charcoal-snackbar {
1326
+ min-height: 44px;
1327
+ padding: var(--charcoal-space-25) var(--charcoal-space-40);
1328
+ background-color: var(--charcoal-color-container-default);
1329
+ color: var(--charcoal-color-text-default);
1330
+ border: var(--charcoal-border-width-m) solid
1331
+ var(--charcoal-color-border-secondary);
1332
+ animation: charcoal-snackbar-enter 0.3s ease-out both;
1333
+ }
1334
+
1335
+ .charcoal-snackbar[data-exiting='true'] {
1336
+ animation: charcoal-snackbar-exit 0.3s ease-out both;
1122
1337
  }
1123
1338
 
1124
- .charcoal-multi-select-input[type='checkbox']:focus-visible {
1125
- box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1339
+ .charcoal-snackbar[data-with-action='true'] {
1340
+ min-height: 56px;
1341
+ padding: var(--charcoal-space-25) var(--charcoal-space-30)
1342
+ var(--charcoal-space-25) var(--charcoal-space-40);
1126
1343
  }
1127
1344
 
1128
- .charcoal-multi-select-input[type='checkbox']:focus:not(:focus-visible) {
1129
- box-shadow: none;
1345
+ .charcoal-snackbar[data-dim='true'] {
1346
+ background-color: var(--charcoal-color-container-hud-default);
1347
+ color: var(--charcoal-color-text-on-hud-default);
1348
+ border-color: var(--charcoal-color-border-hud);
1130
1349
  }
1131
1350
 
1132
- .charcoal-multi-select-input[type='checkbox']:hover:not(:disabled):not([aria-disabled]),
1133
- .charcoal-multi-select-input[type='checkbox']:hover[aria-disabled='false'] {
1134
- background-color: var(--charcoal-color-container-neutral-hover);
1351
+ @keyframes charcoal-snackbar-enter {
1352
+ from {
1353
+ opacity: 0;
1354
+ transform: translateY(var(--charcoal-snackbar-enter-offset));
1135
1355
  }
1136
1356
 
1137
- .charcoal-multi-select-input[type='checkbox']:active:not(:disabled):not([aria-disabled]),
1138
- .charcoal-multi-select-input[type='checkbox']:active[aria-disabled='false'] {
1139
- background-color: var(--charcoal-color-container-neutral-press);
1357
+ to {
1358
+ opacity: 1;
1359
+ transform: translateY(0);
1140
1360
  }
1361
+ }
1141
1362
 
1142
- .charcoal-multi-select-input[type='checkbox']:checked:hover:not(:disabled):not([aria-disabled]),
1143
- .charcoal-multi-select-input[type='checkbox']:checked:hover[aria-disabled='false'] {
1144
- background-color: var(--charcoal-color-container-primary-hover);
1363
+ @keyframes charcoal-snackbar-exit {
1364
+ from {
1365
+ opacity: 1;
1145
1366
  }
1146
1367
 
1147
- .charcoal-multi-select-input[type='checkbox']:checked:active:not(:disabled):not([aria-disabled]),
1148
- .charcoal-multi-select-input[type='checkbox']:checked:active[aria-disabled='false'] {
1149
- background-color: var(--charcoal-color-container-primary-press);
1368
+ to {
1369
+ opacity: 0;
1150
1370
  }
1371
+ }
1372
+ .charcoal-hint-text {
1373
+ background-color: var(--charcoal-color-container-secondary-default);
1374
+ border-radius: 8px;
1375
+ padding: 12px 16px;
1376
+ display: flex;
1377
+ align-items: flex-start;
1378
+ }
1151
1379
 
1152
- .charcoal-multi-select-input[type='checkbox'][aria-invalid='true'][data-overlay='false']:not(:disabled):not(
1153
- [aria-disabled]
1154
- ) {
1155
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
1380
+ .charcoal-hint-text[data-context='page'] {
1381
+ justify-content: center;
1156
1382
  }
1157
1383
 
1158
- .charcoal-multi-select-input[type='checkbox'][aria-invalid='true'][data-overlay='false'][aria-disabled='false'] {
1159
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
1160
- }
1384
+ @media (min-width: 744px) {
1161
1385
 
1162
- .charcoal-multi-select-input[type='checkbox'][data-overlay='true'] {
1163
- background-color: var(--charcoal-color-container-on-img-default);
1386
+ .charcoal-hint-text[data-context='page'] {
1387
+ padding: 20px 40px
1164
1388
  }
1389
+ }
1165
1390
 
1166
- .charcoal-multi-select-overlay {
1167
- position: absolute;
1168
- top: -2px;
1169
- left: -2px;
1170
- box-sizing: border-box;
1391
+ .charcoal-hint-text-icon {
1171
1392
  display: flex;
1172
1393
  align-items: center;
1173
- justify-content: center;
1174
- width: 24px;
1175
- height: 24px;
1176
- border-radius: 999999px;
1177
- color: var(--charcoal-color-icon-on-primary-default);
1178
- transition: 0.2s box-shadow;
1394
+ color: var(--charcoal-color-icon-tertiary-default);
1395
+ height: 22px;
1396
+ margin: 0 4px 0 0;
1179
1397
  }
1180
1398
 
1181
- .charcoal-multi-select-overlay[aria-invalid='true'][data-overlay='true']:not(:disabled):not(
1182
- [aria-disabled]
1183
- ) {
1184
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
1185
- }
1399
+ .charcoal-hint-text-message {
1400
+ color: var(--charcoal-color-text-secondary-default);
1401
+ font-size: 14px;
1402
+ line-height: 22px;
1403
+ display: flow-root;
1404
+ margin: 0;
1405
+ min-width: 0;
1406
+ overflow-wrap: break-word;
1407
+ }
1408
+ .charcoal-toast-region {
1409
+ --charcoal-toast-offset: 16px;
1410
+ }
1186
1411
 
1187
- .charcoal-multi-select-overlay[aria-invalid='true'][data-overlay='true'][aria-disabled='false'] {
1188
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
1189
- }
1412
+ .charcoal-toast-region[data-position='top'] {
1413
+ --charcoal-toast-enter-offset: calc(-1 * var(--charcoal-space-30));
1190
1414
 
1191
- .charcoal-multi-select-overlay[data-overlay='true'] {
1192
- border-color: var(--charcoal-color-border-hud);
1193
- border-width: 2px;
1194
- border-style: solid;
1415
+ top: calc(
1416
+ env(safe-area-inset-top, 0px) + max(var(--charcoal-toast-offset), 16px)
1417
+ );
1195
1418
  }
1196
- .charcoal-clickable {
1197
- cursor: pointer;
1198
1419
 
1199
- /* Reset button appearance */
1200
- -webkit-appearance: none;
1201
- -moz-appearance: none;
1202
- appearance: none;
1203
- background: transparent;
1204
- padding: 0;
1205
- border-style: none;
1206
- outline: none;
1207
- color: inherit;
1208
- text-rendering: inherit;
1209
- letter-spacing: inherit;
1210
- word-spacing: inherit;
1211
- text-decoration: none;
1420
+ .charcoal-toast-region[data-position='bottom'] {
1421
+ --charcoal-toast-enter-offset: var(--charcoal-space-30);
1212
1422
 
1213
- /* Change the font styles in all browsers. */
1214
- font: inherit;
1423
+ bottom: calc(
1424
+ env(safe-area-inset-bottom, 0px) + max(var(--charcoal-toast-offset), 16px)
1425
+ );
1426
+ }
1215
1427
 
1216
- /* Remove the margin in Firefox and Safari. */
1217
- margin: 0;
1428
+ .charcoal-toast {
1429
+ min-height: 40px;
1430
+ padding: var(--charcoal-space-20) var(--charcoal-space-40);
1431
+ color: var(--charcoal-color-text-on-positive-default);
1432
+ border: var(--charcoal-border-width-m) solid var(--charcoal-color-border-hud);
1433
+ animation: charcoal-toast-enter 0.3s ease-out both;
1434
+ }
1218
1435
 
1219
- /* Show the overflow in Edge. */
1220
- overflow: visible;
1436
+ .charcoal-toast[data-exiting='true'] {
1437
+ animation: charcoal-toast-exit 0.3s ease-out both;
1438
+ }
1221
1439
 
1222
- /* Remove the inheritance of text transform in Firefox. */
1223
- text-transform: none;
1224
- }
1440
+ .charcoal-toast[data-type='success'] {
1441
+ background-color: var(--charcoal-color-container-positive-default);
1442
+ }
1225
1443
 
1226
- .charcoal-clickable:disabled,
1227
- .charcoal-clickable[aria-disabled]:not([aria-disabled='false']) {
1228
- cursor: default;
1444
+ .charcoal-toast[data-type='error'] {
1445
+ background-color: var(--charcoal-color-container-negative-default);
1229
1446
  }
1230
1447
 
1231
- .charcoal-clickable:focus {
1232
- outline: none;
1448
+ @keyframes charcoal-toast-enter {
1449
+ from {
1450
+ opacity: 0;
1451
+ transform: translateY(var(--charcoal-toast-enter-offset));
1233
1452
  }
1234
1453
 
1235
- .charcoal-clickable::-moz-focus-inner {
1236
- border-style: none;
1237
- padding: 0;
1454
+ to {
1455
+ opacity: 1;
1456
+ transform: translateY(0);
1238
1457
  }
1239
- .charcoal-text-field-root {
1240
- display: grid;
1241
- grid-template-columns: 1fr;
1242
- grid-gap: 4px;
1243
1458
  }
1244
1459
 
1245
- .charcoal-text-field-root[aria-disabled='true'] {
1246
- opacity: 0.32;
1460
+ @keyframes charcoal-toast-exit {
1461
+ from {
1462
+ opacity: 1;
1247
1463
  }
1248
1464
 
1249
- .charcoal-text-field-container {
1250
- display: flex;
1251
- height: 40px;
1252
- transition:
1253
- 0.2s background-color,
1254
- 0.2s box-shadow;
1255
- color: var(--charcoal-color-text-secondary-default);
1256
- background-color: var(--charcoal-color-container-secondary-default-a);
1257
- border-radius: 4px;
1258
- padding: 0 8px;
1259
- line-height: 22px;
1260
- font-size: 14px;
1465
+ to {
1466
+ opacity: 0;
1467
+ }
1261
1468
  }
1469
+ .charcoal-carousel {
1470
+ --charcoal-carousel-gap: 0px;
1262
1471
 
1263
- .charcoal-text-field-container[data-invalid='true'] {
1264
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
1265
- }
1472
+ position: relative;
1473
+ display: block;
1474
+ }
1266
1475
 
1267
- .charcoal-text-field-container:not([aria-disabled='true']):hover {
1268
- background-color: var(--charcoal-color-container-secondary-hover-a);
1476
+ .charcoal-carousel[data-full-width='true'] {
1477
+ width: 100vw;
1478
+ margin-inline: calc(50% - 50vw);
1269
1479
  }
1270
1480
 
1271
- .charcoal-text-field-container:not([aria-disabled='true']):focus-within {
1272
- outline: none;
1481
+ .charcoal-carousel__viewport {
1482
+ position: relative;
1483
+ }
1484
+
1485
+ /* フォーカスリングは scroller ではなく viewport に描く。scroller に置くと
1486
+ hasGradient の mask(mask-clip: border-box)で外側の box-shadow ごと消えるため。 */
1487
+
1488
+ .charcoal-carousel__viewport[data-focus-visible] {
1273
1489
  box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1274
1490
  }
1275
1491
 
1276
- .charcoal-text-field-container:not([aria-disabled='true'])[data-invalid='true']:focus-within {
1277
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
1492
+ /* スライド間隔は gap prop(--charcoal-carousel-gap)で注入する。
1493
+ スライド寸法は sandbox 同様、利用者が children 側で持つ。 */
1494
+ .charcoal-carousel__scroller {
1495
+ position: relative;
1496
+ display: flex;
1497
+ gap: var(--charcoal-carousel-gap);
1498
+ overflow-x: auto;
1499
+ overflow-y: hidden;
1500
+ overscroll-behavior-x: contain;
1501
+ scroll-behavior: smooth;
1502
+ scrollbar-width: none;
1503
+ outline: none;
1504
+ }
1505
+ .charcoal-carousel__scroller::-webkit-scrollbar {
1506
+ display: none;
1278
1507
  }
1279
1508
 
1280
- .charcoal-text-field-prefix {
1281
- display: flex;
1282
- align-items: center;
1283
- margin-right: 4px;
1509
+ /* スクロールスナップ type は prop(scrollSnap.type)で scroller に出し分ける。
1510
+ align は基底 .charcoal-carousel__item の後(後述)に置く(no-descending-specificity 回避)。
1511
+ 未指定時の既定(M=none / S=mandatory / align=center)は JS 側で data 属性に解決する。 */
1512
+ .charcoal-carousel[data-scroll-snap-type='none'] .charcoal-carousel__scroller {
1513
+ scroll-snap-type: none;
1284
1514
  }
1285
1515
 
1286
- .charcoal-text-field-suffix {
1287
- display: flex;
1288
- align-items: center;
1289
- gap: 8px;
1290
- margin-left: 4px;
1516
+ .charcoal-carousel[data-scroll-snap-type='proximity']
1517
+ .charcoal-carousel__scroller {
1518
+ scroll-snap-type: x proximity;
1291
1519
  }
1292
1520
 
1293
- .charcoal-text-field-input-root {
1294
- flex: 1;
1295
- min-width: 0;
1296
- overflow: hidden;
1521
+ .charcoal-carousel[data-scroll-snap-type='mandatory']
1522
+ .charcoal-carousel__scroller {
1523
+ scroll-snap-type: x mandatory;
1524
+ }
1525
+
1526
+ /* グラデーション: mask で端のアイテム自体を透明へフェードさせる(下の背景色を
1527
+ 問わない)。mask の色はアルファとしてだけ効く(#000=表示 / transparent=透過)。
1528
+ 左フェード・右フェードの 2 レイヤーを intersect で合成し、はみ出して
1529
+ スクロール可能な側のみ data-can-prev/next で 72px のフェード帯を枠内に置く。
1530
+ 無効な側はフェード帯ごと枠外へスライドして隠す(mask-image と違い
1531
+ mask-position は補間可能なので、切替が 0.2s のフェードになる)。 */
1532
+ .charcoal-carousel[data-has-gradient='true'] .charcoal-carousel__scroller {
1533
+ -webkit-mask-image:
1534
+ linear-gradient(to right, transparent, #000 72px),
1535
+ linear-gradient(to left, transparent, #000 72px);
1536
+ mask-image:
1537
+ linear-gradient(to right, transparent, #000 72px),
1538
+ linear-gradient(to left, transparent, #000 72px);
1539
+ /* 枠外へ 72px スライドしても反対側の端が欠けないよう、レイヤー幅に 72px 足す */
1540
+ -webkit-mask-size: calc(100% + 72px) 100%;
1541
+ mask-size: calc(100% + 72px) 100%;
1542
+ -webkit-mask-repeat: no-repeat;
1543
+ mask-repeat: no-repeat;
1544
+ -webkit-mask-composite: source-in, xor;
1545
+ mask-composite: intersect;
1546
+ -webkit-mask-position:
1547
+ -72px 0,
1548
+ 0 0;
1549
+ mask-position:
1550
+ -72px 0,
1551
+ 0 0;
1552
+ /* 0.2s ease-in は react-sandbox の LeftGradient と同じ値 */
1553
+ transition: 0.2s ease-in mask-position;
1554
+ }
1555
+
1556
+ .charcoal-carousel[data-has-gradient='true'][data-can-prev='true']
1557
+ .charcoal-carousel__scroller {
1558
+ -webkit-mask-position:
1559
+ 0 0,
1560
+ 0 0;
1561
+ mask-position:
1562
+ 0 0,
1563
+ 0 0;
1564
+ }
1565
+
1566
+ .charcoal-carousel[data-has-gradient='true'][data-can-next='true']
1567
+ .charcoal-carousel__scroller {
1568
+ -webkit-mask-position:
1569
+ -72px 0,
1570
+ -72px 0;
1571
+ mask-position:
1572
+ -72px 0,
1573
+ -72px 0;
1574
+ }
1575
+
1576
+ .charcoal-carousel[data-has-gradient='true'][data-can-prev='true'][data-can-next='true']
1577
+ .charcoal-carousel__scroller {
1578
+ -webkit-mask-position:
1579
+ 0 0,
1580
+ -72px 0;
1581
+ mask-position:
1582
+ 0 0,
1583
+ -72px 0;
1297
1584
  }
1298
1585
 
1299
- .charcoal-text-field-input {
1300
- border: none;
1301
- box-sizing: border-box;
1302
- outline: none;
1303
- font-family: inherit;
1304
-
1305
- /* Prevent zooming for iOS Safari */
1306
- transform-origin: top left;
1307
- transform: scale(0.875);
1308
- width: calc(100% / 0.875);
1309
- height: calc(100% / 0.875);
1310
- font-size: calc(14px / 0.875);
1311
- line-height: calc(22px / 0.875);
1312
- padding-left: 0;
1313
- padding-right: 0;
1314
- border-radius: calc(4px / 0.875);
1586
+ .charcoal-carousel__item {
1587
+ flex: 0 0 auto;
1588
+ min-width: 0;
1589
+ }
1315
1590
 
1316
- /* Display box-shadow for iOS Safari */
1317
- -webkit-appearance: none;
1318
- -moz-appearance: none;
1319
- appearance: none;
1320
- background: transparent;
1591
+ .charcoal-carousel[data-size='S'] .charcoal-carousel__item {
1592
+ flex: 0 0 100%;
1593
+ }
1321
1594
 
1322
- color: var(--charcoal-color-text-secondary-default);
1595
+ /* scroll-snap-align は prop(scrollSnap.align)で出し分ける。基底 .charcoal-carousel__item
1596
+ より後に置くことで no-descending-specificity を回避する。 */
1597
+ .charcoal-carousel[data-scroll-snap-align='center'] .charcoal-carousel__item {
1598
+ scroll-snap-align: center;
1323
1599
  }
1324
1600
 
1325
- .charcoal-text-field-input::-moz-placeholder {
1326
- color: var(--charcoal-color-text-placeholder-default);
1327
- }
1601
+ .charcoal-carousel[data-scroll-snap-align='start'] .charcoal-carousel__item {
1602
+ scroll-snap-align: start;
1603
+ }
1328
1604
 
1329
- .charcoal-text-field-input::placeholder {
1330
- color: var(--charcoal-color-text-placeholder-default);
1331
- }
1605
+ /* ── Navigation Buttons (charcoal IconButton, variant=Overlay size=S) ── */
1332
1606
 
1333
- .charcoal-text-field-line-counter {
1334
- line-height: 22px;
1335
- font-size: 14px;
1336
- color: var(--charcoal-color-text-tertiary-default);
1337
- }
1338
- .charcoal-text-area-root {
1607
+ /* マスクの透過域と同じ 72px 1fr 72px グリッド。各ボタンは 72px ゾーンの中央に置く。 */
1608
+ .charcoal-carousel__navigation {
1609
+ position: absolute;
1610
+ inset: 0;
1611
+ pointer-events: none;
1339
1612
  display: grid;
1340
- grid-template-columns: 1fr;
1341
- grid-gap: 4px;
1613
+ grid-template-columns: 72px 1fr 72px;
1614
+ align-items: center;
1615
+ /* アイテム内のコンテンツより上にボタンを表示する */
1616
+ z-index: 1;
1617
+ /* sandbox 同様、通常は隠してカルーセル hover 時にフェードイン表示する。 */
1618
+ opacity: 0;
1619
+ transition: 0.4s opacity;
1342
1620
  }
1343
-
1344
- .charcoal-text-area-root[aria-disabled='true'] {
1345
- opacity: 0.32;
1621
+ .charcoal-carousel__navigation[data-visible='false'] {
1622
+ display: none;
1346
1623
  }
1347
1624
 
1348
- .charcoal-text-area-container {
1349
- /* Runtime variable overridden by the React component. */
1350
- --charcoal-text-area-rows: 4;
1351
-
1352
- position: relative;
1353
- overflow: hidden;
1625
+ /* hover で表示。キーボード操作でも到達できるよう、キーボード由来のフォーカスが
1626
+ カルーセル内にある間も表示する(:focus-within だとクリックで残ったフォーカスでも
1627
+ 表示され続けるため、react-aria が付与する data 属性で判定する)。 */
1628
+ .charcoal-carousel:hover .charcoal-carousel__navigation,
1629
+ .charcoal-carousel[data-focus-visible-within] .charcoal-carousel__navigation {
1630
+ opacity: 1;
1631
+ }
1354
1632
 
1355
- color: var(--charcoal-color-text-secondary-default);
1356
- background-color: var(--charcoal-color-container-secondary-default-a);
1357
- border-radius: 4px;
1358
- transition:
1359
- 0.2s background-color,
1360
- 0.2s box-shadow;
1361
- height: calc(22px * var(--charcoal-text-area-rows) + 18px);
1633
+ .charcoal-carousel__navigation__item {
1634
+ pointer-events: auto;
1362
1635
  }
1363
1636
 
1364
- .charcoal-text-area-container[aria-invalid='true'] {
1365
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
1366
- }
1637
+ /* ヒットエリアをグリッド端列(= mask のフェード帯と同じ 72px)全体へ広げる。
1638
+ 擬似要素上のクリックは元の button に届くため、帯のどこを押してもページ送りになる。
1639
+ position: absolute の基準は positioned な .charcoal-carousel__navigation(inset: 0)。 */
1367
1640
 
1368
- .charcoal-text-area-container:focus-within {
1369
- outline: none;
1370
- box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1641
+ .charcoal-carousel__navigation__item::after {
1642
+ content: '';
1643
+ position: absolute;
1644
+ top: 0;
1645
+ bottom: 0;
1646
+ width: 72px;
1371
1647
  }
1372
1648
 
1373
- .charcoal-text-area-container:has([data-no-bottom-padding='true']) {
1374
- height: calc(22px * (var(--charcoal-text-area-rows) + 1) + 18px);
1649
+ .charcoal-carousel__navigation__item[data-direction='prev'] {
1650
+ grid-column: 1;
1651
+ justify-self: center;
1375
1652
  }
1376
1653
 
1377
- .charcoal-text-area-container:not([aria-disabled='true']):hover {
1378
- background-color: var(--charcoal-color-container-secondary-hover-a);
1654
+ .charcoal-carousel__navigation__item[data-direction='prev']::after {
1655
+ left: 0;
1656
+ }
1657
+
1658
+ .charcoal-carousel__navigation__item[data-direction='next'] {
1659
+ grid-column: 3;
1660
+ justify-self: center;
1379
1661
  }
1380
1662
 
1381
- .charcoal-text-area-container[aria-invalid='true']:focus-within {
1382
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
1663
+ .charcoal-carousel__navigation__item[data-direction='next']::after {
1664
+ right: 0;
1665
+ }
1666
+
1667
+ /* スクロール端では非表示。IconButton の disabled スタイル(opacity:0.32)より
1668
+ 高い詳細度で打ち消すため、ルートを前置する。 */
1669
+ .charcoal-carousel .charcoal-carousel__navigation__item[data-hidden='true'] {
1670
+ opacity: 0;
1671
+ pointer-events: none;
1672
+ }
1673
+
1674
+ /* タッチデバイスではナビゲーションボタンを出さず、スワイプ操作に委ねる。 */
1675
+ @media (hover: none) and (pointer: coarse) {
1676
+ .charcoal-carousel__navigation {
1677
+ display: none;
1383
1678
  }
1679
+ }
1384
1680
 
1385
- .charcoal-text-area-textarea {
1386
- border: none;
1387
- outline: none;
1388
- resize: none;
1389
- font-family: inherit;
1390
- color: inherit;
1391
- box-sizing: border-box;
1681
+ /* ── Indicator: JS Fallback ── */
1392
1682
 
1393
- /* Prevent zooming for iOS Safari */
1394
- --charcoal-textarea-safari-prevent-zoom-scale: 0.875;
1395
- --charcoal-textarea-line-height: calc(
1396
- 22px / var(--charcoal-textarea-safari-prevent-zoom-scale)
1397
- );
1398
- --charcoal-textarea-padding-y: calc(
1399
- 8px / var(--charcoal-textarea-safari-prevent-zoom-scale)
1400
- );
1401
- --charcoal-textarea-padding-x: calc(
1402
- 9px / var(--charcoal-textarea-safari-prevent-zoom-scale)
1403
- );
1683
+ .charcoal-carousel__indicator {
1684
+ display: flex;
1685
+ justify-content: center;
1686
+ align-items: center;
1687
+ height: 40px;
1688
+ gap: 8px;
1689
+ }
1404
1690
 
1405
- transform-origin: top left;
1406
- transform: scale(var(--charcoal-textarea-safari-prevent-zoom-scale));
1407
- width: calc(100% / var(--charcoal-textarea-safari-prevent-zoom-scale));
1408
- font-size: calc(14px / var(--charcoal-textarea-safari-prevent-zoom-scale));
1409
- line-height: var(--charcoal-textarea-line-height);
1410
- padding: var(--charcoal-textarea-padding-y) var(--charcoal-textarea-padding-x);
1411
- height: calc(
1412
- var(--charcoal-textarea-line-height) * var(--charcoal-text-area-rows) +
1413
- var(--charcoal-textarea-padding-y) * 2
1414
- );
1691
+ .charcoal-carousel__indicator[data-visible='false'] {
1692
+ display: none;
1693
+ }
1415
1694
 
1416
- /* Display box-shadow for iOS Safari */
1695
+ .charcoal-carousel__indicator__item {
1417
1696
  -webkit-appearance: none;
1418
1697
  -moz-appearance: none;
1419
1698
  appearance: none;
1420
-
1421
- background: none;
1699
+ box-sizing: border-box;
1700
+ width: 8px;
1701
+ height: 8px;
1702
+ padding: 0;
1703
+ border: 0;
1704
+ border-radius: 50%;
1705
+ background-color: var(--charcoal-color-text-tertiary-default);
1706
+ cursor: pointer;
1707
+ transition: 0.2s background-color;
1422
1708
  }
1423
1709
 
1424
- .charcoal-text-area-textarea[data-no-bottom-padding='true'] {
1425
- padding: var(--charcoal-textarea-padding-y)
1426
- var(--charcoal-textarea-padding-x) 0;
1427
- height: calc(
1428
- var(--charcoal-textarea-line-height) * var(--charcoal-text-area-rows) +
1429
- var(--charcoal-textarea-padding-y)
1430
- );
1431
- }
1432
-
1433
- .charcoal-text-area-textarea::-moz-placeholder {
1434
- color: var(--charcoal-color-text-placeholder-default);
1710
+ .charcoal-carousel__indicator__item:hover {
1711
+ background-color: var(--charcoal-color-text-secondary-default);
1435
1712
  }
1436
1713
 
1437
- .charcoal-text-area-textarea::placeholder {
1438
- color: var(--charcoal-color-text-placeholder-default);
1714
+ .charcoal-carousel__indicator__item:focus-visible {
1715
+ outline: 2px solid rgba(0, 150, 250, 0.56);
1716
+ outline-offset: 2px;
1439
1717
  }
1440
1718
 
1441
- .charcoal-text-area-counter {
1442
- position: absolute;
1443
- bottom: 9px;
1444
- right: 8px;
1445
-
1446
- line-height: 22px;
1447
- font-size: 14px;
1448
- color: var(--charcoal-color-text-tertiary-default);
1449
- }
1450
- .charcoal-dropdown-selector-root {
1451
- display: grid;
1452
- grid-template-columns: 1fr;
1453
- grid-gap: 4px;
1454
- width: 100%;
1455
- }
1456
-
1457
- .charcoal-dropdown-selector-root[aria-disabled='true'] {
1458
- cursor: default;
1459
- opacity: 0.32;
1719
+ .charcoal-carousel__indicator__item[data-active='true'] {
1720
+ background-color: var(--charcoal-color-text-default);
1460
1721
  }
1461
1722
 
1462
- .charcoal-dropdown-selector-button {
1463
- display: grid;
1464
- grid-template-columns: 1fr auto;
1465
- justify-content: space-between;
1466
- align-items: center;
1467
-
1468
- height: 40px;
1469
- width: 100%;
1470
- box-sizing: border-box;
1471
- border: none;
1472
- cursor: pointer;
1473
- gap: 4px;
1474
-
1475
- padding-right: 8px;
1476
- padding-left: 8px;
1477
- background-color: var(--charcoal-color-container-secondary-default-a);
1478
- border-radius: 4px;
1723
+ /* ── CSS Scroll Markers (progressive enhancement) ── */
1479
1724
 
1480
- transition:
1481
- 0.2s box-shadow,
1482
- 0.2s background-color;
1483
- }
1725
+ /* CSS Scroll Markers / Anchor Positioning は新しい仕様で、stylelint がプロパティ・
1726
+ 擬似要素・擬似クラスを未知と判定するため、この @supports ブロックでは該当ルールを無効化する。 */
1727
+ /* stylelint-disable property-no-unknown, selector-pseudo-element-no-unknown, selector-pseudo-class-no-unknown */
1728
+ @supports (scroll-marker-group: after) {
1729
+ .charcoal-carousel[data-indicator='true'] {
1730
+ padding-bottom: 40px;
1731
+ }
1484
1732
 
1485
- .charcoal-dropdown-selector-button:disabled {
1486
- cursor: default;
1733
+ .charcoal-carousel__scroller {
1734
+ anchor-name: --charcoal-carousel;
1735
+ scroll-marker-group: after;
1487
1736
  }
1488
1737
 
1489
- .charcoal-dropdown-selector-button:not(:disabled):focus {
1490
- outline: none;
1491
- box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1738
+ .charcoal-carousel__scroller::scroll-button(*) {
1739
+ content: none;
1492
1740
  }
1493
1741
 
1494
- .charcoal-dropdown-selector-button:not(:disabled):focus-visible {
1495
- box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1496
- }
1742
+ .charcoal-carousel__scroller::scroll-marker-group {
1743
+ display: flex;
1744
+ justify-content: center;
1745
+ align-items: center;
1746
+ height: 40px;
1747
+ gap: 8px;
1497
1748
 
1498
- .charcoal-dropdown-selector-button:not(:disabled)[data-active='true'],
1499
- .charcoal-dropdown-selector-button:not(:disabled):active {
1500
- background-color: var(--charcoal-color-container-secondary-press-a);
1749
+ position: absolute;
1750
+ position-anchor: --charcoal-carousel;
1751
+ top: anchor(bottom);
1752
+ justify-self: anchor-center;
1501
1753
  }
1502
1754
 
1503
- .charcoal-dropdown-selector-button:not(:disabled):hover {
1504
- background-color: var(--charcoal-color-container-secondary-hover-a);
1505
- }
1755
+ .charcoal-carousel[data-indicator='false'] .charcoal-carousel__scroller {
1756
+ scroll-marker-group: none;
1757
+ }
1506
1758
 
1507
- .charcoal-dropdown-selector-button:not(:disabled):focus:not(:focus-visible) {
1508
- box-shadow: none;
1759
+ .charcoal-carousel__item::scroll-marker {
1760
+ content: '';
1761
+ width: 8px;
1762
+ height: 8px;
1763
+ border: 0;
1764
+ border-radius: 50%;
1765
+ background-color: var(--charcoal-color-text-tertiary-default);
1766
+ cursor: pointer;
1767
+ transition: 0.2s background-color;
1768
+ }
1769
+
1770
+ .charcoal-carousel__item::scroll-marker:hover {
1771
+ background-color: var(--charcoal-color-text-secondary-default);
1509
1772
  }
1510
1773
 
1511
- .charcoal-dropdown-selector-button[aria-invalid='true'],
1512
- .charcoal-dropdown-selector-button:not(:disabled)[aria-invalid='true']:focus:not(:focus-visible) {
1513
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
1514
- }
1774
+ .charcoal-carousel__item::scroll-marker:focus {
1775
+ outline: 2px solid rgba(0, 150, 250, 0.56);
1776
+ outline-offset: 2px;
1777
+ }
1515
1778
 
1516
- .charcoal-ui-dropdown-selector-text {
1517
- text-align: left;
1518
- font-size: 14px;
1519
- line-height: 22px;
1520
- display: flow-root;
1521
- color: var(--charcoal-color-text-default);
1522
- overflow: hidden;
1523
- text-overflow: ellipsis;
1524
- white-space: nowrap;
1525
- }
1779
+ .charcoal-carousel__item::scroll-marker:target-current {
1780
+ background-color: var(--charcoal-color-text-default);
1781
+ }
1526
1782
 
1527
- .charcoal-ui-dropdown-selector-text[data-placeholder='true'] {
1528
- color: var(--charcoal-color-text-placeholder-default);
1783
+ .charcoal-carousel__indicator {
1784
+ display: none;
1529
1785
  }
1530
-
1531
- .charcoal-ui-dropdown-selector-icon {
1532
- color: var(--charcoal-color-icon-secondary-default);
1533
1786
  }
1787
+ /* stylelint-enable property-no-unknown, selector-pseudo-element-no-unknown, selector-pseudo-class-no-unknown */
1534
1788
  .charcoal-segmented-control {
1535
1789
  display: inline-flex;
1536
1790
  align-items: center;
@@ -1602,200 +1856,122 @@
1602
1856
  white-space: nowrap;
1603
1857
  opacity: 0;
1604
1858
  }
1605
- .charcoal-icon {
1606
- display: inline-flex;
1607
- width: var(--charcoal-icon-size);
1608
- height: var(--charcoal-icon-size);
1609
- }
1610
-
1611
- pixiv-icon:not(:defined) {
1612
- --pixiv-icon-base: 24px;
1613
- --pixiv-icon-scale: 1;
1614
- --pixiv-icon-size: calc(var(--pixiv-icon-base) * var(--pixiv-icon-scale));
1615
-
1616
- display: inline-flex;
1617
- /* --charcoal-icon-size がセットされていればそれを優先、
1618
- なければ name / scale から導出した --pixiv-icon-size をフォールバック */
1619
- width: var(--charcoal-icon-size, var(--pixiv-icon-size));
1620
- height: var(--charcoal-icon-size, var(--pixiv-icon-size));
1621
- }
1622
-
1623
- pixiv-icon:not(:defined)[name^='16/'] {
1624
- --pixiv-icon-base: 16px;
1625
- --pixiv-icon-size: 16px;
1626
- }
1627
-
1628
- pixiv-icon:not(:defined)[name^='24/'][scale='2'] {
1629
- --pixiv-icon-scale: 2;
1630
- }
1631
-
1632
- pixiv-icon:not(:defined)[name^='24/'][scale='3'] {
1633
- --pixiv-icon-scale: 3;
1634
- }
1635
-
1636
- pixiv-icon:not(:defined)[name^='32/'] {
1637
- --pixiv-icon-base: 32px;
1638
- --pixiv-icon-size: 32px;
1639
- }
1640
-
1641
- pixiv-icon:not(:defined)[name^='Inline/'] {
1642
- --pixiv-icon-base: 16px;
1643
- }
1644
-
1645
- pixiv-icon:not(:defined)[name^='Inline/'][scale='2'] {
1646
- --pixiv-icon-scale: 2;
1647
- }
1648
- .charcoal-dropdown-selector-menu-item {
1649
- font-size: 14px;
1650
- line-height: 22px;
1651
- color: var(--charcoal-color-text-secondary-default);
1652
- padding: 9px 0;
1653
-
1859
+ .charcoal-pagination {
1654
1860
  display: flex;
1861
+ justify-content: center;
1655
1862
  align-items: center;
1656
- width: 100%;
1657
- margin-left: 20px;
1658
- }
1659
-
1660
- .charcoal-dropdown-selector-menu-item[data-selected='true'] {
1661
- margin-left: 0px;
1662
1863
  }
1663
1864
 
1664
- .charcoal-dropdown-selector-menu-item-icon {
1665
- color: var(--charcoal-color-text-secondary-default);
1666
- padding-right: 4px;
1667
- }
1865
+ .charcoal-pagination[data-size='S'] .charcoal-pagination-button {
1866
+ min-width: 32px;
1867
+ min-height: 32px;
1868
+ }
1668
1869
 
1669
- .charcoal-dropdown-selector-menu-item-container {
1670
- display: flex;
1671
- align-items: center;
1672
- }
1870
+ .charcoal-pagination[data-size='M'] .charcoal-pagination-button {
1871
+ min-width: 40px;
1872
+ min-height: 40px;
1873
+ }
1673
1874
 
1674
- .charcoal-dropdown-selector-menu-secondary {
1675
- font-size: 12px;
1676
- line-height: 20px;
1677
- color: var(--charcoal-color-text-tertiary-default);
1678
- padding-bottom: 9px;
1875
+ /* stylelint-disable no-descending-specificity */
1876
+ .charcoal-pagination-button {
1877
+ cursor: pointer;
1878
+ -webkit-appearance: none;
1879
+ -moz-appearance: none;
1880
+ appearance: none;
1881
+ padding: 0;
1882
+ border-style: none;
1883
+ outline: none;
1884
+ text-decoration: none;
1885
+ font-family: inherit;
1886
+ font-style: inherit;
1887
+ font-variant: inherit;
1888
+ margin: 0;
1889
+ -webkit-user-select: none;
1890
+ -moz-user-select: none;
1891
+ user-select: none;
1679
1892
 
1680
1893
  display: flex;
1681
1894
  align-items: center;
1682
- margin-left: 20px;
1683
- }
1684
-
1685
- .charcoal-dropdown-selector-menu-fullwidth {
1686
- width: 100%;
1687
- }
1688
- .charcoal-modal-background {
1689
- overflow: auto;
1690
- display: flex;
1691
- position: fixed;
1692
- top: 0;
1693
- left: 0;
1694
- width: 100%;
1695
- height: 100%;
1696
1895
  justify-content: center;
1697
- padding: 40px 0;
1698
- box-sizing: border-box;
1699
-
1700
- background-color: var(--charcoal-color-background-overlay);
1701
- }
1702
-
1703
- @media (max-width: 743px) {
1704
- .charcoal-modal-background[data-bottom-sheet='true'],
1705
- .charcoal-modal-background[data-bottom-sheet='full'] {
1706
- padding: 0;
1707
- }
1708
- }
1709
-
1710
- /* easeOutQuart。duration は useTransitionPresence の MODAL_TRANSITION_DURATION_MS と一致させること。
1711
- transition は entering / exiting に限定し、開いたままテーマ切り替え等で
1712
- 色や transform が変わってもアニメーションしないようにする */
1713
- .charcoal-modal-background[data-animation] {
1714
- overflow: hidden;
1715
- }
1716
-
1717
- .charcoal-modal-background[data-animation='entering'],
1718
- .charcoal-modal-background[data-animation='exiting'] {
1719
- transition: background-color 400ms cubic-bezier(0.25, 1, 0.5, 1);
1720
- }
1721
-
1722
- /* 閉じアニメーション中はクリックを下のページへ通す(transitionend が来ない環境で
1723
- 透明なオーバーレイがタップを奪い続けるのも防ぐ) */
1724
- .charcoal-modal-background[data-animation='exited'],
1725
- .charcoal-modal-background[data-animation='exiting'] {
1726
- background-color: transparent;
1727
- pointer-events: none;
1728
- }
1729
-
1730
- .charcoal-modal-background[data-animation='entered'] {
1731
- overflow: auto;
1732
- }
1733
-
1734
- .charcoal-modal-background[data-animation='entering'] > .charcoal-modal-dialog,
1735
- .charcoal-modal-background[data-animation='exiting'] > .charcoal-modal-dialog {
1736
- transition: transform 400ms cubic-bezier(0.25, 1, 0.5, 1);
1737
- }
1738
-
1739
- .charcoal-modal-background[data-animation='exited'] > .charcoal-modal-dialog,
1740
- .charcoal-modal-background[data-animation='exiting'] > .charcoal-modal-dialog {
1741
- transform: translateY(100%);
1742
- }
1743
-
1744
- .charcoal-modal-close-button {
1745
- position: absolute;
1746
- top: 8px;
1747
- right: 8px;
1748
-
1749
- color: var(--charcoal-color-text-tertiary-default);
1750
- transition: 0.2s color;
1751
- }
1896
+ font-size: 14px;
1897
+ font-weight: 700;
1898
+ line-height: 22px;
1752
1899
 
1753
- .charcoal-modal-title {
1754
- margin: 0;
1755
- font-weight: inherit;
1756
- font-size: inherit;
1757
- }
1758
- .charcoal-menu-item-group {
1759
- display: block;
1760
- }
1900
+ /* HACK:
1901
+ * Safari doesn't correctly repaint the elements when they're reordered in response to interaction.
1902
+ * This forces it to repaint them. This doesn't work if put on the parents either, has to be here.
1903
+ */
1904
+ /* stylelint-disable-next-line property-no-vendor-prefix */
1905
+ -webkit-transform: translateZ(0);
1761
1906
 
1762
- .charcoal-menu-item-group > span {
1763
- display: block;
1764
1907
  color: var(--charcoal-color-text-tertiary-default);
1765
- font-size: 12px;
1766
- font-weight: bold;
1767
- padding: 12px 0 8px 16px;
1908
+ background-color: transparent;
1909
+ border-radius: 20px;
1910
+ transition:
1911
+ 0.2s background-color,
1912
+ 0.2s box-shadow;
1768
1913
  }
1914
+ .charcoal-pagination-button:focus {
1915
+ outline: none;
1916
+ }
1917
+ .charcoal-pagination-button::-moz-focus-inner {
1918
+ border-style: none;
1919
+ padding: 0;
1920
+ }
1921
+ .charcoal-pagination-button[hidden] {
1922
+ visibility: hidden;
1923
+ display: block;
1924
+ }
1925
+ .charcoal-pagination-button:not(:disabled):not([aria-disabled]):hover,
1926
+ .charcoal-pagination-button[aria-disabled='false']:hover {
1927
+ color: var(--charcoal-color-text-tertiary-default);
1928
+ background-color: var(--charcoal-color-container-secondary-default);
1929
+ }
1930
+ .charcoal-pagination-button:not(:disabled):not([aria-disabled]):active,
1931
+ .charcoal-pagination-button[aria-disabled='false']:active {
1932
+ color: var(--charcoal-color-text-tertiary-press);
1933
+ background-color: var(--charcoal-color-container-tertiary-press);
1934
+ }
1935
+ .charcoal-pagination-button:not(:disabled):not([aria-disabled]):focus,
1936
+ .charcoal-pagination-button[aria-disabled='false']:focus {
1937
+ outline: none;
1938
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1939
+ }
1940
+ .charcoal-pagination-button:not(:disabled):not([aria-disabled]):focus-visible,
1941
+ .charcoal-pagination-button[aria-disabled='false']:focus-visible {
1942
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
1943
+ }
1944
+ .charcoal-pagination-button:not(:disabled):not([aria-disabled]):focus:not(:focus-visible),
1945
+ .charcoal-pagination-button[aria-disabled='false']:focus:not(:focus-visible) {
1946
+ box-shadow: none;
1947
+ }
1948
+ .charcoal-pagination-button[aria-current] {
1949
+ cursor: default;
1950
+ background-color: var(--charcoal-color-container-hud-default);
1951
+ color: var(--charcoal-color-text-on-hud-default);
1952
+ }
1953
+ .charcoal-pagination-button[aria-current]:not(:disabled):not([aria-disabled]):hover,
1954
+ .charcoal-pagination-button[aria-current]:not(:disabled):not([aria-disabled]):active {
1955
+ background-color: var(--charcoal-color-container-hud-default);
1956
+ color: var(--charcoal-color-text-on-hud-default);
1957
+ }
1958
+ /* stylelint-enable no-descending-specificity */
1769
1959
 
1770
- .charcoal-menu-item-group > ul {
1771
- padding-left: 0;
1772
- margin: 0;
1773
- box-sizing: border-box;
1774
- list-style: none;
1775
- overflow: hidden;
1776
- }
1777
- .charcoal-checkbox__label {
1778
- position: relative;
1779
- cursor: pointer;
1780
- display: flex;
1781
- gap: 4px;
1960
+ .charcoal-pagination-nav-button[data-hidden] {
1961
+ visibility: hidden;
1782
1962
  }
1783
1963
 
1784
- .charcoal-checkbox__label[aria-disabled='true'] {
1964
+ .charcoal-pagination-spacer,
1965
+ .charcoal-pagination-spacer:hover,
1966
+ .charcoal-pagination-spacer:active {
1785
1967
  cursor: default;
1786
- opacity: 0.32;
1968
+ color: var(--charcoal-color-text-tertiary-default);
1969
+ background: none;
1787
1970
  }
1788
1971
 
1789
- .charcoal-checkbox__label[aria-disabled='true'] > input {
1790
- opacity: 1;
1791
- }
1792
-
1793
- .charcoal-checkbox__label_div {
1794
- flex: 1;
1795
- color: var(--charcoal-color-text-default);
1796
- font-size: 14px;
1797
- line-height: 20px;
1798
- }
1972
+ .charcoal-pagination-spacer.charcoal-icon-button:disabled {
1973
+ opacity: 1;
1974
+ }
1799
1975
  .charcoal-text-field-assistive-text {
1800
1976
  font-size: 14px;
1801
1977
  line-height: 22px;
@@ -1894,43 +2070,6 @@ pixiv-icon:not(:defined)[name^='Inline/'][scale='2'] {
1894
2070
  .charcoal-radio-input:checked:not(:disabled):active::after {
1895
2071
  background-color: var(--charcoal-color-icon-on-primary-press);
1896
2072
  }
1897
- .charcoal-field-label {
1898
- font-size: 14px;
1899
- line-height: 22px;
1900
- font-weight: bold;
1901
- display: flow-root;
1902
- color: var(--charcoal-color-text-default-text1);
1903
- }
1904
-
1905
- .charcoal-field-label-required-text {
1906
- font-size: 14px;
1907
- line-height: 22px;
1908
- display: flow-root;
1909
- color: var(--charcoal-color-text-secondary-default);
1910
- }
1911
-
1912
- .charcoal-field-label-sub-label {
1913
- font-size: 14px;
1914
- line-height: 22px;
1915
- display: flow-root;
1916
- color: var(--charcoal-color-text-tertiary-default);
1917
- transition:
1918
- 0.2s color,
1919
- 0.2s box-shadow;
1920
- }
1921
-
1922
- .charcoal-field-label-root {
1923
- display: inline-flex;
1924
- align-items: center;
1925
- }
1926
-
1927
- .charcoal-field-label-root > .charcoal-field-label-required-text {
1928
- margin-left: 4px;
1929
- }
1930
-
1931
- .charcoal-field-label-root > .charcoal-field-label-sub-label {
1932
- margin-left: auto;
1933
- }
1934
2073
  .charcoal-switch-input {
1935
2074
  cursor: pointer;
1936
2075
  -webkit-appearance: none;
@@ -2015,6 +2154,88 @@ pixiv-icon:not(:defined)[name^='Inline/'][scale='2'] {
2015
2154
  .charcoal-switch-input:not(:disabled):checked:active {
2016
2155
  background-color: var(--charcoal-color-container-primary-press);
2017
2156
  }
2157
+ .charcoal-field-label {
2158
+ font-size: 14px;
2159
+ line-height: 22px;
2160
+ font-weight: bold;
2161
+ display: flow-root;
2162
+ color: var(--charcoal-color-text-default-text1);
2163
+ }
2164
+
2165
+ .charcoal-field-label-required-text {
2166
+ font-size: 14px;
2167
+ line-height: 22px;
2168
+ display: flow-root;
2169
+ color: var(--charcoal-color-text-secondary-default);
2170
+ }
2171
+
2172
+ .charcoal-field-label-sub-label {
2173
+ font-size: 14px;
2174
+ line-height: 22px;
2175
+ display: flow-root;
2176
+ color: var(--charcoal-color-text-tertiary-default);
2177
+ transition:
2178
+ 0.2s color,
2179
+ 0.2s box-shadow;
2180
+ }
2181
+
2182
+ .charcoal-field-label-root {
2183
+ display: inline-flex;
2184
+ align-items: center;
2185
+ }
2186
+
2187
+ .charcoal-field-label-root > .charcoal-field-label-required-text {
2188
+ margin-left: 4px;
2189
+ }
2190
+
2191
+ .charcoal-field-label-root > .charcoal-field-label-sub-label {
2192
+ margin-left: auto;
2193
+ }
2194
+ .charcoal-modal-dialog {
2195
+ margin: auto;
2196
+ position: relative;
2197
+ height: -moz-fit-content;
2198
+ height: fit-content;
2199
+ width: 440px;
2200
+
2201
+ background-color: var(--charcoal-color-container-default);
2202
+ border-radius: 24px;
2203
+ }
2204
+
2205
+ .charcoal-modal-dialog[data-size='S'] {
2206
+ width: 336px;
2207
+ }
2208
+
2209
+ .charcoal-modal-dialog[data-size='M'] {
2210
+ width: 440px;
2211
+ }
2212
+
2213
+ .charcoal-modal-dialog[data-size='L'] {
2214
+ width: 648px;
2215
+ }
2216
+
2217
+ @media (max-width: 743px) {
2218
+ .charcoal-modal-dialog {
2219
+ max-width: 440px;
2220
+ width: calc(100% - 48px);
2221
+ }
2222
+
2223
+ .charcoal-modal-dialog[data-bottom-sheet='true'],
2224
+ .charcoal-modal-dialog[data-bottom-sheet='full'] {
2225
+ max-width: unset;
2226
+ width: 100%;
2227
+ border-radius: 0;
2228
+ margin: auto 0 0 0;
2229
+ }
2230
+
2231
+ .charcoal-modal-dialog[data-bottom-sheet='full'] {
2232
+ min-height: 100%;
2233
+ }
2234
+ }
2235
+
2236
+ .charcoal-modal-dialog:focus {
2237
+ outline: none;
2238
+ }
2018
2239
  .charcoal-menu-list {
2019
2240
  padding: 0;
2020
2241
  margin: 0;
@@ -2157,51 +2378,6 @@ pixiv-icon:not(:defined)[name^='Inline/'][scale='2'] {
2157
2378
  border: 2px solid #fff;
2158
2379
  box-sizing: border-box;
2159
2380
  }
2160
- .charcoal-modal-dialog {
2161
- margin: auto;
2162
- position: relative;
2163
- height: -moz-fit-content;
2164
- height: fit-content;
2165
- width: 440px;
2166
-
2167
- background-color: var(--charcoal-color-container-default);
2168
- border-radius: 24px;
2169
- }
2170
-
2171
- .charcoal-modal-dialog[data-size='S'] {
2172
- width: 336px;
2173
- }
2174
-
2175
- .charcoal-modal-dialog[data-size='M'] {
2176
- width: 440px;
2177
- }
2178
-
2179
- .charcoal-modal-dialog[data-size='L'] {
2180
- width: 648px;
2181
- }
2182
-
2183
- @media (max-width: 743px) {
2184
- .charcoal-modal-dialog {
2185
- max-width: 440px;
2186
- width: calc(100% - 48px);
2187
- }
2188
-
2189
- .charcoal-modal-dialog[data-bottom-sheet='true'],
2190
- .charcoal-modal-dialog[data-bottom-sheet='full'] {
2191
- max-width: unset;
2192
- width: 100%;
2193
- border-radius: 0;
2194
- margin: auto 0 0 0;
2195
- }
2196
-
2197
- .charcoal-modal-dialog[data-bottom-sheet='full'] {
2198
- min-height: 100%;
2199
- }
2200
- }
2201
-
2202
- .charcoal-modal-dialog:focus {
2203
- outline: none;
2204
- }
2205
2381
  .charcoal-popover {
2206
2382
  margin: 4px 0;
2207
2383
  list-style: none;