@tangle-network/ui 11.9.0 → 11.10.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 (64) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +14 -0
  3. package/dist/auth.js +3 -2
  4. package/dist/chat.js +10 -9
  5. package/dist/{chunk-WUQDUBJG.js → chunk-3XXBZL53.js} +7 -1
  6. package/dist/{chunk-MKTSMWVD.js → chunk-42PAH5D2.js} +4 -1
  7. package/dist/{chunk-LDLOJKPC.js → chunk-55WHV7SS.js} +49 -30
  8. package/dist/{chunk-3TI5DEHV.js → chunk-BEBXZPHW.js} +4 -4
  9. package/dist/{chunk-7YOCS6IF.js → chunk-C5WF4WMV.js} +12 -6
  10. package/dist/{chunk-NWECTSOH.js → chunk-HMAPIH7L.js} +9 -3
  11. package/dist/{chunk-ZKCEAIIZ.js → chunk-K5XFRUS4.js} +9 -3
  12. package/dist/{chunk-NKDZ7GZE.js → chunk-KFQGHD73.js} +8 -2
  13. package/dist/{chunk-GYPQXTJU.js → chunk-M3QZK62R.js} +5 -2
  14. package/dist/{chunk-EOAX2ENE.js → chunk-OL5GYLHV.js} +1 -1
  15. package/dist/{chunk-XYAIX4SU.js → chunk-QGFYBNSO.js} +2 -2
  16. package/dist/{chunk-KNYSKNZX.js → chunk-R7B3UWPF.js} +2 -2
  17. package/dist/{chunk-Q56BYXQF.js → chunk-R7SUY4E3.js} +8 -4
  18. package/dist/chunk-WKWBTL2V.js +15 -0
  19. package/dist/{chunk-VPWY4I5O.js → chunk-X7CU776B.js} +1 -1
  20. package/dist/{chunk-TN4FUEWY.js → chunk-YU4E5J2N.js} +3 -3
  21. package/dist/{chunk-YJ6RE5WV.js → chunk-YZ6AK25N.js} +20 -9
  22. package/dist/document-editor-pane-QHDOBA43.js +13 -0
  23. package/dist/editor.js +5 -4
  24. package/dist/files.js +5 -4
  25. package/dist/hooks.js +7 -6
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +28 -16
  28. package/dist/markdown.js +3 -2
  29. package/dist/openui.js +6 -5
  30. package/dist/primitives.d.ts +2 -0
  31. package/dist/primitives.js +6 -5
  32. package/dist/run.js +10 -9
  33. package/dist/sdk-hooks.js +7 -6
  34. package/dist/tool-previews.js +3 -2
  35. package/dist/utils.d.ts +54 -1
  36. package/dist/utils.js +13 -1
  37. package/package.json +2 -2
  38. package/src/auth/auth.tsx +5 -1
  39. package/src/chat/agent-timeline.tsx +6 -1
  40. package/src/chat/chat-container.tsx +2 -1
  41. package/src/editor/document-editor-pane.test.tsx +3 -1
  42. package/src/editor/document-editor-pane.tsx +5 -1
  43. package/src/editor/markdown-document-editor.test.tsx +9 -4
  44. package/src/files/file-artifact-pane.tsx +3 -2
  45. package/src/files/file-preview.tsx +3 -1
  46. package/src/files/file-tabs.tsx +9 -2
  47. package/src/lib/focus.ts +63 -0
  48. package/src/markdown/code-block.tsx +5 -1
  49. package/src/primitives/badge.tsx +2 -1
  50. package/src/primitives/button.tsx +2 -1
  51. package/src/primitives/card.tsx +1 -2
  52. package/src/primitives/dialog.tsx +7 -1
  53. package/src/primitives/input.tsx +15 -14
  54. package/src/primitives/segmented-control.tsx +5 -3
  55. package/src/primitives/select.tsx +3 -1
  56. package/src/primitives/switch.tsx +3 -1
  57. package/src/primitives/tabs.tsx +6 -4
  58. package/src/primitives/terminal-display.tsx +6 -8
  59. package/src/primitives/toast.tsx +5 -1
  60. package/src/tool-previews/command-preview.tsx +5 -1
  61. package/src/tool-previews/web-search-preview.tsx +2 -1
  62. package/src/utils/index.ts +7 -0
  63. package/dist/document-editor-pane-EX25CEYW.js +0 -12
  64. /package/dist/{chunk-XGKULLYE.js → chunk-SNLR2AEA.js} +0 -0
@@ -10,17 +10,21 @@ import {
10
10
  } from "./chunk-XU3HB5QL.js";
11
11
  import {
12
12
  Button
13
- } from "./chunk-MKTSMWVD.js";
13
+ } from "./chunk-42PAH5D2.js";
14
14
  import {
15
15
  ArtifactPane
16
16
  } from "./chunk-LTEKI7YJ.js";
