Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
660f885
build: depend on Astryx 0.6.2 and bump to 0.2.0-alpha.0
yomybaby Sep 25, 2026
8095cdc
feat!: mirror the Astryx export surface through a generator
yomybaby Sep 25, 2026
192b93f
feat: ship the Lablup brand as an Astryx theme
yomybaby Sep 25, 2026
9dab9cb
feat: add ui-common.css and the deprecated legacy-tokens.css bridge
yomybaby Sep 25, 2026
fcf260b
feat: add the ui-common i18n catalog on Astryx's translator
yomybaby Sep 25, 2026
07a008c
feat: register ui-common as an Astryx CLI integration
yomybaby Sep 25, 2026
a11bb4d
test: move the install fixture onto the Astryx surface
yomybaby Sep 25, 2026
18b0a53
docs: rewrite README and CONTRIBUTING for the Astryx era
yomybaby Sep 25, 2026
d97161e
feat!: rebuild the kept components on Astryx
yomybaby Sep 25, 2026
20dfb96
feat!: remove the 0.1 customs that Astryx replaces
yomybaby Sep 25, 2026
d21faf4
feat: add Modal, ui-common's dialog in place of Astryx Dialog
yomybaby Sep 25, 2026
bd980b8
feat(i18n): ship ko-KR and ja-JP translations of the catalog
yomybaby Sep 25, 2026
4bca3d4
test: point the install fixture at Modal and the rebuilt components
yomybaby Sep 25, 2026
30be71e
docs: document the Astryx component layer and Modal
yomybaby Sep 25, 2026
872ba80
feat: add the 0.1 -> 0.2 upgrade codemods and their runner
yomybaby Sep 25, 2026
e0b795f
feat: add the ui-common bin
yomybaby Sep 25, 2026
44e4fdf
Merge branch 'feat/astryx-foundation' into feat/astryx-cli
yomybaby Sep 25, 2026
f13474c
chore: prepare 0.2.0-alpha.1
yomybaby Sep 25, 2026
5190f3e
fix: correct and extend the 0.1 -> 0.2 migration map
yomybaby Sep 25, 2026
504825f
refactor: drive the upgrade codemods from migration/0.1-to-0.2.json
yomybaby Sep 25, 2026
99cd0c9
feat: document Modal and PageHeader for the Astryx CLI
yomybaby Sep 25, 2026
1e6501f
docs: document the ui-common CLI and the upgrade tool
yomybaby Sep 25, 2026
3be542c
Merge branch 'feat/astryx-cli' into feat/astryx-foundation
yomybaby Sep 25, 2026
65f5fb2
feat: add the free-leaf components from backend.ai-ui
yomybaby Sep 25, 2026
bf9392f
docs: document the components moved from backend.ai-ui
yomybaby Sep 25, 2026
fffbc0b
chore: prepare 0.2.0-alpha.2
yomybaby Sep 25, 2026
8428c58
refactor!: share the generic action labels as uic.common keys
yomybaby Sep 25, 2026
0b656dd
feat: add the i18n-leaf components from backend.ai-ui, translated
yomybaby Sep 25, 2026
f32ba23
docs: document the i18n-leaf components and the catalog key convention
yomybaby Sep 25, 2026
28e3ab7
chore: prepare 0.2.0-alpha.3
yomybaby Sep 25, 2026
0ea0962
test: read catalog placeholders from the parsed ICU message
yomybaby Sep 25, 2026
be86962
feat: add AlertModal, DeleteConfirmModal and StepNumberInput from bac…
yomybaby Sep 25, 2026
56bff6a
docs: document AlertModal, DeleteConfirmModal and StepNumberInput
yomybaby Sep 25, 2026
e81b150
feat(Modal): add headerClassName and footerClassName
yomybaby Sep 25, 2026
da4e275
chore: prepare 0.2.0-alpha.4
yomybaby Sep 25, 2026
6dae0ff
feat!: hide AlertDialog behind AlertModal
yomybaby Sep 25, 2026
6e151f3
feat: add BoardItemTitle, Statistic, DividedRow, TokenList, TokenRow …
yomybaby Sep 25, 2026
3cb9cfb
chore: prepare 0.2.0-alpha.5
yomybaby Sep 25, 2026
d5795ff
feat: add UnitGrid, UnitGridSkeleton and ColorPicker from backend.ai-ui
yomybaby Sep 25, 2026
b311ea6
chore: prepare 0.2.0-alpha.6
yomybaby Sep 25, 2026
67c3fe3
fix(codemods): keep the Drawer onClose handler's own reads when wrapp…
yomybaby Sep 26, 2026
5129b0b
fix(codemods): check component renames against every scope in the file
yomybaby Sep 26, 2026
9d0d7db
fix(cli): never let upgrade overwrite a file it did not read or create
yomybaby Sep 26, 2026
8709af7
fix(cli): make upgrade --dry-run write nothing, the report included
yomybaby Sep 26, 2026
ded0d2d
fix(codemods): keep @use and @forward above the layer order in SCSS
yomybaby Sep 26, 2026
a684443
fix(Modal)!: make the page behind an open modal inert, and mark the d…
yomybaby Sep 26, 2026
1df5baf
fix(cli): point the lab canary's core peer at ui-common's core
yomybaby Sep 26, 2026
fcdecae
fix(codemods): swap only module specifiers around upstream Astryx cod…
yomybaby Sep 26, 2026
c507291
test(cli): cover upgrade reading --from from package.json
yomybaby Sep 26, 2026
3e41217
chore: prepare 0.2.0-alpha.7
yomybaby Sep 26, 2026
ce77e44
fix(Modal): return focus to the opener when content autofocuses on open
yomybaby Sep 26, 2026
161c31c
chore: prepare 0.2.0-alpha.8
yomybaby Sep 26, 2026
02d5af6
feat: add the Form engine and BulkEditFormItem from backend.ai-ui
yomybaby Sep 28, 2026
95c4ae6
chore: prepare 0.2.0-alpha.9
yomybaby Sep 28, 2026
d42eccc
feat: add DataGrid, BulkErrorModal and five more components from back…
yomybaby Sep 29, 2026
479c39f
chore: prepare 0.2.0-alpha.10
yomybaby Sep 29, 2026
85abfd7
fix(i18n): use button labels for the common actions and fill known tr…
yomybaby Sep 29, 2026
272f1c7
fix(DataGridSettingsModal): name the drag handles and reorder them by…
yomybaby Sep 29, 2026
2d9fa90
fix(DataGrid): leave disabled rows out of select-all; pass getCellPro…
yomybaby Sep 29, 2026
3755470
fix: ship the MIT licence text for the Ant Design Icons path data
yomybaby Sep 29, 2026
4ee64c2
docs(Form): say where isEqual differs from lodash
yomybaby Sep 29, 2026
c5efb82
fix(DataGridSettingsModal): keep the pick-up announcement on keyboard…
yomybaby Sep 29, 2026
12e83e9
chore: prepare 0.2.0-alpha.11
yomybaby Sep 29, 2026
1017f34
refactor!: drop the --uic- prefix from custom properties
yomybaby Sep 29, 2026
f34cbf2
chore: prepare 0.2.0-alpha.12
yomybaby Sep 29, 2026
48bb2cf
fix(DataGrid): let the root shrink as a flex or grid item
yomybaby Sep 29, 2026
ba45794
feat(DoubleToken): take a per-value endContent
yomybaby Sep 29, 2026
7c5ae9f
feat(gen-exports): mirror lab name by name, and let a fork keep Astry…
yomybaby Sep 29, 2026
99e7099
feat: ship Astryx's ComplexSelector, Drawer and Tour as fixed forks
yomybaby Sep 29, 2026
45ca089
chore: prepare 0.2.0-alpha.13
yomybaby Sep 29, 2026
fde887f
fix(Drawer): route Escape through core's layer-dismissal stack
yomybaby Sep 29, 2026
55a030c
feat(PagedSelector): add a searchable selector over paged options
yomybaby Sep 29, 2026
95f178a
chore: prepare 0.2.0-alpha.14
yomybaby Sep 29, 2026
d71a81f
docs: add a migration guide from the first app that moved onto 0.2
yomybaby Sep 30, 2026
51807d4
chore: keep lint, format and tests out of agent worktrees
yomybaby Sep 30, 2026
8440fba
test(Modal): pin Escape routing around a tooltip inside a modal
yomybaby Sep 30, 2026
6ede03e
fix(codemods): add a library's StyleX and lab peers when only a devDe…
yomybaby Oct 2, 2026
120c6b8
fix: raise the react and react-dom peers to ^19.2.0
yomybaby Oct 2, 2026
aea5d96
fix(NotificationStack): unmount a closed notice once its exit has played
yomybaby Oct 2, 2026
e14aafd
fix(NotificationStack): keep the countdown paused while hover or focu…
yomybaby Oct 2, 2026
35b2926
fix(DoubleBadge): accept shorthand and object values mixed in one list
yomybaby Oct 2, 2026
2ad7969
fix(DoubleToken): accept shorthand and object values mixed in one list
yomybaby Oct 2, 2026
13d9c6e
fix(ImageWithFallback): keep the image's semantics on the fallback
yomybaby Oct 2, 2026
403ccbd
fix(codemods): keep JSX text whitespace when upgrade adds a TODO or w…
yomybaby Oct 2, 2026
6874924
fix(DataGrid): let column settings undo what defaultOverrides set
yomybaby Oct 2, 2026
ff325e2
fix(Drawer): open ui-common's Modal above a scrimmed drawer
yomybaby Oct 2, 2026
598eddf
docs(changelog): list the pre-merge review fixes under Unreleased
yomybaby Oct 2, 2026
fcf5df0
fix: harden 0.2 for existing 0.1 consumers (layer order, CLI package,…
yomybaby Oct 2, 2026
1268e0d
chore: prepare 0.2.0-alpha.15
yomybaby Oct 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
40 changes: 32 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ jobs:
- name: Public boundary
run: pnpm run check:boundary

- name: Built Lablup theme is up to date
run: pnpm run theme:check

- name: Test
run: pnpm run test

Expand All @@ -49,6 +52,9 @@ jobs:
- name: Packed artifact and export paths
run: pnpm run check:pack

- name: Astryx CLI integration
run: pnpm run check:integration

external-install:
# Building green is not the same as being installable. This consumes the
# real tarball from a project that shares nothing with this repository, so
Expand All @@ -72,20 +78,38 @@ jobs:
run: |
pnpm run build
pnpm pack --pack-destination "$RUNNER_TEMP"

- name: Install the tarball into a clean React project
pnpm --filter @lablup/ui-common-cli pack --pack-destination "$RUNNER_TEMP"

# pnpm, as every consumer installs: pnpm 11 fails the install with
# ERR_PNPM_IGNORED_BUILDS when a dependency's build script is neither
# allowed nor declined, which npm never reports. fixture/pnpm-workspace.yaml
# holds the allowBuilds block a consumer needs, and makes the fixture its
# own workspace, apart from this repository's.
- name: Install the tarballs into a clean React project
working-directory: fixture
run: |
TARBALL=$(find "$RUNNER_TEMP" -name 'lablup-ui-common-*.tgz' | head -1)
echo "Installing $TARBALL"
npm install --no-package-lock "$TARBALL"
npm install --no-package-lock
LIB=$(find "$RUNNER_TEMP" -name 'lablup-ui-common-[0-9]*.tgz' | head -1)
CLI=$(find "$RUNNER_TEMP" -name 'lablup-ui-common-cli-*.tgz' | head -1)
echo "Installing $LIB and $CLI"
pnpm add "$LIB"
pnpm add --save-dev "$CLI"

- name: Type-check and build the fixture against the packed artifact
working-directory: fixture
run: |
npx tsc --noEmit
npx vite build
pnpm exec tsc --noEmit
pnpm exec vite build

# The CLI resolves the project's @lablup/ui-common and the Astryx CLI it
# pins from two different packages; this runs it where a consumer would.
- name: Run the ui-common bin from the fixture
working-directory: fixture
run: |
pnpm exec ui-common --version --verbose
pnpm exec ui-common --help > /dev/null
pnpm exec ui-common agents > /dev/null
pnpm exec ui-common component Button --json > /dev/null
pnpm exec ui-common upgrade --from 0.1 --dry-run > /dev/null

# Building is not the same as being styled. 0.1.0-alpha.0 built here
# green while shipping every component's CSS as an asset nothing could
Expand Down
122 changes: 93 additions & 29 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,39 +56,71 @@ jobs:
- name: Verify before publishing
run: pnpm run verify

- name: Confirm the release tag matches the package version
if: github.event_name == 'release'
# @lablup/ui-common (the root) and @lablup/ui-common-cli (packages/cli)
# are released together at one version: the CLI takes the library as an
# exact peer.
- name: Confirm both packages are at one version
run: |
PKG_VERSION=$(node -p "require('./package.json').version")
TAG="${GITHUB_REF_NAME#v}"
if [ "$PKG_VERSION" != "$TAG" ]; then
echo "package.json is $PKG_VERSION but the release tag is $TAG" >&2
LIB=$(node -p "require('./package.json').version")
CLI=$(node -p "require('./packages/cli/package.json').version")
if [ "$LIB" != "$CLI" ]; then
echo "@lablup/ui-common is $LIB but @lablup/ui-common-cli is $CLI" >&2
exit 1
fi

- name: Confirm the release tag matches the package versions
if: github.event_name == 'release'
run: |
TAG="${GITHUB_REF_NAME#v}"
for PKG in package.json packages/cli/package.json; do
PKG_VERSION=$(node -p "require('./$PKG').version")
if [ "$PKG_VERSION" != "$TAG" ]; then
echo "$PKG is $PKG_VERSION but the release tag is $TAG" >&2
exit 1
fi
done

# Any prerelease goes to `next`, a plain version to `latest`. 0.1's
# prereleases went out under `alpha`; that tag is no longer moved.
# The registry still sets `latest` on a package's first publish, so
# @lablup/ui-common-cli's `latest` is its first alpha until 0.2.0; the
# docs say `@next` until then. Do not move `latest` here.
- name: Choose the dist-tag from the version
id: tag
run: |
VERSION=$(node -p "require('./package.json').version")
case "$VERSION" in
*-alpha*) TAG=alpha ;;
*-beta*) TAG=beta ;;
*-rc*) TAG=rc ;;
*-*) TAG=next ;;
*) TAG=latest ;;
*-*) TAG=next ;;
*) TAG=latest ;;
esac
echo "Publishing $VERSION under dist-tag $TAG"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"

