├── .gitattributes ├── .github └── workflows │ └── vale.yml ├── .gitignore ├── Blazor MAUI Demo.sln ├── BlazorDemo.MAUI ├── App.xaml ├── App.xaml.cs ├── AppShell.xaml ├── AppShell.xaml.cs ├── BlazorDemo.MAUI.csproj ├── BlazorDemo.MAUI.sln ├── MauiProgram.cs ├── MauiViews │ ├── AnalyticsPage.xaml │ ├── AnalyticsPage.xaml.cs │ ├── BlogsPage.xaml │ ├── BlogsPage.xaml.cs │ ├── ChannelsDonutView.xaml │ ├── ChannelsDonutView.xaml.cs │ ├── HybridGridPage.xaml │ ├── HybridGridPage.xaml.cs │ ├── LoginPage.xaml │ ├── LoginPage.xaml.cs │ ├── PageviewsAreaChartView.xaml │ └── PageviewsAreaChartView.xaml.cs ├── Pages │ └── GridPage.razor ├── Platforms │ ├── Android │ │ ├── AndroidManifest.xml │ │ ├── MainActivity.cs │ │ ├── MainApplication.cs │ │ └── Resources │ │ │ └── values │ │ │ └── colors.xml │ ├── MacCatalyst │ │ ├── AppDelegate.cs │ │ ├── Info.plist │ │ └── Program.cs │ ├── Tizen │ │ ├── Main.cs │ │ └── tizen-manifest.xml │ ├── Windows │ │ ├── App.xaml │ │ ├── App.xaml.cs │ │ ├── Package.appxmanifest │ │ └── app.manifest │ └── iOS │ │ ├── AppDelegate.cs │ │ ├── Info.plist │ │ └── Program.cs ├── Resources │ ├── AppIcon │ │ ├── appicon.svg │ │ └── appiconfg.svg │ ├── Fonts │ │ └── OpenSans-Regular.ttf │ ├── Images │ │ ├── analytics.svg │ │ ├── avatars │ │ │ ├── alex.jpg │ │ │ ├── andrey.jpg │ │ │ ├── anthony.jpg │ │ │ ├── bogdan.jpg │ │ │ ├── boris.jpg │ │ │ ├── dennis.jpg │ │ │ ├── dmitry.jpg │ │ │ ├── elena.jpg │ │ │ ├── kseniya.jpg │ │ │ ├── lana.png │ │ │ ├── margarita.jpg │ │ │ ├── poline.png │ │ │ └── vlada.jpg │ │ ├── background.svg │ │ ├── blazor_accordion.png │ │ ├── blazor_editors_buttons.png │ │ ├── blazor_excel_export.png │ │ ├── blazor_hybrid.png │ │ ├── blazor_integrated_editor.png │ │ ├── blazor_reporting.png │ │ ├── blazor_searchbox.png │ │ ├── blazor_toolbar.png │ │ ├── blazor_window.png │ │ ├── blogs.svg │ │ ├── dashboard_report_security.png │ │ ├── dashboard_roadmap.png │ │ ├── delete.svg │ │ ├── devexpress.png │ │ ├── devextreme__fonts.png │ │ ├── devextreme_calendar.png │ │ ├── devextreme_roadmap.png │ │ ├── dotnet_bot.svg │ │ ├── editorsname.svg │ │ ├── editorspassword.svg │ │ ├── loginbackground.png │ │ ├── loginbackground_black.png │ │ ├── logout.svg │ │ ├── maui_feedback.png │ │ ├── maui_hotreload.png │ │ ├── maui_md3.png │ │ ├── maui_release.png │ │ ├── office_roadmap.png │ │ ├── reporting_roadmap.png │ │ ├── reporting_serial_shipping.png │ │ ├── share.svg │ │ ├── tasks.svg │ │ ├── treelist_asynchronous_loading.png │ │ ├── winforms_roadmap.png │ │ ├── wpf9tips.png │ │ └── xaf_roadmap.png │ ├── Raw │ │ └── AboutAssets.txt │ └── Splash │ │ └── splash.svg ├── ViewModels │ ├── BaseViewModel.cs │ ├── BlogsViewModel.cs │ ├── ChannelDonutViewModel.cs │ ├── LoginViewModel.cs │ └── PageviewsAreaChartViewModel.cs ├── _Imports.razor └── wwwroot │ ├── css │ ├── app.css │ ├── bootstrap │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ └── open-iconic │ │ ├── FONT-LICENSE │ │ ├── ICON-LICENSE │ │ ├── README.md │ │ └── font │ │ ├── css │ │ └── open-iconic-bootstrap.min.css │ │ └── fonts │ │ ├── open-iconic.eot │ │ ├── open-iconic.otf │ │ ├── open-iconic.svg │ │ ├── open-iconic.ttf │ │ └── open-iconic.woff │ ├── favicon.ico │ └── index.html ├── BlazorDemo.Server ├── App.razor ├── BlazorDemo.Server.csproj ├── NOTICE.txt ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ ├── GridPage.razor │ ├── Index.razor │ ├── _Host.cshtml │ └── _Layout.cshtml ├── Program.cs ├── Shared │ ├── BrowserNotSupported.razor │ ├── Header.razor │ ├── Header.razor.css │ ├── MainLayout.razor │ ├── MainLayout.razor.css │ ├── NavMenu.razor │ └── NavMenu.razor.css ├── _Imports.razor ├── appsettings.Development.json ├── appsettings.json ├── readme.html └── wwwroot │ ├── css │ ├── bootstrap │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ ├── open.iconic │ │ ├── FONT-LICENSE.txt │ │ ├── ICON-LICENSE.txt │ │ ├── README.md │ │ └── font │ │ │ ├── css │ │ │ └── open-iconic-bootstrap.min.css │ │ │ └── fonts │ │ │ ├── open-iconic.eot │ │ │ ├── open-iconic.otf │ │ │ ├── open-iconic.svg │ │ │ ├── open-iconic.ttf │ │ │ └── open-iconic.woff │ └── site.css │ └── images │ ├── banner.png │ └── sad.svg ├── BlazorDemo.Shared ├── BlazorDemo.Shared.csproj ├── Components │ ├── Grid.razor │ ├── GridDetails.razor │ ├── GridList.razor │ └── GridList.razor.css ├── Data │ ├── DataProviders │ │ └── IssuesDataProvider.cs │ ├── Issue.cs │ ├── Project.cs │ ├── ServiceCollectionExtensions.cs │ ├── Services │ │ └── IssuesDataService.cs │ └── User.cs ├── Program.cs ├── _Imports.razor └── wwwroot │ ├── background.png │ ├── column-chooser.svg │ └── exampleJsInterop.js ├── CODEOWNERS ├── LICENSE ├── README.md ├── config.json └── media ├── hybrid-view.png └── maui-views.png /.gitattributes: -------------------------------------------------------------------------------- 1 | VB/* linguist-vendored 2 | scripts linguist-vendored 3 | *.css linguist-detectable=false 4 | *.aff linguist-detectable=false 5 | -------------------------------------------------------------------------------- /.github/workflows/vale.yml: -------------------------------------------------------------------------------- 1 | name: vale-validation 2 | on: 3 | pull_request: 4 | paths: 5 | - README.md 6 | - readme.md 7 | - Readme.md 8 | 9 | jobs: 10 | vale: 11 | name: runner / vale 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: clone repo 15 | uses: actions/checkout@v4 16 | - name: clone vale-styles repo 17 | uses: actions/checkout@v4 18 | with: 19 | repository: DevExpress/vale-styles 20 | path: vale-styles 21 | ssh-key: ${{ secrets.VALE_STYLES_ACCESS_KEY }} 22 | - name: copy vale rules to the root repo 23 | run: shopt -s dotglob && cp -r ./vale-styles/vale/* . 24 | - name: vale linter check 25 | uses: DevExpress/vale-action@reviewdog 26 | with: 27 | files: '["README.md", "readme.md", "Readme.md"]' 28 | fail_on_error: true 29 | filter_mode: nofilter 30 | reporter: github-check 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # MSTest test Results 33 | [Tt]est[Rr]esult*/ 34 | [Bb]uild[Ll]og.* 35 | 36 | # NUNIT 37 | *.VisualState.xml 38 | TestResult.xml 39 | 40 | # Build Results of an ATL Project 41 | [Dd]ebugPS/ 42 | [Rr]eleasePS/ 43 | dlldata.c 44 | 45 | # Benchmark Results 46 | BenchmarkDotNet.Artifacts/ 47 | 48 | # .NET Core 49 | project.lock.json 50 | project.fragment.lock.json 51 | artifacts/ 52 | **/Properties/launchSettings.json 53 | 54 | *_i.c 55 | *_p.c 56 | *_i.h 57 | *.ilk 58 | *.meta 59 | *.obj 60 | *.pch 61 | *.pdb 62 | *.pgc 63 | *.pgd 64 | *.rsp 65 | *.sbr 66 | *.tlb 67 | *.tli 68 | *.tlh 69 | *.tmp 70 | *.tmp_proj 71 | *.log 72 | *.vspscc 73 | *.vssscc 74 | .builds 75 | *.pidb 76 | *.svclog 77 | *.scc 78 | 79 | # Chutzpah Test files 80 | _Chutzpah* 81 | 82 | # Visual C++ cache files 83 | ipch/ 84 | *.aps 85 | *.ncb 86 | *.opendb 87 | *.opensdf 88 | *.sdf 89 | *.cachefile 90 | *.VC.db 91 | *.VC.VC.opendb 92 | 93 | # Visual Studio profiler 94 | *.psess 95 | *.vsp 96 | *.vspx 97 | *.sap 98 | 99 | # TFS 2012 Local Workspace 100 | $tf/ 101 | 102 | # Guidance Automation Toolkit 103 | *.gpState 104 | 105 | # ReSharper is a .NET coding add-in 106 | _ReSharper*/ 107 | *.[Rr]e[Ss]harper 108 | *.DotSettings.user 109 | 110 | # JustCode is a .NET coding add-in 111 | .JustCode 112 | 113 | # TeamCity is a build add-in 114 | _TeamCity* 115 | 116 | # DotCover is a Code Coverage Tool 117 | *.dotCover 118 | 119 | # AxoCover is a Code Coverage Tool 120 | .axoCover/* 121 | !.axoCover/settings.json 122 | 123 | # Visual Studio code coverage results 124 | *.coverage 125 | *.coveragexml 126 | 127 | # NCrunch 128 | _NCrunch_* 129 | .*crunch*.local.xml 130 | nCrunchTemp_* 131 | 132 | # MightyMoose 133 | *.mm.* 134 | AutoTest.Net/ 135 | 136 | # Web workbench (sass) 137 | .sass-cache/ 138 | 139 | # Installshield output folder 140 | [Ee]xpress/ 141 | 142 | # DocProject is a documentation generator add-in 143 | DocProject/buildhelp/ 144 | DocProject/Help/*.HxT 145 | DocProject/Help/*.HxC 146 | DocProject/Help/*.hhc 147 | DocProject/Help/*.hhk 148 | DocProject/Help/*.hhp 149 | DocProject/Help/Html2 150 | DocProject/Help/html 151 | 152 | # Click-Once directory 153 | publish/ 154 | 155 | # Publish Web Output 156 | *.[Pp]ublish.xml 157 | *.azurePubxml 158 | # Note: Comment the next line if you want to checkin your web deploy settings, 159 | # but database connection strings (with potential passwords) will be unencrypted 160 | *.pubxml 161 | *.publishproj 162 | 163 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 164 | # checkin your Azure Web App publish settings, but sensitive information contained 165 | # in these scripts will be unencrypted 166 | PublishScripts/ 167 | 168 | # NuGet Packages 169 | *.nupkg 170 | # The packages folder can be ignored because of Package Restore 171 | **/packages/* 172 | # except build/, which is used as an MSBuild target. 173 | !**/packages/build/ 174 | # Uncomment if necessary however generally it will be regenerated when needed 175 | #!**/packages/repositories.config 176 | # NuGet v3's project.json files produces more ignorable files 177 | *.nuget.props 178 | *.nuget.targets 179 | 180 | # Microsoft Azure Build Output 181 | csx/ 182 | *.build.csdef 183 | 184 | # Microsoft Azure Emulator 185 | ecf/ 186 | rcf/ 187 | 188 | # Windows Store app package directories and files 189 | AppPackages/ 190 | BundleArtifacts/ 191 | Package.StoreAssociation.xml 192 | _pkginfo.txt 193 | *.appx 194 | 195 | # Visual Studio cache files 196 | # files ending in .cache can be ignored 197 | *.[Cc]ache 198 | # but keep track of directories ending in .cache 199 | !*.[Cc]ache/ 200 | 201 | # Others 202 | ClientBin/ 203 | ~$* 204 | *~ 205 | *.dbmdl 206 | *.dbproj.schemaview 207 | *.jfm 208 | *.pfx 209 | *.publishsettings 210 | orleans.codegen.cs 211 | 212 | # Since there are multiple workflows, uncomment next line to ignore bower_components 213 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 214 | #bower_components/ 215 | 216 | # RIA/Silverlight projects 217 | Generated_Code/ 218 | 219 | # Backup & report files from converting an old project file 220 | # to a newer Visual Studio version. Backup files are not needed, 221 | # because we have git ;-) 222 | _UpgradeReport_Files/ 223 | Backup*/ 224 | UpgradeLog*.XML 225 | UpgradeLog*.htm 226 | 227 | # SQL Server files 228 | *.mdf 229 | *.ldf 230 | *.ndf 231 | 232 | # Business Intelligence projects 233 | *.rdl.data 234 | *.bim.layout 235 | *.bim_*.settings 236 | 237 | # Microsoft Fakes 238 | FakesAssemblies/ 239 | 240 | # GhostDoc plugin setting file 241 | *.GhostDoc.xml 242 | 243 | # Node.js Tools for Visual Studio 244 | .ntvs_analysis.dat 245 | node_modules/ 246 | 247 | # Typescript v1 declaration files 248 | typings/ 249 | 250 | # Visual Studio 6 build log 251 | *.plg 252 | 253 | # Visual Studio 6 workspace options file 254 | *.opt 255 | 256 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 257 | *.vbw 258 | 259 | # Visual Studio LightSwitch build output 260 | **/*.HTMLClient/GeneratedArtifacts 261 | **/*.DesktopClient/GeneratedArtifacts 262 | **/*.DesktopClient/ModelManifest.xml 263 | **/*.Server/GeneratedArtifacts 264 | **/*.Server/ModelManifest.xml 265 | _Pvt_Extensions 266 | 267 | # Paket dependency manager 268 | .paket/paket.exe 269 | paket-files/ 270 | 271 | # FAKE - F# Make 272 | .fake/ 273 | 274 | # JetBrains Rider 275 | .idea/ 276 | *.sln.iml 277 | 278 | # CodeRush 279 | .cr/ 280 | 281 | # Python Tools for Visual Studio (PTVS) 282 | __pycache__/ 283 | *.pyc 284 | 285 | # Cake - Uncomment if you are using it 286 | # tools/** 287 | # !tools/packages.config 288 | 289 | # Tabs Studio 290 | *.tss 291 | 292 | # Telerik's JustMock configuration file 293 | *.jmconfig 294 | 295 | # BizTalk build output 296 | *.btp.cs 297 | *.btm.cs 298 | *.odx.cs 299 | *.xsd.cs 300 | 301 | #ExampleRangeTester artifacts 302 | TesterMetadata.xml 303 | 304 | # Backup files 305 | *.bak 306 | 307 | # Local server for npm packages 308 | .npmrc 309 | -------------------------------------------------------------------------------- /Blazor MAUI Demo.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.5.33326.253 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorDemo.Server", "BlazorDemo.Server\BlazorDemo.Server.csproj", "{FEF63A9B-540B-4DF1-9244-C4D3A178FF7C}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorDemo.MAUI", "BlazorDemo.MAUI\BlazorDemo.MAUI.csproj", "{766C3230-8BDD-4A8D-85A0-1E9A56C224E7}" 9 | EndProject 10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorDemo.Shared", "BlazorDemo.Shared\BlazorDemo.Shared.csproj", "{631DE0BC-0AB0-4CF0-94FC-53D3FA58609C}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Any CPU = Debug|Any CPU 15 | Release|Any CPU = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {FEF63A9B-540B-4DF1-9244-C4D3A178FF7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {FEF63A9B-540B-4DF1-9244-C4D3A178FF7C}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {FEF63A9B-540B-4DF1-9244-C4D3A178FF7C}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {FEF63A9B-540B-4DF1-9244-C4D3A178FF7C}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {766C3230-8BDD-4A8D-85A0-1E9A56C224E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {766C3230-8BDD-4A8D-85A0-1E9A56C224E7}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {766C3230-8BDD-4A8D-85A0-1E9A56C224E7}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 25 | {766C3230-8BDD-4A8D-85A0-1E9A56C224E7}.Release|Any CPU.ActiveCfg = Release|Any CPU 26 | {766C3230-8BDD-4A8D-85A0-1E9A56C224E7}.Release|Any CPU.Build.0 = Release|Any CPU 27 | {766C3230-8BDD-4A8D-85A0-1E9A56C224E7}.Release|Any CPU.Deploy.0 = Release|Any CPU 28 | {631DE0BC-0AB0-4CF0-94FC-53D3FA58609C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 29 | {631DE0BC-0AB0-4CF0-94FC-53D3FA58609C}.Debug|Any CPU.Build.0 = Debug|Any CPU 30 | {631DE0BC-0AB0-4CF0-94FC-53D3FA58609C}.Release|Any CPU.ActiveCfg = Release|Any CPU 31 | {631DE0BC-0AB0-4CF0-94FC-53D3FA58609C}.Release|Any CPU.Build.0 = Release|Any CPU 32 | EndGlobalSection 33 | GlobalSection(SolutionProperties) = preSolution 34 | HideSolutionNode = FALSE 35 | EndGlobalSection 36 | GlobalSection(ExtensibilityGlobals) = postSolution 37 | SolutionGuid = {744CCBD4-385F-4A3D-8C59-3EC09E09B26E} 38 | EndGlobalSection 39 | EndGlobal 40 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/App.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | #6750A4 8 | White 9 | Black 10 | #D0BCFF 11 | #F9F6FF 12 | #F2F2F7 13 | #E1E1E1 14 | #C8C8C8 15 | #ACACAC 16 | #919191 17 | #6E6E6E 18 | #404040 19 | #212121 20 | #141414 21 | #55575c 22 | #55575c 23 | #959aa0 24 | White 25 | White 26 | 31 | 32 | 44 | 45 | 69 | 73 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/App.xaml.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace BlazorDemo.MAUI 3 | { 4 | public partial class App : Application 5 | { 6 | public App() 7 | { 8 | InitializeComponent(); 9 | } 10 | 11 | protected override Window CreateWindow(IActivationState activationState) 12 | { 13 | return new Window(new AppShell()); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/AppShell.xaml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/AppShell.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorDemo.MAUI 2 | { 3 | public partial class AppShell : Shell { 4 | public AppShell() 5 | { 6 | InitializeComponent(); 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/BlazorDemo.MAUI.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net9.0-android;net9.0-ios 4 | 5 | 6 | Exe 7 | BlazorDemo.MAUI 8 | true 9 | true 10 | disable 11 | enable 12 | false 13 | 14 | Blazor MAUI 15 | 16 | com.companyname.blazormaui 17 | 3C1B2C61-7A59-4FCC-AF5C-7FBCF36A03B6 18 | 19 | 1.0 20 | 1 21 | 14.2 22 | 24.0 23 | false 24 | 9.0.10 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/BlazorDemo.MAUI.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.0.31903.59 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorDemo.MAUI", "BlazorDemo.MAUI.csproj", "{4281D21F-5375-42EB-8E8F-5977F9D8B8FA}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(SolutionProperties) = preSolution 14 | HideSolutionNode = FALSE 15 | EndGlobalSection 16 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 17 | {4281D21F-5375-42EB-8E8F-5977F9D8B8FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 18 | {4281D21F-5375-42EB-8E8F-5977F9D8B8FA}.Debug|Any CPU.Build.0 = Debug|Any CPU 19 | {4281D21F-5375-42EB-8E8F-5977F9D8B8FA}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 20 | {4281D21F-5375-42EB-8E8F-5977F9D8B8FA}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {4281D21F-5375-42EB-8E8F-5977F9D8B8FA}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {4281D21F-5375-42EB-8E8F-5977F9D8B8FA}.Release|Any CPU.Deploy.0 = Release|Any CPU 23 | EndGlobalSection 24 | EndGlobal 25 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiProgram.cs: -------------------------------------------------------------------------------- 1 | using BlazorDemo.Shared.Data.DataProviders; 2 | using BlazorDemo.Shared.Data.Services; 3 | using DevExpress.Maui; 4 | 5 | namespace BlazorDemo.MAUI 6 | { 7 | public static class MauiProgram 8 | { 9 | public static MauiApp CreateMauiApp() 10 | { 11 | DevExpress.Maui.Core.ThemeManager.ApplyThemeToSystemBars = true; 12 | var builder = MauiApp.CreateBuilder(); 13 | builder.UseMauiApp() 14 | .ConfigureFonts(fonts => 15 | { 16 | fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); 17 | }); 18 | builder.UseDevExpress(); 19 | builder.UseDevExpressCharts(); 20 | builder.UseDevExpressCollectionView(); 21 | builder.UseDevExpressControls(); 22 | builder.UseDevExpressEditors(); 23 | builder.Services.AddMauiBlazorWebView(); 24 | builder.Services.AddDevExpressBlazor(options => { 25 | options.BootstrapVersion = DevExpress.Blazor.BootstrapVersion.v5; 26 | options.SizeMode = DevExpress.Blazor.SizeMode.Large; 27 | }); 28 | builder.Services.AddSingleton(); 29 | builder.Services.AddScoped(); 30 | #if DEBUG 31 | builder.Services.AddBlazorWebViewDeveloperTools(); 32 | #endif 33 | ; 34 | 35 | return builder.Build(); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/AnalyticsPage.xaml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 23 | 24 | 25 | 26 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/AnalyticsPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorDemo.MAUI.MauiViews; 2 | 3 | public partial class AnalyticsPage : ContentPage 4 | { 5 | public AnalyticsPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | private async void AnalyticsItemClicked(object sender, EventArgs e) { 10 | await DisplayAlert("Clicked", "Navigate to a detail view here", "OK"); 11 | } 12 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/BlogsPage.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/BlogsPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorDemo.MAUI.MauiViews; 2 | 3 | public partial class BlogsPage : ContentPage 4 | { 5 | public BlogsPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/ChannelsDonutView.xaml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/ChannelsDonutView.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorDemo.MAUI.MauiViews; 2 | 3 | public partial class ChannelsDonutView : ContentView 4 | { 5 | public ChannelsDonutView() 6 | { 7 | InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/HybridGridPage.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/HybridGridPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorDemo.MAUI.MauiViews; 2 | 3 | public partial class HybridGridPage : ContentPage 4 | { 5 | public HybridGridPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/LoginPage.xaml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 37 | 38 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/LoginPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorDemo.MAUI.MauiViews; 2 | 3 | public partial class LoginPage : ContentPage 4 | { 5 | public LoginPage() 6 | { 7 | InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/PageviewsAreaChartView.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 65 | 66 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/MauiViews/PageviewsAreaChartView.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorDemo.MAUI.MauiViews; 2 | 3 | public partial class PageviewsAreaChartView : ContentView 4 | { 5 | public PageviewsAreaChartView() 6 | { 7 | InitializeComponent(); 8 | } 9 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Pages/GridPage.razor: -------------------------------------------------------------------------------- 1 | @page "/grid" 2 | 3 | @using BlazorDemo.Shared.Components 4 | 5 | 6 | 7 | @code { 8 | protected override void OnAfterRender(bool firstRender) 9 | { 10 | base.OnAfterRender(firstRender); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Android/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Android/MainActivity.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Content.PM; 3 | using Android.OS; 4 | 5 | namespace BlazorDemo.MAUI 6 | { 7 | [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] 8 | public class MainActivity : MauiAppCompatActivity 9 | { 10 | } 11 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Android/MainApplication.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Runtime; 3 | 4 | namespace BlazorDemo.MAUI 5 | { 6 | [Application] 7 | public class MainApplication : MauiApplication 8 | { 9 | public MainApplication(IntPtr handle, JniHandleOwnership ownership) 10 | : base(handle, ownership) 11 | { 12 | } 13 | 14 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 15 | } 16 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Android/Resources/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #512BD4 4 | #6750A4 5 | #2B0B98 6 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/MacCatalyst/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using Foundation; 2 | 3 | namespace BlazorDemo.MAUI 4 | { 5 | [Register("AppDelegate")] 6 | public class AppDelegate : MauiUIApplicationDelegate 7 | { 8 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 9 | } 10 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/MacCatalyst/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIDeviceFamily 6 | 7 | 1 8 | 2 9 | 10 | UIRequiredDeviceCapabilities 11 | 12 | arm64 13 | 14 | UISupportedInterfaceOrientations 15 | 16 | UIInterfaceOrientationPortrait 17 | UIInterfaceOrientationLandscapeLeft 18 | UIInterfaceOrientationLandscapeRight 19 | 20 | UISupportedInterfaceOrientations~ipad 21 | 22 | UIInterfaceOrientationPortrait 23 | UIInterfaceOrientationPortraitUpsideDown 24 | UIInterfaceOrientationLandscapeLeft 25 | UIInterfaceOrientationLandscapeRight 26 | 27 | XSAppIconAssets 28 | Assets.xcassets/appicon.appiconset 29 | 30 | 31 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/MacCatalyst/Program.cs: -------------------------------------------------------------------------------- 1 | using ObjCRuntime; 2 | using UIKit; 3 | 4 | namespace BlazorDemo.MAUI 5 | { 6 | public class Program 7 | { 8 | // This is the main entry point of the application. 9 | static void Main(string[] args) 10 | { 11 | // if you want to use a different Application Delegate class from "AppDelegate" 12 | // you can specify it here. 13 | UIApplication.Main(args, null, typeof(AppDelegate)); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Tizen/Main.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Maui; 2 | using Microsoft.Maui.Hosting; 3 | using System; 4 | 5 | namespace BlazorDemo.MAUI 6 | { 7 | internal class Program : MauiApplication 8 | { 9 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 10 | 11 | static void Main(string[] args) 12 | { 13 | var app = new Program(); 14 | app.Run(args); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Tizen/tizen-manifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | maui-appicon-placeholder 7 | 8 | 9 | 10 | 11 | http://tizen.org/privilege/internet 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Windows/App.xaml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Windows/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | 3 | 4 | namespace BlazorDemo.MAUI.WinUI 5 | { 6 | /// 7 | /// Provides application-specific behavior to supplement the default Application class. 8 | /// 9 | public partial class App : MauiWinUIApplication 10 | { 11 | /// 12 | /// Initializes the singleton application object. This is the first line of authored code 13 | /// executed, and as such is the logical equivalent of main() or WinMain(). 14 | /// 15 | public App() 16 | { 17 | this.InitializeComponent(); 18 | } 19 | 20 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 21 | } 22 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Windows/Package.appxmanifest: -------------------------------------------------------------------------------- 1 |  2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | $placeholder$ 15 | User Name 16 | $placeholder$.png 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/Windows/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | true/PM 12 | PerMonitorV2, PerMonitor 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using Foundation; 2 | 3 | namespace BlazorDemo.MAUI 4 | { 5 | [Register("AppDelegate")] 6 | public class AppDelegate : MauiUIApplicationDelegate 7 | { 8 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 9 | } 10 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | LSRequiresIPhoneOS 6 | 7 | UIDeviceFamily 8 | 9 | 1 10 | 2 11 | 12 | UIRequiredDeviceCapabilities 13 | 14 | arm64 15 | 16 | UISupportedInterfaceOrientations 17 | 18 | UIInterfaceOrientationPortrait 19 | UIInterfaceOrientationLandscapeLeft 20 | UIInterfaceOrientationLandscapeRight 21 | 22 | UISupportedInterfaceOrientations~ipad 23 | 24 | UIInterfaceOrientationPortrait 25 | UIInterfaceOrientationPortraitUpsideDown 26 | UIInterfaceOrientationLandscapeLeft 27 | UIInterfaceOrientationLandscapeRight 28 | 29 | XSAppIconAssets 30 | Assets.xcassets/appicon.appiconset 31 | 32 | 33 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Platforms/iOS/Program.cs: -------------------------------------------------------------------------------- 1 | using ObjCRuntime; 2 | using UIKit; 3 | 4 | namespace BlazorDemo.MAUI 5 | { 6 | public class Program 7 | { 8 | // This is the main entry point of the application. 9 | static void Main(string[] args) 10 | { 11 | // if you want to use a different Application Delegate class from "AppDelegate" 12 | // you can specify it here. 13 | UIApplication.Main(args, null, typeof(AppDelegate)); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/AppIcon/appicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/AppIcon/appiconfg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Fonts/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Fonts/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/analytics.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/alex.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/alex.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/andrey.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/andrey.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/anthony.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/anthony.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/bogdan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/bogdan.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/boris.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/boris.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/dennis.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/dennis.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/dmitry.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/dmitry.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/elena.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/elena.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/kseniya.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/kseniya.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/lana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/lana.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/margarita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/margarita.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/poline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/poline.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/avatars/vlada.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/avatars/vlada.jpg -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blazor_accordion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/blazor_accordion.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blazor_editors_buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/blazor_editors_buttons.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blazor_excel_export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/blazor_excel_export.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blazor_hybrid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/blazor_hybrid.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blazor_integrated_editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/blazor_integrated_editor.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blazor_reporting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/blazor_reporting.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blazor_searchbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/blazor_searchbox.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blazor_toolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/blazor_toolbar.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blazor_window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/blazor_window.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/blogs.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 24 | 25 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/dashboard_report_security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/dashboard_report_security.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/dashboard_roadmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/dashboard_roadmap.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/devexpress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/devexpress.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/devextreme__fonts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/devextreme__fonts.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/devextreme_calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/devextreme_calendar.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/devextreme_roadmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/devextreme_roadmap.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/editorsname.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/editorspassword.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/loginbackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/loginbackground.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/loginbackground_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/loginbackground_black.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/logout.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/maui_feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/maui_feedback.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/maui_hotreload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/maui_hotreload.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/maui_md3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/maui_md3.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/maui_release.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/maui_release.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/office_roadmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/office_roadmap.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/reporting_roadmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/reporting_roadmap.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/reporting_serial_shipping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/reporting_serial_shipping.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/tasks.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/treelist_asynchronous_loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/treelist_asynchronous_loading.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/winforms_roadmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/winforms_roadmap.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/wpf9tips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/wpf9tips.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Images/xaf_roadmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/Resources/Images/xaf_roadmap.png -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Raw/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories). Deployment of the asset to your application 3 | is automatically handled by the following `MauiAsset` Build Action within your `.csproj`. 4 | 5 | 6 | 7 | These files will be deployed with you package and will be accessible using Essentials: 8 | 9 | async Task LoadMauiAsset() 10 | { 11 | using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt"); 12 | using var reader = new StreamReader(stream); 13 | 14 | var contents = reader.ReadToEnd(); 15 | } 16 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/Resources/Splash/splash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/ViewModels/BaseViewModel.cs: -------------------------------------------------------------------------------- 1 | using DevExpress.Xpo.DB; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel; 5 | using System.Linq; 6 | using System.Runtime.CompilerServices; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | 10 | namespace BlazorDemo.MAUI.ViewModels { 11 | public class BaseViewModel : INotifyPropertyChanged { 12 | public event PropertyChangedEventHandler PropertyChanged; 13 | bool _isBusy; 14 | string _title = string.Empty; 15 | public IDataStore DataStore => DependencyService.Get(); 16 | 17 | public bool IsBusy { 18 | get => _isBusy; 19 | set => SetProperty(ref _isBusy, value); 20 | } 21 | 22 | public virtual Task InitializeAsync(object parameter) => Task.CompletedTask; 23 | 24 | protected bool SetProperty(ref T backingStore, T value, [CallerMemberName] string propertyName = "", Action onChanged = null) { 25 | if (EqualityComparer.Default.Equals(backingStore, value)) 26 | return false; 27 | 28 | backingStore = value; 29 | onChanged?.Invoke(); 30 | OnPropertyChanged(propertyName); 31 | return true; 32 | } 33 | 34 | protected void OnPropertyChanged([CallerMemberName] string propertyName = "") { 35 | var changed = PropertyChanged; 36 | if (changed == null) 37 | return; 38 | 39 | changed.Invoke(this, new PropertyChangedEventArgs(propertyName)); 40 | } 41 | 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/ViewModels/BlogsViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.ObjectModel; 4 | using System.ComponentModel; 5 | using System.Linq; 6 | using System.Runtime.CompilerServices; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Windows.Input; 10 | using DevExpress.Maui.Mvvm; 11 | 12 | namespace BlazorDemo.MAUI.ViewModels { 13 | public class BlogsViewModel : BaseViewModel { 14 | int lastLoadedIndex = 0; 15 | int loadBatchSize = 5; 16 | int sourceSize = 0; 17 | bool isLoading; 18 | public ObservableCollection Blogs { get; set; } 19 | public ICommand LoadMoreCommand { get; set; } 20 | public ICommand ShareCommand { get; set; } 21 | public ICommand OpenBlogCommand { get; set; } 22 | public bool IsLoading { 23 | get => isLoading; 24 | set { 25 | isLoading = value; 26 | OnPropertyChanged(); 27 | } 28 | } 29 | public BlogsViewModel() { 30 | Blogs = new ObservableCollection(); 31 | sourceSize = DataStorage.GetTotalCount(); 32 | LoadBatch(); 33 | LoadMoreCommand = new Command(LoadMore, CanLoadMore); 34 | ShareCommand = new Command(ShareBlog); 35 | OpenBlogCommand = new Command(OpenBlog); 36 | } 37 | public async void LoadBatch() { 38 | IEnumerable newBlogsBatch = null; 39 | IsLoading = true; 40 | await Task.Run(() => 41 | { 42 | Thread.Sleep(1000); 43 | newBlogsBatch = DataStorage.GetBlogs(lastLoadedIndex, loadBatchSize); 44 | }); 45 | newBlogsBatch.ForEach(x => Blogs.Add(x)); 46 | IsLoading = false; 47 | } 48 | public void LoadMore() { 49 | LoadBatch(); 50 | lastLoadedIndex += loadBatchSize; 51 | } 52 | public bool CanLoadMore() { 53 | return Blogs.Count < sourceSize; 54 | } 55 | public async void ShareBlog(BlogPost blog) { 56 | await Share.Default.RequestAsync(new ShareTextRequest { 57 | Text = blog.Url, 58 | Title = "Share the Blog With your Friends" 59 | }); 60 | } 61 | public async void OpenBlog(BlogPost blog) { 62 | try { 63 | await Browser.Default.OpenAsync(new Uri(blog.Url), BrowserLaunchMode.SystemPreferred); 64 | } 65 | catch (Exception) { 66 | await App.Current.MainPage.DisplayAlert("Error", "Couldn't open the URL", "OK"); 67 | } 68 | } 69 | } 70 | public class BlogPost { 71 | public BlogPost(int id, string title, string authorName, DateTime publicationDate, string imagePath, string url) { 72 | Id = id; 73 | Title = title; 74 | AuthorName = authorName; 75 | PublicationDate = publicationDate; 76 | ImagePath = imagePath; 77 | Url = url; 78 | } 79 | public int Id { get; set; } 80 | public string Title { get; set; } 81 | public string AuthorName { get; set; } 82 | public DateTime PublicationDate { get; set; } 83 | public string ImagePath { get; set; } 84 | public string Url { get; set; } 85 | public string AvatarPath => "avatars/" + AuthorName?.ToLower(); 86 | 87 | } 88 | 89 | public static class DataStorage { 90 | static DataStorage() { 91 | allBlogs = CreateBlogs(); 92 | } 93 | 94 | public static IEnumerable GetBlogs(int startIndex, int batchSize) { 95 | return allBlogs.Skip(startIndex).Take(batchSize); 96 | } 97 | public static int GetTotalCount() { 98 | return allBlogs.Count; 99 | } 100 | static List allBlogs; 101 | static List CreateBlogs() { 102 | return new List() { 103 | new BlogPost(1, "DevExtreme Roadmap (Angular, React, Vue, jQuery)", "Vlada", new DateTime(2023,2,22), "devextreme_roadmap", "https://community.devexpress.com/blogs/javascript/archive/2023/02/22/devextreme-components-roadmap-2023-1.aspx"), 104 | new BlogPost(1, "Blazor Editors — Command Buttons", "Margarita", new DateTime(2023,2,22), "blazor_editors_buttons","https://community.devexpress.com/blogs/aspnet/archive/2023/02/22/Blazor-Editors-Command-Buttons-v22-2.aspx"), 105 | new BlogPost(1, "DevExpress Reports Roadmap (Survey Inside)", "Dmitry", new DateTime(2023,2,21), "reporting_roadmap", "https://community.devexpress.com/blogs/reporting/archive/2023/02/21/devexpress-reports-v23-1-june-2023-roadmap-survey-inside.aspx"), 106 | new BlogPost(1, "Announcing DevExpress Mobile UI for .NET MAUI", "Anthony", new DateTime(2023,2,21), "maui_release","https://community.devexpress.com/blogs/mobile/archive/2023/02/22/announcing-devexpress-mobile-ui-for-net-maui-v22-2.aspx"), 107 | new BlogPost(1, "Office File API & Office-Inspired UI Controls Roadmap (Survey Inside)", "Dmitry", new DateTime(2023,2,21), "office_roadmap","https://community.devexpress.com/blogs/office/archive/2023/02/21/office-file-api-office-inspired-ui-controls-v23-1-june-2023-roadmap-survey-inside.aspx"), 108 | new BlogPost(1, "DevExpress BI Dashboard Roadmap (Survey Inside)", "Dmitry", new DateTime(2023,2,21), "dashboard_roadmap","https://community.devexpress.com/blogs/analytics/archive/2023/02/21/devexpress-bi-dashboard-v23-1-june-2023-roadmap-survey-inside.aspx"), 109 | new BlogPost(1, "Reporting — Serial Shipping Container Code (SSCC-18): A Solution for Walmart's Packaging Needs", "Boris", new DateTime(2023,2,20), "reporting_serial_shipping","https://community.devexpress.com/blogs/reporting/archive/2023/02/20/reporting-serial-shipping-container-code-sscc-18-a-solution-for-walmart-39-s-packaging-needs.aspx"), 110 | new BlogPost(1, "DevExpress.Drawing Graphics Library — Update — Package Dependencies and Font Libraries", "Poline", new DateTime(2023,2,16), "devextreme__fonts","https://community.devexpress.com/blogs/news/archive/2023/02/16/devexpress-drawing-graphics-library-v22-2-4-update-package-dependencies-and-font-libraries.aspx"), 111 | new BlogPost(1, "DevExpress WinForms Roadmap", "Bogdan", new DateTime(2023,2,16), "winforms_roadmap","https://community.devexpress.com/blogs/winforms/archive/2023/02/16/devexpress-winforms-roadmap-23-1.aspx"), 112 | new BlogPost(1, "XAF Roadmap (Cross-Platform .NET App UI & Web API Service)", "Dennis", new DateTime(2023,2,9), "xaf_roadmap","https://community.devexpress.com/blogs/xaf/archive/2023/02/09/xaf-2023-1-roadmap-cross-platform-net-app-ui-and-web-api-service.aspx"), 113 | new BlogPost(1, "Blazor Reporting — Quick Start with New Project Templates", "Boris", new DateTime(2023,2,6), "blazor_reporting","https://community.devexpress.com/blogs/reporting/archive/2023/02/06/blazor-reporting-quick-start-with-new-project-templates.aspx"), 114 | new BlogPost(1, "Blazor Toolbar — Data Binding", "Elena", new DateTime(2023,2,1), "blazor_toolbar","https://community.devexpress.com/blogs/aspnet/archive/2023/02/01/Blazor-Toolbar-Data-Binding-_2800_v22.2_2900_.aspx"), 115 | new BlogPost(1, "9 Tips to Reduce WPF App Startup Time", "Andrey", new DateTime(2023,1,26), "wpf9tips","https://community.devexpress.com/blogs/wpf/archive/2023/01/26/9-tips-to-reduce-wpf-app-startup-time.aspx"), 116 | new BlogPost(1, ".NET MAUI Controls — Material Design 3", "Anthony", new DateTime(2023,1,25), "maui_md3","https://community.devexpress.com/blogs/mobile/archive/2023/01/25/net-maui-controls-v22-2-material-design-3.aspx"), 117 | new BlogPost(1, "Blazor Accordion — Single Selection", "Elena", new DateTime(2023,1,19), "blazor_accordion","https://community.devexpress.com/blogs/aspnet/archive/2023/01/19/blazor-accordion-single-selection-v22-2.aspx"), 118 | new BlogPost(1, ".NET MAUI — Hot Reload Support", "Kseniya", new DateTime(2023,1,17), "maui_hotreload","https://community.devexpress.com/blogs/mobile/archive/2023/01/17/net-maui-hot-reload-support.aspx"), 119 | new BlogPost(1, "Blazor Grid — Export Data to Excel", "Lana", new DateTime(2023,1,17), "blazor_excel_export","https://community.devexpress.com/blogs/aspnet/archive/2023/01/17/blazor-grid-export-data-to-excel-v22-2.aspx"), 120 | new BlogPost(1, "Blazor — New Window Component", "Margarita", new DateTime(2023,1,13), "blazor_window","https://community.devexpress.com/blogs/aspnet/archive/2023/01/13/blazor-new-window-component-v22-2.aspx"), 121 | new BlogPost(1, "DevExtreme Calendar for Angular, React, Vue and jQuery — Show Week Numbers", "Vlada", new DateTime(2023,1,12), "devextreme_calendar","https://community.devexpress.com/blogs/javascript/archive/2023/01/12/devextreme-calendar-angular-react-vue-jquery-show-week-numbers-v22-2.aspx"), 122 | new BlogPost(1, "WPF TreeList Control — Load Nodes Asynchronously", "Andrey", new DateTime(2023,1,11), "treelist_asynchronous_loading","https://community.devexpress.com/blogs/wpf/archive/2023/01/11/wpf-treelist-control-load-nodes-asynchronously-v22-2.aspx"), 123 | new BlogPost(1, "Blazor Grid — Integrated Editor Appearance", "Lana", new DateTime(2023,1,9), "blazor_integrated_editor","https://community.devexpress.com/blogs/reporting/archive/2023/02/06/blazor-reporting-quick-start-with-new-project-templates.aspx"), 124 | new BlogPost(1, ".NET MAUI — Your Feedback Counts", "Alex", new DateTime(2023,1,9), "maui_feedback","https://community.devexpress.com/blogs/mobile/archive/2023/01/09/maui.aspx"), 125 | new BlogPost(1, "Content Security Policy for BI Dashboard & Reporting — Say No To Unsafe JavaScript Evaluation!", "Margarita", new DateTime(2023,1,4), "dashboard_report_security","https://community.devexpress.com/blogs/reporting/archive/2023/01/09/content-security-policy-for-bi-dashboard-amp-reporting-say-no-to-unsafe-javascript-evaluation.aspx"), 126 | new BlogPost(1, "Blazor Grid — Search Box", "Lana", new DateTime(2023,1,4), "blazor_searchbox","https://community.devexpress.com/blogs/aspnet/archive/2023/01/04/blazor-grid-search-box-v22-2.aspx"), 127 | new BlogPost(1, "Blazor — Hybrid Support", "Margarita", new DateTime(2023,1,4), "blazor_hybrid","https://community.devexpress.com/blogs/aspnet/archive/2023/01/04/blazor-hybrid-support-v22.2.aspx"), 128 | }; 129 | 130 | } 131 | } 132 | 133 | } 134 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/ViewModels/ChannelDonutViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.ObjectModel; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace BlazorDemo.MAUI.ViewModels { 9 | public class ChannelDonutViewModel { 10 | public ObservableCollection TrafficChannelsData { 11 | get; 12 | set; 13 | } 14 | public Color[] TrafficColors { 15 | get; 16 | set; 17 | } 18 | public ChannelDonutViewModel() { 19 | TrafficChannelsData = new ObservableCollection() { 20 | new TrafficChannel("Organic", 17000), 21 | new TrafficChannel("Direct", 6000), 22 | new TrafficChannel("Referral", 2500), 23 | new TrafficChannel("Social", 2000) 24 | }; 25 | TrafficColors = new Color[] { 26 | Color.FromArgb("#84B9A0"), 27 | Color.FromArgb("#708EC8"), 28 | Color.FromArgb("#CF935B"), 29 | Color.FromArgb("#D671CC"), 30 | }; 31 | } 32 | 33 | } 34 | public class TrafficChannel { 35 | public string ChannelName { get; } 36 | public double Value { get; } 37 | 38 | public TrafficChannel(string channelName, double value) { 39 | ChannelName = channelName; 40 | Value = value; 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/ViewModels/LoginViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace BlazorDemo.MAUI.ViewModels { 8 | public class LoginViewModel : BaseViewModel { 9 | string userName; 10 | string password = string.Empty; 11 | string errorText; 12 | bool hasError; 13 | bool isAuthInProcess; 14 | 15 | public LoginViewModel() { 16 | LoginCommand = new Command(OnLoginClicked); 17 | SignUpCommand = new Command(OnSignUpClicked); 18 | PropertyChanged += 19 | (_, __) => LoginCommand.ChangeCanExecute(); 20 | 21 | } 22 | 23 | public string UserName { 24 | get => userName; 25 | set => SetProperty(ref userName, value); 26 | } 27 | 28 | public string Password { 29 | get => password; 30 | set => SetProperty(ref password, value); 31 | } 32 | 33 | public string ErrorText { 34 | get => errorText; 35 | set => SetProperty(ref errorText, value); 36 | } 37 | 38 | public bool HasError { 39 | get => hasError; 40 | set => SetProperty(ref hasError, value); 41 | } 42 | 43 | public bool IsAuthInProcess { 44 | get => isAuthInProcess; 45 | set { 46 | SetProperty(ref isAuthInProcess, value); 47 | OnPropertyChanged(nameof(AllowNewAuthRequests)); 48 | } 49 | } 50 | public bool AllowNewAuthRequests { 51 | get { return !IsAuthInProcess; } 52 | } 53 | 54 | public Command LoginCommand { get; } 55 | public Command SignUpCommand { get; } 56 | 57 | async void OnLoginClicked() { 58 | IsAuthInProcess = true; 59 | await Task.Delay(1000); 60 | IsAuthInProcess = false; 61 | if (UserName == "User" && Password == "123") { 62 | await Shell.Current.GoToAsync("///Blogs"); 63 | HasError = false; 64 | } 65 | else { 66 | ErrorText = "Incorrect username or password"; 67 | HasError = true; 68 | } 69 | 70 | } 71 | async void OnSignUpClicked() { 72 | await Application.Current.MainPage.DisplayAlert("Sign in", "We will demonstrate this functionality in another example", "OK"); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/ViewModels/PageviewsAreaChartViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.ObjectModel; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace BlazorDemo.MAUI.ViewModels { 9 | public class PageviewsAreaChartViewModel { 10 | public ObservableCollection PageviewStats { get; set; } 11 | public PageviewsAreaChartViewModel() { 12 | PageviewStats = new ObservableCollection(); 13 | Random rnd = new Random(); 14 | for (int i = 0; i < 5; i++) { 15 | PageviewStats.Add(new DateCountValue(DateTime.Now.AddMonths(-i), rnd.Next(3000, 6000))); 16 | } 17 | } 18 | } 19 | 20 | public class DateCountValue { 21 | public DateTime Date { get; set; } 22 | public int Count { get; set; } 23 | public DateCountValue(DateTime date, int count) { 24 | Date = date; 25 | Count = count; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.AspNetCore.Components.Web.Virtualization 6 | @using Microsoft.JSInterop 7 | @using BlazorDemo.MAUI 8 | @using DevExpress.Blazor 9 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/css/app.css: -------------------------------------------------------------------------------- 1 | @import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); 2 | 3 | html, body { 4 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 5 | } 6 | 7 | html, body { 8 | height: 100%; 9 | overflow: hidden; 10 | } 11 | 12 | #app { 13 | height: 100%; 14 | background-color: inherit; 15 | } 16 | 17 | h1:focus { 18 | outline: none; 19 | } 20 | 21 | a, .btn-link { 22 | color: #0071c1; 23 | } 24 | 25 | .btn-primary { 26 | color: #fff; 27 | background-color: #1b6ec2; 28 | border-color: #1861ac; 29 | } 30 | 31 | .content { 32 | padding-top: 1.1rem; 33 | } 34 | 35 | .valid.modified:not([type=checkbox]) { 36 | outline: 1px solid #26b050; 37 | } 38 | 39 | .invalid { 40 | outline: 1px solid red; 41 | } 42 | 43 | .validation-message { 44 | color: red; 45 | } 46 | 47 | #blazor-error-ui { 48 | background: lightyellow; 49 | bottom: 0; 50 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); 51 | display: none; 52 | left: 0; 53 | padding: 0.6rem 1.25rem 0.7rem 1.25rem; 54 | position: fixed; 55 | width: 100%; 56 | z-index: 1000; 57 | } 58 | 59 | #blazor-error-ui .dismiss { 60 | cursor: pointer; 61 | position: absolute; 62 | right: 0.75rem; 63 | top: 0.5rem; 64 | } 65 | 66 | .blazor-error-boundary { 67 | background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; 68 | padding: 1rem 1rem 1rem 3.7rem; 69 | color: white; 70 | } 71 | 72 | .blazor-error-boundary::after { 73 | content: "An error has occurred." 74 | } 75 | 76 | .status-bar-safe-area { 77 | display: none; 78 | } 79 | 80 | @supports (-webkit-touch-callout: none) { 81 | .status-bar-safe-area { 82 | display: flex; 83 | position: sticky; 84 | top: 0; 85 | height: env(safe-area-inset-top); 86 | background-color: #f7f7f7; 87 | width: 100%; 88 | z-index: 1; 89 | } 90 | 91 | .flex-column, .navbar-brand { 92 | padding-left: env(safe-area-inset-left); 93 | } 94 | } 95 | 96 | .dxbl-modal.dxbl-sidepanel > .dxbl-modal-root > .dxbl-popup.dxbl-sidepanel-dialog.dxbl-grid-column-chooser-dialog { 97 | align-self: end !important; 98 | } 99 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/css/open-iconic/FONT-LICENSE: -------------------------------------------------------------------------------- 1 | SIL OPEN FONT LICENSE Version 1.1 2 | 3 | Copyright (c) 2014 Waybury 4 | 5 | PREAMBLE 6 | The goals of the Open Font License (OFL) are to stimulate worldwide 7 | development of collaborative font projects, to support the font creation 8 | efforts of academic and linguistic communities, and to provide a free and 9 | open framework in which fonts may be shared and improved in partnership 10 | with others. 11 | 12 | The OFL allows the licensed fonts to be used, studied, modified and 13 | redistributed freely as long as they are not sold by themselves. The 14 | fonts, including any derivative works, can be bundled, embedded, 15 | redistributed and/or sold with any software provided that any reserved 16 | names are not used by derivative works. The fonts and derivatives, 17 | however, cannot be released under any other type of license. The 18 | requirement for fonts to remain under this license does not apply 19 | to any document created using the fonts or their derivatives. 20 | 21 | DEFINITIONS 22 | "Font Software" refers to the set of files released by the Copyright 23 | Holder(s) under this license and clearly marked as such. This may 24 | include source files, build scripts and documentation. 25 | 26 | "Reserved Font Name" refers to any names specified as such after the 27 | copyright statement(s). 28 | 29 | "Original Version" refers to the collection of Font Software components as 30 | distributed by the Copyright Holder(s). 31 | 32 | "Modified Version" refers to any derivative made by adding to, deleting, 33 | or substituting -- in part or in whole -- any of the components of the 34 | Original Version, by changing formats or by porting the Font Software to a 35 | new environment. 36 | 37 | "Author" refers to any designer, engineer, programmer, technical 38 | writer or other person who contributed to the Font Software. 39 | 40 | PERMISSION & CONDITIONS 41 | Permission is hereby granted, free of charge, to any person obtaining 42 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 43 | redistribute, and sell modified and unmodified copies of the Font 44 | Software, subject to the following conditions: 45 | 46 | 1) Neither the Font Software nor any of its individual components, 47 | in Original or Modified Versions, may be sold by itself. 48 | 49 | 2) Original or Modified Versions of the Font Software may be bundled, 50 | redistributed and/or sold with any software, provided that each copy 51 | contains the above copyright notice and this license. These can be 52 | included either as stand-alone text files, human-readable headers or 53 | in the appropriate machine-readable metadata fields within text or 54 | binary files as long as those fields can be easily viewed by the user. 55 | 56 | 3) No Modified Version of the Font Software may use the Reserved Font 57 | Name(s) unless explicit written permission is granted by the corresponding 58 | Copyright Holder. This restriction only applies to the primary font name as 59 | presented to the users. 60 | 61 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 62 | Software shall not be used to promote, endorse or advertise any 63 | Modified Version, except to acknowledge the contribution(s) of the 64 | Copyright Holder(s) and the Author(s) or with their explicit written 65 | permission. 66 | 67 | 5) The Font Software, modified or unmodified, in part or in whole, 68 | must be distributed entirely under this license, and must not be 69 | distributed under any other license. The requirement for fonts to 70 | remain under this license does not apply to any document created 71 | using the Font Software. 72 | 73 | TERMINATION 74 | This license becomes null and void if any of the above conditions are 75 | not met. 76 | 77 | DISCLAIMER 78 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 79 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 80 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 81 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 82 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 83 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 84 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 85 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 86 | OTHER DEALINGS IN THE FONT SOFTWARE. 87 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/css/open-iconic/ICON-LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Waybury 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/css/open-iconic/README.md: -------------------------------------------------------------------------------- 1 | [Open Iconic v1.1.1](https://github.com/iconic/open-iconic) 2 | =========== 3 | 4 | ### Open Iconic is the open source sibling of [Iconic](https://github.com/iconic/open-iconic). It is a hyper-legible collection of 223 icons with a tiny footprint—ready to use with Bootstrap and Foundation. [View the collection](https://github.com/iconic/open-iconic) 5 | 6 | 7 | 8 | ## What's in Open Iconic? 9 | 10 | * 223 icons designed to be legible down to 8 pixels 11 | * Super-light SVG files - 61.8 for the entire set 12 | * SVG sprite—the modern replacement for icon fonts 13 | * Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats 14 | * Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats 15 | * PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px. 16 | 17 | 18 | ## Getting Started 19 | 20 | #### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](https://github.com/iconic/open-iconic) and [Reference](https://github.com/iconic/open-iconic) sections. 21 | 22 | ### General Usage 23 | 24 | #### Using Open Iconic's SVGs 25 | 26 | We like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute). 27 | 28 | ``` 29 | icon name 30 | ``` 31 | 32 | #### Using Open Iconic's SVG Sprite 33 | 34 | Open Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack. 35 | 36 | Adding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `` *tag and a unique class name for each different icon in the* `` *tag.* 37 | 38 | ``` 39 | 40 | 41 | 42 | ``` 43 | 44 | Sizing icons only needs basic CSS. All the icons are in a square format, so just set the `` tag with equal width and height dimensions. 45 | 46 | ``` 47 | .icon { 48 | width: 16px; 49 | height: 16px; 50 | } 51 | ``` 52 | 53 | Coloring icons is even easier. All you need to do is set the `fill` rule on the `` tag. 54 | 55 | ``` 56 | .icon-account-login { 57 | fill: #f00; 58 | } 59 | ``` 60 | 61 | To learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/). 62 | 63 | #### Using Open Iconic's Icon Font... 64 | 65 | 66 | ##### …with Bootstrap 67 | 68 | You can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}` 69 | 70 | 71 | ``` 72 | 73 | ``` 74 | 75 | 76 | ``` 77 | 78 | ``` 79 | 80 | ##### …with Foundation 81 | 82 | You can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}` 83 | 84 | ``` 85 | 86 | ``` 87 | 88 | 89 | ``` 90 | 91 | ``` 92 | 93 | ##### …on its own 94 | 95 | You can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}` 96 | 97 | ``` 98 | 99 | ``` 100 | 101 | ``` 102 | 103 | ``` 104 | 105 | 106 | ## License 107 | 108 | ### Icons 109 | 110 | All code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT). 111 | 112 | ### Fonts 113 | 114 | All fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web). 115 | -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:Icons;src:url(../fonts/open-iconic.eot);src:url(../fonts/open-iconic.eot?#iconic-sm) format('embedded-opentype'),url(../fonts/open-iconic.woff) format('woff'),url(../fonts/open-iconic.ttf) format('truetype'),url(../fonts/open-iconic.otf) format('opentype'),url(../fonts/open-iconic.svg#iconic-sm) format('svg');font-weight:400;font-style:normal}.oi{position:relative;top:1px;display:inline-block;speak:none;font-family:Icons;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.oi:empty:before{width:1em;text-align:center;box-sizing:content-box}.oi.oi-align-center:before{text-align:center}.oi.oi-align-left:before{text-align:left}.oi.oi-align-right:before{text-align:right}.oi.oi-flip-horizontal:before{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.oi.oi-flip-vertical:before{-webkit-transform:scale(1,-1);-ms-transform:scale(-1,1);transform:scale(1,-1)}.oi.oi-flip-horizontal-vertical:before{-webkit-transform:scale(-1,-1);-ms-transform:scale(-1,1);transform:scale(-1,-1)}.oi-account-login:before{content:'\e000'}.oi-account-logout:before{content:'\e001'}.oi-action-redo:before{content:'\e002'}.oi-action-undo:before{content:'\e003'}.oi-align-center:before{content:'\e004'}.oi-align-left:before{content:'\e005'}.oi-align-right:before{content:'\e006'}.oi-aperture:before{content:'\e007'}.oi-arrow-bottom:before{content:'\e008'}.oi-arrow-circle-bottom:before{content:'\e009'}.oi-arrow-circle-left:before{content:'\e00a'}.oi-arrow-circle-right:before{content:'\e00b'}.oi-arrow-circle-top:before{content:'\e00c'}.oi-arrow-left:before{content:'\e00d'}.oi-arrow-right:before{content:'\e00e'}.oi-arrow-thick-bottom:before{content:'\e00f'}.oi-arrow-thick-left:before{content:'\e010'}.oi-arrow-thick-right:before{content:'\e011'}.oi-arrow-thick-top:before{content:'\e012'}.oi-arrow-top:before{content:'\e013'}.oi-audio-spectrum:before{content:'\e014'}.oi-audio:before{content:'\e015'}.oi-badge:before{content:'\e016'}.oi-ban:before{content:'\e017'}.oi-bar-chart:before{content:'\e018'}.oi-basket:before{content:'\e019'}.oi-battery-empty:before{content:'\e01a'}.oi-battery-full:before{content:'\e01b'}.oi-beaker:before{content:'\e01c'}.oi-bell:before{content:'\e01d'}.oi-bluetooth:before{content:'\e01e'}.oi-bold:before{content:'\e01f'}.oi-bolt:before{content:'\e020'}.oi-book:before{content:'\e021'}.oi-bookmark:before{content:'\e022'}.oi-box:before{content:'\e023'}.oi-briefcase:before{content:'\e024'}.oi-british-pound:before{content:'\e025'}.oi-browser:before{content:'\e026'}.oi-brush:before{content:'\e027'}.oi-bug:before{content:'\e028'}.oi-bullhorn:before{content:'\e029'}.oi-calculator:before{content:'\e02a'}.oi-calendar:before{content:'\e02b'}.oi-camera-slr:before{content:'\e02c'}.oi-caret-bottom:before{content:'\e02d'}.oi-caret-left:before{content:'\e02e'}.oi-caret-right:before{content:'\e02f'}.oi-caret-top:before{content:'\e030'}.oi-cart:before{content:'\e031'}.oi-chat:before{content:'\e032'}.oi-check:before{content:'\e033'}.oi-chevron-bottom:before{content:'\e034'}.oi-chevron-left:before{content:'\e035'}.oi-chevron-right:before{content:'\e036'}.oi-chevron-top:before{content:'\e037'}.oi-circle-check:before{content:'\e038'}.oi-circle-x:before{content:'\e039'}.oi-clipboard:before{content:'\e03a'}.oi-clock:before{content:'\e03b'}.oi-cloud-download:before{content:'\e03c'}.oi-cloud-upload:before{content:'\e03d'}.oi-cloud:before{content:'\e03e'}.oi-cloudy:before{content:'\e03f'}.oi-code:before{content:'\e040'}.oi-cog:before{content:'\e041'}.oi-collapse-down:before{content:'\e042'}.oi-collapse-left:before{content:'\e043'}.oi-collapse-right:before{content:'\e044'}.oi-collapse-up:before{content:'\e045'}.oi-command:before{content:'\e046'}.oi-comment-square:before{content:'\e047'}.oi-compass:before{content:'\e048'}.oi-contrast:before{content:'\e049'}.oi-copywriting:before{content:'\e04a'}.oi-credit-card:before{content:'\e04b'}.oi-crop:before{content:'\e04c'}.oi-dashboard:before{content:'\e04d'}.oi-data-transfer-download:before{content:'\e04e'}.oi-data-transfer-upload:before{content:'\e04f'}.oi-delete:before{content:'\e050'}.oi-dial:before{content:'\e051'}.oi-document:before{content:'\e052'}.oi-dollar:before{content:'\e053'}.oi-double-quote-sans-left:before{content:'\e054'}.oi-double-quote-sans-right:before{content:'\e055'}.oi-double-quote-serif-left:before{content:'\e056'}.oi-double-quote-serif-right:before{content:'\e057'}.oi-droplet:before{content:'\e058'}.oi-eject:before{content:'\e059'}.oi-elevator:before{content:'\e05a'}.oi-ellipses:before{content:'\e05b'}.oi-envelope-closed:before{content:'\e05c'}.oi-envelope-open:before{content:'\e05d'}.oi-euro:before{content:'\e05e'}.oi-excerpt:before{content:'\e05f'}.oi-expand-down:before{content:'\e060'}.oi-expand-left:before{content:'\e061'}.oi-expand-right:before{content:'\e062'}.oi-expand-up:before{content:'\e063'}.oi-external-link:before{content:'\e064'}.oi-eye:before{content:'\e065'}.oi-eyedropper:before{content:'\e066'}.oi-file:before{content:'\e067'}.oi-fire:before{content:'\e068'}.oi-flag:before{content:'\e069'}.oi-flash:before{content:'\e06a'}.oi-folder:before{content:'\e06b'}.oi-fork:before{content:'\e06c'}.oi-fullscreen-enter:before{content:'\e06d'}.oi-fullscreen-exit:before{content:'\e06e'}.oi-globe:before{content:'\e06f'}.oi-graph:before{content:'\e070'}.oi-grid-four-up:before{content:'\e071'}.oi-grid-three-up:before{content:'\e072'}.oi-grid-two-up:before{content:'\e073'}.oi-hard-drive:before{content:'\e074'}.oi-header:before{content:'\e075'}.oi-headphones:before{content:'\e076'}.oi-heart:before{content:'\e077'}.oi-home:before{content:'\e078'}.oi-image:before{content:'\e079'}.oi-inbox:before{content:'\e07a'}.oi-infinity:before{content:'\e07b'}.oi-info:before{content:'\e07c'}.oi-italic:before{content:'\e07d'}.oi-justify-center:before{content:'\e07e'}.oi-justify-left:before{content:'\e07f'}.oi-justify-right:before{content:'\e080'}.oi-key:before{content:'\e081'}.oi-laptop:before{content:'\e082'}.oi-layers:before{content:'\e083'}.oi-lightbulb:before{content:'\e084'}.oi-link-broken:before{content:'\e085'}.oi-link-intact:before{content:'\e086'}.oi-list-rich:before{content:'\e087'}.oi-list:before{content:'\e088'}.oi-location:before{content:'\e089'}.oi-lock-locked:before{content:'\e08a'}.oi-lock-unlocked:before{content:'\e08b'}.oi-loop-circular:before{content:'\e08c'}.oi-loop-square:before{content:'\e08d'}.oi-loop:before{content:'\e08e'}.oi-magnifying-glass:before{content:'\e08f'}.oi-map-marker:before{content:'\e090'}.oi-map:before{content:'\e091'}.oi-media-pause:before{content:'\e092'}.oi-media-play:before{content:'\e093'}.oi-media-record:before{content:'\e094'}.oi-media-skip-backward:before{content:'\e095'}.oi-media-skip-forward:before{content:'\e096'}.oi-media-step-backward:before{content:'\e097'}.oi-media-step-forward:before{content:'\e098'}.oi-media-stop:before{content:'\e099'}.oi-medical-cross:before{content:'\e09a'}.oi-menu:before{content:'\e09b'}.oi-microphone:before{content:'\e09c'}.oi-minus:before{content:'\e09d'}.oi-monitor:before{content:'\e09e'}.oi-moon:before{content:'\e09f'}.oi-move:before{content:'\e0a0'}.oi-musical-note:before{content:'\e0a1'}.oi-paperclip:before{content:'\e0a2'}.oi-pencil:before{content:'\e0a3'}.oi-people:before{content:'\e0a4'}.oi-person:before{content:'\e0a5'}.oi-phone:before{content:'\e0a6'}.oi-pie-chart:before{content:'\e0a7'}.oi-pin:before{content:'\e0a8'}.oi-play-circle:before{content:'\e0a9'}.oi-plus:before{content:'\e0aa'}.oi-power-standby:before{content:'\e0ab'}.oi-print:before{content:'\e0ac'}.oi-project:before{content:'\e0ad'}.oi-pulse:before{content:'\e0ae'}.oi-puzzle-piece:before{content:'\e0af'}.oi-question-mark:before{content:'\e0b0'}.oi-rain:before{content:'\e0b1'}.oi-random:before{content:'\e0b2'}.oi-reload:before{content:'\e0b3'}.oi-resize-both:before{content:'\e0b4'}.oi-resize-height:before{content:'\e0b5'}.oi-resize-width:before{content:'\e0b6'}.oi-rss-alt:before{content:'\e0b7'}.oi-rss:before{content:'\e0b8'}.oi-script:before{content:'\e0b9'}.oi-share-boxed:before{content:'\e0ba'}.oi-share:before{content:'\e0bb'}.oi-shield:before{content:'\e0bc'}.oi-signal:before{content:'\e0bd'}.oi-signpost:before{content:'\e0be'}.oi-sort-ascending:before{content:'\e0bf'}.oi-sort-descending:before{content:'\e0c0'}.oi-spreadsheet:before{content:'\e0c1'}.oi-star:before{content:'\e0c2'}.oi-sun:before{content:'\e0c3'}.oi-tablet:before{content:'\e0c4'}.oi-tag:before{content:'\e0c5'}.oi-tags:before{content:'\e0c6'}.oi-target:before{content:'\e0c7'}.oi-task:before{content:'\e0c8'}.oi-terminal:before{content:'\e0c9'}.oi-text:before{content:'\e0ca'}.oi-thumb-down:before{content:'\e0cb'}.oi-thumb-up:before{content:'\e0cc'}.oi-timer:before{content:'\e0cd'}.oi-transfer:before{content:'\e0ce'}.oi-trash:before{content:'\e0cf'}.oi-underline:before{content:'\e0d0'}.oi-vertical-align-bottom:before{content:'\e0d1'}.oi-vertical-align-center:before{content:'\e0d2'}.oi-vertical-align-top:before{content:'\e0d3'}.oi-video:before{content:'\e0d4'}.oi-volume-high:before{content:'\e0d5'}.oi-volume-low:before{content:'\e0d6'}.oi-volume-off:before{content:'\e0d7'}.oi-warning:before{content:'\e0d8'}.oi-wifi:before{content:'\e0d9'}.oi-wrench:before{content:'\e0da'}.oi-x:before{content:'\e0db'}.oi-yen:before{content:'\e0dc'}.oi-zoom-in:before{content:'\e0dd'}.oi-zoom-out:before{content:'\e0de'} -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/css/open-iconic/font/fonts/open-iconic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/wwwroot/css/open-iconic/font/fonts/open-iconic.eot -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/css/open-iconic/font/fonts/open-iconic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/wwwroot/css/open-iconic/font/fonts/open-iconic.otf -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/css/open-iconic/font/fonts/open-iconic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/wwwroot/css/open-iconic/font/fonts/open-iconic.woff -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.MAUI/wwwroot/favicon.ico -------------------------------------------------------------------------------- /BlazorDemo.MAUI/wwwroot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Blazor MAUI 7 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | 18 |
19 | 20 |
Loading...
21 | 22 |
23 | An unhandled error has occurred. 24 | Reload 25 | 🗙 26 |
27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /BlazorDemo.Server/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 |

