Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
434f413
feat(ui): add @workflowbuilder/ui and @workflowbuilder/ui-tokens pack…
librowski-synergy Jun 24, 2026
59adc22
fix(ui): correctness fixes from review
librowski-synergy Jun 25, 2026
7e8475c
refactor(ui): review polish pass
librowski-synergy Jun 25, 2026
a80d421
test(ui): add Vitest suites for ui + tokens pure logic
librowski-synergy Jun 25, 2026
135036c
chore(ui): release-prep for npm publish
librowski-synergy Jun 25, 2026
7959366
ci(release): scoped per-package release tags + ui publish workflow
librowski-synergy Jun 25, 2026
0b3cbcc
chore(ui): make @base-ui/react a regular dependency, not a peer
librowski-synergy Jun 26, 2026
ca743f9
fix(ui): ship react-day-picker styles so the calendar renders
librowski-synergy Jun 26, 2026
62f3a12
fix(ui): theme the date-picker calendar and add day hover
librowski-synergy Jun 26, 2026
a887eb1
fix(ui): theme the date-picker month-nav chevrons
librowski-synergy Jun 26, 2026
dd096cb
fix(ui): IconSwitch uncontrolled icon swap + Accordion double toggle
librowski-synergy Jun 30, 2026
11c56c5
docs(ui): correct and extend the CHANGELOG for the beta
librowski-synergy Jun 30, 2026
d431a14
chore(ui): release as 2.0.0 with a fresh changelog
librowski-synergy Jun 30, 2026
807657a
fix(ui): wrap remaining component CSS in cascade layers, guard agains…
Jul 30, 2026
0aed076
chore(ui): Apache-2.0 license, externalize @phosphor-icons/react, exp…
Jul 30, 2026
bcb22e8
chore(tokens): add lint/typecheck scripts, README, and CI coverage
Jul 30, 2026
c3fef52
docs: document packages/tokens in CLAUDE.md workspace tables
Jul 30, 2026
5292e5b
chore(docs): remove orphaned apps/docs/src/generated/ui-api.json
Jul 30, 2026
4f339a3
chore: sync pnpm-lock.yaml after rebase onto main
Jul 31, 2026
0fc78fe
fix(ui): require react 19 in peer range
Jul 31, 2026
802b87f
refactor(ui): rewrite built-css layer check on postcss
Jul 31, 2026
2f56fcb
fix(ui): export WithIcon from the barrel so TypeDoc resolves the icon…
Jul 31, 2026
10806da
fix(ui): pin the select caret to the trigger's far edge
Jul 31, 2026
24564df
refactor(tokens): derive token-set paths once from a validated manifest
Aug 7, 2026
ce2cf51
fix(ui): stamp the @layer order statement into every built stylesheet
Aug 7, 2026
ed026af
fix(ui): layer react-day-picker styles under ui.base
Aug 7, 2026
6b8492b
fix(ui): inject box-sizing only into known styling contexts
Aug 7, 2026
f179f5d
feat(ui): extend the built-CSS guard with order, name, and surface ch…
Aug 7, 2026
b631924
fix(tokens): reject duplicate config sets and match primitives by bas…
Aug 7, 2026
121eaf6
fix(ui): close guard and plugin gaps found in adversarial review
Aug 7, 2026
66ce5d9
docs(ui): record the box-sizing plugin decision
Aug 7, 2026
9d6eebf
fix(ui): focus the field when clicking input and text-area wrapper pa…
Aug 10, 2026
d768f3f
fix(ui): soften the modal exit with symmetric ease timing
Aug 10, 2026
ea508d5
fix(ui): split build tooling into its own ts program
Aug 10, 2026
e1c65ea
fix(ui): keep react-flow handle state rules content-box
Aug 11, 2026
da84b32
fix(tokens): fail the build when set keys collide after file-name nor…
Aug 11, 2026
47b7fab
fix(tokens): clean dist before building so renamed sets leave no stal…
Aug 11, 2026
2389793
fix(ui): fail the combine step when dist/assets holds no component CSS
Aug 11, 2026
c9619be
feat(ui): ship variable defaults inside the ui.base layer
Aug 11, 2026
31af28b
feat(ui): widen react peer range to ^18.0.0 || ^19.0.0
Aug 11, 2026
f4b157a
fix(ui): close the modal on a backdrop click
librowski Aug 12, 2026
4d9eb3e
fix(ui): raise the date-picker popover like select and menu
librowski Aug 12, 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
5 changes: 5 additions & 0 deletions .changeset/ui-layer-root-defaults.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@workflowbuilder/ui': minor
---

