@horon-ai/react 0.1.5 → 0.1.7

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 (41) hide show
  1. package/LICENSE +104 -0
  2. package/README.md +4 -0
  3. package/THIRD_PARTY_NOTICES.md +62 -0
  4. package/package.json +11 -3
  5. package/src/components/agent-activity.tsx +2 -2
  6. package/src/components/agent-lane.tsx +2 -2
  7. package/src/components/agent-lanes-timeline.tsx +3 -3
  8. package/src/components/agent-panel.tsx +2 -2
  9. package/src/components/agent-steering-panel.tsx +2 -2
  10. package/src/components/bot-instructions-panel.tsx +3 -3
  11. package/src/components/bot-memory-panel.tsx +1 -1
  12. package/src/components/bottom-sheet.tsx +2 -2
  13. package/src/components/calendar.tsx +1 -1
  14. package/src/components/chat-controls.tsx +2 -2
  15. package/src/components/code-panel.tsx +1 -1
  16. package/src/components/combobox.tsx +1 -1
  17. package/src/components/command-palette.tsx +1 -1
  18. package/src/components/composer.tsx +1 -0
  19. package/src/components/data-table.tsx +1 -1
  20. package/src/components/directory-card.tsx +1 -1
  21. package/src/components/document-extract-panel.tsx +6 -6
  22. package/src/components/file-drop.tsx +1 -1
  23. package/src/components/integration-row.tsx +1 -1
  24. package/src/components/knowledge-base-panel.tsx +1 -1
  25. package/src/components/list-detail.tsx +3 -3
  26. package/src/components/marketplace-card.tsx +1 -1
  27. package/src/components/mcp-server-row.tsx +1 -1
  28. package/src/components/menu.tsx +3 -3
  29. package/src/components/message-extras.tsx +2 -2
  30. package/src/components/orchestrator-panel.tsx +2 -2
  31. package/src/components/page-header.tsx +1 -1
  32. package/src/components/plan-step.tsx +1 -1
  33. package/src/components/plugin-row.tsx +1 -1
  34. package/src/components/research-run-panel.tsx +3 -3
  35. package/src/components/settings-list.tsx +1 -1
  36. package/src/components/sidebar.tsx +3 -3
  37. package/src/components/source-row.tsx +2 -2
  38. package/src/components/task-row.tsx +1 -1
  39. package/src/components/toast.tsx +1 -0
  40. package/src/components/tool-call.tsx +3 -3
  41. package/src/components/tool-calls-header.tsx +1 -1
package/LICENSE ADDED
@@ -0,0 +1,104 @@
1
+ # PolyForm Strict License 1.0.0
2
+
3
+ <https://polyformproject.org/licenses/strict/1.0.0>
4
+
5
+ ## Acceptance
6
+
7
+ In order to get any license under these terms, you must agree
8
+ to them as both strict obligations and conditions to all
9
+ your licenses.
10
+
11
+ ## Copyright License
12
+
13
+ The licensor grants you a copyright license for the software
14
+ to do everything you might do with the software that would
15
+ otherwise infringe the licensor's copyright in it for any
16
+ permitted purpose, other than distributing the software or
17
+ making changes or new works based on the software.
18
+
19
+ ## Patent License
20
+
21
+ The licensor grants you a patent license for the software that
22
+ covers patent claims the licensor can license, or becomes able
23
+ to license, that you would infringe by using the software.
24
+
25
+ ## Noncommercial Purposes
26
+
27
+ Any noncommercial purpose is a permitted purpose.
28
+
29
+ ## Personal Uses
30
+
31
+ Personal use for research, experiment, and testing for
32
+ the benefit of public knowledge, personal study, private
33
+ entertainment, hobby projects, amateur pursuits, or religious
34
+ observance, without any anticipated commercial application,
35
+ is use for a permitted purpose.
36
+
37
+ ## Noncommercial Organizations
38
+
39
+ Use by any charitable organization, educational institution,
40
+ public research organization, public safety or health
41
+ organization, environmental protection organization,
42
+ or government institution is use for a permitted purpose
43
+ regardless of the source of funding or obligations resulting
44
+ from the funding.
45
+
46
+ ## Fair Use
47
+
48
+ You may have "fair use" rights for the software under the
49
+ law. These terms do not limit them.
50
+
51
+ ## No Other Rights
52
+
53
+ These terms do not allow you to sublicense or transfer any of
54
+ your licenses to anyone else, or prevent the licensor from
55
+ granting licenses to anyone else. These terms do not imply
56
+ any other licenses.
57
+
58
+ ## Patent Defense
59
+
60
+ If you make any written claim that the software infringes or
61
+ contributes to infringement of any patent, your patent license
62
+ for the software granted under these terms ends immediately. If
63
+ your company makes such a claim, your patent license ends
64
+ immediately for work on behalf of your company.
65
+
66
+ ## Violations
67
+
68
+ The first time you are notified in writing that you have
69
+ violated any of these terms, or done anything with the software
70
+ not covered by your licenses, your licenses can nonetheless
71
+ continue if you come into full compliance with these terms,
72
+ and take practical steps to correct past violations, within
73
+ 32 days of receiving notice. Otherwise, all your licenses
74
+ end immediately.
75
+
76
+ ## No Liability
77
+
78
+ ***As far as the law allows, the software comes as is, without
79
+ any warranty or condition, and the licensor will not be liable
80
+ to you for any damages arising out of these terms or the use
81
+ or nature of the software, under any kind of legal claim.***
82
+
83
+ ## Definitions
84
+
85
+ The **licensor** is the individual or entity offering these
86
+ terms, and the **software** is the software the licensor makes
87
+ available under these terms.
88
+
89
+ **You** refers to the individual or entity agreeing to these
90
+ terms.
91
+
92
+ **Your company** is any legal entity, sole proprietorship,
93
+ or other kind of organization that you work for, plus all
94
+ organizations that have control over, are under the control of,
95
+ or are under common control with that organization. **Control**
96
+ means ownership of substantially all the assets of an entity,
97
+ or the power to direct its management and policies by vote,
98
+ contract, or otherwise. Control can be direct or indirect.
99
+
100
+ **Your licenses** are all the licenses granted to you for the
101
+ software under these terms.
102
+
103
+ **Use** means anything you do with the software requiring one
104
+ of your licenses.
package/README.md CHANGED
@@ -167,3 +167,7 @@ web, desktop(Electron의 Chromium), iOS, Android가 같은 모습입니다.
167
167
  bun run lint && bun run typecheck # 이 패키지에서
