From c36b482ccf4cd7585cdc2f4c450d1896c5daa485 Mon Sep 17 00:00:00 2001 From: msynk Date: Tue, 20 Oct 2026 14:40:05 +0330 Subject: [PATCH 1/2] improve utilities demo websites #13977 --- .../Demo/Client/Components/AppPalette.razor | 149 + .../Demo/Client/Components/PaletteBar.razor | 22 + .../Balette/Demo/Client/DocsCatalog.cs | 185 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Demo/Client/Layout/DocsPager.razor | 45 + .../Balette/Demo/Client/Layout/Footer.razor | 76 + .../Demo/Client/Layout/Footer.razor.css | 287 ++ .../Balette/Demo/Client/Layout/Header.razor | 121 + .../Demo/Client/Layout/Header.razor.css | 282 ++ .../Demo/Client/Layout/MainLayout.razor | 148 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Balette/Demo/Client/Layout/NavMenu.razor | 31 - .../Balette/Demo/Client/Pages/Commands.razor | 187 +- .../Demo/Client/Pages/GettingStarted.razor | 188 + .../Balette/Demo/Client/Pages/Home.razor | 456 +- .../Balette/Demo/Client/Pages/Keyboard.razor | 232 +- .../Balette/Demo/Client/Pages/McpServer.razor | 111 +- .../Balette/Demo/Client/Pages/Modes.razor | 264 +- .../Balette/Demo/Client/Pages/NotFound.razor | 20 +- .../Demo/Client/Pages/PagesAndFlows.razor | 231 +- .../Demo/Client/Pages/Performance.razor | 134 +- .../Demo/Client/Pages/SearchAndRanking.razor | 255 +- .../Balette/Demo/Client/Pages/Theming.razor | 243 +- .../Balette/Demo/Client/Routes.razor | 14 +- .../Demo/Client/Services/DemoCommands.cs | 2 + .../Balette/Demo/Client/Services/DemoState.cs | 41 +- .../Balette/Demo/Client/Services/FakeData.cs | 2 +- .../Balette/Demo/Client/_Imports.razor | 1 + .../Server/Bit.Balette.Demo.Server.csproj | 8 +- .../Balette/Demo/Server/Components/App.razor | 52 +- .../Demo/Server/Controllers/McpController.cs | 2 +- .../Demo/Server/Services/BaletteSearchLab.cs | 2 +- .../Demo/Server/Services/BaletteSetupGuide.cs | 15 +- .../Server/Services/BaletteSourceCatalog.cs | 12 +- .../Balette/Demo/Server/wwwroot/app.css | 3115 +++++++++++--- .../Balette/Demo/Server/wwwroot/demo.css | 446 ++ .../Balette/Demo/Server/wwwroot/demo.js | 101 + .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../Balette/Demo/Server/wwwroot/site.js | 470 ++ .../Balette/Demo/Server/wwwroot/theme.js | 100 + .../Bit.Balette.Tests.E2E/DemoPagesTests.cs | 42 +- .../Tests/Bit.Balette.Tests.E2E/FlowTests.cs | 17 +- .../GlobalShortcutTests.cs | 8 +- .../Infrastructure/BaletteTest.cs | 15 +- .../ModesAndSourcesTests.cs | 4 +- .../OpenAndCloseTests.cs | 2 +- .../Tests/Bit.Balette.Tests.E2E/README.md | 12 +- .../ThemingAndLayoutTests.cs | 54 +- .../Bit.Balette.Tests.E2E/TwoPalettesTests.cs | 91 + .../Bit.Balette.Tests.Mcp/McpToolTests.cs | 23 +- .../BbScanner/Demo/Client/DocsCatalog.cs | 188 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Demo/Client/Layout/DocsPager.razor | 45 + .../BbScanner/Demo/Client/Layout/Footer.razor | 76 + .../Demo/Client/Layout/Footer.razor.css | 287 ++ .../BbScanner/Demo/Client/Layout/Header.razor | 121 + .../Demo/Client/Layout/Header.razor.css | 282 ++ .../Demo/Client/Layout/MainLayout.razor | 37 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Demo/Client/Layout/NavMenu.razor | 50 - .../BbScanner/Demo/Client/Pages/Api.razor | 304 +- .../BbScanner/Demo/Client/Pages/Camera.razor | 266 +- .../Demo/Client/Pages/Customize.razor | 261 +- .../BbScanner/Demo/Client/Pages/Errors.razor | 169 +- .../Demo/Client/Pages/GettingStarted.razor | 170 + .../BbScanner/Demo/Client/Pages/Home.razor | 458 +- .../BbScanner/Demo/Client/Pages/Image.razor | 135 +- .../Demo/Client/Pages/Lifecycle.razor | 142 +- .../Demo/Client/Pages/McpServer.razor | 148 +- .../Demo/Client/Pages/NotFound.razor | 15 +- .../Demo/Client/Pages/Performance.razor | 387 +- .../BbScanner/Demo/Client/Pages/Region.razor | 140 +- .../BbScanner/Demo/Client/Pages/Samples.razor | 161 +- .../BbScanner/Demo/Client/Pages/Scan.razor | 423 +- .../BbScanner/Demo/Client/Routes.razor | 8 +- .../Demo/Client/Shared/BarcodeSvg.razor | 39 +- .../Demo/Client/Shared/DiagnosticsPanel.razor | 62 +- .../Demo/Client/Shared/ResultLog.razor | 63 +- .../Demo/Client/Shared/StatusBadge.razor | 20 + .../Server/Bit.BbScanner.Demo.Server.csproj | 6 +- .../Demo/Server/Components/App.razor | 28 +- .../Server/Services/BbScannerSourceCatalog.cs | 3 +- .../BbScanner/Demo/Server/wwwroot/app.css | 3045 +++++++++++-- .../BbScanner/Demo/Server/wwwroot/demo.css | 509 +++ .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../BbScanner/Demo/Server/wwwroot/site.js | 470 ++ .../BbScanner/Demo/Server/wwwroot/theme.js | 100 + .../Infrastructure/ScannerSession.cs | 8 +- .../ScannerInterfaceTests.cs | 5 +- .../Bit.BbScanner.Tests.Mcp/McpToolTests.cs | 16 + .../Client/Components/ConnectionBadge.razor | 34 +- .../Demo/Client/Components/ReplicaPanel.razor | 30 +- .../Bcrdt/Demo/Client/DocsCatalog.cs | 178 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Bcrdt/Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Bcrdt/Demo/Client/Layout/DocsPager.razor | 45 + .../Bcrdt/Demo/Client/Layout/Footer.razor | 76 + .../Bcrdt/Demo/Client/Layout/Footer.razor.css | 287 ++ .../Bcrdt/Demo/Client/Layout/Header.razor | 121 + .../Bcrdt/Demo/Client/Layout/Header.razor.css | 282 ++ .../Bcrdt/Demo/Client/Layout/MainLayout.razor | 32 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Bcrdt/Demo/Client/Layout/NavMenu.razor | 50 - .../Demo/Client/Pages/CollaborativeForm.razor | 207 +- .../Demo/Client/Pages/CollaborativeList.razor | 233 +- .../Demo/Client/Pages/CollaborativeText.razor | 155 +- .../Bcrdt/Demo/Client/Pages/ConflictLab.razor | 129 +- .../Demo/Client/Pages/GettingStarted.razor | 161 + .../Bcrdt/Demo/Client/Pages/Home.razor | 441 +- .../Bcrdt/Demo/Client/Pages/Internals.razor | 227 +- .../Bcrdt/Demo/Client/Pages/Live.razor | 189 +- .../Bcrdt/Demo/Client/Pages/McpServer.razor | 103 +- .../Bcrdt/Demo/Client/Pages/NotFound.razor | 13 +- .../Bcrdt/Demo/Client/Pages/UndoRedo.razor | 165 +- src/Utilities/Bcrdt/Demo/Client/Routes.razor | 8 +- .../Demo/Server/Bit.Bcrdt.Demo.Server.csproj | 5 +- .../Bcrdt/Demo/Server/Components/App.razor | 23 +- .../Server/Services/BcrdtSourceCatalog.cs | 5 +- .../Bcrdt/Demo/Server/wwwroot/app.css | 3057 +++++++++++-- .../Bcrdt/Demo/Server/wwwroot/demo.css | 407 ++ .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../Bcrdt/Demo/Server/wwwroot/site.js | 470 ++ .../Bcrdt/Demo/Server/wwwroot/theme.js | 100 + .../Bit.Bcrdt.Tests.E2E/DemoPagesTests.cs | 11 +- .../Bcrdt/Tests/Bit.Bcrdt.Tests.E2E/README.md | 2 +- .../Bit.Bcrdt.Tests.Mcp/McpOracleTests.cs | 19 +- .../Tests/Bit.Bcrdt.Tests.Mcp/McpToolTests.cs | 2 + .../Demo/Client/Bit.Bdnd.Demo.Client.csproj | 4 +- src/Utilities/Bdnd/Demo/Client/DocsCatalog.cs | 229 + .../Bdnd/Demo/Client/Examples/DemoCode.razor | 8 +- .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Bdnd/Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Bdnd/Demo/Client/Layout/DocsPager.razor | 45 + .../Bdnd/Demo/Client/Layout/Footer.razor | 76 + .../Bdnd/Demo/Client/Layout/Footer.razor.css | 287 ++ .../Bdnd/Demo/Client/Layout/Header.razor | 121 + .../Bdnd/Demo/Client/Layout/Header.razor.css | 282 ++ .../Bdnd/Demo/Client/Layout/MainLayout.razor | 39 +- .../Demo/Client/Layout/MainLayout.razor.css | 87 +- .../Bdnd/Demo/Client/Layout/NavMenu.razor | 103 - .../Bdnd/Demo/Client/Layout/NavMenu.razor.css | 114 - .../Client/Pages/Customize/DropEffects.razor | 22 +- .../Demo/Client/Pages/Customize/Handles.razor | 12 +- .../Client/Pages/DragAround/CustomLayer.razor | 10 +- .../Demo/Client/Pages/DragAround/Naive.razor | 8 +- .../Client/Pages/Dustbin/CopyOrMove.razor | 12 +- .../Demo/Client/Pages/Dustbin/Iframe.razor | 46 +- .../Pages/Dustbin/MultipleTargets.razor | 12 +- .../Client/Pages/Dustbin/SingleTarget.razor | 12 +- .../Client/Pages/Dustbin/StressTest.razor | 22 +- .../Demo/Client/Pages/GettingStarted.razor | 155 + .../Bdnd/Demo/Client/Pages/Home.razor | 386 +- .../Bdnd/Demo/Client/Pages/McpServer.razor | 105 +- .../Client/Pages/Nesting/DragSources.razor | 12 +- .../Client/Pages/Nesting/DropTargets.razor | 19 +- .../Bdnd/Demo/Client/Pages/NotFound.razor | 13 +- .../Demo/Client/Pages/Other/NativeFiles.razor | 50 +- .../Demo/Client/Pages/Other/NativeHtml.razor | 18 +- .../Pages/Sortable/CancelOnDropOutside.razor | 14 +- .../Demo/Client/Pages/Sortable/Simple.razor | 14 +- .../Client/Pages/Sortable/StressTest.razor | 14 +- .../Bdnd/Demo/Client/Pages/Tutorial.razor | 14 +- src/Utilities/Bdnd/Demo/Client/Routes.razor | 10 +- .../Bdnd/Demo/Server/Components/App.razor | 31 +- .../Demo/Server/Services/BdndSourceCatalog.cs | 6 +- .../Bdnd/Demo/Server/wwwroot/app.css | 3037 +++++++++++-- .../Bdnd/Demo/Server/wwwroot/demo.css | 393 ++ .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../Bdnd/Demo/Server/wwwroot/site.js | 470 ++ .../Bdnd/Demo/Server/wwwroot/theme.js | 100 + .../Bit.Bdnd.Tests.E2E/DemoPagesTests.cs | 17 +- .../Tests/Bit.Bdnd.Tests.E2E/DustbinTests.cs | 2 +- .../Infrastructure/BdndTest.cs | 4 +- .../Bit.Bdnd.Tests.Mcp/McpOracleTests.cs | 15 +- .../Belemetry/Demo/Client/DocsCatalog.cs | 241 ++ .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Demo/Client/Layout/DocsPager.razor | 45 + .../Belemetry/Demo/Client/Layout/Footer.razor | 76 + .../Demo/Client/Layout/Footer.razor.css | 287 ++ .../Belemetry/Demo/Client/Layout/Header.razor | 121 + .../Demo/Client/Layout/Header.razor.css | 282 ++ .../Demo/Client/Layout/MainLayout.razor | 181 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Demo/Client/Pages/AzureMappingPage.razor | 63 +- .../Demo/Client/Pages/AzureMonitorPage.razor | 47 +- .../Demo/Client/Pages/BrowserPage.razor | 245 +- .../Demo/Client/Pages/ConfigurationPage.razor | 123 +- .../Demo/Client/Pages/ConsentPage.razor | 148 +- .../Demo/Client/Pages/DotnetPage.razor | 134 +- .../Demo/Client/Pages/ErrorPage.razor | 28 +- .../Demo/Client/Pages/ExportersPage.razor | 39 +- .../Belemetry/Demo/Client/Pages/Home.razor | 523 +-- .../Demo/Client/Pages/HybridPage.razor | 55 +- .../Demo/Client/Pages/LiveTelemetryPage.razor | 88 +- .../Demo/Client/Pages/McpServerPage.razor | 265 +- .../Demo/Client/Pages/NotFound.razor | 18 + .../Demo/Client/Pages/NotFoundPage.razor | 9 - .../Demo/Client/Pages/OtlpPage.razor | 73 +- .../Demo/Client/Pages/PersistencePage.razor | 134 +- .../Demo/Client/Pages/PrivacyPage.razor | 90 +- .../Demo/Client/Pages/ProcessorsPage.razor | 84 +- .../Pages/SemanticConventionsPage.razor | 73 +- .../Client/Pages/ServerPipelinePage.razor | 112 +- .../Client/Pages/StandaloneWasmPage.razor | 53 +- .../Demo/Client/Pages/TransportPage.razor | 76 +- .../Demo/Client/Pages/WebAppPage.razor | 65 +- .../Belemetry/Demo/Client/Routes.razor | 13 +- .../Demo/Client/Services/DemoNoiseFilter.cs | 16 +- .../Demo/Client/Shared/ApiTable.razor | 30 +- .../Demo/Client/Shared/AppFooter.razor | 78 - .../Demo/Client/Shared/AppHeader.razor | 127 - .../Demo/Client/Shared/AppNavPanel.razor | 81 - .../Demo/Client/Shared/CodeSnippet.razor | 81 +- .../Demo/Client/Shared/CommandPalette.razor | 200 - .../Demo/Client/Shared/ConsentBanner.razor | 12 +- .../Demo/Client/Shared/DocBreadcrumb.razor | 22 - .../Demo/Client/Shared/DocPager.razor | 47 - .../Belemetry/Demo/Client/Shared/Icon.razor | 17 - .../Belemetry/Demo/Client/Shared/Icons.cs | 125 - .../Belemetry/Demo/Client/Shared/NavItem.cs | 192 - .../Demo/Client/Shared/NotFoundContent.razor | 21 - .../Demo/Client/Shared/SideRail.razor | 119 - .../Demo/Client/Shared/SyntaxHighlighter.cs | 19 +- .../Client/Shared/TelemetryFeedView.razor | 31 +- .../Server/Bit.Belemetry.Demo.Server.csproj | 6 +- .../Demo/Server/Components/App.razor | 71 +- .../Server/Services/BelemetrySearchIndex.cs | 10 +- .../Belemetry/Demo/Server/wwwroot/app.css | 2820 ++++++++++++ .../Belemetry/Demo/Server/wwwroot/css/app.css | 2017 --------- .../Demo/Server/wwwroot/css/belemetry.css | 496 --- .../Demo/Server/wwwroot/css/docs.css | 515 --- .../Demo/Server/wwwroot/css/theme.css | 451 -- .../Belemetry/Demo/Server/wwwroot/demo.css | 506 +++ .../Belemetry/Demo/Server/wwwroot/demo.js | 68 + .../Server/wwwroot/images/bit-logo-dark.svg | 2 +- .../Server/wwwroot/images/bit-logo-light.svg | 2 +- .../wwwroot/images/footer/github-icon.svg | 2 +- .../wwwroot/images/footer/linkedin-icon.svg | 2 +- .../wwwroot/images/footer/location-icon.svg | 2 +- .../Server/wwwroot/images/footer/tel-icon.svg | 2 +- .../wwwroot/images/footer/twitter-icon.svg | 2 +- .../wwwroot/images/footer/youtube-icon.svg | 2 +- .../Server/wwwroot/images/github-mark.svg | 2 +- .../Belemetry/Demo/Server/wwwroot/js/demo.js | 440 -- .../Belemetry/Demo/Server/wwwroot/site.js | 470 ++ .../Belemetry/Demo/Server/wwwroot/theme.js | 100 + .../Client/Components/ErrorScenarios.razor | 22 +- .../Demo/Client/Components/FilterBar.razor | 10 +- .../Demo/Client/Components/LiveClock.razor | 4 +- .../Demo/Client/Components/ProblemCard.razor | 19 +- .../Demo/Client/Components/ProductList.razor | 26 +- .../Demo/Client/Components/ProductRow.razor | 6 +- .../Demo/Client/Components/RecentOrders.razor | 34 +- .../Client/Components/RendererStatus.razor | 12 + .../Demo/Client/Components/StatsCard.razor | 8 +- .../Demo/Client/Components/UserProfile.razor | 10 +- .../BevTools/Demo/Client/DocsCatalog.cs | 180 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Demo/Client/Layout/DocsPager.razor | 45 + .../BevTools/Demo/Client/Layout/Footer.razor | 76 + .../Demo/Client/Layout/Footer.razor.css | 287 ++ .../BevTools/Demo/Client/Layout/Header.razor | 121 + .../Demo/Client/Layout/Header.razor.css | 282 ++ .../Demo/Client/Layout/MainLayout.razor | 51 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../BevTools/Demo/Client/Layout/NavMenu.razor | 13 - .../Client/Layout/ReconnectModal.razor.css | 107 +- .../BevTools/Demo/Client/Models/DemoModels.cs | 7 +- .../BevTools/Demo/Client/Pages/Checkout.razor | 168 +- .../BevTools/Demo/Client/Pages/Circuit.razor | 75 +- .../BevTools/Demo/Client/Pages/Counter.razor | 49 +- .../Demo/Client/Pages/Dashboard.razor | 117 + .../BevTools/Demo/Client/Pages/Errors.razor | 93 +- .../Demo/Client/Pages/GettingStarted.razor | 120 + .../BevTools/Demo/Client/Pages/Home.razor | 383 +- .../BevTools/Demo/Client/Pages/Interop.razor | 87 +- .../BevTools/Demo/Client/Pages/NotFound.razor | 13 +- .../BevTools/Demo/Client/Pages/Orders.razor | 107 +- .../BevTools/Demo/Client/Pages/Problems.razor | 45 +- .../BevTools/Demo/Client/Pages/Products.razor | 79 +- .../BevTools/Demo/Client/Routes.razor | 29 +- .../BevTools/Demo/Server/Components/App.razor | 29 + .../Demo/Server/Components/Pages/Error.razor | 35 +- .../BevTools/Demo/Server/wwwroot/app.css | 2870 ++++++++++++- .../BevTools/Demo/Server/wwwroot/demo.css | 399 ++ .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../BevTools/Demo/Server/wwwroot/site.js | 470 ++ .../BevTools/Demo/Server/wwwroot/theme.js | 100 + src/Utilities/Bink/Demo/Client/DocsCatalog.cs | 183 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Bink/Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Bink/Demo/Client/Layout/DocsPager.razor | 45 + .../Bink/Demo/Client/Layout/Footer.razor | 76 + .../Bink/Demo/Client/Layout/Footer.razor.css | 287 ++ .../Bink/Demo/Client/Layout/Header.razor | 121 + .../Bink/Demo/Client/Layout/Header.razor.css | 282 ++ .../Bink/Demo/Client/Layout/MainLayout.razor | 35 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Bink/Demo/Client/Layout/NavMenu.razor | 33 - .../Demo/Client/Pages/Collaboration.razor | 193 +- .../Bink/Demo/Client/Pages/Diagram.razor | 110 +- .../Client/Pages/DocumentAnnotation.razor | 119 +- .../Demo/Client/Pages/GettingStarted.razor | 162 + .../Bink/Demo/Client/Pages/Handwriting.razor | 96 +- .../Bink/Demo/Client/Pages/Home.razor | 413 +- .../Demo/Client/Pages/ImageAnnotation.razor | 92 +- .../Bink/Demo/Client/Pages/McpServer.razor | 128 +- .../Bink/Demo/Client/Pages/NotFound.razor | 14 +- .../Bink/Demo/Client/Pages/Performance.razor | 94 +- .../Demo/Client/Pages/SerializationPage.razor | 166 +- .../Bink/Demo/Client/Pages/Signature.razor | 120 +- .../Bink/Demo/Client/Pages/Whiteboard.razor | 154 +- src/Utilities/Bink/Demo/Client/Routes.razor | 8 +- .../Demo/Client/Shared/CanvasStatus.razor | 16 +- .../Demo/Client/Shared/ColorSwatches.razor | 8 +- .../Demo/Client/Shared/DrawingToolbar.razor | 52 +- .../Demo/Client/Shared/PresenceOverlay.razor | 8 +- .../Demo/Server/Bit.Bink.Demo.Server.csproj | 6 +- .../Bink/Demo/Server/Components/App.razor | 25 +- .../Demo/Server/Services/BinkSourceCatalog.cs | 3 +- .../Bink/Demo/Server/wwwroot/app.css | 2984 +++++++++++-- .../Bink/Demo/Server/wwwroot/demo.css | 505 +++ .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../Bink/Demo/Server/wwwroot/site.js | 470 ++ .../Bink/Demo/Server/wwwroot/theme.js | 100 + .../Bit.Bink.Tests.E2E/DemoRegressionTests.cs | 8 +- .../Bit.Bink.Tests.E2E/DisplayAndDemoTests.cs | 7 +- .../Tests/Bit.Bink.Tests.E2E/DrawingTests.cs | 2 +- .../Infrastructure/BinkTest.cs | 2 +- .../Tests/Bit.Bink.Tests.Mcp/McpToolTests.cs | 4 + .../Demo/Client/Components/AppInterop.cs | 67 - .../Demo/Client/Components/Callout.razor | 29 +- .../Demo/Client/Components/CodeBlock.razor | 51 +- .../BlazeDb/Demo/Client/Components/Icon.razor | 124 +- .../Demo/Client/Components/PageHeader.razor | 21 +- .../Demo/Client/Components/Panel.razor | 56 +- .../Client/Components/ScenarioSteps.razor | 36 +- .../Demo/Client/Components/Section.razor | 28 +- .../BlazeDb/Demo/Client/Components/SiteMap.cs | 61 - .../Demo/Client/Components/StatTile.razor | 28 +- .../Client/Components/StorageStatus.razor | 66 + .../Demo/Client/Components/ThemeToggle.razor | 18 - .../BlazeDb/Demo/Client/Components/Tones.cs | 29 + .../BlazeDb/Demo/Client/DocsCatalog.cs | 196 + .../IServiceCollectionExtensions.cs | 4 +- .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Demo/Client/Layout/DocsPager.razor | 45 + .../BlazeDb/Demo/Client/Layout/Footer.razor | 76 + .../Demo/Client/Layout/Footer.razor.css | 287 ++ .../BlazeDb/Demo/Client/Layout/Header.razor | 121 + .../Demo/Client/Layout/Header.razor.css | 282 ++ .../Demo/Client/Layout/MainLayout.razor | 140 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../BlazeDb/Demo/Client/Layout/NavMenu.razor | 21 - .../Demo/Client/Pages/Benchmarks.razor | 159 +- .../Demo/Client/Pages/Durability.razor | 111 +- .../BlazeDb/Demo/Client/Pages/EfCore.razor | 151 +- .../BlazeDb/Demo/Client/Pages/Errors.razor | 83 +- .../Demo/Client/Pages/GettingStarted.razor | 223 + .../BlazeDb/Demo/Client/Pages/Home.razor | 575 +-- .../BlazeDb/Demo/Client/Pages/Indexes.razor | 236 +- .../BlazeDb/Demo/Client/Pages/McpServer.razor | 75 +- .../BlazeDb/Demo/Client/Pages/NotFound.razor | 23 +- .../BlazeDb/Demo/Client/Pages/Queries.razor | 218 +- .../BlazeDb/Demo/Client/Pages/Roadmap.razor | 110 +- .../BlazeDb/Demo/Client/Pages/Schema.razor | 144 +- .../Demo/Client/Pages/StorageBackends.razor | 153 +- .../BlazeDb/Demo/Client/Pages/Todos.razor | 464 +- .../Demo/Client/Pages/Transactions.razor | 117 +- .../Demo/Client/Pages/WireFormat.razor | 204 +- .../BlazeDb/Demo/Client/Routes.razor | 13 +- .../BlazeDb/Demo/Client/wwwroot/js/app.js | 51 - .../Server/Bit.BlazeDb.Demo.Server.csproj | 10 +- .../BlazeDb/Demo/Server/Components/App.razor | 53 +- .../BlazeDb/Demo/Server/wwwroot/app.css | 3772 +++++++++++------ .../BlazeDb/Demo/Server/wwwroot/demo.css | 1065 +++++ .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../BlazeDb/Demo/Server/wwwroot/site.js | 470 ++ .../BlazeDb/Demo/Server/wwwroot/theme.js | 100 + src/Utilities/BlazeDb/README.md | 3 +- .../Bit.BlazeDb.Tests.E2E/DemoPageTests.cs | 20 +- .../Infrastructure/BlazeDbTest.cs | 7 +- .../Bit.BlazeDb.Tests.E2E/PersistenceTests.cs | 8 +- .../Tests/Bit.BlazeDb.Tests.E2E/README.md | 7 +- .../Bit.BlazeDb.Tests.Mcp/McpToolTests.cs | 3 + .../Demo/Client/Components/ApiTable.razor | 46 +- .../Blex/Demo/Client/Components/Callout.razor | 29 +- .../Demo/Client/Components/CodeBlock.razor | 80 +- .../Demo/Client/Components/DemoCard.razor | 28 +- .../Blex/Demo/Client/Components/DocPage.razor | 72 +- .../Client/Components/InspectorDock.razor | 59 +- .../Client/Components/SelectorWatcher.razor | 22 +- .../Client/Components/WholeStoreWatcher.razor | 22 +- src/Utilities/Blex/Demo/Client/DocsCatalog.cs | 227 + src/Utilities/Blex/Demo/Client/DocsNav.cs | 102 - .../IServiceCollectionExtensions.cs | 3 +- .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Blex/Demo/Client/Layout/DocsLayout.razor | 190 +- .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Blex/Demo/Client/Layout/DocsPager.razor | 45 + .../Blex/Demo/Client/Layout/Footer.razor | 76 + .../Blex/Demo/Client/Layout/Footer.razor.css | 287 ++ .../Blex/Demo/Client/Layout/Header.razor | 121 + .../Blex/Demo/Client/Layout/Header.razor.css | 282 ++ .../Blex/Demo/Client/Layout/MainLayout.razor | 30 + .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Blex/Demo/Client/Layout/NavSidebar.razor | 40 - .../Blex/Demo/Client/Pages/Actions.razor | 354 +- .../Blex/Demo/Client/Pages/ApiReference.razor | 218 +- .../Blex/Demo/Client/Pages/Computed.razor | 226 +- .../Blex/Demo/Client/Pages/CrossStore.razor | 387 +- .../Blex/Demo/Client/Pages/DevTools.razor | 428 +- .../Blex/Demo/Client/Pages/Diagnostics.razor | 125 +- .../Blex/Demo/Client/Pages/Effects.razor | 541 +-- .../Blex/Demo/Client/Pages/Entities.razor | 359 +- .../Blex/Demo/Client/Pages/ErrorPage.razor | 13 +- .../Blex/Demo/Client/Pages/Errors.razor | 264 +- .../Blex/Demo/Client/Pages/History.razor | 513 +-- .../Blex/Demo/Client/Pages/Home.razor | 352 ++ .../Blex/Demo/Client/Pages/Installation.razor | 196 +- .../Blex/Demo/Client/Pages/Introduction.razor | 239 +- .../Blex/Demo/Client/Pages/McpServer.razor | 73 +- .../Blex/Demo/Client/Pages/Middleware.razor | 440 +- .../Blex/Demo/Client/Pages/NotFound.razor | 18 + .../Blex/Demo/Client/Pages/NotFoundPage.razor | 10 - .../Blex/Demo/Client/Pages/Persistence.razor | 536 +-- .../Blex/Demo/Client/Pages/QuickStart.razor | 186 +- .../Blex/Demo/Client/Pages/Stores.razor | 318 +- .../Demo/Client/Pages/Subscriptions.razor | 358 +- .../Blex/Demo/Client/Pages/Testing.razor | 270 +- src/Utilities/Blex/Demo/Client/Routes.razor | 13 +- .../Blex/Demo/Client/Services/ThemeService.cs | 54 - .../Demo/Server/Bit.Blex.Demo.Server.csproj | 8 +- .../Blex/Demo/Server/Components/App.razor | 52 +- .../Demo/Server/Services/DocsPageRenderer.cs | 54 +- .../Blex/Demo/Server/wwwroot/app.css | 2820 ++++++++++++ .../Blex/Demo/Server/wwwroot/css/site.css | 892 ---- .../Blex/Demo/Server/wwwroot/demo.css | 432 ++ .../Blex/Demo/Server/wwwroot/demo.js | 11 + .../Blex/Demo/Server/wwwroot/favicon.svg | 2 +- .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../Blex/Demo/Server/wwwroot/js/site.js | 45 - .../Blex/Demo/Server/wwwroot/site.js | 470 ++ .../Blex/Demo/Server/wwwroot/theme.js | 100 + .../Demo/Client/Bit.Blow.Demo.Client.csproj | 4 +- src/Utilities/Blow/Demo/Client/DocsCatalog.cs | 212 + .../Blow/Demo/Client/Examples/DemoCode.razor | 8 +- .../Demo/Client/Examples/ExampleCatalog.cs | 268 +- .../Client/Examples/ExampleScaffold.razor | 31 +- .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Blow/Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Blow/Demo/Client/Layout/DocsPager.razor | 45 + .../Demo/Client/Layout/ExamplesLayout.razor | 70 - .../Client/Layout/ExamplesLayout.razor.css | 198 - .../Blow/Demo/Client/Layout/Footer.razor | 76 + .../Blow/Demo/Client/Layout/Footer.razor.css | 287 ++ .../Blow/Demo/Client/Layout/Header.razor | 121 + .../Blow/Demo/Client/Layout/Header.razor.css | 282 ++ .../Blow/Demo/Client/Layout/MainLayout.razor | 39 +- .../Demo/Client/Layout/MainLayout.razor.css | 87 +- .../Blow/Demo/Client/Layout/NavMenu.razor | 73 - .../Blow/Demo/Client/Layout/NavMenu.razor.css | 104 - .../Demo/Client/Pages/AddNodeOnDropDemo.razor | 33 +- .../Blow/Demo/Client/Pages/Advanced.razor | 74 +- .../Blow/Demo/Client/Pages/BasicFlow.razor | 71 + .../Client/Pages/ConnectionLineDemo.razor | 90 +- .../Blow/Demo/Client/Pages/CustomEdges.razor | 72 +- .../Blow/Demo/Client/Pages/CustomNodes.razor | 66 +- .../Demo/Client/Pages/DragThresholdDemo.razor | 43 +- .../Blow/Demo/Client/Pages/EdgeTypes.razor | 22 +- .../Client/Pages/Examples/A11yExample.razor | 2 +- .../Examples/AddNodeOnEdgeDropExample.razor | 2 +- .../Examples/AlignDistributeExample.razor | 30 +- .../Examples/AlignmentGuidesExample.razor | 4 +- .../Pages/Examples/AutoPanExample.razor | 4 +- .../Pages/Examples/BackgroundsExample.razor | 4 +- .../Client/Pages/Examples/BasicExample.razor | 2 +- .../Pages/Examples/BrokenNodesExample.razor | 4 +- .../Examples/BuiltInUndoRedoExample.razor | 16 +- .../Examples/CancelConnectionExample.razor | 4 +- .../Pages/Examples/ClickDistanceExample.razor | 4 +- .../Pages/Examples/ColorModeExample.razor | 29 +- .../Examples/ConnectionModeExample.razor | 2 +- .../Examples/ConnectionRulesExample.razor | 6 +- .../ControlledUncontrolledExample.razor | 8 +- .../Examples/ControlledViewportExample.razor | 10 +- .../Pages/Examples/CopyPasteExample.razor | 12 +- .../CustomConnectionLineExample.razor | 2 +- .../Pages/Examples/CustomEdgesExample.razor | 2 +- .../Examples/CustomMiniMapNodeExample.razor | 5 +- .../Pages/Examples/CustomNodeExample.razor | 6 +- .../DefaultEdgeOverwriteExample.razor | 2 +- .../DefaultNodeOverwriteExample.razor | 2 +- .../Pages/Examples/DefaultNodesExample.razor | 4 +- .../Examples/DeleteProtectionExample.razor | 8 +- .../Pages/Examples/DevToolsExample.razor | 5 +- .../Pages/Examples/DiagnosticsExample.razor | 12 +- .../Pages/Examples/DragHandleExample.razor | 4 +- .../Pages/Examples/DragNDropExample.razor | 13 +- .../Pages/Examples/EasyConnectExample.razor | 4 +- .../Examples/EdgeLabelStylingExample.razor | 4 +- .../Pages/Examples/EdgeMarkersExample.razor | 2 +- .../Examples/EdgePathOptionsExample.razor | 2 +- .../Pages/Examples/EdgeRendererExample.razor | 10 +- .../Pages/Examples/EdgeToolbarExample.razor | 10 +- .../Pages/Examples/EdgeTypesExample.razor | 2 +- .../Client/Pages/Examples/EdgesExample.razor | 2 +- .../Pages/Examples/EditableNodeExample.razor | 11 +- .../Client/Pages/Examples/EmptyExample.razor | 8 +- .../Client/Pages/Examples/ExamplesIndex.razor | 58 +- .../Pages/Examples/FloatingEdgesExample.razor | 4 +- .../Examples/HandlePositionsExample.razor | 8 +- .../Pages/Examples/HandleRulesExample.razor | 8 +- .../Client/Pages/Examples/HiddenExample.razor | 2 +- .../Pages/Examples/InteractionExample.razor | 2 +- .../Examples/InteractionGuardsExample.razor | 6 +- .../Examples/InteractiveMinimapExample.razor | 2 +- .../Pages/Examples/IntersectionExample.razor | 8 +- .../Pages/Examples/KeyBindingsExample.razor | 2 +- .../Pages/Examples/KeyboardA11yExample.razor | 4 +- .../Pages/Examples/LayoutingExample.razor | 8 +- .../Pages/Examples/LocalizationExample.razor | 4 +- .../Pages/Examples/MovingHandlesExample.razor | 8 +- .../Pages/Examples/MultiFlowsExample.razor | 15 +- .../Pages/Examples/MultiSetNodesExample.razor | 16 +- .../Pages/Examples/NodeExtentExample.razor | 8 +- .../Pages/Examples/NodeResizerExample.razor | 10 +- .../Pages/Examples/NodeToolbarExample.razor | 18 +- .../Examples/NodeTypeChangeExample.razor | 6 +- .../Pages/Examples/OverlayLayoutExample.razor | 6 +- .../Pages/Examples/OverviewExample.razor | 9 +- .../Pages/Examples/ProviderExample.razor | 15 +- .../Pages/Examples/ReconnectEdgeExample.razor | 4 +- .../Client/Pages/Examples/ReduxExample.razor | 10 +- .../Examples/ResponsiveCanvasExample.razor | 14 +- .../Pages/Examples/SaveRestoreExample.razor | 10 +- .../Examples/SelectionGesturesExample.razor | 6 +- .../Pages/Examples/SelfLoopEdgesExample.razor | 4 +- .../Examples/SetNodesBatchingExample.razor | 10 +- .../Client/Pages/Examples/StressExample.razor | 4 +- .../Pages/Examples/SubflowExample.razor | 2 +- .../Pages/Examples/TouchDeviceExample.razor | 4 +- .../Pages/Examples/UndoRedoExample.razor | 10 +- .../Pages/Examples/UpdateNodeExample.razor | 15 +- .../Pages/Examples/UseConnectionExample.razor | 4 +- .../Pages/Examples/UseKeyPressExample.razor | 4 +- .../Examples/UseNodeConnectionsExample.razor | 4 +- .../Pages/Examples/UseNodesDataExample.razor | 2 +- .../UseOnSelectionChangeExample.razor | 2 +- .../Pages/Examples/UseReactFlowExample.razor | 14 +- .../UseUpdateNodeInternalsExample.razor | 6 +- .../Pages/Examples/ValidationExample.razor | 2 +- .../Examples/ViewportTransitionsExample.razor | 12 +- .../Pages/Examples/ZIndexModeExample.razor | 10 +- .../Demo/Client/Pages/Examples/_Imports.razor | 2 - .../Blow/Demo/Client/Pages/Extras.razor | 130 +- .../Demo/Client/Pages/FloatingEdgesDemo.razor | 79 +- .../Demo/Client/Pages/GettingStarted.razor | 165 + .../Blow/Demo/Client/Pages/Home.razor | 390 +- .../Blow/Demo/Client/Pages/Interactions.razor | 126 +- .../Demo/Client/Pages/LabelsAndHandles.razor | 81 +- .../Blow/Demo/Client/Pages/McpServer.razor | 170 +- .../Blow/Demo/Client/Pages/MiniMapDemo.razor | 65 +- .../Blow/Demo/Client/Pages/NotFound.razor | 13 +- src/Utilities/Blow/Demo/Client/Routes.razor | 10 +- .../Blow/Demo/Server/Components/App.razor | 28 +- .../Demo/Server/Services/BlowSourceCatalog.cs | 6 +- .../Blow/Demo/Server/wwwroot/app.css | 2939 ++++++++++++- .../Blow/Demo/Server/wwwroot/demo.css | 146 + .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../Blow/Demo/Server/wwwroot/site.js | 470 ++ .../Blow/Demo/Server/wwwroot/theme.js | 100 + src/Utilities/Blow/README.md | 9 +- .../Bit.Blow.Tests.E2E/DemoPagesTests.cs | 30 +- .../Tests/Bit.Blow.Tests.E2E/GestureTests.cs | 30 +- .../Tests/Bit.Blow.Tests.E2E/GuardTests.cs | 2 +- .../Infrastructure/BlowTest.cs | 10 +- .../Tests/Bit.Blow.Tests.E2E/KeyboardTests.cs | 8 +- .../Blow/Tests/Bit.Blow.Tests.E2E/README.md | 4 +- .../Bit.Blow.Tests.E2E/RenderingTests.cs | 6 +- .../Bmage/Demo/Client/DocsCatalog.cs | 206 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Bmage/Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Bmage/Demo/Client/Layout/DocsPager.razor | 45 + .../Bmage/Demo/Client/Layout/Footer.razor | 76 + .../Bmage/Demo/Client/Layout/Footer.razor.css | 287 ++ .../Bmage/Demo/Client/Layout/Header.razor | 121 + .../Bmage/Demo/Client/Layout/Header.razor.css | 282 ++ .../Bmage/Demo/Client/Layout/MainLayout.razor | 180 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Bmage/Demo/Client/Pages/Annotate.razor | 49 +- .../Bmage/Demo/Client/Pages/Avatar.razor | 264 +- .../Bmage/Demo/Client/Pages/Batch.razor | 260 +- .../Demo/Client/Pages/Capabilities.razor | 67 +- .../Bmage/Demo/Client/Pages/Editor.razor | 141 +- .../Bmage/Demo/Client/Pages/ErrorPage.razor | 26 +- .../Bmage/Demo/Client/Pages/Formats.razor | 85 +- .../Demo/Client/Pages/GettingStarted.razor | 83 +- .../Bmage/Demo/Client/Pages/Headless.razor | 85 +- .../Bmage/Demo/Client/Pages/Home.razor | 636 ++- .../Bmage/Demo/Client/Pages/Hosting.razor | 66 +- .../Demo/Client/Pages/McpServerPage.razor | 494 +-- .../Bmage/Demo/Client/Pages/Metadata.razor | 81 +- .../Bmage/Demo/Client/Pages/NotFound.razor | 18 + .../Demo/Client/Pages/NotFoundPage.razor | 9 - .../Bmage/Demo/Client/Pages/Optimize.razor | 264 +- .../Bmage/Demo/Client/Pages/Performance.razor | 131 +- .../Bmage/Demo/Client/Pages/Pipelines.razor | 222 +- .../Bmage/Demo/Client/Pages/Product.razor | 208 +- .../Bmage/Demo/Client/Pages/Social.razor | 192 +- src/Utilities/Bmage/Demo/Client/Routes.razor | 14 +- .../Bmage/Demo/Client/Shared/AppFooter.razor | 78 - .../Bmage/Demo/Client/Shared/AppHeader.razor | 127 - .../Demo/Client/Shared/AppNavPanel.razor | 81 - .../Demo/Client/Shared/CodeSnippet.razor | 87 +- .../Demo/Client/Shared/CommandPalette.razor | 200 - .../Demo/Client/Shared/DocBreadcrumb.razor | 22 - .../Bmage/Demo/Client/Shared/DocPager.razor | 47 - .../Bmage/Demo/Client/Shared/Icons.cs | 100 +- .../Bmage/Demo/Client/Shared/NavItem.cs | 178 - .../Demo/Client/Shared/NotFoundContent.razor | 21 - .../Bmage/Demo/Client/Shared/SideRail.razor | 119 - .../Demo/Client/Shared/SyntaxHighlighter.cs | 17 +- .../Bmage/Demo/Server/Components/App.razor | 66 +- .../Demo/Server/Controllers/McpController.cs | 4 +- .../Bmage/Demo/Server/Dtos/BmageMcpDtos.cs | 8 +- .../Demo/Server/Services/BmageSearchIndex.cs | 10 +- .../Server/Services/BmageSourceCatalog.cs | 37 +- .../Bmage/Demo/Server/wwwroot/app.css | 2820 ++++++++++++ .../Bmage/Demo/Server/wwwroot/css/app.css | 2020 --------- .../Demo/Server/wwwroot/css/bmage-samples.css | 1399 ------ .../Demo/Server/wwwroot/css/editor-theme.css | 50 - .../Bmage/Demo/Server/wwwroot/css/theme.css | 388 -- .../Bmage/Demo/Server/wwwroot/demo.css | 895 ++++ .../Bmage/Demo/Server/wwwroot/js/demo.js | 376 -- .../Bmage/Demo/Server/wwwroot/site.js | 470 ++ .../Bmage/Demo/Server/wwwroot/theme.js | 100 + .../Tests/Bit.Bmage.Tests.E2E/BrowserTests.cs | 22 +- .../DemoRegressionTests.cs | 12 +- .../Infrastructure/DemoTest.cs | 2 +- .../Services/RecipeCatalogTests.cs | 4 +- .../Services/SourceCatalogTests.cs | 32 +- .../Bmotion/Demo/Client/DocsCatalog.cs | 230 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Demo/Client/Layout/DocsPager.razor | 45 + .../Bmotion/Demo/Client/Layout/Footer.razor | 76 + .../Demo/Client/Layout/Footer.razor.css | 287 ++ .../Bmotion/Demo/Client/Layout/Header.razor | 121 + .../Demo/Client/Layout/Header.razor.css | 282 ++ .../Demo/Client/Layout/MainLayout.razor | 179 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Demo/Client/Pages/Accessibility.razor | 112 +- .../Client/Pages/AnimatePresencePage.razor | 124 +- .../Demo/Client/Pages/BasicAnimations.razor | 57 +- .../Demo/Client/Pages/ColorSpaces.razor | 51 +- .../Bmotion/Demo/Client/Pages/CssProps.razor | 194 +- .../Bmotion/Demo/Client/Pages/DragPage.razor | 181 +- .../Bmotion/Demo/Client/Pages/Easing.razor | 77 +- .../Bmotion/Demo/Client/Pages/ErrorPage.razor | 29 +- .../Bmotion/Demo/Client/Pages/Gestures.razor | 131 +- .../Demo/Client/Pages/GettingStarted.razor | 133 + .../Bmotion/Demo/Client/Pages/Home.razor | 567 ++- .../Bmotion/Demo/Client/Pages/Keyframes.razor | 65 +- .../Demo/Client/Pages/LayoutPage.razor | 167 +- .../Demo/Client/Pages/McpServerPage.razor | 624 +-- .../Demo/Client/Pages/MotionPath.razor | 106 +- .../Demo/Client/Pages/NotFoundPage.razor | 13 +- .../Demo/Client/Pages/Programmatic.razor | 168 +- .../Demo/Client/Pages/ReorderPage.razor | 93 +- .../Demo/Client/Pages/ScrollAnimations.razor | 130 +- .../Bmotion/Demo/Client/Pages/SplitText.razor | 59 +- .../Bmotion/Demo/Client/Pages/Springs.razor | 63 +- .../Bmotion/Demo/Client/Pages/Variants.razor | 120 +- .../Demo/Client/Pages/ViewTransitions.razor | 83 +- .../Bmotion/Demo/Client/Routes.razor | 15 +- .../Demo/Client/Shared/AppFooter.razor | 78 - .../Demo/Client/Shared/AppHeader.razor | 127 - .../Demo/Client/Shared/AppNavPanel.razor | 81 - .../Demo/Client/Shared/CodeSnippet.razor | 67 +- .../Demo/Client/Shared/CommandPalette.razor | 200 - .../Demo/Client/Shared/DocBreadcrumb.razor | 22 - .../Bmotion/Demo/Client/Shared/DocPager.razor | 47 - .../Bmotion/Demo/Client/Shared/Icon.razor | 17 - .../Bmotion/Demo/Client/Shared/Icons.cs | 93 - .../Bmotion/Demo/Client/Shared/NavItem.cs | 194 - .../Demo/Client/Shared/NotFoundContent.razor | 21 - .../Bmotion/Demo/Client/Shared/SideRail.razor | 119 - .../Demo/Client/Shared/SyntaxHighlighter.cs | 19 +- .../Server/Bit.Bmotion.Demo.Server.csproj | 9 +- .../Bmotion/Demo/Server/Components/App.razor | 59 +- .../Demo/Server/Controllers/McpController.cs | 5 +- .../Server/Services/BmotionSearchIndex.cs | 6 +- .../Server/Services/BmotionSourceCatalog.cs | 34 +- .../Bmotion/Demo/Server/wwwroot/app.css | 2820 ++++++++++++ .../Bmotion/Demo/Server/wwwroot/css/app.css | 2017 --------- .../Server/wwwroot/css/motion-samples.css | 546 --- .../Bmotion/Demo/Server/wwwroot/css/theme.css | 451 -- .../Bmotion/Demo/Server/wwwroot/demo.css | 1592 +++++++ .../Bmotion/Demo/Server/wwwroot/js/demo.js | 375 -- .../Bmotion/Demo/Server/wwwroot/site.js | 470 ++ .../Bmotion/Demo/Server/wwwroot/theme.js | 100 + .../Controllers/McpControllerTests.cs | 21 +- .../Services/RecipeCatalogTests.cs | 4 +- .../Services/SourceCatalogTests.cs | 25 +- .../Bonboarding/Demo/Client/DocsCatalog.cs | 179 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Demo/Client/Layout/DocsPager.razor | 45 + .../Demo/Client/Layout/Footer.razor | 76 + .../Demo/Client/Layout/Footer.razor.css | 287 ++ .../Demo/Client/Layout/Header.razor | 121 + .../Demo/Client/Layout/Header.razor.css | 282 ++ .../Demo/Client/Layout/MainLayout.razor | 45 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Client/Layout/ReconnectModal.razor.css | 28 +- .../Demo/Client/Pages/Dynamic.razor | 143 +- .../Demo/Client/Pages/Events.razor | 133 +- .../Bonboarding/Demo/Client/Pages/Flows.razor | 125 +- .../Demo/Client/Pages/GettingStarted.razor | 155 + .../Demo/Client/Pages/Headless.razor | 60 +- .../Bonboarding/Demo/Client/Pages/Home.razor | 451 +- .../Demo/Client/Pages/McpServer.razor | 120 +- .../Demo/Client/Pages/NotFound.razor | 25 +- .../Demo/Client/Pages/PlacementLab.razor | 141 +- .../Demo/Client/Pages/Theming.razor | 190 +- .../Demo/Client/Pages/Workspace.razor | 57 +- .../Demo/Client/Pages/WorkspaceSettings.razor | 86 +- .../Bonboarding/Demo/Client/Routes.razor | 18 +- .../Demo/Client/Shared/AppFooter.razor | 73 - .../Demo/Client/Shared/AppHeader.razor | 81 - .../Demo/Client/Shared/AppNavPanel.razor | 46 - .../Demo/Client/Shared/AppWindow.razor | 6 +- .../Demo/Client/Shared/DocBreadcrumb.razor | 34 - .../Demo/Client/Shared/DocPager.razor | 43 - .../Bonboarding/Demo/Client/Shared/Icon.razor | 17 - .../Bonboarding/Demo/Client/Shared/Icons.cs | 75 - .../Bonboarding/Demo/Client/Shared/NavItem.cs | 101 - .../Demo/Client/Shared/SiteShell.razor | 135 - .../Server/Bit.Bonboarding.Demo.Server.csproj | 9 +- .../Demo/Server/Components/App.razor | 59 +- .../Demo/Server/Components/Pages/Error.razor | 27 +- .../Server/Services/BonboardingSetupGuide.cs | 7 +- .../Services/BonboardingSourceCatalog.cs | 10 +- .../Bonboarding/Demo/Server/wwwroot/app.css | 2820 ++++++++++++ .../Demo/Server/wwwroot/css/app.css | 2021 --------- .../Demo/Server/wwwroot/css/theme.css | 309 -- .../Bonboarding/Demo/Server/wwwroot/demo.css | 378 ++ .../Demo/Server/wwwroot/js/demo.js | 92 - .../Bonboarding/Demo/Server/wwwroot/site.js | 470 ++ .../Bonboarding/Demo/Server/wwwroot/theme.js | 100 + src/Utilities/Borm/Demo/Client/DocsCatalog.cs | 230 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Borm/Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Borm/Demo/Client/Layout/DocsPager.razor | 45 + .../Borm/Demo/Client/Layout/Footer.razor | 76 + .../Borm/Demo/Client/Layout/Footer.razor.css | 287 ++ .../Borm/Demo/Client/Layout/Header.razor | 121 + .../Borm/Demo/Client/Layout/Header.razor.css | 282 ++ .../Borm/Demo/Client/Layout/MainLayout.razor | 41 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Borm/Demo/Client/Layout/NavMenu.razor | 40 - .../Borm/Demo/Client/Pages/ArrayDemo.razor | 45 +- .../Borm/Demo/Client/Pages/BuilderDemo.razor | 20 +- .../Client/Pages/CascadingOptionsDemo.razor | 17 +- .../Client/Pages/ComboboxAndTagsDemo.razor | 17 +- .../Demo/Client/Pages/CompositionDemo.razor | 127 +- .../Client/Pages/CustomRendererDemo.razor | 17 +- .../Client/Pages/DataAnnotationsDemo.razor | 19 +- .../Client/Pages/DependentFieldsDemo.razor | 56 +- .../Demo/Client/Pages/FieldPolishDemo.razor | 39 +- .../Demo/Client/Pages/FileUploadDemo.razor | 17 +- .../Client/Pages/FluentValidationDemo.razor | 17 +- .../Demo/Client/Pages/GettingStarted.razor | 147 + .../Borm/Demo/Client/Pages/Home.razor | 349 +- .../Demo/Client/Pages/JsonSchemaDemo.razor | 36 +- .../Borm/Demo/Client/Pages/LayoutDemo.razor | 17 +- .../Borm/Demo/Client/Pages/McpServer.razor | 157 +- .../Borm/Demo/Client/Pages/NotFound.razor | 13 +- .../Client/Pages/PerRowConditionsDemo.razor | 17 +- .../Borm/Demo/Client/Pages/Quickstart.razor | 25 +- .../Client/Pages/SettledAnswersDemo.razor | 29 +- .../Borm/Demo/Client/Pages/StateApiDemo.razor | 53 +- .../Client/Pages/ValidationModesDemo.razor | 51 +- .../Borm/Demo/Client/Pages/WizardDemo.razor | 30 +- .../Client/Renderers/StarRatingInput.razor | 8 +- src/Utilities/Borm/Demo/Client/Routes.razor | 8 +- .../Demo/Server/Bit.Borm.Demo.Server.csproj | 6 +- .../Borm/Demo/Server/Components/App.razor | 28 +- .../Demo/Server/Services/BormSetupGuide.cs | 6 +- .../Demo/Server/Services/BormSourceCatalog.cs | 4 +- .../Borm/Demo/Server/wwwroot/app.css | 2933 ++++++++++++- .../Borm/Demo/Server/wwwroot/demo.css | 322 ++ .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../Borm/Demo/Server/wwwroot/site.js | 470 ++ .../Borm/Demo/Server/wwwroot/theme.js | 100 + src/Utilities/Borm/README.md | 14 +- .../Tests/Bit.Borm.Tests.E2E/ChoiceTests.cs | 2 +- .../Bit.Borm.Tests.E2E/DemoPagesTests.cs | 31 +- .../Tests/Bit.Borm.Tests.E2E/FieldTests.cs | 6 +- .../Infrastructure/BormTest.cs | 25 +- .../Tests/Bit.Borm.Tests.E2E/KeyboardTests.cs | 5 +- .../Borm/Tests/Bit.Borm.Tests.E2E/README.md | 14 +- .../Tests/Bit.Borm.Tests.E2E/RepeaterTests.cs | 4 +- .../ThemingAndLayoutTests.cs | 128 +- .../Bit.Borm.Tests.E2E/ValidationTests.cs | 2 +- .../Bit.Borm.Tests.Mcp/McpOracleTests.cs | 14 +- .../Tests/Bit.Borm.Tests.Mcp/McpToolTests.cs | 2 + .../Client/Bit.Bortable.Demo.Client.csproj | 4 +- .../Bortable/Demo/Client/DocsCatalog.cs | 198 + .../Demo/Client/Examples/DemoCode.razor | 10 +- .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Demo/Client/Layout/DocsPager.razor | 45 + .../Bortable/Demo/Client/Layout/Footer.razor | 76 + .../Demo/Client/Layout/Footer.razor.css | 287 ++ .../Bortable/Demo/Client/Layout/Header.razor | 121 + .../Demo/Client/Layout/Header.razor.css | 282 ++ .../Demo/Client/Layout/MainLayout.razor | 39 +- .../Demo/Client/Layout/MainLayout.razor.css | 87 +- .../Bortable/Demo/Client/Layout/NavMenu.razor | 77 - .../Demo/Client/Layout/NavMenu.razor.css | 121 - .../Bortable/Demo/Client/Pages/Cloning.razor | 46 +- .../Demo/Client/Pages/DisableSort.razor | 46 +- .../Bortable/Demo/Client/Pages/Events.razor | 82 +- .../Demo/Client/Pages/FilterDemo.razor | 22 +- .../Demo/Client/Pages/GettingStarted.razor | 91 + .../Bortable/Demo/Client/Pages/Grid.razor | 24 +- .../Demo/Client/Pages/HandleDemo.razor | 24 +- .../Bortable/Demo/Client/Pages/Home.razor | 294 +- .../Demo/Client/Pages/McpServer.razor | 54 +- .../Demo/Client/Pages/McpServer.razor.css | 66 - .../Demo/Client/Pages/MultiDragDemo.razor | 58 +- .../Bortable/Demo/Client/Pages/Nested.razor | 14 +- .../Bortable/Demo/Client/Pages/NotFound.razor | 13 +- .../Bortable/Demo/Client/Pages/Shared.razor | 44 +- .../Demo/Client/Pages/SimpleList.razor | 29 + .../Bortable/Demo/Client/Pages/SwapDemo.razor | 58 +- .../Demo/Client/Pages/Thresholds.razor | 114 +- .../Bortable/Demo/Client/Routes.razor | 10 +- .../Bortable/Demo/Server/Components/App.razor | 26 +- .../Server/Services/BortableSourceCatalog.cs | 2 +- .../Bortable/Demo/Server/wwwroot/app.css | 3082 ++++++++++++-- .../Bortable/Demo/Server/wwwroot/demo.css | 398 ++ .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../Bortable/Demo/Server/wwwroot/site.js | 470 ++ .../Bortable/Demo/Server/wwwroot/theme.js | 100 + .../BrowserLayerTests.cs | 8 +- .../Bit.Bortable.Tests.E2E/DemoPagesTests.cs | 16 +- .../Bit.Bortable.Tests.E2E/SortingTests.cs | 8 +- .../Demo/Client/Components/AppNav.razor | 86 - .../Demo/Client/Components/CodeBlock.razor | 50 +- .../Demo/Client/Components/DemoCard.razor | 33 +- .../Bsqlite/Demo/Client/Components/Icon.razor | 55 - .../Demo/Client/Components/PageHeader.razor | 15 +- .../Client/Components/StorageSwitcher.razor | 68 +- .../Demo/Client/Components/ThemeToggle.razor | 54 - .../Demo/Client/Components/TopBar.razor | 52 - .../Components/UnhandledExceptionView.razor | 29 + .../Bsqlite/Demo/Client/DocsCatalog.cs | 176 + .../Demo/Client/Layout/CommandPalette.razor | 306 ++ .../Client/Layout/CommandPalette.razor.css | 312 ++ .../Demo/Client/Layout/DocsLayout.razor | 161 + .../Demo/Client/Layout/DocsLayout.razor.css | 327 ++ .../Demo/Client/Layout/DocsPager.razor | 45 + .../Bsqlite/Demo/Client/Layout/Footer.razor | 76 + .../Demo/Client/Layout/Footer.razor.css | 287 ++ .../Bsqlite/Demo/Client/Layout/Header.razor | 121 + .../Demo/Client/Layout/Header.razor.css | 282 ++ .../Demo/Client/Layout/MainLayout.razor | 110 +- .../Demo/Client/Layout/MainLayout.razor.css | 25 + .../Layout/UnhandledExceptionView.razor | 18 - .../Bsqlite/Demo/Client/Pages/Admin.razor | 179 +- .../Bsqlite/Demo/Client/Pages/Catalog.razor | 288 +- .../Bsqlite/Demo/Client/Pages/Customers.razor | 181 +- .../Bsqlite/Demo/Client/Pages/ErrorPage.razor | 20 +- .../Demo/Client/Pages/GettingStarted.razor | 98 + .../Bsqlite/Demo/Client/Pages/Home.razor | 805 ++-- .../Bsqlite/Demo/Client/Pages/Limits.razor | 172 +- .../Bsqlite/Demo/Client/Pages/McpServer.razor | 618 ++- .../Demo/Client/Pages/NotFoundPage.razor | 20 +- .../Bsqlite/Demo/Client/Pages/Orders.razor | 293 +- .../Bsqlite/Demo/Client/Pages/Queries.razor | 258 +- .../Bsqlite/Demo/Client/Pages/Storage.razor | 414 +- .../Bsqlite/Demo/Client/Routes.razor | 34 +- .../Bsqlite/Demo/Client/SiteLinks.cs | 23 - src/Utilities/Bsqlite/Demo/Client/SiteMap.cs | 56 - src/Utilities/Bsqlite/Demo/Client/Snippets.cs | 135 +- .../Server/Bit.Bsqlite.Demo.Server.csproj | 6 +- .../Bsqlite/Demo/Server/Components/App.razor | 72 +- .../Server/Services/BsqliteSourceCatalog.cs | 1 - .../Bsqlite/Demo/Server/wwwroot/app.css | 2820 ++++++++++++ .../Bsqlite/Demo/Server/wwwroot/css/base.css | 420 -- .../Demo/Server/wwwroot/css/components.css | 554 --- .../Demo/Server/wwwroot/css/landing.css | 291 -- .../Demo/Server/wwwroot/css/tokens.css | 243 -- .../Bsqlite/Demo/Server/wwwroot/demo.css | 486 +++ .../Bsqlite/Demo/Server/wwwroot/demo.js | 15 + .../Server/wwwroot/images/bit-logo-dark.svg | 7 + .../Server/wwwroot/images/bit-logo-light.svg | 7 + .../wwwroot/images/footer/github-icon.svg | 3 + .../wwwroot/images/footer/linkedin-icon.svg | 3 + .../wwwroot/images/footer/location-icon.svg | 4 + .../Server/wwwroot/images/footer/tel-icon.svg | 3 + .../wwwroot/images/footer/twitter-icon.svg | 3 + .../wwwroot/images/footer/youtube-icon.svg | 3 + .../Server/wwwroot/images/github-mark.svg | 5 + .../Bsqlite/Demo/Server/wwwroot/js/demo.js | 66 - .../Bsqlite/Demo/Server/wwwroot/site.js | 470 ++ .../Bsqlite/Demo/Server/wwwroot/theme.js | 100 + .../Tests/Bit.Bsqlite.Tests.E2E/DemoTests.cs | 52 +- .../Infrastructure/DemoTest.cs | 23 +- .../Tests/Bit.Bsqlite.Tests.E2E/README.md | 6 +- .../Bit.Bsqlite.Tests.Mcp/McpToolTests.cs | 3 + 1036 files changed, 122763 insertions(+), 46700 deletions(-) create mode 100644 src/Utilities/Balette/Demo/Client/Components/AppPalette.razor create mode 100644 src/Utilities/Balette/Demo/Client/Components/PaletteBar.razor create mode 100644 src/Utilities/Balette/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Balette/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Balette/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Balette/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Balette/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Balette/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Balette/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Balette/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Balette/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Balette/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Balette/Demo/Client/Layout/MainLayout.razor.css delete mode 100644 src/Utilities/Balette/Demo/Client/Layout/NavMenu.razor create mode 100644 src/Utilities/Balette/Demo/Client/Pages/GettingStarted.razor create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/demo.js create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Balette/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Balette/Tests/Bit.Balette.Tests.E2E/TwoPalettesTests.cs create mode 100644 src/Utilities/BbScanner/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/MainLayout.razor.css delete mode 100644 src/Utilities/BbScanner/Demo/Client/Layout/NavMenu.razor create mode 100644 src/Utilities/BbScanner/Demo/Client/Pages/GettingStarted.razor create mode 100644 src/Utilities/BbScanner/Demo/Client/Shared/StatusBadge.razor create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/BbScanner/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Bcrdt/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/MainLayout.razor.css delete mode 100644 src/Utilities/Bcrdt/Demo/Client/Layout/NavMenu.razor create mode 100644 src/Utilities/Bcrdt/Demo/Client/Pages/GettingStarted.razor create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Bcrdt/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Bdnd/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/Header.razor.css delete mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/NavMenu.razor delete mode 100644 src/Utilities/Bdnd/Demo/Client/Layout/NavMenu.razor.css create mode 100644 src/Utilities/Bdnd/Demo/Client/Pages/GettingStarted.razor create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Bdnd/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Belemetry/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Belemetry/Demo/Client/Layout/MainLayout.razor.css create mode 100644 src/Utilities/Belemetry/Demo/Client/Pages/NotFound.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Pages/NotFoundPage.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/AppFooter.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/AppHeader.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/AppNavPanel.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/CommandPalette.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/DocBreadcrumb.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/DocPager.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/Icon.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/Icons.cs delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/NavItem.cs delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/NotFoundContent.razor delete mode 100644 src/Utilities/Belemetry/Demo/Client/Shared/SideRail.razor create mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/app.css delete mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/css/app.css delete mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/css/belemetry.css delete mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/css/docs.css delete mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/css/theme.css create mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/demo.js delete mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/js/demo.js create mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Belemetry/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/BevTools/Demo/Client/Components/RendererStatus.razor create mode 100644 src/Utilities/BevTools/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/BevTools/Demo/Client/Layout/MainLayout.razor.css delete mode 100644 src/Utilities/BevTools/Demo/Client/Layout/NavMenu.razor create mode 100644 src/Utilities/BevTools/Demo/Client/Pages/Dashboard.razor create mode 100644 src/Utilities/BevTools/Demo/Client/Pages/GettingStarted.razor create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/BevTools/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Bink/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Bink/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Bink/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Bink/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Bink/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Bink/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Bink/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Bink/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Bink/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Bink/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Bink/Demo/Client/Layout/MainLayout.razor.css delete mode 100644 src/Utilities/Bink/Demo/Client/Layout/NavMenu.razor create mode 100644 src/Utilities/Bink/Demo/Client/Pages/GettingStarted.razor create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Bink/Demo/Server/wwwroot/theme.js delete mode 100644 src/Utilities/BlazeDb/Demo/Client/Components/AppInterop.cs delete mode 100644 src/Utilities/BlazeDb/Demo/Client/Components/SiteMap.cs create mode 100644 src/Utilities/BlazeDb/Demo/Client/Components/StorageStatus.razor delete mode 100644 src/Utilities/BlazeDb/Demo/Client/Components/ThemeToggle.razor create mode 100644 src/Utilities/BlazeDb/Demo/Client/Components/Tones.cs create mode 100644 src/Utilities/BlazeDb/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/MainLayout.razor.css delete mode 100644 src/Utilities/BlazeDb/Demo/Client/Layout/NavMenu.razor create mode 100644 src/Utilities/BlazeDb/Demo/Client/Pages/GettingStarted.razor delete mode 100644 src/Utilities/BlazeDb/Demo/Client/wwwroot/js/app.js create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/BlazeDb/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Blex/Demo/Client/DocsCatalog.cs delete mode 100644 src/Utilities/Blex/Demo/Client/DocsNav.cs create mode 100644 src/Utilities/Blex/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Blex/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Blex/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Blex/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Blex/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Blex/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Blex/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Blex/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Blex/Demo/Client/Layout/MainLayout.razor create mode 100644 src/Utilities/Blex/Demo/Client/Layout/MainLayout.razor.css delete mode 100644 src/Utilities/Blex/Demo/Client/Layout/NavSidebar.razor create mode 100644 src/Utilities/Blex/Demo/Client/Pages/Home.razor create mode 100644 src/Utilities/Blex/Demo/Client/Pages/NotFound.razor delete mode 100644 src/Utilities/Blex/Demo/Client/Pages/NotFoundPage.razor delete mode 100644 src/Utilities/Blex/Demo/Client/Services/ThemeService.cs create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/app.css delete mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/css/site.css create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/demo.js create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/images/github-mark.svg delete mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/js/site.js create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Blex/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Blow/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Blow/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Blow/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Blow/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Blow/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Blow/Demo/Client/Layout/DocsPager.razor delete mode 100644 src/Utilities/Blow/Demo/Client/Layout/ExamplesLayout.razor delete mode 100644 src/Utilities/Blow/Demo/Client/Layout/ExamplesLayout.razor.css create mode 100644 src/Utilities/Blow/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Blow/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Blow/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Blow/Demo/Client/Layout/Header.razor.css delete mode 100644 src/Utilities/Blow/Demo/Client/Layout/NavMenu.razor delete mode 100644 src/Utilities/Blow/Demo/Client/Layout/NavMenu.razor.css create mode 100644 src/Utilities/Blow/Demo/Client/Pages/BasicFlow.razor delete mode 100644 src/Utilities/Blow/Demo/Client/Pages/Examples/_Imports.razor create mode 100644 src/Utilities/Blow/Demo/Client/Pages/GettingStarted.razor create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Blow/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Bmage/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Bmage/Demo/Client/Layout/MainLayout.razor.css create mode 100644 src/Utilities/Bmage/Demo/Client/Pages/NotFound.razor delete mode 100644 src/Utilities/Bmage/Demo/Client/Pages/NotFoundPage.razor delete mode 100644 src/Utilities/Bmage/Demo/Client/Shared/AppFooter.razor delete mode 100644 src/Utilities/Bmage/Demo/Client/Shared/AppHeader.razor delete mode 100644 src/Utilities/Bmage/Demo/Client/Shared/AppNavPanel.razor delete mode 100644 src/Utilities/Bmage/Demo/Client/Shared/CommandPalette.razor delete mode 100644 src/Utilities/Bmage/Demo/Client/Shared/DocBreadcrumb.razor delete mode 100644 src/Utilities/Bmage/Demo/Client/Shared/DocPager.razor delete mode 100644 src/Utilities/Bmage/Demo/Client/Shared/NavItem.cs delete mode 100644 src/Utilities/Bmage/Demo/Client/Shared/NotFoundContent.razor delete mode 100644 src/Utilities/Bmage/Demo/Client/Shared/SideRail.razor create mode 100644 src/Utilities/Bmage/Demo/Server/wwwroot/app.css delete mode 100644 src/Utilities/Bmage/Demo/Server/wwwroot/css/app.css delete mode 100644 src/Utilities/Bmage/Demo/Server/wwwroot/css/bmage-samples.css delete mode 100644 src/Utilities/Bmage/Demo/Server/wwwroot/css/editor-theme.css delete mode 100644 src/Utilities/Bmage/Demo/Server/wwwroot/css/theme.css create mode 100644 src/Utilities/Bmage/Demo/Server/wwwroot/demo.css delete mode 100644 src/Utilities/Bmage/Demo/Server/wwwroot/js/demo.js create mode 100644 src/Utilities/Bmage/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Bmage/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Bmotion/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Bmotion/Demo/Client/Layout/MainLayout.razor.css create mode 100644 src/Utilities/Bmotion/Demo/Client/Pages/GettingStarted.razor delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/AppFooter.razor delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/AppHeader.razor delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/AppNavPanel.razor delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/CommandPalette.razor delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/DocBreadcrumb.razor delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/DocPager.razor delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/Icon.razor delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/Icons.cs delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/NavItem.cs delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/NotFoundContent.razor delete mode 100644 src/Utilities/Bmotion/Demo/Client/Shared/SideRail.razor create mode 100644 src/Utilities/Bmotion/Demo/Server/wwwroot/app.css delete mode 100644 src/Utilities/Bmotion/Demo/Server/wwwroot/css/app.css delete mode 100644 src/Utilities/Bmotion/Demo/Server/wwwroot/css/motion-samples.css delete mode 100644 src/Utilities/Bmotion/Demo/Server/wwwroot/css/theme.css create mode 100644 src/Utilities/Bmotion/Demo/Server/wwwroot/demo.css delete mode 100644 src/Utilities/Bmotion/Demo/Server/wwwroot/js/demo.js create mode 100644 src/Utilities/Bmotion/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Bmotion/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Bonboarding/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Bonboarding/Demo/Client/Layout/MainLayout.razor.css create mode 100644 src/Utilities/Bonboarding/Demo/Client/Pages/GettingStarted.razor delete mode 100644 src/Utilities/Bonboarding/Demo/Client/Shared/AppFooter.razor delete mode 100644 src/Utilities/Bonboarding/Demo/Client/Shared/AppHeader.razor delete mode 100644 src/Utilities/Bonboarding/Demo/Client/Shared/AppNavPanel.razor delete mode 100644 src/Utilities/Bonboarding/Demo/Client/Shared/DocBreadcrumb.razor delete mode 100644 src/Utilities/Bonboarding/Demo/Client/Shared/DocPager.razor delete mode 100644 src/Utilities/Bonboarding/Demo/Client/Shared/Icon.razor delete mode 100644 src/Utilities/Bonboarding/Demo/Client/Shared/Icons.cs delete mode 100644 src/Utilities/Bonboarding/Demo/Client/Shared/NavItem.cs delete mode 100644 src/Utilities/Bonboarding/Demo/Client/Shared/SiteShell.razor create mode 100644 src/Utilities/Bonboarding/Demo/Server/wwwroot/app.css delete mode 100644 src/Utilities/Bonboarding/Demo/Server/wwwroot/css/app.css delete mode 100644 src/Utilities/Bonboarding/Demo/Server/wwwroot/css/theme.css create mode 100644 src/Utilities/Bonboarding/Demo/Server/wwwroot/demo.css delete mode 100644 src/Utilities/Bonboarding/Demo/Server/wwwroot/js/demo.js create mode 100644 src/Utilities/Bonboarding/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Bonboarding/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Borm/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Borm/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Borm/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Borm/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Borm/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Borm/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Borm/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Borm/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Borm/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Borm/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Borm/Demo/Client/Layout/MainLayout.razor.css delete mode 100644 src/Utilities/Borm/Demo/Client/Layout/NavMenu.razor create mode 100644 src/Utilities/Borm/Demo/Client/Pages/GettingStarted.razor create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Borm/Demo/Server/wwwroot/theme.js create mode 100644 src/Utilities/Bortable/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Bortable/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Bortable/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Bortable/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Bortable/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Bortable/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Bortable/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Bortable/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Bortable/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Bortable/Demo/Client/Layout/Header.razor.css delete mode 100644 src/Utilities/Bortable/Demo/Client/Layout/NavMenu.razor delete mode 100644 src/Utilities/Bortable/Demo/Client/Layout/NavMenu.razor.css create mode 100644 src/Utilities/Bortable/Demo/Client/Pages/GettingStarted.razor delete mode 100644 src/Utilities/Bortable/Demo/Client/Pages/McpServer.razor.css create mode 100644 src/Utilities/Bortable/Demo/Client/Pages/SimpleList.razor create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/images/github-mark.svg create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Bortable/Demo/Server/wwwroot/theme.js delete mode 100644 src/Utilities/Bsqlite/Demo/Client/Components/AppNav.razor delete mode 100644 src/Utilities/Bsqlite/Demo/Client/Components/Icon.razor delete mode 100644 src/Utilities/Bsqlite/Demo/Client/Components/ThemeToggle.razor delete mode 100644 src/Utilities/Bsqlite/Demo/Client/Components/TopBar.razor create mode 100644 src/Utilities/Bsqlite/Demo/Client/Components/UnhandledExceptionView.razor create mode 100644 src/Utilities/Bsqlite/Demo/Client/DocsCatalog.cs create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/CommandPalette.razor create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/CommandPalette.razor.css create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/DocsLayout.razor create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/DocsLayout.razor.css create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/DocsPager.razor create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/Footer.razor create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/Footer.razor.css create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/Header.razor create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/Header.razor.css create mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/MainLayout.razor.css delete mode 100644 src/Utilities/Bsqlite/Demo/Client/Layout/UnhandledExceptionView.razor create mode 100644 src/Utilities/Bsqlite/Demo/Client/Pages/GettingStarted.razor delete mode 100644 src/Utilities/Bsqlite/Demo/Client/SiteLinks.cs delete mode 100644 src/Utilities/Bsqlite/Demo/Client/SiteMap.cs create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/app.css delete mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/css/base.css delete mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/css/components.css delete mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/css/landing.css delete mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/css/tokens.css create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/demo.css create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/demo.js create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/images/bit-logo-dark.svg create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/images/bit-logo-light.svg create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/images/footer/github-icon.svg create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/images/footer/linkedin-icon.svg create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/images/footer/location-icon.svg create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/images/footer/tel-icon.svg create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/images/footer/twitter-icon.svg create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/images/footer/youtube-icon.svg create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/images/github-mark.svg delete mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/js/demo.js create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/site.js create mode 100644 src/Utilities/Bsqlite/Demo/Server/wwwroot/theme.js diff --git a/src/Utilities/Balette/Demo/Client/Components/AppPalette.razor b/src/Utilities/Balette/Demo/Client/Components/AppPalette.razor new file mode 100644 index 00000000000..3f44301ea48 --- /dev/null +++ b/src/Utilities/Balette/Demo/Client/Components/AppPalette.razor @@ -0,0 +1,149 @@ +@implements IAsyncDisposable +@inject DemoState State +@inject IBaletteService Palette +@inject IJSRuntime JSRuntime + +@* The one palette of the whole app, with its app-wide commands. Routes.razor renders it next to the router, so it + is on every page - the landing page, the docs and the not-found page alike - and outlives them all. + + Everything it is passed comes from DemoState, which the theming, search and performance pages change, so they + restyle this very palette rather than a copy of it. + + data-palette-ready turns true once the palette's browser layer listens for keys (it reports the platform as it + starts). Prerendered markup is on screen long before its event handlers are, and a Ctrl+K pressed between the + page turning interactive and this reaches no listener at all, so the E2E suite waits for both. The wrapper is + display: contents - a closed lays nothing out, and an open one is in the top layer. *@ + +
+ @* The app-wide commands. A new list is handed over whenever the demo state changes, and BaletteCommands + swaps the registration, so a toggle's switch and a setting's value are never stale. *@ + + + + @* Declarative commands live next to the markup that owns them. An item with nested items becomes a page. *@ + + + + + + + + + +
+ +@code { + private List _globalCommands = []; + private RenderFragment? _detailPane; + private DotNetObjectReference? _self; + private bool _paletteReady; + + protected override void OnInitialized() + { + _globalCommands = [.. DemoCommands.Global(State)]; + State.Changed += OnStateChanged; + // The detail pane's shortcut hint reads IsMac, which is only known once the palette has started. + Palette.PlatformDetected += OnPlatformDetected; + + // A Raycast-style preview of the active row. It is a template like any other, so it can show whatever a + // command carries - here the Person record the people source attaches as Data. + _detailPane = command => + @
+
@command.Kind
+

@command.Title

+ @if (command.Subtitle is not null) + { +

@command.Subtitle

+ } + @if (command.Description is not null) + { +

@command.Description

+ } + @if (command.Shortcut is not null) + { +

Shortcut:

+ } + @if (command.Keywords.Count > 0) + { +

Also matches: @string.Join(", ", command.Keywords)

+ } + @if (command.Data is Person person) + { +
+
Role
@person.Role
+
E-mail
@person.Email
+
+ } + @command.Id +
; + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender is false) return; + + // The site's theme is the site kit's (theme.js applied it before the first paint, and the header's toggle + // flips it). The demo's Theme command shows it, so the state follows it: demo.js calls back once now and + // again on every change, whoever made it. + _self = DotNetObjectReference.Create(this); + try + { + await JSRuntime.InvokeVoidAsync("baletteDemo.watchTheme", _self); + } + catch (JSException) + { + // demo.js is not on the page: the Theme command still works, it just cannot see the header's toggle. + } + } + + /// The site theme changed - from this demo, the header's toggle or the OS - to "auto", "light" or "dark". + [JSInvokable] + public void OnSiteThemeChanged(string theme) => State.FollowSiteTheme(theme); + + private void OnStateChanged() + { + _globalCommands = [.. DemoCommands.Global(State)]; + _ = InvokeAsync(StateHasChanged); + } + + // The component's own callback sees every execution - declarative items included - with how long the + // handler took. The pages listen to IBaletteService.CommandExecuted for the same thing. + private void OnExecuted(BaletteCommandExecutedEventArgs e) + => Console.WriteLine($"[balette] {e.Command.Id} -> {e.Result.GetType().Name} in {e.Duration.TotalMilliseconds:F0} ms"); + + private void OnPlatformDetected() + { + _paletteReady = true; + _ = InvokeAsync(StateHasChanged); + } + + public async ValueTask DisposeAsync() + { + State.Changed -= OnStateChanged; + Palette.PlatformDetected -= OnPlatformDetected; + + if (_self is null) return; + + try + { + await JSRuntime.InvokeVoidAsync("baletteDemo.unwatchTheme"); + } + catch (Exception ex) when (ex is JSException or JSDisconnectedException) + { + // The page is going away with the runtime; there is nothing left to unsubscribe from. + } + + _self.Dispose(); + _self = null; + } +} diff --git a/src/Utilities/Balette/Demo/Client/Components/PaletteBar.razor b/src/Utilities/Balette/Demo/Client/Components/PaletteBar.razor new file mode 100644 index 00000000000..53d530ef33d --- /dev/null +++ b/src/Utilities/Balette/Demo/Client/Components/PaletteBar.razor @@ -0,0 +1,22 @@ +@inject IBaletteService Palette + +@* The palette's visible way in: a BaletteTrigger, and a button per mode that opens the palette with the mode's + prefix typed. The palette is one keystroke away on every page, but a visitor who has not learnt the keystroke + yet needs something to click - so every demo page opens with this bar, and the landing page has it in its hero. + + The trigger reads the toggle shortcut from the options, so its hint is always the real one, in the platform's + own symbols once the palette has detected it. *@ + +
+ +
+ + + +
+
+ +@code { + /// Extra classes for the bar, for the place it sits in. + [Parameter] public string? Class { get; set; } +} diff --git a/src/Utilities/Balette/Demo/Client/DocsCatalog.cs b/src/Utilities/Balette/Demo/Client/DocsCatalog.cs new file mode 100644 index 00000000000..ec698196a6a --- /dev/null +++ b/src/Utilities/Balette/Demo/Client/DocsCatalog.cs @@ -0,0 +1,185 @@ +using Bit.Balette.Demo.Client.Pages; +using Microsoft.AspNetCore.Components; + +namespace Bit.Balette.Demo.Client; + +/// +/// One documentation page: is its address, feeds +/// the header's search palette, and is the component the address renders - +/// which is what the "Edit this page on GitHub" link under every page is built from. +/// +public record DocsPageInfo(string Url, string Title, string Description, string Keywords, Type PageType); + +public record DocsSection(string Title, DocsPageInfo[] Pages); + +/// +/// A link in the header. marks the entry that stands for the docs as a +/// whole: it is the current section on every page no other entry claims. +/// +public record SiteNavItem(string Href, string Label, bool MatchesDocs = false); + +/// +/// What the shared site chrome in Layout/ - the header, the docs shell, the palette and the footer - +/// says about this particular demo. Those components are the same file in every Utilities demo; this +/// class and are what each demo fills in for itself. +/// +public static class SiteInfo +{ + /// The library's name, as the header's wordmark and the breadcrumb's root show it. + public const string Name = "Balette"; + + public const string PackageId = "Bit.Balette"; + + /// The library's folder in the repository, which the GitHub links point into. + public const string ProjectPath = "src/Utilities/Balette"; + + /// What the library is, in the two or three sentences the footer has room for. + public const string Tagline = + "Balette is an accessible, keyboard-first command palette for Blazor: fuzzy search, nested pages, modes, " + + "async sources, recents and global shortcuts, with every decision made in C#. Press Ctrl+K anywhere on " + + "this site - it runs on it."; + + public static readonly string[] Badges = ["MIT", "net8.0", "net9.0", "net10.0"]; + + /// Words the search palette suggests when a query finds nothing. + public static readonly string[] SearchHints = ["shortcut", "prompt", "theme", "source", "fuzzy"]; + + /// + /// Whether Ctrl+K / Cmd+K opens the site's search palette. "/" always does. A demo whose own + /// library answers to Ctrl+K turns this off so the two do not fight over the key. + /// + /// + /// Off here: Ctrl+K is Balette's own toggle, and the palette this site demonstrates is the one it + /// opens. The site's documentation search answers to "/" alone. + /// + public static readonly bool PaletteCtrlK = false; + + public static readonly SiteNavItem[] Primary = + [ + new("/", "Home"), + new("/getting-started", "Docs", MatchesDocs: true), + new("/mcp-server", "MCP server"), + ]; + + public const string RepositoryUrl = "https://github.com/bitfoundation/bitplatform"; + + public static string ProjectUrl => $"{RepositoryUrl}/tree/develop/{ProjectPath}"; + + public static string NuGetUrl => $"https://www.nuget.org/packages/{PackageId}"; + + /// + /// The page's source file on GitHub. Razor gives a component the namespace of its folder, so the + /// path below Demo/Client is the type's namespace past this assembly's root, one folder a segment. + /// + public static string SourceUrlOf(Type page) + { + var root = typeof(SiteInfo).Namespace!; + var relative = page.FullName!.StartsWith(root + ".", StringComparison.Ordinal) + ? page.FullName[(root.Length + 1)..] + : page.Name; + + return $"{RepositoryUrl}/blob/develop/{ProjectPath}/Demo/Client/{relative.Replace('.', '/')}.razor"; + } +} + +/// +/// The single source of truth for the site's information architecture. The docs nav panel, the +/// header's search palette, the previous/next pager, the breadcrumb and the footer's link columns are +/// all driven from here, so adding a page means adding exactly one entry. +/// +public static class DocsCatalog +{ + public static readonly DocsSection[] Sections = + [ + new("Introduction", + [ + new("/getting-started", "Getting started", + "Install the package, register the services, link the stylesheet, place the palette and register your first commands.", + "install setup nuget package AddBitBaletteServices quick start program.cs stylesheet render mode BaletteTrigger", + typeof(GettingStarted)), + ]), + new("Commands", + [ + new("/commands", "Registering commands", + "The fluent builder, declarative BaletteItem markup, page-scoped commands and settings that stay in sync with the page.", + "register BaletteCmd builder fluent declarative markup BaletteItem BaletteGroup BaletteCommands page-scoped IBaletteService toggle checked", + typeof(Commands)), + new("/pages", "Nested pages & flows", + "Static, lazy and ad-hoc pages, prompts, multi-select, confirmations, toasts and the action panel - every step in one box.", + "nested pages children lazy prompt multi-select destructive confirm toast action panel BaletteCommandResult flow", + typeof(PagesAndFlows)), + ]), + new("Search", + [ + new("/search", "Search & ranking", + "The fuzzy matcher and the ranker run live over this app's registry, with every score, weight and the frecency shown.", + "fuzzy fzf matcher ranker score weights operators exact prefix suffix negate frecency priority smart case highlight", + typeof(SearchAndRanking)), + new("/modes", "Modes & sources", + "Typed prefixes that scope the palette, and async sources that are debounced, cancelled and merged - with a live call log.", + "modes prefix > # @ ? async sources IBaletteSource debounce cancel ApplyMatcher people issues documentation", + typeof(Modes)), + ]), + new("Keyboard & theming", + [ + new("/keyboard", "Keyboard & shortcuts", + "Every key inside the palette, global chords, G-then-X sequences, and the accessibility the native dialog brings.", + "keyboard shortcuts hotkeys chord sequence global Mod VimBindings accessibility aria combobox focus", + typeof(Keyboard)), + new("/theming", "Theming & templates", + "Light and dark, design tokens changed live on this site's palette, the detail pane, item templates and unstyled mode.", + "theme dark light css custom properties variables tokens accent detail pane templates ItemTemplate unstyled data-balette", + typeof(Theming)), + ]), + new("Performance", + [ + new("/performance", "Large registry", + "Register thousands of commands and measure, in your browser, what one keystroke of matching and ranking costs.", + "performance large registry benchmark bulk thousands virtualize MaxResults measure milliseconds", + typeof(Performance)), + ]), + new("Tooling", + [ + new("/mcp-server", "MCP server", + "The Model Context Protocol server this site hosts, so an AI agent reads the library instead of guessing.", + "mcp model context protocol ai agent tools resources prompts claude copilot server", + typeof(McpServer)), + ]), + ]; + + public static readonly DocsPageInfo[] AllPages = [.. Sections.SelectMany(s => s.Pages)]; + + /// The current address relative to the base, without its query string or fragment. + public static string PathOf(NavigationManager nav) + { + var path = nav.ToBaseRelativePath(nav.Uri); + var cut = path.IndexOfAny(['?', '#']); + return (cut >= 0 ? path[..cut] : path).Trim('/'); + } + + /// Whether a link's address and a base-relative path name the same page, ignoring case as the router does. + public static bool IsSamePath(string href, string path) + => string.Equals(href.Trim('/'), path.Trim('/'), StringComparison.OrdinalIgnoreCase); + + /// + /// Finds the catalog entry for a base-relative path, or null when the page is not in the catalog. A + /// page whose route takes a parameter is listed by its bare address, so a deeper path falls back to + /// the entry it starts with. + /// + public static DocsPageInfo? FindByPath(string path) + => AllPages.FirstOrDefault(p => IsSamePath(p.Url, path)) + ?? AllPages.FirstOrDefault(p => path.Trim('/').StartsWith(p.Url.Trim('/') + "/", StringComparison.OrdinalIgnoreCase)); + + /// Previous/next pages in reading order for the bottom-of-page pager. + public static (DocsPageInfo? Previous, DocsPageInfo? Next) NeighborsOf(DocsPageInfo page) + { + var index = Array.IndexOf(AllPages, page); + if (index < 0) return (null, null); + return (index > 0 ? AllPages[index - 1] : null, + index < AllPages.Length - 1 ? AllPages[index + 1] : null); + } + + /// Section a page belongs to (the breadcrumb's middle step and the palette's group label). + public static string SectionOf(DocsPageInfo page) + => Sections.First(s => s.Pages.Contains(page)).Title; +} diff --git a/src/Utilities/Balette/Demo/Client/Layout/CommandPalette.razor b/src/Utilities/Balette/Demo/Client/Layout/CommandPalette.razor new file mode 100644 index 00000000000..2e5aa18e8ee --- /dev/null +++ b/src/Utilities/Balette/Demo/Client/Layout/CommandPalette.razor @@ -0,0 +1,306 @@ +@inject NavigationManager Nav +@inject IJSRuntime JSRuntime +@implements IAsyncDisposable + +@* The site's search - part of the site kit every Utilities demo shares (see wwwroot/app.css): a + command palette rather than a dropdown under a text field. + + Everything it can reach is a page of this site, so the corpus is the catalog itself - + DocsCatalog's titles, descriptions and keywords. No index is built and no service is called. + + The trigger and the dialog are one component so the keyboard shortcut, the button and the open + state cannot get out of step. Ctrl+K / Cmd+K and "/" open it from anywhere - site.js owns the + document-level listener and calls back in here. A demo whose library claims Ctrl+K for itself + turns that half off with SiteInfo.PaletteCtrlK. *@ + + + +@if (_open) +{ + @* The scrim takes the click that closes the dialog. The dialog itself stops the click from + reaching it, so a click inside never closes what the reader is using. *@ +
+ +
+} + +@code { + /// One row of the palette: a place on this site, and why it matched. + private sealed record Hit(string Group, string Title, string Description, string Url, string Corpus); + + private bool _open; + private bool _isApple; + private bool _focusPending; + private bool _restorePending; + private bool _revealPending; + private string _query = ""; + private Hit[] _results = []; + private int _activeIndex; + + private ElementReference _trigger; + private ElementReference _input; + private ElementReference _escape; + private DotNetObjectReference? _self; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + // Neither call runs during prerendering - OnAfterRender does not fire there - so the + // palette is simply inert until the client takes over, which is the correct behavior + // for a control whose whole job is interactive. + _self = DotNetObjectReference.Create(this); + _isApple = await JSRuntime.InvokeAsync("bitDemoSite.registerPalette", _self, SiteInfo.PaletteCtrlK); + StateHasChanged(); + } + + if (_focusPending) + { + _focusPending = false; + await _input.FocusAsync(); + } + + if (_restorePending) + { + _restorePending = false; + await _trigger.FocusAsync(); + } + + if (_revealPending) + { + _revealPending = false; + // After the render that moved the cursor, not before: the row has to carry its new + // class before its position is worth measuring. + await JSRuntime.InvokeVoidAsync("bitDemoSite.revealPaletteOption", _activeIndex); + } + } + + /// Opened by the document-level Ctrl+K / Cmd+K / "/" handler in site.js. + [JSInvokable] + public Task OpenFromShortcut() + { + if (_open is false) Open(); + return InvokeAsync(StateHasChanged); + } + + private void Open() + { + _open = true; + _query = ""; + _activeIndex = 0; + // An empty query is not "no results": with nothing typed the palette is a table of + // contents, which is a more useful blank state than an empty box. + _results = Suggest(); + _focusPending = true; + LockScroll(true); + } + + /// + /// Dismisses the dialog. The whole dialog is unmounted on close, so unless focus is handed + /// somewhere deliberately it falls to <body> and the next Tab restarts at the top of the + /// page - hence the trip back to the button that opened it. A close that ends in a navigation + /// passes false: the new page decides where focus belongs, and moving it here would fight that. + /// + private void Close(bool restoreFocus = true) + { + _open = false; + _query = ""; + _results = []; + _activeIndex = 0; + _revealPending = false; + _restorePending = restoreFocus; + LockScroll(false); + } + + /// + /// Holds the page still while the dialog is up, so a flick of the wheel scrolls the results + /// rather than the document behind them. Not awaited: the open/close state is already correct + /// in C#, and making the callers async would put a render between the click and the dialog. + /// + private void LockScroll(bool locked) => _ = JSRuntime.InvokeVoidAsync("bitDemoSite.lockScroll", locked); + + private void OnInput(ChangeEventArgs e) + { + _query = e.Value?.ToString() ?? ""; + _results = _query.Trim().Length == 0 ? Suggest() : Find(_query.Trim()); + _activeIndex = 0; + } + + private void OnKeyDown(KeyboardEventArgs e) + { + switch (e.Key) + { + case "Escape": + Close(); + break; + + case "ArrowDown" when _results.Length > 0: + // Wrapping, because a palette is a short list: falling off the end and landing back + // at the top is what every other palette does, and it saves a reversal. + _activeIndex = (_activeIndex + 1) % _results.Length; + _revealPending = true; + break; + + case "ArrowUp" when _results.Length > 0: + _activeIndex = (_activeIndex - 1 + _results.Length) % _results.Length; + _revealPending = true; + break; + + case "Enter" when _results.Length > 0: + Go(_results[Math.Clamp(_activeIndex, 0, _results.Length - 1)]); + break; + } + } + + private void Go(Hit hit) + { + Close(restoreFocus: false); + Nav.NavigateTo(hit.Url); + } + + /// The blank state: the reading order of the docs. + private static Hit[] Suggest() => Regroup(Pages().Take(12)); + + /// + /// The rows in the order they are RENDERED - grouped by section, groups in first-appearance + /// order. The arrow keys walk the flat array, so it has to agree with what is on screen or + /// pressing Down would move the cursor somewhere the eye is not. + /// + private static Hit[] Regroup(IEnumerable hits) + => [.. hits.GroupBy(hit => hit.Group).SelectMany(group => group)]; + + /// + /// Every term has to match somewhere, and the hits are ordered by WHERE they matched: a title + /// that starts with the query first, then a title that contains it, then everything that only + /// matched on its description or keywords. Ranking by position rather than by count keeps a + /// page from being outranked by another that merely says the word four times. + /// + private static Hit[] Find(string query) + { + var terms = query.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + return Regroup(Pages() + .Where(hit => terms.All(term => hit.Corpus.Contains(term, StringComparison.OrdinalIgnoreCase))) + .OrderBy(hit => hit.Title.StartsWith(query, StringComparison.OrdinalIgnoreCase) ? 0 + : hit.Title.Contains(query, StringComparison.OrdinalIgnoreCase) ? 1 : 2) + .Take(12)); + } + + private static IEnumerable Pages() + => DocsCatalog.Sections.SelectMany(section => section.Pages.Select(page => + new Hit(section.Title, page.Title, page.Description, page.Url, + $"{page.Title} {page.Description} {page.Keywords} {page.Url}"))); + + public async ValueTask DisposeAsync() + { + if (_self is null) return; + + try + { + await JSRuntime.InvokeVoidAsync("bitDemoSite.unregisterPalette"); + } + catch (JSDisconnectedException) + { + // The circuit is already gone; there is nothing on the other side to unregister from. + } + + _self.Dispose(); + _self = null; + } +} diff --git a/src/Utilities/Balette/Demo/Client/Layout/CommandPalette.razor.css b/src/Utilities/Balette/Demo/Client/Layout/CommandPalette.razor.css new file mode 100644 index 00000000000..17f30f9fb59 --- /dev/null +++ b/src/Utilities/Balette/Demo/Client/Layout/CommandPalette.razor.css @@ -0,0 +1,312 @@ +/* ---------- The trigger in the header ---------- + + A button shaped like the search field it replaces, so it still reads as "type here" - the + difference is that what it opens is a dialog with room for grouped results, and that it can be + reached without the pointer ever touching it. */ +.bb-search-trigger { + display: inline-flex; + align-items: center; + gap: .5rem; + height: 32px; + min-width: 220px; + padding: 0 .375rem 0 .625rem; + border: 1px solid var(--bb-border); + border-radius: var(--bb-radius); + background: var(--bb-surface-sunken); + color: var(--bb-text-soft); + font-family: inherit; + font-size: .875rem; + cursor: pointer; + transition: border-color var(--bb-motion-duration-short) var(--bb-motion-easing), + background var(--bb-motion-duration-short) var(--bb-motion-easing), + color var(--bb-motion-duration-short) var(--bb-motion-easing); +} + +.bb-search-trigger:hover { + border-color: var(--bb-border-strong); + background: var(--bb-surface); + color: var(--bb-text-muted); +} + +.bb-search-trigger > svg { + width: 15px; + height: 15px; + flex: none; +} + +.bb-search-trigger-label { + flex: 1; + text-align: start; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.bb-search-trigger-keys { + display: flex; + gap: 2px; + flex: none; +} + +/* ---------- The dialog ---------- */ + +/* Anchored near the top rather than centred: the list grows downward as the reader types, and a + centred dialog would move under their eyes every time it did. */ +.bb-palette-scrim { + position: fixed; + inset: 0; + /* The header's backdrop-filter makes it the containing block of its fixed descendants, so + `inset: 0` alone would span only the 56px bar. The header is pinned to the top of the + viewport, so a viewport-tall box from its top edge is the whole screen. */ + bottom: auto; + height: 100vh; + z-index: 1100; + display: flex; + justify-content: center; + align-items: flex-start; + padding: max(6vh, 3rem) 1rem 2rem; + background: var(--bb-scrim); + backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + animation: bb-palette-scrim-in var(--bb-motion-duration-short) var(--bb-motion-easing) both; +} + +.bb-palette { + display: flex; + flex-direction: column; + width: min(100%, 640px); + max-height: min(70vh, 560px); + overflow: hidden; + background: var(--bb-surface); + border: 1px solid var(--bb-border); + border-radius: var(--bb-radius-xl); + box-shadow: var(--bb-shadow-dialog); + animation: bb-palette-in var(--bb-motion-duration) var(--bb-motion-enter) both; +} + +@keyframes bb-palette-scrim-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes bb-palette-in { + from { opacity: 0; transform: translateY(-.75rem) scale(.985); } + to { opacity: 1; transform: translateY(0) scale(1); } +} + +/* ---------- Input row ---------- */ + +/* Zero-size, but present in the tab order: the focus trap's two ends. Never `display: none` and + never `visibility: hidden` - either of those takes the element out of the tab order, which is + the one thing it is here for. */ +.bb-focus-sentinel { + position: absolute; + width: 1px; + height: 1px; + opacity: 0; + pointer-events: none; +} + +.bb-palette-input { + display: flex; + align-items: center; + gap: .625rem; + padding: .75rem 1rem; + border-bottom: 1px solid var(--bb-border); + flex: none; +} + +.bb-palette-input > svg { + width: 18px; + height: 18px; + flex: none; + color: var(--bb-text-soft); +} + +.bb-palette-input input { + flex: 1; + min-width: 0; + border: 0; + outline: 0; + background: transparent; + color: var(--bb-text); + font-family: inherit; + font-size: 1rem; + line-height: 1.5; + padding: 0; +} + +.bb-palette-input input::placeholder { + color: var(--bb-text-soft); +} + +/* The pointer's way out. Keyboard readers have Escape, which the label names. */ +.bb-palette-esc { + flex: none; + padding: .1875rem .4375rem; + border: 1px solid var(--bb-border-strong); + border-radius: var(--bb-radius); + background: var(--bb-surface); + color: var(--bb-text-soft); + font-family: var(--bb-mono); + font-size: .6875rem; + cursor: pointer; +} + +.bb-palette-esc:hover { + color: var(--bb-text); + background: var(--bb-surface-hover); +} + +/* ---------- Results ---------- */ + +.bb-palette-results { + overflow-y: auto; + padding: .5rem; + flex: 1; +} + +.bb-palette-group { + padding: .625rem .75rem .25rem; + margin: 0; +} + +/* A three-line row: what it is, what it covers, and where it goes. The URL is on the row on + purpose - it is the address the reader can come back to, and part of the answer. */ +.bb-palette-hit { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + grid-template-areas: + "title url" + "desc url"; + align-items: center; + column-gap: 1rem; + padding: .5rem .75rem; + border-radius: var(--bb-radius); + cursor: pointer; + border-inline-start: 2px solid transparent; +} + +.bb-palette-hit.bb-active { + background: var(--bb-primary-soft); + border-inline-start-color: var(--bb-primary); +} + +.bb-palette-hit-title { + grid-area: title; + font-size: .9375rem; + font-weight: 600; + color: var(--bb-text); + line-height: 1.4; +} + +.bb-palette-hit.bb-active .bb-palette-hit-title { + color: var(--bb-primary-hover); +} + +.bb-palette-hit-desc { + grid-area: desc; + font-size: .8125rem; + line-height: 1.4; + color: var(--bb-text-muted); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.bb-palette-hit-url { + grid-area: url; + font-family: var(--bb-mono); + font-size: .75rem; + color: var(--bb-text-soft); + white-space: nowrap; +} + +.bb-palette-empty { + margin: 0; + padding: 2rem 1rem; + text-align: center; + color: var(--bb-text-muted); + font-size: .9375rem; +} + +.bb-palette-empty em { + font-style: normal; + font-family: var(--bb-mono); + color: var(--bb-text); +} + +/* ---------- Footer legend ---------- */ + +.bb-palette-foot { + display: flex; + gap: 1.25rem; + flex-wrap: wrap; + padding: .5rem 1rem; + border-top: 1px solid var(--bb-border); + background: var(--bb-surface-sunken); + color: var(--bb-text-soft); + font-size: .75rem; + flex: none; +} + +.bb-palette-foot span { + display: inline-flex; + align-items: center; + gap: .3125rem; +} + +/* ---------- Narrow ---------- */ + +@media (max-width: 900px) { + /* The label and the shortcut both stop paying for themselves once the bar is tight: the + shortcut needs a hardware keyboard, and the magnifier says the rest. */ + .bb-search-trigger { + min-width: 0; + width: 32px; + justify-content: center; + padding: 0; + } + + .bb-search-trigger-label, + .bb-search-trigger-keys { + display: none; + } +} + +@media (max-width: 640px) { + .bb-palette-scrim { + padding: 0; + align-items: stretch; + } + + /* Full screen on a phone: 640px of dialog inside a 380px viewport is a dialog with margins, + and the margins are the part the reader cannot use. */ + .bb-palette { + width: 100%; + max-height: none; + border: 0; + border-radius: 0; + } + + /* The URL is the first thing to go: it is the longest run of unbreakable text in the row and + the least useful half of the answer on a screen this narrow. */ + .bb-palette-hit { + grid-template-columns: minmax(0, 1fr); + grid-template-areas: + "title" + "desc"; + } + + .bb-palette-hit-url { + display: none; + } + + .bb-palette-hit-desc { + white-space: normal; + } + + .bb-palette-foot { + display: none; + } +} diff --git a/src/Utilities/Balette/Demo/Client/Layout/DocsLayout.razor b/src/Utilities/Balette/Demo/Client/Layout/DocsLayout.razor new file mode 100644 index 00000000000..9dc838a4894 --- /dev/null +++ b/src/Utilities/Balette/Demo/Client/Layout/DocsLayout.razor @@ -0,0 +1,161 @@ +@inherits LayoutComponentBase +@layout MainLayout +@inject NavigationManager Nav +@implements IDisposable + +@* The documentation shell - part of the site kit every Utilities demo shares (see wwwroot/app.css), + and the default layout of every page but the landing page (Routes.razor). The sidebar stays + mounted while the body swaps pages, so its scroll position survives navigation; the + breadcrumb, the pager and the "edit" link are all recomputed from DocsCatalog on each + navigation. + + Three columns, in the arrangement Fluent's own documentation uses: the nav panel, the page, and + the "on this page" rail. The rail's contents are built by site.js from whatever headings the + page rendered - see the note on the