# pnpm packs both, rewriting the CLI's `workspace:*` peer to the exact
# version; the library goes first so the CLI's peer exists when it lands.
- name: Pack both packages
run: |
mkdir -p "$RUNNER_TEMP/packed"
pnpm pack --pack-destination "$RUNNER_TEMP/packed"
pnpm --filter @lablup/ui-common-cli pack --pack-destination "$RUNNER_TEMP/packed"
ls -la "$RUNNER_TEMP/packed"

- name: Publish
if: github.event_name == 'release' || inputs.dry_run == false
run: pnpm publish --no-git-checks --access public --tag ${{ steps.tag.outputs.tag }} --registry https://npm.pkg.github.com
run: |
for PKG in lablup-ui-common lablup-ui-common-cli; do
npm publish "$RUNNER_TEMP/packed/$PKG-${{ steps.tag.outputs.version }}.tgz" --access public --tag ${{ steps.tag.outputs.tag }} --registry https://npm.pkg.github.com
done
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Dry run
if: github.event_name == 'workflow_dispatch' && inputs.dry_run
run: pnpm pack && ls -la *.tgz
run: |
for PKG in lablup-ui-common lablup-ui-common-cli; do
npm publish "$RUNNER_TEMP/packed/$PKG-${{ steps.tag.outputs.version }}.tgz" --dry-run --access public --tag ${{ steps.tag.outputs.tag }} --registry https://npm.pkg.github.com
done

