Initial Slop

This commit is contained in:
2026-06-05 10:24:33 -04:00
commit 3c33145c7b
273 changed files with 101594 additions and 0 deletions
+270
View File
@@ -0,0 +1,270 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
project.fragment.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
publish_release/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
**/.DS_Store
**/.vs/
.DS_Store
publish_release/
+16
View File
@@ -0,0 +1,16 @@
Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Web", "Web\Web.csproj", "{091C250E-B2B3-40BB-B2FF-E48B2F3BAA8E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{091C250E-B2B3-40BB-B2FF-E48B2F3BAA8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{091C250E-B2B3-40BB-B2FF-E48B2F3BAA8E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{091C250E-B2B3-40BB-B2FF-E48B2F3BAA8E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{091C250E-B2B3-40BB-B2FF-E48B2F3BAA8E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
+7
View File
@@ -0,0 +1,7 @@
@using Web.Pages
<Router AppAssembly="@typeof(App).Assembly" NotFoundPage="typeof(NotFound)">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
<FocusOnNavigate RouteData="@routeData" Selector="h1"/>
</Found>
</Router>
+16
View File
@@ -0,0 +1,16 @@
@inherits LayoutComponentBase
<div class="page">
<div class="sidebar">
<NavMenu/>
</div>
<main>
<div class="top-row px-4">
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a>
</div>
<article class="content px-4">
@Body
</article>
</main>
</div>
@@ -0,0 +1,77 @@
.page {
position: relative;
display: flex;
flex-direction: column;
}
main {
flex: 1;
}
.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
text-decoration: underline;
}
.top-row ::deep a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row {
justify-content: space-between;
}
.top-row ::deep a, .top-row ::deep .btn-link {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page {
flex-direction: row;
}
.sidebar {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row {
position: sticky;
top: 0;
z-index: 1;
}
.top-row.auth ::deep a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.top-row, article {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
+45
View File
@@ -0,0 +1,45 @@
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">Web</a>
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</div>
<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
<nav class="nav flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="weather">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="keyboard">
<span class="bi bi-keyboard-nav-menu" aria-hidden="true"></span> Keyboard
</NavLink>
</div>
</nav>
</div>
@code {
private bool collapseNavMenu = true;
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
}
}
+87
View File
@@ -0,0 +1,87 @@
.navbar-toggler {
background-color: rgba(255, 255, 255, 0.1);
}
.top-row {
min-height: 3.5rem;
background-color: rgba(0, 0, 0, 0.4);
}
.navbar-brand {
font-size: 1.1rem;
}
.bi {
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 {
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 {
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-keyboard-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-keyboard' viewBox='0 0 16 16'%3E%3Cpath d='M14 5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h12zM2 4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H2z'/%3E%3Cpath d='M4 8a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1zm3 0a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1zm3 0a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1zm-6 2a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1zm3 0a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1zm3 0a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1zm-4.5 1a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1z'/%3E%3C/svg%3E");
}
.bi-list-nested-nav-menu {
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 {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type {
padding-top: 1rem;
}
.nav-item:last-of-type {
padding-bottom: 1rem;
}
.nav-item ::deep a {
color: #d7d7d7;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
}
.nav-item ::deep a.active {
background-color: rgba(255, 255, 255, 0.37);
color: white;
}
.nav-item ::deep a:hover {
background-color: rgba(255, 255, 255, 0.1);
color: white;
}
@media (min-width: 641px) {
.navbar-toggler {
display: none;
}
.collapse {
/* Never collapse the sidebar for wide screens */
display: block;
}
.nav-scrollable {
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}
+19
View File
@@ -0,0 +1,19 @@
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount;
private void IncrementCount()
{
currentCount++;
}
}
+7
View File
@@ -0,0 +1,7 @@
@page "/"
<PageTitle>Home</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
+404
View File
@@ -0,0 +1,404 @@
@page "/keyboard"
<PageTitle>Keyboard</PageTitle>
<div class="keyboard-container" @onkeydown="HandleKeyDown" tabindex="0" @ref="containerRef">
<div class="keyboard-wrapper">
<div class="kb-row">
@foreach (var k in Keys.Take(6))
{
<div class="kb-key @(k.OnCooldown ? "on-cd" : "")" @onclick="() => ActivateKey(k)" title="@k.Tooltip">
<span class="key-label">@k.Label</span>
@if (k.SkillName != null)
{
<span class="skill-name">@k.SkillName</span>
}
@if (k.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - k.CooldownFraction))"/>
</svg>
<span class="cd-text">@k.RemainingSeconds</span>
</div>
}
</div>
}
</div>
<div class="kb-row kb-offset-1">
@foreach (var k in Keys.Skip(6).Take(5))
{
<div class="kb-key @(k.OnCooldown ? "on-cd" : "")" @onclick="() => ActivateKey(k)" title="@k.Tooltip">
<span class="key-label">@k.Label</span>
@if (k.SkillName != null)
{
<span class="skill-name">@k.SkillName</span>
}
@if (k.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - k.CooldownFraction))"/>
</svg>
<span class="cd-text">@k.RemainingSeconds</span>
</div>
}
</div>
}
</div>
<div class="kb-row kb-offset-2">
@foreach (var k in Keys.Skip(11).Take(5))
{
<div class="kb-key @(k.OnCooldown ? "on-cd" : "")" @onclick="() => ActivateKey(k)" title="@k.Tooltip">
<span class="key-label">@k.Label</span>
@if (k.SkillName != null)
{
<span class="skill-name">@k.SkillName</span>
}
@if (k.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - k.CooldownFraction))"/>
</svg>
<span class="cd-text">@k.RemainingSeconds</span>
</div>
}
</div>
}
</div>
<div class="kb-row kb-offset-1">
@foreach (var k in Keys.Skip(16).Take(5))
{
<div class="kb-key @(k.OnCooldown ? "on-cd" : "")" @onclick="() => ActivateKey(k)" title="@k.Tooltip">
<span class="key-label">@k.Label</span>
@if (k.SkillName != null)
{
<span class="skill-name">@k.SkillName</span>
}
@if (k.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - k.CooldownFraction))"/>
</svg>
<span class="cd-text">@k.RemainingSeconds</span>
</div>
}
</div>
}
</div>
<div class="kb-row kb-space-row">
<div class="kb-key kb-space @(spaceKey.OnCooldown ? "on-cd" : "")" @onclick="() => ActivateKey(spaceKey)"
title="@spaceKey.Tooltip">
<span class="key-label">@spaceKey.Label</span>
@if (spaceKey.SkillName != null)
{
<span class="skill-name">@spaceKey.SkillName</span>
}
@if (spaceKey.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - spaceKey.CooldownFraction))"/>
</svg>
<span class="cd-text">@spaceKey.RemainingSeconds</span>
</div>
}
</div>
</div>
<div class="kb-divider">Shift + Key</div>
<div class="kb-row">
@foreach (var k in ShiftKeys.Take(6))
{
<div class="kb-key kb-shift @(k.OnCooldown ? "on-cd" : "")" @onclick="() => ActivateKey(k)"
title="@k.Tooltip">
<span class="key-label">@k.Label</span>
@if (k.SkillName != null)
{
<span class="skill-name">@k.SkillName</span>
}
@if (k.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - k.CooldownFraction))"/>
</svg>
<span class="cd-text">@k.RemainingSeconds</span>
</div>
}
</div>
}
</div>
<div class="kb-row kb-offset-1">
@foreach (var k in ShiftKeys.Skip(6).Take(5))
{
<div class="kb-key kb-shift @(k.OnCooldown ? "on-cd" : "")" @onclick="() => ActivateKey(k)"
title="@k.Tooltip">
<span class="key-label">@k.Label</span>
@if (k.SkillName != null)
{
<span class="skill-name">@k.SkillName</span>
}
@if (k.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - k.CooldownFraction))"/>
</svg>
<span class="cd-text">@k.RemainingSeconds</span>
</div>
}
</div>
}
</div>
<div class="kb-row kb-offset-2">
@foreach (var k in ShiftKeys.Skip(11).Take(5))
{
<div class="kb-key kb-shift @(k.OnCooldown ? "on-cd" : "")" @onclick="() => ActivateKey(k)"
title="@k.Tooltip">
<span class="key-label">@k.Label</span>
@if (k.SkillName != null)
{
<span class="skill-name">@k.SkillName</span>
}
@if (k.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - k.CooldownFraction))"/>
</svg>
<span class="cd-text">@k.RemainingSeconds</span>
</div>
}
</div>
}
</div>
<div class="kb-row kb-offset-1">
@foreach (var k in ShiftKeys.Skip(16).Take(5))
{
<div class="kb-key kb-shift @(k.OnCooldown ? "on-cd" : "")" @onclick="() => ActivateKey(k)"
title="@k.Tooltip">
<span class="key-label">@k.Label</span>
@if (k.SkillName != null)
{
<span class="skill-name">@k.SkillName</span>
}
@if (k.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - k.CooldownFraction))"/>
</svg>
<span class="cd-text">@k.RemainingSeconds</span>
</div>
}
</div>
}
</div>
<div class="kb-row kb-space-row">
<div class="kb-key kb-space kb-shift @(shiftSpaceKey.OnCooldown ? "on-cd" : "")"
@onclick="() => ActivateKey(shiftSpaceKey)" title="@shiftSpaceKey.Tooltip">
<span class="key-label">@shiftSpaceKey.Label</span>
@if (shiftSpaceKey.SkillName != null)
{
<span class="skill-name">@shiftSpaceKey.SkillName</span>
}
@if (shiftSpaceKey.OnCooldown)
{
<div class="cd-overlay">
<svg viewBox="0 0 100 100" class="cd-svg">
<circle cx="50" cy="50" r="45" class="cd-bg"/>
<circle cx="50" cy="50" r="45" class="cd-progress"
stroke-dasharray="282.74"
stroke-dashoffset="@(282.74 * (1 - shiftSpaceKey.CooldownFraction))"/>
</svg>
<span class="cd-text">@shiftSpaceKey.RemainingSeconds</span>
</div>
}
</div>
</div>
</div>
</div>
@code {
private ElementReference containerRef;
private List<KeyData> Keys { get; set; } = new();
private List<KeyData> ShiftKeys { get; set; } = new();
private KeyData spaceKey = null!;
private KeyData shiftSpaceKey = null!;
public class KeyData
{
public string Id { get; set; } = "";
public string Label { get; set; } = "";
public string? SkillName { get; set; }
public string? Character { get; set; }
public double CooldownDuration { get; set; }
public double Remaining { get; set; }
public bool OnCooldown => Remaining > 0;
public double RemainingSeconds => Math.Ceiling(Remaining);
public double CooldownFraction => CooldownDuration > 0 ? Math.Min(1, Remaining / CooldownDuration) : 0;
public void Tick(double seconds)
{
if (Remaining > 0)
Remaining = Math.Max(0, Remaining - seconds);
}
public string Tooltip
{
get
{
var parts = new List<string>();
if (Character != null) parts.Add(Character);
if (SkillName != null) parts.Add(SkillName);
if (CooldownDuration > 0) parts.Add($"CD: {CooldownDuration}s");
return parts.Count > 0 ? string.Join(" - ", parts) : Label;
}
}
}
protected override void OnInitialized()
{
Keys = new List<KeyData>
{
new() { Id = "1", Label = "1", SkillName = "Aura of Solace", Character = "Xavian", CooldownDuration = 3 },
new() { Id = "2", Label = "2" },
new() { Id = "3", Label = "3" },
new() { Id = "4", Label = "4" },
new() { Id = "5", Label = "5" },
new() { Id = "6", Label = "6" },
new() { Id = "q", Label = "Q", SkillName = "Shinning Halo", Character = "Xavian", CooldownDuration = 30 },
new() { Id = "w", Label = "W", SkillName = "Brilliant Flash", Character = "Xavian", CooldownDuration = 0 },
new() { Id = "e", Label = "E", SkillName = "Move Forward" },
new() { Id = "r", Label = "R", SkillName = "Sun Strike", Character = "Xavian", CooldownDuration = 0 },
new() { Id = "t", Label = "T", SkillName = "Sky Crash", Character = "Xavian", CooldownDuration = 60 },
new() { Id = "a", Label = "A", SkillName = "Solar Shield", Character = "Xavian", CooldownDuration = 15 },
new() { Id = "s", Label = "S", SkillName = "Move Left" },
new() { Id = "d", Label = "D", SkillName = "Move Back" },
new() { Id = "f", Label = "F", SkillName = "Move Right" },
new() { Id = "g", Label = "G", SkillName = "Blinding Slash", Character = "Xavian", CooldownDuration = 6 },
new() { Id = "z", Label = "Z" },
new() { Id = "x", Label = "X" },
new() { Id = "c", Label = "C" },
new() { Id = "v", Label = "V", SkillName = "Interupt", Character = "Xavian", CooldownDuration = 12 },
new() { Id = "b", Label = "B", SkillName = "Taunt", Character = "Xavian", CooldownDuration = 8 }
};
spaceKey = new KeyData { Id = "space", Label = "Space", SkillName = "Jump", CooldownDuration = 0.5 };
ShiftKeys = new List<KeyData>
{
new() { Id = "shift-1", Label = "Shift+1" },
new() { Id = "shift-2", Label = "Shift+2" },
new() { Id = "shift-3", Label = "Shift+3" },
new() { Id = "shift-4", Label = "Shift+4" },
new() { Id = "shift-5", Label = "Shift+5" },
new() { Id = "shift-6", Label = "Shift+6" },
new() { Id = "shift-q", Label = "Shift+Q", SkillName = "Decree of the Sun", Character = "Xavian", CooldownDuration = 0 },
new() { Id = "shift-w", Label = "Shift+W" },
new() { Id = "shift-e", Label = "Shift+E" },
new() { Id = "shift-r", Label = "Shift+R", SkillName = "Omnistrike", Character = "Xavian", CooldownDuration = 18 },
new() { Id = "shift-t", Label = "Shift+T" },
new() { Id = "shift-a", Label = "Shift+A" },
new() { Id = "shift-s", Label = "Shift+S" },
new() { Id = "shift-d", Label = "Shift+D" },
new() { Id = "shift-f", Label = "Shift+F" },
new() { Id = "shift-g", Label = "Shift+G", SkillName = "Solar Blades", Character = "Xavian", CooldownDuration = 9 },
new() { Id = "shift-z", Label = "Shift+Z" },
new() { Id = "shift-x", Label = "Shift+X" },
new() { Id = "shift-c", Label = "Shift+C" },
new() { Id = "shift-v", Label = "Shift+V" },
new() { Id = "shift-b", Label = "Shift+B" }
};
shiftSpaceKey = new KeyData { Id = "shift-space", Label = "Shift+Space" };
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await containerRef.FocusAsync();
}
}
private void HandleKeyDown(KeyboardEventArgs e)
{
var isShift = e.ShiftKey;
var key = e.Key.ToLower();
var allKeys = new List<KeyData>();
allKeys.AddRange(Keys);
allKeys.Add(spaceKey);
allKeys.AddRange(ShiftKeys);
allKeys.Add(shiftSpaceKey);
KeyData? target;
if (isShift)
{
if (key == "shift") return;
var lookup = "shift-" + (key == " " ? "space" : key);
target = allKeys.FirstOrDefault(k => k.Id == lookup);
}
else
{
var lookup = key == " " ? "space" : key;
target = allKeys.FirstOrDefault(k => k.Id == lookup);
}
if (target != null)
{
ActivateKey(target);
}
}
private void ActivateKey(KeyData key)
{
if (key.OnCooldown) return;
var duration = key.CooldownDuration > 0 ? key.CooldownDuration : 0.5;
key.Remaining = duration;
var allKeys = new List<KeyData>();
allKeys.AddRange(Keys);
allKeys.Add(spaceKey);
allKeys.AddRange(ShiftKeys);
allKeys.Add(shiftSpaceKey);
foreach (var k in allKeys)
{
k.Tick(1.5);
}
}
}
+133
View File
@@ -0,0 +1,133 @@
.keyboard-container {
outline: none;
padding: 20px;
user-select: none;
}
.keyboard-wrapper {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.kb-row {
display: flex;
gap: 6px;
}
.kb-offset-1 {
margin-left: 30px;
}
.kb-offset-2 {
margin-left: 15px;
}
.kb-space-row {
margin-left: 15px;
}
.kb-key {
position: relative;
width: 80px;
height: 80px;
border: 2px solid #555;
border-radius: 8px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
background: #2a2a2a;
color: #fff;
font-family: 'Segoe UI', sans-serif;
transition: background 0.15s, transform 0.1s;
overflow: hidden;
}
.kb-key:hover {
background: #3a3a3a;
transform: translateY(-2px);
}
.kb-key:active {
transform: translateY(0);
}
.kb-key.on-cd {
pointer-events: none;
opacity: 0.7;
}
.kb-space {
width: 520px;
height: 80px;
}
.kb-shift {
opacity: 0.85;
}
.key-label {
font-size: 18px;
font-weight: 700;
z-index: 1;
}
.skill-name {
font-size: 10px;
opacity: 0.8;
text-align: center;
line-height: 1.2;
z-index: 1;
}
.cd-overlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
}
.cd-svg {
width: 100%;
height: 100%;
}
.cd-bg {
fill: none;
stroke: #333;
stroke-width: 8;
}
.cd-progress {
fill: none;
stroke: #ff4444;
stroke-width: 8;
stroke-linecap: round;
transform: rotate(-90deg);
transform-origin: center;
transition: stroke-dashoffset 0.1s linear;
}
.cd-text {
position: absolute;
font-size: 24px;
font-weight: 700;
color: #ff6666;
text-shadow: 0 0 4px rgba(0, 0, 0, 0.8);
}
.kb-divider {
color: #888;
font-size: 14px;
text-transform: uppercase;
letter-spacing: 2px;
margin: 16px 0 8px;
padding-top: 12px;
border-top: 1px solid #444;
width: 80%;
text-align: center;
}
+5
View File
@@ -0,0 +1,5 @@
@page "/not-found"
@layout MainLayout
<h3>Not Found</h3>
<p>Sorry, the content you are looking for does not exist.</p>
+60
View File
@@ -0,0 +1,60 @@
@page "/weather"
@inject HttpClient Http
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (forecasts == null)
{
<p>
<em>Loading...</em>
</p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th aria-label="Temperature in Celsius">Temp. (C)</th>
<th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json");
}
public class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}
+11
View File
@@ -0,0 +1,11 @@
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Web;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
await builder.Build().RunAsync();
@@ -0,0 +1,25 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "http://localhost:5003",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "https://localhost:7277;http://localhost:5003",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
+15
View File
@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<OverrideHtmlAssetPlaceholders>true</OverrideHtmlAssetPlaceholders>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.8"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.8" PrivateAssets="all"/>
</ItemGroup>
</Project>
+10
View File
@@ -0,0 +1,10 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using Web
@using Web.Layout
+115
View File
@@ -0,0 +1,115 @@
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
h1:focus {
outline: none;
}
a, .btn-link {
color: #0071c1;
}
.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;
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid #26b050;
}
.invalid {
outline: 1px solid red;
}
.validation-message {
color: red;
}
#blazor-error-ui {
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 {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
.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."
}
.loading-progress {
position: absolute;
display: block;
width: 8rem;
height: 8rem;
inset: 20vh 0 auto 0;
margin: 0 auto 0 auto;
}
.loading-progress circle {
fill: none;
stroke: #e0e0e0;
stroke-width: 0.6rem;
transform-origin: 50% 50%;
transform: rotate(-90deg);
}
.loading-progress circle:last-child {
stroke: #1b6ec2;
stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
transition: stroke-dasharray 0.05s ease-in-out;
}
.loading-progress-text {
position: absolute;
text-align: center;
font-weight: bold;
inset: calc(20vh + 3.25rem) 0 auto 0.2rem;
}
.loading-progress-text:after {
content: var(--blazor-load-percentage-text, "Loading");
}
code {
color: #c02d76;
}
.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;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

