banhaten 0.4.0 → 0.6.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.
- package/CHANGELOG.md +78 -1
- package/CONTRIBUTING.md +6 -4
- package/README.md +4 -2
- package/docs/design-spacing.md +13 -0
- package/docs/design-system/README.md +2 -0
- package/docs/design-system/appearances/default.md +1 -1
- package/docs/design-system/appearances/rounded.md +1 -1
- package/docs/design-system/appearances/sharp.md +1 -1
- package/docs/design-system/component-showcase-consistency-report.md +5 -5
- package/docs/design-system/components/README.md +15 -0
- package/docs/design-system/components/accordion.md +1 -1
- package/docs/design-system/components/activity-feed.md +1 -1
- package/docs/design-system/components/activity-heatmap.md +1 -1
- package/docs/design-system/components/agent-input.md +85 -0
- package/docs/design-system/components/alert-dialog.md +1 -1
- package/docs/design-system/components/alert.md +10 -4
- package/docs/design-system/components/app-header.md +97 -0
- package/docs/design-system/components/approval-card.md +134 -0
- package/docs/design-system/components/attribute.md +14 -2
- package/docs/design-system/components/avatar.md +1 -1
- package/docs/design-system/components/badge.md +1 -1
- package/docs/design-system/components/banner.md +1 -1
- package/docs/design-system/components/breadcrumbs.md +8 -3
- package/docs/design-system/components/button-group.md +1 -1
- package/docs/design-system/components/button.md +8 -5
- package/docs/design-system/components/card.md +15 -1
- package/docs/design-system/components/catalog-components.md +1 -1
- package/docs/design-system/components/chart.md +95 -24
- package/docs/design-system/components/checkbox.md +1 -1
- package/docs/design-system/components/collapsible.md +20 -6
- package/docs/design-system/components/command.md +1 -1
- package/docs/design-system/components/context-menu.md +1 -1
- package/docs/design-system/components/date-picker.md +1 -1
- package/docs/design-system/components/file-upload.md +1 -1
- package/docs/design-system/components/hover-card.md +1 -1
- package/docs/design-system/components/inline-citations.md +93 -0
- package/docs/design-system/components/input-group.md +1 -1
- package/docs/design-system/components/input.md +59 -3
- package/docs/design-system/components/item.md +1 -1
- package/docs/design-system/components/kbd.md +6 -4
- package/docs/design-system/components/menu.md +35 -4
- package/docs/design-system/components/menubar.md +1 -1
- package/docs/design-system/components/modal.md +2 -2
- package/docs/design-system/components/native-select.md +1 -1
- package/docs/design-system/components/navigation-menu.md +1 -1
- package/docs/design-system/components/onboarding-step-list-item.md +1 -1
- package/docs/design-system/components/page-header.md +58 -17
- package/docs/design-system/components/pagination.md +2 -2
- package/docs/design-system/components/popover.md +1 -1
- package/docs/design-system/components/progress-slider.md +1 -1
- package/docs/design-system/components/radio-card.md +1 -1
- package/docs/design-system/components/radio-group.md +1 -1
- package/docs/design-system/components/resizable.md +1 -1
- package/docs/design-system/components/rolling-count.md +61 -0
- package/docs/design-system/components/scroll-area.md +1 -1
- package/docs/design-system/components/select.md +12 -2
- package/docs/design-system/components/sheet.md +1 -1
- package/docs/design-system/components/shimmer-text.md +67 -0
- package/docs/design-system/components/sidebar.md +75 -8
- package/docs/design-system/components/skeleton.md +2 -2
- package/docs/design-system/components/slideout.md +1 -1
- package/docs/design-system/components/slider.md +2 -2
- package/docs/design-system/components/social-button.md +2 -2
- package/docs/design-system/components/streaming-text.md +82 -0
- package/docs/design-system/components/table.md +103 -21
- package/docs/design-system/components/tabs.md +25 -6
- package/docs/design-system/components/tag.md +1 -1
- package/docs/design-system/components/task-list.md +95 -0
- package/docs/design-system/components/textarea.md +1 -1
- package/docs/design-system/components/thinking-reasoning.md +72 -0
- package/docs/design-system/components/thinking-state.md +67 -0
- package/docs/design-system/components/timeline.md +1 -1
- package/docs/design-system/components/toast.md +1 -1
- package/docs/design-system/components/toggle.md +2 -2
- package/docs/design-system/components/toolbar.md +11 -6
- package/docs/design-system/components/tooltip.md +6 -4
- package/docs/design-system/density-and-elevation.md +16 -16
- package/docs/design-system/design-system-test-missing-items.md +8 -8
- package/docs/design-system/installation.md +2 -0
- package/docs/design-system/tabs.md +2 -1
- package/docs/design-system/template-gap-audit.md +32 -0
- package/docs/design-system/templates.md +59 -0
- package/docs/design-system/token-governance.md +15 -2
- package/package.json +2 -2
- package/registry/components/accordion.tsx +2 -2
- package/registry/components/agent-input-parts.tsx +552 -0
- package/registry/components/agent-input-state.ts +156 -0
- package/registry/components/agent-input.css +307 -0
- package/registry/components/agent-input.tsx +382 -0
- package/registry/components/alert-dialog.tsx +2 -2
- package/registry/components/alert.tsx +23 -7
- package/registry/components/app-header.tsx +151 -0
- package/registry/components/approval-card.css +409 -0
- package/registry/components/approval-card.tsx +401 -0
- package/registry/components/approval-frame.tsx +108 -0
- package/registry/components/approval-questions.tsx +559 -0
- package/registry/components/attribute.tsx +48 -13
- package/registry/components/autocomplete.tsx +15 -68
- package/registry/components/avatar.tsx +2 -2
- package/registry/components/badge.tsx +8 -7
- package/registry/components/button-group.tsx +2 -2
- package/registry/components/button.tsx +19 -14
- package/registry/components/card.tsx +18 -5
- package/registry/components/chart-block-data.ts +177 -0
- package/registry/components/chart-block.css +171 -0
- package/registry/components/chart-block.tsx +260 -0
- package/registry/components/chart-interactions.ts +123 -0
- package/registry/components/chart-options.cartesian.ts +162 -0
- package/registry/components/chart-options.paint.ts +99 -0
- package/registry/components/chart-options.parts.ts +72 -0
- package/registry/components/chart-options.radial.ts +109 -0
- package/registry/components/chart-options.ts +44 -0
- package/registry/components/chart-options.types.ts +67 -0
- package/registry/components/chart.tsx +1 -1
- package/registry/components/checkbox.tsx +6 -6
- package/registry/components/collapsible.tsx +43 -3
- package/registry/components/command.tsx +1 -1
- package/registry/components/context-menu.tsx +1 -1
- package/registry/components/data-chart.tsx +40 -0
- package/registry/components/date-picker.tsx +9 -9
- package/registry/components/echart-theme.ts +246 -0
- package/registry/components/echart.css +49 -0
- package/registry/components/echart.tsx +178 -0
- package/registry/components/expanded/Breadcrumbs.tsx +5 -1
- package/registry/components/expanded/PageHeader.tsx +67 -24
- package/registry/components/expanded/Table.tsx +60 -22
- package/registry/components/expanded/activityFeed.css +2 -2
- package/registry/components/expanded/activityHeatmap.css +1 -1
- package/registry/components/expanded/banner.css +2 -2
- package/registry/components/expanded/breadcrumbs.css +19 -2
- package/registry/components/expanded/catalogComponentsShowcase.css +1 -1
- package/registry/components/expanded/fileUpload.css +7 -7
- package/registry/components/expanded/onboardingStepListItem.css +2 -2
- package/registry/components/expanded/pageHeader.css +38 -44
- package/registry/components/expanded/slideout.css +4 -4
- package/registry/components/expanded/table.css +58 -9
- package/registry/components/expanded/timeline.css +1 -1
- package/registry/components/hover-card.tsx +1 -1
- package/registry/components/inline-citations.css +126 -0
- package/registry/components/inline-citations.tsx +292 -0
- package/registry/components/input-group.tsx +4 -4
- package/registry/components/input.tsx +150 -137
- package/registry/components/item.tsx +1 -1
- package/registry/components/kbd.tsx +3 -2
- package/registry/components/menu.tsx +117 -12
- package/registry/components/menubar.tsx +2 -2
- package/registry/components/modal.tsx +3 -3
- package/registry/components/native-select.tsx +4 -4
- package/registry/components/navigation-menu.tsx +2 -2
- package/registry/components/pagination.tsx +4 -4
- package/registry/components/popover.tsx +3 -3
- package/registry/components/progress-slider.tsx +1 -1
- package/registry/components/radio-card.tsx +7 -7
- package/registry/components/radio-group.tsx +2 -2
- package/registry/components/resizable.tsx +2 -2
- package/registry/components/rolling-count.css +37 -0
- package/registry/components/rolling-count.tsx +110 -0
- package/registry/components/scroll-area.tsx +1 -1
- package/registry/components/select.tsx +15 -10
- package/registry/components/sheet.tsx +2 -2
- package/registry/components/shimmer-text.css +69 -0
- package/registry/components/shimmer-text.tsx +43 -0
- package/registry/components/sidebar.tsx +528 -223
- package/registry/components/skeleton.tsx +1 -1
- package/registry/components/slider.tsx +2 -2
- package/registry/components/social-button.tsx +1 -1
- package/registry/components/streaming-text.css +45 -0
- package/registry/components/streaming-text.tsx +165 -0
- package/registry/components/table-elements.tsx +164 -5
- package/registry/components/tabs.css +32 -4
- package/registry/components/tabs.tsx +5 -1
- package/registry/components/tag.tsx +1 -1
- package/registry/components/task-list.css +328 -0
- package/registry/components/task-list.tsx +429 -0
- package/registry/components/textarea.tsx +4 -4
- package/registry/components/thinking-reasoning.css +178 -0
- package/registry/components/thinking-reasoning.tsx +253 -0
- package/registry/components/thinking-state.css +8 -0
- package/registry/components/thinking-state.tsx +46 -0
- package/registry/components/toast.tsx +1 -1
- package/registry/components/toggle.tsx +2 -2
- package/registry/components/toolbar.tsx +6 -6
- package/registry/components/tooltip.tsx +6 -4
- package/registry/examples/agent-input-demo.tsx +90 -0
- package/registry/examples/app-header-demo.tsx +40 -0
- package/registry/examples/approval-card-demo.tsx +83 -0
- package/registry/examples/button-demo.tsx +3 -0
- package/registry/examples/chart-block-demo.tsx +5 -0
- package/registry/examples/chart-demo.tsx +6 -21
- package/registry/examples/collection-filter-bar-demo.tsx +1 -1
- package/registry/examples/control-density-contract-demo.tsx +5 -1
- package/registry/examples/inline-citations-demo.tsx +31 -0
- package/registry/examples/input-actions-demo.tsx +36 -0
- package/registry/examples/menu-demo.tsx +1 -1
- package/registry/examples/popover-demo.tsx +1 -0
- package/registry/examples/rolling-count-demo.tsx +39 -0
- package/registry/examples/shimmer-text-demo.tsx +20 -0
- package/registry/examples/streaming-text-demo.tsx +28 -0
- package/registry/examples/task-list-demo.tsx +74 -0
- package/registry/examples/thinking-reasoning-demo.tsx +74 -0
- package/registry/examples/thinking-state-demo.tsx +13 -0
- package/registry/guidance/charts.LICENSE.txt +24 -0
- package/registry/hooks/use-controllable-state.ts +33 -0
- package/registry/hooks/use-listbox-navigation.ts +73 -0
- package/registry/hooks/use-motion-end.ts +55 -0
- package/registry/hooks/use-reduced-motion.ts +28 -0
- package/registry/index.json +1808 -190
- package/registry/styles/globals.css +992 -1088
- package/registry.json +385 -10
- package/schema/registry.schema.json +5 -1
- package/schema/tokens.schema.json +8 -4
- package/src/cli/file-transaction.js +15 -8
- package/src/cli/index.js +22 -29
- package/tokens/banhaten.tokens.json +490 -192
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type * as React from "react"
|
|
2
|
+
|
|
3
|
+
type AgentInputPhase = "idle" | "enhancing" | "enhanced"
|
|
4
|
+
|
|
5
|
+
type AgentInputModel = {
|
|
6
|
+
description?: string
|
|
7
|
+
icon?: React.ReactNode
|
|
8
|
+
id: string
|
|
9
|
+
/** Secondary detail such as the context window. */
|
|
10
|
+
meta?: string
|
|
11
|
+
name: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type AgentInputSkill = {
|
|
15
|
+
icon?: React.ReactNode
|
|
16
|
+
id: string
|
|
17
|
+
name: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
type AgentInputAttachment = {
|
|
21
|
+
/** The picked file to upload. Attachments you pass in yourself may omit it. */
|
|
22
|
+
file?: File
|
|
23
|
+
id: string
|
|
24
|
+
kind: "image" | "file"
|
|
25
|
+
name: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
type AgentInputPayload = {
|
|
29
|
+
attachments: readonly AgentInputAttachment[]
|
|
30
|
+
model?: string
|
|
31
|
+
skills: readonly string[]
|
|
32
|
+
text: string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type AgentInputLabels = {
|
|
36
|
+
addFiles: string
|
|
37
|
+
addMenu: string
|
|
38
|
+
addPhotos: string
|
|
39
|
+
enhance: string
|
|
40
|
+
enhancing: string
|
|
41
|
+
model: string
|
|
42
|
+
noSkills: string
|
|
43
|
+
placeholder: string
|
|
44
|
+
removeAttachment: (name: string) => string
|
|
45
|
+
removeSkill: (name: string) => string
|
|
46
|
+
revert: string
|
|
47
|
+
send: string
|
|
48
|
+
skills: string
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
type AttachmentKind = AgentInputAttachment["kind"]
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A file's own type decides its kind; the picker it came from only decides
|
|
55
|
+
* for files the browser could not type.
|
|
56
|
+
*/
|
|
57
|
+
function attachmentKind(file: File, picker: AttachmentKind): AttachmentKind {
|
|
58
|
+
if (file.type.startsWith("image/")) return "image"
|
|
59
|
+
return file.type ? "file" : picker
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* ---------------------------------------------------------- Slash tokens */
|
|
63
|
+
|
|
64
|
+
type SlashToken = { end: number; start: number }
|
|
65
|
+
|
|
66
|
+
const slashPattern = /(?:^|\s)\/([^\s/]*)$/
|
|
67
|
+
|
|
68
|
+
/** The "/query" typed right before the caret, if there is one. */
|
|
69
|
+
function findSlashQuery(text: string, caret: number) {
|
|
70
|
+
const before = text.slice(0, caret)
|
|
71
|
+
const match = before.match(slashPattern)
|
|
72
|
+
if (!match) return null
|
|
73
|
+
const query = match[1]
|
|
74
|
+
return { end: caret, query, start: before.length - query.length - 1 }
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Skills whose name contains the query, ignoring case. */
|
|
78
|
+
function matchSkills(skills: readonly AgentInputSkill[], query: string) {
|
|
79
|
+
const needle = query.toLowerCase()
|
|
80
|
+
return skills.filter((skill) => skill.name.toLowerCase().includes(needle))
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* The text without a slash token, and without the spaces it leaves at the end,
|
|
85
|
+
* including the no-break space some keyboards type.
|
|
86
|
+
*/
|
|
87
|
+
function withoutSlashToken(text: string, token: SlashToken) {
|
|
88
|
+
return (text.slice(0, token.start) + text.slice(token.end)).replace(/[ ]+$/, "")
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* ------------------------------------------------------------------ Chips */
|
|
92
|
+
|
|
93
|
+
type Chip =
|
|
94
|
+
| { key: string; kind: "skill"; skillId: string }
|
|
95
|
+
| { attachment: AgentInputAttachment; key: string; kind: "attachment" }
|
|
96
|
+
|
|
97
|
+
type ChipEntry = { chip: Chip; exiting: boolean }
|
|
98
|
+
|
|
99
|
+
/** A removed chip's copy and the index it had when it left. */
|
|
100
|
+
type LeavingChip = { chip: Chip; index: number }
|
|
101
|
+
|
|
102
|
+
/** Skill chips first, then attachments, keyed so each keeps its identity. */
|
|
103
|
+
function chipsOf(
|
|
104
|
+
skillIds: readonly string[],
|
|
105
|
+
attachments: readonly AgentInputAttachment[]
|
|
106
|
+
): Chip[] {
|
|
107
|
+
return [
|
|
108
|
+
...skillIds.map((skillId): Chip => ({ key: `skill-${skillId}`, kind: "skill", skillId })),
|
|
109
|
+
...attachments.map(
|
|
110
|
+
(attachment): Chip => ({ attachment, key: `attachment-${attachment.id}`, kind: "attachment" })
|
|
111
|
+
),
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** The live chips with leaving copies spliced back in where they were. */
|
|
116
|
+
function withLeavingChips(live: readonly Chip[], leaving: readonly LeavingChip[]) {
|
|
117
|
+
const liveKeys = new Set(live.map((chip) => chip.key))
|
|
118
|
+
const chips: ChipEntry[] = live.map((chip) => ({ chip, exiting: false }))
|
|
119
|
+
for (const { chip, index } of [...leaving].sort((a, b) => a.index - b.index)) {
|
|
120
|
+
if (liveKeys.has(chip.key)) continue
|
|
121
|
+
chips.splice(Math.min(index, chips.length), 0, { chip, exiting: true })
|
|
122
|
+
}
|
|
123
|
+
return chips
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Drops a copy whose exit ended; later copies close the gap it leaves. */
|
|
127
|
+
function settleLeavingChip(leaving: readonly LeavingChip[], key: string) {
|
|
128
|
+
const settled = leaving.find(({ chip }) => chip.key === key)
|
|
129
|
+
if (!settled) return leaving
|
|
130
|
+
return leaving
|
|
131
|
+
.filter((entry) => entry !== settled)
|
|
132
|
+
.map((entry) => (entry.index > settled.index ? { ...entry, index: entry.index - 1 } : entry))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export {
|
|
136
|
+
attachmentKind,
|
|
137
|
+
chipsOf,
|
|
138
|
+
findSlashQuery,
|
|
139
|
+
matchSkills,
|
|
140
|
+
settleLeavingChip,
|
|
141
|
+
withLeavingChips,
|
|
142
|
+
withoutSlashToken,
|
|
143
|
+
}
|
|
144
|
+
export type {
|
|
145
|
+
AgentInputAttachment,
|
|
146
|
+
AgentInputLabels,
|
|
147
|
+
AgentInputModel,
|
|
148
|
+
AgentInputPayload,
|
|
149
|
+
AgentInputPhase,
|
|
150
|
+
AgentInputSkill,
|
|
151
|
+
AttachmentKind,
|
|
152
|
+
Chip,
|
|
153
|
+
ChipEntry,
|
|
154
|
+
LeavingChip,
|
|
155
|
+
SlashToken,
|
|
156
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
[data-slot="agent-input"] {
|
|
2
|
+
--agent-input-radius: var(--bh-radius-2xl-12);
|
|
3
|
+
--agent-input-ring-width: var(--bh-agent-input-ring-width);
|
|
4
|
+
|
|
5
|
+
color: var(--bh-content-default);
|
|
6
|
+
font-family: var(--bh-font-family);
|
|
7
|
+
inline-size: 100%;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
[data-slot="agent-input-frame"] {
|
|
11
|
+
background-color: var(--bh-bg-raised);
|
|
12
|
+
border-radius: var(--agent-input-radius);
|
|
13
|
+
box-shadow: var(--elevation-02);
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
gap: var(--bh-space-xl-12);
|
|
17
|
+
padding: var(--bh-space-md-8) var(--bh-space-lg-10) var(--bh-space-lg-10);
|
|
18
|
+
position: relative;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
[data-slot="agent-input-frame"]:has([data-slot="agent-input-chips"]) {
|
|
22
|
+
padding-block-start: var(--bh-space-lg-10);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* While enhancing, a conic accent ring sweeps around the frame. */
|
|
26
|
+
@property --agent-input-angle {
|
|
27
|
+
syntax: "<angle>";
|
|
28
|
+
inherits: false;
|
|
29
|
+
initial-value: 0deg;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
[data-slot="agent-input-frame"][data-enhancing="true"]::after {
|
|
33
|
+
animation: bh-agent-input-ring-spin var(--bh-agent-input-ring-duration) linear
|
|
34
|
+
infinite,
|
|
35
|
+
bh-agent-input-fade-in var(--bh-duration-default)
|
|
36
|
+
var(--bh-easing-emphasized) both;
|
|
37
|
+
background: conic-gradient(
|
|
38
|
+
from var(--agent-input-angle),
|
|
39
|
+
var(--bh-content-accent-blue-default),
|
|
40
|
+
var(--bh-content-accent-purple-default),
|
|
41
|
+
var(--bh-content-accent-fuchsia-default),
|
|
42
|
+
var(--bh-content-accent-aqua-default),
|
|
43
|
+
var(--bh-content-accent-blue-default)
|
|
44
|
+
)
|
|
45
|
+
border-box;
|
|
46
|
+
border: var(--agent-input-ring-width) solid transparent;
|
|
47
|
+
border-radius: calc(var(--agent-input-radius) + var(--agent-input-ring-width));
|
|
48
|
+
content: "";
|
|
49
|
+
inset: calc(-1 * var(--agent-input-ring-width));
|
|
50
|
+
mask: linear-gradient(black 0 0) padding-box, linear-gradient(black 0 0);
|
|
51
|
+
-webkit-mask: linear-gradient(black 0 0) padding-box, linear-gradient(black 0 0);
|
|
52
|
+
mask-composite: exclude;
|
|
53
|
+
-webkit-mask-composite: xor;
|
|
54
|
+
pointer-events: none;
|
|
55
|
+
position: absolute;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
[data-slot="agent-input-chips"] {
|
|
59
|
+
display: flex;
|
|
60
|
+
flex-wrap: wrap;
|
|
61
|
+
gap: var(--bh-space-sm-6);
|
|
62
|
+
margin-block-end: calc(-1 * var(--bh-space-sm-6));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
[data-slot="agent-input-chip"] {
|
|
66
|
+
animation: bh-agent-input-chip-in var(--bh-duration-moderate)
|
|
67
|
+
var(--bh-easing-emphasized) both;
|
|
68
|
+
display: inline-flex;
|
|
69
|
+
max-inline-size: 100%;
|
|
70
|
+
min-inline-size: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
[data-slot="agent-input-chip"][data-exit="true"],
|
|
74
|
+
[data-slot="agent-input-enhance"][data-exit="true"] {
|
|
75
|
+
animation: bh-agent-input-out var(--bh-duration-default)
|
|
76
|
+
var(--bh-easing-emphasized) both;
|
|
77
|
+
pointer-events: none;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
[data-slot="agent-input-editor"] {
|
|
81
|
+
position: relative;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
[data-slot="agent-input-field"] {
|
|
85
|
+
background: transparent;
|
|
86
|
+
border: 0;
|
|
87
|
+
color: var(--bh-content-default);
|
|
88
|
+
display: block;
|
|
89
|
+
font-family: inherit;
|
|
90
|
+
font-size: var(--bh-text-body-sm-regular-font-size);
|
|
91
|
+
font-weight: var(--bh-text-body-sm-regular-font-weight);
|
|
92
|
+
inline-size: 100%;
|
|
93
|
+
letter-spacing: var(--bh-text-body-sm-regular-letter-spacing);
|
|
94
|
+
line-height: var(--bh-text-body-sm-regular-line-height);
|
|
95
|
+
margin: 0;
|
|
96
|
+
max-block-size: var(--bh-agent-input-field-max-height);
|
|
97
|
+
min-block-size: var(--bh-text-body-sm-regular-line-height);
|
|
98
|
+
outline: none;
|
|
99
|
+
overflow-wrap: anywhere;
|
|
100
|
+
overflow-y: auto;
|
|
101
|
+
padding: 0;
|
|
102
|
+
resize: none;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
[data-slot="agent-input-field"]::placeholder {
|
|
106
|
+
color: var(--bh-content-muted);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
[data-slot="agent-input-field"]:disabled {
|
|
110
|
+
color: var(--bh-content-disabled);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
[data-slot="agent-input-enhancing"] {
|
|
114
|
+
display: block;
|
|
115
|
+
font-size: var(--bh-text-body-sm-regular-font-size);
|
|
116
|
+
font-weight: var(--bh-text-body-sm-regular-font-weight);
|
|
117
|
+
letter-spacing: var(--bh-text-body-sm-regular-letter-spacing);
|
|
118
|
+
line-height: var(--bh-text-body-sm-regular-line-height);
|
|
119
|
+
overflow-wrap: anywhere;
|
|
120
|
+
white-space: pre-wrap;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Slash palette: pinned above the field, aligned to the logical start. */
|
|
124
|
+
[data-slot="agent-input-palette"] {
|
|
125
|
+
animation: bh-agent-input-palette-in var(--bh-duration-default)
|
|
126
|
+
var(--bh-easing-emphasized) both;
|
|
127
|
+
background-color: var(--bh-menu-bg);
|
|
128
|
+
border-radius: var(--bh-menu-radius);
|
|
129
|
+
box-shadow: var(--elevation-menu);
|
|
130
|
+
inline-size: var(--bh-agent-input-palette-width);
|
|
131
|
+
inset-block-end: calc(100% + var(--bh-space-md-8));
|
|
132
|
+
inset-inline-start: 0;
|
|
133
|
+
max-inline-size: 100%;
|
|
134
|
+
padding: var(--bh-space-xs-4);
|
|
135
|
+
position: absolute;
|
|
136
|
+
z-index: var(--bh-z-popover);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
[data-slot="agent-input-palette-label"],
|
|
140
|
+
[data-slot="agent-input-palette-empty"] {
|
|
141
|
+
color: var(--bh-content-subtle);
|
|
142
|
+
font-size: var(--bh-text-body-2xs-regular-font-size);
|
|
143
|
+
font-weight: var(--bh-text-body-2xs-regular-font-weight);
|
|
144
|
+
line-height: var(--bh-text-body-2xs-regular-line-height);
|
|
145
|
+
padding: var(--bh-space-xs-4) var(--bh-space-md-8);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
[data-slot="agent-input-palette-item"] {
|
|
149
|
+
align-items: center;
|
|
150
|
+
background: transparent;
|
|
151
|
+
border: 0;
|
|
152
|
+
border-radius: var(--bh-menu-item-radius);
|
|
153
|
+
color: var(--bh-content-default);
|
|
154
|
+
cursor: pointer;
|
|
155
|
+
display: flex;
|
|
156
|
+
font: inherit;
|
|
157
|
+
font-size: var(--bh-text-body-xs-regular-font-size);
|
|
158
|
+
font-weight: var(--bh-text-body-xs-regular-font-weight);
|
|
159
|
+
gap: var(--bh-space-sm-6);
|
|
160
|
+
inline-size: 100%;
|
|
161
|
+
letter-spacing: var(--bh-text-body-xs-regular-letter-spacing);
|
|
162
|
+
line-height: var(--bh-text-body-xs-regular-line-height);
|
|
163
|
+
min-block-size: var(--bh-space-6xl-32);
|
|
164
|
+
outline: none;
|
|
165
|
+
padding: 0 var(--bh-space-md-8);
|
|
166
|
+
text-align: start;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
[data-slot="agent-input-palette-item"][data-active="true"] {
|
|
170
|
+
background-color: var(--bh-menu-item-hover-bg);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
[data-slot="agent-input-palette"][data-keyboard="false"]
|
|
174
|
+
[data-slot="agent-input-palette-item"]:hover {
|
|
175
|
+
background-color: var(--bh-menu-item-hover-bg);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
[data-slot="agent-input-palette-icon"] {
|
|
179
|
+
color: var(--bh-content-subtle);
|
|
180
|
+
display: inline-flex;
|
|
181
|
+
flex: none;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
[data-slot="agent-input-palette-icon"] > svg {
|
|
185
|
+
block-size: var(--bh-space-2xl-14);
|
|
186
|
+
inline-size: var(--bh-space-2xl-14);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
[data-slot="agent-input-palette-name"] {
|
|
190
|
+
min-inline-size: 0;
|
|
191
|
+
overflow: hidden;
|
|
192
|
+
text-overflow: ellipsis;
|
|
193
|
+
white-space: nowrap;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
[data-slot="agent-input-row"] {
|
|
197
|
+
align-items: center;
|
|
198
|
+
display: flex;
|
|
199
|
+
gap: var(--bh-space-md-8);
|
|
200
|
+
justify-content: space-between;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
[data-slot="agent-input-actions"] {
|
|
204
|
+
align-items: center;
|
|
205
|
+
display: flex;
|
|
206
|
+
gap: var(--bh-space-sm-6);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
[data-slot="agent-input-add-icon"] {
|
|
210
|
+
transition: transform var(--bh-duration-default) var(--bh-easing-emphasized);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
[data-slot="agent-input-add"][data-open="true"] [data-slot="agent-input-add-icon"] {
|
|
214
|
+
transform: rotate(45deg);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
[data-slot="agent-input-enhance"] {
|
|
218
|
+
animation: bh-agent-input-pill-in var(--bh-duration-moderate)
|
|
219
|
+
var(--bh-easing-emphasized) both;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
[data-slot="agent-input-spinner"] {
|
|
223
|
+
align-items: center;
|
|
224
|
+
block-size: var(--bh-button-xs-height);
|
|
225
|
+
color: var(--bh-content-subtle);
|
|
226
|
+
display: inline-flex;
|
|
227
|
+
inline-size: var(--bh-button-xs-height);
|
|
228
|
+
justify-content: center;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@keyframes bh-agent-input-ring-spin {
|
|
232
|
+
to {
|
|
233
|
+
--agent-input-angle: 360deg;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
@keyframes bh-agent-input-fade-in {
|
|
238
|
+
from {
|
|
239
|
+
opacity: var(--bh-opacity-0);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
to {
|
|
243
|
+
opacity: var(--bh-opacity-100);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
@keyframes bh-agent-input-chip-in {
|
|
248
|
+
from {
|
|
249
|
+
filter: blur(var(--bh-space-xxs-2));
|
|
250
|
+
opacity: var(--bh-opacity-0);
|
|
251
|
+
transform: translateY(var(--bh-space-xs-4));
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
to {
|
|
255
|
+
filter: blur(0);
|
|
256
|
+
opacity: var(--bh-opacity-100);
|
|
257
|
+
transform: translateY(0);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
@keyframes bh-agent-input-pill-in {
|
|
262
|
+
from {
|
|
263
|
+
filter: blur(var(--bh-space-xxs-2));
|
|
264
|
+
opacity: var(--bh-opacity-0);
|
|
265
|
+
transform: scale(0.96);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
to {
|
|
269
|
+
filter: blur(0);
|
|
270
|
+
opacity: var(--bh-opacity-100);
|
|
271
|
+
transform: scale(1);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
@keyframes bh-agent-input-out {
|
|
276
|
+
from {
|
|
277
|
+
filter: blur(0);
|
|
278
|
+
opacity: var(--bh-opacity-100);
|
|
279
|
+
transform: scale(1);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
to {
|
|
283
|
+
filter: blur(var(--bh-space-xxs-2));
|
|
284
|
+
opacity: var(--bh-opacity-0);
|
|
285
|
+
transform: scale(0.96);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
@keyframes bh-agent-input-palette-in {
|
|
290
|
+
from {
|
|
291
|
+
filter: blur(var(--bh-space-xxs-2));
|
|
292
|
+
opacity: var(--bh-opacity-0);
|
|
293
|
+
transform: translateY(var(--bh-space-sm-6)) scale(0.98);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
to {
|
|
297
|
+
filter: blur(0);
|
|
298
|
+
opacity: var(--bh-opacity-100);
|
|
299
|
+
transform: translateY(0) scale(1);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
@media (prefers-reduced-motion: reduce) {
|
|
304
|
+
[data-slot="agent-input-frame"][data-enhancing="true"]::after {
|
|
305
|
+
animation: none;
|
|
306
|
+
}
|
|
307
|
+
}
|