Tech stack stub page and changing project to be just one Web Assembly project for now

This commit is contained in:
2026-05-27 11:25:04 -04:00
parent 8a20cfec4f
commit dd74f9b69f
140 changed files with 64156 additions and 97 deletions
+41
View File
@@ -0,0 +1,41 @@
namespace WebAssembly.Data;
public enum MagicMaterialCategory
{
Ore,
SunlessOre,
Liquid,
Plant,
VoidStone
}
public class MagicMaterial
{
public MagicMaterialCategory Category { get; set; }
public string Name { get; set; } = string.Empty;
public string? Description { get; set; }
public string? GlobalBonus { get; set; }
public string? InfusionEffects1 { get; set; }
public string? InfusionEffects2 { get; set; }
public string? InfusionEffects3 { get; set; }
public int? IncreaseProduction { get; set; }
public int? IncreaseGold { get; set; }
public int? IncreaseMana { get; set; }
public int? IncreaseDraft { get; set; }
public int? IncreaseKnowledge { get; set; }
public int? IncreaseFood { get; set; }
public int? IncreaseStability { get; set; }
public int? IncreaseImperium { get; set; }
public int? IncreaseAllegianceFromWhisperingStones { get; set; }
public int? IncreaseRelationWithFreeCitiesAndRulers { get; set; }
public int? IncreaseCombatCastingPoints { get; set; }
public int? IncreaseWorldCastingPoints { get; set; }
public int? IncreaseHpRegen { get; set; }
public int? IncreaseHitPoints { get; set; }
public int? IncreaseExperiencePercent { get; set; }
public int? IncreaseAllegianceFromUmbralDwellings { get; set; }
public int? DecreaseDraftCostPercent { get; set; }
public int? DecreaseRecruitmentCostPercent { get; set; }
public int? DecreaseKnowledgeResearchCostPercent { get; set; }
public int? DecreaseTurnsTakenToFoundAbsorbMigrateCities { get; set; }
}
+329
View File
@@ -0,0 +1,329 @@
namespace WebAssembly.Data;
public static class MagicMaterialsData
{
public static readonly IReadOnlyList<MagicMaterial> RawData = new List<MagicMaterial>
{
new()
{
Category = MagicMaterialCategory.Ore,
Name = "Arcanum Ore",
Description =
"Desolate, Cave Underground and Desolate Underground only. Collection effect: Rings of Binding.",
IncreaseProduction = 10,
IncreaseMana = 10,
GlobalBonus = "-25% Hurry Recruitment Cost",
InfusionEffects1 = """
Inflict Sundered Defense
Power Cleave
Support - Bolstered Defense
Reinforced
+2 Defense
Bolstering Defense
Juggernaut
Demolisher
""",
InfusionEffects2 = """
Construct Slayer
Dragon Slayer
Inflict Immobilized
Push Back
Displace and Replace
+3 Defense
Siege Master
"""
},
new()
{
Category = MagicMaterialCategory.Ore,
Name = "Focus Crystals",
Description =
"Desolate, Cave Underground and Desolate Underground only. Collection effect: Rings of Binding.",
IncreaseGold = 10,
IncreaseKnowledge = 10,
GlobalBonus = "+10% Unit Experience Gain",
InfusionEffects1 = """
Retaliator +50%
+1 Range
Inflict Marked
Damage Reflection 30%
+20% Accuracy
Lightning Strike
""",
InfusionEffects2 = """
Retaliator +100%
Elemental Slayer
Inflict Stunned
Hyper-Awareness
+30% Accuracy
Inversion
""",
InfusionEffects3 = """
Area Damage - Line
Damage Reflection 40%
"""
},
new()
{
Category = MagicMaterialCategory.Ore,
Name = "Fireforge Stone",
Description =
"Desolate, Cave Underground and Desolate Underground only. Collection effect: Rings of Binding.",
IncreaseProduction = 20,
DecreaseDraftCostPercent = 20,
GlobalBonus = "-20% Unit Draft Cost",
InfusionEffects1 = """
Fire Damage
+20% Critical Damage
Inflict Burning
Support - Strengthened
Lesser Fire Shield
+2 Fire Resistance
Berserker's Rage
""",
InfusionEffects2 = """
Arcfire Damage
+40% Critical Damage
Plant Slayer
Greater Fire Shield
+4 Fire Resistance
Ignore 4 Status Resistance
""",
InfusionEffects3 = """
Area Damage - Blast
Inflict Insanity
Consume Chaos
+6 Fire Resistance
"""
},
new()
{
Category = MagicMaterialCategory.SunlessOre,
Name = "Blood Glass",
Description = "Sunless Terrain only. Counts as Ore.",
IncreaseDraft = 20,
IncreaseHpRegen = 5,
GlobalBonus = "+5 HP regeneration (on the world map)",
InfusionEffects1 = """
Greater Inflict Bleed
Lifedrinker
Blood Sigil
"""
},
new()
{
Category = MagicMaterialCategory.Liquid,
Name = "Archon Blood",
Description = "Arctic, Highlands and Arctic Underground only. Collection effect: Cosmoflux Elixir.",
IncreaseMana = 20,
IncreaseCombatCastingPoints = 15,
GlobalBonus = "+15 Combat Casting Points",
InfusionEffects1 = """
Frost Damage
Infecting
Assassinate
Life Steal
Lesser Frost Shield
+10 Hit Points
+2 Frost Resistance
Vicious Killer
Flanker
Raise Undead
""",
InfusionEffects2 = """
Death Damage
Inflict Diseased
+15 Hit Points
+4 Frost Resistance
Bolstering Regeneration
Undying
""",
InfusionEffects3 = """
Inflict Decaying
Gravecall
Greater Frost Shield
+6 Frost Resistance
"""
},
new()
{
Category = MagicMaterialCategory.Liquid,
Name = "Astral Dew",
Description = "Arctic, Highlands and Arctic Underground only. Collection effect: Cosmoflux Elixir.",
IncreaseMana = 10,
IncreaseKnowledge = 10,
IncreaseWorldCastingPoints = 15,
GlobalBonus = "+15 World Map Casting Points",
InfusionEffects1 = """
Lightning Damage
Inflict Status Vulnerability
Inflict Sundered Resistance
Support - Bolstered Resistance
Lesser Lightning Shield
Warded
+2 Lightning Resistance
Slip Away
Casting Points +20
""",
InfusionEffects2 = """
Magic Origin Slayer
Inflict Frozen
Greater Lightning Shield
+4 Lightning Resistance
""",
InfusionEffects3 = """
Static Shield
+6 Lightning Resistance
Pass Through
Astral Membrane
"""
},
new()
{
Category = MagicMaterialCategory.Liquid,
Name = "Tranquility Pool",
Description = "Arctic, Highlands and Arctic Underground only. Collection effect: Cosmoflux Elixir.",
IncreaseKnowledge = 20,
DecreaseKnowledgeResearchCostPercent = 10,
GlobalBonus = "-10% Knowledge research cost for spells",
InfusionEffects1 = """
Inflict Slowed
Inflict Weakened
Inflict Wet
Support - Status Protection
Lesser Spirit Shield
+2 Resistance
+2 Status Resistance
Attunement: Star Blades
Bolstering Resistance
Slippery
Hindering Blizzard
""",
InfusionEffects2 = """
Celestial Slayer
Undead Slayer
+3 Resistance
+3 Status Resistance
Attunement: Fortune
""",
InfusionEffects3 = """
Area Damage - Cascade
Status Effect Immunity
Resurrection
"""
},
new()
{
Category = MagicMaterialCategory.Plant,
Name = "Haste Berries",
Description = "Desert, Temperate and Tropical only. Collection effect: Imperial Essence.",
IncreaseDraft = 20,
DecreaseTurnsTakenToFoundAbsorbMigrateCities = 2,
GlobalBonus = "-2 turns to found, absorb or migrate cities",
InfusionEffects1 = """
Frenzy
Inflict Distracted
Swift
Wind Barrier
Conjure Animal
""",
InfusionEffects2 = """
Extra Retaliation
Giant Slayer
Inflict Blinded
Whirlwind
Defensive Masters
Very Fast Movement
Killing Momentum
Animate Flora
""",
InfusionEffects3 = """
Area Damage - Chain
Polymorph
"""
},
new()
{
Category = MagicMaterialCategory.Plant,
Name = "Silvertongue Fruit",
Description = "Desert, Temperate and Tropical only. Collection effect: Imperial Essence.",
IncreaseFood = 10,
IncreaseDraft = 10,
IncreaseAllegianceFromWhisperingStones = 1,
GlobalBonus = "+1 Allegiance from Whispering Stones",
InfusionEffects1 = """
Blight Damage
Inflict Condemned
Inflict Poisoned
Support - Regeneration
Lesser Blight Shield
+2 Blight Resistance
Inspiring Killer
Universal Camouflage
Army Trainer
Summon Spider
""",
InfusionEffects2 = """
Hero Slayer
Inflict Despairing
Inflict Taunted
Greater Blight Shield
+4 Blight Resistance
Army Maintenance
""",
InfusionEffects3 = """
+6 Blight Resistance
Domination
Summon Spider Monarch
"""
},
new()
{
Category = MagicMaterialCategory.Plant,
Name = "Rainbow Clover",
Description = "Desert, Temperate and Tropical only. Collection effect: Imperial Essence.",
IncreaseFood = 10,
IncreaseStability = 10,
IncreaseRelationWithFreeCitiesAndRulers = 100,
GlobalBonus = "+100 Relations with Free Cities and Rulers",
InfusionEffects1 = """
Spirit Damage
+2 Spirit Resistance
Zeal
Army Recuperation
""",
InfusionEffects2 = """
Radiant Damage
+20% Critical Hit chance
Fiend Slayer
+4 Spirit Resistance
""",
InfusionEffects3 = """
+30% Critical Hit chance
+6 Spirit Resistance
Mass Heal
"""
},
new()
{
Category = MagicMaterialCategory.VoidStone,
Name = "Void Stones",
Description = "Umbral Abyss only. Collection effect: Void Ink.",
IncreaseMana = 30,
IncreaseAllegianceFromUmbralDwellings = 2,
GlobalBonus = "+2 Allegiance per turn with discovered Umbral Dwellings",
InfusionEffects1 = """
Boon Stealing
Cleansing Fire
Army: Umbral Malady Immunity
""",
InfusionEffects2 = """
Splitterling Infection
Summon Umbral Demon
""",
InfusionEffects3 = """
True Damage
"""
}
};
}
+44
View File
@@ -0,0 +1,44 @@
namespace WebAssembly.Data;
/// <summary>
/// Represents a Province Improvement - a buildable enhancement that can be constructed in a province.
/// Each Province Improvement decreases stability by -5.
/// </summary>
public class ProvinceImprovement
{
/// <summary>
/// The name of the province improvement.
/// </summary>
public required string Name { get; set; }
/// <summary>
/// The base category/type (Conduit, Farm, Forester, Mine, Quarry, Research Post, Teleporter, Monument, etc.).
/// </summary>
public required string Category { get; set; }
/// <summary>
/// A description of the effects this improvement provides (resource bonuses, adjacency bonuses, special mechanics,
/// etc.).
/// </summary>
public required string Effects { get; set; }
/// <summary>
/// Any requirements to build this improvement (terrain, resource nodes, Town Hall tier, etc.).
/// </summary>
public required string Requirements { get; set; }
/// <summary>
/// The source/culture/tome that grants this improvement (General, Barbarian, Feudal, High, Mystic, etc.).
/// </summary>
public required string Source { get; set; }
/// <summary>
/// The production cost to build this improvement.
/// </summary>
public int CostProduction { get; set; }
/// <summary>
/// The gold cost to build this improvement.
/// </summary>
public int CostGold { get; set; }
}
@@ -0,0 +1,365 @@
namespace WebAssembly.Data;
/// <summary>
/// Static raw data provider for Province Improvements.
/// </summary>
public static class ProvinceImprovementsData
{
public static List<ProvinceImprovement> RawData =>
[
new()
{
Name = "Conduit",
Category = "Conduit",
Effects = "+5 Mana",
Requirements = "Mana node, pearl reef, or magic material",
Source = "Base",
CostProduction = 0,
CostGold = 0
},
new()
{
Name = "Farm",
Category = "Farm",
Effects = "+5 Food",
Requirements = "Grassland or coast terrain, fungus fields (underground)",
Source = "Base",
CostProduction = 0,
CostGold = 0
},
new()
{
Name = "Forester",
Category = "Forester",
Effects = "+2 Food\n+3 Production",
Requirements = "Forest or mangrove forest terrain, mushroom forest (underground)",
Source = "Base",
CostProduction = 0,
CostGold = 0
},
new()
{
Name = "Hut",
Category = "Hut",
Effects = "+2 Food",
Requirements = "Ashlands, sand or snow terrain",
Source = "Base",
CostProduction = 0,
CostGold = 0
},
new()
{
Name = "Mine",
Category = "Mine",
Effects = "+5 Gold",
Requirements = "Gold vein, iron deposit, or pearl reef resource node",
Source = "Base",
CostProduction = 0,
CostGold = 0
},
new()
{
Name = "Quarry",
Category = "Quarry",
Effects = "+5 Production",
Requirements = "Cliff, rocky, or sunken ruins terrain; or iron deposit resource node",
Source = "Base",
CostProduction = 0,
CostGold = 0
},
new()
{
Name = "Research Post",
Category = "Research Post",
Effects = "+5 Knowledge",
Requirements = "Mana node, magic material or sunken ruins terrain",
Source = "Base",
CostProduction = 0,
CostGold = 0
},
// General Province Improvements
new()
{
Name = "Spell Jammer",
Category = "Conduit",
Effects = """
Enemies cannot target World Map Spells in this Domain.
Enemy Spells cost +100% Combat Casting Points in Combat in Domain.
-10 Mana.
""",
Requirements = "Must be built on an acquired province.\nRequires Town Hall III",
Source = "General",
CostProduction = 250,
CostGold = 100
},
new()
{
Name = "Teleporter",
Category = "Teleporter",
Effects = """
A Province Improvement which enables an Army to teleport from one teleporter to another.
-10 Mana.
""",
Requirements = "Must be built on an acquired province",
Source = "General",
CostProduction = 250,
CostGold = 100
},
// Cultural Province Improvements - Barbarian
new()
{
Name = "Forest of Stakes",
Category = "Forester",
Effects = """
+7 Food income.
+7 Production income.
+7 Draft per adjacent Forester.
Enemy Units in this Domain get Demoralized.
""",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Communal Tent",
Source = "Barbarian",
CostProduction = 130,
CostGold = 60
},
// Cultural Province Improvements - Dark Cult of Death
new()
{
Name = "Masoleum",
Category = "Research Post",
Effects = """
+10 Knowledge income.
+3 Knowledge Production per adjacent Conduit.
""",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Dread Spire",
Source = "Dark - Cult of Death",
CostProduction = 130,
CostGold = 60
},
// Cultural Province Improvements - Dark Cult of Tyranny
new()
{
Name = "Dark Forge",
Category = "Mine",
Effects = """
+10 Gold income.
+5 Production per adjacent Quarry, Mine, or Forester.
""",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Dread Spire",
Source = "Dark - Cult of Tyranny",
CostProduction = 130,
CostGold = 60
},
// Cultural Province Improvements - Feudal
new()
{
Name = "Farmstead",
Category = "Farm",
Effects = """
+15 Food income.
+5 Food per adjacent Farm.
""",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Castle",
Source = "Feudal",
CostProduction = 130,
CostGold = 60
},
// Cultural Province Improvements - High
new()
{
Name = "Sunshrine",
Category = "Research Post",
Effects = """
+10 Knowledge income.
+3 Knowledge per adjacent Research Post.
Friendly Units in this Domain are Encouraged.
""",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Atrium of Light",
Source = "High",
CostProduction = 130,
CostGold = 60
},
// Cultural Province Improvements - Industrious
new()
{
Name = "Builder's Quarters",
Category = "Quarry",
Effects = """
+15 Production income.
+5 Production per adjacent Quarry.
""",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Bulwark",
Source = "Industrious",
CostProduction = 130,
CostGold = 60
},
// Cultural Province Improvements - Mystic School of Attunement
new()
{
Name = "Mystic Abbey",
Category = "Conduit",
Effects = """
+10 Mana income.
+3 Knowledge per adjacent Conduit or Research Post.
""",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Mage's Plaza",
Source = "Mystic - School of Attunement",
CostProduction = 130,
CostGold = 60
},
// Cultural Province Improvements - Mystic School of Summoning
new()
{
Name = "Astral Manalith",
Category = "Conduit",
Effects = """
+10 Mana income.
+5 Mana per adjacent Conduit or Research Post.
""",
Requirements =
"Must be built on an acquired Province.\nRequires City Tier 2.\nRequires Town Hall II: Mage's Plaza",
Source = "Mystic - School of Summoning",
CostProduction = 130,
CostGold = 60
},
// Cultural Province Improvements - Nomad Conquerors
new()
{
Name = "Warcamp",
Category = "Forester",
Effects = """
+15 Draft.
Pillaging adjacent provinces takes -1 Turn.
Friendly units in this and adjacent provinces gain +15 Hit Point regeneration per World Map Turn.
""",
Requirements = "Must be built on an annexed Province.\nRequires Town Hall II: Council Deck",
Source = "Nomad - Conquerors",
CostProduction = 130,
CostGold = 60
},
// Cultural Province Improvements - Nomad Scavengers
new()
{
Name = "Scavenging Camp",
Category = "Mine",
Effects = """
+10 Gold.
+10 Gold for this and each adjacent province containing a Resource Node.
""",
Requirements = "Must be built on an annexed Province.\nRequires Town Hall II: Council Deck",
Source = "Nomad - Scavengers",
CostProduction = 130,
CostGold = 60
},
// Primal Megalith improvements
new()
{
Name = "Ash Megalith",
Category = "Conduit",
Effects = "+6 Gold per adjacent Ashland Province",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Clan Lodge",
Source = "Primal - Ash Sabertooth",
CostProduction = 250,
CostGold = 100
},
new()
{
Name = "Dune Megalith",
Category = "Conduit",
Effects = "+4 Gold per adjacent Sand Province",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Clan Lodge",
Source = "Primal - Dune Serpent",
CostProduction = 250,
CostGold = 100
},
new()
{
Name = "Glacial Megalith",
Category = "Conduit",
Effects = "+6 Production per adjacent Snow Province",
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Clan Lodge",
Source = "Primal - Glacial Mammoth",
CostProduction = 250,
CostGold = 100
},
// Oathsworn Schools
new()
{
Name = "School of Contemplation",
Category = "Conduit",
Effects = """
+7 Mana.
+7 Knowledge.
+3 Knowledge per adjacent Conduit or Research Post.
""",
Requirements = "Must be built on an acquired Province.\nRequires Town Hall II: Oath Square",
Source = "Oathsworn - Oath of Harmony",
CostProduction = 250,
CostGold = 100
},
new()
{
Name = "School of Discipline",
Category = "Conduit",
Effects = """
+7 Mana.
+7 Draft.
+5 Draft per adjacent Quarry.
""",
Requirements = "Must be built on an acquired Province.\nRequires Town Hall II: Oath Square",
Source = "Oathsworn - Oath of Righteousness",
CostProduction = 250,
CostGold = 100
},
new()
{
Name = "School of Mastery",
Category = "Conduit",
Effects = """
+7 Mana.
+7 Draft.
Units produced in this city start with +1 Starting Rank.
""",
Requirements = "Must be built on an acquired Province.\nRequires Town Hall II: Oath Square",
Source = "Oathsworn - Oath of Strife",
CostProduction = 250,
CostGold = 100
}
];
}
+18
View File
@@ -0,0 +1,18 @@
namespace WebAssembly.Data;
public class ResourceNode
{
public string Name { get; set; } = string.Empty;
public string? Description { get; set; }
public int? IncreaseFood { get; set; }
public int? IncreaseProduction { get; set; }
public int? IncreaseGold { get; set; }
public int? IncreaseMana { get; set; }
public int? IncreaseKnowledge { get; set; }
public bool ForceEnableFarm { get; set; }
public bool ForceEnableMine { get; set; }
public bool ForceEnableQuarry { get; set; }
public bool ForceEnableConduit { get; set; }
public bool ForceEnableResearchPost { get; set; }
public bool ForceEnableForester { get; set; }
}
+79
View File
@@ -0,0 +1,79 @@
namespace WebAssembly.Data;
public static class ResourceNodesData
{
public static readonly IReadOnlyList<ResourceNode> RawData = new List<ResourceNode>
{
new()
{
Name = "Pastures",
Description = "Roaming herds on lush fields.",
IncreaseFood = 10,
ForceEnableFarm = true
},
new()
{
Name = "Oasis",
Description = "A lush oasis full of nutritious food.",
IncreaseFood = 10
},
new()
{
Name = "Iron Deposit",
Description = "A rich vein full of ore.",
IncreaseProduction = 10,
ForceEnableMine = true,
ForceEnableQuarry = true
},
new()
{
Name = "Gold Vein",
Description = "A large vein of valuable gold.",
IncreaseGold = 10,
ForceEnableMine = true
},
new()
{
Name = "Mana Node",
Description = "Magical currents converge at this location.",
IncreaseMana = 10,
ForceEnableConduit = true,
ForceEnableResearchPost = true
},
new()
{
Name = "Fishing Ground",
Description = "A plentiful source of fish.",
IncreaseFood = 15
},
new()
{
Name = "Pearl Reef",
Description = "A bloom of valuable pearls.",
IncreaseGold = 7,
IncreaseMana = 7,
ForceEnableMine = true,
ForceEnableConduit = true
},
new()
{
Name = "Chitinous Growths",
Description = "These grotesque growths deposit valuable liquid and ore at unnatural speed.",
IncreaseGold = 30
},
new()
{
Name = "Monoliths",
Description = "There is writing in an unknown language on these obsidian giants.",
IncreaseKnowledge = 30
},
new()
{
Name = "Blossom Orchard",
Description = "Eternally blooming trees offering bounty of fruit and wood.",
IncreaseFood = 5,
IncreaseProduction = 5,
ForceEnableForester = true
}
};
}
+11
View File
@@ -0,0 +1,11 @@
namespace WebAssembly.Data;
public class SearchPointModel
{
public string Title { get; set; } = "";
public string Summary { get; set; } = "";
public string Tags { get; set; } = "";
public string PointType { get; set; } = "";
public string Href { get; set; } = "";
}
+15
View File
@@ -0,0 +1,15 @@
namespace WebAssembly.Data;
public class SectionLink
{
public string Title { get; set; } = string.Empty;
public string Url { get; set; } = string.Empty;
public string? Description { get; set; }
}
public class Section
{
public string Name { get; set; } = string.Empty;
public string? Description { get; set; }
public List<SectionLink> Links { get; set; } = new();
}
+69
View File
@@ -0,0 +1,69 @@
namespace WebAssembly.Data;
public static class SectionsData
{
public static List<Section> GetAllSections()
{
return
[
new Section
{
Name = "About",
Description = "Meta information on this website",
Links =
[
new SectionLink
{
Title = "Tech Stack",
Url = "/tech-stack",
Description = "Information about the technology stack that will be used in this project."
}
]
},
new Section
{
Name = "Calculators",
Description = "Useful calculator tools for various computations",
Links =
[
new SectionLink
{
Title = "Building Plan Calculator",
Url = "/building-calculator",
Description = "Simulate build order timing and gold income over turns."
}
]
},
new Section
{
Name = "References",
Description = "Reference materials and documentation",
Links =
[
new SectionLink
{
Title = "Magic Materials Reference",
Url = "/references/magic-materials",
Description = "View the magic material dataset and bonuses in a reference table."
},
new SectionLink
{
Title = "Province Improvements Reference",
Url = "/references/province-improvements",
Description =
"View the province improvements dataset including costs, effects, and requirements."
}
]
},
new Section
{
Name = "Learning",
Description = "Educational resources and learning materials",
Links = []
}
];
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace WebAssembly.Data;
public class SeverityType
{
public static string Warning = "Warning";
public static string Information = "Information";
public static string Error = "Error";
public static string Success = "Success";
}
+10
View File
@@ -0,0 +1,10 @@
namespace WebAssembly.Data;
public class TechStack
{
public string Name { get; set; } = string.Empty;
public string? Description { get; set; }
public string? ExtendedNotes { get; set; }
public bool InUse { get; set; } = false;
}
+52
View File
@@ -0,0 +1,52 @@
namespace WebAssembly.Data;
public static class TechStackData
{
public static List<TechStack> RawData =
[
new()
{
Name = "Blazor WebAssembly",
Description = "Framework for web applications for easy distribution and no hosting costs with third parties",
InUse = true,
ExtendedNotes = """
Simple and easy to distribute. I like C#, and it's C# web development, what's not to like.
Obviously con is if I want the user to save state between usages, I am relying on something unreliable like local storage which can be cleared by the user or obviously not transferred between different browsers.
So needs to be used in reference and informational only content. I suppose I could rely on the user to handle copying and pasting the data, but a tad cumbersome and unrealistic to expect that.
"""
},
new()
{
Name = "Blazor Server",
Description = "Framework for web applications that allows for database interactions",
InUse = false,
ExtendedNotes = """
Easy to distribute. I'll need to have to deal with authentication and all those security concerns.
Needs a database to store data. Local hosting Postgresql is the plan.
Unideal support implications. Need to make deleting all user data very easy for legal compliance.
Less reliability. Server can go down, and I can have a long outage. Fallback to Blazor WebAssembly version hosted by a third party.
"""
},
new() {
Name = "MAUI",
Description = "Framework for mobile and desktop applications",
InUse = false,
ExtendedNotes = """
So I get around the whole unreliableness of web storage by saving files locally.
I can easily distribute via an exe file or apk. Obviously con of that is the user needs to install a exe file or apk, so there is going be a clear 'this could be a virus' type of warning popup to discourage the user.
Potentially can distribute via Google Play or Windows Store and be subject to the whims and veto power of a third party.
"""
},
new()
{
Name = "PostgreSQL",
Description = "Relational database management system",
InUse = false,
ExtendedNotes = """
I am picking PostgreSQL because it appears free and simple. I have pgAdmin installed and it running.
Need to just actually implement using it in the far future.
"""
},
];
}
+9
View File
@@ -0,0 +1,9 @@
namespace WebAssembly.Data;
public class ToastModel
{
public string Title { get; set; } = "addTitle";
public string Message { get; set; } = "addMessage";
public string SeverityType { get; set; } = "addType";
public float Age { get; set; } = 0;
}