Sorry, there's nothing at this address.

9 |
10 |
11 |
12 | -------------------------------------------------------------------------------- /BlazorDemo.Server/BlazorDemo.Server.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net9.0 4 | disable 5 | enable 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /BlazorDemo.Server/NOTICE.txt: -------------------------------------------------------------------------------- 1 | The following open source libraries are used and included within thеse sample/demonstration projects: 2 | 3 | Bootstrap (Open Source – MIT License) 4 | Copyright (c) 2011-2021 Twitter, Inc. / Copyright (c) 2011-2021 The Bootstrap Authors 5 | https://github.com/twbs/bootstrap/blob/main/LICENSE 6 | 7 | open-iconic (Open Source – MIT License and SIL Open Font License) 8 | Copyright (c) 2014 Waybury 9 | https://github.com/iconic/open-iconic/blob/master/ICON-LICENSE 10 | https://github.com/iconic/open-iconic/blob/master/FONT-LICENSE 11 | 12 | The open source libraries included in these sample/demonstration projects are done so pursuant to each individual open source library license and subject to the disclaimers and limitations on liability set forth in each open source library license. -------------------------------------------------------------------------------- /BlazorDemo.Server/Pages/Error.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model BlazorDemo.Server.Pages.ErrorModel 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Error 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |

