From a8af84f5813f9dec611c32a7b8d410a98f7ceea4 Mon Sep 17 00:00:00 2001
From: thepaperpilot <thepaperpilot@gmail.com>
Date: Sun, 27 Feb 2022 16:04:56 -0600
Subject: [PATCH] Reorganized components

---
 src/App.vue                                   | 10 ++---
 src/components/{system => }/Game.vue          |  0
 .../{system => }/GameOverScreen.vue           |  2 +-
 src/components/{system => }/Info.vue          |  3 +-
 src/components/{system => }/Layer.vue         |  2 +-
 src/components/{features => }/MarkNode.vue    |  0
 src/components/{system => }/Modal.vue         |  2 +-
 src/components/{system => }/NaNScreen.vue     |  4 +-
 src/components/{system => }/Nav.vue           |  0
 src/components/{system => }/Options.vue       |  8 ++--
 src/components/{system => }/Profectus.vue     |  0
 src/components/{system => }/Save.vue          | 10 +++--
 src/components/{system => }/SavesManager.vue  |  8 ++--
 src/components/{system => }/TPS.vue           |  0
 src/components/{system => }/Tooltip.vue       |  0
 src/components/fields/Slider.vue              |  2 +-
 src/components/{system => layout}/Column.vue  |  0
 src/components/{system => layout}/Row.vue     |  0
 src/components/{system => layout}/Spacer.vue  |  0
 src/components/{system => layout}/Sticky.vue  |  0
 .../{system => layout}/VerticalRule.vue       |  0
 src/components/{system => links}/Link.vue     |  0
 src/components/{system => links}/LinkNode.vue |  0
 src/components/{system => links}/Links.vue    |  0
 src/data/Changelog.vue                        |  2 +-
 src/data/common.tsx                           |  6 +--
 src/data/layers/aca/a.tsx                     | 12 +++---
 src/data/layers/aca/c.tsx                     | 40 ++++++++++---------
 src/data/layers/aca/f.tsx                     |  8 ++--
 src/data/mod.tsx                              | 10 ++---
 .../achievements}/Achievement.vue             |  6 +--
 .../{ => achievements}/achievement.tsx        |  2 +-
 .../features => features/bars}/Bar.vue        |  6 +--
 src/features/{ => bars}/bar.ts                |  2 +-
 .../board => features/boards}/Board.vue       |  2 +-
 .../board => features/boards}/BoardLink.vue   |  2 +-
 .../board => features/boards}/BoardNode.vue   |  2 +-
 src/features/{ => boards}/board.ts            |  4 +-
 src/features/buyable.tsx                      |  4 +-
 .../challenges}/Challenge.vue                 |  6 +--
 src/features/{ => challenges}/challenge.ts    |  6 +--
 .../clickables}/Clickable.vue                 |  8 ++--
 src/features/{ => clickables}/clickable.ts    |  2 +-
 src/features/conversion.ts                    |  2 +-
 .../features => features/grids}/Grid.vue      |  8 ++--
 .../features => features/grids}/GridCell.vue  |  4 +-
 src/features/{ => grids}/grid.ts              |  2 +-
 .../infoboxes}/Infobox.vue                    |  2 +-
 src/features/{ => infoboxes}/infobox.ts       |  2 +-
 .../milestones}/Milestone.vue                 |  6 +--
 src/features/{ => milestones}/milestone.tsx   |  2 +-
 .../resources}/MainDisplay.vue                |  4 +-
 .../resources}/Resource.vue                   |  2 +-
 src/features/{ => resources}/resource.ts      |  0
 .../features => features/tabs}/Tab.vue        |  0
 .../features => features/tabs}/TabButton.vue  |  0
 .../features => features/tabs}/TabFamily.vue  |  8 ++--
 src/features/{ => tabs}/tab.ts                |  8 ++--
 src/features/{ => tabs}/tabFamily.ts          | 24 +++++------
 .../features/tree => features/trees}/Tree.vue |  2 +-
 .../tree => features/trees}/TreeNode.vue      |  6 +--
 src/features/{ => trees}/tree.ts              | 10 ++---
 .../upgrades}/Upgrade.vue                     | 10 ++---
 src/features/{ => upgrades}/upgrade.ts        |  4 +-
 src/util/vue.tsx                              |  4 +-
 65 files changed, 147 insertions(+), 144 deletions(-)
 rename src/components/{system => }/Game.vue (100%)
 rename src/components/{system => }/GameOverScreen.vue (98%)
 rename src/components/{system => }/Info.vue (97%)
 rename src/components/{system => }/Layer.vue (99%)
 rename src/components/{features => }/MarkNode.vue (100%)
 rename src/components/{system => }/Modal.vue (98%)
 rename src/components/{system => }/NaNScreen.vue (97%)
 rename src/components/{system => }/Nav.vue (100%)
 rename src/components/{system => }/Options.vue (92%)
 rename src/components/{system => }/Profectus.vue (100%)
 rename src/components/{system => }/Save.vue (93%)
 rename src/components/{system => }/SavesManager.vue (97%)
 rename src/components/{system => }/TPS.vue (100%)
 rename src/components/{system => }/Tooltip.vue (100%)
 rename src/components/{system => layout}/Column.vue (100%)
 rename src/components/{system => layout}/Row.vue (100%)
 rename src/components/{system => layout}/Spacer.vue (100%)
 rename src/components/{system => layout}/Sticky.vue (100%)
 rename src/components/{system => layout}/VerticalRule.vue (100%)
 rename src/components/{system => links}/Link.vue (100%)
 rename src/components/{system => links}/LinkNode.vue (100%)
 rename src/components/{system => links}/Links.vue (100%)
 rename src/{components/features => features/achievements}/Achievement.vue (93%)
 rename src/features/{ => achievements}/achievement.tsx (98%)
 rename src/{components/features => features/bars}/Bar.vue (97%)
 rename src/features/{ => bars}/bar.ts (98%)
 rename src/{components/features/board => features/boards}/Board.vue (99%)
 rename src/{components/features/board => features/boards}/BoardLink.vue (95%)
 rename src/{components/features/board => features/boards}/BoardNode.vue (99%)
 rename src/features/{ => boards}/board.ts (99%)
 rename src/{components/features => features/challenges}/Challenge.vue (97%)
 rename src/features/{ => challenges}/challenge.ts (98%)
 rename src/{components/features => features/clickables}/Clickable.vue (95%)
 rename src/features/{ => clickables}/clickable.ts (98%)
 rename src/{components/features => features/grids}/Grid.vue (97%)
 rename src/{components/features => features/grids}/GridCell.vue (97%)
 rename src/features/{ => grids}/grid.ts (99%)
 rename src/{components/features => features/infoboxes}/Infobox.vue (98%)
 rename src/features/{ => infoboxes}/infobox.ts (98%)
 rename src/{components/features => features/milestones}/Milestone.vue (96%)
 rename src/features/{ => milestones}/milestone.tsx (98%)
 rename src/{components/features => features/resources}/MainDisplay.vue (89%)
 rename src/{components/system => features/resources}/Resource.vue (81%)
 rename src/features/{ => resources}/resource.ts (100%)
 rename src/{components/features => features/tabs}/Tab.vue (100%)
 rename src/{components/features => features/tabs}/TabButton.vue (100%)
 rename src/{components/features => features/tabs}/TabFamily.vue (96%)
 rename src/features/{ => tabs}/tab.ts (94%)
 rename src/features/{ => tabs}/tabFamily.ts (96%)
 rename src/{components/features/tree => features/trees}/Tree.vue (97%)
 rename src/{components/features/tree => features/trees}/TreeNode.vue (96%)
 rename src/features/{ => trees}/tree.ts (97%)
 rename src/{components/features => features/upgrades}/Upgrade.vue (94%)
 rename src/features/{ => upgrades}/upgrade.ts (97%)