17
17
  import {
18
18
  Markdown
19
- } from "./chunk-EOAX2ENE.js";
19
+ } from "./chunk-OL5GYLHV.js";
20
20
  import {
21
21
  CodeBlock,
22
22
  CopyButton
23
- } from "./chunk-WUQDUBJG.js";
23
+ } from "./chunk-3XXBZL53.js";
24
+ import {
25
+ focusRing,
26
+ focusRingInset
27
+ } from "./chunk-WKWBTL2V.js";
24
28
  import {
25
29
  cn
26
30
  } from "./chunk-RQHJBTEU.js";
@@ -456,7 +460,8 @@ function ImagePreview({ src, filename }) {
456
460
  "aria-pressed": naturalSize,
457
461
  "aria-label": naturalSize ? "Fit image to pane" : "Show image at natural size",
458
462
  className: cn(
459
- "flex items-center justify-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary/60",
463
+ "flex items-center justify-center",
464
+ focusRingInset,
460
465
  naturalSize ? "m-auto cursor-zoom-out" : "h-full w-full cursor-zoom-in p-4"
461
466
  ),
462
467
  children: /* @__PURE__ */ jsx3(
@@ -689,7 +694,10 @@ function FileTabs({ tabs, activeId, onSelect, onClose, className }) {
689
694
  {
690
695
  type: "button",
691
696
  onClick: () => onSelect(tab.id),
692
- className: "flex min-w-0 items-center gap-1.5 px-3 py-1.5 text-xs transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary/60",
697
+ className: cn(
698
+ "flex min-w-0 items-center gap-1.5 px-3 py-1.5 text-xs transition-colors hover:text-foreground",
699
+ focusRingInset
700
+ ),
693
701
  children: [
694
702
  /* @__PURE__ */ jsx4(Icon, { className: "h-3 w-3 shrink-0" }),
695
703
  /* @__PURE__ */ jsx4("span", { className: "max-w-[120px] truncate", children: tab.name }),
@@ -703,7 +711,10 @@ function FileTabs({ tabs, activeId, onSelect, onClose, className }) {
703
711
  type: "button",
704
712
  "aria-label": `Close ${tab.name}`,
705
713
  onClick: () => onClose(tab.id),
706
- className: "mr-1 rounded p-0.5 opacity-0 transition-opacity hover:bg-accent focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60 group-hover:opacity-100",
714
+ className: cn(
715
+ "mr-1 rounded p-0.5 opacity-0 transition-opacity hover:bg-accent focus-visible:opacity-100 group-hover:opacity-100",
716
+ focusRing
717
+ ),
707
718
  children: /* @__PURE__ */ jsx4(X2, { className: "h-2.5 w-2.5" })
708
719
  }
709
720
  )
@@ -719,7 +730,7 @@ import { lazy, Suspense } from "react";
719
730
  import { Download as Download2, X as X3 } from "lucide-react";
720
731
  import { Fragment, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
721
732
  var LazyDocumentEditorPane = lazy(async () => {
722
- const module = await import("./document-editor-pane-EX25CEYW.js");
733
+ const module = await import("./document-editor-pane-QHDOBA43.js");
723
734
  return { default: module.DocumentEditorPane };
724
735
  });
725
736
  function FileArtifactPane({
@@ -763,7 +774,7 @@ function FileArtifactPane({
763
774
  type: "button",
764
775
  "aria-label": `Download ${filename}`,
765
776
  onClick: onDownload,
766
- className: "rounded-[var(--radius-sm)] p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",
777
+ className: `rounded-[var(--radius-sm)] p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground ${focusRing}`,
767
778
  children: /* @__PURE__ */ jsx5(Download2, { className: "h-4 w-4" })
768
779
  }
769
780
  ),
@@ -773,7 +784,7 @@ function FileArtifactPane({
773
784
  type: "button",
774
785
  "aria-label": `Close ${filename}`,
775
786
  onClick: onClose,
776
- className: "rounded-[var(--radius-sm)] p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",
787
+ className: `rounded-[var(--radius-sm)] p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground ${focusRing}`,
777
788
  children: /* @__PURE__ */ jsx5(X3, { className: "h-4 w-4" })
778
789
  }
779
790
  )
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import {
3
+ DocumentEditorPane
4
+ } from "./chunk-K5XFRUS4.js";
5
+ import "./chunk-R7SUY4E3.js";
6
+ import "./chunk-LTEKI7YJ.js";
7
+ import "./chunk-OL5GYLHV.js";
8
+ import "./chunk-3XXBZL53.js";
9
+ import "./chunk-WKWBTL2V.js";
10
+ import "./chunk-RQHJBTEU.js";
11
+ export {
12
+ DocumentEditorPane
13
+ };
package/dist/editor.js CHANGED
@@ -11,11 +11,12 @@ import {
11
11
  useEditorConnection,
12
12
  useEditorContext,
13
13
  useYjsState
14
- } from "./chunk-ZKCEAIIZ.js";
15
- import "./chunk-Q56BYXQF.js";
14
+ } from "./chunk-K5XFRUS4.js";
15
+ import "./chunk-R7SUY4E3.js";
16
16
  import "./chunk-LTEKI7YJ.js";
17
- import "./chunk-EOAX2ENE.js";
18
- import "./chunk-WUQDUBJG.js";
17
+ import "./chunk-OL5GYLHV.js";
18
+ import "./chunk-3XXBZL53.js";
19
+ import "./chunk-WKWBTL2V.js";
19
20
  import "./chunk-RQHJBTEU.js";
20
21
  export {
21
22
  CollaboratorsList,
package/dist/files.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  RichFileTree,
8
8
  filterFileTree,
9
9
  parseCsv
10
- } from "./chunk-YJ6RE5WV.js";
10
+ } from "./chunk-YZ6AK25N.js";
11
11
  import "./chunk-4CLN43XT.js";
12
12
  import {
13
13
  detectFileFormat,
@@ -17,10 +17,11 @@ import {
17
17
  getSyntaxLanguage,
18
18
  resolveFilePreviewKind
19
19
  } from "./chunk-XU3HB5QL.js";
20
- import "./chunk-MKTSMWVD.js";
20
+ import "./chunk-42PAH5D2.js";
21
21
  import "./chunk-LTEKI7YJ.js";
22
- import "./chunk-EOAX2ENE.js";
23
- import "./chunk-WUQDUBJG.js";
22
+ import "./chunk-OL5GYLHV.js";
23
+ import "./chunk-3XXBZL53.js";
24
+ import "./chunk-WKWBTL2V.js";
24
25
  import "./chunk-RQHJBTEU.js";
25
26
  export {
26
27
  CSV_PREVIEW_ROW_LIMIT,
package/dist/hooks.js CHANGED
@@ -11,22 +11,23 @@ import {
11
11
  useSSEStream,
12
12
  useSdkSession,
13
13
  useToolCallStream
14
- } from "./chunk-VPWY4I5O.js";
14
+ } from "./chunk-X7CU776B.js";
15
15
  import "./chunk-OEX7NZE3.js";
16
16
  import {
17
17
  useAutoScroll,
18
18
  useRunCollapseState,
19
19
  useRunGroups
20
20
  } from "./chunk-565EATZZ.js";
21
- import "./chunk-XYAIX4SU.js";
22
- import "./chunk-KNYSKNZX.js";
21
+ import "./chunk-QGFYBNSO.js";
22
+ import "./chunk-R7B3UWPF.js";
23
23
  import "./chunk-ND3ZFXQK.js";
24
- import "./chunk-NWECTSOH.js";
24
+ import "./chunk-HMAPIH7L.js";
25
25
  import "./chunk-L57WRIND.js";
26
26
  import "./chunk-4CLN43XT.js";
27
27
  import "./chunk-XU3HB5QL.js";
28
- import "./chunk-EOAX2ENE.js";
29
- import "./chunk-WUQDUBJG.js";
28
+ import "./chunk-OL5GYLHV.js";
29
+ import "./chunk-3XXBZL53.js";
30
+ import "./chunk-WKWBTL2V.js";
30
31
  import "./chunk-RQHJBTEU.js";
31
32
  export {
32
33
  RealtimeSessionRegistry,
package/dist/index.d.ts CHANGED
@@ -19,7 +19,7 @@ export { S as SessionMessage } from './message-BHWbxBtT.js';
19
19
  export { R as ReasoningPart, S as SessionPart, T as TextPart, a as ToolPart, b as ToolState, c as ToolStatus, d as ToolTime } from './parts-dj7AcUg0.js';
20
20
  export { F as FinalTextPart, G as GroupedMessage, M as MessageRun, a as MessageUser, R as Run, b as RunStats, T as ToolCategory } from './run-PfLmDAox.js';
21
21
  export { C as CustomToolRenderer, D as DisplayVariant, T as ToolDisplayMetadata } from './tool-display-z4JcDmMQ.js';
22
- export { TOOL_CATEGORY_ICONS, cn, copyText, formatBytes, formatDuration, formatUptime, getToolCategory, getToolDisplayMetadata, getToolErrorText, timeAgo, truncateText } from './utils.js';
22
+ export { TOOL_CATEGORY_ICONS, cn, copyText, focusField, focusFieldInvalid, focusFieldWithin, focusRing, focusRingInset, formatBytes, formatDuration, formatUptime, getToolCategory, getToolDisplayMetadata, getToolErrorText, timeAgo, truncateText } from './utils.js';
23
23
  export { CommandPreview, CommandPreviewProps, DiffPreview, DiffPreviewProps, GlobResultsPreview, GlobResultsPreviewProps, GrepResultsPreview, GrepResultsPreviewProps, QuestionPreview, QuestionPreviewProps, WebSearchPreview, WebSearchPreviewProps, WriteFilePreview, WriteFilePreviewProps } from './tool-previews.js';
24
24
  export { RedactedDocSegment, RedactedDocument, RedactedDocumentData, RedactedDocumentProps, RevealResult } from './redaction.js';
25
25
  import 'class-variance-authority/types';
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  GitHubLoginButton,
7
7
  LoginLayout,
8
8
  UserMenu
9
- } from "./chunk-NKDZ7GZE.js";
9
+ } from "./chunk-KFQGHD73.js";
10
10
  import {
11
11
  createAuthFetcher,
12
12
  useApiKey,
@@ -20,7 +20,7 @@ import {
20
20
  useSSEStream,
21
21
  useSdkSession,
22
22
  useToolCallStream
23
- } from "./chunk-VPWY4I5O.js";
23
+ } from "./chunk-X7CU776B.js";
24
24
  import {
25
25
  addMessage,
26
26
  addParts,
@@ -64,7 +64,7 @@ import "./chunk-6BGQA4BQ.js";
64
64
  import {
65
65
  copyText,
66
66
  timeAgo
67
- } from "./chunk-XGKULLYE.js";
67
+ } from "./chunk-SNLR2AEA.js";
68
68
  import "./chunk-3OI2QKFD.js";
69
69
  import {
70
70
  Dialog,
@@ -118,7 +118,7 @@ import {
118
118
  UploadProgress,
119
119
  useTheme,
120
120
  useToast
121
- } from "./chunk-LDLOJKPC.js";
121
+ } from "./chunk-55WHV7SS.js";
122
122
  import {
123
123
  Avatar,
124
124
  AvatarFallback,
@@ -146,7 +146,7 @@ import {
146
146
  MessageList,
147
147
  ThinkingIndicator,
148
148
  UserMessage
149
- } from "./chunk-7YOCS6IF.js";
149
+ } from "./chunk-C5WF4WMV.js";
150
150
  import {
151
151
  useAutoScroll,
152
152
  useRunCollapseState,
@@ -158,17 +158,17 @@ import {
158
158
  import {
159
159
  ToolCallFeed,
160
160
  parseToolEvent
161
- } from "./chunk-XYAIX4SU.js";
161
+ } from "./chunk-QGFYBNSO.js";
162
162
  import {
163
163
  InlineThinkingItem,
164
164
  RunGroup
165
- } from "./chunk-TN4FUEWY.js";
165
+ } from "./chunk-YU4E5J2N.js";
166
166
  import {
167
167
  ExpandedToolDetail,
168
168
  InlineToolItem,
169
169
  RunRowShell,
170
170
  RunRowStatusDot
171
- } from "./chunk-KNYSKNZX.js";
171
+ } from "./chunk-R7B3UWPF.js";
172
172
  import {
173
173
  TOOL_CATEGORY_ICONS,
174
174
  getToolCategory,
@@ -183,14 +183,14 @@ import {
183
183
  QuestionPreview,
184
184
  WebSearchPreview,
185
185
  WriteFilePreview
186
- } from "./chunk-NWECTSOH.js";
186
+ } from "./chunk-HMAPIH7L.js";
187
187
  import {
188
188
  TextShimmer
189
189
  } from "./chunk-L57WRIND.js";
190
190
  import "./chunk-RQGKSCEZ.js";
191
191
  import {
192
192
  OpenUIArtifactRenderer
193
- } from "./chunk-3TI5DEHV.js";
193
+ } from "./chunk-BEBXZPHW.js";
194
194
  import {
195
195
  Badge,
196
196
  Card,
@@ -209,7 +209,7 @@ import {
209
209
  TableHeader,
210
210
  TableRow,
211
211
  badgeVariants
212
- } from "./chunk-GYPQXTJU.js";
212
+ } from "./chunk-M3QZK62R.js";
213
213
  import {
214
214
  CSV_PREVIEW_ROW_LIMIT,
215
215
  FileArtifactPane,
@@ -219,7 +219,7 @@ import {
219
219
  RichFileTree,
220
220
  filterFileTree,
221
221
  parseCsv
222
- } from "./chunk-YJ6RE5WV.js";
222
+ } from "./chunk-YZ6AK25N.js";
223
223
  import {
224
224
  formatBytes,
225
225
  formatDuration,
@@ -237,24 +237,31 @@ import {
237
237
  import {
238
238
  Button,
239
239
  buttonVariants
240
- } from "./chunk-MKTSMWVD.js";
240
+ } from "./chunk-42PAH5D2.js";
241
241
  import {
242
242
  Tabs,
243
243
  TabsContent,
244
244
  TabsList,
245
245
  TabsTrigger
246
- } from "./chunk-Q56BYXQF.js";
246
+ } from "./chunk-R7SUY4E3.js";
247
247
  import {
248
248
  ArtifactPane
249
249
  } from "./chunk-LTEKI7YJ.js";
250
250
  import "./chunk-5Z5ZYMOJ.js";
251
251
  import {
252
252
  Markdown
253
- } from "./chunk-EOAX2ENE.js";
253
+ } from "./chunk-OL5GYLHV.js";
254
254
  import {
255
255
  CodeBlock,
256
256
  CopyButton
257
- } from "./chunk-WUQDUBJG.js";
257
+ } from "./chunk-3XXBZL53.js";
258
+ import {
259
+ focusField,
260
+ focusFieldInvalid,
261
+ focusFieldWithin,
262
+ focusRing,
263
+ focusRingInset
264
+ } from "./chunk-WKWBTL2V.js";
258
265
  import {
259
266
  cn
260
267
  } from "./chunk-RQHJBTEU.js";
@@ -400,6 +407,11 @@ export {
400
407
  detectFileFormat,
401
408
  fileExtension,
402
409
  filterFileTree,
410
+ focusField,
411
+ focusFieldInvalid,
412
+ focusFieldWithin,
413
+ focusRing,
414
+ focusRingInset,
403
415
  formatBytes,
404
416
  formatDuration,
405
417
  formatUptime,
package/dist/markdown.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import "./chunk-5Z5ZYMOJ.js";
2
2
  import {
3
3
  Markdown
4
- } from "./chunk-EOAX2ENE.js";
4
+ } from "./chunk-OL5GYLHV.js";
5
5
  import {
6
6
  CodeBlock,
7
7
  CopyButton
8
- } from "./chunk-WUQDUBJG.js";
8
+ } from "./chunk-3XXBZL53.js";
9
+ import "./chunk-WKWBTL2V.js";
9
10
  import "./chunk-RQHJBTEU.js";
