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 .github/agents/test-platform.md
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ does not serve silently gets the newest one it does.
`feat(release): v-X.Y.Z` commit on `develop` has its tag: an untagged release is answered by the previous one,
without a word.
2. **What it does serve.** `mcp -McpVersion X.Y.Z` for each. The library tools (`Search*`, `Get*` and `Inspect*` of BlazorUI,
Brouter, Butil, Bswup, Bmotion and - from the first release that ships them - Bink, Balette, BbScanner, Bdnd, BlazeDb, Blow, Bonboarding, Bortable, Blex, Bmage and Bsqlite) and the source tools (`FindBitPlatformSymbols`, `GetBitPlatformSymbolSource`,
Brouter, Butil, Bswup, Bmotion and - from the first release that ships them - Bink, Balette, BbScanner, Bdnd, BlazeDb, Blow, Borm, Bonboarding, Bortable, Blex, Bmage and Bsqlite) and the source tools (`FindBitPlatformSymbols`, `GetBitPlatformSymbolSource`,
`SearchBitPlatformCode`) must all be there. Only the five shared ones (`AskGitHubRepository`,
`SendBitPlatformFeedback`, `microsoft_docs_*`) means no release is served at all, and the README's
*PlatformWebsite's MCP* section says why that happens. The server version it reports is the website's own build,
Expand All @@ -388,7 +388,7 @@ does not serve silently gets the newest one it does.
4. **The answers are good.** Put one real task to each library's `Search` tool, worded the way a developer would
describe it - BlazorUI "a dropdown the user can also type into", Butil "copy text to the clipboard", Bmotion "fade
a list item in", Brouter "a route parameter that must be a number", Bswup "show the download progress of the app's
update", Bink "a signature pad that exports a PNG", Balette "a command that asks for a name before it runs", BbScanner "scan a QR code from an uploaded photo", Bdnd "reorder a list by dragging its items", BlazeDb "a todo list that survives a page reload", Blow "a flow chart that lays itself out left to right", Bonboarding "a step that waits for a panel that loads later", Bortable "a kanban board whose cards move between columns", Blex "a counter whose value survives a page reload", Bmage "shrink an uploaded photo under 200 KB without its location", Bsqlite "keep the database when OPFS is not available" - follow up with the `Get` tool it points to, and ask `SearchBitPlatformCode` about the Boilerplate. An
update", Bink "a signature pad that exports a PNG", Balette "a command that asks for a name before it runs", BbScanner "scan a QR code from an uploaded photo", Bdnd "reorder a list by dragging its items", BlazeDb "a todo list that survives a page reload", Blow "a flow chart that lays itself out left to right", Borm "a field that only shows when a checkbox is ticked", Bonboarding "a step that waits for a panel that loads later", Bortable "a kanban board whose cards move between columns", Blex "a counter whose value survives a page reload", Bmage "shrink an uploaded photo under 200 KB without its location", Bsqlite "keep the database when OPFS is not available" - follow up with the `Get` tool it points to, and ask `SearchBitPlatformCode` about the Boilerplate. An
answer must be on topic, specific and true to the version asked for; one that answers wrongly is a failure too.

Like an E2E failure, an MCP problem is fixed in `src/Websites/Platform` or in the library's own MCP server, and goes
Expand Down
4 changes: 2 additions & 2 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@
## Rules