+34
View File
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>Web</title>
<base href="/"/>
<link id="webassembly" rel="preload"/>
<link href="lib/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"/>
<link href="css/app.css" rel="stylesheet"/>
<link href="favicon.png" rel="icon" type="image/png"/>
<link href="Web.styles.css" rel="stylesheet"/>
<script type="importmap"></script>
</head>
<body>
<div id="app">
<svg class="loading-progress">
<circle cx="50%" cy="50%" r="40%"/>
<circle cx="50%" cy="50%" r="40%"/>
</svg>
<div class="loading-progress-text"></div>
</div>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a class="reload" href=".">Reload</a>
<span class="dismiss">🗙</span>
</div>
<script src="_framework/blazor.webassembly#[.{fingerprint}].js"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,609 @@
/*!
* Bootstrap Reboot v5.3.3 (https://getbootstrap.com/)
* Copyright 2011-2024 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-left: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
}
a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: var(--bs-font-monospace);
font-size: 1em;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: left;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: left;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
::file-selector-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,608 @@
/*!
* Bootstrap Reboot v5.3.3 (https://getbootstrap.com/)
* Copyright 2011-2024 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-right: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-right: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
}
a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: var(--bs-font-monospace);
font-size: 1em;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: right;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: right;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: right;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
::file-selector-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,27 @@
[
{
"date": "2022-01-06",
"temperatureC": 1,
"summary": "Freezing"
},
{
"date": "2022-01-07",
"temperatureC": 14,
"summary": "Bracing"
},
{
"date": "2022-01-08",
"temperatureC": -13,
"summary": "Freezing"
},
{
"date": "2022-01-09",
"temperatureC": -16,
"summary": "Balmy"
},
{
"date": "2022-01-10",
"temperatureC": -2,
"summary": "Chilly"
}
]
View File
+4
View File
@@ -0,0 +1,4 @@
{
"alwaysUpdateLinks": true,
"promptDelete": false
}
+3
View File
@@ -0,0 +1,3 @@
{
"theme": "obsidian"
}
+6
View File
@@ -0,0 +1,6 @@
[
"obsidian-note-autocreator",
"custom-font-loader",
"calendar",
"code-styler"
]
+33
View File
@@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"footnotes": false,
"properties": false,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"bases": true,
"webviewer": false
}
Binary file not shown.
+22
View File
@@ -0,0 +1,22 @@
{
"collapse-filter": true,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": true,
"colorGroups": [],
"collapse-display": true,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1,
"close": true
}
+10
View File
@@ -0,0 +1,10 @@
{
"shouldConfirmBeforeCreate": true,
"weekStart": "locale",
"wordsPerDot": 250,
"showWeeklyNote": false,
"weeklyNoteFormat": "",
"weeklyNoteTemplate": "",
"weeklyNoteFolder": "",
"localeOverride": "system-default"
}
File diff suppressed because it is too large Load Diff
+10
View File
@@ -0,0 +1,10 @@
{
"id": "calendar",
"name": "Calendar",
"description": "Calendar view of your daily notes",
"version": "1.5.10",
"author": "Liam Cain",
"authorUrl": "https://github.com/liamcain/",
"isDesktopOnly": false,
"minAppVersion": "0.9.11"
}
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "code-styler",
"name": "Code Styler",
"version": "1.1.7",
"minAppVersion": "0.15.0",
"description": "Style and customize codeblocks and inline code in both editing mode and reading mode.",
"author": "Mayuran Visakan",
"authorUrl": "https://github.com/mayurankv",
"fundingUrl": "https://www.buymeacoffee.com/mayurankv2",
"isDesktopOnly": false
}
@@ -0,0 +1 @@
{}
File diff suppressed because it is too large Load Diff
+7
View File
@@ -0,0 +1,7 @@
{
"font_folder": ".obsidian/fonts/",
"font": "JetBrainsMono-Regular.ttf",
"force_mode": false,
"custom_css_mode": false,
"custom_css": ""
}
File diff suppressed because one or more lines are too long
+357
View File
@@ -0,0 +1,357 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => FontPlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
var DEFAULT_SETTINGS = {
font_folder: "",
font: "None",
force_mode: false,
custom_css_mode: false,
custom_css: ""
};
function get_default_css(font_family_name, css_class = ":root *") {
return `${css_class} {
--font-default: '${font_family_name}';
--default-font: '${font_family_name}';
--font-family-editor: '${font_family_name}';
--font-monospace-default: '${font_family_name}';
--font-interface-override: '${font_family_name}';
--font-text-override: '${font_family_name}';
--font-monospace-override: '${font_family_name}';
}
`;
}
function get_custom_css(font_family_name, css_class = ":root *") {
return `${css_class} * {
font-family: '${font_family_name}' !important;
}`;
}
function arrayBufferToBase64(buffer) {
let binary = "";
const bytes = new Uint8Array(buffer);
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
function applyCss(css, css_id, appendMode = false) {
const existingStyle = document.getElementById(css_id);
if (existingStyle && appendMode) {
existingStyle.innerHTML += css;
} else {
const style = document.createElement("style");
style.innerHTML = css;
document.head.appendChild(style);
if (existingStyle) {
existingStyle.remove();
}
style.id = css_id;
}
}
var FontPlugin = class extends import_obsidian.Plugin {
constructor() {
super(...arguments);
this.config_dir = this.app.vault.configDir;
this.plugin_folder_path = `${this.config_dir}/plugins/custom-font-loader`;
}
async load_plugin() {
await this.loadSettings();
try {
const font_file_name = this.settings.font;
if (font_file_name && font_file_name.toLowerCase() != "none") {
if (font_file_name != "all") {
await this.process_and_load_font(font_file_name, false);
} else {
applyCss("", "custom_font_base64");
const files = await this.app.vault.adapter.list(
this.settings.font_folder
);
for (const file of files.files) {
const file_name = file.replace(
this.settings.font_folder,
""
);
await this.process_and_load_font(file_name, true);
}
}
} else {
applyCss("", "custom_font_base64");
applyCss("", "custom_font_general");
}
} catch (error) {
new import_obsidian.Notice(error);
}
}
async process_and_load_font(font_file_name, load_all_fonts) {
console.log("loading %s", font_file_name);
const css_font_path = `${this.plugin_folder_path}/${font_file_name.toLowerCase().replace(".", "_")}.css`;
if (!await this.app.vault.adapter.exists(css_font_path)) {
await this.convert_font_to_css(font_file_name, css_font_path);
} else {
await this.load_font(css_font_path, load_all_fonts);
await this.load_css(font_file_name);
}
}
async load_font(css_font_path, appendMode) {
const content = await this.app.vault.adapter.read(css_font_path);
applyCss(content, "custom_font_base64", appendMode);
}
async load_css(font_file_name) {
let css_string = "";
const font_family_name = font_file_name.split(".")[0].toLowerCase();
if (this.settings.custom_css_mode) {
css_string = this.settings.custom_css;
} else {
css_string = get_default_css(font_family_name);
}
if (this.settings.force_mode)
css_string += `
* {
font-family: '${font_family_name}' !important;
}
`;
applyCss(css_string, "custom_font_general");
}
async convert_font_to_css(font_file_name, css_font_path) {
new import_obsidian.Notice("Processing Font files");
const file = `${this.settings.font_folder}/${font_file_name}`;
const arrayBuffer = await this.app.vault.adapter.readBinary(file);
const base64 = arrayBufferToBase64(arrayBuffer);
const font_family_name = font_file_name.split(".")[0].toLowerCase();
const font_extension_name = font_file_name.split(".")[1].toLowerCase();
let css_type = "";
switch (font_extension_name) {
case "woff":
css_type = "font/woff";
break;
case "ttf":
css_type = "font/truetype";
break;
case "woff2":
css_type = "font/woff2";
break;
case "otf":
css_type = "font/opentype";
break;
default:
css_type = "font";
}
const base64_css = `@font-face{
font-family: '${font_family_name}';
src: url(data:${css_type};base64,${base64});
}`;
this.app.vault.adapter.write(css_font_path, base64_css);
console.log("saved font %s into %s", font_family_name, css_font_path);
console.log("Font CSS Saved into %s", css_font_path);
await this.load_plugin();
}
async onload() {
this.load_plugin();
this.addSettingTab(new FontSettingTab(this.app, this));
}
async onunload() {
applyCss("", "custom_font_base64");
applyCss("", "custom_font_general");
}
async loadSettings() {
this.settings = Object.assign(
{},
DEFAULT_SETTINGS,
await this.loadData()
);
}
async saveSettings() {
await this.saveData(this.settings);
}
};
var FontSettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
async display() {
const { containerEl } = this;
containerEl.empty();
const infoContainer = containerEl.createDiv();
infoContainer.setText(
"In Order to set the font, copy your font into fonts directory that you set"
);
new import_obsidian.Setting(containerEl).setName("Fonts Folder").setDesc("Folder to look for your custom fonts").addText((text) => {
text.onChange(async (value) => {
this.plugin.settings.font_folder = value;
await this.plugin.saveSettings();
await this.plugin.loadSettings();
});
if (this.plugin.settings.font_folder.trim() == "") {
this.plugin.settings.font_folder = `${this.app.vault.configDir}/fonts`;
}
if (!this.plugin.settings.font_folder.endsWith("/"))
this.plugin.settings.font_folder = this.plugin.settings.font_folder + "/";
text.setValue(this.plugin.settings.font_folder);
});
const font_folder_path = this.plugin.settings.font_folder;
const options = [{ name: "none", value: "None" }];
try {
if (!await this.app.vault.adapter.exists(font_folder_path)) {
await this.app.vault.adapter.mkdir(font_folder_path);
}
if (await this.app.vault.adapter.exists(font_folder_path)) {
const files = await this.app.vault.adapter.list(
font_folder_path
);
for (const file of files.files) {
const file_name = file.replace(font_folder_path, "");
if (file_name.startsWith("."))
continue;
options.push({ name: file_name, value: file_name });
}
}
options.push({ name: "all", value: "Multiple fonts" });
} catch (error) {
console.log(error);
}
new import_obsidian.Setting(containerEl).setName("Reload fonts from folder").setDesc(
"This button reloades from the folder you specified (it also creates the folder for you)"
).addButton((button) => {
button.setButtonText("Reload");
button.onClick((callback) => {
this.plugin.saveSettings();
this.plugin.load_plugin();
this.display();
});
});
this.containerEl.createDiv();
new import_obsidian.Setting(containerEl).setName("Font").setDesc(
`Choose font (If you can't see your fonts, make sure your fonts are in the folder you specified and hit reload.
Also if you choose multiple fonts option, we will load and process all fonts in the folder for you. In that Case, enable Custom CSS Mode)`
).addDropdown((dropdown) => {
for (const opt of options) {
dropdown.addOption(opt.name, opt.value);
}
dropdown.setValue(this.plugin.settings.font).onChange(async (value) => {
this.plugin.settings.font = value;
await this.plugin.saveSettings();
await this.plugin.load_plugin();
this.display();
});
});
if (this.plugin.settings.font.toLowerCase() != "none") {
new import_obsidian.Setting(containerEl).setName("Force Style").setDesc(
"This option should only be used if you have installed a community theme and normal mode doesn't work"
).addToggle((toggle) => {
toggle.setValue(this.plugin.settings.force_mode);
toggle.onChange(async (value) => {
this.plugin.settings.force_mode = value;
await this.plugin.saveSettings();
await this.plugin.load_plugin();
});
});
new import_obsidian.Setting(containerEl).setName("Custom CSS Mode").setDesc(
"If you want to apply a custom css style rather than default style, choose this."
).addToggle((toggle) => {
toggle.setValue(this.plugin.settings.custom_css_mode);
toggle.onChange(async (value) => {
if (this.plugin.settings.custom_css_mode == false) {
this.plugin.settings.custom_css = "";
}
this.plugin.settings.custom_css_mode = value;
this.plugin.saveSettings();
this.plugin.load_plugin();
this.display();
});
});
if (this.plugin.settings.custom_css_mode) {
new import_obsidian.Setting(containerEl).setName("Custom CSS Style").setDesc("Input your custom css style. Use the font filename without extension (in lowercase) as the font-family name. For example, if your font file is 'MyFont.ttf', use 'myfont' in your CSS.").addTextArea(async (text) => {
text.onChange(async (new_value) => {
this.plugin.settings.custom_css = new_value;
await this.plugin.saveSettings();
await this.plugin.load_plugin();
});
text.setDisabled(!this.plugin.settings.custom_css_mode);
if (this.plugin.settings.custom_css == "") {
let font_family_name = "";
try {
font_family_name = this.plugin.settings.font.split(".")[0].toLowerCase();
} catch (error) {
console.log(error);
}
if (font_family_name == "all") {
if (await this.app.vault.adapter.exists(
font_folder_path
)) {
const files = await this.app.vault.adapter.list(
font_folder_path
);
let final_str = "";
for (const file of files.files) {
const file_name = file.split("/")[2];
const font_family = file_name.split(".")[0].toLowerCase();
final_str += "\n" + get_custom_css(
font_family,
"." + font_family
);
}
text.setValue(final_str);
}
} else {
const template = `/* Example CSS for your font: ${font_family_name} */
/* Apply to all text */
:root * {
--font-default: '${font_family_name}';
--default-font: '${font_family_name}';
--font-family-editor: '${font_family_name}';
--font-interface-override: '${font_family_name}';
--font-text-override: '${font_family_name}';
}
/* Example: Apply to custom CSS class */
.custom-font * {
font-family: '${font_family_name}' !important;
}
/* Example: Apply to specific elements only */
.custom-font h1, .custom-font h2, .custom-font h3 {
font-family: '${font_family_name}' !important;
}`;
text.setValue(template);
}
} else {
text.setValue(this.plugin.settings.custom_css);
}
text.onChanged();
text.inputEl.style.width = "100%";
text.inputEl.style.height = "100px";
});
}
}
}
};
/* nosourcemap */
+10
View File
@@ -0,0 +1,10 @@
{
"id": "custom-font-loader",
"name": "Custom Font Loader",
"version": "1.8.0",
"minAppVersion": "0.15.0",
"description": "Customize your Obsidian vault with any font you want (+ Support for Android and IOS)",
"author": "Amir Pourmand",
"authorUrl": "https://amirpourmand.ir",
"isDesktopOnly": false
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,10 @@
{
"id": "obsidian-note-autocreator",
"name": "Note Auto Creator",
"version": "1.6.0",
"minAppVersion": "0.14.2",
"description": "Automatically create notes when links are created to them.",
"author": "Simon T. Clement",
"authorUrl": "https://github.com/SimonTC",
"isDesktopOnly": false
}
@@ -0,0 +1,3 @@
.setting-item-control.setting-warning input {
border-color: yellow;
}
+28
View File
@@ -0,0 +1,28 @@
{
"types": {
"aliases": "aliases",
"cssclasses": "multitext",
"tags": "tags",
"offGlobalCooldown": "checkbox",
"cooldown": "number",
"range": "number",
"mana": "number",
"heal": "number",
"damage": "number",
"shield": "number",
"order": "number",
"completed": "checkbox",
"test": "multitext",
"priority": "number",
"swiftReprievalChance": "number",
"gdc": "number",
"duration": "number",
"damageReduction": "number",
"healingTickTime": "number",
"healingDuration": "number",
"parryChance": "number",
"damageTickTime": "number",
"isToggle": "checkbox",
"manaUpkeepTick": "number"
}
}
+268
View File
@@ -0,0 +1,268 @@
{
"main": {
"id": "123c1c967ef84112",
"type": "split",
"children": [
{
"id": "eee9a8f09755138c",
"type": "tabs",
"children": [
{
"id": "48fb883427ac2254",
"type": "leaf",
"pinned": true,
"state": {
"type": "markdown",
"state": {
"file": "Hotkeys.md",
"mode": "source",
"source": false
},
"pinned": true,
"icon": "lucide-file",
"title": "Hotkeys"
}
},
{
"id": "2cb99dc077607f1c",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "_.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "_"
}
},
{
"id": "52ff33be5ea0cfcf",
"type": "leaf",
"state": {
"type": "canvas",
"state": {
"file": "_Rime.canvas",
"viewState": {
"x": -97,
"y": -231.5,
"zoom": 0
}
},
"icon": "lucide-layout-dashboard",
"title": "_Rime"
}
}
],
"currentTab": 2
}
],
"direction": "vertical"
},
"left": {
"id": "57e827c773aec57f",
"type": "split",
"children": [
{
"id": "52c3e62ba4e159ba",
"type": "tabs",
"children": [
{
"id": "36a9a41f7ec6aaa9",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "426d7da5f7a4ee03",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "2ece49e1b5f66483",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 200
},
"right": {
"id": "c0d8dbfd11fbf7e2",
"type": "split",
"children": [
{
"id": "416badf900458eee",
"type": "tabs",
"children": [
{
"id": "194961464e209b3d",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Plugins.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Plugins"
}
},
{
"id": "01218f71b66e4cf8",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Plugins.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Plugins"
}
},
{
"id": "ed094eaf83e06e81",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "2884c742c9d598cc",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Plugins.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of Plugins"
}
},
{
"id": "b20b4dcf5a3cbdcc",
"type": "leaf",
"state": {
"type": "calendar",
"state": {},
"icon": "lucide-ghost",
"title": "calendar"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false
}
},
"active": "52ff33be5ea0cfcf",
"lastOpenFiles": [
"_.base",
"Throw Book.md",
"Circle of Light.md",
"_Rime.canvas",
"Frost Bolt.md",
"F.md",
"G.md",
"_.canvas",
"_Rotation.canvas",
"_Welcome.md",
"Frost Bolt Icon.png",
"!.md",
"1.md",
"3.md",
"5.md",
"Pasted image 20260224121329.png",
"Lightshaper's Ward.md",
"Pasted image 20260223235252.png",
"Pasted image 20260223235229.png",
"Pasted image 20260223234651.png",
"Pasted image 20260223234634.png",
"Remove Magic.md",
"Pasted image 20260223234558.png",
"Pasted image 20260223234556.png",
"Pasted image 20260223234541.png",
"Avatar of Light.md",
"Rune of Renewal.md",
"Luminous Barrier.md",
"Images/Greater Heal.png",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.md",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.mp4",
"Hotkeys.md",
"Greater Heal.md",
"Mouse 3.md",
"Mouse 1.md",
"Mouse 2.md",
"Dawnflare.md",
"Dawnbreaker Orb.md",
"Untitled 1.md",
"Images",
"Untitled.md",
"Videos/Vigour/Contender/3/Everdawn Grove Contender 3.mp4",
"Videos/Vigour/Contender/3",
"Videos/Vigour/Contender/4",
"Videos/Vigour/Contender/1/Sailors Abyss Contender 1.mp4",
"Videos/Vigour/Contender/7",
"Videos/Vigour/Contender/4/Empyrean Sands Contender 4.mp4",
"Videos/Vigour/Contender/1"
]
}
+268
View File
@@ -0,0 +1,268 @@
{
"main": {
"id": "123c1c967ef84112",
"type": "split",
"children": [
{
"id": "eee9a8f09755138c",
"type": "tabs",
"children": [
{
"id": "48fb883427ac2254",
"type": "leaf",
"pinned": true,
"state": {
"type": "markdown",
"state": {
"file": "Hotkeys.md",
"mode": "source",
"source": false
},
"pinned": true,
"icon": "lucide-file",
"title": "Hotkeys"
}
},
{
"id": "2cb99dc077607f1c",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "_.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "_"
}
},
{
"id": "52ff33be5ea0cfcf",
"type": "leaf",
"state": {
"type": "canvas",
"state": {
"file": "_Rime.canvas",
"viewState": {
"x": -97,
"y": -231.5,
"zoom": 0
}
},
"icon": "lucide-layout-dashboard",
"title": "_Rime"
}
}
],
"currentTab": 2
}
],
"direction": "vertical"
},
"left": {
"id": "57e827c773aec57f",
"type": "split",
"children": [
{
"id": "52c3e62ba4e159ba",
"type": "tabs",
"children": [
{
"id": "36a9a41f7ec6aaa9",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "426d7da5f7a4ee03",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "2ece49e1b5f66483",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 200
},
"right": {
"id": "c0d8dbfd11fbf7e2",
"type": "split",
"children": [
{
"id": "416badf900458eee",
"type": "tabs",
"children": [
{
"id": "194961464e209b3d",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Plugins.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Plugins"
}
},
{
"id": "01218f71b66e4cf8",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Plugins.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Plugins"
}
},
{
"id": "ed094eaf83e06e81",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "2884c742c9d598cc",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Plugins.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of Plugins"
}
},
{
"id": "b20b4dcf5a3cbdcc",
"type": "leaf",
"state": {
"type": "calendar",
"state": {},
"icon": "lucide-ghost",
"title": "calendar"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false
}
},
"active": "52ff33be5ea0cfcf",
"lastOpenFiles": [
"_.base",
"Throw Book.md",
"Circle of Light.md",
"_Rime.canvas",
"Frost Bolt.md",
"F.md",
"G.md",
"_.canvas",
"_Rotation.canvas",
"_Welcome.md",
"Frost Bolt Icon.png",
"!.md",
"1.md",
"3.md",
"5.md",
"Pasted image 20260224121329.png",
"Lightshaper's Ward.md",
"Pasted image 20260223235252.png",
"Pasted image 20260223235229.png",
"Pasted image 20260223234651.png",
"Pasted image 20260223234634.png",
"Remove Magic.md",
"Pasted image 20260223234558.png",
"Pasted image 20260223234556.png",
"Pasted image 20260223234541.png",
"Avatar of Light.md",
"Rune of Renewal.md",
"Luminous Barrier.md",
"Images/Greater Heal.png",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.md",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.mp4",
"Hotkeys.md",
"Greater Heal.md",
"Mouse 3.md",
"Mouse 1.md",
"Mouse 2.md",
"Dawnflare.md",
"Dawnbreaker Orb.md",
"Untitled 1.md",
"Images",
"Untitled.md",
"Videos/Vigour/Contender/3/Everdawn Grove Contender 3.mp4",
"Videos/Vigour/Contender/3",
"Videos/Vigour/Contender/4",
"Videos/Vigour/Contender/1/Sailors Abyss Contender 1.mp4",
"Videos/Vigour/Contender/7",
"Videos/Vigour/Contender/4/Empyrean Sands Contender 4.mp4",
"Videos/Vigour/Contender/1"
]
}
+393
View File
@@ -0,0 +1,393 @@
{
"main": {
"id": "123c1c967ef84112",
"type": "split",
"children": [
{
"id": "eee9a8f09755138c",
"type": "tabs",
"children": [
{
"id": "48fb883427ac2254",
"type": "leaf",
"pinned": true,
"state": {
"type": "markdown",
"state": {
"file": "Hotkeys.md",
"mode": "source",
"source": false
},
"pinned": true,
"icon": "lucide-file",
"title": "Hotkeys"
}
},
{
"id": "2cb99dc077607f1c",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "_.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "_"
}
},
{
"id": "600fcce15db2f675",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Lightshaper's Ward.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Lightshaper's Ward"
}
},
{
"id": "2b6d57abd4c41d64",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Throw Book.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Throw Book"
}
},
{
"id": "857ae8cfa616b7ae",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Remove Magic.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Remove Magic"
}
},
{
"id": "a94ab811735c34fd",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Avatar of Light.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Avatar of Light"
}
},
{
"id": "4a132e2ce1e8fbe2",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Rune of Renewal.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Rune of Renewal"
}
},
{
"id": "d4b4c8b11d3ae43f",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Luminous Barrier.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Luminous Barrier"
}
},
{
"id": "dee4f293b0bcbb50",
"type": "leaf",
"state": {
"type": "image",
"state": {
"file": "Images/Greater Heal.png"
},
"icon": "lucide-image",
"title": "Greater Heal"
}
},
{
"id": "ff2887d57c85ebe9",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Circle of Light.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Circle of Light"
}
},
{
"id": "d067cf3e62e92dd9",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Ransack of Drakheim Contender 7"
}
},
{
"id": "dd139ac1e934e76c",
"type": "leaf",
"state": {
"type": "canvas",
"state": {
"file": "_.canvas",
"viewState": {
"x": -50,
"y": 197.5,
"zoom": -0.7361780968535913
}
},
"icon": "lucide-layout-dashboard",
"title": "_"
}
}
],
"currentTab": 11
}
],
"direction": "vertical"
},
"left": {
"id": "57e827c773aec57f",
"type": "split",
"children": [
{
"id": "52c3e62ba4e159ba",
"type": "tabs",
"children": [
{
"id": "36a9a41f7ec6aaa9",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "426d7da5f7a4ee03",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "2ece49e1b5f66483",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 410.5
},
"right": {
"id": "c0d8dbfd11fbf7e2",
"type": "split",
"children": [
{
"id": "416badf900458eee",
"type": "tabs",
"children": [
{
"id": "194961464e209b3d",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Plugins.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Plugins"
}
},
{
"id": "01218f71b66e4cf8",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Plugins.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Plugins"
}
},
{
"id": "ed094eaf83e06e81",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "2884c742c9d598cc",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Plugins.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of Plugins"
}
},
{
"id": "b20b4dcf5a3cbdcc",
"type": "leaf",
"state": {
"type": "calendar",
"state": {},
"icon": "lucide-ghost",
"title": "calendar"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false
}
},
"active": "dd139ac1e934e76c",
"lastOpenFiles": [
"Flight of the Navir.md",
"Glacial Blast.md",
"Freezing Torrent.md",
"Cold Snap.md",
"Frost Bolt.md",
"_Rime.canvas",
"_.base",
"_.canvas",
"!.md",
"_Welcome.md",
"1.md",
"3.md",
"5.md",
"Rotation.canvas",
"Pasted image 20260224121329.png",
"Lightshaper's Ward.md",
"Pasted image 20260223235252.png",
"Pasted image 20260223235229.png",
"Throw Book.md",
"Pasted image 20260223234651.png",
"Pasted image 20260223234634.png",
"Remove Magic.md",
"Pasted image 20260223234558.png",
"Pasted image 20260223234556.png",
"Pasted image 20260223234541.png",
"Avatar of Light.md",
"Rune of Renewal.md",
"Luminous Barrier.md",
"Images/Greater Heal.png",
"Circle of Light.md",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.md",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.mp4",
"Pasted image 20260223234256.png",
"Hotkeys.md",
"Greater Heal.md",
"Mouse 3.md",
"Mouse 1.md",
"Mouse 2.md",
"Dawnflare.md",
"Dawnbreaker Orb.md",
"Untitled 1.md",
"Images",
"Videos/Vigour/Contender/3/Everdawn Grove Contender 3.mp4",
"Videos/Vigour/Contender/3",
"Videos/Vigour/Contender/4",
"Videos/Vigour/Contender/1/Sailors Abyss Contender 1.mp4",
"Videos/Vigour/Contender/7",
"Videos/Vigour/Contender/4/Empyrean Sands Contender 4.mp4",
"Videos/Vigour/Contender/1"
]
}
+393
View File
@@ -0,0 +1,393 @@
{
"main": {
"id": "123c1c967ef84112",
"type": "split",
"children": [
{
"id": "eee9a8f09755138c",
"type": "tabs",
"children": [
{
"id": "48fb883427ac2254",
"type": "leaf",
"pinned": true,
"state": {
"type": "markdown",
"state": {
"file": "Hotkeys.md",
"mode": "source",
"source": false
},
"pinned": true,
"icon": "lucide-file",
"title": "Hotkeys"
}
},
{
"id": "2cb99dc077607f1c",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "_.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "_"
}
},
{
"id": "600fcce15db2f675",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Lightshaper's Ward.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Lightshaper's Ward"
}
},
{
"id": "2b6d57abd4c41d64",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Throw Book.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Throw Book"
}
},
{
"id": "857ae8cfa616b7ae",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Remove Magic.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Remove Magic"
}
},
{
"id": "a94ab811735c34fd",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Avatar of Light.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Avatar of Light"
}
},
{
"id": "4a132e2ce1e8fbe2",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Rune of Renewal.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Rune of Renewal"
}
},
{
"id": "d4b4c8b11d3ae43f",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Luminous Barrier.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Luminous Barrier"
}
},
{
"id": "dee4f293b0bcbb50",
"type": "leaf",
"state": {
"type": "image",
"state": {
"file": "Images/Greater Heal.png"
},
"icon": "lucide-image",
"title": "Greater Heal"
}
},
{
"id": "ff2887d57c85ebe9",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Circle of Light.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Circle of Light"
}
},
{
"id": "d067cf3e62e92dd9",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Ransack of Drakheim Contender 7"
}
},
{
"id": "dd139ac1e934e76c",
"type": "leaf",
"state": {
"type": "canvas",
"state": {
"file": "_Rime.canvas",
"viewState": {
"x": 235.94421772640501,
"y": -80.40922874971731,
"zoom": -1.4487407524978124
}
},
"icon": "lucide-layout-dashboard",
"title": "_Rime"
}
}
],
"currentTab": 11
}
],
"direction": "vertical"
},
"left": {
"id": "57e827c773aec57f",
"type": "split",
"children": [
{
"id": "52c3e62ba4e159ba",
"type": "tabs",
"children": [
{
"id": "36a9a41f7ec6aaa9",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "426d7da5f7a4ee03",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "2ece49e1b5f66483",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 410.5
},
"right": {
"id": "c0d8dbfd11fbf7e2",
"type": "split",
"children": [
{
"id": "416badf900458eee",
"type": "tabs",
"children": [
{
"id": "194961464e209b3d",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Plugins.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Plugins"
}
},
{
"id": "01218f71b66e4cf8",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Plugins.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Plugins"
}
},
{
"id": "ed094eaf83e06e81",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "2884c742c9d598cc",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Plugins.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of Plugins"
}
},
{
"id": "b20b4dcf5a3cbdcc",
"type": "leaf",
"state": {
"type": "calendar",
"state": {},
"icon": "lucide-ghost",
"title": "calendar"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false
}
},
"active": "dd139ac1e934e76c",
"lastOpenFiles": [
"Pasted image 20260227215952.png",
"_.canvas",
"Flight of the Navir.md",
"Glacial Blast.md",
"Freezing Torrent.md",
"Cold Snap.md",
"Frost Bolt.md",
"_Rime.canvas",
"_.base",
"!.md",
"_Welcome.md",
"1.md",
"3.md",
"5.md",
"Rotation.canvas",
"Pasted image 20260224121329.png",
"Lightshaper's Ward.md",
"Pasted image 20260223235252.png",
"Pasted image 20260223235229.png",
"Throw Book.md",
"Pasted image 20260223234651.png",
"Pasted image 20260223234634.png",
"Remove Magic.md",
"Pasted image 20260223234558.png",
"Pasted image 20260223234556.png",
"Pasted image 20260223234541.png",
"Avatar of Light.md",
"Rune of Renewal.md",
"Luminous Barrier.md",
"Images/Greater Heal.png",
"Circle of Light.md",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.md",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.mp4",
"Pasted image 20260223234256.png",
"Hotkeys.md",
"Greater Heal.md",
"Mouse 3.md",
"Mouse 1.md",
"Mouse 2.md",
"Dawnflare.md",
"Dawnbreaker Orb.md",
"Images",
"Videos/Vigour/Contender/3/Everdawn Grove Contender 3.mp4",
"Videos/Vigour/Contender/3",
"Videos/Vigour/Contender/4",
"Videos/Vigour/Contender/1/Sailors Abyss Contender 1.mp4",
"Videos/Vigour/Contender/7",
"Videos/Vigour/Contender/4/Empyrean Sands Contender 4.mp4",
"Videos/Vigour/Contender/1"
]
}
+393
View File
@@ -0,0 +1,393 @@
{
"main": {
"id": "123c1c967ef84112",
"type": "split",
"children": [
{
"id": "eee9a8f09755138c",
"type": "tabs",
"children": [
{
"id": "48fb883427ac2254",
"type": "leaf",
"pinned": true,
"state": {
"type": "markdown",
"state": {
"file": "Hotkeys.md",
"mode": "source",
"source": false
},
"pinned": true,
"icon": "lucide-file",
"title": "Hotkeys"
}
},
{
"id": "2cb99dc077607f1c",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "_.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "_"
}
},
{
"id": "600fcce15db2f675",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Lightshaper's Ward.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Lightshaper's Ward"
}
},
{
"id": "2b6d57abd4c41d64",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Throw Book.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Throw Book"
}
},
{
"id": "857ae8cfa616b7ae",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Remove Magic.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Remove Magic"
}
},
{
"id": "a94ab811735c34fd",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Avatar of Light.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Avatar of Light"
}
},
{
"id": "4a132e2ce1e8fbe2",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Rune of Renewal.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Rune of Renewal"
}
},
{
"id": "d4b4c8b11d3ae43f",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Luminous Barrier.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Luminous Barrier"
}
},
{
"id": "dee4f293b0bcbb50",
"type": "leaf",
"state": {
"type": "image",
"state": {
"file": "Images/Greater Heal.png"
},
"icon": "lucide-image",
"title": "Greater Heal"
}
},
{
"id": "ff2887d57c85ebe9",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Circle of Light.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Circle of Light"
}
},
{
"id": "d067cf3e62e92dd9",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Ransack of Drakheim Contender 7"
}
},
{
"id": "dd139ac1e934e76c",
"type": "leaf",
"state": {
"type": "canvas",
"state": {
"file": "_Rime.canvas",
"viewState": {
"x": 235.94421772640501,
"y": -1357.334129551798,
"zoom": -1.4487407524978124
}
},
"icon": "lucide-layout-dashboard",
"title": "_Rime"
}
}
],
"currentTab": 11
}
],
"direction": "vertical"
},
"left": {
"id": "57e827c773aec57f",
"type": "split",
"children": [
{
"id": "52c3e62ba4e159ba",
"type": "tabs",
"children": [
{
"id": "36a9a41f7ec6aaa9",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "426d7da5f7a4ee03",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "2ece49e1b5f66483",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 410.5
},
"right": {
"id": "c0d8dbfd11fbf7e2",
"type": "split",
"children": [
{
"id": "416badf900458eee",
"type": "tabs",
"children": [
{
"id": "194961464e209b3d",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Plugins.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Plugins"
}
},
{
"id": "01218f71b66e4cf8",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Plugins.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Plugins"
}
},
{
"id": "ed094eaf83e06e81",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "2884c742c9d598cc",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Plugins.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of Plugins"
}
},
{
"id": "b20b4dcf5a3cbdcc",
"type": "leaf",
"state": {
"type": "calendar",
"state": {},
"icon": "lucide-ghost",
"title": "calendar"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false
}
},
"active": "dd139ac1e934e76c",
"lastOpenFiles": [
"Pasted image 20260227215952.png",
"_.canvas",
"Flight of the Navir.md",
"Glacial Blast.md",
"Freezing Torrent.md",
"Cold Snap.md",
"Frost Bolt.md",
"_Rime.canvas",
"_.base",
"!.md",
"_Welcome.md",
"1.md",
"3.md",
"5.md",
"Rotation.canvas",
"Pasted image 20260224121329.png",
"Lightshaper's Ward.md",
"Pasted image 20260223235252.png",
"Pasted image 20260223235229.png",
"Throw Book.md",
"Pasted image 20260223234651.png",
"Pasted image 20260223234634.png",
"Remove Magic.md",
"Pasted image 20260223234558.png",
"Pasted image 20260223234556.png",
"Pasted image 20260223234541.png",
"Avatar of Light.md",
"Rune of Renewal.md",
"Luminous Barrier.md",
"Images/Greater Heal.png",
"Circle of Light.md",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.md",
"Videos/Vigour/Contender/7/Ransack of Drakheim Contender 7.mp4",
"Pasted image 20260223234256.png",
"Hotkeys.md",
"Greater Heal.md",
"Mouse 3.md",
"Mouse 1.md",
"Mouse 2.md",
"Dawnflare.md",
"Dawnbreaker Orb.md",
"Images",
"Videos/Vigour/Contender/3/Everdawn Grove Contender 3.mp4",
"Videos/Vigour/Contender/3",
"Videos/Vigour/Contender/4",
"Videos/Vigour/Contender/1/Sailors Abyss Contender 1.mp4",
"Videos/Vigour/Contender/7",
"Videos/Vigour/Contender/4/Empyrean Sands Contender 4.mp4",
"Videos/Vigour/Contender/1"
]
}
+312
View File
@@ -0,0 +1,312 @@
{
"main": {
"id": "a1daa5cfc1ad024d",
"type": "split",
"children": [
{
"id": "a6d68f6d6a50ba09",
"type": "tabs",
"dimension": 80.32994923857868,
"children": [
{
"id": "4ae458cb7f768cb9",
"type": "leaf",
"state": {
"type": "canvas",
"state": {
"file": "_Keyboard.canvas",
"viewState": {
"x": 1188.5882847634182,
"y": 1015.5547971965063,
"zoom": -1.2720080268176461
}
},
"icon": "lucide-layout-dashboard",
"title": "_Keyboard"
}
},
{
"id": "16bac99d148a0e4b",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Xavian/Aura of Solace.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Aura of Solace"
}
},
{
"id": "28bf3864eae8c9e4",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Xavian/Omnistrike.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Omnistrike"
}
},
{
"id": "90f63ab1cd502da2",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "Xavian/_Base.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "_Base"
}
}
],
"currentTab": 3
},
{
"id": "09d7b7dcffcb1b49",
"type": "tabs",
"dimension": 19.670050761421322,
"children": [
{
"id": "cf07e32fae8559d4",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Xavian/Sky Crash.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Sky Crash"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "4da895b26dde5b73",
"type": "split",
"children": [
{
"id": "6d1287c5bc63eedf",
"type": "tabs",
"children": [
{
"id": "da7d887e59a6c0a8",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "81b46fbc9e3374b9",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "Frost Bolt Icon",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "13018fcf0b102c84",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "4829a3e519db0862",
"type": "split",
"children": [
{
"id": "234b746ea890f544",
"type": "tabs",
"children": [
{
"id": "da3e82fdcb6ccdd0",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks"
}
},
{
"id": "0eeabbc1fc4e98c6",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links"
}
},
{
"id": "68f39d36d412a04a",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "e4d421251e09a5a8",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-ghost",
"title": "all-properties"
}
},
{
"id": "b09df9114f0aab0d",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline"
}
},
{
"id": "71bafac16327d945",
"type": "leaf",
"state": {
"type": "calendar",
"state": {},
"icon": "calendar-with-checkmark",
"title": "Calendar"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false
}
},
"active": "cf07e32fae8559d4",
"lastOpenFiles": [
"Xavian/_Base.base",
"Xavian/Solar Shield.md",
"Xavian/Omega Reprieval.md",
"Xavian/_Keyboard 2.canvas",
"Xavian/Taunt.md",
"Xavian/Sun Struck.md",
"Xavian/Xavian.md",
"Xavian/Sky Crash.md",
"Xavian/Brilliant Flare.md",
"Xavian/Brilliant Flash.md",
"Xavian/Swift Reprival.md",
"Xavian/Shinning Halo.md",
"Xavian/Blind.md",
"Xavian/Ruptured Dawn.md",
"Xavian/Aura of Solace.md",
"Xavian/Decree of the Sun.md",
"Xavian/Interupt.md",
"Xavian/Solar Blades.md",
"Xavian/Blinding Slash.md",
"Xavian/Omnistrike.md",
"Xavian/Sun Strike.md",
"Pasted image 20260605132922.png",
"Q.md",
"Keys/Shift + 1.md",
"Shift.md",
"Images/Pasted image 20260223234556.png",
"Hotkeys.md",
"R.md",
"Images/Pasted image 20260224121329.png",
"Images/Pasted image 20260605113647.png",
"Images/Pasted image 20260605112156.png",
"Frost Bolt Icon.png",
"Keys/Mouse 1.md",
"Keys",
"Images/Pasted image 20260605125121.png",
"Images/Pasted image 20260605125057.png",
"Images/Pasted image 20260605124858.png",
"Images/Pasted image 20260605123320.png",
"_.base",
"_.canvas",
"_Keyboard.canvas",
"Xavian",
"_Keyboard 1.canvas",
"_Rime.canvas",
"_Vigour.canvas",
"Vigour",
"Rime"
]
}
+3
View File
@@ -0,0 +1,3 @@
---
type: Key
---
+6
View File
@@ -0,0 +1,6 @@
| ` | [[1]] | [[2]] | [[3]] | [[4]] | [[5]] | [[6]] |
| --------- | --------- | ----- | ----- | ----- | ----- | ----------- |
| Tab | [[Q]] | [[W]] | [[E]] | [[R]] | [[T]] | [[Mouse 1]] |
| Caps Lock | [[A]] | [[S]] | [[D]] | [[F]] | [[G]] | [[Mouse 2]] |
| [[Shift]] | [[Z]] | [[X]] | [[C]] | [[V]] | [[B]] | [[Mouse 3]] |
| Ctrl | [[Space]] | | | | | |
Binary file not shown.

After

Width:  |  Height:  |  Size: 587 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

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