@charcoal-ui/react 2.2.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/components/Checkbox/index.d.ts.map +1 -1
  2. package/dist/components/Checkbox/index.story.d.ts.map +1 -1
  3. package/dist/components/DropdownSelector/DropdownPopover.d.ts +13 -0
  4. package/dist/components/DropdownSelector/DropdownPopover.d.ts.map +1 -0
  5. package/dist/components/DropdownSelector/index.d.ts.map +1 -1
  6. package/dist/components/DropdownSelector/index.story.d.ts +3 -0
  7. package/dist/components/DropdownSelector/index.story.d.ts.map +1 -1
  8. package/dist/components/Modal/index.d.ts +5 -1
  9. package/dist/components/Modal/index.d.ts.map +1 -1
  10. package/dist/core/CharcoalProvider.d.ts +12 -0
  11. package/dist/core/CharcoalProvider.d.ts.map +1 -0
  12. package/dist/core/ComponentAbstraction.d.ts +1 -1
  13. package/dist/core/ComponentAbstraction.d.ts.map +1 -1
  14. package/dist/index.cjs.js +2157 -0
  15. package/dist/index.cjs.js.map +1 -0
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.esm.js +2118 -0
  19. package/dist/index.esm.js.map +1 -0
  20. package/dist/styled.d.ts +3 -3
  21. package/package.json +23 -22
  22. package/src/components/Checkbox/index.story.tsx +29 -11
  23. package/src/components/Checkbox/index.tsx +16 -6
  24. package/src/components/DropdownSelector/DropdownPopover.tsx +72 -0
  25. package/src/components/DropdownSelector/Listbox.tsx +15 -13
  26. package/src/components/DropdownSelector/index.story.tsx +123 -45
  27. package/src/components/DropdownSelector/index.tsx +8 -11
  28. package/src/components/Modal/index.tsx +6 -6
  29. package/src/components/Switch/index.tsx +7 -3
  30. package/src/core/CharcoalProvider.tsx +35 -0
  31. package/src/core/ComponentAbstraction.tsx +1 -1
  32. package/src/index.ts +4 -0
  33. package/dist/components/DropdownSelector/Popover.d.ts +0 -10
  34. package/dist/components/DropdownSelector/Popover.d.ts.map +0 -1
  35. package/dist/index.cjs +0 -4446
  36. package/dist/index.cjs.map +0 -1
  37. package/dist/index.js +0 -4409
  38. package/dist/index.js.map +0 -1
  39. package/src/components/DropdownSelector/Popover.tsx +0 -46