diff --git a/src/App.vue b/src/App.vue
index ac86be1..d222465 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -11,11 +11,11 @@
 
 <script setup lang="ts">
 import { computed, toRef, unref } from "vue";
-import Game from "./components/system/Game.vue";
-import GameOverScreen from "./components/system/GameOverScreen.vue";
-import NaNScreen from "./components/system/NaNScreen.vue";
-import Nav from "./components/system/Nav.vue";
-import TPS from "./components/system/TPS.vue";
+import Game from "./components/Game.vue";
+import GameOverScreen from "./components/GameOverScreen.vue";
+import NaNScreen from "./components/NaNScreen.vue";
+import Nav from "./components/Nav.vue";
+import TPS from "./components/TPS.vue";
 import modInfo from "./data/modInfo.json";
 import themes from "./data/themes";
 import settings from "./game/settings";
diff --git a/src/components/system/Game.vue b/src/components/Game.vue
similarity index 100%
rename from src/components/system/Game.vue
rename to src/components/Game.vue
diff --git a/src/components/system/GameOverScreen.vue b/src/components/GameOverScreen.vue
similarity index 98%
rename from src/components/system/GameOverScreen.vue
rename to src/components/GameOverScreen.vue
index 0914e92..cb274d7 100644
--- a/src/components/system/GameOverScreen.vue
+++ b/src/components/GameOverScreen.vue
@@ -36,7 +36,7 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import { hasWon } from "@/data/mod";
 import modInfo from "@/data/modInfo.json";
 import player from "@/game/player";
diff --git a/src/components/system/Info.vue b/src/components/Info.vue
similarity index 97%
rename from src/components/system/Info.vue
rename to src/components/Info.vue
index e72929a..3fd17ce 100644
--- a/src/components/system/Info.vue
+++ b/src/components/Info.vue
@@ -48,13 +48,12 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import type Changelog from "@/data/Changelog.vue";
 import modInfo from "@/data/modInfo.json";
 import player from "@/game/player";
 import { formatTime } from "@/util/bignum";
 import { computed, ref, toRefs, unref } from "vue";
-import Profectus from "./Profectus.vue";
 
 const { title, logo, author, discordName, discordLink, versionNumber, versionTitle } = modInfo;
 
diff --git a/src/components/system/Layer.vue b/src/components/Layer.vue
similarity index 99%
rename from src/components/system/Layer.vue
rename to src/components/Layer.vue
index 934cbbf..8fd0838 100644
--- a/src/components/system/Layer.vue
+++ b/src/components/Layer.vue
@@ -21,7 +21,7 @@
 </template>
 
 <script lang="ts">
-import Links from "@/components/system/Links.vue";
+import Links from "@/components/links/Links.vue";
 import modInfo from "@/data/modInfo.json";
 import { CoercableComponent, PersistentRef, StyleValue } from "@/features/feature";
 import { Link } from "@/features/links";
diff --git a/src/components/features/MarkNode.vue b/src/components/MarkNode.vue
similarity index 100%
rename from src/components/features/MarkNode.vue
rename to src/components/MarkNode.vue
diff --git a/src/components/system/Modal.vue b/src/components/Modal.vue
similarity index 98%
rename from src/components/system/Modal.vue
rename to src/components/Modal.vue
index 7c67fc2..7b8a5fd 100644
--- a/src/components/system/Modal.vue
+++ b/src/components/Modal.vue
@@ -42,7 +42,7 @@
 <script setup lang="ts">
 import { Link } from "@/features/links";
 import { computed, ref, toRefs } from "vue";
