raft-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/dist/cn.d.mts +2 -0
- package/dist/cn.mjs +2 -0
- package/dist/index.d.mts +2710 -0
- package/dist/index.mjs +4821 -0
- package/dist/label-DWq4ia5I.mjs +115 -0
- package/dist/styled-props-B3SNekJg.d.mts +16 -0
- package/dist/wip.d.mts +1238 -0
- package/dist/wip.mjs +1416 -0
- package/package.json +70 -0
- package/src/components/avatar/avatar.tsx +375 -0
- package/src/components/avatar/index.ts +17 -0
- package/src/components/badge/badge.tsx +393 -0
- package/src/components/badge/index.ts +2 -0
- package/src/components/banner/banner.tsx +269 -0
- package/src/components/banner/index.ts +8 -0
- package/src/components/bottom-sheet/bottom-sheet.tsx +152 -0
- package/src/components/bottom-sheet/index.ts +22 -0
- package/src/components/button/button.tsx +497 -0
- package/src/components/button/index.ts +2 -0
- package/src/components/checkbox/checkbox-indicator.tsx +128 -0
- package/src/components/checkbox/checkbox.tsx +350 -0
- package/src/components/checkbox/index.ts +2 -0
- package/src/components/combobox/combobox.tsx +603 -0
- package/src/components/combobox/index.ts +52 -0
- package/src/components/context-menu/context-menu.tsx +380 -0
- package/src/components/context-menu/index.ts +34 -0
- package/src/components/conversation-preview-card/conversation-preview-card.tsx +336 -0
- package/src/components/conversation-preview-card/index.ts +32 -0
- package/src/components/description-list/description-list.tsx +116 -0
- package/src/components/description-list/index.ts +14 -0
- package/src/components/dropdown-menu/dropdown-menu.tsx +405 -0
- package/src/components/dropdown-menu/index.ts +38 -0
- package/src/components/empty-state/empty-state.tsx +177 -0
- package/src/components/empty-state/index.ts +16 -0
- package/src/components/field/field.tsx +125 -0
- package/src/components/field/index.ts +18 -0
- package/src/components/inline-code/index.ts +2 -0
- package/src/components/inline-code/inline-code.tsx +33 -0
- package/src/components/input/index.ts +2 -0
- package/src/components/input/input.tsx +76 -0
- package/src/components/input-group/index.ts +7 -0
- package/src/components/input-group/input-group.tsx +215 -0
- package/src/components/kbd/index.ts +2 -0
- package/src/components/kbd/kbd.tsx +43 -0
- package/src/components/label/index.ts +7 -0
- package/src/components/label/label.tsx +99 -0
- package/src/components/lightbox/index.ts +24 -0
- package/src/components/lightbox/lightbox.tsx +245 -0
- package/src/components/list-item/index.ts +20 -0
- package/src/components/list-item/list-item.tsx +263 -0
- package/src/components/media-list-item/index.ts +20 -0
- package/src/components/media-list-item/media-list-item.tsx +169 -0
- package/src/components/notification-center/index.ts +39 -0
- package/src/components/notification-center/notification-center.tsx +558 -0
- package/src/components/panel-header/index.ts +22 -0
- package/src/components/panel-header/panel-header.tsx +199 -0
- package/src/components/popover/index.ts +30 -0
- package/src/components/popover/popover.tsx +248 -0
- package/src/components/preview-shell/index.ts +2 -0
- package/src/components/preview-shell/preview-shell.tsx +51 -0
- package/src/components/quoted-message-card/index.ts +36 -0
- package/src/components/quoted-message-card/quoted-message-card.tsx +391 -0
- package/src/components/radio-group/index.ts +6 -0
- package/src/components/radio-group/radio-group.tsx +119 -0
- package/src/components/section-header/index.ts +16 -0
- package/src/components/section-header/section-header.tsx +117 -0
- package/src/components/section-label/index.ts +2 -0
- package/src/components/section-label/section-label.tsx +38 -0
- package/src/components/segmented-control/index.ts +12 -0
- package/src/components/segmented-control/segmented-control.tsx +129 -0
- package/src/components/select/index.ts +40 -0
- package/src/components/select/select.tsx +382 -0
- package/src/components/spinner/index.ts +2 -0
- package/src/components/spinner/spinner.tsx +228 -0
- package/src/components/status/index.ts +2 -0
- package/src/components/status/status.tsx +152 -0
- package/src/components/tabs/index.ts +24 -0
- package/src/components/tabs/tabs.tsx +417 -0
- package/src/components/text/index.ts +2 -0
- package/src/components/text/text.tsx +130 -0
- package/src/components/textarea/index.ts +2 -0
- package/src/components/textarea/textarea.tsx +136 -0
- package/src/components/toggle-group/index.ts +12 -0
- package/src/components/toggle-group/toggle-group.tsx +111 -0
- package/src/components/tooltip/index.ts +14 -0
- package/src/components/tooltip/tooltip.tsx +186 -0
- package/src/fonts/brutal.css +2 -0
- package/src/index.ts +404 -0
- package/src/legacy/AttentionDot.tsx +28 -0
- package/src/legacy/AvatarListRow.tsx +87 -0
- package/src/legacy/AvatarSlot.tsx +157 -0
- package/src/legacy/Badge.tsx +95 -0
- package/src/legacy/Banner.tsx +74 -0
- package/src/legacy/BottomSheet.tsx +76 -0
- package/src/legacy/CheckMarker.tsx +72 -0
- package/src/legacy/Checkbox.tsx +81 -0
- package/src/legacy/ConversationPreviewCard.tsx +169 -0
- package/src/legacy/DismissBackdrop.tsx +68 -0
- package/src/legacy/EmptyState.tsx +63 -0
- package/src/legacy/ExperimentalBadge.tsx +19 -0
- package/src/legacy/FormField.tsx +106 -0
- package/src/legacy/KeyValueRow.tsx +67 -0
- package/src/legacy/Lightbox.tsx +119 -0
- package/src/legacy/NotificationCenter.tsx +217 -0
- package/src/legacy/PanelHeader.tsx +94 -0
- package/src/legacy/PreviewShell.tsx +40 -0
- package/src/legacy/QuotedMessageCard.tsx +181 -0
- package/src/legacy/ReorderablePanelTabs.tsx +151 -0
- package/src/legacy/SandboxedPreviewFrame.tsx +59 -0
- package/src/legacy/SearchInput.tsx +23 -0
- package/src/legacy/SectionEyebrow.tsx +60 -0
- package/src/legacy/SectionHeader.tsx +68 -0
- package/src/legacy/SegmentedControl.tsx +74 -0
- package/src/legacy/SlugInput.tsx +29 -0
- package/src/legacy/Spinner.tsx +89 -0
- package/src/legacy/StatusDot.tsx +51 -0
- package/src/legacy/SurfaceListItem.tsx +32 -0
- package/src/legacy/Textarea.tsx +137 -0
- package/src/legacy/button.tsx +100 -0
- package/src/legacy/context-menu-divider.tsx +12 -0
- package/src/legacy/menu-item.tsx +66 -0
- package/src/legacy/selection-popover.tsx +212 -0
- package/src/legacy/server-switcher-menu.tsx +203 -0
- package/src/legacy/source.css +240 -0
- package/src/lib/cn.ts +1 -0
- package/src/lib/styled-props.ts +11 -0
- package/src/lib/theme/theme-context.ts +28 -0
- package/src/lib/theme/theme-provider.tsx +181 -0
- package/src/lib/theme/use-theme.ts +12 -0
- package/src/lib/tv.ts +29 -0
- package/src/lib/without-children.ts +6 -0
- package/src/styles.css +467 -0
- package/src/wip.ts +255 -0
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import { createContext, use, useState, type ComponentPropsWithRef } from "react";
|
|
2
|
+
import { Combobox as BaseCombobox } from "@base-ui/react/combobox";
|
|
3
|
+
import { Check, X } from "lucide-react";
|
|
4
|
+
import { tv } from "../../lib/tv.ts";
|
|
5
|
+
import type { StyledProps } from "../../lib/styled-props.ts";
|
|
6
|
+
import { useThemeFamily } from "../../lib/theme/use-theme.ts";
|
|
7
|
+
import { Button } from "../button/index.ts";
|
|
8
|
+
|
|
9
|
+
const combobox = tv({
|
|
10
|
+
slots: {
|
|
11
|
+
trigger: [
|
|
12
|
+
"inline-flex select-none items-center justify-between gap-2",
|
|
13
|
+
"outline-none transition-colors",
|
|
14
|
+
"[&_[data-slot='button-content']]:w-full [&_[data-slot='button-content']]:justify-between",
|
|
15
|
+
"[&>span[data-slot='combobox-trigger-content']]:min-w-0 [&>span[data-slot='combobox-trigger-content']]:flex-1",
|
|
16
|
+
"[&_[data-slot='combobox-trigger-content']_svg]:!size-3 [&_[data-slot='combobox-trigger-content']_svg]:shrink-0 [&_[data-slot='combobox-trigger-content']_svg]:!stroke-[1.5] [&_[data-slot='combobox-trigger-content']_svg_*]:!stroke-[1.5]",
|
|
17
|
+
"[&_[data-slot='combobox-trigger-indicator']]:!stroke-[1.5] [&_[data-slot='combobox-trigger-indicator']_*]:!stroke-[1.5]",
|
|
18
|
+
],
|
|
19
|
+
triggerIndicator: ["ml-auto flex shrink-0 items-center justify-center opacity-60"],
|
|
20
|
+
control: [
|
|
21
|
+
"flex min-w-0 items-center gap-2",
|
|
22
|
+
"outline-none transition-colors",
|
|
23
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5",
|
|
24
|
+
"[&_[data-slot='combobox-input']]:min-w-0 [&_[data-slot='combobox-input']]:flex-1",
|
|
25
|
+
"[&_[data-slot='combobox-input']]:border-0 [&_[data-slot='combobox-input']]:bg-transparent [&_[data-slot='combobox-input']]:p-0",
|
|
26
|
+
"[&_[data-slot='combobox-input']]:shadow-none [&_[data-slot='combobox-input']]:outline-none [&_[data-slot='combobox-input']]:ring-0",
|
|
27
|
+
"[&_[data-slot='combobox-input']]:focus:border-transparent [&_[data-slot='combobox-input']]:focus:ring-0 [&_[data-slot='combobox-input']]:focus-visible:ring-0",
|
|
28
|
+
"[&_[data-slot='combobox-clear']]:size-5 [&_[data-slot='combobox-clear']]:min-w-5 [&_[data-slot='combobox-clear']]:shrink-0",
|
|
29
|
+
"[&_[data-slot='combobox-trigger-indicator']]:size-4",
|
|
30
|
+
"[&_[data-slot='combobox-trigger-indicator']_svg]:!size-3.5 [&_[data-slot='combobox-trigger-indicator']_svg]:shrink-0",
|
|
31
|
+
],
|
|
32
|
+
inputGroup: ["flex items-center gap-2 border-b px-2 py-2"],
|
|
33
|
+
input: ["w-full outline-none"],
|
|
34
|
+
positioner: ["isolate z-50 outline-none"],
|
|
35
|
+
content: [
|
|
36
|
+
"h-auto max-h-[var(--available-height)] min-w-[220px] overflow-hidden bg-layer-panel",
|
|
37
|
+
"outline-none",
|
|
38
|
+
],
|
|
39
|
+
header: ["flex items-center justify-between px-3 py-2"],
|
|
40
|
+
separator: ["h-px shrink-0 border-0"],
|
|
41
|
+
list: ["max-h-64 overflow-y-auto overscroll-contain scroll-py-1"],
|
|
42
|
+
item: [
|
|
43
|
+
"flex w-full shrink-0 cursor-default select-none items-center justify-between gap-2 overflow-hidden px-3 py-1.5",
|
|
44
|
+
"text-left outline-none transition-colors",
|
|
45
|
+
],
|
|
46
|
+
itemIndicator: ["pointer-events-none ml-auto flex shrink-0 items-center justify-center"],
|
|
47
|
+
label: ["m-0 font-medium"],
|
|
48
|
+
clear: [
|
|
49
|
+
"inline-flex h-5 min-w-8 items-center justify-center",
|
|
50
|
+
"pointer-events-none opacity-0 outline-none transition-colors",
|
|
51
|
+
"data-[visible]:pointer-events-auto data-[visible]:opacity-100",
|
|
52
|
+
],
|
|
53
|
+
empty: ["px-3 py-4 text-center text-sm"],
|
|
54
|
+
groupLabel: ["px-3 py-2"],
|
|
55
|
+
chips: ["flex min-h-9 flex-wrap items-center gap-1"],
|
|
56
|
+
chip: ["inline-flex items-center gap-1"],
|
|
57
|
+
chipRemove: ["inline-flex items-center justify-center outline-none transition-colors"],
|
|
58
|
+
},
|
|
59
|
+
variants: {
|
|
60
|
+
theme: {
|
|
61
|
+
brutal: {
|
|
62
|
+
trigger: [
|
|
63
|
+
"font-sans text-sm font-semibold text-black",
|
|
64
|
+
"data-[popup-open]:translate-x-0 data-[popup-open]:translate-y-0",
|
|
65
|
+
"data-[popup-open]:hover:translate-x-0 data-[popup-open]:hover:translate-y-0",
|
|
66
|
+
],
|
|
67
|
+
inputGroup: ["border-black bg-white"],
|
|
68
|
+
input: [
|
|
69
|
+
"border-2 border-line-strong bg-layer-panel px-2 py-1 font-mono text-xs",
|
|
70
|
+
"shadow-[var(--shadow)] focus:shadow-[var(--shadow-hover)]",
|
|
71
|
+
],
|
|
72
|
+
content: ["border-2 border-black bg-white shadow-lg"],
|
|
73
|
+
separator: ["bg-black"],
|
|
74
|
+
item: [
|
|
75
|
+
"border-b border-black/10 bg-white font-sans text-sm font-semibold leading-6 text-black last:border-b-0",
|
|
76
|
+
"hover:bg-brutal-yellow/30 data-[highlighted]:bg-brutal-yellow/30",
|
|
77
|
+
"data-[disabled]:pointer-events-none data-[disabled]:text-black/30",
|
|
78
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:stroke-2 [&_svg_*]:stroke-2 [&_svg:not([class*='size-'])]:size-3",
|
|
79
|
+
],
|
|
80
|
+
itemIndicator: ["text-black"],
|
|
81
|
+
label: ["font-sans text-[10px] font-bold uppercase leading-none tracking-wide text-black"],
|
|
82
|
+
clear: [
|
|
83
|
+
"font-sans text-[10px] font-bold uppercase tracking-wide text-black hover:text-black",
|
|
84
|
+
"[&_svg]:![stroke-width:2] [&_svg_*]:![stroke-width:2]",
|
|
85
|
+
],
|
|
86
|
+
triggerIndicator: [
|
|
87
|
+
"text-black opacity-100",
|
|
88
|
+
"[&_svg]:![stroke-width:2] [&_svg_*]:![stroke-width:2]",
|
|
89
|
+
],
|
|
90
|
+
control: [
|
|
91
|
+
"border-2 border-line-strong bg-white px-2 py-1",
|
|
92
|
+
"font-sans text-sm font-semibold text-black shadow-[var(--shadow)]",
|
|
93
|
+
"focus-within:shadow-[var(--shadow-hover)]",
|
|
94
|
+
"data-[popup-open]:translate-x-0 data-[popup-open]:translate-y-0",
|
|
95
|
+
"[&_svg]:![stroke-width:1.5] [&_svg_*]:![stroke-width:1.5] [&_svg_*]:fill-none",
|
|
96
|
+
"[&_[data-slot='combobox-input']]:font-sans [&_[data-slot='combobox-input']]:text-sm [&_[data-slot='combobox-input']]:font-semibold [&_[data-slot='combobox-input']]:text-black",
|
|
97
|
+
"[&_[data-slot='combobox-input']::placeholder]:text-black/40",
|
|
98
|
+
],
|
|
99
|
+
empty: ["font-sans text-sm font-semibold text-black/50"],
|
|
100
|
+
groupLabel: [
|
|
101
|
+
"font-sans text-[10px] font-bold uppercase leading-none tracking-wide text-black/60",
|
|
102
|
+
],
|
|
103
|
+
chips: ["border-2 border-line-strong bg-white px-2 py-1"],
|
|
104
|
+
chip: ["border border-black bg-brutal-yellow px-1.5 py-0.5 font-sans text-xs font-bold"],
|
|
105
|
+
chipRemove: ["text-black/50 hover:text-black"],
|
|
106
|
+
},
|
|
107
|
+
elegant: {
|
|
108
|
+
trigger: [
|
|
109
|
+
"text-sm font-medium tracking-[-0.005em] text-foreground-muted",
|
|
110
|
+
"[&_svg]:stroke-[1.5] [&_svg_*]:stroke-[1.5]",
|
|
111
|
+
],
|
|
112
|
+
inputGroup: ["border-line-muted bg-layer-popover px-1.5 pt-1 pb-2"],
|
|
113
|
+
input: [
|
|
114
|
+
"rounded-sm border border-line-subtle bg-layer-field px-2 py-1 text-sm",
|
|
115
|
+
"text-foreground outline-none transition duration-150",
|
|
116
|
+
"placeholder:text-foreground-placeholder/70",
|
|
117
|
+
"focus:border-line-strong/25 focus-visible:ring-2 focus-visible:ring-line-strong/8",
|
|
118
|
+
],
|
|
119
|
+
content: ["rounded-md bg-layer-popover", "shadow-lg"],
|
|
120
|
+
header: ["pl-2 pr-1.5 pt-2.5 pb-0.5"],
|
|
121
|
+
separator: ["hidden bg-line-muted"],
|
|
122
|
+
list: ["flex flex-col gap-0.5 px-1.5 py-1"],
|
|
123
|
+
item: [
|
|
124
|
+
"rounded-sm bg-transparent px-2 text-sm font-normal tracking-[-0.005em] text-foreground-muted",
|
|
125
|
+
"transition-[background-color,color] duration-150",
|
|
126
|
+
"hover:bg-foreground/[0.04] hover:text-foreground-strong",
|
|
127
|
+
"data-[highlighted]:bg-foreground/[0.04] data-[highlighted]:text-foreground-strong",
|
|
128
|
+
"data-[disabled]:pointer-events-none data-[disabled]:text-foreground-disabled",
|
|
129
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:stroke-[1.5] [&_svg_*]:stroke-[1.5] [&_svg:not([class*='size-'])]:size-3.5",
|
|
130
|
+
],
|
|
131
|
+
itemIndicator: ["text-foreground-strong"],
|
|
132
|
+
label: ["text-[11px] leading-none tracking-[-0.005em] text-foreground-strong"],
|
|
133
|
+
clear: [
|
|
134
|
+
"text-[11px] font-medium tracking-[-0.005em] text-foreground-muted hover:text-foreground-strong",
|
|
135
|
+
"[&_svg]:![stroke-width:1.5] [&_svg_*]:![stroke-width:1.5]",
|
|
136
|
+
],
|
|
137
|
+
triggerIndicator: [
|
|
138
|
+
"text-foreground-muted opacity-100",
|
|
139
|
+
"[&_svg]:![stroke-width:1.5] [&_svg_*]:![stroke-width:1.5]",
|
|
140
|
+
],
|
|
141
|
+
control: [
|
|
142
|
+
"rounded-md border border-line-subtle bg-layer-field px-2.5 py-1.5",
|
|
143
|
+
"text-sm font-normal text-foreground shadow-[0_1px_1px_oklch(0.21_0.006_285_/_0.05)]",
|
|
144
|
+
"focus-within:border-line-strong/25 focus-within:ring-2 focus-within:ring-line-strong/8",
|
|
145
|
+
"[&_svg]:shrink-0 [&_svg]:stroke-[1.5] [&_svg_*]:stroke-[1.5]",
|
|
146
|
+
"[&_[data-slot='combobox-input']]:text-sm [&_[data-slot='combobox-input']]:font-normal [&_[data-slot='combobox-input']]:text-foreground",
|
|
147
|
+
"[&_[data-slot='combobox-input']::placeholder]:text-foreground-placeholder/70",
|
|
148
|
+
],
|
|
149
|
+
empty: ["text-foreground-muted"],
|
|
150
|
+
groupLabel: ["text-[11px] font-medium leading-none tracking-[-0.005em] text-foreground/45"],
|
|
151
|
+
chips: [
|
|
152
|
+
"rounded-md border border-line-subtle bg-layer-field px-2 py-1",
|
|
153
|
+
"focus-within:border-line-strong/25 focus-within:ring-2 focus-within:ring-line-strong/8",
|
|
154
|
+
],
|
|
155
|
+
chip: ["rounded-sm bg-layer-muted px-1.5 py-0.5 text-xs font-medium text-foreground"],
|
|
156
|
+
chipRemove: ["text-foreground-muted hover:text-foreground-strong"],
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
type ComboboxClearContextValue = {
|
|
163
|
+
visible: boolean;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
const ComboboxClearContext = createContext<ComboboxClearContextValue>({ visible: false });
|
|
167
|
+
|
|
168
|
+
function hasClearableValue(value: unknown) {
|
|
169
|
+
if (Array.isArray(value)) {
|
|
170
|
+
return value.length > 0;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return value != null;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function hasClearableInputValue(value: unknown) {
|
|
177
|
+
if (Array.isArray(value)) {
|
|
178
|
+
return value.length > 0;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (typeof value === "string") {
|
|
182
|
+
return value.length > 0;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (typeof value === "number") {
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return value != null;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export type ComboboxProps<
|
|
193
|
+
Value,
|
|
194
|
+
Multiple extends boolean | undefined = false,
|
|
195
|
+
> = BaseCombobox.Root.Props<Value, Multiple>;
|
|
196
|
+
|
|
197
|
+
export function Combobox<Value, Multiple extends boolean | undefined = false>({
|
|
198
|
+
defaultInputValue,
|
|
199
|
+
defaultValue,
|
|
200
|
+
inputValue,
|
|
201
|
+
onInputValueChange,
|
|
202
|
+
onValueChange,
|
|
203
|
+
value,
|
|
204
|
+
...props
|
|
205
|
+
}: ComboboxProps<Value, Multiple>) {
|
|
206
|
+
const [uncontrolledInputValue, setUncontrolledInputValue] = useState<unknown>(
|
|
207
|
+
defaultInputValue ?? "",
|
|
208
|
+
);
|
|
209
|
+
const [uncontrolledValue, setUncontrolledValue] = useState<unknown>(defaultValue);
|
|
210
|
+
|
|
211
|
+
const resolvedInputValue = inputValue === undefined ? uncontrolledInputValue : inputValue;
|
|
212
|
+
const resolvedValue = value === undefined ? uncontrolledValue : value;
|
|
213
|
+
|
|
214
|
+
return (
|
|
215
|
+
<ComboboxClearContext.Provider
|
|
216
|
+
value={{
|
|
217
|
+
visible: hasClearableValue(resolvedValue) || hasClearableInputValue(resolvedInputValue),
|
|
218
|
+
}}
|
|
219
|
+
>
|
|
220
|
+
<BaseCombobox.Root
|
|
221
|
+
data-slot="combobox"
|
|
222
|
+
defaultInputValue={defaultInputValue}
|
|
223
|
+
defaultValue={defaultValue}
|
|
224
|
+
inputValue={inputValue}
|
|
225
|
+
value={value}
|
|
226
|
+
onInputValueChange={(nextInputValue, eventDetails) => {
|
|
227
|
+
if (inputValue === undefined) {
|
|
228
|
+
setUncontrolledInputValue(nextInputValue);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
onInputValueChange?.(nextInputValue, eventDetails);
|
|
232
|
+
}}
|
|
233
|
+
onValueChange={(nextValue, eventDetails) => {
|
|
234
|
+
if (value === undefined) {
|
|
235
|
+
setUncontrolledValue(nextValue);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
onValueChange?.(nextValue, eventDetails);
|
|
239
|
+
}}
|
|
240
|
+
{...props}
|
|
241
|
+
/>
|
|
242
|
+
</ComboboxClearContext.Provider>
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export type ComboboxLabelProps = StyledProps<BaseCombobox.Label.Props>;
|
|
247
|
+
|
|
248
|
+
export function ComboboxLabel({ className, ...props }: ComboboxLabelProps) {
|
|
249
|
+
const theme = useThemeFamily();
|
|
250
|
+
const { label } = combobox({ theme });
|
|
251
|
+
return (
|
|
252
|
+
<BaseCombobox.Label data-slot="combobox-label" className={label({ className })} {...props} />
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export type ComboboxValueProps = BaseCombobox.Value.Props;
|
|
257
|
+
|
|
258
|
+
export function ComboboxValue(props: ComboboxValueProps) {
|
|
259
|
+
return <BaseCombobox.Value data-slot="combobox-value" {...props} />;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export type ComboboxTriggerProps = StyledProps<BaseCombobox.Trigger.Props>;
|
|
263
|
+
|
|
264
|
+
export function ComboboxTrigger({
|
|
265
|
+
className,
|
|
266
|
+
children,
|
|
267
|
+
render = <Button variant="outline" size="md" />,
|
|
268
|
+
...props
|
|
269
|
+
}: ComboboxTriggerProps) {
|
|
270
|
+
const theme = useThemeFamily();
|
|
271
|
+
const { trigger } = combobox({ theme });
|
|
272
|
+
return (
|
|
273
|
+
<BaseCombobox.Trigger
|
|
274
|
+
data-slot="combobox-trigger"
|
|
275
|
+
render={render}
|
|
276
|
+
className={trigger({ className })}
|
|
277
|
+
{...props}
|
|
278
|
+
>
|
|
279
|
+
<span
|
|
280
|
+
data-slot="combobox-trigger-content"
|
|
281
|
+
className="flex min-w-0 flex-1 items-center gap-1.5"
|
|
282
|
+
>
|
|
283
|
+
{children}
|
|
284
|
+
</span>
|
|
285
|
+
</BaseCombobox.Trigger>
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export type ComboboxTriggerIndicatorProps = StyledProps<ComponentPropsWithRef<"span">>;
|
|
290
|
+
|
|
291
|
+
export function ComboboxTriggerIndicator({ className, ...props }: ComboboxTriggerIndicatorProps) {
|
|
292
|
+
const theme = useThemeFamily();
|
|
293
|
+
const { triggerIndicator } = combobox({ theme });
|
|
294
|
+
return (
|
|
295
|
+
<span
|
|
296
|
+
data-slot="combobox-trigger-indicator"
|
|
297
|
+
className={triggerIndicator({ className })}
|
|
298
|
+
{...props}
|
|
299
|
+
/>
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export type ComboboxInputGroupProps = StyledProps<BaseCombobox.InputGroup.Props>;
|
|
304
|
+
|
|
305
|
+
export function ComboboxInputGroup({ className, ...props }: ComboboxInputGroupProps) {
|
|
306
|
+
const theme = useThemeFamily();
|
|
307
|
+
const { inputGroup } = combobox({ theme });
|
|
308
|
+
return (
|
|
309
|
+
<BaseCombobox.InputGroup
|
|
310
|
+
data-slot="combobox-input-group"
|
|
311
|
+
className={inputGroup({ className })}
|
|
312
|
+
{...props}
|
|
313
|
+
/>
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export type ComboboxControlProps = StyledProps<BaseCombobox.InputGroup.Props>;
|
|
318
|
+
|
|
319
|
+
export function ComboboxControl({ className, ...props }: ComboboxControlProps) {
|
|
320
|
+
const theme = useThemeFamily();
|
|
321
|
+
const { control } = combobox({ theme });
|
|
322
|
+
return (
|
|
323
|
+
<BaseCombobox.InputGroup
|
|
324
|
+
data-slot="combobox-control"
|
|
325
|
+
className={control({ className })}
|
|
326
|
+
{...props}
|
|
327
|
+
/>
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export type ComboboxInputProps = StyledProps<BaseCombobox.Input.Props> & {
|
|
332
|
+
suppressPasswordManager?: boolean;
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
export function ComboboxInput({
|
|
336
|
+
suppressPasswordManager,
|
|
337
|
+
className,
|
|
338
|
+
...props
|
|
339
|
+
}: ComboboxInputProps) {
|
|
340
|
+
const theme = useThemeFamily();
|
|
341
|
+
const { input } = combobox({ theme });
|
|
342
|
+
return (
|
|
343
|
+
<BaseCombobox.Input
|
|
344
|
+
data-slot="combobox-input"
|
|
345
|
+
className={input({ className: [suppressPasswordManager && "keeper-ignore", className] })}
|
|
346
|
+
data-1p-ignore={suppressPasswordManager ? "true" : undefined}
|
|
347
|
+
data-bwignore={suppressPasswordManager ? "true" : undefined}
|
|
348
|
+
data-form-type={suppressPasswordManager ? "other" : undefined}
|
|
349
|
+
data-lpignore={suppressPasswordManager ? "true" : undefined}
|
|
350
|
+
{...props}
|
|
351
|
+
/>
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export type ComboboxPortalProps = BaseCombobox.Portal.Props;
|
|
356
|
+
|
|
357
|
+
export function ComboboxPortal(props: ComboboxPortalProps) {
|
|
358
|
+
return <BaseCombobox.Portal data-slot="combobox-portal" {...props} />;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
export type ComboboxPopupProps = ComponentPropsWithRef<"div">;
|
|
362
|
+
|
|
363
|
+
export function ComboboxPopup({ className, ...props }: ComboboxPopupProps) {
|
|
364
|
+
const theme = useThemeFamily();
|
|
365
|
+
const { content } = combobox({ theme });
|
|
366
|
+
return <div data-slot="combobox-content" className={content({ className })} {...props} />;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
export type ComboboxHeaderProps = ComponentPropsWithRef<"div">;
|
|
370
|
+
|
|
371
|
+
export function ComboboxHeader({ className, ...props }: ComboboxHeaderProps) {
|
|
372
|
+
const theme = useThemeFamily();
|
|
373
|
+
const { header } = combobox({ theme });
|
|
374
|
+
return <div data-slot="combobox-header" className={header({ className })} {...props} />;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
export type ComboboxSeparatorProps = StyledProps<ComponentPropsWithRef<"div">>;
|
|
378
|
+
|
|
379
|
+
export function ComboboxSeparator({ className, ...props }: ComboboxSeparatorProps) {
|
|
380
|
+
const theme = useThemeFamily();
|
|
381
|
+
const { separator } = combobox({ theme });
|
|
382
|
+
return (
|
|
383
|
+
<div
|
|
384
|
+
role="separator"
|
|
385
|
+
aria-orientation="horizontal"
|
|
386
|
+
data-slot="combobox-separator"
|
|
387
|
+
className={separator({ className })}
|
|
388
|
+
{...props}
|
|
389
|
+
/>
|
|
390
|
+
);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
export type ComboboxContentProps = StyledProps<BaseCombobox.Popup.Props> &
|
|
394
|
+
Pick<
|
|
395
|
+
BaseCombobox.Positioner.Props,
|
|
396
|
+
| "align"
|
|
397
|
+
| "alignOffset"
|
|
398
|
+
| "anchor"
|
|
399
|
+
| "arrowPadding"
|
|
400
|
+
| "collisionAvoidance"
|
|
401
|
+
| "collisionBoundary"
|
|
402
|
+
| "collisionPadding"
|
|
403
|
+
| "disableAnchorTracking"
|
|
404
|
+
| "positionMethod"
|
|
405
|
+
| "side"
|
|
406
|
+
| "sideOffset"
|
|
407
|
+
| "sticky"
|
|
408
|
+
> & {
|
|
409
|
+
portalProps?: ComboboxPortalProps;
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
export function ComboboxContent({
|
|
413
|
+
align = "start",
|
|
414
|
+
alignOffset = 0,
|
|
415
|
+
anchor,
|
|
416
|
+
arrowPadding,
|
|
417
|
+
collisionAvoidance,
|
|
418
|
+
collisionBoundary,
|
|
419
|
+
collisionPadding,
|
|
420
|
+
disableAnchorTracking = true,
|
|
421
|
+
positionMethod = "fixed",
|
|
422
|
+
side = "bottom",
|
|
423
|
+
sideOffset = 4,
|
|
424
|
+
sticky,
|
|
425
|
+
portalProps,
|
|
426
|
+
className,
|
|
427
|
+
initialFocus = false,
|
|
428
|
+
finalFocus = false,
|
|
429
|
+
...props
|
|
430
|
+
}: ComboboxContentProps) {
|
|
431
|
+
const theme = useThemeFamily();
|
|
432
|
+
const { positioner, content } = combobox({ theme });
|
|
433
|
+
return (
|
|
434
|
+
<BaseCombobox.Portal {...portalProps}>
|
|
435
|
+
<BaseCombobox.Positioner
|
|
436
|
+
align={align}
|
|
437
|
+
alignOffset={alignOffset}
|
|
438
|
+
anchor={anchor}
|
|
439
|
+
arrowPadding={arrowPadding}
|
|
440
|
+
collisionAvoidance={collisionAvoidance}
|
|
441
|
+
collisionBoundary={collisionBoundary}
|
|
442
|
+
collisionPadding={collisionPadding}
|
|
443
|
+
disableAnchorTracking={disableAnchorTracking}
|
|
444
|
+
positionMethod={positionMethod}
|
|
445
|
+
side={side}
|
|
446
|
+
sideOffset={sideOffset}
|
|
447
|
+
sticky={sticky}
|
|
448
|
+
className={positioner()}
|
|
449
|
+
>
|
|
450
|
+
<BaseCombobox.Popup
|
|
451
|
+
data-slot="combobox-content"
|
|
452
|
+
className={content({ className })}
|
|
453
|
+
initialFocus={initialFocus}
|
|
454
|
+
finalFocus={finalFocus}
|
|
455
|
+
{...props}
|
|
456
|
+
/>
|
|
457
|
+
</BaseCombobox.Positioner>
|
|
458
|
+
</BaseCombobox.Portal>
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
export type ComboboxListProps = StyledProps<BaseCombobox.List.Props>;
|
|
463
|
+
|
|
464
|
+
export function ComboboxList({ className, ...props }: ComboboxListProps) {
|
|
465
|
+
const theme = useThemeFamily();
|
|
466
|
+
const { list } = combobox({ theme });
|
|
467
|
+
return <BaseCombobox.List data-slot="combobox-list" className={list({ className })} {...props} />;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
export type ComboboxItemProps = StyledProps<BaseCombobox.Item.Props>;
|
|
471
|
+
|
|
472
|
+
export function ComboboxItem({ className, ...props }: ComboboxItemProps) {
|
|
473
|
+
const theme = useThemeFamily();
|
|
474
|
+
const { item } = combobox({ theme });
|
|
475
|
+
return <BaseCombobox.Item data-slot="combobox-item" className={item({ className })} {...props} />;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
export type ComboboxItemIndicatorProps = StyledProps<BaseCombobox.ItemIndicator.Props>;
|
|
479
|
+
|
|
480
|
+
export function ComboboxItemIndicator({
|
|
481
|
+
className,
|
|
482
|
+
children,
|
|
483
|
+
...props
|
|
484
|
+
}: ComboboxItemIndicatorProps) {
|
|
485
|
+
const theme = useThemeFamily();
|
|
486
|
+
const { itemIndicator } = combobox({ theme });
|
|
487
|
+
return (
|
|
488
|
+
<BaseCombobox.ItemIndicator
|
|
489
|
+
data-slot="combobox-item-indicator"
|
|
490
|
+
className={itemIndicator({ className })}
|
|
491
|
+
{...props}
|
|
492
|
+
>
|
|
493
|
+
{children ?? <Check aria-hidden className="size-3.5 shrink-0 stroke-[1.5]" />}
|
|
494
|
+
</BaseCombobox.ItemIndicator>
|
|
495
|
+
);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
export type ComboboxClearProps = StyledProps<BaseCombobox.Clear.Props>;
|
|
499
|
+
|
|
500
|
+
export function ComboboxClear({
|
|
501
|
+
className,
|
|
502
|
+
children,
|
|
503
|
+
keepMounted = true,
|
|
504
|
+
...props
|
|
505
|
+
}: ComboboxClearProps) {
|
|
506
|
+
const theme = useThemeFamily();
|
|
507
|
+
const { visible } = use(ComboboxClearContext);
|
|
508
|
+
const { clear } = combobox({ theme });
|
|
509
|
+
return (
|
|
510
|
+
<BaseCombobox.Clear
|
|
511
|
+
data-slot="combobox-clear"
|
|
512
|
+
data-visible={visible ? "" : undefined}
|
|
513
|
+
aria-hidden={visible ? props["aria-hidden"] : true}
|
|
514
|
+
keepMounted={keepMounted}
|
|
515
|
+
className={clear({ className })}
|
|
516
|
+
{...props}
|
|
517
|
+
>
|
|
518
|
+
{children ?? <X aria-hidden className="size-3.5 shrink-0" />}
|
|
519
|
+
</BaseCombobox.Clear>
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
export type ComboboxEmptyProps = StyledProps<BaseCombobox.Empty.Props>;
|
|
524
|
+
|
|
525
|
+
export function ComboboxEmpty({ className, children, ...props }: ComboboxEmptyProps) {
|
|
526
|
+
const theme = useThemeFamily();
|
|
527
|
+
const { empty } = combobox({ theme });
|
|
528
|
+
return (
|
|
529
|
+
<BaseCombobox.Empty data-slot="combobox-empty" {...props}>
|
|
530
|
+
{children == null ? null : (
|
|
531
|
+
<div data-slot="combobox-empty-content" className={empty({ className })}>
|
|
532
|
+
{children}
|
|
533
|
+
</div>
|
|
534
|
+
)}
|
|
535
|
+
</BaseCombobox.Empty>
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
export type ComboboxGroupProps = StyledProps<BaseCombobox.Group.Props>;
|
|
540
|
+
|
|
541
|
+
export function ComboboxGroup({ className, ...props }: ComboboxGroupProps) {
|
|
542
|
+
return <BaseCombobox.Group data-slot="combobox-group" className={className} {...props} />;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
export type ComboboxGroupLabelProps = StyledProps<BaseCombobox.GroupLabel.Props>;
|
|
546
|
+
|
|
547
|
+
export function ComboboxGroupLabel({ className, ...props }: ComboboxGroupLabelProps) {
|
|
548
|
+
const theme = useThemeFamily();
|
|
549
|
+
const { groupLabel } = combobox({ theme });
|
|
550
|
+
return (
|
|
551
|
+
<BaseCombobox.GroupLabel
|
|
552
|
+
data-slot="combobox-group-label"
|
|
553
|
+
className={groupLabel({ className })}
|
|
554
|
+
{...props}
|
|
555
|
+
/>
|
|
556
|
+
);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
export type ComboboxRowProps = StyledProps<BaseCombobox.Row.Props>;
|
|
560
|
+
|
|
561
|
+
export function ComboboxRow({ className, ...props }: ComboboxRowProps) {
|
|
562
|
+
return <BaseCombobox.Row data-slot="combobox-row" className={className} {...props} />;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
export type ComboboxCollectionProps = BaseCombobox.Collection.Props;
|
|
566
|
+
|
|
567
|
+
export function ComboboxCollection(props: ComboboxCollectionProps) {
|
|
568
|
+
return <BaseCombobox.Collection data-slot="combobox-collection" {...props} />;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
export type ComboboxChipsProps = StyledProps<BaseCombobox.Chips.Props>;
|
|
572
|
+
|
|
573
|
+
export function ComboboxChips({ className, ...props }: ComboboxChipsProps) {
|
|
574
|
+
const theme = useThemeFamily();
|
|
575
|
+
const { chips } = combobox({ theme });
|
|
576
|
+
return (
|
|
577
|
+
<BaseCombobox.Chips data-slot="combobox-chips" className={chips({ className })} {...props} />
|
|
578
|
+
);
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
export type ComboboxChipProps = StyledProps<BaseCombobox.Chip.Props>;
|
|
582
|
+
|
|
583
|
+
export function ComboboxChip({ className, ...props }: ComboboxChipProps) {
|
|
584
|
+
const theme = useThemeFamily();
|
|
585
|
+
const { chip } = combobox({ theme });
|
|
586
|
+
return <BaseCombobox.Chip data-slot="combobox-chip" className={chip({ className })} {...props} />;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
export type ComboboxChipRemoveProps = StyledProps<BaseCombobox.ChipRemove.Props>;
|
|
590
|
+
|
|
591
|
+
export function ComboboxChipRemove({ className, children, ...props }: ComboboxChipRemoveProps) {
|
|
592
|
+
const theme = useThemeFamily();
|
|
593
|
+
const { chipRemove } = combobox({ theme });
|
|
594
|
+
return (
|
|
595
|
+
<BaseCombobox.ChipRemove
|
|
596
|
+
data-slot="combobox-chip-remove"
|
|
597
|
+
className={chipRemove({ className })}
|
|
598
|
+
{...props}
|
|
599
|
+
>
|
|
600
|
+
{children ?? <X aria-hidden className="size-3 shrink-0" />}
|
|
601
|
+
</BaseCombobox.ChipRemove>
|
|
602
|
+
);
|
|
603
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export {
|
|
2
|
+
Combobox,
|
|
3
|
+
ComboboxChip,
|
|
4
|
+
ComboboxChipRemove,
|
|
5
|
+
ComboboxChips,
|
|
6
|
+
ComboboxClear,
|
|
7
|
+
ComboboxCollection,
|
|
8
|
+
ComboboxControl,
|
|
9
|
+
ComboboxContent,
|
|
10
|
+
ComboboxEmpty,
|
|
11
|
+
ComboboxGroup,
|
|
12
|
+
ComboboxGroupLabel,
|
|
13
|
+
ComboboxHeader,
|
|
14
|
+
ComboboxInput,
|
|
15
|
+
ComboboxInputGroup,
|
|
16
|
+
ComboboxItem,
|
|
17
|
+
ComboboxItemIndicator,
|
|
18
|
+
ComboboxLabel,
|
|
19
|
+
ComboboxList,
|
|
20
|
+
ComboboxPortal,
|
|
21
|
+
ComboboxPopup,
|
|
22
|
+
ComboboxRow,
|
|
23
|
+
ComboboxSeparator,
|
|
24
|
+
ComboboxTrigger,
|
|
25
|
+
ComboboxTriggerIndicator,
|
|
26
|
+
ComboboxValue,
|
|
27
|
+
type ComboboxChipProps,
|
|
28
|
+
type ComboboxChipRemoveProps,
|
|
29
|
+
type ComboboxChipsProps,
|
|
30
|
+
type ComboboxClearProps,
|
|
31
|
+
type ComboboxCollectionProps,
|
|
32
|
+
type ComboboxControlProps,
|
|
33
|
+
type ComboboxContentProps,
|
|
34
|
+
type ComboboxEmptyProps,
|
|
35
|
+
type ComboboxGroupLabelProps,
|
|
36
|
+
type ComboboxGroupProps,
|
|
37
|
+
type ComboboxHeaderProps,
|
|
38
|
+
type ComboboxInputGroupProps,
|
|
39
|
+
type ComboboxInputProps,
|
|
40
|
+
type ComboboxItemIndicatorProps,
|
|
41
|
+
type ComboboxItemProps,
|
|
42
|
+
type ComboboxLabelProps,
|
|
43
|
+
type ComboboxListProps,
|
|
44
|
+
type ComboboxPopupProps,
|
|
45
|
+
type ComboboxPortalProps,
|
|
46
|
+
type ComboboxProps,
|
|
47
|
+
type ComboboxRowProps,
|
|
48
|
+
type ComboboxSeparatorProps,
|
|
49
|
+
type ComboboxTriggerIndicatorProps,
|
|
50
|
+
type ComboboxTriggerProps,
|
|
51
|
+
type ComboboxValueProps,
|
|
52
|
+
} from "./combobox.tsx";
|