# Chandra - Perl bindings to webview-c
A Perl module for building cross-platform GUI applications using web technologies (HTML/CSS/JS) powered by [webview-c](https://github.com/javalikescript/webview-c).
## Synopsis
```perl
use Chandra;
# Simple usage - one liner
Chandra->new(
title => 'Hello World',
url => 'https://perl.org',
)->run;
# Using HTML directly
Chandra->new(
title => 'My App',
url => 'data:text/html,
Hello from Perl!
',
callback => sub {
my ($msg) = @_;
print "JavaScript sent: $msg\n";
},
)->run;
# Advanced: manual event loop
my $app = Chandra->new(
title => 'Counter',
url => 'data:text/html,
0
',
debug => 1,
);
$app->init;
my $count = 0;
while ($app->loop(0) == 0) {
# Non-blocking loop - could do other Perl work here
$app->eval_js(sprintf('document.getElementById("n").textContent = %d', ++$count));
select(undef, undef, undef, 0.1); # Sleep 100ms
}
$app->exit;
```
## Building
### Prerequisites
**macOS:**
- Xcode Command Line Tools (provides WebKit framework)
**Linux:**
```bash
sudo apt-get install libgtk-3-dev libwebkit2gtk-4.0-dev
```
**Windows:**
- MinGW with WebView2 SDK (see webview-c docs)
### Build Steps
```bash
# Build
perl Makefile.PL
make
make test
# Try it
perl -Mblib -e 'use Chandra; Chandra->new(title => "Test", url => "https://perl.org")->run'
```
## API
### Chandra->new(%opts)
Create a new Chandra instance.
| Option | Default | Description |
|--------|---------|-------------|
| title | 'Chandra' | Window title |
| url | 'about:blank' | Initial URL or data: URI |
| width | 800 | Window width |
| height | 600 | Window height |
| resizable | 1 | Allow window resizing |
| debug | 0 | Enable dev tools (right-click inspect) |
| callback | undef | Perl sub for JS -> Perl calls |
### Methods
- `$app->run()` - Simple blocking run
- `$app->init()` - Initialize for manual loop control
- `$app->loop($blocking)` - Process events (returns non-zero to exit)
- `$app->eval_js($code)` - Execute JavaScript
- `$app->set_title($title)` - Change window title
- `$app->terminate()` - Signal loop to exit
- `$app->exit()` - Cleanup
### JS -> Perl Communication
Call `window.external.invoke("message")` from JavaScript. The callback receives the string.
```perl
Chandra->new(
url => 'data:text/html,',
callback => sub {
my $data = decode_json($_[0]);
# Handle $data->{action}
},
)->run;
```
## License
MIT