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.
Files changed (214) hide show
  1. package/CHANGELOG.md +78 -1
  2. package/CONTRIBUTING.md +6 -4
  3. package/README.md +4 -2
  4. package/docs/design-spacing.md +13 -0
  5. package/docs/design-system/README.md +2 -0
  6. package/docs/design-system/appearances/default.md +1 -1
  7. package/docs/design-system/appearances/rounded.md +1 -1
  8. package/docs/design-system/appearances/sharp.md +1 -1
  9. package/docs/design-system/component-showcase-consistency-report.md +5 -5
  10. package/docs/design-system/components/README.md +15 -0
  11. package/docs/design-system/components/accordion.md +1 -1
  12. package/docs/design-system/components/activity-feed.md +1 -1
  13. package/docs/design-system/components/activity-heatmap.md +1 -1
  14. package/docs/design-system/components/agent-input.md +85 -0
  15. package/docs/design-system/components/alert-dialog.md +1 -1
  16. package/docs/design-system/components/alert.md +10 -4
  17. package/docs/design-system/components/app-header.md +97 -0
  18. package/docs/design-system/components/approval-card.md +134 -0
  19. package/docs/design-system/components/attribute.md +14 -2
  20. package/docs/design-system/components/avatar.md +1 -1
  21. package/docs/design-system/components/badge.md +1 -1
  22. package/docs/design-system/components/banner.md +1 -1
  23. package/docs/design-system/components/breadcrumbs.md +8 -3
  24. package/docs/design-system/components/button-group.md +1 -1
  25. package/docs/design-system/components/button.md +8 -5
  26. package/docs/design-system/components/card.md +15 -1
  27. package/docs/design-system/components/catalog-components.md +1 -1
  28. package/docs/design-system/components/chart.md +95 -24
  29. package/docs/design-system/components/checkbox.md +1 -1
  30. package/docs/design-system/components/collapsible.md +20 -6
  31. package/docs/design-system/components/command.md +1 -1
  32. package/docs/design-system/components/context-menu.md +1 -1
  33. package/docs/design-system/components/date-picker.md +1 -1
  34. package/docs/design-system/components/file-upload.md +1 -1
  35. package/docs/design-system/components/hover-card.md +1 -1
  36. package/docs/design-system/components/inline-citations.md +93 -0
  37. package/docs/design-system/components/input-group.md +1 -1
  38. package/docs/design-system/components/input.md +59 -3
  39. package/docs/design-system/components/item.md +1 -1
  40. package/docs/design-system/components/kbd.md +6 -4
  41. package/docs/design-system/components/menu.md +35 -4
  42. package/docs/design-system/components/menubar.md +1 -1
  43. package/docs/design-system/components/modal.md +2 -2
  44. package/docs/design-system/components/native-select.md +1 -1
  45. package/docs/design-system/components/navigation-menu.md +1 -1
  46. package/docs/design-system/components/onboarding-step-list-item.md +1 -1
  47. package/docs/design-system/components/page-header.md +58 -17
  48. package/docs/design-system/components/pagination.md +2 -2
  49. package/docs/design-system/components/popover.md +1 -1
  50. package/docs/design-system/components/progress-slider.md +1 -1
  51. package/docs/design-system/components/radio-card.md +1 -1
  52. package/docs/design-system/components/radio-group.md +1 -1
  53. package/docs/design-system/components/resizable.md +1 -1
  54. package/docs/design-system/components/rolling-count.md +61 -0
  55. package/docs/design-system/components/scroll-area.md +1 -1
  56. package/docs/design-system/components/select.md +12 -2
  57. package/docs/design-system/components/sheet.md +1 -1
  58. package/docs/design-system/components/shimmer-text.md +67 -0
  59. package/docs/design-system/components/sidebar.md +75 -8
  60. package/docs/design-system/components/skeleton.md +2 -2
  61. package/docs/design-system/components/slideout.md +1 -1
  62. package/docs/design-system/components/slider.md +2 -2
  63. package/docs/design-system/components/social-button.md +2 -2
  64. package/docs/design-system/components/streaming-text.md +82 -0
  65. package/docs/design-system/components/table.md +103 -21
  66. package/docs/design-system/components/tabs.md +25 -6
  67. package/docs/design-system/components/tag.md +1 -1
  68. package/docs/design-system/components/task-list.md +95 -0
  69. package/docs/design-system/components/textarea.md +1 -1
  70. package/docs/design-system/components/thinking-reasoning.md +72 -0
  71. package/docs/design-system/components/thinking-state.md +67 -0
  72. package/docs/design-system/components/timeline.md +1 -1
  73. package/docs/design-system/components/toast.md +1 -1
  74. package/docs/design-system/components/toggle.md +2 -2
  75. package/docs/design-system/components/toolbar.md +11 -6
  76. package/docs/design-system/components/tooltip.md +6 -4
  77. package/docs/design-system/density-and-elevation.md +16 -16
  78. package/docs/design-system/design-system-test-missing-items.md +8 -8
  79. package/docs/design-system/installation.md +2 -0
  80. package/docs/design-system/tabs.md +2 -1
  81. package/docs/design-system/template-gap-audit.md +32 -0
  82. package/docs/design-system/templates.md +59 -0
  83. package/docs/design-system/token-governance.md +15 -2
  84. package/package.json +2 -2
  85. package/registry/components/accordion.tsx +2 -2
  86. package/registry/components/agent-input-parts.tsx +552 -0
  87. package/registry/components/agent-input-state.ts +156 -0
  88. package/registry/components/agent-input.css +307 -0
  89. package/registry/components/agent-input.tsx +382 -0
  90. package/registry/components/alert-dialog.tsx +2 -2
  91. package/registry/components/alert.tsx +23 -7
  92. package/registry/components/app-header.tsx +151 -0
  93. package/registry/components/approval-card.css +409 -0
  94. package/registry/components/approval-card.tsx +401 -0
  95. package/registry/components/approval-frame.tsx +108 -0
  96. package/registry/components/approval-questions.tsx +559 -0
  97. package/registry/components/attribute.tsx +48 -13
  98. package/registry/components/autocomplete.tsx +15 -68
  99. package/registry/components/avatar.tsx +2 -2
  100. package/registry/components/badge.tsx +8 -7
  101. package/registry/components/button-group.tsx +2 -2
  102. package/registry/components/button.tsx +19 -14
  103. package/registry/components/card.tsx +18 -5
  104. package/registry/components/chart-block-data.ts +177 -0
  105. package/registry/components/chart-block.css +171 -0
  106. package/registry/components/chart-block.tsx +260 -0
  107. package/registry/components/chart-interactions.ts +123 -0
  108. package/registry/components/chart-options.cartesian.ts +162 -0
  109. package/registry/components/chart-options.paint.ts +99 -0
  110. package/registry/components/chart-options.parts.ts +72 -0
  111. package/registry/components/chart-options.radial.ts +109 -0
  112. package/registry/components/chart-options.ts +44 -0
  113. package/registry/components/chart-options.types.ts +67 -0
  114. package/registry/components/chart.tsx +1 -1
  115. package/registry/components/checkbox.tsx +6 -6
  116. package/registry/components/collapsible.tsx +43 -3
  117. package/registry/components/command.tsx +1 -1
  118. package/registry/components/context-menu.tsx +1 -1
  119. package/registry/components/data-chart.tsx +40 -0
  120. package/registry/components/date-picker.tsx +9 -9
  121. package/registry/components/echart-theme.ts +246 -0
  122. package/registry/components/echart.css +49 -0
  123. package/registry/components/echart.tsx +178 -0
  124. package/registry/components/expanded/Breadcrumbs.tsx +5 -1
  125. package/registry/components/expanded/PageHeader.tsx +67 -24
  126. package/registry/components/expanded/Table.tsx +60 -22
  127. package/registry/components/expanded/activityFeed.css +2 -2
  128. package/registry/components/expanded/activityHeatmap.css +1 -1
  129. package/registry/components/expanded/banner.css +2 -2
  130. package/registry/components/expanded/breadcrumbs.css +19 -2
  131. package/registry/components/expanded/catalogComponentsShowcase.css +1 -1
  132. package/registry/components/expanded/fileUpload.css +7 -7
  133. package/registry/components/expanded/onboardingStepListItem.css +2 -2
  134. package/registry/components/expanded/pageHeader.css +38 -44
  135. package/registry/components/expanded/slideout.css +4 -4
  136. package/registry/components/expanded/table.css +58 -9
  137. package/registry/components/expanded/timeline.css +1 -1
  138. package/registry/components/hover-card.tsx +1 -1
  139. package/registry/components/inline-citations.css +126 -0
  140. package/registry/components/inline-citations.tsx +292 -0
  141. package/registry/components/input-group.tsx +4 -4
  142. package/registry/components/input.tsx +150 -137
  143. package/registry/components/item.tsx +1 -1
  144. package/registry/components/kbd.tsx +3 -2
  145. package/registry/components/menu.tsx +117 -12
  146. package/registry/components/menubar.tsx +2 -2
  147. package/registry/components/modal.tsx +3 -3
  148. package/registry/components/native-select.tsx +4 -4
  149. package/registry/components/navigation-menu.tsx +2 -2
  150. package/registry/components/pagination.tsx +4 -4
  151. package/registry/components/popover.tsx +3 -3
  152. package/registry/components/progress-slider.tsx +1 -1
  153. package/registry/components/radio-card.tsx +7 -7
  154. package/registry/components/radio-group.tsx +2 -2
  155. package/registry/components/resizable.tsx +2 -2
  156. package/registry/components/rolling-count.css +37 -0
  157. package/registry/components/rolling-count.tsx +110 -0
  158. package/registry/components/scroll-area.tsx +1 -1
  159. package/registry/components/select.tsx +15 -10
  160. package/registry/components/sheet.tsx +2 -2
  161. package/registry/components/shimmer-text.css +69 -0
  162. package/registry/components/shimmer-text.tsx +43 -0
  163. package/registry/components/sidebar.tsx +528 -223
  164. package/registry/components/skeleton.tsx +1 -1
  165. package/registry/components/slider.tsx +2 -2
  166. package/registry/components/social-button.tsx +1 -1
  167. package/registry/components/streaming-text.css +45 -0
  168. package/registry/components/streaming-text.tsx +165 -0
  169. package/registry/components/table-elements.tsx +164 -5
  170. package/registry/components/tabs.css +32 -4
  171. package/registry/components/tabs.tsx +5 -1
  172. package/registry/components/tag.tsx +1 -1
  173. package/registry/components/task-list.css +328 -0
  174. package/registry/components/task-list.tsx +429 -0
  175. package/registry/components/textarea.tsx +4 -4
  176. package/registry/components/thinking-reasoning.css +178 -0
  177. package/registry/components/thinking-reasoning.tsx +253 -0
  178. package/registry/components/thinking-state.css +8 -0
  179. package/registry/components/thinking-state.tsx +46 -0
  180. package/registry/components/toast.tsx +1 -1
  181. package/registry/components/toggle.tsx +2 -2
  182. package/registry/components/toolbar.tsx +6 -6
  183. package/registry/components/tooltip.tsx +6 -4
  184. package/registry/examples/agent-input-demo.tsx +90 -0
  185. package/registry/examples/app-header-demo.tsx +40 -0
  186. package/registry/examples/approval-card-demo.tsx +83 -0
  187. package/registry/examples/button-demo.tsx +3 -0
  188. package/registry/examples/chart-block-demo.tsx +5 -0
  189. package/registry/examples/chart-demo.tsx +6 -21
  190. package/registry/examples/collection-filter-bar-demo.tsx +1 -1
  191. package/registry/examples/control-density-contract-demo.tsx +5 -1
  192. package/registry/examples/inline-citations-demo.tsx +31 -0
  193. package/registry/examples/input-actions-demo.tsx +36 -0
  194. package/registry/examples/menu-demo.tsx +1 -1
  195. package/registry/examples/popover-demo.tsx +1 -0
  196. package/registry/examples/rolling-count-demo.tsx +39 -0
  197. package/registry/examples/shimmer-text-demo.tsx +20 -0
  198. package/registry/examples/streaming-text-demo.tsx +28 -0
  199. package/registry/examples/task-list-demo.tsx +74 -0
  200. package/registry/examples/thinking-reasoning-demo.tsx +74 -0
  201. package/registry/examples/thinking-state-demo.tsx +13 -0
  202. package/registry/guidance/charts.LICENSE.txt +24 -0
  203. package/registry/hooks/use-controllable-state.ts +33 -0
  204. package/registry/hooks/use-listbox-navigation.ts +73 -0
  205. package/registry/hooks/use-motion-end.ts +55 -0
  206. package/registry/hooks/use-reduced-motion.ts +28 -0
  207. package/registry/index.json +1808 -190
  208. package/registry/styles/globals.css +992 -1088
  209. package/registry.json +385 -10
  210. package/schema/registry.schema.json +5 -1
  211. package/schema/tokens.schema.json +8 -4
  212. package/src/cli/file-transaction.js +15 -8
  213. package/src/cli/index.js +22 -29
  214. 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
+ }