@puredesktop/puredesktop-ui-bridge 2.1.3 → 2.1.6

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 (183) hide show
  1. package/package.json +1132 -45
  2. package/src/agents/runtime/mapAgentSnapshot.test.ts +1 -3
  3. package/src/agents/runtime/mapAgentSnapshot.ts +8 -4
  4. package/src/agents/runtime/mergeUsageTurn.ts +1 -2
  5. package/src/agents/runtime/pendingToolCalls.test.ts +1 -3
  6. package/src/agents/runtime/unresolvedToolCalls.ts +1 -2
  7. package/src/bridge/agentModelTiers.ts +9 -4
  8. package/src/bridge/agents.mjs +3 -1
  9. package/src/bridge/calendarDraftIntent.ts +12 -4
  10. package/src/bridge/calendarInviteIntent.ts +18 -5
  11. package/src/bridge/client.mjs +45 -45
  12. package/src/bridge/dialog.d.mts +8 -8
  13. package/src/bridge/dialog.mjs +40 -40
  14. package/src/bridge/dialog.test.ts +73 -73
  15. package/src/bridge/fs.d.mts +41 -41
  16. package/src/bridge/fs.mjs +56 -56
  17. package/src/bridge/fs.test.ts +83 -83
  18. package/src/bridge/fs.ts +28 -28
  19. package/src/bridge/googleAuth.ts +3 -1
  20. package/src/bridge/methods.d.mts +6 -0
  21. package/src/bridge/methods.mjs +7 -0
  22. package/src/bridge/network.d.mts +17 -17
  23. package/src/bridge/network.mjs +22 -22
  24. package/src/bridge/pureRender/base.css +324 -76
  25. package/src/bridge/pureRender/compiler.ts +1 -1
  26. package/src/bridge/pureRender/document.test.ts +2 -2
  27. package/src/bridge/pureRender/extraction.test.ts +24 -12
  28. package/src/bridge/pureRender/extraction.ts +10 -7
  29. package/src/bridge/pureRender/flow.css +17 -3
  30. package/src/bridge/pureRender/normalize.ts +28 -26
  31. package/src/bridge/pureRender/presets.ts +7 -7
  32. package/src/bridge/pureRender/profiles/book.css +122 -19
  33. package/src/bridge/pureRender/profiles/manuscript.css +57 -11
  34. package/src/bridge/pureRender/profiles/writer.css +48 -10
  35. package/src/bridge/pureRender/reset.css +20 -5
  36. package/src/bridge/pureRender/theme.ts +37 -9
  37. package/src/bridge/pureRender/tokens/default.css +45 -33
  38. package/src/bridge/react/usePlatformAgentRunLiveState.tsx +4 -1
  39. package/src/bridge/react/usePlatformAgentSessionDrive.tsx +13 -4
  40. package/src/bridge/screenAnnotation.test.ts +4 -1
  41. package/src/bridge/screenAnnotation.ts +6 -2
  42. package/src/bridge/storage.d.mts +27 -27
  43. package/src/bridge/storage.mjs +18 -18
  44. package/src/bridge/storage.test.ts +49 -49
  45. package/src/bridge/types.ts +62 -58
  46. package/src/bridge/window.d.mts +3 -1
  47. package/src/bridge/workspace.d.mts +7 -0
  48. package/src/bridge/workspace.mjs +8 -0
  49. package/src/bridge/workspace.ts +1 -0
  50. package/src/commitments/commitments.test.ts +10 -3
  51. package/src/commitments/commitments.ts +18 -4
  52. package/src/components/accessibility/AccessibilityReviewDialog.tsx +7 -2
  53. package/src/components/accessibility/accessibilityReview.test.ts +11 -4
  54. package/src/components/accessibility/accessibilityReview.ts +18 -10
  55. package/src/components/agent-feedback/ScreenAnnotationAgentDialog.tsx +9 -2
  56. package/src/components/agents/AgentContextUsageBar.tsx +5 -3
  57. package/src/components/agents/AgentDrawerPanel.test.tsx +15 -3
  58. package/src/components/agents/AgentMessageBubble.tsx +1 -3
  59. package/src/components/agents/AgentQuestionPromptList.tsx +3 -3
  60. package/src/components/agents/AgentToolApprovalActions.tsx +1 -3
  61. package/src/components/agents/agentPanelStyles.ts +1 -1
  62. package/src/components/agents/agentToolDisplay.ts +4 -1
  63. package/src/components/assets/asset-library/AssetLibraryDialog.tsx +2 -0
  64. package/src/components/assets/asset-library/AssetLibraryWorkspace.tsx +2 -0
  65. package/src/components/assets/asset-library/detail/AssetLibraryDetailHeader.test.tsx +40 -0
  66. package/src/components/assets/asset-library/detail/AssetLibraryDetailHeader.tsx +7 -3
  67. package/src/components/assets/asset-library/detail/AssetLibraryDetailPreview.tsx +8 -8
  68. package/src/components/assets/asset-library/hooks/useAssetLibraryDialog.ts +13 -2
  69. package/src/components/assets/asset-library/hooks/useAssetLibraryMutations.ts +18 -1
  70. package/src/components/assets/asset-library/sidebar/AssetLibraryListRow.tsx +9 -6
  71. package/src/components/assets/asset-library/sidebar/AssetLibrarySidebarToolbar.tsx +3 -1
  72. package/src/components/assets/asset-library/sidebar/AssetListThumbnail.tsx +1 -1
  73. package/src/components/assets/asset-library/types.ts +6 -0
  74. package/src/components/chrome/OverlayActionCapsule.tsx +2 -2
  75. package/src/components/chrome/PanelTabStrip.tsx +3 -2
  76. package/src/components/chrome/PureAppWordmark.tsx +15 -15
  77. package/src/components/chrome/WorkspaceTabStrip.tsx +19 -14
  78. package/src/components/chrome/documentChromePolicy.test.ts +34 -0
  79. package/src/components/chrome/documentChromePolicy.ts +15 -0
  80. package/src/components/chrome/index.ts +4 -0
  81. package/src/components/chrome/workspaceTabTypes.ts +2 -0
  82. package/src/components/common/buttons/Button.tsx +60 -10
  83. package/src/components/common/buttons/ChoiceChip.tsx +2 -2
  84. package/src/components/common/buttons/IconButton.tsx +26 -0
  85. package/src/components/common/buttons/SegmentedControl.tsx +23 -7
  86. package/src/components/common/canvas/CanvasElementFrame.tsx +37 -28
  87. package/src/components/common/canvas/canvasGeometry.test.ts +4 -5
  88. package/src/components/common/canvas/canvasGeometry.ts +1 -4
  89. package/src/components/common/canvas/useCanvasDragResize.test.tsx +10 -10
  90. package/src/components/common/canvas/useCanvasDragResize.ts +1 -4
  91. package/src/components/common/cards/OpenReviewCard.tsx +6 -6
  92. package/src/components/common/chat/ChatBox.test.tsx +9 -1
  93. package/src/components/common/chat/ChatBox.tsx +3 -4
  94. package/src/components/common/chat/ChatMarkdown.tsx +1 -1
  95. package/src/components/common/chat/ChatModelMenu.tsx +1 -1
  96. package/src/components/common/chat/ChatThinkingIndicator.tsx +1 -1
  97. package/src/components/common/chat/ChatThread.tsx +2 -1
  98. package/src/components/common/chat/ChatToolRow.tsx +2 -2
  99. package/src/components/common/chat/ChatUserBubble.tsx +1 -1
  100. package/src/components/common/connections/ConnectionSetup.tsx +6 -6
  101. package/src/components/common/containers/AppFrame.test.tsx +37 -36
  102. package/src/components/common/containers/AppFrame.tsx +15 -0
  103. package/src/components/common/containers/AppHeader.tsx +6 -3
  104. package/src/components/common/containers/SurfacePanel.tsx +1 -0
  105. package/src/components/common/containers/useOpacityPresence.ts +10 -15
  106. package/src/components/common/context/ContextSelector.tsx +10 -10
  107. package/src/components/common/desk/CreationDesk.tsx +23 -11
  108. package/src/components/common/desk/DailyBrief.tsx +18 -7
  109. package/src/components/common/desk/DeskCard.tsx +11 -6
  110. package/src/components/common/dropdown/MenuButtonDropdown.tsx +58 -6
  111. package/src/components/common/dropdown/MenuDropdownItem.tsx +23 -3
  112. package/src/components/common/dropdown/MenuPanel.tsx +8 -8
  113. package/src/components/common/dropdown/SelectMenu.tsx +8 -3
  114. package/src/components/common/dropdown/menuTypes.ts +2 -1
  115. package/src/components/common/evidence/StructuredEvidenceView.tsx +9 -5
  116. package/src/components/common/feedback/Badge.tsx +19 -5
  117. package/src/components/common/feedback/CapabilityPills.tsx +1 -1
  118. package/src/components/common/feedback/InfoHint.tsx +2 -2
  119. package/src/components/common/feedback/PlatformChip.tsx +9 -9
  120. package/src/components/common/feedback/QuietPill.tsx +5 -8
  121. package/src/components/common/feedback/WorkProgressPanel.tsx +14 -14
  122. package/src/components/common/files/FileTable.tsx +8 -2
  123. package/src/components/common/inputs/Checkbox.tsx +1 -1
  124. package/src/components/common/inputs/EditableSecretField.tsx +1 -3
  125. package/src/components/common/inputs/InlineComposer.tsx +2 -2
  126. package/src/components/common/inputs/PaletteDropdown.tsx +33 -23
  127. package/src/components/common/inputs/SurfacePalettePicker.tsx +1 -1
  128. package/src/components/common/inputs/ToggleSwitch.tsx +2 -2
  129. package/src/components/common/inputs/WorkspacePicker.tsx +3 -3
  130. package/src/components/common/lists/listRowStyles.ts +4 -2
  131. package/src/components/common/lists/quiet-ledger/index.ts +1 -4
  132. package/src/components/common/lists/reorderable/DragHandle.tsx +1 -1
  133. package/src/components/common/lists/reorderable/ReorderableSections.tsx +2 -1
  134. package/src/components/common/media/ImageReferencePicker.tsx +22 -14
  135. package/src/components/common/narrative/NarrativeMention.tsx +15 -9
  136. package/src/components/common/navigation/NavigationCardRow.tsx +2 -2
  137. package/src/components/common/navigation/UnderlineTabs.tsx +1 -0
  138. package/src/components/common/overlays/Modal.tsx +52 -3
  139. package/src/components/common/overlays/ObjectActionStrip.tsx +2 -2
  140. package/src/components/common/people/AutoUpdateReviewList.tsx +2 -2
  141. package/src/components/common/people/EntityList.tsx +7 -3
  142. package/src/components/common/people/EntityPortrait.tsx +6 -1
  143. package/src/components/common/people/LinkedDossierList.tsx +3 -1
  144. package/src/components/common/people/RelationshipMap.tsx +3 -9
  145. package/src/components/common/research/EvidenceDossier.tsx +24 -20
  146. package/src/components/common/tiles/CatalogCard.tsx +1 -1
  147. package/src/components/credentials/CredentialsPanel.tsx +2 -6
  148. package/src/components/data/DataChart.tsx +119 -94
  149. package/src/components/data/dataTable.ts +4 -1
  150. package/src/components/editor/DocumentAppChrome.tsx +172 -0
  151. package/src/components/editor/EditorCommentPromptDialog.tsx +1 -1
  152. package/src/components/editor/EditorLinkPromptDialog.tsx +1 -1
  153. package/src/components/print-design/PrintDesignPanel.test.tsx +8 -6
  154. package/src/components/print-design/PrintDesignPanel.tsx +18 -25
  155. package/src/components/proofing/PagedProofDialog.tsx +17 -4
  156. package/src/editor/EditorViewModeToggle.tsx +6 -2
  157. package/src/editor/index.ts +6 -0
  158. package/src/theme/ThemeProvider.tsx +5 -2
  159. package/src/theme/appAccents.test.ts +51 -0
  160. package/src/theme/appAccents.ts +151 -88
  161. package/src/theme/appIdentityCss.mjs +256 -0
  162. package/src/theme/appIdentityCss.ts +256 -0
  163. package/src/theme/composePlatformTheme.test.ts +43 -14
  164. package/src/theme/platformFont.d.mts +2 -2
  165. package/src/theme/platformFont.mjs +4 -3
  166. package/src/theme/reportsShellChromeSelectors.ts +14 -132
  167. package/src/theme/surfaceCss.mjs +37 -0
  168. package/src/theme/surfaceCss.ts +37 -0
  169. package/src/theme/surfacePalettes.ts +120 -79
  170. package/src/theme/surfaceRoleSelectors.ts +135 -71
  171. package/src/theme/themes/dark.ts +44 -43
  172. package/src/theme/themes/light.ts +40 -38
  173. package/src/theme/themes/palette.ts +32 -30
  174. package/src/theme/themes/shared.ts +17 -17
  175. package/src/theme/utils/GlobalStyles.ts +10 -6
  176. package/src/theme/utils/appFrameDocumentStyles.mjs +6 -1
  177. package/src/theme/utils/cssVariables.ts +169 -0
  178. package/src/writing/DraftAssistantDialog.tsx +85 -85
  179. package/src/writing/WritingStyleManager.tsx +6 -3
  180. package/src/writing/draftTextWithAgent.ts +47 -50
  181. package/src/writing/styleStore.ts +4 -3
  182. package/src/writing/writingStyle.test.ts +8 -2
  183. package/src/writing/writingStyle.ts +19 -8
