Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e784df7
refactor: migrate consumers to @workflowbuilder/ui and fix Base UI AP…
librowski-synergy Jun 24, 2026
092aa26
fix(sdk): stop publishing unresolvable ui dependency + leaked types
librowski-synergy Jun 25, 2026
e59aa7e
fix(sdk): finish overflow-ui migration for files main added after the…
Jul 30, 2026
4f139d5
fix(sdk): externalize @base-ui/react and @phosphor-icons/react from b…
Jul 30, 2026
f4d9934
fix(sdk): repoint dead modal CSS selectors at Base UI signal
Jul 30, 2026
7e7e61b
docs(changeset): clarify Base UI DOM changes and dependency shape
Jul 30, 2026
f9b2808
fix(sdk): declare layer order in module stylesheets using ui.component
Aug 10, 2026
778a79c
fix(ai-studio): pin react-is to the react 19 line for recharts
Aug 10, 2026
bd4dea3
docs(sdk): shorten the modal-backdrop suppression comment
Aug 10, 2026
ad8310d
fix(sdk): keep the modal dialog mounted so enter/exit transitions run
Aug 10, 2026
79862d1
build: bump @base-ui/react to the 1.7 line
Aug 10, 2026
c1bcc93
perf(sdk): stop bundling @workflowbuilder/ui CSS twice
Aug 10, 2026
0c6b4fd
docs: note that app builds consume the prebuilt packages/ui dist
Aug 10, 2026
59f8e88
docs(sdk): extend the archival banner over the UI-library swap and fi…
Aug 10, 2026
4ca8cea
docs(changeset): cover derived type shapes and the restored modal fade
Aug 10, 2026
98952fa
fix(deps): resolve app react from the catalog
Aug 10, 2026
6b4f666
fix(sdk): layer the xyflow stylesheet and drop its duplicate JS import
Aug 10, 2026
618571b
fix(sdk): declare a single top-level cascade layer in the stylesheet
Aug 11, 2026
9068813
fix(sdk): gate the modal portal out of server-side rendering
Aug 11, 2026
0205d63
fix(sdk): match the date-picker trigger override to the new markup
Aug 11, 2026
14e0c6e
docs(ui): align base-ui claims with the ^1.7.0 dependency
Aug 11, 2026
46e0305
docs(sdk): drop dead promises and add an npm path to the token guide
Aug 11, 2026
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
7 changes: 7 additions & 0 deletions .changeset/move-ui-library-in-repo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@workflowbuilder/sdk': minor
---

Consume the UI component library from the in-repo `@workflowbuilder/ui` (Base UI) instead of the published `@synergycodes/overflow-ui`.