Variable defaults (`--ax-public-*` component defaults and the `--ax-*` design tokens in `tokens.css`) now ship inside the `ui.base` cascade layer. A plain `:root { --ax-…: … }` override in your app now wins regardless of stylesheet load order; previously a lazily loaded component stylesheet could silently restore the default.
5 changes: 5 additions & 0 deletions .changeset/ui-react-18-peer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@workflowbuilder/ui': minor
---

React 18 is accepted again: the `react` / `react-dom` peer ranges widened from `^19.0.0` to `^18.0.0 || ^19.0.0`, matching Base UI's own support range.
55 changes: 51 additions & 4 deletions .github/workflows/pr-check.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
name: PR Check

# Runs on every PR to give reviewers fast feedback on whether the change
# is safe to merge. Focus on @workflowbuilder/sdk (what we publish to
# npm) + global format consistency. Other workspaces (apps/docs, demo,
# ai-studio, …) are not checked here — they're internal and have their
# own broken-state tolerances (e.g. starlight virtual-module type errors).
# is safe to merge. Focus on the published packages @workflowbuilder/sdk and
# @workflowbuilder/ui (plus its private @workflowbuilder/ui-tokens build) +
# global format consistency. Other workspaces (apps/docs, demo, ai-studio, …)
# are not checked here — they're internal and have their own broken-state
# tolerances (e.g. starlight virtual-module type errors).

on:
pull_request:
Expand Down Expand Up @@ -75,3 +76,49 @@ jobs:

- name: Build
run: pnpm --filter @workflowbuilder/sdk build:lib

ui:
name: UI + UI tokens lint + typecheck + test + build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 22

- name: Enable Corepack
run: npm i -g corepack@latest

- name: Install pnpm
run: corepack prepare

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Lint tokens
run: pnpm --filter @workflowbuilder/ui-tokens lint

- name: Typecheck tokens
run: pnpm --filter @workflowbuilder/ui-tokens typecheck

- name: Test tokens
run: pnpm --filter @workflowbuilder/ui-tokens test

- name: Lint
run: pnpm --filter @workflowbuilder/ui lint

- name: Typecheck
run: pnpm --filter @workflowbuilder/ui typecheck

- name: Test
run: pnpm --filter @workflowbuilder/ui test

- name: Build
# build:ui builds @workflowbuilder/ui-tokens first, then ui, then runs
# the check:built-css guard.
run: pnpm build:ui
18 changes: 11 additions & 7 deletions .github/workflows/release-sdk.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
name: Release SDK

# Triggers on tags `vX.Y.Z` matching the version in packages/sdk/package.json.
# Maintainer pushes the tag after merging the version-bump PR (which ran
# `pnpm changeset version`). See packages/sdk/RELEASE.md.
# Triggers on scoped tags `@workflowbuilder/sdk@X.Y.Z` matching the version in
# packages/sdk/package.json. Scoped tags let this repo publish more than one
# package (see release-ui.yml for @workflowbuilder/ui). Maintainer pushes the
# tag after merging the version-bump PR (which ran `pnpm changeset version`).
# See packages/sdk/RELEASE.md.

on:
push:
tags:
- "v*"
- "@workflowbuilder/sdk@*"
workflow_dispatch: # manual fire from GitHub UI — for testing or rerunning a failed publish

permissions:
Expand Down Expand Up @@ -60,10 +62,12 @@ jobs:
run: pnpm --filter @workflowbuilder/sdk build:lib

- name: Verify version matches tag
# Tag refs/tags/vX.Y.Z must match packages/sdk/package.json version.
# Catches push of wrong tag (typo, pushed before version-bump PR merged).
# Tag `@workflowbuilder/sdk@X.Y.Z` must match packages/sdk/package.json
# version. ${GITHUB_REF_NAME##*@} strips everything up to the last `@`,
# leaving X.Y.Z. Catches push of wrong tag (typo, pushed before the
# version-bump PR merged).
run: |
TAG_VERSION="${GITHUB_REF_NAME#v}"
TAG_VERSION="${GITHUB_REF_NAME##*@}"
PKG_VERSION=$(node -p "require('./packages/sdk/package.json').version")
if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then
echo "::error::Tag version ($TAG_VERSION) does not match package.json version ($PKG_VERSION)."
Expand Down
114 changes: 114 additions & 0 deletions .github/workflows/release-ui.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
name: Release UI