@@ -25,11 +25,12 @@ const spin = keyframes`
25
25
  `
26
26
 
27
27
  const selectedCss = css`
28
- background: var(--platform-colors-surface-hover);
28
+ background: var(--platform-colors-surface);
29
29
  border-color: var(
30
30
  --platform-colors-border-strong,
31
31
  var(--platform-colors-border)
32
32
  );
33
+ color: var(--platform-colors-text);
33
34
  `
34
35
 
35
36
  const textSelectedCss = css`
@@ -59,17 +60,33 @@ const variantStyles: Record<
59
60
  color: var(--platform-colors-text);
60
61
 
61
62
  &:hover:not(:disabled) {
62
- background: var(--platform-colors-surface-hover);
63
+ border-color: var(--platform-colors-border-strong);
64
+ background: var(--platform-colors-surface);
63
65
  }
64
66
  `,
65
67
  primary: css`
66
- background: var(--platform-colors-accent);
67
- border-color: var(--platform-colors-accent);
68
- color: var(--platform-colors-text-inverse);
68
+ background: var(
69
+ --app-primary-fill,
70
+ var(--app-acc, var(--platform-colors-text))
71
+ );
72
+ border-color: var(
73
+ --app-primary-fill,
74
+ var(--app-acc, var(--platform-colors-text))
75
+ );
76
+ color: var(
77
+ --platform-colors-text-on-accent,
78
+ var(--platform-colors-text-inverse)
79
+ );
69
80
 
70
81
  &:hover:not(:disabled) {
71
- background: var(--platform-colors-accent-hover);
72
- border-color: var(--platform-colors-accent-hover);
82
+ background: var(
83
+ --app-block,
84
+ var(--app-text, var(--platform-colors-accent-hover))
85
+ );
86
+ border-color: var(
87
+ --app-block,
88
+ var(--app-text, var(--platform-colors-accent-hover))
89
+ );
73
90
  }
74
91
  `,
