Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@
"@sim/terminal-protocol": "workspace:*",
"@sim/utils": "workspace:*",
"@xterm/headless": "6.0.0",
"electron-updater": "6.8.9",
"electron-updater": "6.8.12",
"lru-cache": "11.5.3",
"micromatch": "4.0.8",
"safe-regex2": "5.1.2",
"tldts": "7.4.18",
"tldts": "7.4.19",
"pdf-lib": "1.17.1",
"@sim/auth-ui": "workspace:*"
},
Expand Down
2 changes: 1 addition & 1 deletion apps/docs/components/docs/mdx.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export function getMDXComponents(overrides: MDXComponents = {}): MDXComponents {
<code
{...props}
className={cn(
'rounded bg-[var(--docs-surface)] px-1 py-px font-mono font-normal [font-size:0.875em]',
'rounded bg-[var(--docs-surface)] px-1 py-px font-mono font-normal [font-size:0.875em] [font-variant-ligatures:none]',
className
)}
/>
Expand Down
5 changes: 4 additions & 1 deletion apps/docs/components/docs/sample-panels.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,13 @@ export function SamplePanels({
value={item.value}
label={item.label}
id={item.id ?? `${selectorId}-${item.value}`}
tabIndex={-1}
{...(presentation === 'select' ? { role: 'region', 'aria-labelledby': selectorId } : {})}
className='[&>div]:pt-0'
>
<CodeContent label={`${label}: ${item.label}`}>{item.panel}</CodeContent>
<CodeContent label={`${label}: ${item.label}`} tabIndex={0}>
{item.panel}
</CodeContent>
</Tab>
))}
</Tabs>
Expand Down
6 changes: 4 additions & 2 deletions apps/docs/components/ui/code-block.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ interface CodeBlockProps extends HTMLAttributes<HTMLElement> {
interface CodeContentProps {
children: ReactNode
label?: string
tabIndex?: number
}

export function CodeContent({ children, label = 'Code sample' }: CodeContentProps) {
export function CodeContent({ children, label = 'Code sample', tabIndex }: CodeContentProps) {
return (
<ScrollRegion
label={label}
className='focus-visible:-outline-offset-2 p-4 [&_code]:block [&_code]:bg-transparent [&_code]:p-0 [&_code]:font-normal [&_code]:text-docs-code [&_pre]:m-0 [&_pre]:w-max [&_pre]:min-w-full [&_pre]:bg-transparent! [&_pre]:p-0 [&_pre]:font-mono [&_pre]:text-docs-code'
tabIndex={tabIndex}
className='focus-visible:-outline-offset-2 p-4 [&_code]:block [&_code]:bg-transparent [&_code]:p-0 [&_code]:font-normal [&_code]:text-docs-code [&_pre]:m-0 [&_pre]:w-max [&_pre]:min-w-full [&_pre]:bg-transparent! [&_pre]:p-0 [&_pre]:font-mono [&_pre]:text-docs-code [&_pre]:[font-variant-ligatures:none]'
>
{children}
</ScrollRegion>
Expand Down
16 changes: 12 additions & 4 deletions apps/docs/components/ui/scroll-region.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,32 @@ interface ScrollRegionProps extends HTMLAttributes<HTMLDivElement> {
label: string
}

/** Keyboard scrolling is reachable only when this region has horizontal overflow. */
export function ScrollRegion({ label, className, children, ...props }: ScrollRegionProps) {
/** Keeps scrolling keyboard-accessible before hydration, then skips nonoverflowing regions unless opted in. */
export function ScrollRegion({
label,
className,
children,
tabIndex,
...props
}: ScrollRegionProps) {
const region = useRef<HTMLDivElement>(null)
useEffect(() => {
const element = region.current
if (!element) return
function updateFocusability() {
if (element) element.tabIndex = element.scrollWidth > element.clientWidth + 1 ? 0 : -1
if (element)
element.tabIndex = tabIndex ?? (element.scrollWidth > element.clientWidth + 1 ? 0 : -1)
}
const observer = new ResizeObserver(updateFocusability)
observer.observe(element)
if (element.firstElementChild) observer.observe(element.firstElementChild)
return () => observer.disconnect()
}, [])
}, [tabIndex])
return (
<div
{...props}
ref={region}
tabIndex={tabIndex ?? 0}
role='region'
aria-label={label}
className={cn(
Expand Down
2 changes: 2 additions & 0 deletions apps/docs/components/ui/tabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,7 @@ export function Tab({
id,
className,
children,
tabIndex = 0,
'aria-labelledby': labelledBy,
...props
}: TabProps) {
Expand All @@ -319,6 +320,7 @@ export function Tab({
<RadixTabs.Content
{...props}
forceMount
tabIndex={active ? tabIndex : -1}
value={value}
id={id ?? context?.panelIds.get(value) ?? `${context?.baseId}-${encodeURIComponent(value)}`}
aria-labelledby={labelledBy ?? `${context?.baseId}-${encodeURIComponent(value)}-trigger`}
Expand Down
35 changes: 8 additions & 27 deletions apps/docs/content/docs/files/editor.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,18 @@ import { Image } from '@/components/ui/image'

Open a Markdown document beside [Chat](/chat/files) or from **Files** to read or edit it. Ask Sim to create a document, or select **New file** in Files. Rich editing requires edit access and supported document size and syntax; files remain stored as Markdown.

<Image
src="/static/docs-captures/files-markdown.webp"
alt="A release brief open in the Markdown editor beside Chat, with a launch checklist, owner table, and highlighted JSON code block"
width={2400}
height={1200}
variant="overview"
/>

## Formatting text

Select text to open the formatting toolbar for bold, italic, strikethrough, inline code, and links. You can also type Markdown, such as `**bold**` and `*italic*`. A link's hover card lets you open, copy, edit, or remove it.

<Image
src="/static/docs-captures/files-formatting.webp"
alt="Selected text in the Markdown editor with the text style, bold, italic, link, and more formatting controls"
width={900}
height={340}
variant="detail"
background="architecture"
/>

| Action | Shortcut or Markdown |
| --- | --- |
| Bold | **Cmd/Ctrl + B** |
Expand All @@ -39,28 +38,10 @@ Type `/` at the start of a block or after whitespace to open the insertion menu.

Insert a table from the slash menu. Select a cell to open the table toolbar, then add or remove rows and columns, or delete the table. The header row stays in place; you can edit its text. Column resizing and merged cells are not supported.

<Image
src="/static/docs-captures/files-table.webp"
alt="A Markdown owner table with controls for adding a row, managing columns, and deleting the table"
width={1200}
height={460}
variant="detail"
background="architecture"
/>

## Code blocks

Fenced code blocks have syntax highlighting, a language picker, line wrapping, and a copy button. Hover over the block or focus a control to reveal its toolbar.

<Image
src="/static/docs-captures/files-code.webp"
alt="A highlighted JSON code block with language, line wrap, and copy controls"
width={1200}
height={400}
variant="detail"
background="architecture"
/>

Choose `mermaid` to render a diagram. Select **Show source** when you need to edit its definition.

## Images
Expand Down
1 change: 1 addition & 0 deletions apps/docs/lib/shiki-theme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -195,4 +195,5 @@ const simShikiDark = buildTheme('sim-dark', 'dark', DARK)
export const simShikiOptions = {
themes: { light: simShikiLight, dark: simShikiDark },
defaultColor: false,
tabindex: false,
} as const
132 changes: 128 additions & 4 deletions apps/docs/openapi-v2-workflows.json
Original file line number Diff line number Diff line change
Expand Up @@ -5275,6 +5275,20 @@
"application/json": {
"schema": {
"$ref": "#/components/schemas/PreviewWorkspaceForkResponse"
},
"examples": {
"example1": {
"summary": "Response example 1",
"value": {
"data": {
"previewFingerprint": "c7d158e8cbc5137a2d0a4fc37ddaeb51a3b9757485679a6ad82a7de3fdac4e3a",
"sourceWorkspaceId": "9f4c2a10-3b7e-4d58-8f6a-2c1d0e5b7a94",
"workflows": [],
"selectedResourceCount": 0,
"draftOnly": true
}
}
}
}
}
}
Expand Down Expand Up @@ -5466,6 +5480,25 @@
"application/json": {
"schema": {
"$ref": "#/components/schemas/PreviewWorkspacePushResponse"
},
"examples": {
"example1": {
"summary": "Response example 1",
"value": {
"data": {
"previewFingerprint": "c7d158e8cbc5137a2d0a4fc37ddaeb51a3b9757485679a6ad82a7de3fdac4e3a",
"sourceWorkspaceId": "e4f8d2b6-9a1c-4e3d-8b7f-5c0a2d9e6f13",
"targetWorkspaceId": "9f4c2a10-3b7e-4d58-8f6a-2c1d0e5b7a94",
"ready": true,
"workflows": [],
"unresolvedBindings": [],
"configuration": [],
"excludedTargets": [],
"triggerSlots": [],
"triggerUrlChanges": []
}
}
}
}
}
}
Expand Down Expand Up @@ -5658,6 +5691,25 @@
"application/json": {
"schema": {
"$ref": "#/components/schemas/PreviewWorkspacePullResponse"
},
"examples": {
"example1": {
"summary": "Response example 1",
"value": {
"data": {
"previewFingerprint": "c7d158e8cbc5137a2d0a4fc37ddaeb51a3b9757485679a6ad82a7de3fdac4e3a",
"sourceWorkspaceId": "9f4c2a10-3b7e-4d58-8f6a-2c1d0e5b7a94",
"targetWorkspaceId": "e4f8d2b6-9a1c-4e3d-8b7f-5c0a2d9e6f13",
"ready": true,
"workflows": [],
"unresolvedBindings": [],
"configuration": [],
"excludedTargets": [],
"triggerSlots": [],
"triggerUrlChanges": []
}
}
}
}
}
}
Expand Down Expand Up @@ -6716,6 +6768,22 @@
"application/json": {
"schema": {
"$ref": "#/components/schemas/PreviewWorkflowImportResponse"
},
"examples": {
"example1": {
"summary": "Response example 1",
"value": {
"data": {
"previewFingerprint": "c7d158e8cbc5137a2d0a4fc37ddaeb51a3b9757485679a6ad82a7de3fdac4e3a",
"ready": true,
"bindings": [],
"unresolvedBindings": [],
"configuration": [],
"unresolvedConfiguration": [],
"discovery": []
}
}
}
}
}
}
Expand Down Expand Up @@ -15566,7 +15634,18 @@
"required": ["data"],
"additionalProperties": false,
"title": "Preview workspace fork response",
"description": "Deployed source workflows, selected-copy count, and a preview fingerprint."
"description": "Deployed source workflows, selected-copy count, and a preview fingerprint.",
"examples": [
{
"data": {
"previewFingerprint": "c7d158e8cbc5137a2d0a4fc37ddaeb51a3b9757485679a6ad82a7de3fdac4e3a",
"sourceWorkspaceId": "9f4c2a10-3b7e-4d58-8f6a-2c1d0e5b7a94",
"workflows": [],
"selectedResourceCount": 0,
"draftOnly": true
}
}
]
},
"PreviewWorkspaceForkBody": {
"type": "object",
Expand Down Expand Up @@ -16446,7 +16525,23 @@
"required": ["data"],
"additionalProperties": false,
"title": "Preview workspace push response",
"description": "Current-to-other workflow actions, required choices, and preview fingerprint."
"description": "Current-to-other workflow actions, required choices, and preview fingerprint.",
"examples": [
{
"data": {
"previewFingerprint": "c7d158e8cbc5137a2d0a4fc37ddaeb51a3b9757485679a6ad82a7de3fdac4e3a",
"sourceWorkspaceId": "e4f8d2b6-9a1c-4e3d-8b7f-5c0a2d9e6f13",
"targetWorkspaceId": "9f4c2a10-3b7e-4d58-8f6a-2c1d0e5b7a94",
"ready": true,
"workflows": [],
"unresolvedBindings": [],
"configuration": [],
"excludedTargets": [],
"triggerSlots": [],
"triggerUrlChanges": []
}
}
]
},
"PreviewWorkspacePushBody": {
"type": "object",
Expand Down Expand Up @@ -16972,7 +17067,23 @@
"required": ["data"],
"additionalProperties": false,
"title": "Preview workspace pull response",
"description": "Other-to-current workflow actions, required choices, and preview fingerprint."
"description": "Other-to-current workflow actions, required choices, and preview fingerprint.",
"examples": [
{
"data": {
"previewFingerprint": "c7d158e8cbc5137a2d0a4fc37ddaeb51a3b9757485679a6ad82a7de3fdac4e3a",
"sourceWorkspaceId": "9f4c2a10-3b7e-4d58-8f6a-2c1d0e5b7a94",
"targetWorkspaceId": "e4f8d2b6-9a1c-4e3d-8b7f-5c0a2d9e6f13",
"ready": true,
"workflows": [],
"unresolvedBindings": [],
"configuration": [],
"excludedTargets": [],
"triggerSlots": [],
"triggerUrlChanges": []
}
}
]
},
"PreviewWorkspacePullBody": {
"type": "object",
Expand Down Expand Up @@ -18487,7 +18598,20 @@
"required": ["data"],
"additionalProperties": false,
"title": "Preview workflow import response",
"description": "Import readiness, unresolved bindings, and destination discovery instructions."
"description": "Import readiness, unresolved bindings, and destination discovery instructions.",
"examples": [
{
"data": {
"previewFingerprint": "c7d158e8cbc5137a2d0a4fc37ddaeb51a3b9757485679a6ad82a7de3fdac4e3a",
"ready": true,
"bindings": [],
"unresolvedBindings": [],
"configuration": [],
"unresolvedConfiguration": [],
"discovery": []
}
}
]
},
"ImportWorkflowRequest": {
"type": "object",
Expand Down
8 changes: 4 additions & 4 deletions apps/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@
"@sim/logger": "workspace:*",
"@sim/utils": "workspace:*",
"@sim/workflow-renderer": "workspace:*",
"@xyflow/react": "12.12.0",
"next": "16.4.1",
"@xyflow/react": "12.12.1",
"next": "16.4.5",
"next-themes": "^0.4.6",
"react": "19.2.4",
"react-dom": "19.2.4",
Expand All @@ -59,7 +59,7 @@
"server-only": "0.0.1",
"postgres": "3.4.9",
"remark-rehype": "11.1.2",
"hast-util-to-jsx-runtime": "2.3.6",
"hast-util-to-jsx-runtime": "2.3.7",
"clsx": "2.1.1",
"tailwind-merge": "3.7.0",
"mdast-util-gfm": "3.1.0",
Expand All @@ -80,7 +80,7 @@
"vitest": "^5.0.4",
"@modelcontextprotocol/client": "2.3.1",
"@types/mdast": "4.0.4",
"@types/mdx": "2.0.13",
"@types/mdx": "2.0.14",
"htmlparser2": "10.1.0",
"@types/hast": "3.0.5"
}
Expand Down
Loading
Loading