# Gefest Framework
Gefest is a lightweight, TypeScript-based framework for building and managing HTML elements programmatically. It provides a class-based approach to create reusable UI components with built-in support for attributes, classes, styles, and event handling.
## Features
- **Class-based Element Creation**: Define HTML elements as TypeScript classes
- **Attribute Management**: Easy setting, getting, and removing of HTML attributes
- **CSS Class Handling**: Add and remove classes dynamically
- **Style System**: Extensible styling with custom style classes
- **Event Handling**: Built-in click event management with automatic re-rendering
- **Element Registration**: Automatic ID generation and DOM integration
- **Primitive Components**: Pre-built HTML element wrappers
- **Dynamic Updates**: Re-render elements on the fly
## Installation
Gefest is included as a module in this project. To use it in your TypeScript files:
```typescript
import { GefestEngine, GefestElement } from './engine';
import { GefestButton } from './primitives/button';
// ... other imports as needed
```
## Core Concepts
### GefestElement
The base abstract class for all Gefest elements. It provides:
- Content management (strings or nested elements)
- Attribute handling
- Class management
- Style application
- Event binding
- Automatic re-rendering on updates
### GefestEngine
Manages the lifecycle of Gefest elements:
- Registers elements with unique IDs
- Activates event handlers on DOM elements
- Provides the main entry point for applications
- Handles re-rendering of updated elements
### GefestStyle
Abstract base class for styling systems. Implement custom styles by extending this class.
## Basic Usage
### Creating Elements
```typescript
import { GefestButton } from './primitives/button';
// Create a simple button
const button = new GefestButton("Click me!");
console.log(button.build()); //
```
### Setting Attributes
```typescript
const button = new GefestButton("Submit");
button.setAttribute('type', 'submit');
button.setAttribute('disabled', 'true');
```
### Managing Classes
```typescript
const button = new GefestButton("Button");
button.addClass('btn');
button.addClass('btn-primary');
button.removeClass('btn');
console.log(button.getClassList()); // ['btn-primary']
```
### Hiding Elements
```typescript
const button = new GefestButton("Hidden Button");
button.isHidden = true; // Sets the 'hidden' attribute on the element
```
### Event Handling
```typescript
const button = new GefestButton("Click me!");
button.onClick = () => {
console.log('Button clicked!');
// The framework automatically re-renders after click
};
```
### Updating Elements
```typescript
const button = new GefestButton("Initial");
button.update(); // Re-renders the element in the DOM
```
### Running the Application
```typescript
import { GefestEngine } from './engine';
async function main() {
// Create and configure your elements here
const button = new GefestButton("Hello World");
button.onClick = () => alert('Hello!');
// Insert into DOM
document.body.innerHTML = button.build();
}
GefestEngine.main(main);
```
## Primitives
Gefest includes several pre-built primitive elements:
### GefestButton
Wraps HTML `