10
11
  export {
11
12
  CodeBlock,
package/dist/openui.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import "./chunk-RQGKSCEZ.js";
2
2
  import {
3
3
  OpenUIArtifactRenderer
4
- } from "./chunk-3TI5DEHV.js";
5
- import "./chunk-GYPQXTJU.js";
6
- import "./chunk-MKTSMWVD.js";
7
- import "./chunk-EOAX2ENE.js";
8
- import "./chunk-WUQDUBJG.js";
4
+ } from "./chunk-BEBXZPHW.js";
5
+ import "./chunk-M3QZK62R.js";
6
+ import "./chunk-42PAH5D2.js";
7
+ import "./chunk-OL5GYLHV.js";
8
+ import "./chunk-3XXBZL53.js";
9
+ import "./chunk-WKWBTL2V.js";
9
10
  import "./chunk-RQHJBTEU.js";
10
11
  export {
11
12
  OpenUIArtifactRenderer
@@ -56,6 +56,7 @@ interface InputProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>,
56
56
  }
57
57
  declare const Input: React$1.ForwardRefExoticComponent<InputProps & React$1.RefAttributes<HTMLInputElement>>;
58
58
  interface TextareaProps extends React$1.TextareaHTMLAttributes<HTMLTextAreaElement> {
59
+ /** Both values render the same field. */
59
60
  variant?: "default" | "sandbox";
60
61
  label?: string;
61
62
  error?: string;
@@ -273,6 +274,7 @@ declare const TerminalLine: React$1.ForwardRefExoticComponent<TerminalLineProps
273
274
  declare const TerminalCursor: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLSpanElement> & React$1.RefAttributes<HTMLSpanElement>>;
274
275
  interface TerminalInputProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "onSubmit"> {
275
276
  onSubmit?: (value: string) => void;
277
+ /** Both values render the same field. */
276
278
  variant?: "default" | "sandbox";
277
279
  }
278
280
  declare const TerminalInput: React$1.ForwardRefExoticComponent<TerminalInputProps & React$1.RefAttributes<HTMLInputElement>>;
@@ -50,7 +50,7 @@ import {
50
50
  UploadProgress,
51
51
  useTheme,
52
52
  useToast
53
- } from "./chunk-LDLOJKPC.js";
53
+ } from "./chunk-55WHV7SS.js";
54
54
  import {
55
55
  Avatar,
56
56
  AvatarFallback,
@@ -92,24 +92,25 @@ import {
92
92
  TableHeader,
93
93
  TableRow,
94
94
  badgeVariants
95
- } from "./chunk-GYPQXTJU.js";
95
+ } from "./chunk-M3QZK62R.js";
96
96
  import {
97
97
  Button,
98
98
  buttonVariants
99
- } from "./chunk-MKTSMWVD.js";
99
+ } from "./chunk-42PAH5D2.js";
100
100
  import {
101
101
  Tabs,
102
102
  TabsContent,
103
103
  TabsList,
104
104
  TabsTrigger
105
- } from "./chunk-Q56BYXQF.js";
105
+ } from "./chunk-R7SUY4E3.js";
106
106
  import {
107
107
  ArtifactPane
108
108
  } from "./chunk-LTEKI7YJ.js";