# GitHub Packages requires authentication even for public packages, so an
# open-source consumer cannot install from it without every contributor
Expand Down Expand Up @@ -130,46 +162,78 @@ jobs:
- name: Verify before publishing
run: pnpm run verify

- name: Confirm the release tag matches the package version
if: github.event_name == 'release'
# @lablup/ui-common (the root) and @lablup/ui-common-cli (packages/cli)
# are released together at one version: the CLI takes the library as an
# exact peer.
- name: Confirm both packages are at one version
run: |
PKG_VERSION=$(node -p "require('./package.json').version")
TAG="${GITHUB_REF_NAME#v}"
if [ "$PKG_VERSION" != "$TAG" ]; then
echo "package.json is $PKG_VERSION but the release tag is $TAG" >&2
LIB=$(node -p "require('./package.json').version")
CLI=$(node -p "require('./packages/cli/package.json').version")
if [ "$LIB" != "$CLI" ]; then
echo "@lablup/ui-common is $LIB but @lablup/ui-common-cli is $CLI" >&2
exit 1
fi

- name: Confirm the release tag matches the package versions
if: github.event_name == 'release'
run: |
TAG="${GITHUB_REF_NAME#v}"
for PKG in package.json packages/cli/package.json; do
PKG_VERSION=$(node -p "require('./$PKG').version")
if [ "$PKG_VERSION" != "$TAG" ]; then
echo "$PKG is $PKG_VERSION but the release tag is $TAG" >&2
exit 1
fi
done

