For TypeScript users, here are type definitions:
interface StylishActionHudAPI {
registerSystemAdapter(
systemId: string,
adapter: SystemAdapterClass | SystemAdapterInstance,
options?: AdapterRegistrationOptions
): AdapterEntry;
createSystemAdapter(
systemId: string,
options?: { fallbackSystemId?: string; context?: object }
): SystemAdapterInstance;
getRegisteredAdapters(systemId: string): AdapterEntry[];
listSystemAdapters(): [string, AdapterEntry[]][];
registerDefaultAttributes(
systemId: string,
data: AttributeConfig[] | ((context: object) => AttributeConfig[]),
options?: DefaultRegistrationOptions
): DefaultEntry;
registerDefaultLayout(
systemId: string,
data: LayoutConfig[] | ((context: object) => LayoutConfig[]),
options?: DefaultRegistrationOptions
): DefaultEntry;
registerDefaultStatusEffects(
systemId: string,
data: StatusEffectConfig[] | ((context: object) => StatusEffectConfig[]),
options?: DefaultRegistrationOptions
): DefaultEntry;
registerTrackableAttributes(
systemId: string,
data: TrackableAttribute[] | ((context: object) => TrackableAttribute[]),
options?: DefaultRegistrationOptions
): DefaultEntry;
registerActionMenuCategory(
category: ActionMenuCategory,
options?: CategoryRegistrationOptions
): CategoryEntry;
registerActionMenuSubMenu(
categoryId: string,
provider: SubMenuProvider,
options?: SubMenuRegistrationOptions
): SubMenuEntry;
registerTheme(
key: string,
themeData: ThemeDefinition
): ThemeDefinition | null;
getThemes(): Record<string, ThemeDefinition>;
onModifyActionMenuCategories(
callback: (categories: ActionMenuCategory[], actor: Actor) => void
): number;
onModifyActionMenuData(
callback: (data: SubMenuData, actor: Actor, categoryId: string) => void
): number;
updateConfiguration(
updates: Partial<Configuration>,
options?: { replace?: boolean }
): Promise<Configuration>;
updateClientPositions(
updates: Record<string, Position>,
options?: { replace?: boolean }
): Promise<Record<string, Position>>;
// Preset API
exportPreset(options?: ExportPresetOptions): Promise<Preset>;
importPreset(presetData: Preset, options?: ImportPresetOptions): Promise<ImportResult>;
downloadPreset(preset: Preset, filename?: string): void;
importPresetFromFile(options?: ImportPresetOptions): Promise<ImportResult>;
// Getter methods
getDefaultAttributes(systemId: string, adapter: any, options?: object): AttributeConfig[];
getDefaultLayout(systemId: string, adapter: any, options?: object): LayoutConfig[];
getDefaultStatusEffects(systemId: string, adapter: any, options?: object): StatusEffectConfig[];
getTrackableAttributes(systemId: string, adapter: any, options?: object): TrackableAttribute[];
// List methods
listDefaultAttributes(systemId?: string): DefaultEntry[] | [string, DefaultEntry[]][];
listDefaultLayouts(systemId?: string): DefaultEntry[] | [string, DefaultEntry[]][];
listDefaultStatusEffects(systemId?: string): DefaultEntry[] | [string, DefaultEntry[]][];
listTrackableAttributes(systemId?: string): DefaultEntry[] | [string, DefaultEntry[]][];
// Action Menu getters
getRegisteredActionMenuCategories(): CategoryEntry[];
getRegisteredActionMenuSubMenus(): SubMenuEntry[];
}
interface AdapterRegistrationOptions {
priority?: number;
source?: string;
isCompatible?: (context: object) => boolean;
}
interface DefaultRegistrationOptions {
priority?: number;
mode?: "replace" | "append" | "prepend";
source?: string;
isCompatible?: (context: object) => boolean;
}
interface CategoryRegistrationOptions {
priority?: number;
source?: string;
override?: boolean;
isCompatible?: (context: { actor: Actor }) => boolean;
}
interface ActionMenuCategory {
id: string;
label: string;
icon?: string;
img?: string;
type: "submenu" | "sheet" | "system";
cssClass?: string;
systemId?: string;
buttonImg?: string;
buttonScale?: number;
buttonX?: number;
buttonY?: number;
}
interface ThemeDefinition {
label: string;
defaults?: Record<string, number | string | boolean>;
sounds?: {
click?: string;
hover?: string;
};
[key: string]: unknown;
}
interface SubMenuData {
title: string;
theme?: string;
hasTabs?: boolean;
hasSubTabs?: boolean;
items: Record<string, SubMenuItem[]> | SubMenuItem[];
tabLabels?: Record<string, string>;
subTabLabels?: Record<string, Record<string, string>>;
}
interface SubMenuItem {
id: string;
name: string;
img?: string;
cost?: string;
description?: string;
isHeader?: boolean;
isFavorite?: boolean;
isPersonal?: boolean;
uses?: { value: number; max: number };
}
interface ExportPresetOptions {
includeTheme?: boolean;
includeGlobalAttributes?: boolean;
includeCustomMenu?: boolean;
includeActorPresets?: boolean;
}
interface ImportPresetOptions {
merge?: boolean;
skipSystemCheck?: boolean;
}
interface Preset {
meta: {
name: string;
description: string;
systemId: string;
systemTitle: string;
moduleVersion: string;
exportDate: string;
foundryVersion: string;
};
data: {
theme?: string;
globalAttributes?: AttributeConfig[];
customMenu?: object[];
actorPresets?: Record<string, object>;
};
macros: Record<string, MacroData>;
}
interface MacroData {
uuid: string;
name: string;
img: string;
type: string;
isCompendium: boolean;
command?: string;
}
interface ImportResult {
success: boolean;
error?: string;
macrosCreated?: string[];
macrosSkipped?: string[];
warnings?: string[];
actorPresetsImported?: number;
}