sh-ui-cli 0.48.0 → 0.50.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 (93) hide show
  1. package/data/changelog/versions.json +27 -0
  2. package/data/registry/react/components/accordion/index.vanilla-extract.tsx +97 -0
  3. package/data/registry/react/components/accordion/styles.css.ts +131 -0
  4. package/data/registry/react/components/avatar/index.vanilla-extract.tsx +73 -0
  5. package/data/registry/react/components/avatar/styles.css.ts +68 -0
  6. package/data/registry/react/components/badge/index.vanilla-extract.tsx +40 -0
  7. package/data/registry/react/components/badge/styles.css.ts +71 -0
  8. package/data/registry/react/components/breadcrumb/index.vanilla-extract.tsx +152 -0
  9. package/data/registry/react/components/breadcrumb/styles.css.ts +95 -0
  10. package/data/registry/react/components/button/index.vanilla-extract.tsx +45 -0
  11. package/data/registry/react/components/button/styles.css.ts +120 -0
  12. package/data/registry/react/components/calendar/index.vanilla-extract.tsx +806 -0
  13. package/data/registry/react/components/calendar/styles.css.ts +250 -0
  14. package/data/registry/react/components/card/index.vanilla-extract.tsx +63 -0
  15. package/data/registry/react/components/card/styles.css.ts +88 -0
  16. package/data/registry/react/components/carousel/index.vanilla-extract.tsx +430 -0
  17. package/data/registry/react/components/carousel/styles.css.ts +169 -0
  18. package/data/registry/react/components/checkbox/index.vanilla-extract.tsx +96 -0
  19. package/data/registry/react/components/checkbox/styles.css.ts +74 -0
  20. package/data/registry/react/components/code-editor/index.vanilla-extract.tsx +230 -0
  21. package/data/registry/react/components/code-editor/styles.css.ts +97 -0
  22. package/data/registry/react/components/code-panel/index.vanilla-extract.tsx +191 -0
  23. package/data/registry/react/components/code-panel/styles.css.ts +151 -0
  24. package/data/registry/react/components/color-picker/index.vanilla-extract.tsx +467 -0
  25. package/data/registry/react/components/color-picker/styles.css.ts +169 -0
  26. package/data/registry/react/components/combobox/index.vanilla-extract.tsx +165 -0
  27. package/data/registry/react/components/combobox/styles.css.ts +174 -0
  28. package/data/registry/react/components/context-menu/index.vanilla-extract.tsx +251 -0
  29. package/data/registry/react/components/context-menu/styles.css.ts +167 -0
  30. package/data/registry/react/components/date-picker/index.vanilla-extract.tsx +520 -0
  31. package/data/registry/react/components/date-picker/styles.css.ts +111 -0
  32. package/data/registry/react/components/dialog/index.vanilla-extract.tsx +95 -0
  33. package/data/registry/react/components/dialog/styles.css.ts +140 -0
  34. package/data/registry/react/components/dropdown-menu/index.vanilla-extract.tsx +255 -0
  35. package/data/registry/react/components/dropdown-menu/styles.css.ts +175 -0
  36. package/data/registry/react/components/file-upload/index.vanilla-extract.tsx +487 -0
  37. package/data/registry/react/components/file-upload/styles.css.ts +193 -0
  38. package/data/registry/react/components/form/index.vanilla-extract.tsx +61 -0
  39. package/data/registry/react/components/form/styles.css.ts +56 -0
  40. package/data/registry/react/components/header/index.vanilla-extract.tsx +805 -0
  41. package/data/registry/react/components/header/styles.css.ts +413 -0
  42. package/data/registry/react/components/input/index.vanilla-extract.tsx +425 -0
  43. package/data/registry/react/components/input/styles.css.ts +202 -0
  44. package/data/registry/react/components/label/index.vanilla-extract.tsx +52 -0
  45. package/data/registry/react/components/label/styles.css.ts +141 -0
  46. package/data/registry/react/components/markdown-editor/index.vanilla-extract.tsx +119 -0
  47. package/data/registry/react/components/markdown-editor/styles.css.ts +231 -0
  48. package/data/registry/react/components/menubar/index.vanilla-extract.tsx +32 -0
  49. package/data/registry/react/components/menubar/styles.css.ts +53 -0
  50. package/data/registry/react/components/numeric-input/index.vanilla-extract.tsx +148 -0
  51. package/data/registry/react/components/numeric-input/styles.css.ts +65 -0
  52. package/data/registry/react/components/page-toc/index.vanilla-extract.tsx +174 -0
  53. package/data/registry/react/components/page-toc/styles.css.ts +97 -0
  54. package/data/registry/react/components/pagination/index.vanilla-extract.tsx +269 -0
  55. package/data/registry/react/components/pagination/styles.css.ts +113 -0
  56. package/data/registry/react/components/popover/index.vanilla-extract.tsx +113 -0
  57. package/data/registry/react/components/popover/styles.css.ts +78 -0
  58. package/data/registry/react/components/progress/index.vanilla-extract.tsx +54 -0
  59. package/data/registry/react/components/progress/styles.css.ts +53 -0
  60. package/data/registry/react/components/radio/index.vanilla-extract.tsx +65 -0
  61. package/data/registry/react/components/radio/styles.css.ts +79 -0
  62. package/data/registry/react/components/rich-text-editor/index.vanilla-extract.tsx +348 -0
  63. package/data/registry/react/components/rich-text-editor/styles.css.ts +243 -0
  64. package/data/registry/react/components/select/index.vanilla-extract.tsx +234 -0
  65. package/data/registry/react/components/select/styles.css.ts +225 -0
  66. package/data/registry/react/components/separator/index.vanilla-extract.tsx +46 -0
  67. package/data/registry/react/components/separator/styles.css.ts +24 -0
  68. package/data/registry/react/components/sidebar/index.vanilla-extract.tsx +1067 -0
  69. package/data/registry/react/components/sidebar/styles.css.ts +578 -0
  70. package/data/registry/react/components/skeleton/index.vanilla-extract.tsx +22 -0
  71. package/data/registry/react/components/skeleton/styles.css.ts +30 -0
  72. package/data/registry/react/components/slider/index.vanilla-extract.tsx +298 -0
  73. package/data/registry/react/components/slider/styles.css.ts +75 -0
  74. package/data/registry/react/components/spinner/index.vanilla-extract.tsx +38 -0
  75. package/data/registry/react/components/spinner/styles.css.ts +60 -0
  76. package/data/registry/react/components/switch/index.vanilla-extract.tsx +39 -0
  77. package/data/registry/react/components/switch/styles.css.ts +87 -0
  78. package/data/registry/react/components/tabs/index.vanilla-extract.tsx +91 -0
  79. package/data/registry/react/components/tabs/styles.css.ts +145 -0
  80. package/data/registry/react/components/textarea/index.vanilla-extract.tsx +23 -0
  81. package/data/registry/react/components/textarea/styles.css.ts +55 -0
  82. package/data/registry/react/components/toast/index.vanilla-extract.tsx +258 -0
  83. package/data/registry/react/components/toast/styles.css.ts +307 -0
  84. package/data/registry/react/components/toggle/index.vanilla-extract.tsx +131 -0
  85. package/data/registry/react/components/toggle/styles.css.ts +109 -0
  86. package/data/registry/react/components/tooltip/index.vanilla-extract.tsx +83 -0
  87. package/data/registry/react/components/tooltip/styles.css.ts +59 -0
  88. package/data/registry/react/peer-versions.json +1 -0
  89. package/data/registry/react/registry.json +922 -42
  90. package/data/tokens/build.mjs +3 -0
  91. package/package.json +1 -1
  92. package/src/api.d.ts +4 -3
  93. package/src/constants.js +4 -3
