This commit is contained in:
2026-02-02 10:00:26 +07:00
commit b9b2c6ef79
617 changed files with 133854 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")]

View File

@@ -0,0 +1,7 @@
// <auto-generated/>
namespace Microsoft.CodeAnalysis
{
internal sealed partial class EmbeddedAttribute : global::System.Attribute
{
}
}

View File

@@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("SickBlazorApp")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("SickBlazorApp")]
[assembly: System.Reflection.AssemblyTitleAttribute("SickBlazorApp")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -0,0 +1 @@
9b1743cfd3719291deaf5d1affab92ec46343a345aac8ac2ae8f6530bfaa0a7a

View File

@@ -0,0 +1,67 @@
is_global = true
build_property.TargetFramework = net10.0
build_property.TargetFrameworkIdentifier = .NETCoreApp
build_property.TargetFrameworkVersion = v10.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb = true
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = SickBlazorApp
build_property.RootNamespace = SickBlazorApp
build_property.ProjectDir = C:\Users\Admin\source\repos\SickApp\SickBlazorApp\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.RazorLangVersion = 9.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = C:\Users\Admin\source\repos\SickApp\SickBlazorApp
build_property._RazorSourceGeneratorDebug =
build_property.EffectiveAnalysisLevelStyle = 10.0
build_property.EnableCodeStyleSeverity =
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/AccordionItem.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBY2NvcmRpb25JdGVtLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/App.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Pages/Error.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xFcnJvci5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Pages/Home.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xIb21lLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Pages/NotFound.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xOb3RGb3VuZC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Pages/Sick.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xTaWNrLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Routes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xSb3V0ZXMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xfSW1wb3J0cy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Layout/MainLayout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTWFpbkxheW91dC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = b-qmki05wm3r
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Layout/NavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTmF2TWVudS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = b-1iw1jlyvzt
[C:/Users/Admin/source/repos/SickApp/SickBlazorApp/Components/Layout/ReconnectModal.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcUmVjb25uZWN0TW9kYWwucmF6b3I=
build_metadata.AdditionalFiles.CssScope = b-6mk5e94y2s

View File

@@ -0,0 +1,18 @@
// <auto-generated/>
global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.Http;
global using Microsoft.AspNetCore.Routing;
global using Microsoft.Extensions.Configuration;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using Microsoft.Extensions.Logging;
global using Microsoft.Extensions.Validation.Embedded;
global using System;
global using System.Collections.Generic;
global using System.IO;
global using System.Linq;
global using System.Net.Http;
global using System.Net.Http.Json;
global using System.Threading;
global using System.Threading.Tasks;

View File

@@ -0,0 +1 @@
b96dcea00c0a9eb392ec80dcc361a7088b27f11341e4802dfbd2425b915f353c

View File

@@ -0,0 +1,91 @@
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\appsettings.Development.json
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\appsettings.json
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\SickBlazorApp.staticwebassets.runtime.json
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\SickBlazorApp.staticwebassets.endpoints.json
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\SickBlazorApp.exe
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\SickBlazorApp.deps.json
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\SickBlazorApp.runtimeconfig.json
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\SickBlazorApp.dll
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\SickBlazorApp.pdb
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\PCANBasic.NET.dll
D:\Sick\SickBlazorApp\SickBlazorApp\bin\Release\net10.0\SocketCANSharp.dll
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\EmbeddedAttribute.cs
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\ValidatableTypeAttribute.cs
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.csproj.AssemblyReference.cache
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\rpswa.dswa.cache.json
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.GeneratedMSBuildEditorConfig.editorconfig
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.AssemblyInfoInputs.cache
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.AssemblyInfo.cs
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.csproj.CoreCompileInputs.cache
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.MvcApplicationPartsAssemblyInfo.cache
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.sourcelink.json
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\rjimswa.dswa.cache.json
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\rjsmrazor.dswa.cache.json
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\rjsmcshtml.dswa.cache.json
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\scopedcss\Components\Layout\MainLayout.razor.rz.scp.css
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\scopedcss\Components\Layout\ReconnectModal.razor.rz.scp.css
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\scopedcss\bundle\SickBlazorApp.styles.css
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\scopedcss\projectbundle\SickBlazorApp.bundle.scp.css
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\zk4xi70r8b-{0}-pzyjllkamw-pzyjllkamw.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\iftrd4n63y-{0}-bqjiyaj88i-bqjiyaj88i.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\b9v1qbrszs-{0}-c2jlpeoesf-c2jlpeoesf.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\xt1ydf62az-{0}-erw9l3u2r3-erw9l3u2r3.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\f2jlt9w81o-{0}-aexeepp0ev-aexeepp0ev.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\mqiozilooi-{0}-d7shbmvgxk-d7shbmvgxk.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\fj6kecqrrq-{0}-ausgxo2sd3-ausgxo2sd3.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\ytvbcpxtvv-{0}-k8d9w2qqmf-k8d9w2qqmf.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\45v1msuptr-{0}-cosvhxvwiu-cosvhxvwiu.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\gd5zqnn6m7-{0}-ub07r2b239-ub07r2b239.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\lvs1g0gm2f-{0}-fvhpjtyr6v-fvhpjtyr6v.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\1c9vewjk1j-{0}-b7pk76d08c-b7pk76d08c.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\c0ocz7eib6-{0}-fsbi9cje9m-fsbi9cje9m.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\aj2v8ehcsx-{0}-rzd6atqjts-rzd6atqjts.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\bca31my391-{0}-ee0r1s7dh0-ee0r1s7dh0.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\kbwgt9n4oo-{0}-dxx9fxp4il-dxx9fxp4il.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\1tzk64zize-{0}-jd9uben2k1-jd9uben2k1.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\rjgerfdlpa-{0}-khv3u5hwcm-khv3u5hwcm.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\5xrf8dv45a-{0}-r4e9w2rdcm-r4e9w2rdcm.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\lul785h464-{0}-lcd1t2u6c8-lcd1t2u6c8.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\wrpiw3xssz-{0}-c2oey78nd0-c2oey78nd0.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\61mrmy3rha-{0}-tdbxkamptv-tdbxkamptv.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\vp4av64p8c-{0}-j5mq2jizvt-j5mq2jizvt.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\rq0ofl2uny-{0}-06098lyss8-06098lyss8.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\x28sr319gb-{0}-nvvlpmu67g-nvvlpmu67g.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\im5xxmfkuj-{0}-s35ty4nyc5-s35ty4nyc5.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\ivfbl4jne1-{0}-pj5nd1wqec-pj5nd1wqec.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\mq91envm6n-{0}-46ein0sx1k-46ein0sx1k.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\yaw23x8sni-{0}-v0zj4ognzu-v0zj4ognzu.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\r5cn90t302-{0}-37tfw0ft22-37tfw0ft22.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\ja8tn6gcf8-{0}-hrwsygsryq-hrwsygsryq.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\8zaxi3brfj-{0}-pk9g2wxc8p-pk9g2wxc8p.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\cf1jy8mm8t-{0}-ft3s53vfgj-ft3s53vfgj.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\guii0gaef3-{0}-6cfz1n2cew-6cfz1n2cew.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\kifvqlfr3o-{0}-6pdc2jztkx-6pdc2jztkx.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\8bdcn07xmt-{0}-493y06b0oq-493y06b0oq.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\d9jin8c8h3-{0}-iovd86k7lj-iovd86k7lj.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\o9e5jhxaol-{0}-vr1egmr9el-vr1egmr9el.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\gtq9ysfdx1-{0}-kbrnm935zg-kbrnm935zg.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\vww9wnomiw-{0}-jj8uyg4cgr-jj8uyg4cgr.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\nmhdu8k6et-{0}-y7v9cxd14o-y7v9cxd14o.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\1ki1vioce8-{0}-notf2xhcfb-notf2xhcfb.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\fp1t9eikd3-{0}-h1s4sie4z3-h1s4sie4z3.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\wvlwqcbdxa-{0}-63fj8s7r0e-63fj8s7r0e.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\bbpti3e71l-{0}-0j3bgjxly4-0j3bgjxly4.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\an6avfx330-{0}-13ja33weya-13ja33weya.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\8hyy67ot57-{0}-wmp8iwak4q-wmp8iwak4q.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\ki07nybi96-{0}-2lgipwaf5j-2lgipwaf5j.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\6za0cps83j-{0}-d7fsxjk3yo-d7fsxjk3yo.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\compressed\1lxjy4o3fy-{0}-d7fsxjk3yo-d7fsxjk3yo.gz
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\staticwebassets.build.json
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\staticwebassets.build.json.cache
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\staticwebassets.development.json
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\staticwebassets.build.endpoints.json
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\swae.build.ex.cache
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\staticwebassets.upToDateCheck.txt
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlaz.A824BB92.Up2Date
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.dll
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\refint\SickBlazorApp.dll
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.pdb
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\SickBlazorApp.genruntimeconfig.cache
D:\Sick\SickBlazorApp\SickBlazorApp\obj\Release\net10.0\ref\SickBlazorApp.dll

Binary file not shown.

View File

@@ -0,0 +1 @@
4366fc366b5d0e63885275a474c27476b82e53f3f15dbfcbc904b6d508cbe736

Binary file not shown.

View File

@@ -0,0 +1 @@
{"documents":{"D:\\Sick\\SickBlazorApp\\*":"https://raw.githubusercontent.com/DTQuan1212/SickBlazorApp/f33bc766bf4bb156f443580f4e55e00ce8551db6/*"}}

View File

@@ -0,0 +1,9 @@
// <auto-generated/>
namespace Microsoft.Extensions.Validation.Embedded
{
[global::Microsoft.CodeAnalysis.EmbeddedAttribute]
[global::System.AttributeUsage(global::System.AttributeTargets.Class)]
internal sealed class ValidatableTypeAttribute : global::System.Attribute
{
}
}

Binary file not shown.

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")]

View File

@@ -0,0 +1,7 @@
// <auto-generated/>
namespace Microsoft.CodeAnalysis
{
internal sealed partial class EmbeddedAttribute : global::System.Attribute
{
}
}

View File

@@ -0,0 +1,58 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v10.0/linux-x64",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v10.0": {},
".NETCoreApp,Version=v10.0/linux-x64": {
"SickBlazorApp/1.0.0": {
"dependencies": {
"Peak.PCANBasic.NET": "4.10.1.968",
"SocketCANSharp": "0.13.0"
},
"runtime": {
"SickBlazorApp.dll": {}
}
},
"Peak.PCANBasic.NET/4.10.1.968": {
"runtime": {
"lib/netstandard2.0/PCANBasic.NET.dll": {
"assemblyVersion": "4.10.1.968",
"fileVersion": "4.10.1.968"
}
}
},
"SocketCANSharp/0.13.0": {
"runtime": {
"lib/netstandard2.0/SocketCANSharp.dll": {
"assemblyVersion": "0.13.0.0",
"fileVersion": "0.13.0.0"
}
}
}
}
},
"libraries": {
"SickBlazorApp/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Peak.PCANBasic.NET/4.10.1.968": {
"type": "package",
"serviceable": true,
"sha512": "sha512-sUxW8dhaIB+x7XFcpepad1DaD1N5a9l6qB2cyOgDCv7M+SmF87hOIK/EsT42Th92exA02PfCr6+ilnZ0XYeyrg==",
"path": "peak.pcanbasic.net/4.10.1.968",
"hashPath": "peak.pcanbasic.net.4.10.1.968.nupkg.sha512"
},
"SocketCANSharp/0.13.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-71mLS40IMpnyWeKf0zeWKGlgO6lkll36DdhKmsJ9z/SGnENcq/8XhOYFgLKJ8Wbs2a4WaFelmlz8cKBU82lWyA==",
"path": "socketcansharp/0.13.0",
"hashPath": "socketcansharp.0.13.0.nupkg.sha512"
}
}
}