**RULE 1:** If a task (question, code modification or review) involves the use of bit BlazorUI components (e.g., `BitButton`, `BitTooltip`, `BitTextField`),
or refers to `bitplatform`, `bit Bswup`, `bit Butil`, `bit Bmotion`, `bit Bink`, `bit Balette`, `bit BbScanner`, `bit Bdnd`, `bit BlazeDb`, `bit Blow`, `bit Bonboarding`, `bit Bortable`, `bit Blex`, `bit Bmage`, `bit Bsqlite`, `bit Brouter`, or `bit Boilerplate`, or involves UI components without explicitly specifying their UI toolkit,
you **MUST** use the `bitplatform` MCP server's tools - start with the matching `Search<Library>` tool (e.g. `SearchBitBlazorUI`, `SearchBswup`, `SearchButil`, `SearchBmotion`, `SearchBink`, `SearchBalette`, `SearchBbScanner`, `SearchBdnd`, `SearchBlazeDb`, `SearchBlow`, `SearchBonboarding`, `SearchBortable`, `SearchBlex`, `SearchBmage`, `SearchBsqlite`, `SearchBrouter`) and follow the calls it names - to find the correct implementation and usage patterns before writing or changing any code.
or refers to `bitplatform`, `bit Bswup`, `bit Butil`, `bit Bmotion`, `bit Bink`, `bit Balette`, `bit BbScanner`, `bit Bdnd`, `bit BlazeDb`, `bit Blow`, `bit Borm`, `bit Bonboarding`, `bit Bortable`, `bit Blex`, `bit Bmage`, `bit Bsqlite`, `bit Brouter`, or `bit Boilerplate`, or involves UI components without explicitly specifying their UI toolkit,
you **MUST** use the `bitplatform` MCP server's tools - start with the matching `Search<Library>` tool (e.g. `SearchBitBlazorUI`, `SearchBswup`, `SearchButil`, `SearchBmotion`, `SearchBink`, `SearchBalette`, `SearchBbScanner`, `SearchBdnd`, `SearchBlazeDb`, `SearchBlow`, `SearchBorm`, `SearchBonboarding`, `SearchBortable`, `SearchBlex`, `SearchBmage`, `SearchBsqlite`, `SearchBrouter`) and follow the calls it names - to find the correct implementation and usage patterns before writing or changing any code.

**End of RULE 1**

Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/all.cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,12 @@ jobs:
uses: ./.github/workflows/blow.demo.cd.yml
secrets: inherit

borm_demo:
name: borm demo
if: inputs.server
uses: ./.github/workflows/borm.demo.cd.yml
secrets: inherit

bonboarding_demo:
name: bonboarding demo
if: inputs.server
Expand Down
63 changes: 63 additions & 0 deletions .github/workflows/bit.ci.Borm.e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: bit platform CI - Borm E2E

# The browser suite: the demo (prerendered, then running on WebAssembly) driven in Chromium with Playwright. It
# takes far longer than the build-and-unit pipeline (bit.ci.Borm.yml), so it runs only when started by hand. See
# src/Borm/Tests/Bit.Borm.Tests.E2E/README.md for what it proves and how to run it locally.

on:
workflow_dispatch:

env:
DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: true

permissions:
contents: read

jobs:

e2e:
name: Borm E2E (Chromium)
runs-on: ubuntu-24.04
timeout-minutes: 60

steps:

- name: Checkout source code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Setup .NET 10.0
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
global-json-file: src/global.json

- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 24

- name: dotnet workload restore
run: cd src/Borm && dotnet workload restore

- name: Build the demo and the E2E suite
run: |
dotnet build src/Borm/Demo/Server/Bit.Borm.Demo.Server.csproj -c Release
dotnet build src/Borm/Tests/Bit.Borm.Tests.E2E/Bit.Borm.Tests.E2E.csproj -c Release

- name: Install Playwright Chromium
run: pwsh src/Borm/Tests/Bit.Borm.Tests.E2E/bin/Release/net10.0/playwright.ps1 install --with-deps chromium

- name: Run E2E tests
# Run from inside src so src/global.json's Microsoft.Testing.Platform runner setting applies.
run: >
cd src/Borm/Tests/Bit.Borm.Tests.E2E &&
dotnet test -c Release --no-build
--report-trx --report-trx-filename borm-e2e.trx

- name: Upload test results
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: borm-e2e
path: '**/borm-e2e.trx'
if-no-files-found: ignore
62 changes: 62 additions & 0 deletions .github/workflows/bit.ci.Borm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: bit platform CI - Borm

# Build, unit tests and MCP server tests. The browser suite lives in bit.ci.Borm.e2e.yml and runs on demand only.

on:
workflow_dispatch:
workflow_call:
pull_request:
paths:
- 'src/Borm/**'

env:
DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: true

permissions:
contents: read

jobs:
build-Borm:
if: startsWith(github.event.pull_request.title, 'Prerelease') != true && startsWith(github.event.pull_request.title, 'Release') != true && startsWith(github.event.pull_request.title, 'Version') != true
name: build Bit.Borm
runs-on: ubuntu-24.04