@@ -0,0 +1,169 @@
1
+ import { style } from "@vanilla-extract/css";
2
+
3
+ export const colorPicker = style({
4
+ display: "flex",
5
+ flexDirection: "column",
6
+ gap: "0.625rem",
7
+ width: "100%",
8
+ userSelect: "none",
9
+ WebkitUserSelect: "none",
10
+ });
11
+
12
+ export const colorPickerSv = style({
13
+ position: "relative",
14
+ width: "100%",
15
+ aspectRatio: "4 / 3",
16
+ borderRadius: "var(--radius)",
17
+ cursor: "crosshair",
18
+ overflow: "hidden",
19
+ touchAction: "none",
20
+ });
21
+
22
+ export const colorPickerSvSaturation = style({
23
+ position: "absolute",
24
+ inset: 0,
25
+ background: "linear-gradient(to right, #fff, transparent)",
26
+ });
27
+
28
+ export const colorPickerSvValue = style({
29
+ position: "absolute",
30
+ inset: 0,
31
+ background: "linear-gradient(to top, #000, transparent)",
32
+ });
33
+
34
+ export const colorPickerSvThumb = style({
35
+ position: "absolute",
36
+ width: "0.875rem",
37
+ height: "0.875rem",
38
+ marginLeft: "-0.4375rem",
39
+ marginTop: "-0.4375rem",
40
+ border: "2px solid #fff",
41
+ borderRadius: "50%",
42
+ boxShadow: "0 0 0 1px rgba(0, 0, 0, 0.4)",
43
+ pointerEvents: "none",
44
+ });
45
+
46
+ export const colorPickerHue = style({
47
+ position: "relative",
48
+ width: "100%",
49
+ height: "0.875rem",
50
+ borderRadius: "999px",
51
+ cursor: "pointer",
52
+ touchAction: "none",
53
+ background: "linear-gradient(\n to right,\n #f00 0%,\n #ff0 16.66%,\n #0f0 33.33%,\n #0ff 50%,\n #00f 66.66%,\n #f0f 83.33%,\n #f00 100%\n )",
54
+ });
55
+
56
+ export const colorPickerHueThumb = style({
57
+ position: "absolute",
58
+ top: "50%",
59
+ width: "0.875rem",
60
+ height: "0.875rem",
61
+ marginLeft: "-0.4375rem",
62
+ transform: "translateY(-50%)",
63
+ background: "#fff",
64
+ borderRadius: "50%",
65
+ boxShadow: "0 0 0 1px rgba(0, 0, 0, 0.4)",
66
+ pointerEvents: "none",
67
+ });
68
+
69
+ export const colorPickerAlpha = style({
70
+ position: "relative",
71
+ width: "100%",
72
+ height: "0.875rem",
73
+ borderRadius: "999px",
74
+ cursor: "pointer",
75
+ touchAction: "none",
76
+ backgroundColor: "#fff",
77
+ backgroundImage: "linear-gradient(45deg, #ccc 25%, transparent 25%),\n linear-gradient(-45deg, #ccc 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #ccc 75%),\n linear-gradient(-45deg, transparent 75%, #ccc 75%)",
78
+ backgroundSize: "8px 8px",
79
+ backgroundPosition: "0 0, 0 4px, 4px -4px, -4px 0",
80
+ overflow: "hidden",
81
+ });
82
+
83
+ export const colorPickerAlphaTrack = style({
84
+ position: "absolute",
85
+ inset: 0,
86
+ borderRadius: "inherit",
87
+ pointerEvents: "none",
88
+ });
89
+
90
+ export const colorPickerRow = style({
91
+ display: "flex",
92
+ alignItems: "center",
93
+ gap: "var(--space-2)",
94
+ });
95
+
96
+ export const colorPickerSwatch = style({
97
+ width: "1.75rem",
98
+ height: "1.75rem",
99
+ borderRadius: "calc(var(--radius) - 2px)",
100
+ border: "1px solid var(--border)",
101
+ flexShrink: 0,
102
+ });
103
+
104
+ export const colorPickerHex = style({
105
+ flex: 1,
106
+ minWidth: 0,
107
+ height: "1.75rem",
108
+ padding: "0 var(--space-2)",
109
+ border: "1px solid var(--border)",
110
+ borderRadius: "calc(var(--radius) - 2px)",
111
+ background: "var(--background)",
112
+ color: "var(--foreground)",
113
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
114
+ fontSize: "0.8125rem",
115
+ textTransform: "uppercase",
116
+ selectors: {
117
+ "&:focus": {
118
+ outline: "none",
119
+ borderColor: "var(--foreground)",
120
+ boxShadow: "0 0 0 1px var(--foreground)",
121
+ },
122
+ },
123
+ });
124
+
125
+ export const colorPickerSwatches = style({
126
+ display: "flex",
127
+ flexWrap: "wrap",
128
+ gap: "0.375rem",
129
+ });
130
+
131
+ export const colorPickerSwatchBtn = style({
132
+ width: "1.25rem",
133
+ height: "1.25rem",
134
+ padding: 0,
135
+ border: "1px solid var(--border)",
136
+ borderRadius: "calc(var(--radius) - 4px)",
137
+ cursor: "pointer",
138
+ transition: "transform var(--duration-fast), box-shadow var(--duration-fast)",
139
+ selectors: {
140
+ "&:hover": {
141
+ transform: "scale(1.08)",
142
+ },
143
+ "&:focus-visible": {
144
+ outline: "var(--border-width-strong) solid var(--foreground)",
145
+ outlineOffset: "2px",
146
+ },
147
+ "&[data-selected]": {
148
+ boxShadow: "0 0 0 2px var(--background), 0 0 0 3.5px var(--foreground)",
149
+ },
150
+ },
151
+ });
152
+
153
+ /** 동적 키로 클래스 참조용 — `byKey[\`badge--${variant}\`]` 같은 패턴 지원. */
154
+ export const byKey: Record<string, string> = {
155
+ "color-picker": colorPicker,
156
+ "color-picker__sv": colorPickerSv,
157
+ "color-picker__sv-saturation": colorPickerSvSaturation,
158
+ "color-picker__sv-value": colorPickerSvValue,
159
+ "color-picker__sv-thumb": colorPickerSvThumb,
160
+ "color-picker__hue": colorPickerHue,
161
+ "color-picker__hue-thumb": colorPickerHueThumb,
162
+ "color-picker__alpha": colorPickerAlpha,
163
+ "color-picker__alpha-track": colorPickerAlphaTrack,
164
+ "color-picker__row": colorPickerRow,
165
+ "color-picker__swatch": colorPickerSwatch,
166
+ "color-picker__hex": colorPickerHex,
167
+ "color-picker__swatches": colorPickerSwatches,
168
+ "color-picker__swatch-btn": colorPickerSwatchBtn,
169
+ };
@@ -0,0 +1,165 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { Combobox as BaseCombobox } from "@base-ui/react/combobox";
5
+ import { byKey, combobox__input, combobox__positioner, combobox__content, combobox__item, comboboxItemIndicator, comboboxItemText, combobox__empty, comboboxGroupLabel, combobox__chip, comboboxChipRemove } from "./styles.css";
6
+
7
+ import { cn } from "@SH_UI_UTILS@";
8
+ type WithStringClassName<T> = Omit<T, "className"> & { className?: string };
9
+
10
+
11
+ /**
12
+ * Select + Input의 결합 — 타이핑으로 목록이 자동 필터링된다.
13
+ * Base UI Combobox를 래핑해 `items` 배열을 받으면 기본 필터가 `input` 값 기준으로 동작.
14
+ *
15
+ * <Combobox items={fruits}>
16
+ * <ComboboxInput placeholder="과일 검색" />
17
+ * <ComboboxContent>
18
+ * <ComboboxList>
19
+ * {(item) => <ComboboxItem key={item} value={item}>{item}</ComboboxItem>}
20
+ * </ComboboxList>
21
+ * <ComboboxEmpty>일치하는 항목 없음</ComboboxEmpty>
22
+ * </ComboboxContent>
23
+ * </Combobox>
24
+ */
25
+ export const Combobox = BaseCombobox.Root;
26
+
27
+ export const ComboboxIcon = BaseCombobox.Icon;
28
+ export const ComboboxTrigger = BaseCombobox.Trigger;
29
+ export const ComboboxClear = BaseCombobox.Clear;
30
+ export const ComboboxValue = BaseCombobox.Value;
31
+ export const ComboboxGroup = BaseCombobox.Group;
32
+ export const ComboboxChips = BaseCombobox.Chips;
33
+
34
+ export const ComboboxInput = React.forwardRef<
35
+ HTMLInputElement,
36
+ WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseCombobox.Input>>
37
+ >(function ComboboxInput({ className, ...props }, ref) {
38
+ return (
39
+ <BaseCombobox.Input
40
+ ref={ref}
41
+ className={cn(combobox__input, className)}
42
+ {...props}
43
+ />
44
+ );
45
+ });
46
+
47
+ /** Portal + Positioner + Popup 래퍼. */
48
+ export const ComboboxContent = React.forwardRef<
49
+ HTMLDivElement,
50
+ WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseCombobox.Popup>> & {
51
+ container?: React.ComponentPropsWithoutRef<typeof BaseCombobox.Portal>["container"];
52
+ sideOffset?: number;
53
+ }
54
+ >(function ComboboxContent(
55
+ { className, children, container, sideOffset = 4, ...props },
56
+ ref,
57
+ ) {
58
+ return (
59
+ <BaseCombobox.Portal container={container}>
60
+ <BaseCombobox.Positioner
61
+ className={combobox__positioner}
62
+ sideOffset={sideOffset}
63
+ align="start"
64
+ >
65
+ <BaseCombobox.Popup
66
+ ref={ref}
67
+ className={cn(combobox__content, className)}
68
+ {...props}
69
+ >
70
+ {children}
71
+ </BaseCombobox.Popup>
72
+ </BaseCombobox.Positioner>
73
+ </BaseCombobox.Portal>
74
+ );
75
+ });
76
+
77
+ export const ComboboxList = BaseCombobox.List;
78
+
79
+ export const ComboboxItem = React.forwardRef<
80
+ HTMLDivElement,
81
+ WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseCombobox.Item>>
82
+ >(function ComboboxItem({ className, children, ...props }, ref) {
83
+ return (
84
+ <BaseCombobox.Item
85
+ ref={ref}
86
+ className={cn(combobox__item, className)}
87
+ {...props}
88
+ >
89
+ <BaseCombobox.ItemIndicator className={comboboxItemIndicator}>
90
+ <CheckIcon />
91
+ </BaseCombobox.ItemIndicator>
92
+ <span className={comboboxItemText}>{children}</span>
93
+ </BaseCombobox.Item>
94
+ );
95
+ });
96
+
97
+ export const ComboboxEmpty = React.forwardRef<
98
+ HTMLDivElement,
99
+ WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseCombobox.Empty>>
100
+ >(function ComboboxEmpty({ className, ...props }, ref) {
101
+ return (
102
+ <BaseCombobox.Empty
103
+ ref={ref}
104
+ className={cn(combobox__empty, className)}
105
+ {...props}
106
+ />
107
+ );
108
+ });
109
+
110
+ export const ComboboxGroupLabel = React.forwardRef<
111
+ HTMLDivElement,
112
+ WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseCombobox.GroupLabel>>
113
+ >(function ComboboxGroupLabel({ className, ...props }, ref) {
114
+ return (
115
+ <BaseCombobox.GroupLabel
116
+ ref={ref}
117
+ className={cn(comboboxGroupLabel, className)}
118
+ {...props}
119
+ />
120
+ );
121
+ });
122
+
123
+ /** 다중 선택 칩. */
124
+ export const ComboboxChip = React.forwardRef<
125
+ HTMLDivElement,
126
+ WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseCombobox.Chip>>
127
+ >(function ComboboxChip({ className, ...props }, ref) {
128
+ return (
129
+ <BaseCombobox.Chip
130
+ ref={ref}
131
+ className={cn(combobox__chip, className)}
132
+ {...props}
133
+ />
134
+ );
135
+ });
136
+
137
+ /** 칩 × 제거 버튼. */
138
+ export const ComboboxChipRemove = React.forwardRef<
139
+ HTMLButtonElement,
140
+ WithStringClassName<React.ComponentPropsWithoutRef<typeof BaseCombobox.ChipRemove>>
141
+ >(function ComboboxChipRemove({ className, children, ...props }, ref) {
142
+ return (
143
+ <BaseCombobox.ChipRemove
144
+ ref={ref}
145
+ className={cn(comboboxChipRemove, className)}
146
+ {...props}
147
+ >
148
+ {children ?? "×"}
149
+ </BaseCombobox.ChipRemove>
150
+ );
151
+ });
152
+
153
+ function CheckIcon() {
154
+ return (
155
+ <svg viewBox="0 0 16 16" width="14" height="14" fill="none" aria-hidden>
156
+ <path
157
+ d="M3 8.5l3 3 7-7"
158
+ stroke="currentColor"
159
+ strokeWidth="2"
160
+ strokeLinecap="round"
161
+ strokeLinejoin="round"
162
+ />
163
+ </svg>
164
+ );
165
+ }
@@ -0,0 +1,174 @@
1
+ import { style } from "@vanilla-extract/css";
2
+
3
+ export const combobox__input = style({
4
+ display: "inline-flex",
5
+ width: "100%",
6
+ minWidth: "10rem",
7
+ height: "var(--control-md)",
8
+ padding: "0 var(--space-3)",
9
+ background: "var(--background)",
10
+ color: "var(--foreground)",
11
+ border: "1px solid var(--border)",
12
+ borderRadius: "var(--radius)",
13
+ fontSize: "var(--text-sm)",
14
+ lineHeight: 1,
15
+ outline: "none",
16
+ transition: "border-color var(--duration-fast)",
17
+ selectors: {
18
+ "&::placeholder": {
19
+ color: "var(--foreground-subtle)",
20
+ },
21
+ "&:hover:not(:disabled)": {
22
+ borderColor: "var(--border-strong)",
23
+ },
24
+ "&:focus-visible": {
25
+ outline: "var(--border-width-strong) solid var(--foreground)",
26
+ outlineOffset: "2px",
27
+ },
28
+ "&:disabled": {
29
+ opacity: "var(--opacity-disabled)",
30
+ pointerEvents: "none",
31
+ },
32
+ },
33
+ });
34
+
35
+ export const combobox__positioner = style({
36
+ zIndex: "var(--z-dropdown)",
37
+ outline: "none",
38
+ width: "var(--anchor-width)",
39
+ });
40
+
41
+ export const combobox__content = style({
42
+ maxHeight: "min(20rem, var(--available-height))",
43
+ overflowY: "auto",
44
+ padding: "var(--space-1)",
45
+ background: "var(--background)",
46
+ color: "var(--foreground)",
47
+ border: "1px solid var(--border)",
48
+ borderRadius: "var(--radius)",
49
+ boxShadow: "0 8px 24px rgba(0, 0, 0, 0.08)",
50
+ outline: "none",
51
+ transformOrigin: "var(--transform-origin)",
52
+ transition: "opacity 140ms ease, transform 140ms ease",
53
+ selectors: {
54
+ "&[data-starting-style]": {
55
+ opacity: 0,
56
+ transform: "scale(0.97)",
57
+ },
58
+ "&[data-ending-style]": {
59
+ opacity: 0,
60
+ transform: "scale(0.97)",
61
+ },
62
+ },
63
+ });
64
+
65
+ export const combobox__item = style({
66
+ display: "flex",
67
+ alignItems: "center",
68
+ gap: "var(--space-2)",
69
+ padding: "0.375rem 0.75rem",
70
+ fontSize: "var(--text-sm)",
71
+ lineHeight: 1.4,
72
+ borderRadius: "calc(var(--radius) - 2px)",
73
+ cursor: "pointer",
74
+ userSelect: "none",
75
+ outline: "none",
76
+ selectors: {
77
+ "&[data-highlighted]": {
78
+ background: "var(--background-muted)",
79
+ },
80
+ "&:hover": {
81
+ background: "var(--background-muted)",
82
+ },
83
+ "&[data-selected]": {
84
+ color: "var(--foreground)",
85
+ fontWeight: "var(--weight-medium)",
86
+ },
87
+ "&[data-disabled]": {
88
+ opacity: "var(--opacity-disabled)",
89
+ pointerEvents: "none",
90
+ },
91
+ },
92
+ });
93
+
94
+ export const comboboxItemIndicator = style({
95
+ order: 1,
96
+ marginLeft: "auto",
97
+ display: "inline-flex",
98
+ alignItems: "center",
99
+ justifyContent: "center",
100
+ color: "var(--foreground)",
101
+ });
102
+
103
+ export const comboboxItemText = style({
104
+ flex: 1,
105
+ overflow: "hidden",
106
+ textOverflow: "ellipsis",
107
+ whiteSpace: "nowrap",
108
+ });
109
+
110
+ export const combobox__empty = style({
111
+ padding: "var(--space-3) var(--space-2)",
112
+ textAlign: "center",
113
+ fontSize: "0.8125rem",
114
+ color: "var(--foreground-muted)",
115
+ });
116
+
117
+ export const comboboxGroupLabel = style({
118
+ padding: "0.375rem var(--space-2) var(--space-1)",
119
+ fontSize: "var(--text-xs)",
120
+ fontWeight: "var(--weight-semibold)",
121
+ color: "var(--foreground-muted)",
122
+ textTransform: "uppercase",
123
+ letterSpacing: "0.04em",
124
+ });
125
+
126
+ export const combobox__chip = style({
127
+ display: "inline-flex",
128
+ alignItems: "center",
129
+ gap: "var(--space-1)",
130
+ padding: "0.125rem 0.375rem 0.125rem var(--space-2)",
131
+ marginRight: "var(--space-1)",
132
+ fontSize: "var(--text-xs)",
133
+ lineHeight: "1.25rem",
134
+ background: "var(--background-muted)",
135
+ borderRadius: "calc(var(--radius) - 2px)",
136
+ whiteSpace: "nowrap",
137
+ });
138
+
139
+ export const comboboxChipRemove = style({
140
+ display: "inline-flex",
141
+ alignItems: "center",
142
+ justifyContent: "center",
143
+ width: "1rem",
144
+ height: "1rem",
145
+ padding: 0,
146
+ border: 0,
147
+ borderRadius: "999px",
148
+ background: "transparent",
149
+ color: "var(--foreground-muted)",
150
+ fontSize: "var(--text-sm)",
151
+ lineHeight: 1,
152
+ cursor: "pointer",
153
+ transition: "background-color var(--duration-fast), color var(--duration-fast)",
154
+ selectors: {
155
+ "&:hover": {
156
+ background: "var(--background)",
157
+ color: "var(--foreground)",
158
+ },
159
+ },
160
+ });
161
+
162
+ /** 동적 키로 클래스 참조용 — `byKey[\`badge--${variant}\`]` 같은 패턴 지원. */
163
+ export const byKey: Record<string, string> = {
164
+ "combobox__input": combobox__input,
165
+ "combobox__positioner": combobox__positioner,
166
+ "combobox__content": combobox__content,
167
+ "combobox__item": combobox__item,
168
+ "combobox__item-indicator": comboboxItemIndicator,
169
+ "combobox__item-text": comboboxItemText,
170
+ "combobox__empty": combobox__empty,
171
+ "combobox__group-label": comboboxGroupLabel,
172
+ "combobox__chip": combobox__chip,
173
+ "combobox__chip-remove": comboboxChipRemove,
174
+ };