/**
* Button Generator - Main Application File
*
* This demonstrates how to use the modular button generator system.
* Effects are imported and registered with the generator.
*/
import { ButtonGenerator } from "./button-generator-core.js";
import { UIBuilder } from "./ui-builder.js";
// Import effects (each effect file exports a register() function)
import * as solidBg from "./effects/background-solid.js";
import * as gradientBg from "./effects/background-gradient.js";
import * as textureBg from "./effects/background-texture.js";
import * as emojiWallpaper from "./effects/background-emoji-wallpaper.js";
import * as externalImage from "./effects/background-external-image.js";
import * as rainbowBg from "./effects/background-rainbow.js";
import * as rain from "./effects/background-rain.js";
import * as starfield from "./effects/background-starfield.js";
//import * as bubbles from "./effects/background-bubbles.js";
import * as aurora from "./effects/background-aurora.js";
import * as fire from "./effects/background-fire.js";
import * as border from "./effects/border.js";
import * as standardText from "./effects/text-standard.js";
import * as textShadow from "./effects/text-shadow.js";
import * as waveText from "./effects/wave-text.js";
import * as rainbowText from "./effects/rainbow-text.js";
import * as flashText from "./effects/flash-text.js";
import * as spinText from "./effects/spin-text.js";
import * as tickerText from "./effects/ticker-text.js";
import * as glitch from "./effects/glitch.js";
import * as pulse from "./effects/pulse.js";
import * as shimmer from "./effects/shimmer.js";
import * as scanline from "./effects/scanline.js";
import * as rgbSplit from "./effects/rgb-split.js";
import * as noise from "./effects/noise.js";
import * as rotate from "./effects/rotate.js";
import * as hologram from "./effects/hologram.js";
import * as spotlight from "./effects/spotlight.js";
import * as sparkle from "./effects/background-sparkle.js";
import * as textGlow from "./effects/text-glow.js";
import * as plasma from "./effects/background-plasma.js";
import * as emboss from "./effects/emboss.js";
import * as bounceText from "./effects/text-bounce.js";
/**
* Initialize the button generator application
*/
export function init() {
// Wait for DOM to be ready
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", setupApp);
} else {
setupApp();
}
}
/**
* Setup the application
*/
async function setupApp() {
console.log("Initializing Button Generator...");
// Setup collapsible sections
setupCollapsible();
// Get canvas
const canvas = document.getElementById("button-canvas");
if (!canvas) {
console.error("Canvas element not found!");
return;
}
// Create button generator
const generator = new ButtonGenerator(canvas, {
fps: 20,
duration: 2,
fonts: [
"Arial",
"Lato",
"Roboto",
"Open Sans",
"Montserrat",
"Oswald",
"Bebas Neue",
"Roboto Mono",
"VT323",
"Press Start 2P",
"DSEG7-Classic",
],
});
// Register all effects
console.log("Registering effects...");
solidBg.register(generator);
gradientBg.register(generator);
textureBg.register(generator);
emojiWallpaper.register(generator);
externalImage.register(generator);
rainbowBg.register(generator);
rain.register(generator);
starfield.register(generator);
//bubbles.register(generator);
aurora.register(generator);
fire.register(generator);
border.register(generator);
standardText.register(generator);
textShadow.register(generator);
waveText.register(generator);
rainbowText.register(generator);
flashText.register(generator);
spinText.register(generator);
tickerText.register(generator);
glitch.register(generator);
pulse.register(generator);
shimmer.register(generator);
scanline.register(generator);
rgbSplit.register(generator);
noise.register(generator);
rotate.register(generator);
hologram.register(generator);
spotlight.register(generator);
sparkle.register(generator);
textGlow.register(generator);
plasma.register(generator);
emboss.register(generator);
bounceText.register(generator);
console.log(`Registered ${generator.getAllEffects().length} effects`);
// Build UI from effects
console.log("Building UI...");
const controlsContainer = document.querySelector(".controls-section");
if (!controlsContainer) {
console.error("Controls container not found!");
return;
}
const uiBuilder = new UIBuilder(controlsContainer);
uiBuilder.buildUI(generator.getAllEffects());
uiBuilder.setupConditionalVisibility();
// Add GIF export settings at the bottom
addGifExportSettings(controlsContainer, generator);
// Preload fonts
console.log("Loading fonts...");
await generator.preloadFonts();
// Bind controls (after UI is built)
generator.bindControls();
// Setup additional UI handlers
setupUIHandlers(generator);
// Setup download button
setupDownloadButton(generator);
// Setup presets
setupPresets(generator);
// Initial draw
generator.updatePreview();
console.log("Button Generator ready!");
}
/**
* Add GIF export settings controls
*/
function addGifExportSettings(container, generator) {
const groupDiv = document.createElement('div');
groupDiv.className = 'control-group collapsed';
// Header
const header = document.createElement('h3');
header.className = 'control-group-header';
header.textContent = 'Advanced Settings';
groupDiv.appendChild(header);
const controlsDiv = document.createElement('div');
controlsDiv.className = 'control-group-controls';
// Color count control
const colorsWrapper = document.createElement('div');
colorsWrapper.className = 'control-wrapper';
colorsWrapper.innerHTML = `
Note: This only affects frame-by-frame settings, i.e. 8 colours would be 8 colours per frame. I am working on a solution for this.