steps:

- name: Checkout source code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Setup .NET 10.0
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
global-json-file: src/global.json

- name: Setup .NET 9.0
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 9.0.x

- name: Setup .NET 8.0
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 8.0.x

- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 24

- name: dotnet workload restore
run: cd src/Borm && dotnet workload restore

- name: dotnet build
run: dotnet build src/Borm/Bit.Borm.slnx

- name: dotnet test
# Run from inside src so src/global.json's "test" runner setting applies
# (from the repo root the SDK falls back to the unsupported VSTest path).
run: cd src/Borm/Tests/Bit.Borm.Tests && dotnet test --no-build

- name: dotnet test (MCP server)
run: cd src/Borm/Tests/Bit.Borm.Tests.Mcp && dotnet test --no-build
75 changes: 75 additions & 0 deletions .github/workflows/borm.demo.cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
name: Borm Demo CD

on:
workflow_dispatch:
workflow_call:

permissions:
contents: read

jobs:

build_blazor_wasm:
name: build blazor wasm
runs-on: ubuntu-24.04

steps:

- name: Checkout source code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Setup .NET
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
global-json-file: src/global.json

- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 24

- name: Install wasm
run: cd src && dotnet workload install wasm-tools

- name: Publish
run: dotnet publish src/Borm/Demo/Server/Bit.Borm.Demo.Server.csproj -c Release -o server -p:Version="${{ vars.APP_VERSION}}" -p:InvariantGlobalization=true

# Server-owned; C:\inetpub keeps its own copies.
- name: Strip server-owned files from bundle
run: rm -fv server/appsettings*.json server/AppCertificate.* server/AppleAuthKey.p8 server/*.pfx

- name: Upload artifact
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: BormDemo
path: server
include-hidden-files: true

deploy_server:
name: deploy
needs: build_blazor_wasm
runs-on: [self-hosted, Windows, X64, bitplatform-iis]
environment:
name: production
url: 'https://borm.bitplatform.dev'

steps:

- name: Checkout deploy action
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
fetch-depth: 1
sparse-checkout: .github/actions

- name: Deploy
uses: ./.github/actions/deploy-to-server
with:
artifact-name: BormDemo
app-pool: Borm
site-path: C:\inetpub\BormDemo
sentinel-file: Bit.Borm.Demo.Server.dll
health-check-url: 'https://borm.bitplatform.dev/'
cloudflare-zone-id: ${{ secrets.CLOUDFLARE_ZONE_ID }}
cloudflare-token: ${{ secrets.CLOUDFLARE_TOKEN }}
11 changes: 11 additions & 0 deletions .github/workflows/nuget.org.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ on:
- 'src/Bink/**'
- 'src/BlazeDb/**'
- 'src/Blow/**'
- 'src/Borm/**'
- 'src/Blex/**'
- 'src/Bmage/**'
- 'src/Bsqlite/**'
Expand Down Expand Up @@ -247,6 +248,16 @@ jobs:
- name: dotnet pack Blow
run: dotnet pack src/Blow/Bit.Blow/Bit.Blow.csproj --output . --configuration Release

- name: dotnet build Borm
run: dotnet build src/Borm/Bit.Borm/Bit.Borm.csproj -c Release -p:GeneratePackageOnBuild=false -p:WarningLevel=0 -p:RunCodeAnalysis=false
- name: dotnet pack Borm
run: dotnet pack src/Borm/Bit.Borm/Bit.Borm.csproj --output . --configuration Release

- name: dotnet build Borm.FluentValidation
run: dotnet build src/Borm/Bit.Borm.FluentValidation/Bit.Borm.FluentValidation.csproj -c Release -p:GeneratePackageOnBuild=false -p:WarningLevel=0 -p:RunCodeAnalysis=false
- name: dotnet pack Borm.FluentValidation
run: dotnet pack src/Borm/Bit.Borm.FluentValidation/Bit.Borm.FluentValidation.csproj --output . --configuration Release

- name: dotnet build Blex
run: dotnet build src/Blex/Bit.Blex/Bit.Blex.csproj -c Release -p:GeneratePackageOnBuild=false -p:WarningLevel=0 -p:RunCodeAnalysis=false
- name: dotnet pack Blex
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/prerelease.nuget.org.yml
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,16 @@ jobs:
- name: dotnet pack Blow
run: dotnet pack src/Blow/Bit.Blow/Bit.Blow.csproj --output . --configuration Release

- name: dotnet build Borm
run: dotnet build src/Borm/Bit.Borm/Bit.Borm.csproj -c Release -p:GeneratePackageOnBuild=false -p:WarningLevel=0 -p:RunCodeAnalysis=false
- name: dotnet pack Borm
run: dotnet pack src/Borm/Bit.Borm/Bit.Borm.csproj --output . --configuration Release

- name: dotnet build Borm.FluentValidation
run: dotnet build src/Borm/Bit.Borm.FluentValidation/Bit.Borm.FluentValidation.csproj -c Release -p:GeneratePackageOnBuild=false -p:WarningLevel=0 -p:RunCodeAnalysis=false
- name: dotnet pack Borm.FluentValidation
run: dotnet pack src/Borm/Bit.Borm.FluentValidation/Bit.Borm.FluentValidation.csproj --output . --configuration Release

- name: dotnet build Blex
run: dotnet build src/Blex/Bit.Blex/Bit.Blex.csproj -c Release -p:GeneratePackageOnBuild=false -p:WarningLevel=0 -p:RunCodeAnalysis=false
- name: dotnet pack Blex
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,8 @@ _book
/src/Blow/Bit.Blow/wwwroot/**/*.js
/src/Blow/Bit.Blow/wwwroot/**/*.css