109
109
  import {
110
110
  CodeBlock,
111
111
  CopyButton
112
- } from "./chunk-WUQDUBJG.js";
112
+ } from "./chunk-3XXBZL53.js";
113
+ import "./chunk-WKWBTL2V.js";
113
114
  import "./chunk-RQHJBTEU.js";
114
115
  export {
115
116
  ArtifactPane,
package/dist/run.js CHANGED
@@ -4,27 +4,28 @@ import {
4
4
  import {
5
5
  ToolCallFeed,
6
6
  parseToolEvent
7
- } from "./chunk-XYAIX4SU.js";
7
+ } from "./chunk-QGFYBNSO.js";
8
8
  import {
9
9
  InlineThinkingItem,
10
10
  RunGroup
11
- } from "./chunk-TN4FUEWY.js";
11
+ } from "./chunk-YU4E5J2N.js";
12
12
  import {
13
13
  ExpandedToolDetail,
14
14
  InlineToolItem,
15
15
  RunRowShell,
16
16
  RunRowStatusDot
17
- } from "./chunk-KNYSKNZX.js";
17
+ } from "./chunk-R7B3UWPF.js";
18
18
  import "./chunk-ND3ZFXQK.js";
19
- import "./chunk-NWECTSOH.js";
19
+ import "./chunk-HMAPIH7L.js";
20
20
  import "./chunk-L57WRIND.js";