Error.

19 |

An error occurred while processing your request.

20 | 21 | @if (Model.ShowRequestId) 22 | { 23 |

24 | Request ID: @Model.RequestId 25 |

26 | } 27 | 28 |

Development Mode

29 |

30 | Swapping to the Development environment displays detailed information about the error that occurred. 31 |

32 |

33 | The Development environment shouldn't be enabled for deployed applications. 34 | It can result in displaying sensitive information from exceptions to end users. 35 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 36 | and restarting the app. 37 |

38 |
39 | 40 | 41 | -------------------------------------------------------------------------------- /BlazorDemo.Server/Pages/Error.cshtml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Mvc; 7 | using Microsoft.AspNetCore.Mvc.RazorPages; 8 | using Microsoft.Extensions.Logging; 9 | 10 | namespace BlazorDemo.Server.Pages { 11 | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 12 | [IgnoreAntiforgeryToken] 13 | public class ErrorModel : PageModel { 14 | public string? RequestId { get; set; } 15 | 16 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 17 | 18 | private readonly ILogger _logger; 19 | 20 | public ErrorModel(ILogger logger) { 21 | _logger = logger; 22 | } 23 | 24 | public void OnGet() { 25 | RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /BlazorDemo.Server/Pages/GridPage.razor: -------------------------------------------------------------------------------- 1 | @page "/grid" 2 | 3 | @using BlazorDemo.Shared.Components 4 | 5 | 6 | 7 | @code { 8 | 9 | } -------------------------------------------------------------------------------- /BlazorDemo.Server/Pages/Index.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | 3 |

Blazor Components

4 |

5 | Our Blazor UI components will help you create intuitive and highly-refined user experiences for both Blazor Server (ASP.NET Core) and Blazor WebAssembly hosting models. 6 |

7 |
8 | 9 |
10 | 11 |

Helpful Resources

12 | 13 | 19 | -------------------------------------------------------------------------------- /BlazorDemo.Server/Pages/_Host.cshtml: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @namespace BlazorDemo.Server.Pages 3 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 4 | @{ 5 | Layout = "_Layout"; 6 | } 7 | 8 | -------------------------------------------------------------------------------- /BlazorDemo.Server/Pages/_Layout.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Components.Web 2 | @namespace BlazorDemo.Server.Pages 3 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | @{ 20 | var isIEOrEdgeLegacy = Context.Request.Headers["User-Agent"] 21 | .Any(userAgent => userAgent.Contains("MSIE") || userAgent.Contains("Trident") || userAgent.Contains("Edge/")); 22 | } 23 | @if(isIEOrEdgeLegacy) 24 | { 25 | 26 | } 27 | else 28 | { 29 | @RenderBody() 30 | 31 |
32 | 33 | An error has occurred. This application may no longer respond until reloaded. 34 | 35 | 36 | An unhandled exception has occurred. See browser dev tools for details. 37 | 38 | Reload 39 | 🗙 40 |
41 | 42 | 43 | } 44 | 45 | -------------------------------------------------------------------------------- /BlazorDemo.Server/Program.cs: -------------------------------------------------------------------------------- 1 | using BlazorDemo.Server.Data; 2 | using BlazorDemo.Shared.Data; 3 | using BlazorDemo.Shared.Data.DataProviders; 4 | using BlazorDemo.Shared.Data.Services; 5 | using DevExpress.Utils.Drawing; 6 | using Microsoft.AspNetCore.Components; 7 | using Microsoft.AspNetCore.Components.Web; 8 | 9 | var builder = WebApplication.CreateBuilder(args); 10 | 11 | // Add services to the container. 12 | builder.Services.AddRazorPages(); 13 | builder.Services.AddServerSideBlazor(); 14 | builder.Services.AddDevExpressBlazor(options => { 15 | options.BootstrapVersion = DevExpress.Blazor.BootstrapVersion.v5; 16 | options.SizeMode = DevExpress.Blazor.SizeMode.Medium; 17 | }); 18 | builder.Services.AddSingleton(); 19 | builder.Services.AddScoped(); 20 | //builder.Services.AddDbContextFactory(opt => { 21 | // opt.UseSqlite($"Data Source={Path.Combine(System.AppContext.BaseDirectory, "DataSources", "issue-list.db")}"); 22 | //}); 23 | builder.WebHost.UseWebRoot("wwwroot"); 24 | builder.WebHost.UseStaticWebAssets(); 25 | 26 | var app = builder.Build(); 27 | 28 | // Configure the HTTP request pipeline. 29 | if (!app.Environment.IsDevelopment()) 30 | { 31 | app.UseExceptionHandler("/Error"); 32 | // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 33 | app.UseHsts(); 34 | } 35 | app.UseHttpsRedirection(); 36 | 37 | app.UseStaticFiles(); 38 | 39 | app.UseRouting(); 40 | 41 | 42 | app.MapBlazorHub(); 43 | app.MapFallbackToPage("/_Host"); 44 | 45 | app.Run(); -------------------------------------------------------------------------------- /BlazorDemo.Server/Shared/BrowserNotSupported.razor: -------------------------------------------------------------------------------- 1 | 
2 |
3 | 4 |
5 |
Your browser is not supported.
6 |

In .NET 5.0, Blazor does not support Microsoft Internet Explorer and Microsoft Edge Legacy (refer to Supported Browsers).
Please use a different browser to run BlazorDemo.Server.

7 |
8 |
9 |
-------------------------------------------------------------------------------- /BlazorDemo.Server/Shared/Header.razor: -------------------------------------------------------------------------------- 1 |  7 | 8 | @code { 9 | [Parameter] public bool ToggleOn { get; set; } 10 | [Parameter] public EventCallback ToggleOnChanged { get; set; } 11 | 12 | async Task OnToggleClick() => await Toggle(); 13 | 14 | async Task Toggle(bool? value = null) { 15 | var newValue = value ?? !ToggleOn; 16 | if(ToggleOn != newValue) { 17 | ToggleOn = newValue; 18 | await ToggleOnChanged.InvokeAsync(ToggleOn); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /BlazorDemo.Server/Shared/Header.razor.css: -------------------------------------------------------------------------------- 1 | .navbar.header-navbar { 2 | flex-grow: 0; 3 | flex-wrap: nowrap; 4 | border: none; 5 | background-color: inherit; 6 | border-radius: 0; 7 | height: 3.5rem; 8 | min-height: 3.5rem; 9 | box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.12); 10 | justify-content: flex-start; 11 | } 12 | 13 | .header-navbar .navbar-toggler { 14 | outline: none; 15 | border-radius: 0; 16 | padding-left: .75rem; 17 | padding-right: .75rem; 18 | box-shadow: none; 19 | align-self: stretch; 20 | } 21 | 22 | .header-navbar .navbar-toggler .navbar-toggler-icon { 23 | background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255,255,255, 1)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"); 24 | background-color: transparent !important; 25 | height: 2rem; 26 | width: 2rem; 27 | } 28 | 29 | .title { 30 | font-size: 1.1rem; 31 | text-overflow: ellipsis; 32 | overflow: hidden; 33 | } 34 | 35 | @media (max-width: 350px) { 36 | .title { 37 | font-size: inherit; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /BlazorDemo.Server/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | @inject NavigationManager NavigationManager 3 | 4 | 6 | 7 |
8 | 9 | 10 | @if(IsMobileLayout) { 11 | 12 | 13 | 14 | } 15 | else { 16 | 17 | 18 | } 19 | 20 | 21 | @if(!IsMobileLayout) { 22 | 23 | 24 | } 25 | 26 | 27 | 28 | 31 | 32 | 33 | 36 | 37 | 38 | 41 | 42 | 43 | 44 |
45 | 46 | @code{ 47 | string? NavMenuCssClass { get; set; } 48 | bool _isMobileLayout; 49 | bool IsMobileLayout { 50 | get => _isMobileLayout; 51 | set { 52 | _isMobileLayout = value; 53 | IsSidebarExpanded = !_isMobileLayout; 54 | } 55 | } 56 | 57 | bool _isSidebarExpanded = true; 58 | bool IsSidebarExpanded { 59 | get => _isSidebarExpanded; 60 | set { 61 | if(_isSidebarExpanded != value) { 62 | NavMenuCssClass = value ? "expand" : "collapse"; 63 | _isSidebarExpanded = value; 64 | } 65 | } 66 | } 67 | 68 | protected override void OnInitialized() { 69 | NavigationManager.LocationChanged += OnLocationChanged; 70 | } 71 | async void OnLocationChanged(object? sender, LocationChangedEventArgs args) { 72 | if(IsMobileLayout) { 73 | IsSidebarExpanded = false; 74 | await InvokeAsync(StateHasChanged); 75 | } 76 | } 77 | 78 | public void Dispose() { 79 | NavigationManager.LocationChanged -= OnLocationChanged; 80 | } 81 | } -------------------------------------------------------------------------------- /BlazorDemo.Server/Shared/MainLayout.razor.css: -------------------------------------------------------------------------------- 1 | .page { 2 | height: 100%; 3 | overflow: hidden; 4 | background-color: inherit; 5 | } 6 | ::deep .page-layout, 7 | ::deep .page-layout > .dxbl-gridlayout-root, 8 | ::deep .layout-item { 9 | background-color: inherit; 10 | } 11 | 12 | ::deep .content { 13 | padding: 1.1rem 2rem 0 2rem; 14 | overflow: auto; 15 | } 16 | 17 | @media (max-width: 1199.98px) { 18 | ::deep .page-layout > .dxbl-gridlayout-root { 19 | grid-template-columns: minmax(0, 1fr) !important; 20 | } 21 | } 22 | 23 | ::deep .fit-width { 24 | max-width: 100%; 25 | } 26 | 27 | ::deep .mw-1100 { 28 | max-width: 1100px; 29 | } 30 | -------------------------------------------------------------------------------- /BlazorDemo.Server/Shared/NavMenu.razor: -------------------------------------------------------------------------------- 1 |  9 | 10 | @code { 11 | [Parameter] public string? StateCssClass { get; set; } 12 | } -------------------------------------------------------------------------------- /BlazorDemo.Server/Shared/NavMenu.razor.css: -------------------------------------------------------------------------------- 1 | .sidebar { 2 | min-width: 300px; 3 | max-width: 300px; 4 | box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.16); 5 | transition: transform 0.1s ease-out; 6 | height: 100%; 7 | max-height: 100%; 8 | overflow: auto; 9 | background-color: var(--bs-body-bg, var(--dxbl-body-bg, #fff)); 10 | } 11 | 12 | .sidebar.collapse { 13 | display: none; 14 | } 15 | 16 | .sidebar.expand { 17 | display: block; 18 | } 19 | 20 | @media (max-width: 1199.98px) { 21 | .sidebar { 22 | display: none; 23 | } 24 | 25 | .sidebar.expand { 26 | position: fixed; 27 | top: 3.5rem; 28 | left: 0; 29 | height: auto; 30 | min-width: 100%; 31 | z-index: 1050; 32 | } 33 | } 34 | 35 | ::deep .app-sidebar { 36 | --dxbl-treeview-spacing-x: 0.5rem; 37 | --dxbl-treeview-spacing-y: 1rem; 38 | } 39 | 40 | ::deep .app-sidebar > .nav-pills > .nav-item:last-of-type { 41 | padding-bottom: 1rem; 42 | } 43 | 44 | ::deep .app-sidebar > .dxbl-scroll-viewer > .dxbl-scroll-viewer-content > .dxbl-treeview-items-container > .dxbl-treeview-item > .dxbl-treeview-item-content > .dxbl-treeview-item-container { 45 | --dxbl-treeview-font-weight: 600; 46 | } 47 | 48 | ::deep .app-sidebar > .dxbl-scroll-viewer > .dxbl-scroll-viewer-content > .dxbl-treeview-items-container > .dxbl-treeview-item > .dxbl-treeview-item-content > .dxbl-btn.dxbl-invisible { 49 | display: none; 50 | } 51 | 52 | @media (max-width: 1199.98px) { 53 | ::deep .app-sidebar { 54 | padding-bottom: 0; 55 | } 56 | } -------------------------------------------------------------------------------- /BlazorDemo.Server/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using Microsoft.AspNetCore.Authorization 3 | @using Microsoft.AspNetCore.Components.Authorization 4 | @using Microsoft.AspNetCore.Components.Forms 5 | @using Microsoft.AspNetCore.Components.Routing 6 | @using Microsoft.AspNetCore.Components.Web 7 | @using Microsoft.AspNetCore.Components.Web.Virtualization 8 | @using Microsoft.JSInterop 9 | @using BlazorDemo.Server 10 | @using BlazorDemo.Server.Shared 11 | 12 | @using DevExpress.Blazor -------------------------------------------------------------------------------- /BlazorDemo.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "DetailedErrors": true, 3 | "Logging": { 4 | "LogLevel": { 5 | "Default": "Information", 6 | "Microsoft.AspNetCore": "Warning" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /BlazorDemo.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*" 9 | } 10 | -------------------------------------------------------------------------------- /BlazorDemo.Server/readme.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
7 |

Before you start this application

8 |

Refer to the supported browsers list.

9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/css/open.iconic/FONT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | SIL OPEN FONT LICENSE Version 1.1 2 | 3 | Copyright (c) 2014 Waybury 4 | 5 | PREAMBLE 6 | The goals of the Open Font License (OFL) are to stimulate worldwide 7 | development of collaborative font projects, to support the font creation 8 | efforts of academic and linguistic communities, and to provide a free and 9 | open framework in which fonts may be shared and improved in partnership 10 | with others. 11 | 12 | The OFL allows the licensed fonts to be used, studied, modified and 13 | redistributed freely as long as they are not sold by themselves. The 14 | fonts, including any derivative works, can be bundled, embedded, 15 | redistributed and/or sold with any software provided that any reserved 16 | names are not used by derivative works. The fonts and derivatives, 17 | however, cannot be released under any other type of license. The 18 | requirement for fonts to remain under this license does not apply 19 | to any document created using the fonts or their derivatives. 20 | 21 | DEFINITIONS 22 | "Font Software" refers to the set of files released by the Copyright 23 | Holder(s) under this license and clearly marked as such. This may 24 | include source files, build scripts and documentation. 25 | 26 | "Reserved Font Name" refers to any names specified as such after the 27 | copyright statement(s). 28 | 29 | "Original Version" refers to the collection of Font Software components as 30 | distributed by the Copyright Holder(s). 31 | 32 | "Modified Version" refers to any derivative made by adding to, deleting, 33 | or substituting -- in part or in whole -- any of the components of the 34 | Original Version, by changing formats or by porting the Font Software to a 35 | new environment. 36 | 37 | "Author" refers to any designer, engineer, programmer, technical 38 | writer or other person who contributed to the Font Software. 39 | 40 | PERMISSION & CONDITIONS 41 | Permission is hereby granted, free of charge, to any person obtaining 42 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 43 | redistribute, and sell modified and unmodified copies of the Font 44 | Software, subject to the following conditions: 45 | 46 | 1) Neither the Font Software nor any of its individual components, 47 | in Original or Modified Versions, may be sold by itself. 48 | 49 | 2) Original or Modified Versions of the Font Software may be bundled, 50 | redistributed and/or sold with any software, provided that each copy 51 | contains the above copyright notice and this license. These can be 52 | included either as stand-alone text files, human-readable headers or 53 | in the appropriate machine-readable metadata fields within text or 54 | binary files as long as those fields can be easily viewed by the user. 55 | 56 | 3) No Modified Version of the Font Software may use the Reserved Font 57 | Name(s) unless explicit written permission is granted by the corresponding 58 | Copyright Holder. This restriction only applies to the primary font name as 59 | presented to the users. 60 | 61 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 62 | Software shall not be used to promote, endorse or advertise any 63 | Modified Version, except to acknowledge the contribution(s) of the 64 | Copyright Holder(s) and the Author(s) or with their explicit written 65 | permission. 66 | 67 | 5) The Font Software, modified or unmodified, in part or in whole, 68 | must be distributed entirely under this license, and must not be 69 | distributed under any other license. The requirement for fonts to 70 | remain under this license does not apply to any document created 71 | using the Font Software. 72 | 73 | TERMINATION 74 | This license becomes null and void if any of the above conditions are 75 | not met. 76 | 77 | DISCLAIMER 78 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 79 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 80 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 81 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 82 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 83 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 84 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 85 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 86 | OTHER DEALINGS IN THE FONT SOFTWARE. 87 | -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/css/open.iconic/ICON-LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Waybury 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/css/open.iconic/README.md: -------------------------------------------------------------------------------- 1 | [Open Iconic v1.1.1](http://useiconic.com/open) 2 | =========== 3 | 4 | ### Open Iconic is the open source sibling of [Iconic](http://useiconic.com). It is a hyper-legible collection of 223 icons with a tiny footprint—ready to use with Bootstrap and Foundation. [View the collection](http://useiconic.com/open#icons) 5 | 6 | 7 | 8 | ## What's in Open Iconic? 9 | 10 | * 223 icons designed to be legible down to 8 pixels 11 | * Super-light SVG files - 61.8 for the entire set 12 | * SVG sprite—the modern replacement for icon fonts 13 | * Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats 14 | * Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats 15 | * PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px. 16 | 17 | 18 | ## Getting Started 19 | 20 | #### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](http://useiconic.com/open#icons) and [Reference](http://useiconic.com/open#reference) sections. 21 | 22 | ### General Usage 23 | 24 | #### Using Open Iconic's SVGs 25 | 26 | We like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute). 27 | 28 | ``` 29 | icon name 30 | ``` 31 | 32 | #### Using Open Iconic's SVG Sprite 33 | 34 | Open Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack. 35 | 36 | Adding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `` *tag and a unique class name for each different icon in the* `` *tag.* 37 | 38 | ``` 39 | 40 | 41 | 42 | ``` 43 | 44 | Sizing icons only needs basic CSS. All the icons are in a square format, so just set the `` tag with equal width and height dimensions. 45 | 46 | ``` 47 | .icon { 48 | width: 16px; 49 | height: 16px; 50 | } 51 | ``` 52 | 53 | Coloring icons is even easier. All you need to do is set the `fill` rule on the `` tag. 54 | 55 | ``` 56 | .icon-account-login { 57 | fill: #f00; 58 | } 59 | ``` 60 | 61 | To learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/). 62 | 63 | #### Using Open Iconic's Icon Font... 64 | 65 | 66 | ##### …with Bootstrap 67 | 68 | You can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}` 69 | 70 | 71 | ``` 72 | 73 | ``` 74 | 75 | 76 | ``` 77 | 78 | ``` 79 | 80 | ##### …with Foundation 81 | 82 | You can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}` 83 | 84 | ``` 85 | 86 | ``` 87 | 88 | 89 | ``` 90 | 91 | ``` 92 | 93 | ##### …on its own 94 | 95 | You can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}` 96 | 97 | ``` 98 | 99 | ``` 100 | 101 | ``` 102 | 103 | ``` 104 | 105 | 106 | ## License 107 | 108 | ### Icons 109 | 110 | All code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT). 111 | 112 | ### Fonts 113 | 114 | All fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web). 115 | -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/css/open.iconic/font/css/open-iconic-bootstrap.min.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:Icons;src:url(../fonts/open-iconic.eot);src:url(../fonts/open-iconic.eot?#iconic-sm) format('embedded-opentype'),url(../fonts/open-iconic.woff) format('woff'),url(../fonts/open-iconic.ttf) format('truetype'),url(../fonts/open-iconic.otf) format('opentype'),url(../fonts/open-iconic.svg#iconic-sm) format('svg');font-weight:400;font-style:normal}.oi{position:relative;top:1px;display:inline-block;speak:none;font-family:Icons;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.oi:empty:before{width:1em;text-align:center;box-sizing:content-box}.oi.oi-align-center:before{text-align:center}.oi.oi-align-left:before{text-align:left}.oi.oi-align-right:before{text-align:right}.oi.oi-flip-horizontal:before{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.oi.oi-flip-vertical:before{-webkit-transform:scale(1,-1);-ms-transform:scale(-1,1);transform:scale(1,-1)}.oi.oi-flip-horizontal-vertical:before{-webkit-transform:scale(-1,-1);-ms-transform:scale(-1,1);transform:scale(-1,-1)}.oi-account-login:before{content:'\e000'}.oi-account-logout:before{content:'\e001'}.oi-action-redo:before{content:'\e002'}.oi-action-undo:before{content:'\e003'}.oi-align-center:before{content:'\e004'}.oi-align-left:before{content:'\e005'}.oi-align-right:before{content:'\e006'}.oi-aperture:before{content:'\e007'}.oi-arrow-bottom:before{content:'\e008'}.oi-arrow-circle-bottom:before{content:'\e009'}.oi-arrow-circle-left:before{content:'\e00a'}.oi-arrow-circle-right:before{content:'\e00b'}.oi-arrow-circle-top:before{content:'\e00c'}.oi-arrow-left:before{content:'\e00d'}.oi-arrow-right:before{content:'\e00e'}.oi-arrow-thick-bottom:before{content:'\e00f'}.oi-arrow-thick-left:before{content:'\e010'}.oi-arrow-thick-right:before{content:'\e011'}.oi-arrow-thick-top:before{content:'\e012'}.oi-arrow-top:before{content:'\e013'}.oi-audio-spectrum:before{content:'\e014'}.oi-audio:before{content:'\e015'}.oi-badge:before{content:'\e016'}.oi-ban:before{content:'\e017'}.oi-bar-chart:before{content:'\e018'}.oi-basket:before{content:'\e019'}.oi-battery-empty:before{content:'\e01a'}.oi-battery-full:before{content:'\e01b'}.oi-beaker:before{content:'\e01c'}.oi-bell:before{content:'\e01d'}.oi-bluetooth:before{content:'\e01e'}.oi-bold:before{content:'\e01f'}.oi-bolt:before{content:'\e020'}.oi-book:before{content:'\e021'}.oi-bookmark:before{content:'\e022'}.oi-box:before{content:'\e023'}.oi-briefcase:before{content:'\e024'}.oi-british-pound:before{content:'\e025'}.oi-browser:before{content:'\e026'}.oi-brush:before{content:'\e027'}.oi-bug:before{content:'\e028'}.oi-bullhorn:before{content:'\e029'}.oi-calculator:before{content:'\e02a'}.oi-calendar:before{content:'\e02b'}.oi-camera-slr:before{content:'\e02c'}.oi-caret-bottom:before{content:'\e02d'}.oi-caret-left:before{content:'\e02e'}.oi-caret-right:before{content:'\e02f'}.oi-caret-top:before{content:'\e030'}.oi-cart:before{content:'\e031'}.oi-chat:before{content:'\e032'}.oi-check:before{content:'\e033'}.oi-chevron-bottom:before{content:'\e034'}.oi-chevron-left:before{content:'\e035'}.oi-chevron-right:before{content:'\e036'}.oi-chevron-top:before{content:'\e037'}.oi-circle-check:before{content:'\e038'}.oi-circle-x:before{content:'\e039'}.oi-clipboard:before{content:'\e03a'}.oi-clock:before{content:'\e03b'}.oi-cloud-download:before{content:'\e03c'}.oi-cloud-upload:before{content:'\e03d'}.oi-cloud:before{content:'\e03e'}.oi-cloudy:before{content:'\e03f'}.oi-code:before{content:'\e040'}.oi-cog:before{content:'\e041'}.oi-collapse-down:before{content:'\e042'}.oi-collapse-left:before{content:'\e043'}.oi-collapse-right:before{content:'\e044'}.oi-collapse-up:before{content:'\e045'}.oi-command:before{content:'\e046'}.oi-comment-square:before{content:'\e047'}.oi-compass:before{content:'\e048'}.oi-contrast:before{content:'\e049'}.oi-copywriting:before{content:'\e04a'}.oi-credit-card:before{content:'\e04b'}.oi-crop:before{content:'\e04c'}.oi-dashboard:before{content:'\e04d'}.oi-data-transfer-download:before{content:'\e04e'}.oi-data-transfer-upload:before{content:'\e04f'}.oi-delete:before{content:'\e050'}.oi-dial:before{content:'\e051'}.oi-document:before{content:'\e052'}.oi-dollar:before{content:'\e053'}.oi-double-quote-sans-left:before{content:'\e054'}.oi-double-quote-sans-right:before{content:'\e055'}.oi-double-quote-serif-left:before{content:'\e056'}.oi-double-quote-serif-right:before{content:'\e057'}.oi-droplet:before{content:'\e058'}.oi-eject:before{content:'\e059'}.oi-elevator:before{content:'\e05a'}.oi-ellipses:before{content:'\e05b'}.oi-envelope-closed:before{content:'\e05c'}.oi-envelope-open:before{content:'\e05d'}.oi-euro:before{content:'\e05e'}.oi-excerpt:before{content:'\e05f'}.oi-expand-down:before{content:'\e060'}.oi-expand-left:before{content:'\e061'}.oi-expand-right:before{content:'\e062'}.oi-expand-up:before{content:'\e063'}.oi-external-link:before{content:'\e064'}.oi-eye:before{content:'\e065'}.oi-eyedropper:before{content:'\e066'}.oi-file:before{content:'\e067'}.oi-fire:before{content:'\e068'}.oi-flag:before{content:'\e069'}.oi-flash:before{content:'\e06a'}.oi-folder:before{content:'\e06b'}.oi-fork:before{content:'\e06c'}.oi-fullscreen-enter:before{content:'\e06d'}.oi-fullscreen-exit:before{content:'\e06e'}.oi-globe:before{content:'\e06f'}.oi-graph:before{content:'\e070'}.oi-grid-four-up:before{content:'\e071'}.oi-grid-three-up:before{content:'\e072'}.oi-grid-two-up:before{content:'\e073'}.oi-hard-drive:before{content:'\e074'}.oi-header:before{content:'\e075'}.oi-headphones:before{content:'\e076'}.oi-heart:before{content:'\e077'}.oi-home:before{content:'\e078'}.oi-image:before{content:'\e079'}.oi-inbox:before{content:'\e07a'}.oi-infinity:before{content:'\e07b'}.oi-info:before{content:'\e07c'}.oi-italic:before{content:'\e07d'}.oi-justify-center:before{content:'\e07e'}.oi-justify-left:before{content:'\e07f'}.oi-justify-right:before{content:'\e080'}.oi-key:before{content:'\e081'}.oi-laptop:before{content:'\e082'}.oi-layers:before{content:'\e083'}.oi-lightbulb:before{content:'\e084'}.oi-link-broken:before{content:'\e085'}.oi-link-intact:before{content:'\e086'}.oi-list-rich:before{content:'\e087'}.oi-list:before{content:'\e088'}.oi-location:before{content:'\e089'}.oi-lock-locked:before{content:'\e08a'}.oi-lock-unlocked:before{content:'\e08b'}.oi-loop-circular:before{content:'\e08c'}.oi-loop-square:before{content:'\e08d'}.oi-loop:before{content:'\e08e'}.oi-magnifying-glass:before{content:'\e08f'}.oi-map-marker:before{content:'\e090'}.oi-map:before{content:'\e091'}.oi-media-pause:before{content:'\e092'}.oi-media-play:before{content:'\e093'}.oi-media-record:before{content:'\e094'}.oi-media-skip-backward:before{content:'\e095'}.oi-media-skip-forward:before{content:'\e096'}.oi-media-step-backward:before{content:'\e097'}.oi-media-step-forward:before{content:'\e098'}.oi-media-stop:before{content:'\e099'}.oi-medical-cross:before{content:'\e09a'}.oi-menu:before{content:'\e09b'}.oi-microphone:before{content:'\e09c'}.oi-minus:before{content:'\e09d'}.oi-monitor:before{content:'\e09e'}.oi-moon:before{content:'\e09f'}.oi-move:before{content:'\e0a0'}.oi-musical-note:before{content:'\e0a1'}.oi-paperclip:before{content:'\e0a2'}.oi-pencil:before{content:'\e0a3'}.oi-people:before{content:'\e0a4'}.oi-person:before{content:'\e0a5'}.oi-phone:before{content:'\e0a6'}.oi-pie-chart:before{content:'\e0a7'}.oi-pin:before{content:'\e0a8'}.oi-play-circle:before{content:'\e0a9'}.oi-plus:before{content:'\e0aa'}.oi-power-standby:before{content:'\e0ab'}.oi-print:before{content:'\e0ac'}.oi-project:before{content:'\e0ad'}.oi-pulse:before{content:'\e0ae'}.oi-puzzle-piece:before{content:'\e0af'}.oi-question-mark:before{content:'\e0b0'}.oi-rain:before{content:'\e0b1'}.oi-random:before{content:'\e0b2'}.oi-reload:before{content:'\e0b3'}.oi-resize-both:before{content:'\e0b4'}.oi-resize-height:before{content:'\e0b5'}.oi-resize-width:before{content:'\e0b6'}.oi-rss-alt:before{content:'\e0b7'}.oi-rss:before{content:'\e0b8'}.oi-script:before{content:'\e0b9'}.oi-share-boxed:before{content:'\e0ba'}.oi-share:before{content:'\e0bb'}.oi-shield:before{content:'\e0bc'}.oi-signal:before{content:'\e0bd'}.oi-signpost:before{content:'\e0be'}.oi-sort-ascending:before{content:'\e0bf'}.oi-sort-descending:before{content:'\e0c0'}.oi-spreadsheet:before{content:'\e0c1'}.oi-star:before{content:'\e0c2'}.oi-sun:before{content:'\e0c3'}.oi-tablet:before{content:'\e0c4'}.oi-tag:before{content:'\e0c5'}.oi-tags:before{content:'\e0c6'}.oi-target:before{content:'\e0c7'}.oi-task:before{content:'\e0c8'}.oi-terminal:before{content:'\e0c9'}.oi-text:before{content:'\e0ca'}.oi-thumb-down:before{content:'\e0cb'}.oi-thumb-up:before{content:'\e0cc'}.oi-timer:before{content:'\e0cd'}.oi-transfer:before{content:'\e0ce'}.oi-trash:before{content:'\e0cf'}.oi-underline:before{content:'\e0d0'}.oi-vertical-align-bottom:before{content:'\e0d1'}.oi-vertical-align-center:before{content:'\e0d2'}.oi-vertical-align-top:before{content:'\e0d3'}.oi-video:before{content:'\e0d4'}.oi-volume-high:before{content:'\e0d5'}.oi-volume-low:before{content:'\e0d6'}.oi-volume-off:before{content:'\e0d7'}.oi-warning:before{content:'\e0d8'}.oi-wifi:before{content:'\e0d9'}.oi-wrench:before{content:'\e0da'}.oi-x:before{content:'\e0db'}.oi-yen:before{content:'\e0dc'}.oi-zoom-in:before{content:'\e0dd'}.oi-zoom-out:before{content:'\e0de'} -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/css/open.iconic/font/fonts/open-iconic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.Server/wwwroot/css/open.iconic/font/fonts/open-iconic.eot -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/css/open.iconic/font/fonts/open-iconic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.Server/wwwroot/css/open.iconic/font/fonts/open-iconic.otf -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/css/open.iconic/font/fonts/open-iconic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.Server/wwwroot/css/open.iconic/font/fonts/open-iconic.ttf -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/css/open.iconic/font/fonts/open-iconic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.Server/wwwroot/css/open.iconic/font/fonts/open-iconic.woff -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/css/site.css: -------------------------------------------------------------------------------- 1 | @import url('open.iconic/font/css/open-iconic-bootstrap.min.css'); 2 | 3 | html, body { 4 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 5 | } 6 | 7 | html, body { 8 | height: 100%; 9 | overflow: hidden; 10 | } 11 | 12 | .valid.modified:not([type=checkbox]) { 13 | outline: 1px solid #26b050; 14 | } 15 | 16 | .invalid { 17 | outline: 1px solid red; 18 | } 19 | 20 | .validation-message { 21 | color: red; 22 | } 23 | 24 | #blazor-error-ui { 25 | background: lightyellow; 26 | bottom: 0; 27 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); 28 | display: none; 29 | left: 0; 30 | padding: 0.6rem 1.25rem 0.7rem 1.25rem; 31 | position: fixed; 32 | width: 100%; 33 | z-index: 1000; 34 | } 35 | 36 | #blazor-error-ui .dismiss { 37 | cursor: pointer; 38 | position: absolute; 39 | right: 0.75rem; 40 | top: 0.5rem; 41 | } 42 | 43 | .dxbl-modal.dxbl-sidepanel > .dxbl-modal-root > .dxbl-popup.dxbl-sidepanel-dialog.dxbl-grid-column-chooser-dialog { 44 | align-self: end !important; 45 | } -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/images/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.Server/wwwroot/images/banner.png -------------------------------------------------------------------------------- /BlazorDemo.Server/wwwroot/images/sad.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/BlazorDemo.Shared.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net9.0 5 | disable 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/Components/Grid.razor: -------------------------------------------------------------------------------- 1 | @page "/grid" 2 | 3 | @using BlazorDemo.Shared.Data 4 | 5 | @if(SelectedIssue != null) { 6 | 7 | } else { 8 | 9 | } 10 | 11 | @code { 12 | Issue SelectedIssue { get; set; } 13 | 14 | void ShowIssueDetails(Issue issue) { 15 | SelectedIssue = issue; 16 | } 17 | void ShowIssueList() { 18 | SelectedIssue = null; 19 | } 20 | } -------------------------------------------------------------------------------- /BlazorDemo.Shared/Components/GridDetails.razor: -------------------------------------------------------------------------------- 1 | @using BlazorDemo.Shared.Data 2 | @using BlazorDemo.Shared.Data.Services 3 | @inject IssuesDataService IssuesDataService 4 |
5 |
6 |
7 |
8 |

@SelectedIssue.Name

9 |

Reported by @GetOwnerName(SelectedIssue) (@GetOwnerEmail(SelectedIssue)) @GetCreatedDate(SelectedIssue) at @GetCreatedTime(SelectedIssue) in @GetProjectName(SelectedIssue)

10 |

@SelectedIssue.Description

11 |
12 |
13 | #@SelectedIssue.ID 14 |
@SelectedIssue.Status
15 |
16 |
17 | 18 | 19 |
20 |
21 | 22 | @code { 23 | IEnumerable ProjectList { get; set; } 24 | IEnumerable UserList { get; set; } 25 | [Parameter] 26 | public Issue SelectedIssue { get; set; } 27 | [Parameter] 28 | public EventCallback GotoListView { get; set; } 29 | protected override async Task OnInitializedAsync() 30 | { 31 | ProjectList = await IssuesDataService.GetProjectsAsync(); 32 | UserList = await IssuesDataService.GetUsersAsync(); 33 | } 34 | async Task GotoListViewClick() 35 | { 36 | await GotoListView.InvokeAsync(); 37 | } 38 | string GetCreatedDate(Issue issue) 39 | { 40 | return issue.CreatedDate.HasValue ? issue.CreatedDate.Value.ToString("D") : ""; 41 | } 42 | string GetCreatedTime(Issue issue) 43 | { 44 | return issue.CreatedDate.HasValue ? issue.CreatedDate.Value.ToString("t") : ""; 45 | } 46 | string GetOwnerName(Issue issue) 47 | { 48 | return UserList.Where(uc => uc.ID == issue.OwnerID).FirstOrDefault().FullName; 49 | } 50 | string GetOwnerEmail(Issue issue) 51 | { 52 | return UserList.Where(uc => uc.ID == issue.OwnerID).FirstOrDefault().Email; 53 | } 54 | string GetProjectName(Issue issue) 55 | { 56 | return ProjectList.Where(uc => uc.ID == issue.ProjectID).FirstOrDefault().Name; 57 | } 58 | } -------------------------------------------------------------------------------- /BlazorDemo.Shared/Components/GridList.razor: -------------------------------------------------------------------------------- 1 | @using BlazorDemo.Shared.Data 2 | @using BlazorDemo.Shared.Data.Services 3 | @implements IDisposable 4 | @inject IssuesDataService IssuesDataService 5 | 6 | 7 | 8 | 9 | @if (IsSmallDevice || IsLargeDevice) 10 | { 11 | 12 |
13 | @if (IsLargeDevice) 14 | { 15 |
16 | 21 |
22 | } 23 | else 24 | { 25 |
26 | 31 |
32 | } 33 | 42 | 43 | @(context.GroupValueDisplayText + " (" + context.SummaryDisplayText + ")") 44 | 45 | 46 | 47 | 48 | @{ 49 | var issue = (context.DataItem as Issue); 50 | } 51 | @GetIssueTypeIconHtml(issue.Type) 52 | 53 | 54 | 55 | 56 | 57 | 62 | 63 | 64 | 65 | 66 | 71 | 72 | 73 | 74 | 75 | 80 | 81 | 82 | 83 | 84 | 88 | 89 | 90 | 91 | 92 | 95 | 96 | 97 | 98 | 99 | 102 | 103 | 104 | 105 | 106 | 109 | 110 | 111 | 112 | @GetIssuePriorityIconHtml((context.DataItem as Issue).Priority) 113 | 114 | Clear 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 |
123 | } 124 | 125 | 126 | 127 | @code { 128 | IGrid Grid; 129 | IEnumerable DataSource { get; set; } 130 | IEnumerable ProjectList { get; set; } 131 | IEnumerable UserList { get; set; } 132 | static List StatusList { get; set; } = ((IssueStatus[])Enum.GetValues(typeof(IssueStatus))).Cast().ToList(); 133 | readonly TaskCompletionSource dataLoadedTcs = new(TaskCreationOptions.RunContinuationsAsynchronously); 134 | bool IsSmallDevice { get; set; } 135 | bool IsLargeDevice { get; set; } 136 | 137 | [Parameter] 138 | public EventCallback GotoDetailsView { get; set; } 139 | 140 | async Task GotoDetailsViewClick(Issue issue) 141 | { 142 | await GotoDetailsView.InvokeAsync(issue); 143 | } 144 | 145 | protected override async Task OnInitializedAsync() 146 | { 147 | ProjectList = await IssuesDataService.GetProjectsAsync(); 148 | UserList = await IssuesDataService.GetUsersAsync(); 149 | DataSource = await IssuesDataService.GetIssuesAsync(); 150 | dataLoadedTcs.TrySetResult(true); 151 | } 152 | 153 | void Grid_CustomizeCellDisplayText(GridCustomizeCellDisplayTextEventArgs e) 154 | { 155 | if (e.FieldName == "ProjectID") 156 | { 157 | e.DisplayText = ProjectList.Where(p => p.ID == (long)e.Value).FirstOrDefault().Name; 158 | } 159 | else if (e.FieldName == "CreatorID" || e.FieldName == "OwnerID") 160 | { 161 | e.DisplayText = UserList.Where(u => u.ID == (long)e.Value).FirstOrDefault().FullName; 162 | } 163 | } 164 | 165 | void Grid_CustomizeElement(GridCustomizeElementEventArgs e) 166 | { 167 | if (e.ElementType == GridElementType.GroupRow) 168 | { 169 | 170 | } 171 | } 172 | 173 | public MarkupString GetIssuePriorityIconHtml(IssuePriority priority) 174 | { 175 | string priorytyClass = "warning"; 176 | string title = "Medium"; 177 | if (priority == IssuePriority.High) 178 | { 179 | priorytyClass = "danger"; 180 | title = " High "; 181 | } 182 | if (priority == IssuePriority.Low) 183 | { 184 | priorytyClass = "info"; 185 | title = " Low "; 186 | } 187 | string html = string.Format("{1}", priorytyClass, title); 188 | return new MarkupString(html); 189 | } 190 | public MarkupString GetIssueTypeIconHtml(IssueType type) 191 | { 192 | string html = ""; 193 | if (type == IssueType.Bug) 194 | html = "B"; 195 | return new MarkupString(html); 196 | } 197 | public bool IsGridFiltered() 198 | { 199 | return Grid.GetDataColumns().Any(c => c.FilterRowValue != null); 200 | } 201 | void ShowColumnChooser() 202 | { 203 | Grid.ShowColumnChooser(".column-chooser-button"); 204 | } 205 | public void Dispose() 206 | { 207 | dataLoadedTcs.TrySetCanceled(); 208 | } 209 | } 210 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/Components/GridList.razor.css: -------------------------------------------------------------------------------- 1 | .my-container { 2 | height: 100%; 3 | display: flex; 4 | flex-direction: column; 5 | } 6 | 7 | .fab-container { 8 | display: flex; 9 | flex-direction: column; 10 | justify-content: flex-end; 11 | align-items: center; 12 | user-select: none; 13 | position: absolute; 14 | bottom: 16px; 15 | right: 16px; 16 | } 17 | 18 | ::deep .fab { 19 | width: 56px; 20 | height: 56px; 21 | border-radius: 16px; 22 | position: relative; 23 | z-index: 1; 24 | box-shadow: 0 0.5rem 1rem rgba(0,0,0,.35) !important; 25 | } 26 | 27 | ::deep .my-grid { 28 | height: 70%; 29 | flex: 70% 30 | } 31 | 32 | ::deep .btn-column-chooser { 33 | width: 16px; 34 | height: 16px; 35 | -webkit-mask-image: url("column-chooser.svg"); 36 | mask-image: url("column-chooser.svg"); 37 | background-color: currentColor; 38 | } 39 | 40 | ::deep .my-grid.dxbl-grid .dxbl-grid-table > tbody > tr > td { 41 | border-left-width: 0px; 42 | } 43 | 44 | ::deep .my-grid.dxbl-grid .dxbl-grid-table > thead > tr > th { 45 | border-left-width: 0px; 46 | } 47 | 48 | ::deep .my-grid.dxbl-grid .dxbl-grid-table > thead > tr > td { 49 | border-left-width: 0px; 50 | } 51 | 52 | ::deep .my-grid.dxbl-grid .dxbl-grid-group-row { 53 | height: 36px; 54 | } 55 | 56 | ::deep .grid-btn-link { 57 | border: 0; 58 | display: inline; 59 | font: inherit; 60 | line-height: 100%; 61 | padding: 0; 62 | text-decoration: underline; 63 | vertical-align: baseline; 64 | } 65 | 66 | ::deep .dxbl-modal.dxbl-sidepanel > .dxbl-modal-root > .dxbl-popup.dxbl-sidepanel-dialog.dxbl-grid-column-chooser-dialog { 67 | align-self: end !important; 68 | } -------------------------------------------------------------------------------- /BlazorDemo.Shared/Data/DataProviders/IssuesDataProvider.cs: -------------------------------------------------------------------------------- 1 |  2 | using System.Runtime.InteropServices; 3 | 4 | namespace BlazorDemo.Shared.Data.DataProviders 5 | { 6 | [Guid("DD279962-7EC6-494E-8C8E-416C9065D64D")] 7 | public interface IIssuesDataProvider 8 | { 9 | Task> GetIssuesAsync(CancellationToken ct = default); 10 | Task> GetProjectsAsync(CancellationToken ct = default); 11 | Task> GetUsersAsync(CancellationToken ct = default); 12 | } 13 | 14 | public class IssuesDataProvider : IIssuesDataProvider { 15 | 16 | static readonly IEnumerable projects = new List() { 17 | new Project() {ID = 2, Name = "Enterprise Accounting System", ManagerID = 2}, 18 | new Project() {ID = 3, Name = "Small-Business Accounting System", ManagerID = 15}, 19 | new Project() {ID = 4, Name = "Home-Office Accounting System", ManagerID = 16} 20 | }; 21 | 22 | static readonly IEnumerable users = new List() { 23 | new User() {ID = 2, FirstName="Paul", LastName="Bailey" }, 24 | new User() {ID = 3, FirstName="Brad", LastName="Barnes" }, 25 | new User() {ID = 4, FirstName="Jerry", LastName="Campbell" }, 26 | new User() {ID = 5, FirstName="Carl", LastName="Lucas" }, 27 | new User() {ID = 6, FirstName="Peter", LastName="Dolan" }, 28 | new User() {ID = 7, FirstName="Ryan", LastName="Fischer" }, 29 | new User() {ID = 8, FirstName="Richard", LastName="Fisher" }, 30 | new User() {ID = 9, FirstName="Tom", LastName="Hamlett" }, 31 | new User() {ID = 10, FirstName="Mark", LastName="Hamilton" }, 32 | new User() {ID = 11, FirstName="Steve", LastName="Lee" }, 33 | new User() {ID = 12, FirstName="Jimmy", LastName="Lewis" }, 34 | new User() {ID = 13, FirstName="Jeffrey", LastName="McClain" }, 35 | new User() {ID = 14, FirstName="Andrew", LastName="Miller" }, 36 | new User() {ID = 15, FirstName="Dave", LastName="Murrel" }, 37 | new User() {ID = 16, FirstName="Bert", LastName="Parkins" }, 38 | new User() {ID = 17, FirstName="Mike", LastName="Roller" }, 39 | new User() {ID = 18, FirstName="Ray", LastName="Shipman" }, 40 | }; 41 | 42 | static readonly IEnumerable issues = new List() { 43 | new Issue() {Type = IssueType.Request, ProjectID = 4, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 12, CreatedDate = new DateTime(2022,07,01), OwnerID = 4, ModifiedDate = new DateTime(2022,07,10), FixedDate = new DateTime(2022,07,10), Name = "Accounting System: MasterView" }, 44 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 3, CreatedDate = new DateTime(2021,12,04), OwnerID = 11, ModifiedDate = new DateTime(2021,12,05 ), FixedDate = new DateTime(2021,12,05), Name = "Web Edition: Data Entry Page" }, 45 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 18, CreatedDate = new DateTime(2022,07,11), OwnerID = 13, ModifiedDate = new DateTime(2022,07,23), FixedDate = new DateTime(2022,07,23), Name = "Payables Due Calculator" }, 46 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 10, CreatedDate = new DateTime(2022,03,31), OwnerID = 9, ModifiedDate = new DateTime(2022,03,05), FixedDate = new DateTime(2022,08,09), Name = "Web Edition: Search Page" }, 47 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.High, Status = IssueStatus.Fixed, CreatorID = 9, CreatedDate = new DateTime(2022,07,27), OwnerID = 17, ModifiedDate = new DateTime(2022,07,10), FixedDate = new DateTime(2022,07,10), Name = "Main Menu: Duplicate Items" }, 48 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 12, CreatedDate = new DateTime(2022,04,03), OwnerID = 16, ModifiedDate = new DateTime(2022,04,03), FixedDate = new DateTime(2022,08,11), Name = "Receivables Calculator" }, 49 | new Issue() {Type = IssueType.Bug, ProjectID = 2, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 17, CreatedDate = new DateTime(2022,06,06), OwnerID = 16, ModifiedDate = new DateTime(2022,07,04), FixedDate = new DateTime(2022,07,04), Name = "Ledger: Inconsistency" }, 50 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 3, CreatedDate = new DateTime(2022,07,04), OwnerID = 9, ModifiedDate = null, FixedDate = new DateTime(2022,08,10 ), Name = "Receivables Printing" }, 51 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2022,06,26), OwnerID = 7, ModifiedDate = new DateTime(2022,07,08), FixedDate = new DateTime(2022,08,18), Name = "Screen Redraw" }, 52 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2021,11,05), OwnerID = 11, ModifiedDate = new DateTime(2022,01,28), FixedDate = new DateTime(2022,01,27), Name = "Email System" }, 53 | new Issue() {Type = IssueType.Bug, ProjectID = 3, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2022,05,20), OwnerID = 13, ModifiedDate = null, FixedDate = new DateTime(2022,08,16), Name = "Adding New Vendors Fails" }, 54 | new Issue() {Type = IssueType.Bug, ProjectID = 3, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 9, CreatedDate = new DateTime(2022,03,14), OwnerID = 11, ModifiedDate = new DateTime(2022,04,09), FixedDate = new DateTime(2022,08,10), Name = "History" }, 55 | new Issue() {Type = IssueType.Request, ProjectID = 4, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2021,10,10), OwnerID = 16, ModifiedDate = null, FixedDate = new DateTime(2022,08,08), Name = "Main Menu: Add a File menu" }, 56 | new Issue() {Type = IssueType.Request, ProjectID = 4, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 12, CreatedDate = new DateTime(2022,04,03), OwnerID = 13, ModifiedDate = null, FixedDate = new DateTime(2022,08,21), Name = "Currency Mask" }, 57 | new Issue() {Type = IssueType.Request, ProjectID = 4, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2022,02,07), OwnerID = 4, ModifiedDate = null, FixedDate = new DateTime(2022,08,25), Name = "Drag & Drop" }, 58 | new Issue() {Type = IssueType.Request, ProjectID = 4, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 3, CreatedDate = new DateTime(2022,05,15), OwnerID = 4, ModifiedDate = null, FixedDate = new DateTime(2022,08,15), Name = "Data Import" }, 59 | new Issue() {Type = IssueType.Request, ProjectID = 4, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 10, CreatedDate = new DateTime(2022,03,13), OwnerID = 9, ModifiedDate = null, FixedDate = new DateTime(2022,08,16), Name = "Reports" }, 60 | new Issue() {Type = IssueType.Request, ProjectID = 4, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2022,01,09), OwnerID = 17, ModifiedDate = null, FixedDate = null, Name = "Data Archiving" }, 61 | new Issue() {Type = IssueType.Request, ProjectID = 4, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 3, CreatedDate = new DateTime(2022,02,22), OwnerID = 11, ModifiedDate = null, FixedDate = null, Name = "New Users"}, 62 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2022,07,14), OwnerID = 17, ModifiedDate = null, FixedDate = new DateTime(2022,08,02), Name = "Email Attachments" }, 63 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2021,07,14), OwnerID = 17, ModifiedDate = new DateTime(2022-05-28), FixedDate = new DateTime(2022,09,1), Name = "Faxing" }, 64 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.High, Status = IssueStatus.Fixed, CreatorID = 3, CreatedDate = new DateTime(2021,07,14), OwnerID = 17, ModifiedDate = new DateTime(2022-05-15), FixedDate = new DateTime(2022,08,8), Name = "Check Register" }, 65 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 18, CreatedDate = new DateTime(2021,07,14), OwnerID = 16, ModifiedDate = new DateTime(2022-04-19), FixedDate = new DateTime(2022,09,4), Name = "Vendor List" }, 66 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2021,07,14), OwnerID = 7, ModifiedDate = null, FixedDate = new DateTime(2023,06,11), Name = "Data Export" }, 67 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 3, CreatedDate = new DateTime(2021,07,14), OwnerID = 5, ModifiedDate = new DateTime(2022-06-17), FixedDate = new DateTime(2022,08,16), Name = "Transaction Log" }, 68 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 3, CreatedDate = new DateTime(2021,07,14), OwnerID = 5, ModifiedDate = null, FixedDate = new DateTime(2022,02,6), Name = "Transaction History" }, 69 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 10, CreatedDate = new DateTime(2021,07,14), OwnerID = 14, ModifiedDate = new DateTime(2022-04-03), FixedDate = new DateTime(2022,08,16), Name = "Help: Phone scripts" }, 70 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 10, CreatedDate = new DateTime(2021,07,14), OwnerID = 5, ModifiedDate = null, FixedDate = new DateTime(2022,01,11), Name = "Help File Duplicates" }, 71 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2021,07,14), OwnerID = 5, ModifiedDate = null, FixedDate = new DateTime(2022,08,13), Name = "Help File Topics" }, 72 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.Low, Status = IssueStatus.Fixed, CreatorID = 12, CreatedDate = new DateTime(2021,07,14), OwnerID = 5, ModifiedDate = null, FixedDate = new DateTime(2022,07,15), Name = "Help File Integration" }, 73 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2021,07,14), OwnerID = 14, ModifiedDate = null, FixedDate = new DateTime(2022,08,16), Name = "Installer" }, 74 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 15, CreatedDate = new DateTime(2021,07,14), OwnerID = 16, ModifiedDate = null, FixedDate = new DateTime(2022,08,16), Name = "Installer" }, 75 | new Issue() {Type = IssueType.Request, ProjectID = 3, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 10, CreatedDate = new DateTime(2021,07,14), OwnerID = 16, ModifiedDate = new DateTime(2022, 05, 01), FixedDate = new DateTime(2022,08,16), Name = "Vendor TAX IDs" }, 76 | new Issue() {Type = IssueType.Request, ProjectID = 2, Priority=IssuePriority.Medium, Status = IssueStatus.Fixed, CreatorID = 3, CreatedDate = new DateTime(2021,07,14), OwnerID = 13, ModifiedDate = new DateTime(2022, 05, 01), FixedDate = new DateTime(2022,08,16), Name = "Vendor Name" }, 77 | }; 78 | 79 | public Task> GetIssuesAsync(CancellationToken ct = default) 80 | => Task.FromResult(issues); 81 | 82 | public Task> GetProjectsAsync(CancellationToken ct = default) 83 | => Task.FromResult(projects); 84 | 85 | public Task> GetUsersAsync(CancellationToken ct = default) 86 | => Task.FromResult(users); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/Data/Issue.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.InteropServices; 2 | 3 | namespace BlazorDemo.Shared.Data 4 | { 5 | public enum IssueType { Request, Bug } 6 | public enum IssueStatus { New, Postponed, Fixed, Rejected } 7 | public enum IssuePriority { Low, Medium, High } 8 | 9 | [Guid("A591BB54-DC92-416C-A9EF-1BF8CA067A88")] 10 | public partial class Issue 11 | { 12 | public long ID { get; set; } 13 | public string Name { get; set; } 14 | public IssueType Type { get; set; } 15 | public Nullable ProjectID { get; set; } 16 | public IssuePriority Priority { get; set; } 17 | public IssueStatus Status { get; set; } 18 | public Nullable CreatorID { get; set; } 19 | public Nullable CreatedDate { get; set; } 20 | public Nullable OwnerID { get; set; } 21 | public Nullable ModifiedDate { get; set; } 22 | public Nullable FixedDate { get; set; } 23 | public string Description { get; set; } 24 | public string Resolution { get; set; } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/Data/Project.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.InteropServices; 2 | 3 | namespace BlazorDemo.Shared.Data 4 | { 5 | [Guid("AC2E2606-022C-4A4E-9F25-7481F0879BBC")] 6 | public partial class Project 7 | { 8 | public long ID { get; set; } 9 | public string Name { get; set; } 10 | public Nullable ManagerID { get; set; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/Data/ServiceCollectionExtensions.cs: -------------------------------------------------------------------------------- 1 | using BlazorDemo.Shared.Data.DataProviders; 2 | using BlazorDemo.Shared.Data.Services; 3 | using Microsoft.Extensions.DependencyInjection; 4 | 5 | namespace BlazorDemo.Server.Data 6 | { 7 | public static class ServiceCollectionExtensions 8 | { 9 | public static void AddIssueServices(this IServiceCollection services) { 10 | services.AddSingleton(); 11 | services.AddScoped(); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/Data/Services/IssuesDataService.cs: -------------------------------------------------------------------------------- 1 | using BlazorDemo.Shared.Data.DataProviders; 2 | 3 | namespace BlazorDemo.Shared.Data.Services 4 | { 5 | public class IssuesDataService 6 | { 7 | readonly IIssuesDataProvider _dataProvider; 8 | 9 | public IssuesDataService(IIssuesDataProvider dataProvider) 10 | { 11 | _dataProvider = dataProvider; 12 | } 13 | public Task> GetIssuesAsync(CancellationToken ct = default) 14 | { 15 | // Return your data here 16 | /*BeginHide*/ 17 | return _dataProvider.GetIssuesAsync(ct); 18 | /*EndHide*/ 19 | } 20 | public Task> GetProjectsAsync(CancellationToken ct = default) 21 | { 22 | // Return your data here 23 | /*BeginHide*/ 24 | return _dataProvider.GetProjectsAsync(ct); 25 | /*EndHide*/ 26 | } 27 | public Task> GetUsersAsync(CancellationToken ct = default) 28 | { 29 | // Return your data here 30 | /*BeginHide*/ 31 | return _dataProvider.GetUsersAsync(ct); 32 | /*EndHide*/ 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/Data/User.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Runtime.InteropServices; 5 | using System.Threading.Tasks; 6 | 7 | 8 | namespace BlazorDemo.Shared.Data 9 | { 10 | [Guid("5A52072B-7393-4641-A439-E7B98B13C6E3")] 11 | public partial class User 12 | { 13 | public long ID { get; set; } 14 | public string FirstName { get; set; } 15 | public string LastName { get; set; } 16 | public string Country { get; set; } 17 | public string City { get; set; } 18 | public string Address { get; set; } 19 | public string Phone { get; set; } 20 | public string Email { get; set; } 21 | 22 | public string FullName { get { return FirstName + " " + LastName; } } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/Program.cs: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /BlazorDemo.Shared/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Components.Web 2 | @using DevExpress.Blazor -------------------------------------------------------------------------------- /BlazorDemo.Shared/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/BlazorDemo.Shared/wwwroot/background.png -------------------------------------------------------------------------------- /BlazorDemo.Shared/wwwroot/column-chooser.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /BlazorDemo.Shared/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @DevExpressExampleBot -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This code example is provided "as is" without warranty of any kind. Developer Express Inc ("DevExpress") disclaims all warranties, 2 | either express or implied, including the warranties of merchantability and fitness for a particular purpose. 3 | 4 | For licensing terms and conditions of DevExpress product(s) required for, or associated with the use of this code example, 5 | please refer to the applicable End-User License Agreement at https://www.devexpress.com/Support/licensingfaq.xml -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ![](https://img.shields.io/endpoint?url=https://codecentral.devexpress.com/api/v1/VersionRange/632326528/24.2.3%2B) 3 | [![](https://img.shields.io/badge/Open_in_DevExpress_Support_Center-FF7200?style=flat-square&logo=DevExpress&logoColor=white)](https://supportcenter.devexpress.com/ticket/details/T1162029) 4 | [![](https://img.shields.io/badge/📖_How_to_use_DevExpress_Examples-e9f6fc?style=flat-square)](https://docs.devexpress.com/GeneralInformation/403183) 5 | [![](https://img.shields.io/badge/💬_Leave_Feedback-feecdd?style=flat-square)](#does-this-example-address-your-development-requirementsobjectives) 6 | 7 | 8 | # Use DevExpress MAUI and Blazor Components to Create a .NET MAUI Blazor Hybrid app 9 | 10 | This demo example shows how to utilize DevExpress Blazor and .NET MAUI components to develop a .NET MAUI Blazor Hybrid app. 11 | 12 | ## Blazor Hybrid View 13 | 14 | .NET MAUI Blazor Hybrid view 15 | 16 | This page uses the DevExpress Blazor Grid to display a list of tasks. When the app is viewed on smaller screen sizes, adaptive triggers reduce the number of columns and display a column chooser button. 17 | 18 | The code for this view is shared between MAUI and Blazor Server apps. The MAUI version uses a larger size mode. 19 | 20 | **Files to look at:** [HybridGridPage.xaml](./BlazorDemo.MAUI/MauiViews/HybridGridPage.xaml), [MauiProgram.cs](./BlazorDemo.MAUI/MauiProgram.cs), [GridList.razor](./BlazorDemo.Shared/Components/GridList.razor) 21 | 22 | **Read more:** [Blazor Size Modes](https://docs.devexpress.com/Blazor/401784/common-concepts/customize-appearance/size-modes), [Adaptive Layout API](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxLayoutBreakpoint) 23 | 24 | ## Views Built with MAUI 25 | 26 | Views built with the DevExpress for .NET MAUI library 27 | 28 | 29 | ### Login View 30 | 31 | This page shows how to implement a login UI in your .NET MAUI application. 32 | 33 | **Available user:** "User" with the password "123". 34 | 35 | **File to look at:** [LoginPage.xaml](BlazorDemo.MAUI/MauiViews/LoginPage.xaml) 36 | 37 | **Read more:** [Authentication](https://docs.devexpress.com/MAUI/404307/scenarios/authenticate) 38 | 39 | ### Blogs View 40 | 41 | This page uses our [DXCollectionView](https://docs.devexpress.com/MAUI/DevExpress.Maui.CollectionView.DXCollectionView?p=netframework) component to show a collection of items. Note the infinite scrolling feature - the component loads batches of items on demand. 42 | 43 | **File to look at:** [BlogsPage.xaml](BlazorDemo.MAUI/MauiViews/BlogsPage.xaml) 44 | 45 | **Read more:** [Infinite Scrolling](https://docs.devexpress.com/MAUI/404358/scenarios/infinite-grid-scroll) 46 | 47 | ### Analytics View 48 | 49 | This page shows how to use our [SimpleButton](https://docs.devexpress.com/MAUI/DevExpress.Maui.Controls.SimpleButton) components to create clickable cards. 50 | 51 | **File to look at:** [AnalyticsPage.xaml](BlazorDemo.MAUI/MauiViews/AnalyticsPage.xaml) 52 | 53 | **Read more:** [Cards with Custom Content](https://docs.devexpress.com/MAUI/404341/scenarios/buttons-and-charts-in-cards) 54 | 55 | ## Documentation 56 | 57 | * [Build a .NET MAUI Blazor Hybrid app](https://learn.microsoft.com/en-us/aspnet/core/blazor/hybrid/tutorials/maui?view=aspnetcore-7.0&pivots=windows) 58 | 59 | ## Does this example address your development requirements/objectives? 60 | 61 | [](https://www.devexpress.com/support/examples/survey.xml?utm_source=github&utm_campaign=blazor-maui-hybrid-app&~~~was_helpful=yes) [](https://www.devexpress.com/support/examples/survey.xml?utm_source=github&utm_campaign=blazor-maui-hybrid-app&~~~was_helpful=no) 62 | 63 | (you will be redirected to DevExpress.com to submit your response) 64 | 65 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "autoGenerateVb": false, 3 | "runOnWeb": false 4 | } -------------------------------------------------------------------------------- /media/hybrid-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/media/hybrid-view.png -------------------------------------------------------------------------------- /media/maui-views.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevExpress-Examples/blazor-maui-hybrid-app/4c3b3ceee92842d81cb3700c57bde3cecd3dde0c/media/maui-views.png --------------------------------------------------------------------------------