# Any prerelease goes to `next`, a plain version to `latest`. 0.1's
# prereleases went out under `alpha`; that tag is no longer moved.
# The registry still sets `latest` on a package's first publish, so
# @lablup/ui-common-cli's `latest` is its first alpha until 0.2.0; the
# docs say `@next` until then. Do not move `latest` here.
- name: Choose the dist-tag from the version
id: tag
run: |
VERSION=$(node -p "require('./package.json').version")
case "$VERSION" in
*-alpha*) TAG=alpha ;;
*-beta*) TAG=beta ;;
*-rc*) TAG=rc ;;
*-*) TAG=next ;;
*) TAG=latest ;;
*-*) TAG=next ;;
*) TAG=latest ;;
esac
echo "Publishing $VERSION under dist-tag $TAG"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"

# pnpm packs both, rewriting the CLI's `workspace:*` peer to the exact
# version; the library goes first so the CLI's peer exists when it lands.
- name: Pack both packages
run: |
mkdir -p "$RUNNER_TEMP/packed"
pnpm pack --pack-destination "$RUNNER_TEMP/packed"
pnpm --filter @lablup/ui-common-cli pack --pack-destination "$RUNNER_TEMP/packed"
ls -la "$RUNNER_TEMP/packed"

- name: Confirm the credential is valid for npmjs
run: npm whoami --registry https://registry.npmjs.org
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