-import Links from "./Links.vue";
+import Links from "./links/Links.vue";
 
 const _props = defineProps<{
     modelValue: boolean;
diff --git a/src/components/system/NaNScreen.vue b/src/components/NaNScreen.vue
similarity index 97%
rename from src/components/system/NaNScreen.vue
rename to src/components/NaNScreen.vue
index 27c88bc..d3cfef7 100644
--- a/src/components/system/NaNScreen.vue
+++ b/src/components/NaNScreen.vue
@@ -43,13 +43,13 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import modInfo from "@/data/modInfo.json";
 import player from "@/game/player";
 import state from "@/game/state";
 import Decimal, { DecimalSource, format } from "@/util/bignum";
 import { ComponentPublicInstance, computed, ref, toRef } from "vue";
-import Toggle from "../fields/Toggle.vue";
+import Toggle from "./fields/Toggle.vue";
 import SavesManager from "./SavesManager.vue";
 
 const { discordName, discordLink } = modInfo;
diff --git a/src/components/system/Nav.vue b/src/components/Nav.vue
similarity index 100%
rename from src/components/system/Nav.vue
rename to src/components/Nav.vue
diff --git a/src/components/system/Options.vue b/src/components/Options.vue
similarity index 92%
rename from src/components/system/Options.vue
rename to src/components/Options.vue
index af8abb4..f7636dc 100644
--- a/src/components/system/Options.vue
+++ b/src/components/Options.vue
@@ -19,15 +19,15 @@
 </template>
 
 <script setup lang="tsx">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import rawThemes from "@/data/themes";
-import { MilestoneDisplay } from "@/features/milestone";
+import { MilestoneDisplay } from "@/features/milestones/milestone";
 import player from "@/game/player";
 import settings from "@/game/settings";
 import { camelToTitle } from "@/util/common";
 import { computed, ref, toRefs } from "vue";
-import Toggle from "../fields/Toggle.vue";
-import Select from "../fields/Select.vue";
+import Toggle from "./fields/Toggle.vue";
+import Select from "./fields/Select.vue";
 import Tooltip from "./Tooltip.vue";
 import { jsx } from "@/features/feature";
 
diff --git a/src/components/system/Profectus.vue b/src/components/Profectus.vue
similarity index 100%
rename from src/components/system/Profectus.vue
rename to src/components/Profectus.vue
diff --git a/src/components/system/Save.vue b/src/components/Save.vue
similarity index 93%
rename from src/components/system/Save.vue
rename to src/components/Save.vue
index 9400b28..9eaf60b 100644
--- a/src/components/system/Save.vue
+++ b/src/components/Save.vue
@@ -51,16 +51,18 @@
         <div class="details" v-else-if="save.error == undefined && isEditing">
             <Text v-model="newName" class="editname" @submit="changeName" />
         </div>
-        <div v-else class="details error">Error: Failed to load save with id {{ save.id }}<br/>{{ save.error }}</div>
+        <div v-else class="details error">
+            Error: Failed to load save with id {{ save.id }}<br />{{ save.error }}
+        </div>
     </div>
 </template>
 
 <script setup lang="ts">
 import player from "@/game/player";
 import { computed, ref, toRefs, watch } from "vue";
-import DangerButton from "../fields/DangerButton.vue";
-import FeedbackButton from "../fields/FeedbackButton.vue";
-import Text from "../fields/Text.vue";
+import DangerButton from "./fields/DangerButton.vue";
+import FeedbackButton from "./fields/FeedbackButton.vue";
+import Text from "./fields/Text.vue";
 import { LoadablePlayerData } from "./SavesManager.vue";
 
 const _props = defineProps<{
diff --git a/src/components/system/SavesManager.vue b/src/components/SavesManager.vue
similarity index 97%
rename from src/components/system/SavesManager.vue
rename to src/components/SavesManager.vue
index 4375fee..d09fb3b 100644
--- a/src/components/system/SavesManager.vue
+++ b/src/components/SavesManager.vue
@@ -57,7 +57,7 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import player, { PlayerData } from "@/game/player";
 import settings from "@/game/settings";
 import { getUniqueID, loadSave, save, newSave } from "@/util/save";
@@ -70,8 +70,8 @@ import {
     unref,
     watch
 } from "vue";
-import Select from "../fields/Select.vue";
-import Text from "../fields/Text.vue";
+import Select from "./fields/Select.vue";
+import Text from "./fields/Text.vue";
 import Save from "./Save.vue";
 import Draggable from "vuedraggable";
 
@@ -117,7 +117,7 @@ watch(saveToImport, save => {
     }
 });
 
-let bankContext = require.context("raw-loader!../../../saves", true, /\.txt$/);
+let bankContext = require.context("raw-loader!../../saves", true, /\.txt$/);
 let bank = ref(
     bankContext.keys().reduce((acc: Array<{ label: string; value: string }>, curr) => {
         // .slice(2, -4) strips the leading ./ and the trailing .txt
diff --git a/src/components/system/TPS.vue b/src/components/TPS.vue
similarity index 100%
rename from src/components/system/TPS.vue
rename to src/components/TPS.vue
diff --git a/src/components/system/Tooltip.vue b/src/components/Tooltip.vue
similarity index 100%
rename from src/components/system/Tooltip.vue
rename to src/components/Tooltip.vue
diff --git a/src/components/fields/Slider.vue b/src/components/fields/Slider.vue
index fdcf561..7ad7433 100644
--- a/src/components/fields/Slider.vue
+++ b/src/components/fields/Slider.vue
@@ -9,7 +9,7 @@
 
 <script setup lang="ts">
 import { computed, toRefs, unref } from "vue";
-import Tooltip from "../system/Tooltip.vue";
+import Tooltip from "../Tooltip.vue";
 import "@/components/common/fields.css";
 
 const _props = defineProps<{
diff --git a/src/components/system/Column.vue b/src/components/layout/Column.vue
similarity index 100%
rename from src/components/system/Column.vue
rename to src/components/layout/Column.vue
diff --git a/src/components/system/Row.vue b/src/components/layout/Row.vue
similarity index 100%
rename from src/components/system/Row.vue
rename to src/components/layout/Row.vue
diff --git a/src/components/system/Spacer.vue b/src/components/layout/Spacer.vue
similarity index 100%
rename from src/components/system/Spacer.vue
rename to src/components/layout/Spacer.vue
diff --git a/src/components/system/Sticky.vue b/src/components/layout/Sticky.vue
similarity index 100%
rename from src/components/system/Sticky.vue
rename to src/components/layout/Sticky.vue
diff --git a/src/components/system/VerticalRule.vue b/src/components/layout/VerticalRule.vue
similarity index 100%
rename from src/components/system/VerticalRule.vue
rename to src/components/layout/VerticalRule.vue
diff --git a/src/components/system/Link.vue b/src/components/links/Link.vue
similarity index 100%
rename from src/components/system/Link.vue
rename to src/components/links/Link.vue
diff --git a/src/components/system/LinkNode.vue b/src/components/links/LinkNode.vue
similarity index 100%
rename from src/components/system/LinkNode.vue
rename to src/components/links/LinkNode.vue
diff --git a/src/components/system/Links.vue b/src/components/links/Links.vue
similarity index 100%
rename from src/components/system/Links.vue
rename to src/components/links/Links.vue
diff --git a/src/data/Changelog.vue b/src/data/Changelog.vue
index 24a37bf..76a2ffd 100644
--- a/src/data/Changelog.vue
+++ b/src/data/Changelog.vue
@@ -19,7 +19,7 @@
 </template>
 
 <script setup lang="ts">
-import Modal from "@/components/system/Modal.vue";
+import Modal from "@/components/Modal.vue";
 import { ref } from "vue";
 
 const isOpen = ref(false);
diff --git a/src/data/common.tsx b/src/data/common.tsx
index 2f88747..5fc2ce1 100644
--- a/src/data/common.tsx
+++ b/src/data/common.tsx
@@ -3,17 +3,17 @@ import {
     ClickableOptions,
     createClickable,
     GenericClickable
-} from "@/features/clickable";
+} from "@/features/clickables/clickable";
 import { GenericConversion } from "@/features/conversion";
 import { CoercableComponent, jsx, Replace, setDefault } from "@/features/feature";
-import { displayResource } from "@/features/resource";
+import { displayResource } from "@/features/resources/resource";
 import {
     createTreeNode,
     GenericTree,
     GenericTreeNode,
     TreeNode,
     TreeNodeOptions
-} from "@/features/tree";
+} from "@/features/trees/tree";
 import player from "@/game/player";
 import Decimal from "@/util/bignum";
 import {
diff --git a/src/data/layers/aca/a.tsx b/src/data/layers/aca/a.tsx
index efa819e..e143ba7 100644
--- a/src/data/layers/aca/a.tsx
+++ b/src/data/layers/aca/a.tsx
@@ -1,11 +1,11 @@
-import Row from "@/components/system/Row.vue";
-import Tooltip from "@/components/system/Tooltip.vue";
+import Row from "@/components/layout/Row.vue";
+import Tooltip from "@/components/Tooltip.vue";
 import { main } from "@/data/mod";
-import { createAchievement } from "@/features/achievement";
+import { createAchievement } from "@/features/achievements/achievement";
 import { jsx } from "@/features/feature";
-import { createGrid } from "@/features/grid";
-import { createResource } from "@/features/resource";
-import { createTreeNode } from "@/features/tree";
+import { createGrid } from "@/features/grids/grid";
+import { createResource } from "@/features/resources/resource";
+import { createTreeNode } from "@/features/trees/tree";
 import { createLayer } from "@/game/layers";
 import { DecimalSource } from "@/lib/break_eternity";
 import Decimal from "@/util/bignum";
diff --git a/src/data/layers/aca/c.tsx b/src/data/layers/aca/c.tsx
index a29010e..ebb2357 100644
--- a/src/data/layers/aca/c.tsx
+++ b/src/data/layers/aca/c.tsx
@@ -1,21 +1,19 @@
-import MainDisplay from "@/components/features/MainDisplay.vue";
 import Slider from "@/components/fields/Slider.vue";
 import Text from "@/components/fields/Text.vue";
 import Toggle from "@/components/fields/Toggle.vue";
-import Column from "@/components/system/Column.vue";
-import Modal from "@/components/system/Modal.vue";
-import Resource from "@/components/system/Resource.vue";
-import Row from "@/components/system/Row.vue";
-import Spacer from "@/components/system/Spacer.vue";
-import Sticky from "@/components/system/Sticky.vue";
-import VerticalRule from "@/components/system/VerticalRule.vue";
+import Column from "@/components/layout/Column.vue";
+import Row from "@/components/layout/Row.vue";
+import Spacer from "@/components/layout/Spacer.vue";
+import Sticky from "@/components/layout/Sticky.vue";
+import VerticalRule from "@/components/layout/VerticalRule.vue";
+import Modal from "@/components/Modal.vue";
 import { createLayerTreeNode, createResetButton } from "@/data/common";
 import { main } from "@/data/mod";
 import themes from "@/data/themes";
-import { createBar, Direction } from "@/features/bar";
+import { createBar, Direction } from "@/features/bars/bar";
 import { createBuyable } from "@/features/buyable";
-import { createChallenge } from "@/features/challenge";
-import { createClickable } from "@/features/clickable";
+import { createChallenge } from "@/features/challenges/challenge";
+import { createClickable } from "@/features/clickables/clickable";
 import {
     addSoftcap,
     createCumulativeConversion,
@@ -23,14 +21,16 @@ import {
 } from "@/features/conversion";
 import { jsx, persistent, showIf, Visibility } from "@/features/feature";
 import { createHotkey } from "@/features/hotkey";
-import { createInfobox } from "@/features/infobox";
-import { createMilestone } from "@/features/milestone";
+import { createInfobox } from "@/features/infoboxes/infobox";
+import { createMilestone } from "@/features/milestones/milestone";
 import { createReset } from "@/features/reset";
-import { createResource, displayResource, trackBest } from "@/features/resource";
-import { createTab } from "@/features/tab";
-import { createTabButton, createTabFamily } from "@/features/tabFamily";
-import { createTree, createTreeNode, GenericTreeNode, TreeBranch } from "@/features/tree";
-import { createUpgrade } from "@/features/upgrade";
+import MainDisplay from "@/features/resources/MainDisplay.vue";
+import { createResource, displayResource, trackBest } from "@/features/resources/resource";
+import Resource from "@/features/resources/Resource.vue";
+import { createTab } from "@/features/tabs/tab";
+import { createTabButton, createTabFamily } from "@/features/tabs/tabFamily";
+import { createTree, createTreeNode, GenericTreeNode, TreeBranch } from "@/features/trees/tree";
+import { createUpgrade } from "@/features/upgrades/upgrade";
 import { createLayer } from "@/game/layers";
 import settings from "@/game/settings";
 import { DecimalSource } from "@/lib/break_eternity";
@@ -121,12 +121,14 @@ const layer = createLayer(() => {
             return showIf(Decimal.gt(best.value, 0));
         },
         goal: 20,
-        reset,
         resource: main.points,
         onComplete() {
             console.log("hiii");
         },
         onEnter() {
+            main.points.value = 0;
+            main.best.value = main.points.value;
+            main.total.value = main.points.value;
             console.log("So challenging");
         },
         onExit() {
diff --git a/src/data/layers/aca/f.tsx b/src/data/layers/aca/f.tsx
index 878a852..416dfec 100644
--- a/src/data/layers/aca/f.tsx
+++ b/src/data/layers/aca/f.tsx
@@ -1,12 +1,12 @@
-import MainDisplay from "@/components/features/MainDisplay.vue";
 import { createLayerTreeNode, createResetButton } from "@/data/common";
 import { main } from "@/data/mod";
-import { createClickable } from "@/features/clickable";
+import { createClickable } from "@/features/clickables/clickable";
 import { createExponentialScaling, createIndependentConversion } from "@/features/conversion";
 import { jsx, persistent } from "@/features/feature";
-import { createInfobox } from "@/features/infobox";
+import { createInfobox } from "@/features/infoboxes/infobox";
 import { createReset } from "@/features/reset";
-import { createResource, displayResource } from "@/features/resource";
+import MainDisplay from "@/features/resources/MainDisplay.vue";
+import { createResource, displayResource } from "@/features/resources/resource";
 import { createLayer } from "@/game/layers";
 import Decimal, { DecimalSource, formatWhole } from "@/util/bignum";
 import { render } from "@/util/vue";
diff --git a/src/data/mod.tsx b/src/data/mod.tsx
index a96845f..02f98ac 100644
--- a/src/data/mod.tsx
+++ b/src/data/mod.tsx
@@ -1,9 +1,9 @@
-import Modal from "@/components/system/Modal.vue";
-import Profectus from "@/components/system/Profectus.vue";
-import Spacer from "@/components/system/Spacer.vue";
+import Modal from "@/components/Modal.vue";
+import Profectus from "@/components/Profectus.vue";
+import Spacer from "@/components/layout/Spacer.vue";
 import { jsx } from "@/features/feature";
-import { createResource, trackBest, trackOOMPS, trackTotal } from "@/features/resource";
-import { branchedResetPropagation, createTree, GenericTree } from "@/features/tree";
+import { createResource, trackBest, trackOOMPS, trackTotal } from "@/features/resources/resource";
+import { branchedResetPropagation, createTree, GenericTree } from "@/features/trees/tree";
 import { globalBus } from "@/game/events";
 import { createLayer, GenericLayer } from "@/game/layers";
 import player, { PlayerData } from "@/game/player";
diff --git a/src/components/features/Achievement.vue b/src/features/achievements/Achievement.vue
similarity index 93%
rename from src/components/features/Achievement.vue
rename to src/features/achievements/Achievement.vue
index 55f4347..cae4c7b 100644
--- a/src/components/features/Achievement.vue
+++ b/src/features/achievements/Achievement.vue
@@ -26,9 +26,9 @@
 import { CoercableComponent, Visibility } from "@/features/feature";
 import { computeOptionalComponent, processedPropType } from "@/util/vue";
 import { defineComponent, StyleValue, toRefs, unref } from "vue";
-import Tooltip from "@/components/system/Tooltip.vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
+import Tooltip from "@/components/Tooltip.vue";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
 import "@/components/common/features.css";
 
 export default defineComponent({
diff --git a/src/features/achievement.tsx b/src/features/achievements/achievement.tsx
similarity index 98%
rename from src/features/achievement.tsx
rename to src/features/achievements/achievement.tsx
index 2d0a84c..27279e3 100644
--- a/src/features/achievement.tsx
+++ b/src/features/achievements/achievement.tsx
@@ -1,4 +1,4 @@
-import AchievementComponent from "@/components/features/Achievement.vue";
+import AchievementComponent from "@/features/achievements/Achievement.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/Bar.vue b/src/features/bars/Bar.vue
similarity index 97%
rename from src/components/features/Bar.vue
rename to src/features/bars/Bar.vue
index 8e82aa4..8d6129d 100644
--- a/src/components/features/Bar.vue
+++ b/src/features/bars/Bar.vue
@@ -45,13 +45,13 @@
 </template>
 
 <script lang="ts">
-import { Direction } from "@/features/bar";
+import { Direction } from "./bar";
 import { CoercableComponent, Visibility } from "@/features/feature";
 import Decimal, { DecimalSource } from "@/util/bignum";
 import { computeOptionalComponent, processedPropType, unwrapRef } from "@/util/vue";
 import { computed, CSSProperties, defineComponent, StyleValue, toRefs, unref } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/bar.ts b/src/features/bars/bar.ts
similarity index 98%
rename from src/features/bar.ts
rename to src/features/bars/bar.ts
index dc5a16a..a166e51 100644
--- a/src/features/bar.ts
+++ b/src/features/bars/bar.ts
@@ -1,4 +1,4 @@
-import BarComponent from "@/components/features/Bar.vue";
+import BarComponent from "@/features/bars/Bar.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/board/Board.vue b/src/features/boards/Board.vue
similarity index 99%
rename from src/components/features/board/Board.vue
rename to src/features/boards/Board.vue
index e04cc0c..55f2b37 100644
--- a/src/components/features/board/Board.vue
+++ b/src/features/boards/Board.vue
@@ -51,7 +51,7 @@
 </template>
 
 <script setup lang="ts">
-import { BoardNode, GenericBoard, getNodeProperty } from "@/features/board";
+import { BoardNode, GenericBoard, getNodeProperty } from "@/features/boards/board";
 import { FeatureComponent, PersistentState, Visibility } from "@/features/feature";
 import { computed, ref, toRefs } from "vue";
 import panZoom from "vue-panzoom";
diff --git a/src/components/features/board/BoardLink.vue b/src/features/boards/BoardLink.vue
similarity index 95%
rename from src/components/features/board/BoardLink.vue
rename to src/features/boards/BoardLink.vue
index 3e90176..387b7b6 100644
--- a/src/components/features/board/BoardLink.vue
+++ b/src/features/boards/BoardLink.vue
@@ -11,7 +11,7 @@
 </template>
 
 <script setup lang="ts">
-import { BoardNodeLink } from "@/features/board";
+import { BoardNodeLink } from "@/features/boards/board";
 import { computed, toRefs, unref } from "vue";
 
 const _props = defineProps<{
diff --git a/src/components/features/board/BoardNode.vue b/src/features/boards/BoardNode.vue
similarity index 99%
rename from src/components/features/board/BoardNode.vue
rename to src/features/boards/BoardNode.vue
index b2c09d0..efd3d5d 100644
--- a/src/components/features/board/BoardNode.vue
+++ b/src/features/boards/BoardNode.vue
@@ -175,7 +175,7 @@ import {
     getNodeProperty,
     ProgressDisplay,
     Shape
-} from "@/features/board";
+} from "@/features/boards/board";
 import { Visibility } from "@/features/feature";
 import settings from "@/game/settings";
 import { computed, ref, toRefs, unref, watch } from "vue";
diff --git a/src/features/board.ts b/src/features/boards/board.ts
similarity index 99%
rename from src/features/board.ts
rename to src/features/boards/board.ts
index 48597e1..2833721 100644
--- a/src/features/board.ts
+++ b/src/features/boards/board.ts
@@ -1,4 +1,4 @@
-import BoardComponent from "@/components/features/board/Board.vue";
+import BoardComponent from "@/features/boards/Board.vue";
 import {
     Component,
     findFeatures,
@@ -26,7 +26,7 @@ import {
 import { createLazyProxy } from "@/util/proxies";
 import { Unsubscribe } from "nanoevents";
 import { computed, Ref, unref } from "vue";
-import { Link } from "./links";
+import { Link } from "../links";
 
 export const BoardType = Symbol("Board");
 
diff --git a/src/features/buyable.tsx b/src/features/buyable.tsx
index 9eb0aaf..3df26e6 100644
--- a/src/features/buyable.tsx
+++ b/src/features/buyable.tsx
@@ -1,5 +1,5 @@
-import ClickableComponent from "@/components/features/Clickable.vue";
-import { Resource } from "@/features/resource";
+import ClickableComponent from "@/features/clickables/Clickable.vue";
+import { Resource } from "@/features/resources/resource";
 import Decimal, { DecimalSource, format, formatWhole } from "@/util/bignum";
 import {
     Computable,
diff --git a/src/components/features/Challenge.vue b/src/features/challenges/Challenge.vue
similarity index 97%
rename from src/components/features/Challenge.vue
rename to src/features/challenges/Challenge.vue
index 11a8e47..6af08fb 100644
--- a/src/components/features/Challenge.vue
+++ b/src/features/challenges/Challenge.vue
@@ -28,7 +28,7 @@
 
 <script lang="tsx">
 import "@/components/common/features.css";
-import { GenericChallenge } from "@/features/challenge";
+import { GenericChallenge } from "@/features/challenges/challenge";
 import { jsx, StyleValue, Visibility } from "@/features/feature";
 import { getHighNotifyStyle, getNotifyStyle } from "@/game/notifications";
 import { coerceComponent, isCoercableComponent, processedPropType, unwrapRef } from "@/util/vue";
@@ -43,8 +43,8 @@ import {
     UnwrapRef,
     watchEffect
 } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/challenge.ts b/src/features/challenges/challenge.ts
similarity index 98%
rename from src/features/challenge.ts
rename to src/features/challenges/challenge.ts
index b4e98d5..c8e9740 100644
--- a/src/features/challenge.ts
+++ b/src/features/challenges/challenge.ts
@@ -1,4 +1,4 @@
-import ChallengeComponent from "@/components/features/Challenge.vue";
+import ChallengeComponent from "@/features/challenges/Challenge.vue";
 import {
     CoercableComponent,
     Component,
@@ -11,7 +11,8 @@ import {
     StyleValue,
     Visibility
 } from "@/features/feature";
-import { Resource } from "@/features/resource";
+import { GenericReset } from "@/features/reset";
+import { Resource } from "@/features/resources/resource";
 import { globalBus } from "@/game/events";
 import settings from "@/game/settings";
 import Decimal, { DecimalSource } from "@/util/bignum";
@@ -24,7 +25,6 @@ import {
 } from "@/util/computed";
 import { createLazyProxy } from "@/util/proxies";
 import { computed, Ref, unref } from "vue";
-import { GenericReset } from "./reset";
 
 export const ChallengeType = Symbol("ChallengeType");
 
diff --git a/src/components/features/Clickable.vue b/src/features/clickables/Clickable.vue
similarity index 95%
rename from src/components/features/Clickable.vue
rename to src/features/clickables/Clickable.vue
index 2b72928..d8b5b4a 100644
--- a/src/components/features/Clickable.vue
+++ b/src/features/clickables/Clickable.vue
@@ -30,7 +30,10 @@
 </template>
 
 <script lang="tsx">
-import { GenericClickable } from "@/features/clickable";
+import "@/components/common/features.css";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
+import { GenericClickable } from "@/features/clickables/clickable";
 import { jsx, StyleValue, Visibility } from "@/features/feature";
 import {
     coerceComponent,
@@ -49,9 +52,6 @@ import {
     UnwrapRef,
     watchEffect
 } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
-import "@/components/common/features.css";
 
 export default defineComponent({
     props: {
diff --git a/src/features/clickable.ts b/src/features/clickables/clickable.ts
similarity index 98%
rename from src/features/clickable.ts
rename to src/features/clickables/clickable.ts
index bf7fcda..df991ca 100644
--- a/src/features/clickable.ts
+++ b/src/features/clickables/clickable.ts
@@ -1,4 +1,4 @@
-import ClickableComponent from "@/components/features/Clickable.vue";
+import ClickableComponent from "@/features/clickables/Clickable.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/features/conversion.ts b/src/features/conversion.ts
index 66ca732..bd46b2f 100644
--- a/src/features/conversion.ts
+++ b/src/features/conversion.ts
@@ -9,7 +9,7 @@ import {
 import { createLazyProxy } from "@/util/proxies";
 import { computed, isRef, Ref, unref } from "vue";
 import { Replace, setDefault } from "./feature";
-import { Resource } from "./resource";
+import { Resource } from "./resources/resource";
 
 export interface ConversionOptions {
     scaling: ScalingFunction;
diff --git a/src/components/features/Grid.vue b/src/features/grids/Grid.vue
similarity index 97%
rename from src/components/features/Grid.vue
rename to src/features/grids/Grid.vue
index f496384..d8f7f91 100644
--- a/src/components/features/Grid.vue
+++ b/src/features/grids/Grid.vue
@@ -17,14 +17,14 @@
 </template>
 
 <script lang="ts">
+import "@/components/common/table.css";
+import themes from "@/data/themes";
 import { Visibility } from "@/features/feature";
-import { GridCell } from "@/features/grid";
+import { GridCell } from "@/features/grids/grid";
+import settings from "@/game/settings";
 import { processedPropType } from "@/util/vue";
 import { computed, defineComponent, unref } from "vue";
 import GridCellVue from "./GridCell.vue";
-import "@/components/common/table.css";
-import settings from "@/game/settings";
-import themes from "@/data/themes";
 
 export default defineComponent({
     props: {
diff --git a/src/components/features/GridCell.vue b/src/features/grids/GridCell.vue
similarity index 97%
rename from src/components/features/GridCell.vue
rename to src/features/grids/GridCell.vue
index 741befb..fb88b67 100644
--- a/src/components/features/GridCell.vue
+++ b/src/features/grids/GridCell.vue
@@ -24,6 +24,8 @@
 </template>
 
 <script lang="ts">
+import "@/components/common/features.css";
+import LinkNode from "@/components/links/LinkNode.vue";
 import { CoercableComponent, StyleValue, Visibility } from "@/features/feature";
 import {
     computeComponent,
@@ -32,8 +34,6 @@ import {
     setupHoldToClick
 } from "@/util/vue";
 import { defineComponent, PropType, toRefs, unref } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import "@/components/common/features.css";
 
 export default defineComponent({
     props: {
diff --git a/src/features/grid.ts b/src/features/grids/grid.ts
similarity index 99%
rename from src/features/grid.ts
rename to src/features/grids/grid.ts
index 1e403b2..8081642 100644
--- a/src/features/grid.ts
+++ b/src/features/grids/grid.ts
@@ -1,4 +1,4 @@
-import GridComponent from "@/components/features/Grid.vue";
+import GridComponent from "@/features/grids/Grid.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/Infobox.vue b/src/features/infoboxes/Infobox.vue
similarity index 98%
rename from src/components/features/Infobox.vue
rename to src/features/infoboxes/Infobox.vue
index de6275f..3b5f4b8 100644
--- a/src/components/features/Infobox.vue
+++ b/src/features/infoboxes/Infobox.vue
@@ -29,13 +29,13 @@
 </template>
 
 <script lang="ts">
+import LinkNode from "@/components/links/LinkNode.vue";
 import themes from "@/data/themes";
 import { CoercableComponent, Visibility } from "@/features/feature";
 import settings from "@/game/settings";
 import { computeComponent, processedPropType } from "@/util/vue";
 import CollapseTransition from "@ivanv/vue-collapse-transition/src/CollapseTransition.vue";
 import { computed, defineComponent, PropType, Ref, StyleValue, toRefs, unref } from "vue";
-import LinkNode from "../system/LinkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/infobox.ts b/src/features/infoboxes/infobox.ts
similarity index 98%
rename from src/features/infobox.ts
rename to src/features/infoboxes/infobox.ts
index bcf82ed..d86a22e 100644
--- a/src/features/infobox.ts
+++ b/src/features/infoboxes/infobox.ts
@@ -1,4 +1,4 @@
-import InfoboxComponent from "@/components/features/Infobox.vue";
+import InfoboxComponent from "@/features/infoboxes/Infobox.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/Milestone.vue b/src/features/milestones/Milestone.vue
similarity index 96%
rename from src/components/features/Milestone.vue
rename to src/features/milestones/Milestone.vue
index fb422df..8771f01 100644
--- a/src/components/features/Milestone.vue
+++ b/src/features/milestones/Milestone.vue
@@ -15,12 +15,12 @@
 </template>
 
 <script lang="tsx">
+import "@/components/common/features.css";
 import { jsx, StyleValue, Visibility } from "@/features/feature";
-import { GenericMilestone } from "@/features/milestone";
+import { GenericMilestone } from "@/features/milestones/milestone";
 import { coerceComponent, isCoercableComponent, processedPropType, unwrapRef } from "@/util/vue";
 import { Component, defineComponent, shallowRef, toRefs, unref, UnwrapRef, watchEffect } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import "@/components/common/features.css";
+import LinkNode from "../../components/links/LinkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/milestone.tsx b/src/features/milestones/milestone.tsx
similarity index 98%
rename from src/features/milestone.tsx
rename to src/features/milestones/milestone.tsx
index b30c85f..ea9a3c8 100644
--- a/src/features/milestone.tsx
+++ b/src/features/milestones/milestone.tsx
@@ -1,4 +1,4 @@
-import MilestoneComponent from "@/components/features/Milestone.vue";
+import MilestoneComponent from "@/features/milestones/Milestone.vue";
 import {
     CoercableComponent,
     Component,
diff --git a/src/components/features/MainDisplay.vue b/src/features/resources/MainDisplay.vue
similarity index 89%
rename from src/components/features/MainDisplay.vue
rename to src/features/resources/MainDisplay.vue
index a829e66..6fc28fe 100644
--- a/src/components/features/MainDisplay.vue
+++ b/src/features/resources/MainDisplay.vue
@@ -11,11 +11,11 @@
 
 <script setup lang="ts">
 import { CoercableComponent } from "@/features/feature";
-import { Resource } from "@/features/resource";
+import { Resource } from "@/features/resources/resource";
 import Decimal from "@/util/bignum";
 import { computeOptionalComponent } from "@/util/vue";
 import { computed, Ref, StyleValue, toRefs } from "vue";
-import ResourceVue from "../system/Resource.vue";
+import ResourceVue from "@/features/resources/Resource.vue";
 
 const _props = defineProps<{
     resource: Resource;
diff --git a/src/components/system/Resource.vue b/src/features/resources/Resource.vue
similarity index 81%
rename from src/components/system/Resource.vue
rename to src/features/resources/Resource.vue
index 408957a..8485869 100644
--- a/src/components/system/Resource.vue
+++ b/src/features/resources/Resource.vue
@@ -5,7 +5,7 @@
 </template>
 
 <script setup lang="ts">
-import { displayResource, Resource } from "@/features/resource";
+import { displayResource, Resource } from "@/features/resources/resource";
 import { computed } from "vue";
 
 const props = defineProps<{
diff --git a/src/features/resource.ts b/src/features/resources/resource.ts
similarity index 100%
rename from src/features/resource.ts
rename to src/features/resources/resource.ts
diff --git a/src/components/features/Tab.vue b/src/features/tabs/Tab.vue
similarity index 100%
rename from src/components/features/Tab.vue
rename to src/features/tabs/Tab.vue
diff --git a/src/components/features/TabButton.vue b/src/features/tabs/TabButton.vue
similarity index 100%
rename from src/components/features/TabButton.vue
rename to src/features/tabs/TabButton.vue
diff --git a/src/components/features/TabFamily.vue b/src/features/tabs/TabFamily.vue
similarity index 96%
rename from src/components/features/TabFamily.vue
rename to src/features/tabs/TabFamily.vue
index 058827b..0592a2a 100644
--- a/src/components/features/TabFamily.vue
+++ b/src/features/tabs/TabFamily.vue
@@ -30,10 +30,12 @@
 </template>
 
 <script lang="ts">
+import Sticky from "@/components/layout/Sticky.vue";
 import themes from "@/data/themes";
 import { CoercableComponent, StyleValue, Visibility } from "@/features/feature";
-import { GenericTab } from "@/features/tab";
-import { GenericTabButton } from "@/features/tabFamily";
+import { GenericTab } from "@/features/tabs/tab";
+import TabButton from "@/features/tabs/TabButton.vue";
+import { GenericTabButton } from "@/features/tabs/tabFamily";
 import settings from "@/game/settings";
 import { coerceComponent, isCoercableComponent, processedPropType, unwrapRef } from "@/util/vue";
 import {
@@ -47,8 +49,6 @@ import {
     unref,
     watchEffect
 } from "vue";
-import Sticky from "../system/Sticky.vue";
-import TabButton from "./TabButton.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/tab.ts b/src/features/tabs/tab.ts
similarity index 94%
rename from src/features/tab.ts
rename to src/features/tabs/tab.ts
index 86218db..49a1e8a 100644
--- a/src/features/tab.ts
+++ b/src/features/tabs/tab.ts
@@ -1,6 +1,3 @@
-import TabComponent from "@/components/features/Tab.vue";
-import { Computable, GetComputableType } from "@/util/computed";
-import { createLazyProxy } from "@/util/proxies";
 import {
     CoercableComponent,
     Component,
@@ -8,7 +5,10 @@ import {
     getUniqueID,
     Replace,
     StyleValue
-} from "./feature";
+} from "@/features/feature";
+import TabComponent from "@/features/tabs/Tab.vue";
+import { Computable, GetComputableType } from "@/util/computed";
+import { createLazyProxy } from "@/util/proxies";
 
 export const TabType = Symbol("Tab");
 
diff --git a/src/features/tabFamily.ts b/src/features/tabs/tabFamily.ts
similarity index 96%
rename from src/features/tabFamily.ts
rename to src/features/tabs/tabFamily.ts
index c0eba79..871f7bd 100644
--- a/src/features/tabFamily.ts
+++ b/src/features/tabs/tabFamily.ts
@@ -1,14 +1,3 @@
-import TabButtonComponent from "@/components/features/TabButton.vue";
-import TabFamilyComponent from "@/components/features/TabFamily.vue";
-import {
-    Computable,
-    GetComputableType,
-    GetComputableTypeWithDefault,
-    processComputable,
-    ProcessedComputable
-} from "@/util/computed";
-import { createLazyProxy } from "@/util/proxies";
-import { computed, Ref, unref } from "vue";
 import {
     CoercableComponent,
     Component,
@@ -21,7 +10,18 @@ import {
     setDefault,
     StyleValue,
     Visibility
-} from "./feature";
+} from "@/features/feature";
+import TabButtonComponent from "@/features/tabs/TabButton.vue";
+import TabFamilyComponent from "@/features/tabs/TabFamily.vue";
+import {
+    Computable,
+    GetComputableType,
+    GetComputableTypeWithDefault,
+    processComputable,
+    ProcessedComputable
+} from "@/util/computed";
+import { createLazyProxy } from "@/util/proxies";
+import { computed, Ref, unref } from "vue";
 import { GenericTab } from "./tab";
 
 export const TabButtonType = Symbol("TabButton");
diff --git a/src/components/features/tree/Tree.vue b/src/features/trees/Tree.vue
similarity index 97%
rename from src/components/features/tree/Tree.vue
rename to src/features/trees/Tree.vue
index 0a1cd9f..1362909 100644
--- a/src/components/features/tree/Tree.vue
+++ b/src/features/trees/Tree.vue
@@ -29,7 +29,7 @@
 
 <script lang="ts">
 import "@/components/common/table.css";
-import { GenericTreeNode } from "@/features/tree";
+import { GenericTreeNode } from "@/features/trees/tree";
 import { processedPropType } from "@/util/vue";
 import { defineComponent, unref } from "vue";
 import TreeNode from "./TreeNode.vue";
diff --git a/src/components/features/tree/TreeNode.vue b/src/features/trees/TreeNode.vue
similarity index 96%
rename from src/components/features/tree/TreeNode.vue
rename to src/features/trees/TreeNode.vue
index 37e64db..97f639e 100644
--- a/src/components/features/tree/TreeNode.vue
+++ b/src/features/trees/TreeNode.vue
@@ -39,7 +39,9 @@
 </template>
 
 <script lang="ts">
-import TooltipVue from "@/components/system/Tooltip.vue";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
+import TooltipVue from "@/components/Tooltip.vue";
 import { CoercableComponent, StyleValue, Visibility } from "@/features/feature";
 import { gatherTooltipProps, Tooltip } from "@/features/tooltip";
 import { ProcessedComputable } from "@/util/computed";
@@ -60,8 +62,6 @@ import {
     unref,
     watchEffect
 } from "vue";
-import LinkNode from "../../system/LinkNode.vue";
-import MarkNode from "../MarkNode.vue";
 
 export default defineComponent({
     props: {
diff --git a/src/features/tree.ts b/src/features/trees/tree.ts
similarity index 97%
rename from src/features/tree.ts
rename to src/features/trees/tree.ts
index 32577b9..8b634e9 100644
--- a/src/features/tree.ts
+++ b/src/features/trees/tree.ts
@@ -1,4 +1,3 @@
-import TreeComponent from "@/components/features/tree/Tree.vue";
 import {
     CoercableComponent,
     Component,
@@ -10,7 +9,11 @@ import {
     StyleValue,
     Visibility
 } from "@/features/feature";
-import { displayResource, Resource } from "@/features/resource";
+import { Link } from "@/features/links";
+import { GenericReset } from "@/features/reset";
+import { displayResource, Resource } from "@/features/resources/resource";
+import { Tooltip } from "@/features/tooltip";
+import TreeComponent from "@/features/trees/Tree.vue";
 import { DecimalSource, format } from "@/util/bignum";
 import Decimal, { formatWhole } from "@/util/break_eternity";
 import {
@@ -23,9 +26,6 @@ import {
 } from "@/util/computed";
 import { createLazyProxy } from "@/util/proxies";
 import { computed, ref, Ref, unref } from "vue";
-import { Link } from "./links";
-import { GenericReset } from "./reset";
-import { Tooltip } from "./tooltip";
 
 export const TreeNodeType = Symbol("TreeNode");
 export const TreeType = Symbol("Tree");
diff --git a/src/components/features/Upgrade.vue b/src/features/upgrades/Upgrade.vue
similarity index 94%
rename from src/components/features/Upgrade.vue
rename to src/features/upgrades/Upgrade.vue
index 12f4a74..2d34548 100644
--- a/src/components/features/Upgrade.vue
+++ b/src/features/upgrades/Upgrade.vue
@@ -25,9 +25,12 @@
 </template>
 
 <script lang="tsx">
+import "@/components/common/features.css";
+import LinkNode from "@/components/links/LinkNode.vue";
+import MarkNode from "@/components/MarkNode.vue";
 import { jsx, StyleValue, Visibility } from "@/features/feature";
-import { displayResource, Resource } from "@/features/resource";
-import { GenericUpgrade } from "@/features/upgrade";
+import { displayResource, Resource } from "@/features/resources/resource";
+import { GenericUpgrade } from "@/features/upgrades/upgrade";
 import { DecimalSource } from "@/lib/break_eternity";
 import { coerceComponent, isCoercableComponent, processedPropType, unwrapRef } from "@/util/vue";
 import {
@@ -40,9 +43,6 @@ import {
     UnwrapRef,
     watchEffect
 } from "vue";
-import LinkNode from "../system/LinkNode.vue";
-import MarkNode from "./MarkNode.vue";
-import "@/components/common/features.css";
 
 export default defineComponent({
     props: {
diff --git a/src/features/upgrade.ts b/src/features/upgrades/upgrade.ts
similarity index 97%
rename from src/features/upgrade.ts
rename to src/features/upgrades/upgrade.ts
index db52c9e..1036c9a 100644
--- a/src/features/upgrade.ts
+++ b/src/features/upgrades/upgrade.ts
@@ -1,4 +1,4 @@
-import UpgradeComponent from "@/components/features/Upgrade.vue";
+import UpgradeComponent from "@/features/upgrades/Upgrade.vue";
 import {
     CoercableComponent,
     Component,
@@ -13,7 +13,7 @@ import {
     StyleValue,
     Visibility
 } from "@/features/feature";
-import { Resource } from "@/features/resource";
+import { Resource } from "@/features/resources/resource";
 import { GenericLayer } from "@/game/layers";
 import Decimal, { DecimalSource } from "@/util/bignum";
 import { isFunction } from "@/util/common";
diff --git a/src/util/vue.tsx b/src/util/vue.tsx
index f244e16..105e3c1 100644
--- a/src/util/vue.tsx
+++ b/src/util/vue.tsx
@@ -1,5 +1,5 @@
-import Col from "@/components/system/Column.vue";
-import Row from "@/components/system/Row.vue";
+import Col from "@/components/layout/Column.vue";
+import Row from "@/components/layout/Row.vue";
 import {
     CoercableComponent,
     Component as ComponentKey,