View File

@@ -0,0 +1,21 @@
{
"runtimeOptions": {
"tfm": "net10.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "10.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "10.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
"Microsoft.AspNetCore.Components.Endpoints.NavigationManager.DisableThrowNavigationException": true
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -0,0 +1,16 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"CanBus": {
"Backend": "PCAN",
"PositionBaseCobId": "0x180",
"Channel": "PCAN_USBBUS1",
"PositionScale": 0.01403808593
}
}

View File

@@ -0,0 +1,63 @@
// Set up event handlers
const reconnectModal = document.getElementById("components-reconnect-modal");
reconnectModal.addEventListener("components-reconnect-state-changed", handleReconnectStateChanged);
const retryButton = document.getElementById("components-reconnect-button");
retryButton.addEventListener("click", retry);
const resumeButton = document.getElementById("components-resume-button");
resumeButton.addEventListener("click", resume);
function handleReconnectStateChanged(event) {
if (event.detail.state === "show") {
reconnectModal.showModal();
} else if (event.detail.state === "hide") {
reconnectModal.close();
} else if (event.detail.state === "failed") {
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
} else if (event.detail.state === "rejected") {
location.reload();
}
}
async function retry() {
document.removeEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
try {
// Reconnect will asynchronously return:
// - true to mean success
// - false to mean we reached the server, but it rejected the connection (e.g., unknown circuit ID)
// - exception to mean we didn't reach the server (this can be sync or async)
const successful = await Blazor.reconnect();
if (!successful) {
// We have been able to reach the server, but the circuit is no longer available.
// We'll reload the page so the user can continue using the app as quickly as possible.
const resumeSuccessful = await Blazor.resumeCircuit();
if (!resumeSuccessful) {
location.reload();
} else {
reconnectModal.close();
}
}
} catch (err) {
// We got an exception, server is currently unavailable
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
}
}
async function resume() {
try {
const successful = await Blazor.resumeCircuit();
if (!successful) {
location.reload();
}
} catch {
location.reload();
}
}
async function retryWhenDocumentBecomesVisible() {
if (document.visibilityState === "visible") {
await retry();
}
}

View File

@@ -0,0 +1,363 @@
/* /Components/Layout/MainLayout.razor.rz.scp.css */
.page[b-qmki05wm3r] {
position: relative;
display: flex;
flex-direction: column;
}
main[b-qmki05wm3r] {
flex: 1;
}
.sidebar[b-qmki05wm3r] {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row[b-qmki05wm3r] {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row[b-qmki05wm3r] a, .top-row[b-qmki05wm3r] .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row[b-qmki05wm3r] a:hover, .top-row[b-qmki05wm3r] .btn-link:hover {
text-decoration: underline;
}
.top-row[b-qmki05wm3r] a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row[b-qmki05wm3r] {
justify-content: space-between;
}
.top-row[b-qmki05wm3r] a, .top-row[b-qmki05wm3r] .btn-link {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page[b-qmki05wm3r] {
flex-direction: row;
}
.sidebar[b-qmki05wm3r] {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row[b-qmki05wm3r] {
position: sticky;
top: 0;
z-index: 1;
}
.top-row.auth[b-qmki05wm3r] a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.top-row[b-qmki05wm3r], article[b-qmki05wm3r] {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
#blazor-error-ui[b-qmki05wm3r] {
color-scheme: light only;
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
box-sizing: border-box;
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss[b-qmki05wm3r] {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
/* /Components/Layout/NavMenu.razor.rz.scp.css */
.navbar-toggler[b-1iw1jlyvzt] {
appearance: none;
cursor: pointer;
width: 3.5rem;
height: 2.5rem;
color: white;
position: absolute;
top: 0.5rem;
right: 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
}
.navbar-toggler:checked[b-1iw1jlyvzt] {
background-color: rgba(255, 255, 255, 0.5);
}
.top-row[b-1iw1jlyvzt] {
min-height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand[b-1iw1jlyvzt] {
font-size: 1.1rem;
}
.bi[b-1iw1jlyvzt] {
display: inline-block;
position: relative;
width: 1.25rem;
height: 1.25rem;
margin-right: 0.75rem;
top: -1px;
background-size: cover;
}
.bi-house-door-fill-nav-menu[b-1iw1jlyvzt] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}
.bi-plus-square-fill-nav-menu[b-1iw1jlyvzt] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}
.bi-list-nested-nav-menu[b-1iw1jlyvzt] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}
.nav-item[b-1iw1jlyvzt] {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type[b-1iw1jlyvzt] {
padding-top: 1rem;
}
.nav-item:last-of-type[b-1iw1jlyvzt] {
padding-bottom: 1rem;
}
.nav-item[b-1iw1jlyvzt] .nav-link {
color: #d7d7d7;
background: none;
border: none;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
width: 100%;
}
.nav-item[b-1iw1jlyvzt] a.active {
background-color: rgba(255,255,255,0.37);
color: white;
}
.nav-item[b-1iw1jlyvzt] .nav-link:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.nav-scrollable[b-1iw1jlyvzt] {
display: none;
}
.navbar-toggler:checked ~ .nav-scrollable[b-1iw1jlyvzt] {
display: block;
}
@media (min-width: 641px) {
.navbar-toggler[b-1iw1jlyvzt] {
display: none;
}
.nav-scrollable[b-1iw1jlyvzt] {
/* Never collapse the sidebar for wide screens */
display: block;
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-6mk5e94y2s],
.components-reconnect-repeated-attempt-visible[b-6mk5e94y2s],
.components-reconnect-failed-visible[b-6mk5e94y2s],
.components-pause-visible[b-6mk5e94y2s],
.components-resume-failed-visible[b-6mk5e94y2s],
.components-rejoining-animation[b-6mk5e94y2s] {
display: none;
}
#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-6mk5e94y2s],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-6mk5e94y2s],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-6mk5e94y2s],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-6mk5e94y2s],
#components-reconnect-modal.components-reconnect-retrying[b-6mk5e94y2s],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-6mk5e94y2s],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-6mk5e94y2s],
#components-reconnect-modal.components-reconnect-failed[b-6mk5e94y2s],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-6mk5e94y2s] {
display: block;
}
#components-reconnect-modal[b-6mk5e94y2s] {
background-color: white;
width: 20rem;
margin: 20vh auto;
padding: 2rem;
border: 0;
border-radius: 0.5rem;
box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
animation: components-reconnect-modal-fadeOutOpacity-b-6mk5e94y2s 0.5s both;
&[open]
{
animation: components-reconnect-modal-slideUp-b-6mk5e94y2s 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-6mk5e94y2s 0.5s ease-in-out 0.3s;
animation-fill-mode: both;
}
}
#components-reconnect-modal[b-6mk5e94y2s]::backdrop {
background-color: rgba(0, 0, 0, 0.4);
animation: components-reconnect-modal-fadeInOpacity-b-6mk5e94y2s 0.5s ease-in-out;
opacity: 1;
}
@keyframes components-reconnect-modal-slideUp-b-6mk5e94y2s {
0% {
transform: translateY(30px) scale(0.95);
}
100% {
transform: translateY(0);
}
}
@keyframes components-reconnect-modal-fadeInOpacity-b-6mk5e94y2s {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes components-reconnect-modal-fadeOutOpacity-b-6mk5e94y2s {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.components-reconnect-container[b-6mk5e94y2s] {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
}
#components-reconnect-modal p[b-6mk5e94y2s] {
margin: 0;
text-align: center;
}
#components-reconnect-modal button[b-6mk5e94y2s] {
border: 0;
background-color: #6b9ed2;
color: white;
padding: 4px 24px;
border-radius: 4px;
}
#components-reconnect-modal button:hover[b-6mk5e94y2s] {
background-color: #3b6ea2;
}
#components-reconnect-modal button:active[b-6mk5e94y2s] {
background-color: #6b9ed2;
}
.components-rejoining-animation[b-6mk5e94y2s] {
position: relative;
width: 80px;
height: 80px;
}
.components-rejoining-animation div[b-6mk5e94y2s] {
position: absolute;
border: 3px solid #0087ff;
opacity: 1;
border-radius: 50%;
animation: components-rejoining-animation-b-6mk5e94y2s 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
}
.components-rejoining-animation div:nth-child(2)[b-6mk5e94y2s] {
animation-delay: -0.5s;
}
@keyframes components-rejoining-animation-b-6mk5e94y2s {
0% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
4.9% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
5% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 1;
}
100% {
top: 0px;
left: 0px;
width: 80px;
height: 80px;
opacity: 0;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,343 @@
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
a, .btn-link {
color: #006bb7;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}
.content {
padding-top: 1.1rem;
}
h1:focus {
outline: none;
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid #26b050;
}
.invalid {
outline: 1px solid #e50000;
}
.validation-message {
color: #e50000;
}
.blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
padding: 1rem 1rem 1rem 3.7rem;
color: white;
}
.blazor-error-boundary::after {
content: "An error has occurred."
}
.darker-border-checkbox.form-check-input {
border-color: #929292;
}
.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {
color: var(--bs-secondary-color);
text-align: end;
}
.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
text-align: start;
}
.nav-icon {
font-size: 1.1rem;
line-height: 1;
display: inline-flex;
align-items: center;
}
/* ================================
Encoder Monitor Custom Style
================================ */
.encoder-container {
padding: 24px;
background: #f4f6fb;
min-height: 100vh;
}
.encoder-card {
background: #ffffff;
border-radius: 12px;
padding: 20px;
box-shadow: 0 10px 25px rgba(0,0,0,0.08);
}
.encoder-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.encoder-title {
font-size: 26px;
font-weight: 600;
color: #1f2937;
}
/* ===== Buttons ===== */
.encoder-actions button {
padding: 8px 18px;
border-radius: 8px;
border: none;
font-weight: 600;
margin-left: 8px;
cursor: pointer;
transition: 0.2s ease;
}
.btn-start {
background: #22c55e;
color: #fff;
}
.btn-start:hover {
background: #16a34a;
}
.btn-stop {
background: #ef4444;
color: #fff;
}
.btn-stop:hover {
background: #dc2626;
}
/* ===== Table ===== */
.encoder-table {
width: 100%;
border-collapse: collapse;
margin-top: 12px;
}
.encoder-table thead {
background: #1e3a8a;
color: #fff;
}
.encoder-table th,
.encoder-table td {
padding: 12px 14px;
text-align: center;
}
.encoder-table tbody tr {
border-bottom: 1px solid #e5e7eb;
}
.encoder-table tbody tr:hover {
background: #f1f5f9;
}
.encoder-id {
font-weight: 600;
color: #2563eb;
}
.encoder-raw {
font-family: monospace;
color: #111827;
}
.encoder-pos {
font-weight: 600;
color: #16a34a;
}
.encoder-time {
font-size: 14px;
color: #6b7280;
}
/* ===== Status ===== */
.encoder-status {
margin-top: 10px;
font-size: 14px;
color: #374151;
}
.encoder-data {
font-family: Consolas, monospace;
color: #2563eb;
letter-spacing: 1px;
}
.encoder-id {
font-weight: 600;
color: #1e40af;
}
.encoder-pos {
font-weight: bold;
color: #059669;
}
.state-op {
color: #0f5132;
background: #d1e7dd;
}
.state-preop {
color: #664d03;
background: #fff3cd;
}
.state-stop {
color: #842029;
background: #f8d7da;
}
.state-timeout {
color: #842029;
background: #f5c2c7;
}
.state-unknown {
color: #41464b;
background: #e2e3e5;
}
/* ===== Bitrate group ===== */
.bitrate-group {
display: flex;
align-items: center;
gap: 8px;
background: #f8f9fb;
border: 1px solid #d0d7e2;
border-radius: 8px;
padding: 6px 10px;
}
/* Label */
.bitrate-label {
font-size: 13px;
font-weight: 600;
color: #3b4a66;
margin-right: 4px;
}
/* Select */
.bitrate-select {
appearance: none;
padding: 6px 28px 6px 10px;
font-size: 13px;
border-radius: 6px;
border: 1px solid #b8c2d3;
background-color: #ffffff;
color: #1f2a44;
cursor: pointer;
background-image: url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23556688' stroke-width='1.5' fill='none'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 8px center;
}
.bitrate-select:hover {
border-color: #4f73ff;
}
.bitrate-select:focus {
outline: none;
border-color: #4f73ff;
box-shadow: 0 0 0 2px rgba(79,115,255,0.15);
}
/* Apply button */
.btn-apply {
padding: 6px 14px;
border-radius: 6px;
border: none;
background: #2ecc71;
color: white;
font-weight: 600;
font-size: 13px;
cursor: pointer;
transition: background 0.2s ease;
}
.btn-apply:hover {
background: #27ae60;
}
.btn {
position: relative;
padding: 10px 18px;
border-radius: 8px;
border: none;
font-weight: 600;
cursor: pointer;
transition: transform 0.08s ease, box-shadow 0.08s ease, opacity 0.15s;
}
.btn:active {
transform: scale(0.96);
}
.btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
/* COLORS */
.btn-start {
background: #16a34a;
color: white;
}
.btn-stop {
background: #dc2626;
color: white;
}
.btn-apply {
background: #2563eb;
color: white;
}
/* HOVER */
.btn:hover:not(:disabled) {
box-shadow: 0 6px 16px rgba(0,0,0,0.2);
}
/* LOADING SPINNER */
.btn.loading {
pointer-events: none;
}
.btn.loading::after {
content: "";
width: 16px;
height: 16px;
border: 2px solid rgba(255,255,255,0.5);
border-top-color: white;
border-radius: 50%;
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to {
transform: translateY(-50%) rotate(360deg);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More