Add foundation of the application and templates

This commit is contained in:
Oliver 2026-02-15 18:40:40 -07:00
parent a014bb8e6c
commit 60034dcee2
8 changed files with 165 additions and 0 deletions

View file

@ -76,6 +76,11 @@
"name": "Hotbar Settings",
"hint": "Tweaks that modify Foundry's hotbar",
"label": "Configure Hotbar"
},
"rearrangeSidebarTabs": {
"name": "Rearrange Sidebar Tabs",
"hint": "(v13+) Allows you to customize the order the right-hand sidebar tabs appear in. Including module-added sidebar tabs.",
"label": "Change Tab Order"
}
},
"keybindings": {
@ -92,6 +97,9 @@
"no-status-effects": "No status effects detected, this is most likely due to your game system or other modules.",
"remove-override": "Remove custom override",
"select-using-image-tagger": "Select using Image Tagger"
},
"SidebarTabRearranger": {
"title": "Rearrange Sidebar Tabs"
}
},
"notifs": {

View file

@ -0,0 +1,72 @@
import { __ID__, filePath } from "../consts.mjs";
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
const { getDocumentClass } = foundry.utils;
export class SidebarTabRearranger extends HandlebarsApplicationMixin(ApplicationV2) {
// #region Options
static DEFAULT_OPTIONS = {
tag: `form`,
classes: [
__ID__,
`SidebarTabRearranger`,
],
window: {
title: `OFT.apps.SidebarTabRearranger.title`,
},
position: {},
form: {
handler: this.#onSubmit,
closeOnSubmit: true,
submitOnChange: false,
},
actions: {},
};
static PARTS = {
list: { template: filePath(`templates/SidebarTabRearranger/list.hbs`) },
footer: { template: filePath(`templates/SidebarTabRearranger/footer.hbs`) },
};
// #endregion Options
// #region Instance Data
// #endregion Instance Data
// #region Lifecycle
/** @this {SidebarTabRearranger} */
static async #onSubmit() {};
// #endregion Lifecycle
// #region Data Prep
async _prepareContext() {
const ctx = {
meta: {
idp: this.id,
},
};
const tabs = ui.sidebar.constructor.TABS;
ctx.tabs = [];
for (const [id, tab] of Object.entries(tabs)) {
let { documentName, gmOnly, tooltip, icon } = tab;
if (gmOnly && !game.user.isGM) { continue };
if (documentName) {
tooltip ??= getDocumentClass(documentName).metadata.labelPlural;
icon ??= CONFIG[documentName]?.sidebarIcon;
};
ctx.tabs.push({
id,
name: game.i18n.localize(tooltip),
icon,
});
};
return ctx;
};
// #endregion Data Prep
// #region Actions
// #endregion Actions
};

View file

@ -10,6 +10,7 @@ import { hotbarButtonGap } from "../tweaks/hotbarButtonGap.mjs";
import { hotbarButtonSize } from "../tweaks/hotbarButtonSize.mjs";
import { preventTokenRotation } from "../tweaks/preventTokenRotation.mjs";
import { preventUserConfigOpen } from "../tweaks/preventUserConfigOpen.mjs";
import { rearrangeSidebarTabs } from "../tweaks/rearrangeSidebarTabs.mjs";
import { repositionHotbar } from "../tweaks/repositionHotbar.mjs";
import { startingSidebarTab } from "../tweaks/startingSidebarTab.mjs";
import { startSidebarExpanded } from "../tweaks/startSidebarExpanded.mjs";
@ -50,6 +51,7 @@ Hooks.on(`setup`, () => {
repositionHotbar();
customStatusIcons();
rearrangeSidebarTabs();
chatImageLinks();
chatSidebarBackground();
startSidebarExpanded();

View file

@ -0,0 +1,35 @@
import { SettingStatusEnum, status } from "../utils/SettingStatus.mjs";
import { __ID__ } from "../consts.mjs";
import { Logger } from "../utils/Logger.mjs";
import { preventTweakRegistration } from "../utils/preRegisterTweak.mjs";
import { SidebarTabRearranger } from "../apps/SidebarTabRearranger.mjs";
export const key = `rearrangeSidebarTabs`;
export function rearrangeSidebarTabs() {
status[key] = SettingStatusEnum.Unknown;
if (preventTweakRegistration(key)) { return };
// #region Registration
Logger.log(`Registering tweak: ${key}`);
game.settings.registerMenu(__ID__, `${key}Menu`, {
name: `OFT.menu.${key}.name`,
hint: `OFT.menu.${key}.hint`,
label: `OFT.menu.${key}.label`,
restricted: false,
type: SidebarTabRearranger,
});
game.settings.register(__ID__, key, {
scope: `user`,
config: false,
type: Array,
default: [],
});
// #endregion Registration
// #region Implementation
// TODO: do this
// #endregion Implementation
status[key] = SettingStatusEnum.Registered;
};

View file

@ -0,0 +1,29 @@
.oft.SidebarTabRearranger {
ol {
display: flex;
flex-direction: column;
gap: 8px;
list-style-type: none;
margin: 0;
padding: 0;
}
li {
display: flex;
flex-direction: row;
align-items: center;
gap: 12px;
cursor: var(--cursor-grab);
}
.emulate-button {
--size: 32px;
display: flex;
justify-content: center;
align-items: center;
height: var(--size);
aspect-ratio: 1;
border: 1px solid var(--color-light-5);
border-radius: 4px;
}
}

View file

@ -6,6 +6,7 @@
@import url("./repositionHotbar.css") layer(tweaks);
@import url("./apps/common.css") layer(apps);
@import url("./apps/SidebarTabRearranger.css") layer(apps);
@import url("./apps/StatusEffectIconConfig.css") layer(apps);
/* Make the chat sidebar the same width as all the other tabs */

View file

@ -0,0 +1,3 @@
<footer>
<button>Submit</button>
</footer>

View file

@ -0,0 +1,15 @@
<main>
<ol>
{{#each tabs as | tab |}}
<li>
<span class="emulate-button {{tab.icon}}"></span>
<span>{{tab.name}}</span>
<div style="flex-grow: 1"></div>
<oft-icon
name="icons/drag-handle"
var:fill="currentColor"
></oft-icon>
</li>
{{/each}}
</ol>
</main>