@@ -0,0 +1,2157 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
+
26
+ // src/index.ts
27
+ var src_exports = {};
28
+ __export(src_exports, {
29
+ Button: () => Button_default,
30
+ CharcoalProvider: () => CharcoalProvider,
31
+ Checkbox: () => Checkbox_default,
32
+ Clickable: () => Clickable_default,
33
+ ComponentAbstraction: () => ComponentAbstraction,
34
+ DropdownSelector: () => DropdownSelector_default,
35
+ DropdownSelectorItem: () => DropdownSelectorItem,
36
+ Icon: () => Icon_default,
37
+ IconButton: () => IconButton_default,
38
+ LoadingSpinner: () => LoadingSpinner,
39
+ LoadingSpinnerIcon: () => LoadingSpinnerIcon,
40
+ Modal: () => Modal,
41
+ ModalAlign: () => ModalAlign,
42
+ ModalBody: () => ModalBody,
43
+ ModalButtons: () => ModalButtons,
44
+ ModalHeader: () => ModalHeader,
45
+ MultiSelect: () => MultiSelect,
46
+ MultiSelectGroup: () => MultiSelectGroup,
47
+ OverlayProvider: () => import_overlays.OverlayProvider,
48
+ Radio: () => Radio,
49
+ RadioGroup: () => RadioGroup,
50
+ SSRProvider: () => import_ssr.SSRProvider,
51
+ SegmentedControl: () => SegmentedControl_default,
52
+ Switch: () => SwitchCheckbox,
53
+ TagItem: () => TagItem_default,
54
+ TextField: () => TextField_default,
55
+ useComponentAbstraction: () => useComponentAbstraction
56
+ });
57
+ module.exports = __toCommonJS(src_exports);
58
+
59
+ // src/core/ComponentAbstraction.tsx
60
+ var import_react = __toESM(require("react"));
61
+ var DefaultLink = import_react.default.forwardRef(
62
+ function DefaultLink2({ to, children, ...rest }, ref) {
63
+ return /* @__PURE__ */ import_react.default.createElement("a", { href: to, ref, ...rest }, children);
64
+ }
65
+ );
66
+ var DefaultValue = {
67
+ Link: DefaultLink
68
+ };
69
+ var ComponentAbstractionContext = import_react.default.createContext(DefaultValue);
70
+ function ComponentAbstraction({ children, components }) {
71
+ return /* @__PURE__ */ import_react.default.createElement(
72
+ ComponentAbstractionContext.Provider,
73
+ {
74
+ value: { ...DefaultValue, ...components }
75
+ },
76
+ children
77
+ );
78
+ }
79
+ function useComponentAbstraction() {
80
+ return (0, import_react.useContext)(ComponentAbstractionContext);
81
+ }
82
+
83
+ // src/core/SSRProvider.tsx
84
+ var import_ssr = require("@react-aria/ssr");
85
+
86
+ // src/core/OverlayProvider.tsx
87
+ var import_overlays = require("@react-aria/overlays");
88
+
89
+ // src/core/CharcoalProvider.tsx
90
+ var import_react2 = __toESM(require("react"));
91
+ var import_styled_components = require("styled-components");
92
+ var import_styled = require("@charcoal-ui/styled");
93
+ function CharcoalProvider({
94
+ themeMap,
95
+ defaultTheme = themeMap[":root"],
96
+ components = {},
97
+ injectTokens = true,
98
+ children
99
+ }) {
100
+ return /* @__PURE__ */ import_react2.default.createElement(import_ssr.SSRProvider, null, /* @__PURE__ */ import_react2.default.createElement(import_styled_components.ThemeProvider, { theme: defaultTheme }, injectTokens && /* @__PURE__ */ import_react2.default.createElement(import_styled.TokenInjector, { theme: themeMap }), /* @__PURE__ */ import_react2.default.createElement(ComponentAbstraction, { components }, /* @__PURE__ */ import_react2.default.createElement(import_overlays.OverlayProvider, null, children))));
101
+ }
102
+
103
+ // src/components/Button/index.tsx
104
+ var import_react4 = __toESM(require("react"));
105
+ var import_styled_components4 = __toESM(require("styled-components"));
106
+
107
+ // src/_lib/index.ts
108
+ function unreachable(value) {
109
+ throw new Error(
110
+ arguments.length === 0 ? "unreachable" : `unreachable (${JSON.stringify(value)})`
111
+ );
112
+ }
113
+
114
+ // src/styled.ts
115
+ var import_styled_components2 = __toESM(require("styled-components"));
116
+ var import_styled2 = require("@charcoal-ui/styled");
117
+ var theme = (0, import_styled2.createTheme)(import_styled_components2.default);
118
+
119
+ // src/components/Clickable/index.tsx
120
+ var import_react3 = __toESM(require("react"));
121
+ var import_styled_components3 = __toESM(require("styled-components"));
122
+ var import_utils = require("@charcoal-ui/utils");
123
+ var Clickable = import_react3.default.forwardRef(
124
+ function Clickable2(props, ref) {
125
+ const { Link } = useComponentAbstraction();
126
+ if ("to" in props) {
127
+ const { onClick, disabled = false, ...rest } = props;
128
+ return /* @__PURE__ */ import_react3.default.createElement(
129
+ A,
130
+ {
131
+ ...rest,
132
+ as: disabled ? void 0 : Link,
133
+ onClick: disabled ? void 0 : onClick,
134
+ "aria-disabled": disabled,
135
+ ref
136
+ }
137
+ );
138
+ } else {
139
+ return /* @__PURE__ */ import_react3.default.createElement(Button, { ...props, ref });
140
+ }
141
+ }
142
+ );
143
+ var Clickable_default = Clickable;
144
+ var clickableCss = import_styled_components3.css`
145
+ /* Clickable style */
146
+ cursor: pointer;
147
+
148
+ ${import_utils.disabledSelector} {
149
+ cursor: default;
150
+ }
151
+ `;
152
+ var Button = import_styled_components3.default.button`
153
+ /* Reset button appearance */
154
+ appearance: none;
155
+ background: transparent;
156
+ padding: 0;
157
+ border-style: none;
158
+ outline: none;
159
+ color: inherit;
160
+ text-rendering: inherit;
161
+ letter-spacing: inherit;
162
+ word-spacing: inherit;
163
+
164
+ &:focus {
165
+ outline: none;
166
+ }
167
+
168
+ /* Change the font styles in all browsers. */
169
+ font: inherit;
170
+
171
+ /* Remove the margin in Firefox and Safari. */
172
+ margin: 0;
173
+
174
+ /* Show the overflow in Edge. */
175
+ overflow: visible;
176
+
177
+ /* Remove the inheritance of text transform in Firefox. */
178
+ text-transform: none;
179
+
180
+ /* Remove the inner border and padding in Firefox. */
181
+ &::-moz-focus-inner {
182
+ border-style: none;
183
+ padding: 0;
184
+ }
185
+
186
+ ${clickableCss}
187
+ `;
188
+ var A = import_styled_components3.default.span`
189
+ /* Reset a-tag appearance */
190
+ color: inherit;
191
+
192
+ &:focus {
193
+ outline: none;
194
+ }
195
+
196
+ .text {
197
+ top: calc(1em + 2em);
198
+ }
199
+
200
+ ${clickableCss}
201
+ `;
202
+
203
+ // src/components/Button/index.tsx
204
+ var Button2 = import_react4.default.forwardRef(function Button3({
205
+ children,
206
+ variant = "Default",
207
+ size = "M",
208
+ fixed = false,
209
+ disabled = false,
210
+ ...rest
211
+ }, ref) {
212
+ return /* @__PURE__ */ import_react4.default.createElement(
213
+ StyledButton,
214
+ {
215
+ ...rest,
216
+ disabled,
217
+ variant,
218
+ size,
219
+ fixed,
220
+ ref
221
+ },
222
+ children
223
+ );
224
+ });
225
+ var Button_default = Button2;
226
+ var StyledButton = (0, import_styled_components4.default)(Clickable_default).withConfig({
227
+ shouldForwardProp(prop) {
228
+ return prop !== "fixed";
229
+ }
230
+ }).attrs(styledProps)`
231
+ width: ${(p) => p.fixed ? "stretch" : "min-content"};
232
+ display: inline-grid;
233
+ align-items: center;
234
+ justify-content: center;
235
+ cursor: pointer;
236
+ user-select: none;
237
+ white-space: nowrap;
238
+
239
+ ${(p) => theme((o) => [
240
+ o.font[p.font].hover.press,
241
+ o.bg[p.background].hover.press,
242
+ o.typography(14).bold.preserveHalfLeading,
243
+ o.padding.horizontal(p.padding),
244
+ o.disabled,
245
+ o.borderRadius("oval"),
246
+ o.outline.default.focus
247
+ ])}
248
+
249
+ /* よく考えたらheight=32って定義が存在しないな... */
250
+ height: ${(p) => p.height}px;
251
+ `;
252
+ function styledProps(props) {
253
+ return {
254
+ ...props,
255
+ ...variantToProps(props.variant),
256
+ ...sizeToProps(props.size)
257
+ };
258
+ }
259
+ function variantToProps(variant) {
260
+ switch (variant) {
261
+ case "Overlay":
262
+ return { font: "text5", background: "surface4" };
263
+ case "Default":
264
+ return { font: "text2", background: "surface3" };
265
+ case "Primary":
266
+ return { font: "text5", background: "brand" };
267
+ case "Navigation":
268
+ return { font: "text5", background: "surface6" };
269
+ case "Danger":
270
+ return { font: "text5", background: "assertive" };
271
+ default:
272
+ return unreachable(variant);
273
+ }
274
+ }
275
+ function sizeToProps(size) {
276
+ switch (size) {
277
+ case "S":
278
+ return {
279
+ height: 32,
280
+ padding: 16
281
+ };
282
+ case "M":
283
+ return {
284
+ height: 40,
285
+ padding: 24
286
+ };
287
+ }
288
+ }
289
+
290
+ // src/components/IconButton/index.tsx
291
+ var import_react5 = __toESM(require("react"));
292
+ var import_styled_components5 = __toESM(require("styled-components"));
293
+ var IconButton = import_react5.default.forwardRef(
294
+ function IconButtonInner({ variant = "Default", size = "M", icon, ...rest }, ref) {
295
+ validateIconSize(size, icon);
296
+ return /* @__PURE__ */ import_react5.default.createElement(StyledIconButton, { ...rest, ref, variant, size }, /* @__PURE__ */ import_react5.default.createElement("pixiv-icon", { name: icon }));
297
+ }
298
+ );
299
+ var IconButton_default = IconButton;
300
+ var StyledIconButton = (0, import_styled_components5.default)(Clickable_default).attrs(styledProps2)`
301
+ user-select: none;
302
+
303
+ width: ${(p) => p.width}px;
304
+ height: ${(p) => p.height}px;
305
+ display: flex;
306
+ align-items: center;
307
+ justify-content: center;
308
+
309
+ ${({ font, background }) => theme((o) => [
310
+ o.font[font],
311
+ o.bg[background].hover.press,
312
+ o.disabled,
313
+ o.borderRadius("oval"),
314
+ o.outline.default.focus
315
+ ])}
316
+ `;
317
+ function styledProps2(props) {
318
+ return {
319
+ ...props,
320
+ ...variantToProps2(props.variant),
321
+ ...sizeToProps2(props.size)
322
+ };
323
+ }
324
+ function variantToProps2(variant) {
325
+ switch (variant) {
326
+ case "Default":
327
+ return { font: "text3", background: "transparent" };
328
+ case "Overlay":
329
+ return { font: "text5", background: "surface4" };
330
+ }
331
+ }
332
+ function sizeToProps2(size) {
333
+ switch (size) {
334
+ case "XS":
335
+ return {
336
+ width: 20,
337
+ height: 20
338
+ };
339
+ case "S":
340
+ return {
341
+ width: 32,
342
+ height: 32
343
+ };
344
+ case "M":
345
+ return {
346
+ width: 40,
347
+ height: 40
348
+ };
349
+ }
350
+ }
351
+ function validateIconSize(size, icon) {
352
+ let requiredIconSize;
353
+ switch (size) {
354
+ case "XS":
355
+ requiredIconSize = "16";
356
+ break;
357
+ case "S":
358
+ case "M":
359
+ requiredIconSize = "24";
360
+ break;
361
+ }
362
+ const result = /^\d*/u.exec(icon);
363
+ if (result == null) {
364
+ throw new Error("Invalid icon name");
365
+ }
366
+ const [iconSize] = result;
367
+ if (iconSize !== requiredIconSize) {
368
+ console.warn(
369
+ `IconButton with size "${size}" expect icon size "${requiredIconSize}, but got "${iconSize}"`
370
+ );
371
+ }
372
+ }
373
+
374
+ // src/components/Radio/index.tsx
375
+ var import_react6 = __toESM(require("react"));
376
+ var import_styled_components6 = __toESM(require("styled-components"));
377
+ var import_warning = __toESM(require("warning"));
378
+ var import_utils2 = require("@charcoal-ui/utils");
379
+ function Radio({
380
+ value,
381
+ forceChecked = false,
382
+ disabled = false,
383
+ children
384
+ }) {
385
+ const {
386
+ name,
387
+ selected,
388
+ disabled: isParentDisabled,
389
+ readonly,
390
+ hasError,
391
+ onChange
392
+ } = (0, import_react6.useContext)(RadioGroupContext);
393
+ (0, import_warning.default)(
394
+ name !== void 0,
395
+ `"name" is not Provided for <Radio>. Perhaps you forgot to wrap with <RadioGroup> ?`
396
+ );
397
+ const isSelected = value === selected;
398
+ const isDisabled = disabled || isParentDisabled;
399
+ const isReadonly = readonly && !isSelected;
400
+ const handleChange = (0, import_react6.useCallback)(
401
+ (e) => {
402
+ onChange(e.currentTarget.value);
403
+ },
404
+ [onChange]
405
+ );
406
+ return /* @__PURE__ */ import_react6.default.createElement(RadioRoot, { "aria-disabled": isDisabled || isReadonly }, /* @__PURE__ */ import_react6.default.createElement(
407
+ RadioInput,
408
+ {
409
+ name,
410
+ value,
411
+ checked: forceChecked || isSelected,
412
+ hasError,
413
+ onChange: handleChange,
414
+ disabled: isDisabled || isReadonly
415
+ }
416
+ ), children != null && /* @__PURE__ */ import_react6.default.createElement(RadioLabel, null, children));
417
+ }
418
+ var RadioRoot = import_styled_components6.default.label`
419
+ display: grid;
420
+ grid-template-columns: auto 1fr;
421
+ grid-gap: ${({ theme: theme4 }) => (0, import_utils2.px)(theme4.spacing[4])};
422
+ align-items: center;
423
+ cursor: pointer;
424
+
425
+ ${theme((o) => [o.disabled])}
426
+ `;
427
+ var RadioInput = import_styled_components6.default.input.attrs({ type: "radio" })`
428
+ /** Make prior to browser default style */
429
+ &[type='radio'] {
430
+ appearance: none;
431
+ display: block;
432
+ box-sizing: border-box;
433
+
434
+ margin: 0;
435
+ padding: 6px;
436
+
437
+ width: 20px;
438
+ height: 20px;
439
+
440
+ ${({ hasError = false }) => theme((o) => [
441
+ o.borderRadius("oval"),
442
+ o.bg.surface1.hover.press,
443
+ hasError && o.outline.assertive
444
+ ])};
445
+
446
+ &:not(:checked) {
447
+ border-width: 2px;
448
+ border-style: solid;
449
+ border-color: ${({ theme: theme4 }) => theme4.color.text3};
450
+ }
451
+
452
+ &:checked {
453
+ ${theme((o) => o.bg.brand.hover.press)}
454
+
455
+ &::after {
456
+ content: '';
457
+ display: block;
458
+ width: 8px;
459
+ height: 8px;
460
+ pointer-events: none;
461
+
462
+ ${theme((o) => [o.bg.text5.hover.press, o.borderRadius("oval")])}
463
+ }
464
+ }
465
+
466
+ ${theme((o) => o.outline.default.focus)}
467
+ }
468
+ `;
469
+ var RadioLabel = import_styled_components6.default.div`
470
+ ${theme((o) => [o.typography(14), o.font.text2])}
471
+ `;
472
+ var StyledRadioGroup = import_styled_components6.default.div`
473
+ display: grid;
474
+ grid-template-columns: 1fr;
475
+ grid-gap: ${({ theme: theme4 }) => (0, import_utils2.px)(theme4.spacing[8])};
476
+ `;
477
+ var RadioGroupContext = import_react6.default.createContext({
478
+ name: void 0,
479
+ selected: void 0,
480
+ disabled: false,
481
+ readonly: false,
482
+ hasError: false,
483
+ onChange() {
484
+ throw new Error(
485
+ "Cannot find onChange() handler. Perhaps you forgot to wrap with <RadioGroup> ?"
486
+ );
487
+ }
488
+ });
489
+ function RadioGroup({
490
+ className,
491
+ value,
492
+ label,
493
+ name,
494
+ onChange,
495
+ disabled,
496
+ readonly,
497
+ hasError,
498
+ children
499
+ }) {
500
+ const handleChange = (0, import_react6.useCallback)(
501
+ (next) => {
502
+ onChange(next);
503
+ },
504
+ [onChange]
505
+ );
506
+ return /* @__PURE__ */ import_react6.default.createElement(
507
+ RadioGroupContext.Provider,
508
+ {
509
+ value: {
510
+ name,
511
+ selected: value,
512
+ disabled: disabled ?? false,
513
+ readonly: readonly ?? false,
514
+ hasError: hasError ?? false,
515
+ onChange: handleChange
516
+ }
517
+ },
518
+ /* @__PURE__ */ import_react6.default.createElement(
519
+ StyledRadioGroup,
520
+ {
521
+ role: "radiogroup",
522
+ "aria-orientation": "vertical",
523
+ "aria-label": label,
524
+ "aria-invalid": hasError,
525
+ className
526
+ },
527
+ children
528
+ )
529
+ );
530
+ }
531
+
532
+ // src/components/MultiSelect/index.tsx
533
+ var import_react8 = __toESM(require("react"));
534
+ var import_styled_components7 = __toESM(require("styled-components"));
535
+ var import_warning2 = __toESM(require("warning"));
536
+ var import_utils3 = require("@charcoal-ui/utils");
537
+
538
+ // src/components/MultiSelect/context.ts
539
+ var import_react7 = require("react");
540
+ var MultiSelectGroupContext = (0, import_react7.createContext)({
541
+ name: void 0,
542
+ selected: [],
543
+ disabled: false,
544
+ readonly: false,
545
+ hasError: false,
546
+ onChange() {
547
+ throw new Error(
548
+ "Cannot find `onChange()` handler. Perhaps you forgot to wrap it with `<MultiSelectGroup />` ?"
549
+ );
550
+ }
551
+ });
552
+
553
+ // src/components/MultiSelect/index.tsx
554
+ function MultiSelect({
555
+ value,
556
+ forceChecked = false,
557
+ disabled = false,
558
+ onChange,
559
+ variant = "default",
560
+ children
561
+ }) {
562
+ const {
563
+ name,
564
+ selected,
565
+ disabled: parentDisabled,
566
+ readonly,
567
+ hasError,
568
+ onChange: parentOnChange
569
+ } = (0, import_react8.useContext)(MultiSelectGroupContext);
570
+ (0, import_warning2.default)(
571
+ name !== void 0,
572
+ `"name" is not Provided for <MultiSelect>. Perhaps you forgot to wrap with <MultiSelectGroup> ?`
573
+ );
574
+ const isSelected = selected.includes(value) || forceChecked;
575
+ const isDisabled = disabled || parentDisabled || readonly;
576
+ const handleChange = (0, import_react8.useCallback)(
577
+ (event) => {
578
+ if (!(event.currentTarget instanceof HTMLInputElement)) {
579
+ return;
580
+ }
581
+ if (onChange)
582
+ onChange({ value, selected: event.currentTarget.checked });
583
+ parentOnChange({ value, selected: event.currentTarget.checked });
584
+ },
585
+ [onChange, parentOnChange, value]
586
+ );
587
+ return /* @__PURE__ */ import_react8.default.createElement(MultiSelectRoot, { "aria-disabled": isDisabled }, /* @__PURE__ */ import_react8.default.createElement(
588
+ MultiSelectInput,
589
+ {
590
+ ...{
591
+ name,
592
+ value,
593
+ hasError
594
+ },
595
+ checked: isSelected,
596
+ disabled: isDisabled,
597
+ onChange: handleChange,
598
+ overlay: variant === "overlay",
599
+ "aria-invalid": hasError
600
+ }
601
+ ), /* @__PURE__ */ import_react8.default.createElement(
602
+ MultiSelectInputOverlay,
603
+ {
604
+ overlay: variant === "overlay",
605
+ hasError,
606
+ "aria-hidden": true
607
+ },
608
+ /* @__PURE__ */ import_react8.default.createElement("pixiv-icon", { name: "24/Check", "unsafe-non-guideline-scale": 16 / 24 })
609
+ ), Boolean(children) && /* @__PURE__ */ import_react8.default.createElement(MultiSelectLabel, null, children));
610
+ }
611
+ var MultiSelectRoot = import_styled_components7.default.label`
612
+ display: grid;
613
+ grid-template-columns: auto 1fr;
614
+ align-items: center;
615
+ position: relative;
616
+ cursor: pointer;
617
+ ${import_utils3.disabledSelector} {
618
+ cursor: default;
619
+ }
620
+ gap: ${({ theme: theme4 }) => (0, import_utils3.px)(theme4.spacing[4])};
621
+ ${theme((o) => o.disabled)}
622
+ `;
623
+ var MultiSelectLabel = import_styled_components7.default.div`
624
+ display: flex;
625
+ align-items: center;
626
+ ${theme((o) => [o.typography(14), o.font.text2])}
627
+ `;
628
+ var MultiSelectInput = import_styled_components7.default.input.attrs({ type: "checkbox" })`
629
+ &[type='checkbox'] {
630
+ appearance: none;
631
+ display: block;
632
+ width: 20px;
633
+ height: 20px;
634
+ margin: 0;
635
+
636
+ &:checked {
637
+ ${theme((o) => o.bg.brand.hover.press)}
638
+ }
639
+
640
+ ${({ hasError, overlay }) => theme((o) => [
641
+ o.bg.text3.hover.press,
642
+ o.borderRadius("oval"),
643
+ hasError && !overlay && o.outline.assertive,
644
+ overlay && o.bg.surface4
645
+ ])};
646
+ }
647
+ `;
648
+ var MultiSelectInputOverlay = import_styled_components7.default.div`
649
+ position: absolute;
650
+ top: -2px;
651
+ left: -2px;
652
+ box-sizing: border-box;
653
+ display: flex;
654
+ align-items: center;
655
+ justify-content: center;
656
+
657
+ ${({ hasError, overlay }) => theme((o) => [
658
+ o.width.px(24),
659
+ o.height.px(24),
660
+ o.borderRadius("oval"),
661
+ o.font.text5,
662
+ hasError && overlay && o.outline.assertive
663
+ ])}
664
+
665
+ ${({ overlay }) => overlay && import_styled_components7.css`
666
+ border-color: ${({ theme: theme4 }) => theme4.color.text5};
667
+ border-width: 2px;
668
+ border-style: solid;
669
+ `}
670
+ `;
671
+ function MultiSelectGroup({
672
+ className,
673
+ name,
674
+ ariaLabel,
675
+ selected,
676
+ onChange,
677
+ disabled = false,
678
+ readonly = false,
679
+ hasError = false,
680
+ children
681
+ }) {
682
+ const handleChange = (0, import_react8.useCallback)(
683
+ (payload) => {
684
+ const index = selected.indexOf(payload.value);
685
+ if (payload.selected) {
686
+ if (index < 0) {
687
+ onChange([...selected, payload.value]);
688
+ }
689
+ } else {
690
+ if (index >= 0) {
691
+ onChange([...selected.slice(0, index), ...selected.slice(index + 1)]);
692
+ }
693
+ }
694
+ },
695
+ [onChange, selected]
696
+ );
697
+ return /* @__PURE__ */ import_react8.default.createElement(
698
+ MultiSelectGroupContext.Provider,
699
+ {
700
+ value: {
701
+ name,
702
+ selected: Array.from(new Set(selected)),
703
+ disabled,
704
+ readonly,
705
+ hasError,
706
+ onChange: handleChange
707
+ }
708
+ },
709
+ /* @__PURE__ */ import_react8.default.createElement(
710
+ "div",
711
+ {
712
+ className,
713
+ "aria-label": ariaLabel,
714
+ "data-testid": "SelectGroup"
715
+ },
716
+ children
717
+ )
718
+ );
719
+ }
720
+
721
+ // src/components/Switch/index.tsx
722
+ var import_switch = require("@react-aria/switch");
723
+ var import_react9 = __toESM(require("react"));
724
+ var import_react_stately = require("react-stately");
725
+ var import_styled_components8 = __toESM(require("styled-components"));
726
+ var import_utils4 = require("@charcoal-ui/utils");
727
+ function SwitchCheckbox(props) {
728
+ const { disabled, className } = props;
729
+ const ariaSwitchProps = (0, import_react9.useMemo)(
730
+ () => ({
731
+ ...props,
732
+ "aria-label": "children" in props ? void 0 : props.label,
733
+ isDisabled: props.disabled,
734
+ isSelected: props.checked
735
+ }),
736
+ [props]
737
+ );
738
+ const state = (0, import_react_stately.useToggleState)(ariaSwitchProps);
739
+ const ref = (0, import_react9.useRef)(null);
740
+ const {
741
+ inputProps: { className: _className, type: _type, ...rest }
742
+ } = (0, import_switch.useSwitch)(ariaSwitchProps, state, ref);
743
+ return /* @__PURE__ */ import_react9.default.createElement(Label, { className, "aria-disabled": disabled }, /* @__PURE__ */ import_react9.default.createElement(SwitchInput, { ...rest, ref }), "children" in props ? /* @__PURE__ */ import_react9.default.createElement(LabelInner, null, props.children) : void 0);
744
+ }
745
+ var Label = import_styled_components8.default.label`
746
+ display: inline-grid;
747
+ grid-template-columns: auto 1fr;
748
+ align-items: center;
749
+ cursor: pointer;
750
+ outline: 0;
751
+
752
+ ${theme((o) => o.disabled)}
753
+
754
+ ${import_utils4.disabledSelector} {
755
+ cursor: default;
756
+ }
757
+ `;
758
+ var LabelInner = import_styled_components8.default.div`
759
+ ${theme((o) => [
760
+ o.typography(14).preserveHalfLeading,
761
+ o.font.text2,
762
+ o.margin.left(4)
763
+ ])}
764
+ `;
765
+ var SwitchInput = import_styled_components8.default.input.attrs({
766
+ type: "checkbox"
767
+ })`
768
+ &[type='checkbox'] {
769
+ appearance: none;
770
+ display: inline-flex;
771
+ position: relative;
772
+ box-sizing: border-box;
773
+ width: 28px;
774
+ border: 2px solid transparent;
775
+ transition: box-shadow 0.2s, background-color 0.2s;
776
+ cursor: inherit;
777
+ ${theme((o) => [
778
+ o.borderRadius(16),
779
+ o.height.px(16),
780
+ o.bg.text4.hover.press,
781
+ o.outline.default.focus,
782
+ o.margin.all(0)
783
+ ])}
784
+
785
+ &::after {
786
+ content: '';
787
+ position: absolute;
788
+ display: block;
789
+ top: 0;
790
+ left: 0;
791
+ width: 12px;
792
+ height: 12px;
793
+ transform: translateX(0);
794
+ transition: transform 0.2s;
795
+ ${theme((o) => [o.bg.text5.hover.press, o.borderRadius("oval")])}
796
+ }
797
+
798
+ &:checked {
799
+ ${theme((o) => o.bg.brand.hover.press)}
800
+
801
+ &::after {
802
+ transform: translateX(12px);
803
+ }
804
+ }
805
+ }
806
+ `;
807
+
808
+ // src/components/TextField/index.tsx
809
+ var import_textfield = require("@react-aria/textfield");
810
+ var import_visually_hidden = require("@react-aria/visually-hidden");
811
+ var import_react11 = __toESM(require("react"));
812
+ var import_styled_components10 = __toESM(require("styled-components"));
813
+
814
+ // src/components/FieldLabel/index.tsx
815
+ var import_react10 = __toESM(require("react"));
816
+ var import_styled_components9 = __toESM(require("styled-components"));
817
+ var import_styled8 = require("@charcoal-ui/styled");
818
+ var FieldLabel = import_react10.default.forwardRef(
819
+ function FieldLabel2({
820
+ style,
821
+ className,
822
+ label,
823
+ required = false,
824
+ requiredText,
825
+ subLabel,
826
+ ...labelProps
827
+ }, ref) {
828
+ return /* @__PURE__ */ import_react10.default.createElement(FieldLabelWrapper, { style, className }, /* @__PURE__ */ import_react10.default.createElement(Label2, { ref, ...labelProps }, label), required && /* @__PURE__ */ import_react10.default.createElement(RequiredText, null, requiredText), /* @__PURE__ */ import_react10.default.createElement(SubLabelClickable, null, /* @__PURE__ */ import_react10.default.createElement("span", null, subLabel)));
829
+ }
830
+ );
831
+ var FieldLabel_default = FieldLabel;
832
+ var theme2 = (0, import_styled8.createTheme)(import_styled_components9.default);
833
+ var Label2 = import_styled_components9.default.label`
834
+ ${theme2((o) => [o.typography(14).bold, o.font.text1])}
835
+ `;
836
+ var RequiredText = import_styled_components9.default.span`
837
+ ${theme2((o) => [o.typography(14), o.font.text3])}
838
+ `;
839
+ var SubLabelClickable = import_styled_components9.default.div`
840
+ ${theme2((o) => [
841
+ o.typography(14),
842
+ o.font.text3.hover.press,
843
+ o.outline.default.focus
844
+ ])}
845
+ `;
846
+ var FieldLabelWrapper = import_styled_components9.default.div`
847
+ display: inline-flex;
848
+ align-items: center;
849
+
850
+ > ${RequiredText} {
851
+ ${theme2((o) => o.margin.left(4))}
852
+ }
853
+
854
+ > ${SubLabelClickable} {
855
+ ${theme2((o) => o.margin.left("auto"))}
856
+ }
857
+ `;
858
+
859
+ // src/components/TextField/index.tsx
860
+ var import_styled9 = require("@charcoal-ui/styled");
861
+ var theme3 = (0, import_styled9.createTheme)(import_styled_components10.default);
862
+ function mergeRefs(...refs) {
863
+ return (value) => {
864
+ for (const ref of refs) {
865
+ if (typeof ref === "function") {
866
+ ref(value);
867
+ } else if (ref !== null) {
868
+ ;
869
+ ref.current = value;
870
+ }
871
+ }
872
+ };
873
+ }
874
+ function countCodePointsInString(string) {
875
+ return Array.from(string).length;
876
+ }
877
+ var TextField = import_react11.default.forwardRef(
878
+ function TextField2(props, ref) {
879
+ return props.multiline !== void 0 && props.multiline ? /* @__PURE__ */ import_react11.default.createElement(MultiLineTextField, { ref, ...props }) : /* @__PURE__ */ import_react11.default.createElement(SingleLineTextField, { ref, ...props });
880
+ }
881
+ );
882
+ var TextField_default = TextField;
883
+ var SingleLineTextField = import_react11.default.forwardRef(function SingleLineTextFieldInner({ onChange, ...props }, forwardRef4) {
884
+ const {
885
+ className,
886
+ showLabel = false,
887
+ showCount = false,
888
+ label,
889
+ requiredText,
890
+ subLabel,
891
+ disabled = false,
892
+ required,
893
+ invalid = false,
894
+ assistiveText,
895
+ maxLength,
896
+ prefix = null,
897
+ suffix = null
898
+ } = props;
899
+ const { visuallyHiddenProps } = (0, import_visually_hidden.useVisuallyHidden)();
900
+ const ariaRef = (0, import_react11.useRef)(null);
901
+ const prefixRef = (0, import_react11.useRef)(null);
902
+ const suffixRef = (0, import_react11.useRef)(null);
903
+ const [count, setCount] = (0, import_react11.useState)(countCodePointsInString(props.value ?? ""));
904
+ const [prefixWidth, setPrefixWidth] = (0, import_react11.useState)(0);
905
+ const [suffixWidth, setSuffixWidth] = (0, import_react11.useState)(0);
906
+ const nonControlled = props.value === void 0;
907
+ const handleChange = (0, import_react11.useCallback)(
908
+ (value) => {
909
+ const count2 = countCodePointsInString(value);
910
+ if (maxLength !== void 0 && count2 > maxLength) {
911
+ return;
912
+ }
913
+ if (nonControlled) {
914
+ setCount(count2);
915
+ }
916
+ onChange?.(value);
917
+ },
918
+ [maxLength, nonControlled, onChange]
919
+ );
920
+ (0, import_react11.useEffect)(() => {
921
+ setCount(countCodePointsInString(props.value ?? ""));
922
+ }, [props.value]);
923
+ const { inputProps, labelProps, descriptionProps, errorMessageProps } = (0, import_textfield.useTextField)(
924
+ {
925
+ inputElementType: "input",
926
+ isDisabled: disabled,
927
+ isRequired: required,
928
+ validationState: invalid ? "invalid" : "valid",
929
+ description: !invalid && assistiveText,
930
+ errorMessage: invalid && assistiveText,
931
+ onChange: handleChange,
932
+ ...props
933
+ },
934
+ ariaRef
935
+ );
936
+ (0, import_react11.useEffect)(() => {
937
+ const prefixObserver = new ResizeObserver((entries) => {
938
+ setPrefixWidth(entries[0].contentRect.width);
939
+ });
940
+ const suffixObserver = new ResizeObserver((entries) => {
941
+ setSuffixWidth(entries[0].contentRect.width);
942
+ });
943
+ if (prefixRef.current !== null) {
944
+ prefixObserver.observe(prefixRef.current);
945
+ }
946
+ if (suffixRef.current !== null) {
947
+ suffixObserver.observe(suffixRef.current);
948
+ }
949
+ return () => {
950
+ suffixObserver.disconnect();
951
+ prefixObserver.disconnect();
952
+ };
953
+ }, []);
954
+ return /* @__PURE__ */ import_react11.default.createElement(TextFieldRoot, { className, isDisabled: disabled }, /* @__PURE__ */ import_react11.default.createElement(
955
+ TextFieldLabel,
956
+ {
957
+ label,
958
+ requiredText,
959
+ required,
960
+ subLabel,
961
+ ...labelProps,
962
+ ...!showLabel ? visuallyHiddenProps : {}
963
+ }
964
+ ), /* @__PURE__ */ import_react11.default.createElement(StyledInputContainer, null, /* @__PURE__ */ import_react11.default.createElement(PrefixContainer, { ref: prefixRef }, /* @__PURE__ */ import_react11.default.createElement(Affix, null, prefix)), /* @__PURE__ */ import_react11.default.createElement(
965
+ StyledInput,
966
+ {
967
+ ref: mergeRefs(forwardRef4, ariaRef),
968
+ invalid,
969
+ extraLeftPadding: prefixWidth,
970
+ extraRightPadding: suffixWidth,
971
+ ...inputProps
972
+ }
973
+ ), /* @__PURE__ */ import_react11.default.createElement(SuffixContainer, { ref: suffixRef }, /* @__PURE__ */ import_react11.default.createElement(Affix, null, suffix), showCount && /* @__PURE__ */ import_react11.default.createElement(SingleLineCounter, null, maxLength !== void 0 ? `${count}/${maxLength}` : count))), assistiveText != null && assistiveText.length !== 0 && /* @__PURE__ */ import_react11.default.createElement(
974
+ AssistiveText,
975
+ {
976
+ invalid,
977
+ ...invalid ? errorMessageProps : descriptionProps
978
+ },
979
+ assistiveText
980
+ ));
981
+ });
982
+ var MultiLineTextField = import_react11.default.forwardRef(function MultiLineTextFieldInner({ onChange, ...props }, forwardRef4) {
983
+ const {
984
+ className,
985
+ showCount = false,
986
+ showLabel = false,
987
+ label,
988
+ requiredText,
989
+ subLabel,
990
+ disabled = false,
991
+ required,
992
+ invalid = false,
993
+ assistiveText,
994
+ maxLength,
995
+ autoHeight = false,
996
+ rows: initialRows = 4
997
+ } = props;
998
+ const { visuallyHiddenProps } = (0, import_visually_hidden.useVisuallyHidden)();
999
+ const textareaRef = (0, import_react11.useRef)(null);
1000
+ const ariaRef = (0, import_react11.useRef)(null);
1001
+ const [count, setCount] = (0, import_react11.useState)(countCodePointsInString(props.value ?? ""));
1002
+ const [rows, setRows] = (0, import_react11.useState)(initialRows);
1003
+ const syncHeight = (0, import_react11.useCallback)(
1004
+ (textarea) => {
1005
+ const rows2 = (`${textarea.value}
1006
+ `.match(/\n/gu)?.length ?? 0) || 1;
1007
+ setRows(initialRows <= rows2 ? rows2 : initialRows);
1008
+ },
1009
+ [initialRows]
1010
+ );
1011
+ const nonControlled = props.value === void 0;
1012
+ const handleChange = (0, import_react11.useCallback)(
1013
+ (value) => {
1014
+ const count2 = countCodePointsInString(value);
1015
+ if (maxLength !== void 0 && count2 > maxLength) {
1016
+ return;
1017
+ }
1018
+ if (nonControlled) {
1019
+ setCount(count2);
1020
+ }
1021
+ if (autoHeight && textareaRef.current !== null) {
1022
+ syncHeight(textareaRef.current);
1023
+ }
1024
+ onChange?.(value);
1025
+ },
1026
+ [autoHeight, maxLength, nonControlled, onChange, syncHeight]
1027
+ );
1028
+ (0, import_react11.useEffect)(() => {
1029
+ setCount(countCodePointsInString(props.value ?? ""));
1030
+ }, [props.value]);
1031
+ const { inputProps, labelProps, descriptionProps, errorMessageProps } = (0, import_textfield.useTextField)(
1032
+ {
1033
+ inputElementType: "textarea",
1034
+ isDisabled: disabled,
1035
+ isRequired: required,
1036
+ validationState: invalid ? "invalid" : "valid",
1037
+ description: !invalid && assistiveText,
1038
+ errorMessage: invalid && assistiveText,
1039
+ onChange: handleChange,
1040
+ ...props
1041
+ },
1042
+ ariaRef
1043
+ );
1044
+ (0, import_react11.useEffect)(() => {
1045
+ if (autoHeight && textareaRef.current !== null) {
1046
+ syncHeight(textareaRef.current);
1047
+ }
1048
+ }, [autoHeight, syncHeight]);
1049
+ return /* @__PURE__ */ import_react11.default.createElement(TextFieldRoot, { className, isDisabled: disabled }, /* @__PURE__ */ import_react11.default.createElement(
1050
+ TextFieldLabel,
1051
+ {
1052
+ label,
1053
+ requiredText,
1054
+ required,
1055
+ subLabel,
1056
+ ...labelProps,
1057
+ ...!showLabel ? visuallyHiddenProps : {}
1058
+ }
1059
+ ), /* @__PURE__ */ import_react11.default.createElement(
1060
+ StyledTextareaContainer,
1061
+ {
1062
+ invalid,
1063
+ rows: showCount ? rows + 1 : rows
1064
+ },
1065
+ /* @__PURE__ */ import_react11.default.createElement(
1066
+ StyledTextarea,
1067
+ {
1068
+ ref: mergeRefs(textareaRef, forwardRef4, ariaRef),
1069
+ rows,
1070
+ noBottomPadding: showCount,
1071
+ ...inputProps
1072
+ }
1073
+ ),
1074
+ showCount && /* @__PURE__ */ import_react11.default.createElement(MultiLineCounter, null, maxLength !== void 0 ? `${count}/${maxLength}` : count)
1075
+ ), assistiveText != null && assistiveText.length !== 0 && /* @__PURE__ */ import_react11.default.createElement(
1076
+ AssistiveText,
1077
+ {
1078
+ invalid,
1079
+ ...invalid ? errorMessageProps : descriptionProps
1080
+ },
1081
+ assistiveText
1082
+ ));
1083
+ });
1084
+ var TextFieldRoot = import_styled_components10.default.div`
1085
+ display: flex;
1086
+ flex-direction: column;
1087
+
1088
+ ${(p) => p.isDisabled && { opacity: p.theme.elementEffect.disabled.opacity }}
1089
+ `;
1090
+ var TextFieldLabel = (0, import_styled_components10.default)(FieldLabel_default)`
1091
+ ${theme3((o) => o.margin.bottom(8))}
1092
+ `;
1093
+ var StyledInputContainer = import_styled_components10.default.div`
1094
+ height: 40px;
1095
+ display: grid;
1096
+ position: relative;
1097
+ `;
1098
+ var PrefixContainer = import_styled_components10.default.span`
1099
+ position: absolute;
1100
+ top: 50%;
1101
+ left: 8px;
1102
+ transform: translateY(-50%);
1103
+ `;
1104
+ var SuffixContainer = import_styled_components10.default.span`
1105
+ position: absolute;
1106
+ top: 50%;
1107
+ right: 8px;
1108
+ transform: translateY(-50%);
1109
+
1110
+ display: flex;
1111
+ gap: 8px;
1112
+ `;
1113
+ var Affix = import_styled_components10.default.span`
1114
+ user-select: none;
1115
+
1116
+ ${theme3((o) => [o.typography(14).preserveHalfLeading, o.font.text2])}
1117
+ `;
1118
+ var StyledInput = import_styled_components10.default.input`
1119
+ border: none;
1120
+ box-sizing: border-box;
1121
+ outline: none;
1122
+ font-family: inherit;
1123
+
1124
+ /* Prevent zooming for iOS Safari */
1125
+ transform-origin: top left;
1126
+ transform: scale(0.875);
1127
+ width: calc(100% / 0.875);
1128
+ height: calc(100% / 0.875);
1129
+ font-size: calc(14px / 0.875);
1130
+ line-height: calc(22px / 0.875);
1131
+ padding-left: calc((8px + ${(p) => p.extraLeftPadding}px) / 0.875);
1132
+ padding-right: calc((8px + ${(p) => p.extraRightPadding}px) / 0.875);
1133
+ border-radius: calc(4px / 0.875);
1134
+
1135
+ /* Display box-shadow for iOS Safari */
1136
+ appearance: none;
1137
+
1138
+ ${(p) => theme3((o) => [
1139
+ o.bg.surface3.hover,
1140
+ o.outline.default.focus,
1141
+ p.invalid && o.outline.assertive,
1142
+ o.font.text2
1143
+ ])}
1144
+
1145
+ &::placeholder {
1146
+ ${theme3((o) => o.font.text3)}
1147
+ }
1148
+ `;
1149
+ var StyledTextareaContainer = import_styled_components10.default.div`
1150
+ position: relative;
1151
+ overflow: hidden;
1152
+ padding: 0 8px;
1153
+
1154
+ ${(p) => theme3((o) => [
1155
+ o.bg.surface3.hover,
1156
+ p.invalid && o.outline.assertive,
1157
+ o.font.text2,
1158
+ o.borderRadius(4)
1159
+ ])}
1160
+
1161
+ &:focus-within {
1162
+ ${(p) => theme3((o) => p.invalid ? o.outline.assertive : o.outline.default)}
1163
+ }
1164
+
1165
+ ${({ rows }) => import_styled_components10.css`
1166
+ height: calc(22px * ${rows} + 18px);
1167
+ `};
1168
+ `;
1169
+ var StyledTextarea = import_styled_components10.default.textarea`
1170
+ border: none;
1171
+ outline: none;
1172
+ resize: none;
1173
+ font-family: inherit;
1174
+ color: inherit;
1175
+
1176
+ /* Prevent zooming for iOS Safari */
1177
+ transform-origin: top left;
1178
+ transform: scale(0.875);
1179
+ width: calc(100% / 0.875);
1180
+ font-size: calc(14px / 0.875);
1181
+ line-height: calc(22px / 0.875);
1182
+ padding: calc(9px / 0.875) 0 ${(p) => p.noBottomPadding ? 0 : ""};
1183
+
1184
+ ${({ rows = 1 }) => import_styled_components10.css`
1185
+ height: calc(22px / 0.875 * ${rows});
1186
+ `};
1187
+
1188
+ /* Display box-shadow for iOS Safari */
1189
+ appearance: none;
1190
+
1191
+ background: none;
1192
+
1193
+ &::placeholder {
1194
+ ${theme3((o) => o.font.text3)}
1195
+ }
1196
+
1197
+ /* Hide scrollbar for Chrome, Safari and Opera */
1198
+ &::-webkit-scrollbar {
1199
+ display: none;
1200
+ }
1201
+ /* Hide scrollbar for IE, Edge and Firefox */
1202
+ -ms-overflow-style: none; /* IE and Edge */
1203
+ scrollbar-width: none; /* Firefox */
1204
+ `;
1205
+ var SingleLineCounter = import_styled_components10.default.span`
1206
+ ${theme3((o) => [o.typography(14).preserveHalfLeading, o.font.text3])}
1207
+ `;
1208
+ var MultiLineCounter = import_styled_components10.default.span`
1209
+ position: absolute;
1210
+ bottom: 9px;
1211
+ right: 8px;
1212
+
1213
+ ${theme3((o) => [o.typography(14).preserveHalfLeading, o.font.text3])}
1214
+ `;
1215
+ var AssistiveText = import_styled_components10.default.p`
1216
+ ${(p) => theme3((o) => [
1217
+ o.typography(14),
1218
+ o.margin.top(8),
1219
+ o.margin.bottom(0),
1220
+ o.font[p.invalid ? "assertive" : "text1"]
1221
+ ])}
1222
+ `;
1223
+
1224
+ // src/components/Icon/index.tsx
1225
+ var import_react12 = __toESM(require("react"));
1226
+ var import_icons = require("@charcoal-ui/icons");
1227
+ var Icon = import_react12.default.forwardRef(function IconInner({ name, scale, unsafeNonGuidelineScale, className, ...rest }, ref) {
1228
+ return /* @__PURE__ */ import_react12.default.createElement(
1229
+ "pixiv-icon",
1230
+ {
1231
+ ref,
1232
+ name,
1233
+ scale,
1234
+ "unsafe-non-guideline-scale": unsafeNonGuidelineScale,
1235
+ class: className,
1236
+ ...rest
1237
+ }
1238
+ );
1239
+ });
1240
+ var Icon_default = Icon;
1241
+
1242
+ // src/components/Modal/index.tsx
1243
+ var import_react13 = __toESM(require("react"));
1244
+ var import_overlays2 = require("@react-aria/overlays");
1245
+ var import_styled_components11 = __toESM(require("styled-components"));
1246
+ var import_focus = require("@react-aria/focus");
1247
+ var import_dialog = require("@react-aria/dialog");
1248
+
1249
+ // ../foundation/src/grid.ts
1250
+ var COLUMN_UNIT = 80;
1251
+ var GUTTER_UNIT = 24;
1252
+ function columnSystem(span, column, gutter) {
1253
+ return span * column + (span - 1) * gutter;
1254
+ }
1255
+
1256
+ // src/components/Modal/index.tsx
1257
+ var import_utils5 = require("@charcoal-ui/utils");
1258
+ var import_styled11 = require("@charcoal-ui/styled");
1259
+ var import_react_spring = require("react-spring");
1260
+ var DEFAULT_Z_INDEX = 10;
1261
+ function Modal({
1262
+ children,
1263
+ zIndex = DEFAULT_Z_INDEX,
1264
+ portalContainer,
1265
+ ...props
1266
+ }) {
1267
+ const {
1268
+ title,
1269
+ size = "M",
1270
+ bottomSheet = false,
1271
+ isDismissable,
1272
+ onClose,
1273
+ isOpen = false
1274
+ } = props;
1275
+ const ref = (0, import_react13.useRef)(null);
1276
+ const { overlayProps, underlayProps } = (0, import_overlays2.useOverlay)(props, ref);
1277
+ const { modalProps } = (0, import_overlays2.useModalOverlay)(
1278
+ props,
1279
+ {
1280
+ close: onClose,
1281
+ isOpen,
1282
+ open: () => {
1283
+ },
1284
+ setOpen: () => {
1285
+ },
1286
+ toggle: () => {
1287
+ }
1288
+ },
1289
+ ref
1290
+ );
1291
+ const { dialogProps, titleProps } = (0, import_dialog.useDialog)(props, ref);
1292
+ const theme4 = (0, import_styled_components11.useTheme)();
1293
+ const isMobile = (0, import_styled11.useMedia)((0, import_utils5.maxWidth)(theme4.breakpoint.screen1)) ?? false;
1294
+ const transitionEnabled = isMobile && bottomSheet !== false;
1295
+ const transition = (0, import_react_spring.useTransition)(isOpen, {
1296
+ from: {
1297
+ transform: "translateY(100%)",
1298
+ backgroundColor: "rgba(0, 0, 0, 0)"
1299
+ },
1300
+ enter: {
1301
+ transform: "translateY(0%)",
1302
+ backgroundColor: "rgba(0, 0, 0, 0.4)"
1303
+ },
1304
+ leave: {
1305
+ transform: "translateY(100%)",
1306
+ backgroundColor: "rgba(0, 0, 0, 0)"
1307
+ },
1308
+ config: transitionEnabled ? { duration: 400, easing: import_react_spring.easings.easeOutQuart } : { duration: 0 }
1309
+ });
1310
+ const showDismiss = !isMobile || bottomSheet !== true;
1311
+ return transition(
1312
+ ({ backgroundColor, transform }, item) => item && /* @__PURE__ */ import_react13.default.createElement(import_overlays2.Overlay, { portalContainer }, /* @__PURE__ */ import_react13.default.createElement(
1313
+ ModalBackground,
1314
+ {
1315
+ zIndex,
1316
+ ...underlayProps,
1317
+ style: transitionEnabled ? { backgroundColor } : {}
1318
+ },
1319
+ /* @__PURE__ */ import_react13.default.createElement(import_focus.FocusScope, { contain: true, restoreFocus: true, autoFocus: true }, /* @__PURE__ */ import_react13.default.createElement(
1320
+ ModalDialog,
1321
+ {
1322
+ ref,
1323
+ ...overlayProps,
1324
+ ...modalProps,
1325
+ ...dialogProps,
1326
+ style: transitionEnabled ? { transform } : {},
1327
+ size,
1328
+ bottomSheet
1329
+ },
1330
+ /* @__PURE__ */ import_react13.default.createElement(
1331
+ ModalContext.Provider,
1332
+ {
1333
+ value: { titleProps, title, close: onClose, showDismiss }
1334
+ },
1335
+ children,
1336
+ isDismissable === true && /* @__PURE__ */ import_react13.default.createElement(
1337
+ ModalCrossButton,
1338
+ {
1339
+ size: "S",
1340
+ icon: "24/Close",
1341
+ onClick: onClose
1342
+ }
1343
+ )
1344
+ )
1345
+ ))
1346
+ ))
1347
+ );
1348
+ }
1349
+ var ModalContext = import_react13.default.createContext({
1350
+ titleProps: {},
1351
+ title: "",
1352
+ close: void 0,
1353
+ showDismiss: true
1354
+ });
1355
+ var ModalBackground = (0, import_react_spring.animated)(import_styled_components11.default.div`
1356
+ z-index: ${({ zIndex }) => zIndex};
1357
+ position: fixed;
1358
+ top: 0;
1359
+ left: 0;
1360
+ width: 100%;
1361
+ height: 100%;
1362
+
1363
+ ${theme((o) => [o.bg.surface4])}
1364
+ `);
1365
+ var ModalDialog = (0, import_react_spring.animated)(import_styled_components11.default.div`
1366
+ position: absolute;
1367
+ top: 50%;
1368
+ left: 50%;
1369
+ transform: translate(-50%, -50%);
1370
+ width: ${(p) => p.size === "S" ? columnSystem(3, COLUMN_UNIT, GUTTER_UNIT) + GUTTER_UNIT * 2 : p.size === "M" ? columnSystem(4, COLUMN_UNIT, GUTTER_UNIT) + GUTTER_UNIT * 2 : p.size === "L" ? columnSystem(6, COLUMN_UNIT, GUTTER_UNIT) + GUTTER_UNIT * 2 : unreachable(p.size)}px;
1371
+
1372
+ ${theme((o) => [o.bg.background1, o.borderRadius(24)])}
1373
+
1374
+ @media ${({ theme: theme4 }) => (0, import_utils5.maxWidth)(theme4.breakpoint.screen1)} {
1375
+ ${(p) => p.bottomSheet === "full" ? import_styled_components11.css`
1376
+ top: auto;
1377
+ bottom: 0;
1378
+ left: 0;
1379
+ transform: none;
1380
+ border-radius: 0;
1381
+ width: 100%;
1382
+ height: 100%;
1383
+ ` : p.bottomSheet ? import_styled_components11.css`
1384
+ top: auto;
1385
+ bottom: 0;
1386
+ left: 0;
1387
+ transform: none;
1388
+ border-radius: 0;
1389
+ width: 100%;
1390
+ ` : import_styled_components11.css`
1391
+ width: calc(100% - 48px);
1392
+ `}
1393
+ }
1394
+ `);
1395
+ var ModalCrossButton = (0, import_styled_components11.default)(IconButton_default)`
1396
+ position: absolute;
1397
+ top: 8px;
1398
+ right: 8px;
1399
+
1400
+ ${theme((o) => [o.font.text3.hover.press])}
1401
+ `;
1402
+ function ModalTitle(props) {
1403
+ const { titleProps, title } = (0, import_react13.useContext)(ModalContext);
1404
+ return /* @__PURE__ */ import_react13.default.createElement(ModalHeading, { ...titleProps, ...props }, title);
1405
+ }
1406
+ var ModalHeading = import_styled_components11.default.h3`
1407
+ margin: 0;
1408
+ font-weight: inherit;
1409
+ font-size: inherit;
1410
+ `;
1411
+
1412
+ // src/components/Modal/ModalPlumbing.tsx
1413
+ var import_react14 = __toESM(require("react"));
1414
+ var import_styled_components12 = __toESM(require("styled-components"));
1415
+ var import_utils6 = require("@charcoal-ui/utils");
1416
+ function ModalHeader() {
1417
+ return /* @__PURE__ */ import_react14.default.createElement(ModalHeaderRoot, null, /* @__PURE__ */ import_react14.default.createElement(StyledModalTitle, null));
1418
+ }
1419
+ var ModalHeaderRoot = import_styled_components12.default.div`
1420
+ height: 64px;
1421
+ display: grid;
1422
+ align-content: center;
1423
+ justify-content: center;
1424
+ `;
1425
+ var StyledModalTitle = (0, import_styled_components12.default)(ModalTitle)`
1426
+ ${theme((o) => [o.font.text1, o.typography(16).bold])}
1427
+ `;
1428
+ var ModalAlign = import_styled_components12.default.div`
1429
+ ${theme((o) => [o.padding.horizontal(24)])}
1430
+
1431
+ @media ${({ theme: theme4 }) => (0, import_utils6.maxWidth)(theme4.breakpoint.screen1)} {
1432
+ ${theme((o) => [o.padding.horizontal(16)])}
1433
+ }
1434
+ `;
1435
+ var ModalBody = import_styled_components12.default.div`
1436
+ ${theme((o) => [o.padding.bottom(40)])}
1437
+ `;
1438
+ var ModalButtons = import_styled_components12.default.div`
1439
+ display: grid;
1440
+ grid-auto-flow: row;
1441
+ grid-row-gap: 8px;
1442
+ ${theme((o) => [o.padding.horizontal(24).top(16)])}
1443
+
1444
+ @media ${({ theme: theme4 }) => (0, import_utils6.maxWidth)(theme4.breakpoint.screen1)} {
1445
+ ${theme((o) => [o.padding.horizontal(16)])}
1446
+ }
1447
+ `;
1448
+
1449
+ // src/components/LoadingSpinner/index.tsx
1450
+ var import_react15 = __toESM(require("react"));
1451
+ var import_styled_components13 = __toESM(require("styled-components"));
1452
+ function LoadingSpinner({
1453
+ size = 48,
1454
+ padding = 16,
1455
+ transparent = false
1456
+ }) {
1457
+ return /* @__PURE__ */ import_react15.default.createElement(LoadingSpinnerRoot, { size, padding, transparent }, /* @__PURE__ */ import_react15.default.createElement(LoadingSpinnerIcon, null));
1458
+ }
1459
+ var LoadingSpinnerRoot = import_styled_components13.default.div.attrs({ role: "progressbar" })`
1460
+ margin: auto;
1461
+ padding: ${(props) => props.padding}px;
1462
+ border-radius: 8px;
1463
+ font-size: ${(props) => props.size}px;
1464
+ width: ${(props) => props.size}px;
1465
+ height: ${(props) => props.size}px;
1466
+ opacity: 0.84;
1467
+ ${({ transparent }) => theme((o) => [
1468
+ o.font.text4,
1469
+ transparent ? o.bg.transparent : o.bg.background1
1470
+ ])}
1471
+ `;
1472
+ var scaleout = import_styled_components13.keyframes`
1473
+ from {
1474
+ transform: scale(0);
1475
+ opacity: 1;
1476
+ }
1477
+
1478
+ to {
1479
+ transform: scale(1);
1480
+ opacity: 0;
1481
+ }
1482
+ `;
1483
+ var Icon2 = import_styled_components13.default.div.attrs({ role: "presentation" })`
1484
+ width: 1em;
1485
+ height: 1em;
1486
+ border-radius: 1em;
1487
+ background-color: currentColor;
1488
+ animation: ${scaleout} 1s both ease-out;
1489
+ animation-iteration-count: ${(p) => p.once ? 1 : "infinite"};
1490
+
1491
+ &[data-reset-animation] {
1492
+ animation: none;
1493
+ }
1494
+ `;
1495
+ var LoadingSpinnerIcon = import_react15.default.forwardRef(function LoadingSpinnerIcon2({ once = false }, ref) {
1496
+ const iconRef = (0, import_react15.useRef)(null);
1497
+ (0, import_react15.useImperativeHandle)(ref, () => ({
1498
+ restart: () => {
1499
+ if (!iconRef.current) {
1500
+ return;
1501
+ }
1502
+ iconRef.current.dataset.resetAnimation = "true";
1503
+ void iconRef.current.offsetWidth;
1504
+ delete iconRef.current.dataset.resetAnimation;
1505
+ }
1506
+ }));
1507
+ return /* @__PURE__ */ import_react15.default.createElement(Icon2, { ref: iconRef, once });
1508
+ });
1509
+
1510
+ // src/components/DropdownSelector/index.tsx
1511
+ var import_react18 = __toESM(require("react"));
1512
+ var import_styled_components16 = __toESM(require("styled-components"));
1513
+ var import_react_stately2 = require("react-stately");
1514
+ var import_utils9 = require("@charcoal-ui/utils");
1515
+ var import_visually_hidden2 = require("@react-aria/visually-hidden");
1516
+ var import_select = require("@react-aria/select");
1517
+ var import_button = require("@react-aria/button");
1518
+
1519
+ // src/components/DropdownSelector/Listbox.tsx
1520
+ var import_react16 = __toESM(require("react"));
1521
+ var import_styled_components14 = __toESM(require("styled-components"));
1522
+ var import_listbox = require("@react-aria/listbox");
1523
+ var import_utils7 = require("@react-aria/utils");
1524
+ var import_focus2 = require("@react-aria/focus");
1525
+ var import_utils8 = require("@charcoal-ui/utils");
1526
+ var Listbox = ({
1527
+ state,
1528
+ mode = "default",
1529
+ ...props
1530
+ }) => {
1531
+ const ref = (0, import_react16.useRef)(null);
1532
+ const { listBoxProps } = (0, import_listbox.useListBox)(props, state, ref);
1533
+ const collection = (0, import_react16.useMemo)(
1534
+ () => [...state.collection].map((node, index, self) => ({
1535
+ node,
1536
+ first: index === 0,
1537
+ last: index === self.length - 1
1538
+ })),
1539
+ [state.collection]
1540
+ );
1541
+ return /* @__PURE__ */ import_react16.default.createElement(ListboxRoot, { ref, ...listBoxProps }, collection.map(({ node, last }) => /* @__PURE__ */ import_react16.default.createElement(import_react16.Fragment, { key: node.key }, /* @__PURE__ */ import_react16.default.createElement(Option, { item: node, state, mode }), !last && mode === "separator" && /* @__PURE__ */ import_react16.default.createElement(Divider, null))));
1542
+ };
1543
+ var Listbox_default = (0, import_react16.memo)(Listbox);
1544
+ var ListboxRoot = import_styled_components14.default.ul`
1545
+ padding-left: 0;
1546
+ margin: 0;
1547
+ box-sizing: border-box;
1548
+ list-style: none;
1549
+ overflow: auto;
1550
+ max-height: inherit;
1551
+
1552
+ ${theme((o) => [
1553
+ o.bg.background1,
1554
+ o.border.default,
1555
+ o.borderRadius(8),
1556
+ o.outline.default.focus
1557
+ ])}
1558
+ `;
1559
+ var Divider = import_styled_components14.default.div.attrs({ role: "separator" })`
1560
+ display: flex;
1561
+ ${theme((o) => [o.padding.horizontal(8)])}
1562
+
1563
+ &:before {
1564
+ content: '';
1565
+ display: block;
1566
+ width: 100%;
1567
+ height: 1px;
1568
+ background: #00000014;
1569
+ }
1570
+ `;
1571
+ var Option = ({ item, state, mode }) => {
1572
+ const ref = (0, import_react16.useRef)(null);
1573
+ const { optionProps, isSelected } = (0, import_listbox.useOption)(item, state, ref);
1574
+ const { focusProps } = (0, import_focus2.useFocusRing)();
1575
+ return /* @__PURE__ */ import_react16.default.createElement(OptionRoot, { ...(0, import_utils7.mergeProps)(optionProps, focusProps), ref, mode }, isSelected && /* @__PURE__ */ import_react16.default.createElement(OptionCheckIcon, { name: "16/Check" }), /* @__PURE__ */ import_react16.default.createElement(OptionText, { isSelected }, item.rendered));
1576
+ };
1577
+ var OptionRoot = import_styled_components14.default.li`
1578
+ display: flex;
1579
+ align-items: center;
1580
+ gap: ${({ theme: theme4 }) => (0, import_utils8.px)(theme4.spacing[4])};
1581
+ height: 40px;
1582
+ cursor: pointer;
1583
+ outline: none;
1584
+
1585
+ ${({ mode }) => theme((o) => [
1586
+ o.padding.horizontal(8),
1587
+ mode === "separator" && o.padding.vertical(4)
1588
+ ])}
1589
+
1590
+ &:focus {
1591
+ ${theme((o) => [o.bg.surface3])}
1592
+ }
1593
+ `;
1594
+ var OptionCheckIcon = (0, import_styled_components14.default)(Icon_default)`
1595
+ ${theme((o) => [o.font.text2])}
1596
+ `;
1597
+ var OptionText = import_styled_components14.default.span`
1598
+ display: block;
1599
+ ${({ isSelected }) => theme((o) => [
1600
+ o.typography(14),
1601
+ o.font.text2,
1602
+ isSelected ? void 0 : o.margin.left(16),
1603
+ isSelected ? void 0 : o.padding.left(4)
1604
+ ])}
1605
+ `;
1606
+
1607
+ // src/components/DropdownSelector/DropdownPopover.tsx
1608
+ var import_react17 = __toESM(require("react"));
1609
+ var import_overlays3 = require("@react-aria/overlays");
1610
+ var import_styled_components15 = __toESM(require("styled-components"));
1611
+ var DropdownPopoverDiv = import_styled_components15.default.div`
1612
+ width: 100%;
1613
+ ${theme((o) => o.margin.top(4).bottom(4))}
1614
+ `;
1615
+ function DropdownPopover({ children, state, ...props }) {
1616
+ const ref = (0, import_react17.useRef)(null);
1617
+ const { popoverProps, underlayProps } = (0, import_overlays3.usePopover)(
1618
+ {
1619
+ ...props,
1620
+ popoverRef: ref,
1621
+ containerPadding: 0
1622
+ },
1623
+ state
1624
+ );
1625
+ (0, import_react17.useEffect)(() => {
1626
+ if (ref.current && props.triggerRef.current) {
1627
+ ref.current.style.width = `${props.triggerRef.current.clientWidth}px`;
1628
+ }
1629
+ }, [props.triggerRef]);
1630
+ (0, import_react17.useEffect)(() => {
1631
+ if (state.isOpen && props.value !== void 0) {
1632
+ window.requestAnimationFrame(() => {
1633
+ if (props.value === void 0)
1634
+ return;
1635
+ const windowScrollY = window.scrollY;
1636
+ const windowScrollX = window.scrollX;
1637
+ const selectedElement = document.querySelector(
1638
+ `[data-key="${props.value.toString()}"]`
1639
+ );
1640
+ selectedElement?.scrollIntoView({ block: "center" });
1641
+ window.scrollTo(windowScrollX, windowScrollY);
1642
+ });
1643
+ }
1644
+ }, [props.value, state.isOpen]);
1645
+ return /* @__PURE__ */ import_react17.default.createElement(import_overlays3.Overlay, null, /* @__PURE__ */ import_react17.default.createElement("div", { ...underlayProps, style: { position: "fixed", inset: 0 } }), /* @__PURE__ */ import_react17.default.createElement(DropdownPopoverDiv, { ...popoverProps, ref }, /* @__PURE__ */ import_react17.default.createElement(import_overlays3.DismissButton, { onDismiss: () => state.close() }), children, /* @__PURE__ */ import_react17.default.createElement(import_overlays3.DismissButton, { onDismiss: () => state.close() })));
1646
+ }
1647
+
1648
+ // src/components/DropdownSelector/index.tsx
1649
+ var DropdownSelector = ({
1650
+ open,
1651
+ className,
1652
+ label = "",
1653
+ requiredText = "",
1654
+ subLabel,
1655
+ assertiveText,
1656
+ autoComplete,
1657
+ invalid = false,
1658
+ disabled = false,
1659
+ required = false,
1660
+ showLabel = false,
1661
+ mode = "default",
1662
+ ...props
1663
+ }) => {
1664
+ const { visuallyHiddenProps } = (0, import_visually_hidden2.useVisuallyHidden)();
1665
+ const triggerRef = (0, import_react18.useRef)(null);
1666
+ const selectProps = (0, import_react18.useMemo)(
1667
+ () => ({
1668
+ ...props,
1669
+ label,
1670
+ isOpen: open,
1671
+ isDisabled: disabled,
1672
+ isRequired: required,
1673
+ errorMessage: invalid && assertiveText,
1674
+ validationState: invalid ? "invalid" : "valid",
1675
+ onSelectionChange: props.onChange,
1676
+ selectedKey: props.value,
1677
+ defaultSelectedKey: props.defaultValue
1678
+ }),
1679
+ [assertiveText, disabled, invalid, label, open, props, required]
1680
+ );
1681
+ const state = (0, import_react_stately2.useSelectState)(selectProps);
1682
+ const {
1683
+ labelProps,
1684
+ triggerProps,
1685
+ valueProps,
1686
+ menuProps,
1687
+ errorMessageProps,
1688
+ descriptionProps
1689
+ } = (0, import_select.useSelect)(selectProps, state, triggerRef);
1690
+ const { buttonProps } = (0, import_button.useButton)(triggerProps, triggerRef);
1691
+ const hasAssertiveText = assertiveText !== void 0 && assertiveText.length > 0;
1692
+ return /* @__PURE__ */ import_react18.default.createElement(DropdownSelectorRoot, { "aria-disabled": disabled, className }, /* @__PURE__ */ import_react18.default.createElement(
1693
+ DropdownFieldLabel,
1694
+ {
1695
+ label,
1696
+ required,
1697
+ requiredText,
1698
+ subLabel,
1699
+ ...labelProps,
1700
+ ...!showLabel ? visuallyHiddenProps : {}
1701
+ }
1702
+ ), /* @__PURE__ */ import_react18.default.createElement(
1703
+ import_select.HiddenSelect,
1704
+ {
1705
+ state,
1706
+ triggerRef,
1707
+ label,
1708
+ name: props.name,
1709
+ isDisabled: disabled,
1710
+ autoComplete
1711
+ }
1712
+ ), /* @__PURE__ */ import_react18.default.createElement(DropdownButtonWrapper, null, /* @__PURE__ */ import_react18.default.createElement(DropdownButton, { ...buttonProps, ref: triggerRef, invalid }, /* @__PURE__ */ import_react18.default.createElement(DropdownButtonText, { ...valueProps }, state.selectedItem ? state.selectedItem.rendered : props.placeholder), /* @__PURE__ */ import_react18.default.createElement(DropdownButtonIcon, { name: "16/Menu" })), state.isOpen && /* @__PURE__ */ import_react18.default.createElement(
1713
+ DropdownPopover,
1714
+ {
1715
+ state,
1716
+ triggerRef,
1717
+ value: props.value ?? props.defaultValue
1718
+ },
1719
+ /* @__PURE__ */ import_react18.default.createElement(Listbox_default, { ...menuProps, state, mode })
1720
+ )), hasAssertiveText && /* @__PURE__ */ import_react18.default.createElement(
1721
+ AssertiveText,
1722
+ {
1723
+ invalid,
1724
+ ...invalid ? errorMessageProps : descriptionProps
1725
+ },
1726
+ assertiveText
1727
+ ));
1728
+ };
1729
+ var DropdownSelector_default = DropdownSelector;
1730
+ var DropdownSelectorItem = import_react_stately2.Item;
1731
+ var DropdownSelectorRoot = import_styled_components16.default.div`
1732
+ position: relative;
1733
+ display: inline-block;
1734
+ width: 100%;
1735
+
1736
+ ${import_utils9.disabledSelector} {
1737
+ cursor: default;
1738
+ ${theme((o) => o.disabled)}
1739
+ }
1740
+ `;
1741
+ var DropdownFieldLabel = (0, import_styled_components16.default)(FieldLabel_default)`
1742
+ width: 100%;
1743
+
1744
+ ${theme((o) => o.margin.bottom(8))}
1745
+ `;
1746
+ var DropdownButtonWrapper = import_styled_components16.default.div`
1747
+ position: relative;
1748
+ `;
1749
+ var DropdownButton = import_styled_components16.default.button`
1750
+ display: flex;
1751
+ justify-content: space-between;
1752
+ align-items: center;
1753
+
1754
+ height: 40px;
1755
+ width: 100%;
1756
+ box-sizing: border-box;
1757
+ cursor: pointer;
1758
+
1759
+ ${import_utils9.disabledSelector} {
1760
+ cursor: default;
1761
+ }
1762
+
1763
+ ${({ invalid }) => theme((o) => [
1764
+ o.border.default,
1765
+ o.padding.horizontal(8),
1766
+ o.outline.default.focus,
1767
+ o.bg.surface3,
1768
+ o.borderRadius(4),
1769
+ invalid && o.outline.assertive
1770
+ ])}
1771
+ `;
1772
+ var DropdownButtonText = import_styled_components16.default.span`
1773
+ text-align: left;
1774
+
1775
+ ${theme((o) => [o.typography(14), o.font.text2])}
1776
+ `;
1777
+ var DropdownButtonIcon = (0, import_styled_components16.default)(Icon_default)`
1778
+ ${theme((o) => [o.font.text2])}
1779
+ `;
1780
+ var AssertiveText = import_styled_components16.default.div`
1781
+ ${({ invalid }) => theme((o) => [
1782
+ o.typography(14),
1783
+ o.margin.top(8),
1784
+ invalid ? o.font.assertive : o.font.text2
1785
+ ])}
1786
+ `;
1787
+
1788
+ // src/components/SegmentedControl/index.tsx
1789
+ var import_react20 = __toESM(require("react"));
1790
+ var import_react_stately3 = require("react-stately");
1791
+ var import_radio = require("@react-aria/radio");
1792
+ var import_styled_components17 = __toESM(require("styled-components"));
1793
+ var import_utils10 = require("@charcoal-ui/utils");
1794
+
1795
+ // src/components/SegmentedControl/RadioGroupContext.tsx
1796
+ var import_react19 = __toESM(require("react"));
1797
+ var RadioContext = (0, import_react19.createContext)(null);
1798
+ var RadioProvider = ({
1799
+ value,
1800
+ children
1801
+ }) => {
1802
+ return /* @__PURE__ */ import_react19.default.createElement(RadioContext.Provider, { value }, children);
1803
+ };
1804
+ var useRadioContext = () => {
1805
+ const state = (0, import_react19.useContext)(RadioContext);
1806
+ if (state === null)
1807
+ throw new Error("`<RadioProvider>` is not likely mounted.");
1808
+ return state;
1809
+ };
1810
+
1811
+ // src/components/SegmentedControl/index.tsx
1812
+ var SegmentedControl = (0, import_react20.forwardRef)(
1813
+ function SegmentedControlInner(props, ref) {
1814
+ const ariaRadioGroupProps = (0, import_react20.useMemo)(
1815
+ () => ({
1816
+ ...props,
1817
+ isDisabled: props.disabled,
1818
+ isReadOnly: props.readonly,
1819
+ isRequired: props.required
1820
+ }),
1821
+ [props]
1822
+ );
1823
+ const state = (0, import_react_stately3.useRadioGroupState)(ariaRadioGroupProps);
1824
+ const { radioGroupProps } = (0, import_radio.useRadioGroup)(ariaRadioGroupProps, state);
1825
+ const segmentedControlItems = (0, import_react20.useMemo)(() => {
1826
+ return props.data.map(
1827
+ (d) => typeof d === "string" ? { value: d, label: d } : d
1828
+ );
1829
+ }, [props.data]);
1830
+ return /* @__PURE__ */ import_react20.default.createElement(SegmentedControlRoot, { ref, ...radioGroupProps }, /* @__PURE__ */ import_react20.default.createElement(RadioProvider, { value: state }, segmentedControlItems.map((item) => /* @__PURE__ */ import_react20.default.createElement(
1831
+ Segmented,
1832
+ {
1833
+ key: item.value,
1834
+ value: item.value,
1835
+ disabled: item.disabled
1836
+ },
1837
+ item.label
1838
+ ))));
1839
+ }
1840
+ );
1841
+ var SegmentedControl_default = (0, import_react20.memo)(SegmentedControl);
1842
+ var Segmented = ({ children, ...props }) => {
1843
+ const state = useRadioContext();
1844
+ const ref = (0, import_react20.useRef)(null);
1845
+ const ariaRadioProps = (0, import_react20.useMemo)(
1846
+ () => ({ ...props, isDisabled: props.disabled }),
1847
+ [props]
1848
+ );
1849
+ const { inputProps, isDisabled, isSelected } = (0, import_radio.useRadio)(
1850
+ ariaRadioProps,
1851
+ state,
1852
+ ref
1853
+ );
1854
+ return /* @__PURE__ */ import_react20.default.createElement(
1855
+ SegmentedRoot,
1856
+ {
1857
+ "aria-disabled": isDisabled || state.isReadOnly,
1858
+ checked: isSelected
1859
+ },
1860
+ /* @__PURE__ */ import_react20.default.createElement(SegmentedInput, { ...inputProps, ref }),
1861
+ /* @__PURE__ */ import_react20.default.createElement(RadioLabel2, null, /* @__PURE__ */ import_react20.default.createElement(SegmentedLabelInner, null, children))
1862
+ );
1863
+ };
1864
+ var SegmentedControlRoot = import_styled_components17.default.div`
1865
+ display: inline-flex;
1866
+ align-items: center;
1867
+
1868
+ ${theme((o) => [o.bg.surface3, o.borderRadius(16)])}
1869
+ `;
1870
+ var SegmentedRoot = import_styled_components17.default.label`
1871
+ position: relative;
1872
+ display: flex;
1873
+ align-items: center;
1874
+ cursor: pointer;
1875
+ height: 32px;
1876
+
1877
+ ${import_utils10.disabledSelector} {
1878
+ cursor: default;
1879
+ }
1880
+
1881
+ ${({ checked }) => theme((o) => [
1882
+ o.padding.horizontal(16),
1883
+ o.borderRadius(16),
1884
+ o.disabled,
1885
+ checked === true && o.bg.brand,
1886
+ checked === true ? o.font.text5 : o.font.text2
1887
+ ])}
1888
+ `;
1889
+ var SegmentedInput = import_styled_components17.default.input`
1890
+ position: absolute;
1891
+
1892
+ height: 0px;
1893
+ width: 0px;
1894
+ padding: 0;
1895
+ margin: 0;
1896
+
1897
+ appearance: none;
1898
+ box-sizing: border-box;
1899
+ overflow: hidden;
1900
+ white-space: nowrap;
1901
+ opacity: 0;
1902
+ `;
1903
+ var RadioLabel2 = import_styled_components17.default.div`
1904
+ background: transparent;
1905
+ display: flex;
1906
+ align-items: center;
1907
+ height: 22px;
1908
+ `;
1909
+ var SegmentedLabelInner = import_styled_components17.default.div`
1910
+ ${theme((o) => [o.typography(14)])}
1911
+ `;
1912
+
1913
+ // src/components/Checkbox/index.tsx
1914
+ var import_react21 = __toESM(require("react"));
1915
+ var import_styled_components18 = __toESM(require("styled-components"));
1916
+ var import_checkbox = require("@react-aria/checkbox");
1917
+ var import_utils11 = require("@react-aria/utils");
1918
+ var import_react_stately4 = require("react-stately");
1919
+ var import_utils12 = require("@charcoal-ui/utils");
1920
+ var Checkbox = (0, import_react21.forwardRef)(
1921
+ function CheckboxInner(props, ref) {
1922
+ const ariaCheckboxProps = (0, import_react21.useMemo)(
1923
+ () => ({
1924
+ ...props,
1925
+ isSelected: props.checked,
1926
+ defaultSelected: props.defaultChecked,
1927
+ "aria-label": "children" in props ? void 0 : props.label,
1928
+ isDisabled: props.disabled
1929
+ }),
1930
+ [props]
1931
+ );
1932
+ const state = (0, import_react_stately4.useToggleState)(ariaCheckboxProps);
1933
+ const objectRef = (0, import_utils11.useObjectRef)(ref);
1934
+ const { inputProps } = (0, import_checkbox.useCheckbox)(ariaCheckboxProps, state, objectRef);
1935
+ const isDisabled = (props.disabled ?? false) || (props.readonly ?? false);
1936
+ return /* @__PURE__ */ import_react21.default.createElement(InputRoot, { "aria-disabled": isDisabled }, /* @__PURE__ */ import_react21.default.createElement(CheckboxRoot, null, /* @__PURE__ */ import_react21.default.createElement(CheckboxInput, { type: "checkbox", ...inputProps }), /* @__PURE__ */ import_react21.default.createElement(CheckboxInputOverlay, { "aria-hidden": true, checked: inputProps.checked }, /* @__PURE__ */ import_react21.default.createElement(Icon_default, { name: "24/Check", unsafeNonGuidelineScale: 2 / 3 }))), "children" in props && /* @__PURE__ */ import_react21.default.createElement(InputLabel, null, props.children));
1937
+ }
1938
+ );
1939
+ var Checkbox_default = (0, import_react21.memo)(Checkbox);
1940
+ var hiddenCss = import_styled_components18.css`
1941
+ visibility: hidden;
1942
+ `;
1943
+ var InputRoot = import_styled_components18.default.label`
1944
+ position: relative;
1945
+ display: flex;
1946
+
1947
+ cursor: pointer;
1948
+ ${import_utils12.disabledSelector} {
1949
+ cursor: default;
1950
+ }
1951
+
1952
+ gap: ${({ theme: theme4 }) => (0, import_utils12.px)(theme4.spacing[4])};
1953
+ ${theme((o) => [o.disabled])}
1954
+ `;
1955
+ var CheckboxRoot = import_styled_components18.default.div`
1956
+ position: relative;
1957
+ `;
1958
+ var CheckboxInput = import_styled_components18.default.input`
1959
+ &[type='checkbox'] {
1960
+ appearance: none;
1961
+ display: block;
1962
+ cursor: pointer;
1963
+ margin: 0;
1964
+ width: 20px;
1965
+ height: 20px;
1966
+
1967
+ &:checked {
1968
+ ${theme((o) => o.bg.brand.hover.press)}
1969
+ }
1970
+ &:not(:checked) {
1971
+ border-width: 2px;
1972
+ border-style: solid;
1973
+ border-color: ${({ theme: theme4 }) => theme4.color.text4};
1974
+ }
1975
+ ${theme((o) => [o.outline.default.focus, o.borderRadius(4)])}
1976
+ }
1977
+ `;
1978
+ var CheckboxInputOverlay = import_styled_components18.default.div`
1979
+ position: absolute;
1980
+ top: -2px;
1981
+ left: -2px;
1982
+ box-sizing: border-box;
1983
+ display: flex;
1984
+ align-items: center;
1985
+ justify-content: center;
1986
+
1987
+ ${theme((o) => [o.width.px(24), o.height.px(24), o.font.text5])}
1988
+
1989
+ ${({ checked }) => checked !== true && hiddenCss};
1990
+ `;
1991
+ var InputLabel = import_styled_components18.default.div`
1992
+ ${theme((o) => [o.font.text2])}
1993
+
1994
+ font-size: 14px;
1995
+ /** checkbox の height が 20px なのでcheckbox と text が揃っているように見せるために行ボックスの高さを 20px にしている */
1996
+ line-height: 20px;
1997
+ `;
1998
+
1999
+ // src/components/TagItem/index.tsx
2000
+ var import_react22 = __toESM(require("react"));
2001
+ var import_utils13 = require("@react-aria/utils");
2002
+ var import_styled_components19 = __toESM(require("styled-components"));
2003
+ var import_utils14 = require("@charcoal-ui/utils");
2004
+ var import_button2 = require("@react-aria/button");
2005
+ var sizeMap = {
2006
+ S: 32,
2007
+ M: 40
2008
+ };
2009
+ var TagItem = (0, import_react22.forwardRef)(
2010
+ function TagItemInner({
2011
+ label,
2012
+ translatedLabel,
2013
+ bgColor = "#7ACCB1",
2014
+ bgImage,
2015
+ size = "M",
2016
+ disabled,
2017
+ status = "default",
2018
+ ...props
2019
+ }, _ref) {
2020
+ const ref = (0, import_utils13.useObjectRef)(_ref);
2021
+ const ariaButtonProps = (0, import_react22.useMemo)(
2022
+ () => ({
2023
+ elementType: "a",
2024
+ isDisabled: disabled,
2025
+ ...props
2026
+ }),
2027
+ [disabled, props]
2028
+ );
2029
+ const { buttonProps } = (0, import_button2.useButton)(ariaButtonProps, ref);
2030
+ const hasTranslatedLabel = translatedLabel !== void 0 && translatedLabel.length > 0;
2031
+ return /* @__PURE__ */ import_react22.default.createElement(
2032
+ TagItemRoot,
2033
+ {
2034
+ ref,
2035
+ size: hasTranslatedLabel ? "M" : size,
2036
+ status,
2037
+ ...buttonProps
2038
+ },
2039
+ /* @__PURE__ */ import_react22.default.createElement(Background, { bgColor, bgImage }),
2040
+ /* @__PURE__ */ import_react22.default.createElement(Inner, null, /* @__PURE__ */ import_react22.default.createElement(LabelWrapper, { isTranslate: hasTranslatedLabel }, hasTranslatedLabel && /* @__PURE__ */ import_react22.default.createElement(TranslatedLabel, null, /* @__PURE__ */ import_react22.default.createElement(Label3, null, translatedLabel)), /* @__PURE__ */ import_react22.default.createElement(Label3, null, label)), status === "active" && /* @__PURE__ */ import_react22.default.createElement(Icon_default, { name: "16/Remove" }))
2041
+ );
2042
+ }
2043
+ );
2044
+ var TagItem_default = (0, import_react22.memo)(TagItem);
2045
+ var TagItemRoot = import_styled_components19.default.a`
2046
+ isolation: isolate;
2047
+ position: relative;
2048
+ height: ${({ size }) => sizeMap[size]}px;
2049
+ display: inline-flex;
2050
+ align-items: center;
2051
+ justify-content: center;
2052
+ text-decoration: none;
2053
+ cursor: pointer;
2054
+ overflow: hidden;
2055
+
2056
+ ${({ size, status }) => theme((o) => [
2057
+ o.outline.default.focus,
2058
+ o.borderRadius(4),
2059
+ status !== "active" && size === "M" && o.padding.horizontal(24),
2060
+ status !== "active" && size === "S" && o.padding.horizontal(16),
2061
+ status === "inactive" && o.bg.surface3,
2062
+ status === "inactive" ? o.font.text2 : o.font.text5,
2063
+ ...status === "active" ? [o.padding.left(16), o.padding.right(8)] : []
2064
+ ])}
2065
+
2066
+ ${import_utils14.disabledSelector} {
2067
+ ${theme((o) => [o.disabled])}
2068
+ cursor: default;
2069
+ }
2070
+ `;
2071
+ var Background = import_styled_components19.default.div`
2072
+ position: absolute;
2073
+ z-index: 1;
2074
+ top: 0;
2075
+ left: 0;
2076
+ width: 100%;
2077
+ height: 100%;
2078
+
2079
+ background-color: ${({ bgColor }) => bgColor};
2080
+
2081
+ ${({ bgImage }) => bgImage !== void 0 && import_styled_components19.css`
2082
+ ${theme((o) => [o.bg.surface4])}
2083
+ &::before {
2084
+ content: '';
2085
+ position: absolute;
2086
+ top: 0;
2087
+ left: 0;
2088
+ width: 100%;
2089
+ height: 100%;
2090
+ background-position: center;
2091
+ background-size: cover;
2092
+ background-image: url(${bgImage});
2093
+ mix-blend-mode: overlay;
2094
+ }
2095
+ `}
2096
+ `;
2097
+ var Inner = import_styled_components19.default.div`
2098
+ display: inline-flex;
2099
+ gap: ${({ theme: theme4 }) => (0, import_utils14.px)(theme4.spacing[8])};
2100
+ align-items: center;
2101
+ z-index: 2;
2102
+ `;
2103
+ var labelCSS = import_styled_components19.css`
2104
+ ${theme((o) => [o.typography(14).bold])}
2105
+ `;
2106
+ var translateLabelCSS = import_styled_components19.css`
2107
+ display: flex;
2108
+ align-items: center;
2109
+ flex-direction: column;
2110
+ font-size: 10px;
2111
+ `;
2112
+ var LabelWrapper = import_styled_components19.default.div`
2113
+ ${({ isTranslate }) => isTranslate ?? false ? translateLabelCSS : labelCSS}
2114
+ `;
2115
+ var Label3 = import_styled_components19.default.span`
2116
+ max-width: 152px;
2117
+ overflow: hidden;
2118
+ text-overflow: ellipsis;
2119
+ white-space: nowrap;
2120
+ font-size: inherit;
2121
+ color: inherit;
2122
+ line-height: inherit;
2123
+ `;
2124
+ var TranslatedLabel = import_styled_components19.default.div`
2125
+ ${theme((o) => [o.typography(12).bold])}
2126
+ `;
2127
+ // Annotate the CommonJS export names for ESM import in node:
2128
+ 0 && (module.exports = {
2129
+ Button,
2130
+ CharcoalProvider,
2131
+ Checkbox,
2132
+ Clickable,
2133
+ ComponentAbstraction,
2134
+ DropdownSelector,
2135
+ DropdownSelectorItem,
2136
+ Icon,
2137
+ IconButton,
2138
+ LoadingSpinner,
2139
+ LoadingSpinnerIcon,
2140
+ Modal,
2141
+ ModalAlign,
2142
+ ModalBody,
2143
+ ModalButtons,
2144
+ ModalHeader,
2145
+ MultiSelect,
2146
+ MultiSelectGroup,
2147
+ OverlayProvider,
2148
+ Radio,
2149
+ RadioGroup,
2150
+ SSRProvider,
2151
+ SegmentedControl,
2152
+ Switch,
2153
+ TagItem,
2154
+ TextField,
2155
+ useComponentAbstraction
2156
+ });
2157
+ //# sourceMappingURL=index.cjs.js.map