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: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
node-version: 22
cache: 'pnpm'

- name: Install dependencies
Expand All @@ -40,6 +40,8 @@ jobs:

- name: Build
run: pnpm -w build
env:
NODE_OPTIONS: --max-old-space-size=8192

- name: Knip
run: pnpm --filter @btst/stack run knip --reporter github-actions
Expand Down
56 changes: 46 additions & 10 deletions .github/workflows/examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,16 @@ on:
types: [opened, synchronize, reopened, ready_for_review]
paths:
- 'demos/**'
- '.github/workflows/examples.yml'

concurrency:
group: demos-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
name: Build — ${{ matrix.demo }}
name: Demo Projects
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
demo: [ai-chat, blog, cms, form-builder, kanban, ui-builder]

steps:
- name: Checkout
Expand All @@ -34,14 +31,53 @@ jobs:
with:
node-version: 22
cache: 'pnpm'
cache-dependency-path: demos/${{ matrix.demo }}/pnpm-lock.yaml

- name: Install dependencies
working-directory: demos/${{ matrix.demo }}
- name: Install — ai-chat
working-directory: demos/ai-chat
run: pnpm install

- name: Build
working-directory: demos/${{ matrix.demo }}
- name: Build — ai-chat
working-directory: demos/ai-chat
run: pnpm build
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

- name: Install — blog
working-directory: demos/blog
run: pnpm install

- name: Build — blog
working-directory: demos/blog
run: pnpm build

- name: Install — cms
working-directory: demos/cms
run: pnpm install

- name: Build — cms
working-directory: demos/cms
run: pnpm build

- name: Install — form-builder
working-directory: demos/form-builder
run: pnpm install

- name: Build — form-builder
working-directory: demos/form-builder
run: pnpm build

- name: Install — kanban
working-directory: demos/kanban
run: pnpm install

- name: Build — kanban
working-directory: demos/kanban
run: pnpm build

- name: Install — ui-builder
working-directory: demos/ui-builder
run: pnpm install

- name: Build — ui-builder
working-directory: demos/ui-builder
run: pnpm build
10 changes: 5 additions & 5 deletions demos/ai-chat/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions demos/blog/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions demos/cms/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions demos/form-builder/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions demos/kanban/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions demos/ui-builder/app/view/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,15 @@ function PageLoadingState() {
);
}

function PageErrorState({ error }: { error: Error }) {
function PageErrorState({ error }: { error: unknown }) {
const message = error instanceof Error ? error.message : undefined;
return (
<div className="flex flex-col items-center justify-center py-24 gap-4 text-center px-4">
<AlertCircle className="h-10 w-10 text-destructive" />
<div>
<h3 className="font-semibold text-base">Failed to load page</h3>
<p className="text-sm text-muted-foreground mt-1">
{error?.message || "An unexpected error occurred."}
{message || "An unexpected error occurred."}
</p>
</div>
<Link href="/view" className="text-sm text-primary hover:underline">
Expand Down
10 changes: 5 additions & 5 deletions demos/ui-builder/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions docs/content/docs/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"---[BookOpenCheck]Concepts---",
"cli",
"api-reference",
"standalone-components",
"shadcn-registry",
"---[Play]Demos---",
"demos/index",
Expand Down
21 changes: 9 additions & 12 deletions docs/content/docs/plugins/ui-builder.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,7 @@ Blocks are pre-built component compositions that users can insert as templates.
Create a block registry with reusable templates:

```tsx
import type { BlockRegistry, ComponentLayer } from "@workspace/ui/components/ui-builder/types"
import type { BlockRegistry, ComponentLayer } from "@btst/stack/components/ui-builder"

const myBlocks: BlockRegistry = {
"hero-01": {
Expand Down Expand Up @@ -461,8 +461,7 @@ const myBlocks: BlockRegistry = {
Pass the block registry to the UIBuilder component:

```tsx
import UIBuilder from "@workspace/ui/components/ui-builder"
import { defaultComponentRegistry } from "@btst/stack/plugins/ui-builder/client"
import { UIBuilder, defaultComponentRegistry } from "@btst/stack/components/ui-builder"

function PageEditor() {
return (
Expand Down Expand Up @@ -539,8 +538,7 @@ The `LayerRenderer` component renders pre-fetched ComponentLayer data. Use this
```tsx title="app/pages/[slug]/page.tsx"
"use client"

import { LayerRenderer } from "@workspace/ui/components/ui-builder"
import { defaultComponentRegistry } from "@btst/stack/plugins/ui-builder/client"
import { LayerRenderer, defaultComponentRegistry } from "@btst/stack/components/ui-builder"

export default function DynamicPage({ page, variables }: {
page: ComponentLayer,
Expand Down Expand Up @@ -577,8 +575,7 @@ The `ServerLayerRenderer` is an SSR-friendly renderer that works in React Server

```tsx title="app/pages/[slug]/page.tsx"
// No "use client" needed - this is a Server Component
import { ServerLayerRenderer } from "@workspace/ui/components/ui-builder"
import { defaultComponentRegistry } from "@btst/stack/plugins/ui-builder/client"
import { ServerLayerRenderer, defaultComponentRegistry } from "@btst/stack/components/ui-builder"

export default async function StaticPage({ params }: { params: { slug: string } }) {
// Fetch page data on the server
Expand Down Expand Up @@ -908,10 +905,10 @@ const registry = createComponentRegistry({

#### UIBuilder

The main visual editor component. Import from `@workspace/ui/components/ui-builder`:
The main visual editor component. Import from `@btst/stack/components/ui-builder`:

```tsx
import UIBuilder from "@workspace/ui/components/ui-builder"
import { UIBuilder } from "@btst/stack/components/ui-builder"

<UIBuilder
componentRegistry={myRegistry}
Expand Down Expand Up @@ -968,7 +965,7 @@ Component to render UI Builder pages on public routes (client component):
Component to render pre-fetched ComponentLayer data (client component):

```tsx
import { LayerRenderer } from "@workspace/ui/components/ui-builder"
import { LayerRenderer } from "@btst/stack/components/ui-builder"

<LayerRenderer
page={rootLayer}
Expand All @@ -983,7 +980,7 @@ import { LayerRenderer } from "@workspace/ui/components/ui-builder"
SSR-friendly renderer for React Server Components:

```tsx
import { ServerLayerRenderer } from "@workspace/ui/components/ui-builder"
import { ServerLayerRenderer } from "@btst/stack/components/ui-builder"

// In a Server Component (no "use client" needed)
<ServerLayerRenderer
Expand All @@ -994,7 +991,7 @@ import { ServerLayerRenderer } from "@workspace/ui/components/ui-builder"
/>
```

### Types (`@workspace/ui/components/ui-builder/types`)
### Types (`@btst/stack/components/ui-builder`)

#### BlockDefinition

Expand Down
Loading