21
- import "./chunk-3TI5DEHV.js";
22
- import "./chunk-GYPQXTJU.js";
21
+ import "./chunk-BEBXZPHW.js";
22
+ import "./chunk-M3QZK62R.js";
23
23
  import "./chunk-4CLN43XT.js";
24
24
  import "./chunk-XU3HB5QL.js";
25
- import "./chunk-MKTSMWVD.js";
26
- import "./chunk-EOAX2ENE.js";
27
- import "./chunk-WUQDUBJG.js";
25
+ import "./chunk-42PAH5D2.js";
26
+ import "./chunk-OL5GYLHV.js";
27
+ import "./chunk-3XXBZL53.js";
28
+ import "./chunk-WKWBTL2V.js";
28
29
  import "./chunk-RQHJBTEU.js";
29
30
  export {
30
31
  ExpandedToolDetail,
package/dist/sdk-hooks.js CHANGED
@@ -5,22 +5,23 @@ import {
5
5
  useSSEStream,
6
6
  useSdkSession,
7
7
  useToolCallStream
8
- } from "./chunk-VPWY4I5O.js";
8
+ } from "./chunk-X7CU776B.js";
9
9
  import "./chunk-OEX7NZE3.js";
10
10
  import {
11
11
  useAutoScroll,
12
12
  useRunCollapseState,
13
13
  useRunGroups
14
14
  } from "./chunk-565EATZZ.js";