75
92
  danger: css`
@@ -160,8 +177,8 @@ const StyledButton = styled.button<{
160
177
  gap: 6px;
161
178
  width: ${({ $fullWidth }) => ($fullWidth ? '100%' : 'fit-content')};
162
179
  border: 1px solid transparent;
163
- border-radius: var(--platform-radius-sm, 6px);
164
- font-size: var(--platform-typography);
180
+ border-radius: var(--platform-radius-sm, 0);
181
+ font-size: var(--platform-typography-font-size-base);
165
182
  line-height: 1;
166
183
  white-space: nowrap;
167
184
  cursor: pointer;
@@ -197,7 +214,40 @@ const StyledButton = styled.button<{
197
214
  &:disabled {
198
215
  cursor: ${({ $loading }) => ($loading ? 'wait' : 'not-allowed')};
199
216
  opacity: ${({ $loading, $variant }) =>
200
- $loading || $variant === 'tile' ? 1 : 0.45};
217
+ $loading || $variant === 'tile' || $variant === 'primary' ? 1 : 0.45};
218
+ ${({ $variant, $loading }) =>
219
+ $variant === 'primary' && !$loading
220
+ ? css`
221
+ border-color: var(--pure-disabled-primary, #b7b2a8);
222
+ background: var(--pure-disabled-primary, #b7b2a8);
223
+ color: var(--platform-colors-text-inverse);
224
+ `
225
+ : ''}
226
+ }
227
+
228
+ &[aria-label]::after {
229
+ position: absolute;
230
+ top: calc(100% + 8px);
231
+ left: 50%;
232
+ z-index: var(--platform-z-index-zi-app-menus, 40);
233
+ padding: 6px 8px;
234
+ background: var(--platform-colors-text, #1c1a17);
235
+ color: var(--platform-colors-bg, #fffdf8);
236
+ content: attr(aria-label);
237
+ font-family: var(--platform-typography-font-family);
238
+ font-size: 12px;
239
+ font-weight: 500;
240
+ line-height: 1;
241
+ opacity: 0;
242
+ pointer-events: none;
243
+ transform: translateX(-50%);
244
+ transition: opacity 0.12s ease 0.2s;
245
+ white-space: nowrap;
246
+ }
247
+
248
+ &[aria-label]:hover:not(:disabled)::after,
249
+ &[aria-label]:focus-visible:not(:disabled)::after {
250
+ opacity: 1;
201
251
  }
202
252
  `
203
253
 
@@ -16,7 +16,7 @@ const StyledChip = styled.button<{ $active?: boolean }>`
16
16
  $active
17
17
  ? 'var(--platform-colors-border-strong, var(--platform-colors-border))'
18
18
  : 'var(--platform-colors-border)'};
19
- border-radius: var(--platform-radius-full);
19
+ border-radius: var(--platform-radius-sm);
20
20
  background: ${({ $active }) =>
21
21
  $active
22
22
  ? 'var(--platform-colors-surface-hover)'
@@ -57,7 +57,7 @@ const StyledChip = styled.button<{ $active?: boolean }>`
57
57
 
58
58
  //#endregion
59
59
 
60
- /** Pill filter toggle — wrapping rows of selectable chips (see also SegmentedControl). */
60
+ /** Compact filter toggle — wrapping rows of selectable chips (see also SegmentedControl). */
61
61
  export const ChoiceChip = forwardRef<HTMLButtonElement, ChoiceChipProps>(
62
62
  function ChoiceChip({ active = false, type = 'button', ...rest }, ref) {
63
63
  return (
@@ -21,6 +21,7 @@ const StyledIconButton = styled.button<{
21
21
  $size: IconButtonSize
22
22
  $variant: IconButtonVariant
23
23
  }>`
24
+ position: relative;
24
25
  display: grid;
25
26
  place-items: center;
26
27
  width: ${({ $size }) => sizeStyles[$size].width};
@@ -57,6 +58,31 @@ const StyledIconButton = styled.button<{
57
58
  opacity: 0.45;
58
59
  cursor: not-allowed;
59
60
  }
61
+
62
+ &[aria-label]::after {
63
+ position: absolute;
64
+ top: calc(100% + 8px);
65
+ left: 50%;
66
+ z-index: var(--platform-z-index-zi-app-menus, 40);
67
+ padding: 6px 8px;
68
+ background: var(--platform-colors-text, #1c1a17);
69
+ color: var(--platform-colors-bg, #fffdf8);
70
+ content: attr(aria-label);
71
+ font-family: var(--platform-typography-font-family);
72
+ font-size: 12px;
73
+ font-weight: 500;
74
+ line-height: 1;
75
+ opacity: 0;
76
+ pointer-events: none;
77
+ transform: translateX(-50%);
78
+ transition: opacity 0.12s ease 0.2s;
79
+ white-space: nowrap;
80
+ }
81
+
82
+ &[aria-label]:hover:not(:disabled)::after,
83
+ &[aria-label]:focus-visible:not(:disabled)::after {
84
+ opacity: 1;
85
+ }
60
86
  `
61
87
 
62
88
  export const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
@@ -16,28 +16,44 @@ export interface SegmentedControlProps<T extends string> {
16
16
 
17
17
  const StyledGroup = styled.div`
18
18
  display: inline-flex;
19
- gap: var(--platform-spacing-2xs, 4px);
20
- padding: var(--platform-spacing-2xs, 4px);
19
+ gap: 0;
20
+ padding: 0;
21
21
  border: 1px solid var(--platform-colors-border);
22
- border-radius: var(--platform-radius-lg);
23
- background: var(--platform-colors-surface-active);
22
+ border-radius: var(--platform-radius-sm);
23
+ background: var(--platform-colors-surface);
24
24
  `
25
25
 
26
26
  const StyledSegment = styled.button<{ $active: boolean }>`
27
27
  min-height: 30px;
28
28
  padding: 0 var(--platform-spacing-sm);
29
29
  border: 0;
30
- border-radius: var(--platform-radius-md);
30
+ border-left: 1px solid var(--platform-colors-border);
31
+ border-radius: 0;
31
32
  background: ${({ $active }) =>
32
- $active ? 'var(--platform-colors-surface)' : 'transparent'};
33
+ $active ? 'var(--platform-colors-text)' : 'transparent'};
33
34
  color: ${({ $active }) =>
34
35
  $active
35
- ? 'var(--platform-colors-text)'
36
+ ? 'var(--platform-colors-text-inverse)'
36
37
  : 'var(--platform-colors-text-secondary)'};
37
38
  font: inherit;
38
39
  font-size: var(--platform-typography-font-size-sm);
39
40
  font-weight: var(--platform-typography-font-weight-bold);
40
41
  cursor: pointer;
42
+
43
+ &:first-child {
44
+ border-left: 0;
45
+ }
46
+
47
+ &:hover:not(:disabled) {
48
+ background: ${({ $active }) =>
49
+ $active
50
+ ? 'var(--platform-colors-text)'
51
+ : 'var(--platform-colors-surface-hover)'};
52
+ color: ${({ $active }) =>
53
+ $active
54
+ ? 'var(--platform-colors-text-inverse)'
55
+ : 'var(--platform-colors-text)'};
56
+ }
41
57
  `
42
58
 
43
59
  //#endregion
@@ -29,17 +29,17 @@ const Frame = styled.div<{
29
29
  border: ${({ $active }) => ($active ? '2px' : '1.5px')} solid
30
30
  ${({ $active, $readOnly }) =>
31
31
  $active
32
- ? 'color-mix(in srgb, var(--platform-color-accent, #3b6ff5) 82%, white)'
32
+ ? 'color-mix(in srgb, var(--platform-colors-accent, #1c1a17) 82%, white)'
33
33
  : $readOnly
34
- ? 'rgb(127 127 127 / 42%)'
35
- : 'rgb(127 127 127 / 58%)'};
34
+ ? 'color-mix(in srgb, var(--platform-colors-border-strong, #bdb8ad) 72%, transparent)'
35
+ : 'color-mix(in srgb, var(--platform-colors-border-strong, #bdb8ad) 88%, transparent)'};
36
36
  background: ${({ $active }) =>
37
37
  $active
38
- ? 'color-mix(in srgb, var(--platform-color-accent, #3b6ff5) 8%, transparent)'
38
+ ? 'color-mix(in srgb, var(--platform-colors-accent, #1c1a17) 8%, transparent)'
39
39
  : 'transparent'};
40
40
  box-shadow: ${({ $active }) =>
41
41
  $active
42
- ? '0 0 0 2px color-mix(in srgb, var(--platform-color-accent, #3b6ff5) 22%, transparent), 0 8px 22px rgb(0 0 0 / 16%)'
42
+ ? '0 0 0 2px color-mix(in srgb, var(--platform-colors-accent, #1c1a17) 22%, transparent), 0 8px 22px rgb(0 0 0 / 16%)'
43
43
  : '0 0 0 1px rgb(255 255 255 / 42%)'};
44
44
  opacity: ${({ $disabled }) => ($disabled ? 0.55 : 1)};
45
45
  pointer-events: ${({ $disabled }) => ($disabled ? 'none' : 'auto')};
@@ -48,8 +48,8 @@ const Frame = styled.div<{
48
48
  border-style: solid;
49
49
  border-color: ${({ $readOnly }) =>
50
50
  $readOnly
51
- ? 'rgb(127 127 127 / 60%)'
52
- : 'color-mix(in srgb, var(--platform-color-accent, #3b6ff5) 68%, white)'};
51
+ ? 'color-mix(in srgb, var(--platform-colors-border-strong, #bdb8ad) 92%, transparent)'
52
+ : 'color-mix(in srgb, var(--platform-colors-accent, #1c1a17) 68%, white)'};
53
53
  }
54
54
  `
55
55
 
@@ -60,10 +60,15 @@ const Label = styled.div`
60
60
  max-width: min(220px, 100%);
61
61
  overflow: hidden;
62
62
  padding: 3px 7px;
63
- border-radius: 4px 4px 0 0;
64
- background: color-mix(in srgb, var(--platform-color-surface, #ffffff) 96%, transparent);
63
+ border-radius: var(--platform-radius-sm, 0px) var(--platform-radius-sm, 0px) 0
64
+ 0;
65
+ background: color-mix(
66
+ in srgb,
67
+ var(--platform-colors-surface, #ffffff) 96%,
68
+ transparent
69
+ );
65
70
  box-shadow: 0 1px 4px rgb(0 0 0 / 14%);
66
- color: var(--platform-color-text, #1f2430);
71
+ color: var(--platform-colors-text, #1c1a17);
67
72
  font-size: 12px;
68
73
  font-weight: 760;
69
74
  line-height: 1.2;
@@ -77,9 +82,9 @@ const Handle = styled.button<{ $handle: CanvasResizeHandle }>`
77
82
  height: 14px;
78
83
  padding: 0;
79
84
  border: 2px solid currentColor;
80
- border-radius: 3px;
81
- background: var(--platform-color-surface, #ffffff);
82
- color: var(--platform-color-accent, #3b6ff5);
85
+ border-radius: var(--platform-radius-sm, 0px);
86
+ background: var(--platform-colors-surface, #ffffff);
87
+ color: var(--platform-colors-accent, #1c1a17);
83
88
  box-shadow: 0 1px 5px rgb(0 0 0 / 20%);
84
89
  ${({ $handle }) => HANDLE_POSITIONS[$handle]}
85
90
  `
@@ -120,9 +125,11 @@ export function CanvasElementFrame({
120
125
  onFrameKeyDown,
121
126
  onResizePointerDown,
122
127
  }: CanvasElementFrameProps): ReactElement {
123
- const resolvedAriaLabel = ariaLabel ?? `${label ?? 'Canvas element'}${
124
- readOnly ? ', read-only' : ', selectable'
125
- }${selected ? ', selected' : ''}`
128
+ const resolvedAriaLabel =
129
+ ariaLabel ??
130
+ `${label ?? 'Canvas element'}${readOnly ? ', read-only' : ', selectable'}${
131
+ selected ? ', selected' : ''
132
+ }`
126
133
  return (
127
134
  <Frame
128
135
  data-canvas-element-frame="true"
@@ -164,18 +171,20 @@ export function CanvasElementFrame({
164
171
  {label ? <Label>{label}</Label> : null}
165
172
  {children}
166
173
  {selected && onResizePointerDown && !readOnly
167
- ? (Object.keys(HANDLE_POSITIONS) as CanvasResizeHandle[]).map(handle => (
168
- <Handle
169
- key={handle}
170
- type="button"
171
- aria-label={`Resize ${label ?? 'element'} ${handle}`}
172
- $handle={handle}
173
- onPointerDown={event => {
174
- event.stopPropagation()
175
- onResizePointerDown(handle, event)
176
- }}
177
- />
178
- ))
174
+ ? (Object.keys(HANDLE_POSITIONS) as CanvasResizeHandle[]).map(
175
+ handle => (
176
+ <Handle
177
+ key={handle}
178
+ type="button"
179
+ aria-label={`Resize ${label ?? 'element'} ${handle}`}
180
+ $handle={handle}
181
+ onPointerDown={event => {
182
+ event.stopPropagation()
183
+ onResizePointerDown(handle, event)
184
+ }}
185
+ />
186
+ ),
187
+ )
179
188
  : null}
180
189
  </Frame>
181
190
  )
@@ -33,11 +33,10 @@ describe('canvasGeometry', () => {
33
33
 
34
34
  it('clamps rectangles to slide bounds', () => {
35
35
  expect(
36
- clampCanvasRect(
37
- { x: -80, y: 700, w: 200, h: 100 },
38
- canvas,
39
- { w: 80, h: 40 },
40
- ),
36
+ clampCanvasRect({ x: -80, y: 700, w: 200, h: 100 }, canvas, {
37
+ w: 80,
38
+ h: 40,
39
+ }),
41
40
  ).toEqual({ x: 0, y: 620, w: 200, h: 100 })
42
41
  })
43
42
 
@@ -117,10 +117,7 @@ export function resizeCanvasRect(input: {
117
117
  )
118
118
  }
119
119
 
120
- export function snapCanvasRect(
121
- rect: CanvasRect,
122
- gridStep = 0,
123
- ): CanvasRect {
120
+ export function snapCanvasRect(rect: CanvasRect, gridStep = 0): CanvasRect {
124
121
  if (gridStep <= 0) return rect
125
122
  const snap = (value: number): number =>
126
123
  Math.round(value / gridStep) * gridStep
@@ -8,8 +8,9 @@ const canvas: CanvasSize = { w: 1280, h: 720 }
8
8
  const viewport: ViewportRect = { left: 0, top: 0, width: 640, height: 360 }
9
9
  const frame: CanvasRect = { x: 120, y: 80, w: 240, h: 120 }
10
10
 
11
- ;(globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean })
12
- .IS_REACT_ACT_ENVIRONMENT = true
11
+ ;(
12
+ globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }
13
+ ).IS_REACT_ACT_ENVIRONMENT = true
13
14
 
14
15
  let root: Root | null = null
15
16
  let host: HTMLDivElement | null = null
@@ -68,10 +69,12 @@ function Harness({
68
69
  )
69
70
  }
70
71
 
71
- function mountHarness(input: {
72
- onPreview?: (rect: CanvasRect) => void
73
- onCommit?: (rect: CanvasRect) => void
74
- } = {}): HTMLButtonElement {
72
+ function mountHarness(
73
+ input: {
74
+ onPreview?: (rect: CanvasRect) => void
75
+ onCommit?: (rect: CanvasRect) => void
76
+ } = {},
77
+ ): HTMLButtonElement {
75
78
  host = document.createElement('div')
76
79
  document.body.append(host)
77
80
  root = createRoot(host)
@@ -141,10 +144,7 @@ describe('useCanvasDragResize', () => {
141
144
  dispatchPointer(window, 'pointercancel', { clientX: 70, clientY: 60 })
142
145
  })
143
146
 
144
- expect(previews).toEqual([
145
- { x: 180, y: 120, w: 240, h: 120 },
146
- frame,
147
- ])
147
+ expect(previews).toEqual([{ x: 180, y: 120, w: 240, h: 120 }, frame])
148
148
  expect(commits).toEqual([])
149
149
  expect(button.dataset.dragKind).toBe('none')
150
150
  expect(button.dataset.suppressClick).toBe('false')
@@ -29,10 +29,7 @@ export interface UseCanvasDragResizeOptions {
29
29
  export interface UseCanvasDragResizeResult {
30
30
  dragState: CanvasDragState | null
31
31
  shouldSuppressClick: boolean
32
- beginMove: (
33
- frame: CanvasRect,
34
- event: ReactPointerEvent<HTMLElement>,
35
- ) => void
32
+ beginMove: (frame: CanvasRect, event: ReactPointerEvent<HTMLElement>) => void
36
33
  beginResize: (
37
34
  frame: CanvasRect,
38
35
  handle: CanvasResizeHandle,
@@ -32,9 +32,9 @@ const Card = styled.article<{
32
32
  border: 1px solid
33
33
  ${({ $selected }) =>
34
34
  $selected
35
- ? 'color-mix(in srgb, var(--platform-colors-focus, #0f766e) 62%, var(--platform-colors-border, #d8dfde))'
35
+ ? 'color-mix(in srgb, var(--platform-colors-focus, var(--platform-colors-accent, #1c1a17)) 62%, var(--platform-colors-border, #e7e4dd))'
36
36
  : 'var(--platform-colors-border, #d8dfde)'};
37
- border-radius: ${({ $density }) => ($density === 'compact' ? '6px' : '8px')};
37
+ border-radius: var(--platform-radius-sm);
38
38
  padding: ${({ $density }) =>
39
39
  $density === 'compact' ? '10px 12px' : '18px 20px'};
40
40
  color: var(--platform-colors-text, #20272b);
@@ -55,7 +55,7 @@ const Card = styled.article<{
55
55
  $density === 'compact' ? '1.38' : '1.48'};
56
56
  box-shadow: ${({ $selected }) =>
57
57
  $selected
58
- ? '0 0 0 3px color-mix(in srgb, var(--platform-colors-focus, #0f766e) 10%, transparent)'
58
+ ? '0 0 0 3px color-mix(in srgb, var(--platform-colors-focus, var(--platform-colors-accent, #1c1a17)) 10%, transparent)'
59
59
  : 'none'};
60
60
  `
61
61
 
@@ -66,11 +66,11 @@ const IconSlot = styled.div`
66
66
  width: 34px;
67
67
  height: 34px;
68
68
  margin-top: 1px;
69
- border-radius: 999px;
70
- color: var(--platform-colors-focus, #0f766e);
69
+ border-radius: var(--platform-radius-sm);
70
+ color: var(--platform-colors-focus, var(--platform-colors-accent, #1c1a17));
71
71
  background: color-mix(
72
72
  in srgb,
73
- var(--platform-colors-focus, #0f766e) 10%,
73
+ var(--platform-colors-focus, var(--platform-colors-accent, #1c1a17)) 10%,
74
74
  var(--platform-colors-surface, #fff)
75
75
  );
76
76
  `
@@ -1,6 +1,14 @@
1
1
  import { act } from 'react'
2
2
  import { createRoot, type Root } from 'react-dom/client'
3
- import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
3
+ import {
4
+ afterEach,
5
+ beforeAll,
6
+ beforeEach,
7
+ describe,
8
+ expect,
9
+ it,
10
+ vi,
11
+ } from 'vitest'
4
12
  import { ChatBox } from './ChatBox.js'
5
13
 
6
14
  type ReactActGlobal = typeof globalThis & {
@@ -50,8 +50,7 @@ export const ChatBox = forwardRef<HTMLTextAreaElement, ChatBoxProps>(
50
50
  )
51
51
 
52
52
  const textDisabled = disabled || inputDisabled
53
- const canSend =
54
- !disabled && !sendDisabled && value.trim().length > 0
53
+ const canSend = !disabled && !sendDisabled && value.trim().length > 0
55
54
  const showStop = sending && onStop
56
55
 
57
56
  return (
@@ -107,7 +106,7 @@ const EditorWrapper = styled.div`
107
106
  flex-direction: column;
108
107
  background: var(--platform-colors-bg);
109
108
  border: 1px solid var(--platform-colors-border);
110
- border-radius: 8px;
109
+ border-radius: var(--platform-radius-sm);
111
110
  overflow: hidden;
112
111
  transition: border-color 0.15s;
113
112
 
@@ -166,7 +165,7 @@ const SendButton = styled.button`
166
165
  height: 28px;
167
166
  padding: 0;
168
167
  border: none;
169
- border-radius: 6px;
168
+ border-radius: var(--platform-radius-sm);
170
169
  background: transparent;
171
170
  color: var(--platform-colors-accent);
172
171
  cursor: pointer;
@@ -80,7 +80,7 @@ const StyledMarkdown = styled.div<{ $streaming?: boolean }>`
80
80
 
81
81
  pre {
82
82
  background: var(--platform-colors-surface-raised);
83
- border-radius: 4px;
83
+ border-radius: var(--platform-radius-sm, 0px);
84
84
  padding: 8px 10px;
85
85
  overflow-x: auto;
86
86
  }
@@ -43,7 +43,7 @@ const StyledTrigger = styled.button`
43
43
  max-width: 180px;
44
44
  padding: 2px 6px;
45
45
  border: none;
46
- border-radius: 6px;
46
+ border-radius: var(--platform-radius-sm);
47
47
  background: transparent;
48
48
  color: var(--platform-colors-text-secondary);
49
49
  font-size: 11px;
@@ -37,7 +37,7 @@ const Dots = styled.span`
37
37
  span {
38
38
  animation: ${dot} 1.2s ease-in-out infinite;
39
39
  background: var(--platform-colors-text-disabled);
40
- border-radius: 50%;
40
+ border-radius: 0;
41
41
  display: inline-block;
42
42
  height: 3px;
43
43
  margin-left: 3px;
@@ -47,7 +47,8 @@ const Container = styled.div`
47
47
  gap: 12px;
48
48
  min-height: 0;
49
49
  overflow-y: auto;
50
- padding: calc(16px + var(--platform-agent-thread-header-height, 0px)) 24px 16px;
50
+ padding: calc(16px + var(--platform-agent-thread-header-height, 0px)) 24px
51
+ 16px;
51
52
  `
52
53
 
53
54
  export const ChatThreadEmpty = styled.div`
@@ -92,7 +92,7 @@ const Ts = styled.span`
92
92
 
93
93
  const Plain = styled.div`
94
94
  align-self: flex-start;
95
- border-radius: 6px;
95
+ border-radius: var(--platform-radius-sm);
96
96
  width: 100%;
97
97
  padding: 5px 10px;
98
98
 
@@ -103,7 +103,7 @@ const Plain = styled.div`
103
103
 
104
104
  const Expandable = styled.div`
105
105
  align-self: flex-start;
106
- border-radius: 6px;
106
+ border-radius: var(--platform-radius-sm);
107
107
  width: 100%;
108
108
 
109
109
  &:hover {
@@ -30,7 +30,7 @@ const Root = styled.div`
30
30
  const Bubble = styled.div`
31
31
  background: var(--platform-colors-accent-muted);
32
32
  border: 1px solid var(--platform-colors-border);
33
- border-radius: 12px 12px 2px 12px;
33
+ border-radius: var(--platform-radius-sm);
34
34
  color: var(--platform-colors-text);
35
35
  font-size: 13px;
36
36
  line-height: 1.5;
@@ -145,7 +145,7 @@ const OptionButton = styled.button<{
145
145
  $selected
146
146
  ? 'var(--connection-accent, var(--platform-colors-accent))'
147
147
  : 'var(--connection-border, var(--platform-colors-border))'};
148
- border-radius: 8px;
148
+ border-radius: var(--platform-radius-sm, 0px);
149
149
  background: ${({ $selected }) =>
150
150
  $selected
151
151
  ? 'rgb(from var(--connection-accent, var(--platform-colors-accent)) r g b / 8%)'
@@ -189,7 +189,7 @@ const OptionBadge = styled.span<{ $tone: ConnectionOptionTone }>`
189
189
  flex: 0 0 auto;
190
190
  padding: 3px 8px;
191
191
  border: 1px solid var(--connection-border, var(--platform-colors-border));
192
- border-radius: 999px;
192
+ border-radius: var(--platform-radius-sm);
193
193
  color: ${({ $tone }) =>
194
194
  $tone === 'connected'
195
195
  ? 'var(--platform-colors-semantic-green-text, #3f6d4c)'
@@ -220,7 +220,7 @@ const SavedCardRoot = styled.div`
220
220
  min-width: 0;
221
221
  padding: 16px;
222
222
  border: 1px solid var(--connection-border, var(--platform-colors-border));
223
- border-radius: 8px;
223
+ border-radius: var(--platform-radius-sm, 0px);
224
224
  background: var(--connection-surface, var(--platform-colors-surface));
225
225
  `
226
226
 
@@ -264,7 +264,7 @@ export const ConnectionPanel = styled.div`
264
264
  min-width: 0;
265
265
  padding: 16px;
266
266
  border: 1px solid var(--connection-border, var(--platform-colors-border));
267
- border-radius: 8px;
267
+ border-radius: var(--platform-radius-md, 0px);
268
268
  background: var(--connection-surface, var(--platform-colors-surface));
269
269
  box-shadow: var(--platform-shadow-sm, 0 1px 2px rgb(31 38 52 / 6%));
270
270
  `
@@ -313,7 +313,7 @@ const TestResultRoot = styled.div<{ $tone: ConnectionTestTone }>`
313
313
  : $tone === 'error'
314
314
  ? 'var(--platform-colors-semantic-red-border, var(--connection-border, var(--platform-colors-border)))'
315
315
  : 'var(--connection-border, var(--platform-colors-border))'};
316
- border-radius: 8px;
316
+ border-radius: var(--platform-radius-sm, 0px);
317
317
  background: var(--connection-surface, var(--platform-colors-surface));
318
318
  `
319
319
 
@@ -381,7 +381,7 @@ const StepNumber = styled.span`
381
381
  width: 24px;
382
382
  height: 24px;
383
383
  border: 1px solid var(--connection-border, var(--platform-colors-border));
384
- border-radius: 999px;
384
+ border-radius: var(--platform-radius-sm);
385
385
  color: var(--connection-muted, var(--platform-colors-text-secondary));
386
386
  font-size: 12px;
387
387
  font-weight: 800;