168
168
  bun test # 저장소 루트에서, 진입점 재수출 커버리지
169
169
  ```
170
+
171
+ ## 라이선스
172
+
173
+ [PolyForm Strict License 1.0.0](https://polyformproject.org/licenses/strict/1.0.0)입니다. 비상업적 목적의 사용만 허용하고 수정·재배포·상업적 이용은 금지합니다. 전문은 패키지에 동봉된 `LICENSE`에 있습니다. 서드파티 고지는 `THIRD_PARTY_NOTICES.md`에 있습니다.
@@ -0,0 +1,62 @@
1
+ # Third-party notices
2
+
3
+ The Horon design packages include the works below. Each keeps its own license;
4
+ the PolyForm Strict license in `LICENSE` covers only the Horon code.
5
+
6
+ ## Phosphor Icons
7
+
8
+ `packages/lynx/src/icons/phosphor.g.ts` is generated from `@phosphor-icons/core`,
9
+ and the React components draw `@phosphor-icons/react`. Both are MIT.
10
+
11
+ ```
12
+ MIT License
13
+
14
+ Copyright (c) 2023 Phosphor Icons
15
+
16
+ Permission is hereby granted, free of charge, to any person obtaining a copy
17
+ of this software and associated documentation files (the "Software"), to deal
18
+ in the Software without restriction, including without limitation the rights
19
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20
+ copies of the Software, and to permit persons to whom the Software is
21
+ furnished to do so, subject to the following conditions:
22
+
23
+ The above copyright notice and this permission notice shall be included in all
24
+ copies or substantial portions of the Software.
25
+
26
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
+ SOFTWARE.
33
+ ```
34
+
35
+ ## Pretendard
36
+
37
+ `packages/react/src/styles/globals.css` imports the Pretendard variable font
38
+ CSS, and the Flutter example bundles the font file. SIL Open Font License 1.1,
39
+ Copyright (c) 2021, Kil Hyung-jin, with Reserved Font Name Pretendard. The full
40
+ license text is in `packages/flutter/example/assets/fonts/Pretendard-LICENSE.txt`
41
+ and at <https://openfontlicense.org>.
42
+
43
+ ## Geist Mono
44
+
45
+ Code typeface, loaded from `@fontsource-variable/geist-mono`, and bundled in the
46
+ Flutter example. SIL Open Font License 1.1, Copyright 2024 The Geist Project
47
+ Authors. The full license text is in
48
+ `packages/flutter/example/assets/fonts/Geist-LICENSE.txt`.
49
+
50
+ ## Tabler Icons
51
+
52
+ Flutter example icons, `packages/flutter/example/assets/fonts/TablerIcons.ttf`.
53
+ MIT, Copyright (c) 2020-2026 Paweł Kuna. The full license text is in
54
+ `packages/flutter/example/assets/fonts/TablerIcons-LICENSE.txt`.
55
+
56
+ ## Runtime dependencies
57
+
58
+ Everything else the packages import arrives as npm dependencies rather than
59
+ vendored source, and each carries its own license in its published package:
60
+ `@base-ui/react` (MIT), `@tanstack/react-table` (MIT), `tailwind-merge` (MIT),
61
+ `shiki` (MIT), `@lynx-js/react` (Apache-2.0), and the React, Astro and Lynx
62
+ toolchain. No copyleft-licensed code is vendored into this repository.
package/package.json CHANGED
@@ -1,15 +1,23 @@
1
1
  {
2
2
  "name": "@horon-ai/react",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/horon-ai/design.git",
7
7
  "directory": "packages/react"
8
8
  },
9
9
  "type": "module",
10
+ "license": "SEE LICENSE IN LICENSE",
11
+ "sideEffects": [
12
+ "./src/index.ts",
13
+ "./src/styles/globals.css",
14
+ "./src/lib/cursor-ghost.ts"
15
+ ],
10
16
  "files": [
11
17
  "src",
12
- "README.md"
18
+ "README.md",
19
+ "LICENSE",
20
+ "THIRD_PARTY_NOTICES.md"
13
21
  ],
14
22
  "publishConfig": {
15
23
  "access": "public"
@@ -30,7 +38,7 @@
30
38
  "dependencies": {
31
39
  "@base-ui/react": "^1.9.0",
32
40
  "@fontsource-variable/geist-mono": "^5.3.0",
33
- "@horon-ai/tokens": "0.1.5",
41
+ "@horon-ai/tokens": "0.1.7",
34
42
  "@phosphor-icons/react": "^2.1.10",
35
43
  "@tanstack/react-table": "^9.3.1",
36
44
  "pretendard": "^1.3.9",
@@ -138,7 +138,7 @@ export function StreamingText({ text, streaming = true, smooth = true, className
138
138
  <span
139
139
  aria-hidden
140
140
  className={cn(
141
- "ml-px inline-block h-[1.15em] w-0.5 rounded-[1px] bg-interactive-primary align-[-0.2em]",
141
+ "ml-px inline-block h-[1.15em] w-0.5 rounded-full bg-interactive-primary align-[-0.2em]",
142
142
  !typing && "animate-caret",
143
143
  )}
144
144
  />
@@ -242,7 +242,7 @@ export function WorkLog({
242
242
  <details
243
243
  open
244
244
  className={cn(
245
- "group flex w-full max-w-85 min-w-0 flex-col motion-details rounded-[16px] border border-border-default bg-bg-surface p-1.5",
245
+ "group flex w-full max-w-85 min-w-0 flex-col motion-details rounded-2xl border border-border-default bg-bg-surface p-1.5",
246
246
  className,
247
247
  )}
248
248
  >
@@ -68,10 +68,10 @@ export function AgentLane({ status, bot, elapsed, task, tool, output, usage, cla
68
68
  >
69
69
  <div className="flex items-center gap-2 text-caption text-text-secondary">
70
70
  {/* live-pulse draws its ring in currentColor, so the running wrapper carries the tile's sky tone. */}
71
- <span className={cn("shrink-0 rounded-[5px]", status === "running" && "animate-live-pulse text-sky-400")}>
71
+ <span className={cn("shrink-0 rounded-xs", status === "running" && "animate-live-pulse text-sky-400")}>
72
72
  <span
73
73
  className={cn(
74
- "flex size-4.5 items-center justify-center rounded-[5px] text-label-sm text-text-inverse motion-colors",
74
+ "flex size-4.5 items-center justify-center rounded-xs text-label-sm text-text-inverse motion-colors",
75
75
  botTile[status],
76
76
  )}
77
77
  >
@@ -193,7 +193,7 @@ export function AgentLanesTimeline({
193
193
  return (
194
194
  <section
195
195
  className={cn(
196
- "flex w-full max-w-252.5 min-w-0 flex-col overflow-clip rounded-[24px] border border-border-default bg-bg-surface",
196
+ "flex w-full max-w-252.5 min-w-0 flex-col overflow-clip rounded-xl border border-border-default bg-bg-surface",
197
197
  className,
198
198
  )}
199
199
  {...props}
@@ -261,7 +261,7 @@ export function AgentLanesTimeline({
261
261
  >
262
262
  <span
263
263
  className={cn(
264
- "flex size-8.5 shrink-0 items-center justify-center rounded-[10px] text-label-md text-text-on-ink",
264
+ "flex size-8.5 shrink-0 items-center justify-center rounded-md text-label-md text-text-on-ink",
265
265
  avatarTone[bot.tone],
266
266
  )}
267
267
  >
@@ -327,7 +327,7 @@ export function AgentLanesTimeline({
327
327
  <div
328
328
  key={task.id}
329
329
  className={cn(
330
- "absolute flex h-9 motion-rise items-center gap-1.5 overflow-clip rounded-[10px] px-2.5 text-label-sm transition-[left,width,background-color,color,border-color] duration-280 ease-emphasized [&>svg]:size-3.5",
330
+ "absolute flex h-9 motion-rise items-center gap-1.5 overflow-clip rounded-md px-2.5 text-label-sm transition-[left,width,background-color,color,border-color] duration-280 ease-emphasized [&>svg]:size-3.5",
331
331
  barTone[task.tone],
332
332
  )}
333
333
  style={{
@@ -34,7 +34,7 @@ export function AgentPanel({
34
34
  return (
35
35
  <section
36
36
  className={cn(
37
- "flex min-w-0 flex-col items-stretch gap-3 rounded-[24px] border border-border-default bg-bg-surface px-5 pt-4 pb-2",
37
+ "flex min-w-0 flex-col items-stretch gap-3 rounded-xl border border-border-default bg-bg-surface px-5 pt-4 pb-2",
38
38
  className,
39
39
  )}
40
40
  {...props}
@@ -70,7 +70,7 @@ export function ComposerChip({ leading, tileClassName, className, children, ...p
70
70
  {typeof leading === "string" ? (
71
71
  <span
72
72
  className={cn(
73
- "flex size-4 items-center justify-center rounded-[5px] text-label-sm text-text-inverse",
73
+ "flex size-4 items-center justify-center rounded-xs text-label-sm text-text-inverse",
74
74
  tileClassName ?? "bg-interactive-primary",
75
75
  )}
76
76
  >
@@ -102,7 +102,7 @@ function SteeringNoteRow({
102
102
  return (
103
103
  <li
104
104
  className={cn(
105
- "flex items-center gap-2.5 rounded-[10px] bg-overlay-ink-4 py-2 pr-2.5 pl-3.5",
105
+ "flex items-center gap-2.5 rounded-md bg-overlay-ink-4 py-2 pr-2.5 pl-3.5",
106
106
  leaving ? "animate-pop-out" : "motion-rise",
107
107
  )}
108
108
  onAnimationEnd={(event) => {
@@ -201,7 +201,7 @@ export function AgentSteeringPanel({
201
201
  return (
202
202
  <section
203
203
  className={cn(
204
- "flex w-full max-w-130 min-w-0 flex-col overflow-clip rounded-[24px] border border-border-default bg-bg-surface",
204
+ "flex w-full max-w-130 min-w-0 flex-col overflow-clip rounded-xl border border-border-default bg-bg-surface",
205
205
  className,
206
206
  )}
207
207
  {...props}
@@ -259,7 +259,7 @@ export function BotInstructionsPanel({
259
259
  return (
260
260
  <section
261
261
  className={cn(
262
- "flex w-full max-w-155 min-w-0 flex-col overflow-clip rounded-[24px] border border-border-default bg-bg-surface",
262
+ "flex w-full max-w-155 min-w-0 flex-col overflow-clip rounded-xl border border-border-default bg-bg-surface",
263
263
  className,
264
264
  )}
265
265
  {...props}
@@ -307,7 +307,7 @@ export function BotInstructionsPanel({
307
307
  onClick={onBotClick}
308
308
  className="flex h-7.5 shrink-0 motion-press cursor-pointer items-center gap-1.5 rounded-full bg-overlay-ink-6 pr-2.5 pl-1.5 text-label-sm text-text-primary hover:bg-overlay-ink-10 focus-visible:outline-2 focus-visible:outline-text-brand"
309
309
  >
310
- <span className="flex size-4.5 items-center justify-center rounded-[5px] bg-interactive-primary text-label-sm text-text-inverse">
310
+ <span className="flex size-4.5 items-center justify-center rounded-xs bg-interactive-primary text-label-sm text-text-inverse">
311
311
  {bot.initial}
312
312
  </span>
313
313
  {bot.name}
@@ -315,7 +315,7 @@ export function BotInstructionsPanel({
315
315
  </button>
316
316
  ) : (
317
317
  <span className="flex h-7.5 shrink-0 items-center gap-1.5 rounded-full bg-overlay-ink-6 pr-2.5 pl-1.5 text-label-sm text-text-primary">
318
- <span className="flex size-4.5 items-center justify-center rounded-[5px] bg-interactive-primary text-label-sm text-text-inverse">
318
+ <span className="flex size-4.5 items-center justify-center rounded-xs bg-interactive-primary text-label-sm text-text-inverse">
319
319
  {bot.initial}
320
320
  </span>
321
321
  {bot.name}
@@ -139,7 +139,7 @@ export function BotMemoryPanel({
139
139
  return (
140
140
  <section
141
141
  className={cn(
142
- "flex w-full max-w-140 min-w-0 flex-col overflow-clip rounded-[24px] border border-border-default bg-bg-surface",
142
+ "flex w-full max-w-140 min-w-0 flex-col overflow-clip rounded-xl border border-border-default bg-bg-surface",
143
143
  className,
144
144
  )}
145
145
  {...props}
@@ -94,7 +94,7 @@ export function BottomSheetContent({
94
94
  <Drawer.Popup
95
95
  className={cn(
96
96
  "relative flex max-h-[calc(100dvh-2rem)] w-full flex-col items-stretch overflow-clip px-4 pt-2 outline-none",
97
- solid ? "rounded-t-xl bg-bg-surface pb-6" : "veil-overlay rounded-t-[32px] pb-5",
97
+ solid ? "rounded-t-xl bg-bg-surface pb-6" : "veil-overlay rounded-t-xl pb-5",
98
98
  "transition-[translate] duration-320 ease-out-quint data-ending-style:translate-y-full data-ending-style:duration-220 data-ending-style:ease-in data-starting-style:translate-y-full",
99
99
  detail ? "gap-4.5" : floating ? "gap-3" : "max-w-93.5 gap-1",
100
100
  className,
@@ -103,7 +103,7 @@ export function BottomSheetContent({
103
103
  >
104
104
  <span
105
105
  aria-hidden
106
- className="relative mx-auto h-[5px] w-9 cursor-grab touch-none rounded-[3px] bg-overlay-ink-20 active:cursor-grabbing"
106
+ className="relative mx-auto h-[5px] w-9 cursor-grab touch-none rounded-full bg-overlay-ink-20 active:cursor-grabbing"
107
107
  />
108
108
  <Drawer.Content
109
109
  className={cn(
@@ -324,7 +324,7 @@ export function Calendar(props: CalendarProps) {
324
324
  ? "veil-overlay"
325
325
  : "bg-glass-thick",
326
326
  variant === "popover"
327
- ? cn("rounded-[24px]", containerSizeClass[size].popover)
327
+ ? cn("rounded-xl", containerSizeClass[size].popover)
328
328
  : cn("rounded-xl", containerSizeClass[size].default),
329
329
  // Paper renders every popover day on the label scale; the default calendar mixes body and label.
330
330
  variant === "popover" && popoverDayTextClass[size],
@@ -152,13 +152,13 @@ export function VoiceInput({
152
152
  onClick={onStop}
153
153
  className="relative flex size-9 shrink-0 motion-press cursor-pointer items-center justify-center rounded-full bg-interactive-danger focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand"
154
154
  >
155
- <span className="size-3 rounded-[3px] bg-interactive-on-danger" />
155
+ <span className="size-3 bg-interactive-on-danger" />
156
156
  </button>
157
157
  <div aria-hidden className="relative flex min-w-0 flex-1 items-center gap-[3px] overflow-hidden">
158
158
  {bars.map((bar, position) => (
159
159
  <span
160
160
  key={bar.id}
161
- className={cn("w-[3px] shrink-0 rounded-[2px] bg-interactive-primary-75", recording && "animate-wave")}
161
+ className={cn("w-[3px] shrink-0 rounded-full bg-interactive-primary-75", recording && "animate-wave")}
162
162
  style={{ height: bar.height, animationDelay: recording ? `${position * 120}ms` : undefined }}
163
163
  />
164
164
  ))}
@@ -27,7 +27,7 @@ export function CodePanel({ className, ...props }: CodePanelProps) {
27
27
  return (
28
28
  <pre
29
29
  className={cn(
30
- "font-normal m-0 max-w-full overflow-x-auto rounded-[10px] border border-border-default bg-neutral-50 px-4 py-3.5 font-mono text-[12px]/[21px] whitespace-pre text-syntax-string dark:border-border-strong dark:bg-neutral-800",
30
+ "font-normal m-0 max-w-full overflow-x-auto rounded-md border border-border-default bg-neutral-50 px-4 py-3.5 font-mono text-[12px]/[21px] whitespace-pre text-syntax-string dark:border-border-strong dark:bg-neutral-800",
31
31
  className,
32
32
  )}
33
33
  {...props}
@@ -290,7 +290,7 @@ export function Combobox(props: ComboboxProps) {
290
290
  {shortLabel(item)}
291
291
  <BaseCombobox.ChipRemove
292
292
  aria-label={`Remove ${item.label}`}
293
- className="flex cursor-pointer rounded-full p-0.5 text-text-secondary hover:bg-overlay-ink-10 hover:text-text-primary"
293
+ className="flex cursor-pointer rounded-full p-0.5 text-text-secondary hover:bg-overlay-ink-10 hover:text-text-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand"
294
294
  >
295
295
  <X />
296
296
  </BaseCombobox.ChipRemove>
@@ -120,7 +120,7 @@ export function CommandPalette({
120
120
  aria-label={placeholder}
121
121
  className={cn(
122
122
  // 560px where it fits; the viewport's 8px gutters cap `w-full` below that.
123
- "relative flex w-full max-w-140 motion-popup flex-col overflow-clip rounded-[24px] p-1.5",
123
+ "relative flex w-full max-w-140 motion-popup flex-col overflow-clip rounded-xl p-1.5",
124
124
  surface === "glass" ? "veil-overlay" : "border border-border-default bg-bg-surface shadow-palette",
125
125
  "duration-240 data-starting-style:translate-y-2",
126
126
  className,
@@ -98,6 +98,7 @@ export function Composer({
98
98
  onSubmit={submit}
99
99
  className={cn(
100
100
  "relative flex max-w-full min-w-0 items-center overflow-clip rounded-full motion-colors has-[input:focus-visible]:border-border-strong",
101
+ "has-[input:focus-visible]:outline-2 has-[input:focus-visible]:outline-offset-2 has-[input:focus-visible]:outline-text-brand",
101
102
  surface === "glass" ? "veil-field" : "border border-border-default bg-bg-surface",
102
103
  sizeClass[size],
103
104
  className,
@@ -105,7 +105,7 @@ export function DataTableHeader({ icon, title, actions, className }: DataTableHe
105
105
  return (
106
106
  <div className={cn("flex items-center gap-3 px-6 py-4.5 group-data-[device=mobile]/dt:px-4.5", className)}>
107
107
  {icon && (
108
- <span className="flex size-6.5 shrink-0 items-center justify-center rounded-[7px] bg-bg-brand text-text-brand [&>svg]:size-4">
108
+ <span className="flex size-6.5 shrink-0 items-center justify-center rounded-xs bg-bg-brand text-text-brand [&>svg]:size-4">
109
109
  {icon}
110
110
  </span>
111
111
  )}
@@ -59,7 +59,7 @@ export function DirectoryCard({
59
59
  {...props}
60
60
  >
61
61
  {surface === "glass" && <LiquidGlass />}
62
- <span className="relative flex size-10 shrink-0 items-center justify-center rounded-[10px] bg-sky-500 text-neutral-50 [&>svg]:size-5">
62
+ <span className="relative flex size-10 shrink-0 items-center justify-center rounded-md bg-sky-500 text-neutral-50 [&>svg]:size-5">
63
63
  {icon}
64
64
  </span>
65
65
  <span className="relative flex min-w-0 flex-1 flex-col gap-0.5">
@@ -217,7 +217,7 @@ export function DocumentExtractPanel({
217
217
  return (
218
218
  <section
219
219
  className={cn(
220
- "@container flex w-full max-w-280 min-w-0 flex-col overflow-clip rounded-[24px] border border-border-default bg-bg-surface",
220
+ "@container flex w-full max-w-280 min-w-0 flex-col overflow-clip rounded-xl border border-border-default bg-bg-surface",
221
221
  className,
222
222
  )}
223
223
  {...props}
@@ -225,7 +225,7 @@ export function DocumentExtractPanel({
225
225
  <div className="flex flex-col @4xl:flex-row">
226
226
  <div className="flex min-w-0 flex-col @4xl:w-135 @4xl:shrink-0">
227
227
  <div className="flex flex-wrap items-center gap-2 px-5 py-3">
228
- <span className="flex size-7 shrink-0 items-center justify-center rounded-[10px] bg-overlay-ink-5 text-text-danger">
228
+ <span className="flex size-7 shrink-0 items-center justify-center rounded-md bg-overlay-ink-5 text-text-danger">
229
229
  <FilePdf aria-hidden className="size-4" />
230
230
  </span>
231
231
  {onOpenFile ? (
@@ -331,7 +331,7 @@ export function DocumentExtractPanel({
331
331
  </span>
332
332
  ) : null}
333
333
  </div>
334
- <div className="flex flex-col overflow-x-auto rounded-[10px] border border-overlay-ink-10 px-3 py-0.5">
334
+ <div className="flex flex-col overflow-x-auto rounded-md border border-overlay-ink-10 px-3 py-0.5">
335
335
  <div className="flex min-w-52 flex-col">
336
336
  <div className="flex items-center gap-2 py-2 text-caption text-text-secondary">
337
337
  {field.columns.map((column) => (
@@ -384,7 +384,7 @@ export function DocumentExtractPanel({
384
384
  onClick={() => resolve(field.id)}
385
385
  aria-label={needsCheck ? `Confirm ${field.label}` : undefined}
386
386
  className={cn(
387
- "flex h-9 min-w-0 flex-1 items-center gap-2 rounded-[10px] border px-3 text-start motion-colors",
387
+ "flex h-9 min-w-0 flex-1 items-center gap-2 rounded-md border px-3 text-start motion-colors",
388
388
  needsCheck
389
389
  ? "cursor-pointer border-border-danger bg-overlay-ink-12 hover:bg-overlay-ink-14 focus-visible:outline-2 focus-visible:outline-text-brand"
390
390
  : "cursor-default border-transparent bg-overlay-ink-4",
@@ -416,7 +416,7 @@ export function DocumentExtractPanel({
416
416
  </>
417
417
  ) : null}
418
418
  {view === "json" ? (
419
- <pre className="animate-slide-shift-next overflow-x-auto rounded-[10px] bg-overlay-ink-4 p-3 font-mono text-caption whitespace-pre text-text-primary">
419
+ <pre className="animate-slide-shift-next overflow-x-auto rounded-md bg-overlay-ink-4 p-3 font-mono text-caption whitespace-pre text-text-primary">
420
420
  {json}
421
421
  </pre>
422
422
  ) : null}
@@ -454,7 +454,7 @@ export function DocumentExtractPanel({
454
454
  <span className="min-w-0 flex-1" />
455
455
  {bot ? (
456
456
  <>
457
- <span className="flex size-5 items-center justify-center rounded-[5px] bg-interactive-primary text-label-sm text-text-inverse">
457
+ <span className="flex size-5 items-center justify-center rounded-xs bg-interactive-primary text-label-sm text-text-inverse">
458
458
  {bot.initial}
459
459
  </span>
460
460
  <span className="text-caption text-text-secondary">
@@ -94,7 +94,7 @@ export function FileDrop({
94
94
  onDragLeave={() => setDragging(false)}
95
95
  onDrop={onDrop}
96
96
  className={cn(
97
- "relative flex w-full max-w-[550px] cursor-pointer items-center justify-center gap-2 overflow-clip rounded-[10px] border-[1.5px] border-dashed border-border-dashed px-4 py-3 text-label-md text-text-secondary motion-colors",
97
+ "relative flex w-full max-w-[550px] cursor-pointer items-center justify-center gap-2 overflow-clip rounded-md border-[1.5px] border-dashed border-border-dashed px-4 py-3 text-label-md text-text-secondary motion-colors",
98
98
  "has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-text-brand",
99
99
  // The dashed edge stays put (border-style cannot transition) and the active state adds an inner rim.
100
100
  "data-dragging:border-border-brand data-dragging:shadow-[inset_0_0_0_1px_var(--color-text-brand)]",
@@ -95,7 +95,7 @@ export function IntegrationRow({
95
95
  {surface === "glass" && <LiquidGlass />}
96
96
  <span
97
97
  className={cn(
98
- "relative flex size-10 shrink-0 items-center justify-center rounded-[10px] motion-colors [&>svg]:size-5",
98
+ "relative flex size-10 shrink-0 items-center justify-center rounded-md motion-colors [&>svg]:size-5",
99
99
  surface === "glass" && status === "not-connected"
100
100
  ? "bg-overlay-ink-6 text-text-secondary"
101
101
  : tileClass[status],
@@ -120,7 +120,7 @@ export function KnowledgeBasePanel({
120
120
  return (
121
121
  <section
122
122
  className={cn(
123
- "flex w-full max-w-200 min-w-0 flex-col items-stretch gap-3 rounded-[24px] border border-border-default bg-bg-surface px-5 py-4.5",
123
+ "flex w-full max-w-200 min-w-0 flex-col items-stretch gap-3 rounded-xl border border-border-default bg-bg-surface px-5 py-4.5",
124
124
  className,
125
125
  )}
126
126
  {...props}
@@ -121,7 +121,7 @@ export function ListDetail({
121
121
  role="option"
122
122
  aria-selected={item.id === selected?.id}
123
123
  data-selected={item.id === selected?.id ? "" : undefined}
124
- className="flex cursor-pointer flex-col gap-1 rounded-[10px] px-3 py-2.5 text-left motion-colors hover:bg-overlay-ink-4 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand data-selected:bg-overlay-ink-6 data-selected:hover:bg-overlay-ink-8"
124
+ className="flex cursor-pointer flex-col gap-1 rounded-md px-3 py-2.5 text-left motion-colors hover:bg-overlay-ink-4 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand data-selected:bg-overlay-ink-6 data-selected:hover:bg-overlay-ink-8"
125
125
  onClick={() => {
126
126
  setInner(item.id);
127
127
  onValueChange?.(item.id);
@@ -165,7 +165,7 @@ export function ListDetailHeader({ icon, title, description, actions, className,
165
165
  return (
166
166
  <div className={cn("flex flex-wrap items-center gap-3", className)} {...props}>
167
167
  {icon && (
168
- <span className="flex size-10 shrink-0 items-center justify-center rounded-[10px] bg-sky-100 text-sky-700 dark:bg-sky-900 dark:text-sky-300 [&_svg]:size-5">
168
+ <span className="flex size-10 shrink-0 items-center justify-center rounded-md bg-sky-100 text-sky-700 dark:bg-sky-900 dark:text-sky-300 [&_svg]:size-5">
169
169
  {icon}
170
170
  </span>
171
171
  )}
@@ -301,7 +301,7 @@ export function ListDetailInstructions({
301
301
  aria-label="Edit instructions"
302
302
  value={text}
303
303
  rows={6}
304
- className="block w-full resize-y rounded-[10px] border border-border-default bg-bg-inset px-4 py-3.5 font-mono text-[12px]/[21px] text-text-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand"
304
+ className="block w-full resize-y rounded-md border border-border-default bg-bg-inset px-4 py-3.5 font-mono text-[12px]/[21px] text-text-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand"
305
305
  onChange={(event) => {
306
306
  setInner(event.target.value);
307
307
  onValueChange?.(event.target.value);
@@ -85,7 +85,7 @@ export function MarketplaceCard({
85
85
  <div className="relative flex items-center gap-3">
86
86
  <span
87
87
  aria-hidden
88
- className="flex size-10 shrink-0 items-center justify-center rounded-[10px] bg-neutral-900 text-label-md text-neutral-50"
88
+ className="flex size-10 shrink-0 items-center justify-center rounded-md bg-neutral-900 text-label-md text-neutral-50"
89
89
  >
90
90
  {initials}
91
91
  </span>
@@ -119,7 +119,7 @@ export function McpServerRow({
119
119
  )}
120
120
  {...props}
121
121
  >
122
- <span className="flex size-10 shrink-0 items-center justify-center rounded-[10px] bg-sky-500 text-label-md text-neutral-50">
122
+ <span className="flex size-10 shrink-0 items-center justify-center rounded-md bg-sky-500 text-label-md text-neutral-50">
123
123
  {initials ?? name.slice(0, 2).toUpperCase()}
124
124
  </span>
125
125
  <div className="flex min-w-0 grow basis-40 flex-col gap-1">
@@ -64,8 +64,8 @@ export type MenuContentProps = WithClass<ComponentProps<typeof BaseMenu.Popup>>
64
64
  */
65
65
  export const menuPopupClass = {
66
66
  glass: "rounded-xl veil-overlay",
67
- solid: "rounded-[18px] bg-glass-fill-solid shadow-popover",
68
- paper: "rounded-[14px] border border-border-default bg-bg-default shadow-[0_12px_32px_#0A142424]",
67
+ solid: "rounded-xl bg-glass-fill-solid shadow-popover",
68
+ paper: "rounded-lg border border-border-default bg-bg-default shadow-[0_12px_32px_#0A142424]",
69
69
  } as const;
70
70
 
71
71
  /**
@@ -168,7 +168,7 @@ export function MenuItem({
168
168
  <BaseMenu.Item
169
169
  className={cn(
170
170
  "relative flex w-full cursor-pointer items-center gap-2.5 motion-colors outline-none select-none data-disabled:cursor-not-allowed data-disabled:opacity-40 data-highlighted:bg-overlay-ink-6",
171
- surface === "glass" ? "rounded-md px-3" : "rounded-[10px] px-2.5",
171
+ surface === "glass" ? "rounded-md px-3" : "rounded-md px-2.5",
172
172
  description ? "h-12" : surface === "glass" ? "h-10" : "h-9",
173
173
  selected && "bg-bg-brand data-highlighted:bg-bg-brand",
174
174
  className,
@@ -116,11 +116,11 @@ export function Attachment({ name, detail, thumbnail, onRemove, removeLabel = "R
116
116
  {thumbnail ? (
117
117
  <span
118
118
  aria-hidden
119
- className="size-10 shrink-0 rounded-[10px] bg-cover bg-center"
119
+ className="size-10 shrink-0 rounded-md bg-cover bg-center"
120
120
  style={{ backgroundImage: `url(${JSON.stringify(thumbnail)})` }}
121
121
  />
122
122
  ) : (
123
- <span className="flex size-10 shrink-0 items-center justify-center rounded-[10px] bg-accent-sky-500-16 text-text-brand">
123
+ <span className="flex size-10 shrink-0 items-center justify-center rounded-md bg-accent-sky-500-16 text-text-brand">
124
124
  <FileText aria-hidden className="size-5" />
125
125
  </span>
126
126
  )}
@@ -117,7 +117,7 @@ export function OrchestratorPanel({
117
117
  return (
118
118
  <section
119
119
  className={cn(
120
- "flex w-full min-w-0 flex-col overflow-clip rounded-[24px] border border-border-default bg-bg-surface",
120
+ "flex w-full min-w-0 flex-col overflow-clip rounded-xl border border-border-default bg-bg-surface",
121
121
  className,
122
122
  )}
123
123
  >
@@ -151,7 +151,7 @@ export function OrchestratorPanel({
151
151
  <div role="separator" className="h-px bg-overlay-ink-8" />
152
152
  <div className="flex flex-col gap-2.5 px-5 pt-4 pb-5">
153
153
  <div className="flex flex-wrap items-center gap-2">
154
- <span className="flex size-5.5 shrink-0 items-center justify-center rounded-[5px] bg-interactive-primary text-label-sm text-text-inverse">
154
+ <span className="flex size-5.5 shrink-0 items-center justify-center rounded-xs bg-interactive-primary text-label-sm text-text-inverse">
155
155
  {lead.initial}
156
156
  </span>
157
157
  <span className="min-w-0 truncate text-label-lg text-text-primary">{lead.name}</span>
@@ -54,7 +54,7 @@ export function PageHeader({
54
54
  return (
55
55
  <header
56
56
  className={cn(
57
- "relative flex max-w-full min-w-0 flex-col gap-1.5 overflow-clip rounded-[28px] p-2",
57
+ "relative flex max-w-full min-w-0 flex-col gap-1.5 overflow-clip rounded-xl p-2",
58
58
  surface === "glass" ? "bg-glass-regular" : "border border-border-default bg-bg-surface",
59
59
  className,
60
60
  )}
@@ -97,7 +97,7 @@ export function PlanStep({
97
97
  {!last && (
98
98
  <span
99
99
  className={cn(
100
- "w-0.5 flex-1 rounded-[1px] motion-colors",
100
+ "w-0.5 flex-1 rounded-full motion-colors",
101
101
  status === "done" ? "bg-status-live" : "bg-border-default",
102
102
  )}
103
103
  />
@@ -116,7 +116,7 @@ export function PluginRow({
116
116
  >
117
117
  <span
118
118
  aria-hidden
119
- className="flex size-10 shrink-0 items-center justify-center rounded-[10px] bg-sky-500 text-label-md text-neutral-50"
119
+ className="flex size-10 shrink-0 items-center justify-center rounded-md bg-sky-500 text-label-md text-neutral-50"
120
120
  >
121
121
  {initials}
122
122
  </span>
@@ -155,7 +155,7 @@ export function ResearchRunPanel({
155
155
  return (
156
156
  <section
157
157
  className={cn(
158
- "flex w-full max-w-150 min-w-0 flex-col overflow-clip rounded-[24px] border border-border-default bg-bg-surface",
158
+ "flex w-full max-w-150 min-w-0 flex-col overflow-clip rounded-xl border border-border-default bg-bg-surface",
159
159
  className,
160
160
  )}
161
161
  {...props}
@@ -188,7 +188,7 @@ export function ResearchRunPanel({
188
188
  >
189
189
  <Spinner size={14} />
190
190
  <span className="min-w-0 text-label-md text-text-primary">{statusLabel}</span>
191
- <span aria-hidden className="h-3 w-0.5 shrink-0 animate-caret rounded-[1px] bg-interactive-primary" />
191
+ <span aria-hidden className="h-3 w-0.5 shrink-0 animate-caret rounded-full bg-interactive-primary" />
192
192
  {meta.length > 0 && (
193
193
  <span className="text-caption text-text-secondary tabular-nums">
194
194
  {meta.map((entry, index) => (
@@ -205,7 +205,7 @@ export function ResearchRunPanel({
205
205
  <div aria-live="polite" className="flex flex-wrap items-center gap-x-1.5 gap-y-1">
206
206
  <Spinner size={14} />
207
207
  <span className="min-w-0 text-label-md text-text-primary">{statusLabel}</span>
208
- <span aria-hidden className="h-3 w-0.5 shrink-0 animate-caret rounded-[1px] bg-interactive-primary" />
208
+ <span aria-hidden className="h-3 w-0.5 shrink-0 animate-caret rounded-full bg-interactive-primary" />
209
209
  {meta.length > 0 && (
210
210
  <span className="text-caption text-text-secondary tabular-nums">
211
211
  {meta.map((entry, index) => (
@@ -110,7 +110,7 @@ export function SettingsRowIcon({ className, ...props }: WithClass<ComponentProp
110
110
  <span
111
111
  aria-hidden
112
112
  className={cn(
113
- "flex size-8 shrink-0 items-center justify-center rounded-[9px] bg-bg-subtle text-text-primary [&_svg]:size-4",
113
+ "flex size-8 shrink-0 items-center justify-center rounded-sm bg-bg-subtle text-text-primary [&_svg]:size-4",
114
114
  className,
115
115
  )}
116
116
  {...props}
@@ -265,7 +265,7 @@ export function SidebarWorkspaceSwitch({ initial, name, className, ...props }: S
265
265
  <button
266
266
  type="button"
267
267
  className={cn(
268
- "flex h-9 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-[10px] pr-1 pl-2 text-left motion-colors hover:bg-overlay-ink-6 data-popup-open:bg-overlay-ink-6",
268
+ "flex h-9 min-w-0 flex-1 cursor-pointer items-center gap-1.5 rounded-md pr-1 pl-2 text-left motion-colors hover:bg-overlay-ink-6 data-popup-open:bg-overlay-ink-6",
269
269
  "focus-visible:outline-2 focus-visible:outline-text-brand",
270
270
  className,
271
271
  )}
@@ -532,7 +532,7 @@ export function SidebarAccount({ initials, name, email, className, ...props }: S
532
532
  )}
533
533
  {...props}
534
534
  >
535
- <span className="flex size-9 shrink-0 items-center justify-center rounded-[10px] bg-sky-200 text-label-md text-surface-ink">
535
+ <span className="flex size-9 shrink-0 items-center justify-center rounded-md bg-sky-200 text-label-md text-surface-ink">
536
536
  {initials}
537
537
  </span>
538
538
  <span className="flex min-w-0 flex-1 flex-col">
@@ -701,7 +701,7 @@ export function SidebarAddButton({ icon = addIcon, className, children, ...props
701
701
  <button
702
702
  type="button"
703
703
  className={cn(
704
- "relative mt-2 flex h-9 w-full cursor-pointer items-center justify-center gap-1.5 rounded-[10px] text-label-md text-text-secondary motion-colors hover:bg-overlay-ink-4",
704
+ "relative mt-2 flex h-9 w-full cursor-pointer items-center justify-center gap-1.5 rounded-md text-label-md text-text-secondary motion-colors hover:bg-overlay-ink-4",
705
705
  "focus-visible:outline-2 focus-visible:outline-text-brand",
706
706
  className,
707
707
  )}
@@ -93,11 +93,11 @@ export function SourceRow({
93
93
  "flex flex-wrap items-center gap-x-3 gap-y-2 px-2 py-3",
94
94
  variant === "list"
95
95
  ? "relative after:absolute after:inset-x-2 after:bottom-0 after:h-px after:bg-overlay-ink-8 last:after:hidden"
96
- : "rounded-[14px] border border-border-default bg-bg-surface px-3",
96
+ : "rounded-lg border border-border-default bg-bg-surface px-3",
97
97
  className,
98
98
  )}
99
99
  >
100
- <span className="flex size-8 shrink-0 items-center justify-center rounded-[10px] bg-overlay-ink-5 text-text-primary [&>svg]:size-4">
100
+ <span className="flex size-8 shrink-0 items-center justify-center rounded-md bg-overlay-ink-5 text-text-primary [&>svg]:size-4">
101
101
  {icon}
102
102
  </span>
103
103
  <span className="flex min-w-0 flex-1 flex-col gap-0.5">
@@ -116,7 +116,7 @@ export function TaskRow({
116
116
  <div className="flex items-center gap-1.5 text-caption text-text-secondary">
117
117
  <span
118
118
  className={cn(
119
- "flex size-4.5 shrink-0 items-center justify-center rounded-[5px] text-label-sm",
119
+ "flex size-4.5 shrink-0 items-center justify-center rounded-xs text-label-sm",
120
120
  bot.tileClassName ? cn("text-text-inverse", bot.tileClassName) : botTile[status],
121
121
  )}
122
122
  >
@@ -92,6 +92,7 @@ function ToastList({ size, surface }: {
92
92
  aria-label="Close"
93
93
  className={cn(
94
94
  "relative flex shrink-0 motion-press cursor-pointer text-text-secondary motion-colors hover:text-text-primary",
95
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand",
95
96
  "after:absolute after:-inset-2 after:content-['']",
96
97
  closeSizeClass[size],
97
98
  )}
@@ -168,7 +168,7 @@ function Section({
168
168
  </button>
169
169
  )}
170
170
  </div>
171
- <div className="min-w-0 rounded-[10px] bg-bg-subtle px-3.5 py-3">{children}</div>
171
+ <div className="min-w-0 rounded-md bg-bg-subtle px-3.5 py-3">{children}</div>
172
172
  {footer}
173
173
  </div>
174
174
  );
@@ -250,14 +250,14 @@ export function ToolCall({
250
250
  <Collapsible.Panel className="motion-collapse">
251
251
  <div className="flex min-w-0 flex-col gap-3.5 px-4 pb-4">
252
252
  {status === "failed" && error && (
253
- <div className="flex items-center gap-2.5 rounded-[10px] bg-bg-danger px-3.5 py-3">
253
+ <div className="flex items-center gap-2.5 rounded-md bg-bg-danger px-3.5 py-3">
254
254
  <WarningCircle aria-hidden className="size-4 shrink-0 text-text-danger" />
255
255
  <p className="min-w-0 flex-1 text-body-sm text-text-danger">{error}</p>
256
256
  {onRetry && (
257
257
  <button
258
258
  type="button"
259
259
  onClick={onRetry}
260
- className="flex h-7.5 shrink-0 motion-press cursor-pointer items-center gap-1.5 rounded-full border border-border-default bg-bg-surface px-2.5 text-label-sm text-text-primary"
260
+ className="flex h-7.5 shrink-0 motion-press cursor-pointer items-center gap-1.5 rounded-full border border-border-default bg-bg-surface px-2.5 text-label-sm text-text-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand"
261
261
  >
262
262
  <ArrowClockwise aria-hidden className="size-3.5" />
263
263
  Retry
@@ -75,7 +75,7 @@ export function ToolCallsHeader({
75
75
  {chips.length > 0 && (
76
76
  <span className="flex shrink-0 items-center">
77
77
  {Children.map(chips, (icon) => (
78
- <span className="-ml-2 flex size-7 shrink-0 items-center justify-center rounded-[10px] bg-bg-subtle text-text-secondary ring-2 ring-bg-surface first:ml-0 [&>svg]:size-3.5">
78
+ <span className="-ml-2 flex size-7 shrink-0 items-center justify-center rounded-md bg-bg-subtle text-text-secondary ring-2 ring-bg-surface first:ml-0 [&>svg]:size-3.5">
79
79
  {icon}
80
80
  </span>
81
81
  ))}