The SDK previously bundled `@synergycodes/overflow-ui@1.0.0-beta.27` (built on MUI / Mantine / Emotion / Floating UI). It now bundles the in-repo `@workflowbuilder/ui@2.0.0`, rebuilt on [Base UI](https://base-ui.com/). `@base-ui/react` is now a regular dependency of the SDK (installed automatically, not bundled) rather than an inlined implementation detail. Bundled component visuals and interaction details change accordingly; the SDK's exported symbols are unchanged, but public types deriving from the UI library (`InputControlProps`, `TextAreaControlProps`) now build on `@workflowbuilder/ui` type shapes (picked keys unchanged), and the internal DOM structure and class names of all bundled UI changed (MUI Base + Mantine → Base UI) — styles or tests written against those internal class names may need updating. Modal open/close now runs its enter and exit fade transitions (previously the dialog appeared and disappeared instantly).
5 changes: 5 additions & 0 deletions .changeset/sdk-date-picker-trigger-height.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@workflowbuilder/sdk': patch
---

Date and datetime variable inputs regained their intended `2.5rem` trigger height and left-aligned text; the style override now matches the new DatePicker markup.
5 changes: 5 additions & 0 deletions .changeset/sdk-single-top-layer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@workflowbuilder/sdk': minor
---

The SDK stylesheet now declares a single top-level cascade layer: XYFlow's stylesheet and the SDK resets moved from the `ext-lib` / `reset` layers into `ui.base`, and the file opens with the same `@layer ui.base, ui.component;` statement as every `@workflowbuilder/ui` stylesheet. Component styling no longer depends on stylesheet load order. If you targeted the removed `reset` / `ext-lib` layer names, plain unlayered CSS wins over all library layers.
5 changes: 5 additions & 0 deletions .changeset/sdk-ssr-modal-portal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@workflowbuilder/sdk': patch
---

`ModalProvider` no longer touches `document` during server-side rendering; the modal portal mounts after hydration. Fixes `ReferenceError: document is not defined` when the editor renders in SSR frameworks such as Next.js.
5 changes: 5 additions & 0 deletions .changeset/ui-base-ui-1-7.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@workflowbuilder/ui': minor
---

`@base-ui/react` dependency moved from `1.4.1` to `^1.7.0`. Overlay transitions (Modal, Menu, Select, Tooltip, DatePicker) were re-validated on the 1.7 line.
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ Three onboarding paths (A installs from npm; B, C run the repo locally). README

Path B is UI-only and does not need Docker. Path C requires `pnpm infra:up` before backend/worker can start; the backend applies pending migrations automatically at boot.

App builds and dev servers consume the prebuilt `packages/ui/dist` (created on install). After editing `packages/ui/src`, run `pnpm build:ui` (or keep `pnpm --filter @workflowbuilder/ui dev` watching) - app commands do not rebuild it.

### Agent signals

Long-running processes already emit stable log lines that scripts and agents can grep for:
Expand Down
8 changes: 6 additions & 2 deletions apps/ai-studio/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,19 @@
"test:watch": "vitest --passWithNoTests"
},
"dependencies": {
"@base-ui/react": "catalog:",
"@jsonforms/core": "^3.4.1",
"@jsonforms/react": "^3.4.1",
"@phosphor-icons/react": "^2.1.7",
"@synergycodes/overflow-ui": "1.0.0-beta.27",
"@workflow-builder/types": "workspace:*",
"@workflowbuilder/ui": "workspace:*",
"@xyflow/react": "catalog:",
"clsx": "^2.1.1",
"html-to-image": "1.11.11",
"immer": "^10.1.1",
"mermaid": "^11.15.0",
"react": "^19.1.0",
"react": "catalog:",
"react-is": "catalog:",
"react-dom": "catalog:",
"react-i18next": "^15.4.1",
"react-markdown": "^10.1.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { NavButton } from '@synergycodes/overflow-ui';
import { Icon, getStoreEdges, getStoreNodes } from '@workflowbuilder/sdk';
import { NavButton } from '@workflowbuilder/ui';
import clsx from 'clsx';
import { useCallback } from 'react';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { NavButton } from '@synergycodes/overflow-ui';
import { Icon, useStore } from '@workflowbuilder/sdk';
import { NavButton } from '@workflowbuilder/ui';
import { useTranslation } from 'react-i18next';

import { redo, undo, useUndoRedoStore } from '../../stores/use-undo-redo-store';
Expand Down
25 changes: 0 additions & 25 deletions apps/ai-studio/vite.config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,12 @@ import { defineConfig } from 'vite';
import svgr from 'vite-plugin-svgr';

export default defineConfig(() => {
const shouldUseLocalOverflowUI = process.env.LOCAL_OVERFLOW_UI === 'true';

const sdkDirectory = path.resolve(import.meta.dirname, '../../packages/sdk');

return {
plugins: [svgr(), react()],
resolve: {
alias: [
...(shouldUseLocalOverflowUI
? Object.entries(getLocalOverflowUIAliases()).map(([find, replacement]) => ({
find,
replacement,
}))
: []),
{
find: /^@workflowbuilder\/sdk\/style\.css$/,
replacement: path.resolve(sdkDirectory, 'src/index.css'),
Expand All @@ -27,14 +19,6 @@ export default defineConfig(() => {
find: /^@workflowbuilder\/sdk$/,
replacement: path.resolve(sdkDirectory, 'src/index.ts'),
},
// overflow-ui doesn't expose ./dist/index.css via package.json exports
{
find: 'overflow-ui-css',
replacement: path.resolve(
sdkDirectory,
'node_modules/@synergycodes/overflow-ui/dist/index.css',
),
},
// SDK source files use @/ to refer to their own root (packages/sdk/src/...).
// AI Studio files do not use @/ (they import via @workflowbuilder/sdk subpaths),
// so it's safe to point @/ at the SDK root for cross-package alias parity.
Expand All @@ -56,12 +40,3 @@ export default defineConfig(() => {
},
};
});

function getLocalOverflowUIAliases(): Record<string, string> {
const distribution = path.resolve(import.meta.dirname, '../../../overflow-ui/packages/ui/dist');

return {
'@synergycodes/overflow-ui/tokens.css': path.join(distribution, 'tokens.css'),
'@synergycodes/overflow-ui': path.join(distribution, 'overflow-ui.js'),
};
}
1 change: 0 additions & 1 deletion apps/backend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ All scripts run from the monorepo root. Grouped by purpose:
| `dev:backend` | Backend only (Hono server with `tsx watch`) |
| `dev:worker` | Execution worker only (Temporal worker with `tsx watch`) |
| `dev:docs` | Docs site (Astro) |
| `dev:local` | Demo frontend with `LOCAL_OVERFLOW_UI=true` (linked local overflow-ui) |

### Infra (Docker lifecycle)

Expand Down
7 changes: 5 additions & 2 deletions apps/demo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@
"test:watch": "vitest"
},
"dependencies": {
"@base-ui/react": "catalog:",
"@jsonforms/core": "^3.4.1",
"@jsonforms/react": "^3.4.1",
"@microsoft/clarity": "^1.0.0",
"@phosphor-icons/react": "^2.1.7",
"@synergycodes/overflow-ui": "1.0.0-beta.27",
"@workflowbuilder/ui": "workspace:*",
"@xyflow/react": "catalog:",
"ajv": "catalog:",
"clsx": "^2.1.1",
Expand All @@ -28,7 +31,7 @@
"immer": "^10.1.1",
"jspdf": "^3.0.1",
"libavoid-js": "0.4.0-beta.1",
"react": "^19.1.0",
"react": "catalog:",
"react-dom": "catalog:",
"react-i18next": "^15.4.1",
"remeda": "^2.19.2",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NodeDescription, NodeIcon, NodePanel } from '@synergycodes/overflow-ui';
import { Icon, defineNodeTemplate, getHandleId, statusOptions } from '@workflowbuilder/sdk';
import type { NodeDataProperties, WorkflowNodeTemplateProps } from '@workflowbuilder/sdk';
import { NodeDescription, NodeIcon, NodePanel } from '@workflowbuilder/ui';
import { Handle, Position } from '@xyflow/react';
import clsx from 'clsx';
import { memo, useMemo } from 'react';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { NavButton } from '@synergycodes/overflow-ui';
import { Icon, useStore } from '@workflowbuilder/sdk';
import { NavButton } from '@workflowbuilder/ui';
import { useTranslation } from 'react-i18next';

import { redo, undo, useUndoRedoStore } from '../../stores/use-undo-redo-store';
Expand Down
24 changes: 0 additions & 24 deletions apps/demo/vite.config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import {
export default defineConfig(({ mode }) => {
const isProduction = mode === 'production';
const isAnalyze = process.env.ANALYZE === 'true';
const shouldUseLocalOverflowUI = process.env.LOCAL_OVERFLOW_UI === 'true';

const plugins: PluginOption[] = [];

Expand Down Expand Up @@ -52,12 +51,6 @@ export default defineConfig(({ mode }) => {
plugins,
resolve: {
alias: [
...(shouldUseLocalOverflowUI
? Object.entries(getLocalOverflowUIAliases()).map(([find, replacement]) => ({
find,
replacement,
}))
: []),
{
find: /^@workflowbuilder\/sdk\/style\.css$/,
replacement: path.resolve(sdkDirectory, 'src/index.css'),
Expand All @@ -66,14 +59,6 @@ export default defineConfig(({ mode }) => {
find: /^@workflowbuilder\/sdk$/,
replacement: path.resolve(sdkDirectory, 'src/index.ts'),
},
// overflow-ui doesn't expose ./dist/index.css via package.json exports
{
find: 'overflow-ui-css',
replacement: path.resolve(
sdkDirectory,
'node_modules/@synergycodes/overflow-ui/dist/index.css',
),
},
// SDK source files use @/ to refer to their own root (packages/sdk/src/...).
// Demo files do not use @/ (they import via @workflowbuilder/sdk subpaths),
// so it's safe to point @/ at the SDK root for cross-package alias parity with sdk's vite.config.
Expand All @@ -96,15 +81,6 @@ export default defineConfig(({ mode }) => {
};
});

function getLocalOverflowUIAliases(): Record<string, string> {
const distribution = path.resolve(import.meta.dirname, '../../../overflow-ui/packages/ui/dist');

return {
'@synergycodes/overflow-ui/tokens.css': path.join(distribution, 'tokens.css'),
'@synergycodes/overflow-ui': path.join(distribution, 'overflow-ui.js'),
};
}

type EnvMode = 'demo' | 'production' | 'development' | 'staging';
const fileReplacementsMap: Record<EnvMode, FileReplacement[]> = {
demo: [],
Expand Down
2 changes: 1 addition & 1 deletion apps/docs/src/content/docs/get-started/theming.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ Provide the font yourself (via `@font-face`, `@fontsource/<font>`, etc.) — the

## Other tokens

The SDK exposes a small surface of `--wb-*` variables (background, scrollbar, transitions) plus the larger `--ax-*` design-token set re-exported from `@synergycodes/overflow-ui`. See [Design System & Customization](/overview/features/design-system-and-customization/) for the full token map.
The SDK exposes a small surface of `--wb-*` variables (background, scrollbar, transitions) plus the larger `--ax-*` design-token set re-exported from `@workflowbuilder/ui`. See [Design System & Customization](/overview/features/design-system-and-customization/) for the full token map.
4 changes: 2 additions & 2 deletions apps/docs/src/content/docs/guides/add-a-custom-node.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,9 @@ The built-in renderer gives every node a header and one input + one output handl
`my-node-template.tsx`:

```tsx
import { NodeDescription, NodeIcon, NodePanel } from '@synergycodes/overflow-ui';
import { Icon, getHandleId } from '@workflowbuilder/sdk';
import type { WorkflowNodeTemplateProps } from '@workflowbuilder/sdk';
import { NodeDescription, NodeIcon, NodePanel } from '@workflowbuilder/ui';
import { Handle, Position } from '@xyflow/react';
import { memo, useMemo } from 'react';

Expand Down Expand Up @@ -230,7 +230,7 @@ export const MyNodeTemplate = memo(
);
```

The example composes the node from `@synergycodes/overflow-ui` primitives (`NodePanel.Root`, `NodePanel.Header`, `NodePanel.Handles`) — the same building blocks Workflow Builder uses for its own node renderers, so the result matches the editor's visual language out of the box.
The example composes the node from `@workflowbuilder/ui` primitives (`NodePanel.Root`, `NodePanel.Header`, `NodePanel.Handles`) — the same building blocks Workflow Builder uses for its own node renderers, so the result matches the editor's visual language out of the box.

The component receives [`WorkflowNodeTemplateProps`](/api/components/workflownodetemplateprops/). Use [`getHandleId`](/api/utilities/gethandleid/) for handle IDs and pass `innerId` when a node has more than one handle of the same type. If your template needs typed access to `data.properties`, wrap the component in [`defineNodeTemplate`](/api/components/definenodetemplate/) to bind a schema-derived properties type.

Expand Down
10 changes: 5 additions & 5 deletions apps/docs/src/content/docs/node-schemas/form-layouts.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,11 @@ Text-only elements that don't bind to a property. Use them when the property pan

Plain text label — uses the editor's default body styling.

| Prop | Type | Required | Notes |
| ---------- | -------- | -------- | ---------------------------------------------------------------------------------------------- |
| `text` | string | yes | The label text. |
| `required` | boolean | no | Append a `*` to indicate the following section contains required fields. |
| `size` | ItemSize | no | Visual size — `'small'`, `'medium'` (default), `'large'`. Type re-exported from `overflow-ui`. |
| Prop | Type | Required | Notes |
| ---------- | -------- | -------- | ------------------------------------------------------------------------------------------------------ |
| `text` | string | yes | The label text. |
| `required` | boolean | no | Append a `*` to indicate the following section contains required fields. |
| `size` | ItemSize | no | Visual size — `'small'`, `'medium'` (default), `'large'`. Type re-exported from `@workflowbuilder/ui`. |

```ts
{ type: 'Label', text: 'Connection details' }
Expand Down
39 changes: 35 additions & 4 deletions docs/how-to-change-css-tokens.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,38 @@
# How to change css tokens?
# How to change CSS tokens?

You can use our enterprise version with available figma design kit. We store tokens (colors) in `packages/sdk/src/index.css`, you'll find a CSS import: `@import '@synergycodes/overflow-ui/tokens.css';` with our figma you replace that import with generated from figma desing kit.
All colors, spacing, and radii resolve through `--ax-*` custom properties
defined in `@workflowbuilder/ui/tokens.css` (imported by the SDK's stylesheet).
The shipped defaults live inside the `ui.base` cascade layer, so a plain
unlayered override in your own stylesheet always wins - import order does not
matter.

Alternatively, if you want to stay with community version and do not pay for the licenses, you can look inside `node_modules` at `packages/sdk/node_modules/@synergycodes/overflow-ui/dist/tokens.css`, check the variable names, and manually set some or all of the colors in your repository to overwrite them.
## Consuming from npm (SDK or UI package)

`@synergycodes/overflow-ui` is our library for UI elements [overflow-ui](https://github.com/synergycodes/overflow-ui)
Override the variables you care about in any stylesheet of your app:

```css
:root {
--ax-button-primary-bg-default: #0f62fe;
--ax-ui-bg-tertiary-default: #f4f4f4;
}
```

To discover variable names, inspect elements in devtools or browse
`node_modules/@workflowbuilder/ui/dist/tokens.css`. Theme-specific values are
keyed on `html[data-theme='light' | 'dark']`, so scope your overrides the same
way when they should apply to one theme only.

## Working in this monorepo

The source of truth is `packages/tokens/tokens.json` (a Figma Tokens Studio
export) plus the build in `packages/tokens/src`. Edit the export (or re-export
from Figma) and run `pnpm build:ui`.

Do **not** edit `packages/ui/dist/tokens.css` - it is generated output and the
next build overwrites it.

## Enterprise

The enterprise version ships a Figma design kit; its generated stylesheet
replaces the `@import '@workflowbuilder/ui/tokens.css';` line in
`packages/sdk/src/index.css`.
23 changes: 0 additions & 23 deletions docs/overflow-ui.md

This file was deleted.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
"dev:backend": "pnpm --filter backend dev",
"dev:worker": "pnpm --filter execution-worker dev",
"dev:docs": "pnpm --filter @workflow-builder/docs dev",
"dev:local": "LOCAL_OVERFLOW_UI=true pnpm --filter @workflow-builder/demo dev",
"infra:up": "docker compose -f apps/backend/docker-compose.yml up -d",
"infra:down": "docker compose -f apps/backend/docker-compose.yml down",
"infra:wait": "node tools/wait-for-temporal.mjs",
Expand Down
8 changes: 7 additions & 1 deletion packages/sdk/DECISION-LOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,13 @@
> `<WorkflowBuilder.Root>`. References below to `Editor`, `createWorkflowBuilder`,
> `WorkflowBuilderConfig`, `WorkflowBuilderInstance` describe symbols that no
> longer exist; see current SDK exports in `packages/sdk/src/index.ts` for the
> post-refactor surface. The notes are retained for historical context only.
> post-refactor surface. The UI library was later swapped from the npm package
> `@synergycodes/overflow-ui` to the in-repo `@workflowbuilder/ui`: the
> `overflow-ui-css` Vite alias and the `@import` layout in sections 3-4 no
> longer exist, and the "Vite doesn't extract CSS from bundled node_modules"
> claim in section 3 turned out to be false (bundled chunk CSS imports ARE
> extracted - the SDK now relies on exactly that). The notes are retained for
> historical context only.

## Context

Expand Down
Loading