/src/Borm/Bit.Borm/wwwroot/**/*.css

/src/Blex/Bit.Blex.Blazor/Scripts/**/*.js
/src/Blex/Bit.Blex.Blazor/wwwroot/**/*.js

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ bit new MyApp
- [***Bink***](src/Bink/README.md) (`Bit.Bink`): A Blazor-native drawing and ink library, with pressure- and tilt-aware strokes, brushes, erasers, shapes, annotations, selection, layers, undo/redo, real-time collaboration and SVG/PNG export. The document model and the drawing engine run in C#; the browser only captures input and paints.
- [***Balette***](src/Balette/README.md) (`Bit.Balette`): A Blazor-native, keyboard-first command palette (`Ctrl+K` / `⌘K`), with fzf-style fuzzy search, nested pages, prefix modes, async sources, recents and frecency, global shortcuts and sequences, prompts, multi-select and full theming. Matching and ranking run in C#; the browser only opens the dialog and listens for keys.
- [***Blow***](src/Blow/README.md) (`Bit.Blow`): A Blazor-native library for node-based UIs, editors, flow charts and diagrams - a Blazor counterpart to React Flow - with a pannable, zoomable canvas, draggable, resizable and connectable nodes, sub-flows, auto-layout, alignment guides, undo/redo, copy/paste and full keyboard accessibility. Interaction, layout and geometry run in C#; the browser only measures the DOM.
- [***Borm***](src/Borm/README.md) (`Bit.Borm`): A schema-driven form engine for Blazor. Describe a form once - from a C# type and its DataAnnotations, a strongly typed fluent builder or a JSON Schema document - and it renders, validates and tracks it, with conditional visibility, requiredness and read-only fields, computed values, async and cascading options, multi-step wizards, repeaters, FluentValidation (`Bit.Borm.FluentValidation`) and full theming. Every decision runs in C#; the renderers are plain, accessible HTML with no JavaScript.
- [***Bmage***](src/Bmage/README.md) (`Bit.Bmage`): Browser-side image processing for Blazor. Load, crop, resize, adjust, annotate and export images on the user's device from strongly typed C#, with a full image editor component (`Bit.Bmage.Editor`) and a browser-independent engine (`Bit.Bmage.Core`).
- [***Bmotion***](src/Bmotion/README.md) (`Bit.Bmotion`): A Blazor-native animation library inspired by Motion (Framer Motion), with springs, gestures, keyframes, variants, drag, layout (FLIP) and exit animations. The animation math runs in C#, so there's no JavaScript to wire up.
- [***Bonboarding***](src/Bonboarding/README.md) (`Bit.Bonboarding`): A Blazor-native onboarding and product tour library, with spotlights, collision-aware placement, branching and multi-page tours, persistence and built-in accessibility. Every decision is made in C#; the browser layer only measures and observes.
Expand Down
8 changes: 8 additions & 0 deletions src/Bit.CI.Release.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@
<Project Path="Blow/Bit.Blow/Bit.Blow.csproj" />
<Project Path="Blow/Tests/Bit.Blow.Tests/Bit.Blow.Tests.csproj" />
</Folder>
<Folder Name="/Borm/">
<File Path="Borm/README.md" />
<Project Path="Borm/Demo/Client/Bit.Borm.Demo.Client.csproj" />
<Project Path="Borm/Demo/Server/Bit.Borm.Demo.Server.csproj" />
<Project Path="Borm/Bit.Borm/Bit.Borm.csproj" />
<Project Path="Borm/Bit.Borm.FluentValidation/Bit.Borm.FluentValidation.csproj" />
<Project Path="Borm/Tests/Bit.Borm.Tests/Bit.Borm.Tests.csproj" />
</Folder>
<Folder Name="/Bonboarding/">
<File Path="Bonboarding/README.md" />
<Project Path="Bonboarding/Demo/Client/Bit.Bonboarding.Demo.Client.csproj" />
Expand Down
14 changes: 14 additions & 0 deletions src/Bit.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,20 @@
<Project Path="Blow/Tests/Bit.Blow.Tests.Mcp/Bit.Blow.Tests.Mcp.csproj" />
<Project Path="Blow/Tests/Bit.Blow.Tests.E2E/Bit.Blow.Tests.E2E.csproj" />
</Folder>
<Folder Name="/Borm/">
<File Path="Borm/README.md" />
<Project Path="Borm/Bit.Borm/Bit.Borm.csproj" />
<Project Path="Borm/Bit.Borm.FluentValidation/Bit.Borm.FluentValidation.csproj" />
</Folder>
<Folder Name="/Borm/Demo/">
<Project Path="Borm/Demo/Client/Bit.Borm.Demo.Client.csproj" />
<Project Path="Borm/Demo/Server/Bit.Borm.Demo.Server.csproj" />
</Folder>
<Folder Name="/Borm/Tests/">
<Project Path="Borm/Tests/Bit.Borm.Tests/Bit.Borm.Tests.csproj" />
<Project Path="Borm/Tests/Bit.Borm.Tests.Mcp/Bit.Borm.Tests.Mcp.csproj" />
<Project Path="Borm/Tests/Bit.Borm.Tests.E2E/Bit.Borm.Tests.E2E.csproj" />
</Folder>
<Folder Name="/Bonboarding/">
<File Path="Bonboarding/README.md" />
<Project Path="Bonboarding/Bit.Bonboarding/Bit.Bonboarding.csproj" />
Expand Down
2 changes: 1 addition & 1 deletion src/BlazorUI/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Guidance for the bit BlazorUI component library and its demo app. Coding style c
**`src/BlazorUI` is the edit boundary, and it holds for every task.** The library, Extras, Legacy,
Icons, Assets, the source generators, the demo app and the tests are all inside it, so the work belongs
here. Every sibling under `src/` - `Templates` (the Boilerplate), `Butil`, `Bswup`, `Besql`, `Bmotion`, `Bink`, `Balette`, `BbScanner`,
`Bdnd`, `BlazeDb`, `Blow`, `Bonboarding`, `Bortable`, `Blex`, `Bmage`, `Bsqlite`, `Brouter`, `Websites`, `CodeAnalyzers`, the rest - and the repo root are off limits, no matter what a
`Bdnd`, `BlazeDb`, `Blow`, `Borm`, `Bonboarding`, `Bortable`, `Blex`, `Bmage`, `Bsqlite`, `Brouter`, `Websites`, `CodeAnalyzers`, the rest - and the repo root are off limits, no matter what a
change in here does to them.

This bites hardest on a rename or a deletion in the public API: the Boilerplate consumes bit BlazorUI,
Expand Down
Loading
Loading