15
- import "./chunk-XYAIX4SU.js";
16
- import "./chunk-KNYSKNZX.js";
15
+ import "./chunk-QGFYBNSO.js";
16
+ import "./chunk-R7B3UWPF.js";
17
17
  import "./chunk-ND3ZFXQK.js";
18
- import "./chunk-NWECTSOH.js";
18
+ import "./chunk-HMAPIH7L.js";
19
19
  import "./chunk-L57WRIND.js";
20
20
  import "./chunk-4CLN43XT.js";
21
21
  import "./chunk-XU3HB5QL.js";
22
- import "./chunk-EOAX2ENE.js";
23
- import "./chunk-WUQDUBJG.js";
22
+ import "./chunk-OL5GYLHV.js";
23
+ import "./chunk-3XXBZL53.js";
24
+ import "./chunk-WKWBTL2V.js";
24
25
  import "./chunk-RQHJBTEU.js";
25
26
  export {
26
27
  RealtimeSessionRegistry,
@@ -7,9 +7,10 @@ import {
7
7
  QuestionPreview,
8
8
  WebSearchPreview,
9
9
  WriteFilePreview
10
- } from "./chunk-NWECTSOH.js";
10
+ } from "./chunk-HMAPIH7L.js";
11
11
  import "./chunk-XU3HB5QL.js";
