using Astralis; using Invercargill; using Invercargill.DataStructures; using Inversion; using Spry; /** * HomePage - The main landing page * * Eye-catching hero section with gradient text, * feature highlights, and call-to-action buttons */ public class HomePage : PageComponent { public const string ROUTE = "/"; private ComponentFactory factory = inject(); public override string markup { get { return """
⚡ Free & Open Source

Build Modern Web Apps in Vala

Spry is a component-based web framework featuring HTMX integration, reactive templates, and dependency injection. Fast, type-safe, and elegant.

100%
Type-Safe Vala
0
JavaScript Required
Possibilities
FREE
Forever

Why Choose Spry?

Build powerful web applications with a framework designed for developer happiness

Clean, Intuitive Code

Write components that are easy to understand and maintain

Vala
class CounterComponent : Component {
    private int count = 0;

    public override string markup {
        owned get {
            // Use spry-action for interactivity
            return @"Counter: $(count)
                [Button: spry-action=':Increment' +]
                [Button: spry-action=':Decrement' -]";
        }
    }

    public async override void handle_action(string action) {
        if (action == "Increment") count++;
        else if (action == "Decrement") count--;
    }
}
🕊

Free as in Freedom

Spry is Free/Libre Open Source Software. Use it, study it, modify it, and share it freely. Built by the community, for the community.

"""; }} public override async void prepare() throws Error { var features = new Series(); var feature1 = factory.create(); feature1.icon = "purple"; feature1.icon_emoji = "⚡"; feature1.title = "HTMX Integration"; feature1.description = "Build dynamic UIs without writing JavaScript. HTMX handles the complexity, you handle the logic."; features.add(feature1); var feature2 = factory.create(); feature2.icon = "blue"; feature2.icon_emoji = "🔧"; feature2.title = "Dependency Injection"; feature2.description = "Clean architecture with Inversion of Control. Inject services, stores, and components effortlessly."; features.add(feature2); var feature3 = factory.create(); feature3.icon = "green"; feature3.icon_emoji = "🎨"; feature3.title = "Reactive Templates"; feature3.description = "Declarative templates with outlets and automatic updates. Your UI stays in sync with your data."; features.add(feature3); var feature4 = factory.create(); feature4.icon = "purple"; feature4.icon_emoji = "🔒"; feature4.title = "Type-Safe"; feature4.description = "Full Vala type safety means fewer runtime errors. The compiler catches bugs before you do."; features.add(feature4); var feature5 = factory.create(); feature5.icon = "blue"; feature5.icon_emoji = "🚀"; feature5.title = "High Performance"; feature5.description = "Built on Astralis for maximum throughput. Native code performance with web framework convenience."; features.add(feature5); var feature6 = factory.create(); feature6.icon = "green"; feature6.icon_emoji = "📦"; feature6.title = "Modular Design"; feature6.description = "Use what you need, extend what you want. Clean separation of concerns at every level."; features.add(feature6); set_outlet_children("features", features); } }