# npm rather than pnpm here: provenance is an npm CLI feature and this
# is the one step that needs it. The tarball is identical either way,
# since both pack from the same files allowlist.
# npm publishes the tarballs pnpm packed: provenance is an npm CLI
# feature, and npm would leave the CLI's `workspace:*` peer unrewritten
# if it packed the directory itself.
- name: Publish
if: github.event_name == 'release' || inputs.dry_run == false
run: npm publish --provenance --access public --tag ${{ steps.tag.outputs.tag }} --registry https://registry.npmjs.org
run: |
for PKG in lablup-ui-common lablup-ui-common-cli; do
npm publish "$RUNNER_TEMP/packed/$PKG-${{ steps.tag.outputs.version }}.tgz" --provenance --access public --tag ${{ steps.tag.outputs.tag }} --registry https://registry.npmjs.org
done
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

- name: Dry run
if: github.event_name == 'workflow_dispatch' && inputs.dry_run
run: npm publish --dry-run --access public --tag ${{ steps.tag.outputs.tag }} --registry https://registry.npmjs.org
run: |
for PKG in lablup-ui-common lablup-ui-common-cli; do
npm publish "$RUNNER_TEMP/packed/$PKG-${{ steps.tag.outputs.version }}.tgz" --dry-run --access public --tag ${{ steps.tag.outputs.tag }} --registry https://registry.npmjs.org
done
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ coverage/
.eslintcache
fixture/node_modules/
fixture/dist/
fixture/pnpm-lock.yaml
3 changes: 3 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@ dist/
coverage/
pnpm-lock.yaml
LICENSE
src/theme/*/built/
packages/cli/test/upgrade/fixtures/
.claude/
Loading
Loading