# Triggers on scoped tags `@workflowbuilder/ui@X.Y.Z` matching the version in
# packages/ui/package.json. Mirrors release-sdk.yml. Maintainer pushes the tag
# after merging the version-bump PR (which ran `pnpm changeset version`). See
# packages/sdk/RELEASE.md (the release flow is shared between both packages).
#
# One-time npm setup: @workflowbuilder/ui needs its own GitHub Actions trusted
# publisher registered on npmjs.com pointing at THIS workflow file
# (.github/workflows/release-ui.yml). It is separate from the sdk one.

on:
push:
tags:
- "@workflowbuilder/ui@*"
workflow_dispatch: # manual fire from GitHub UI — for testing or rerunning a failed publish

permissions:
contents: write # create GitHub Release
id-token: write # OIDC for npm Trusted Publisher (and provenance attestation)

jobs:
publish:
name: Build and publish to npm
runs-on: ubuntu-latest
steps:
- name: Checkout code (at tag)
uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0 # full history so changesets can read CHANGELOG context

- name: Set up Node.js
# No `registry-url:` here on purpose — see the note in release-sdk.yml.
# setup-node's registry-url breaks OIDC by injecting a sentinel token.
uses: actions/setup-node@v4
with:
node-version: 22

- name: Enable Corepack
run: npm i -g corepack@latest

- name: Install pnpm
run: corepack prepare

- name: Install dependencies
run: pnpm install --frozen-lockfile

# Defensive layer — fail before npm, not on consumers.
- name: Lint
run: pnpm --filter @workflowbuilder/ui lint

- name: Typecheck
run: pnpm --filter @workflowbuilder/ui typecheck

- name: Test
run: pnpm --filter @workflowbuilder/ui test

- name: Build UI
# build:ui builds @workflowbuilder/ui-tokens first (ui consumes its
# built tokens.css) and runs the check:built-css guard afterwards.
run: pnpm build:ui

- name: Verify version matches tag
# Tag `@workflowbuilder/ui@X.Y.Z` must match packages/ui/package.json
# version. ${GITHUB_REF_NAME##*@} strips everything up to the last `@`.
run: |
TAG_VERSION="${GITHUB_REF_NAME##*@}"
PKG_VERSION=$(node -p "require('./packages/ui/package.json').version")
if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then
echo "::error::Tag version ($TAG_VERSION) does not match package.json version ($PKG_VERSION)."
echo "Did you forget to merge the version-bump PR before pushing the tag?"
exit 1
fi
echo "Publishing @workflowbuilder/ui@$PKG_VERSION"

- name: Check if version already published
# Idempotency — re-pushing a tag should not re-publish.
id: check-version
run: |
PKG_VERSION=$(node -p "require('./packages/ui/package.json').version")
if npm view "@workflowbuilder/ui@$PKG_VERSION" version 2>/dev/null; then
echo "already_published=true" >> "$GITHUB_OUTPUT"
echo "::notice::@workflowbuilder/ui@$PKG_VERSION already on npm — skipping publish step."
else
echo "already_published=false" >> "$GITHUB_OUTPUT"
fi

- name: Publish to npm
# Authenticates via npm Trusted Publisher (OIDC). No NPM_TOKEN.
# Requires @workflowbuilder/ui to have trusted publishing configured on
# npmjs.com pointing at this workflow file.
if: steps.check-version.outputs.already_published == 'false'
run: pnpm --filter @workflowbuilder/ui publish --no-git-checks --access public --provenance

- name: Extract release notes from CHANGELOG
id: notes
run: |
VERSION=$(node -p "require('./packages/ui/package.json').version")
NOTES=$(awk -v v="$VERSION" '$0 ~ ("^## \\[?" v "\\]?([ -]|$)"){flag=1;next}/^## /{flag=0}flag' packages/ui/CHANGELOG.md)
{
echo "notes<<EOF"
echo "$NOTES"
echo "EOF"
} >> "$GITHUB_OUTPUT"

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }}
body: ${{ steps.notes.outputs.notes }}
draft: false
prerelease: false
Loading
Loading