12
- import "./chunk-WUQDUBJG.js";
12
+ import "./chunk-3XXBZL53.js";
13
+ import "./chunk-WKWBTL2V.js";
13
14
  import "./chunk-RQHJBTEU.js";
14
15
  export {
15
16
  CommandPreview,
package/dist/utils.d.ts CHANGED
@@ -48,4 +48,57 @@ declare function getToolErrorText(part: ToolPart, fallback?: string): string | u
48
48
 
49
49
  declare function cn(...inputs: ClassValue[]): string;
50
50
 
51
- export { TOOL_CATEGORY_ICONS, cn, copyText, formatBytes, formatDuration, formatUptime, getToolCategory, getToolDisplayMetadata, getToolErrorText, timeAgo, truncateText };
51
+ /**
52
+ * The focus treatment every control shares, in two shapes over one palette
53
+ * (`--focus-border`, `--focus-halo` and `--border-strong` from
54
+ * `@tangle-network/brand`'s tokens.css).
55
+ *
56
+ * A FIELD — input, textarea, select trigger, composer — shows focus on its own
57
+ * border: the hairline shifts to `--focus-border` and a 3px `--focus-halo` ring
58
+ * spreads outside it. It keys off `:focus`, because a caret in a field needs the
59
+ * cue whether the field was clicked or tabbed into.
60
+ *
61
+ * A CONTROL — button, tab, switch, link, card — has no border to shift, so it
62
+ * draws a 1px `--focus-border` outline with the same 3px halo beyond it. It keys
63
+ * off `:focus-visible`, so a mouse click leaves no ring.
64
+ *
65
+ * The halo is a Tailwind ring, which renders as box-shadow: it follows
66
+ * border-radius and never moves layout, and a consumer removes it with
67
+ * `focus:ring-0` / `focus-visible:ring-0`, which tailwind-merge resolves against
68
+ * these classes. The control's line is an outline so that forced-colors mode,
69
+ * which drops box-shadows, still paints it. A field has its border for that, so
70
+ * it hides the outline with `outline-hidden`, which stays transparent-but-present
71
+ * in forced-colors mode.
72
+ */
73
+ /**
74
+ * Resting hairline, neutral hover, and `:focus` border plus halo for a text
75
+ * field. The hover is a plain `hover:` class so a consumer's `hover:border-*`
76
+ * replaces it through tailwind-merge; the focus border outranks it because
77
+ * Tailwind emits `focus:` after `hover:`.
78
+ */
79
+ declare const focusField = "border-border transition-[border-color,box-shadow] duration-150 ease-out hover:border-[var(--border-strong)] focus:outline-hidden focus:border-[var(--focus-border)] focus:ring-3 focus:ring-[var(--focus-halo)]";
80
+ /**
81
+ * The field treatment for a container that wraps a borderless field, such as a
82
+ * composer around a textarea and its buttons. It lights while a FIELD inside
83
+ * has focus: a text input, textarea, native select or contenteditable editor. A
84
+ * focused button, checkbox or button-type input inside the container shows only
85
+ * its own ring, so a click on the send button does not read as field focus and
86
+ * a tab to it does not stack two indicators. `:focus-within` cannot tell the
87
+ * two apart, so the rule keys off `:has()`; a consumer's `focus-within:*` class
88
+ * therefore does not replace it. To style that container's focus differently,
89
+ * compose your own classes instead of this helper. The field selector is
90
+ * written out in full because Tailwind reads class names statically.
91
+ */
92
+ declare const focusFieldWithin = "border-border transition-[border-color,box-shadow] duration-150 ease-out hover:border-[var(--border-strong)] has-[:is(textarea,select,[contenteditable]:not([contenteditable=false]),input:not([type=button],[type=submit],[type=reset],[type=image],[type=checkbox],[type=radio],[type=range],[type=color],[type=file])):focus]:border-[var(--focus-border)] has-[:is(textarea,select,[contenteditable]:not([contenteditable=false]),input:not([type=button],[type=submit],[type=reset],[type=image],[type=checkbox],[type=radio],[type=range],[type=color],[type=file])):focus]:ring-3 has-[:is(textarea,select,[contenteditable]:not([contenteditable=false]),input:not([type=button],[type=submit],[type=reset],[type=image],[type=checkbox],[type=radio],[type=range],[type=color],[type=file])):focus]:ring-[var(--focus-halo)]";
93
+ /** Error state for a field: a danger hairline and the same focus shape in danger. Compose after `focusField`. */
94
+ declare const focusFieldInvalid = "border-[var(--surface-danger-border)] hover:border-[var(--surface-danger-border)] focus:border-[var(--focus-border-danger)] focus:ring-[var(--focus-halo-danger)]";
95
+ /** Keyboard-only focus for a control: a 1px focus line with the halo beyond it. */
96
+ declare const focusRing = "focus-visible:outline-1 focus-visible:outline-[var(--focus-border)] focus-visible:ring-4 focus-visible:ring-[var(--focus-halo)] focus-visible:outline-offset-0";
97
+ /**
98
+ * `focusRing` drawn inside the box, for a control flush against a scroll
99
+ * container or its neighbours (a tab strip, a list row), where an outer ring
100
+ * would be clipped or would overlap them.
101
+ */
102
+ declare const focusRingInset = "focus-visible:outline-1 focus-visible:outline-[var(--focus-border)] focus-visible:ring-4 focus-visible:ring-[var(--focus-halo)] focus-visible:-outline-offset-1 focus-visible:ring-inset";
103
+
104
+ export { TOOL_CATEGORY_ICONS, cn, copyText, focusField, focusFieldInvalid, focusFieldWithin, focusRing, focusRingInset, formatBytes, formatDuration, formatUptime, getToolCategory, getToolDisplayMetadata, getToolErrorText, timeAgo, truncateText };
package/dist/utils.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  copyText,
3
3
  timeAgo
4
- } from "./chunk-XGKULLYE.js";
4
+ } from "./chunk-SNLR2AEA.js";
5
5
  import {
6
6
  TOOL_CATEGORY_ICONS,
7
7
  getToolCategory,
@@ -14,6 +14,13 @@ import {
14
14
  formatUptime,
15
15
  truncateText
16
16
  } from "./chunk-4CLN43XT.js";
17
+ import {
18
+ focusField,
19
+ focusFieldInvalid,
20
+ focusFieldWithin,
21
+ focusRing,
22
+ focusRingInset
23
+ } from "./chunk-WKWBTL2V.js";
17
24
  import {
18
25
  cn
19
26
  } from "./chunk-RQHJBTEU.js";
@@ -21,6 +28,11 @@ export {
21
28
  TOOL_CATEGORY_ICONS,
22
29
  cn,
23
30
  copyText,
31
+ focusField,
32
+ focusFieldInvalid,
33
+ focusFieldWithin,
34
+ focusRing,
35
+ focusRingInset,
24
36
  formatBytes,
25
37
  formatDuration,
26
38
  formatUptime,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/ui",
3
- "version": "11.9.0",
3
+ "version": "11.10.0",
4
4
  "description": "Generic React UI components for Tangle products — primitives, chat, run, files, editor, markdown.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -134,7 +134,7 @@
134
134
  "turndown": "^7.2.2"
135
135
  },
136
136
  "peerDependencies": {
137
- "@tangle-network/brand": "^1.5.0",
137
+ "@tangle-network/brand": "^1.6.0",
138
138
  "@hocuspocus/provider": ">=2.15.0 <5.0.0",
139
139
  "@nanostores/react": ">=0.8.4 <2.0.0",
140
140
  "@tiptap/core": ">=3.20.4 <4.0.0",
package/src/auth/auth.tsx CHANGED
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import type * as React from "react";
4
+ import { focusRing } from "../lib/focus";
4
5
  import { cn } from "../lib/utils";
5
6
  import { Avatar, AvatarFallback, AvatarImage } from "../primitives/avatar";
6
7
  import { Button, type ButtonProps } from "../primitives/button";
@@ -120,7 +121,10 @@ export function UserMenu({
120
121
  <DropdownMenuTrigger asChild>
121
122
  <button
122
123
  type="button"
123
- className="flex items-center gap-2 rounded-lg p-1.5 transition-colors hover:bg-accent focus:outline-none focus:ring-2 focus:ring-ring"
124
+ className={cn(
125
+ "flex items-center gap-2 rounded-lg p-1.5 transition-colors hover:bg-accent",
126
+ focusRing,
127
+ )}
124
128
  >
125
129
  <Avatar className="h-8 w-8">
126
130
  <AvatarImage src={undefined} alt={user.name ?? user.email} />
@@ -6,6 +6,7 @@ import {
6
6
  FileText,
7
7
  Info,
8
8
  } from "lucide-react";
9
+ import { focusRing } from "../lib/focus";
9
10
  import { cn } from "../lib/utils";
10
11
  import { type MessageRole } from "./chat-message";
11
12
  import { UserMessage } from "./user-message";
@@ -235,7 +236,11 @@ function ArtifactCard({ item }: { item: AgentTimelineArtifactItem }) {
235
236
  item.onClick?.();
236
237
  }
237
238
  }}
238
- className="block w-full text-left transition-transform hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60"
239
+ // Rounded like the card inside it, so the focus ring follows its corners.
240
+ className={cn(
241
+ "block w-full rounded-[var(--radius-lg)] text-left transition-transform hover:-translate-y-0.5",
242
+ focusRing,
243
+ )}
239
244
  >
240
245
  {content}
241
246
  </div>