1import 'package:flutter/material.dart';
2import 'package:wilvra/api.dart';
3
4void main() => runApp(const WilvraApp());
5
6class WilvraApp extends StatelessWidget {
7 const WilvraApp({super.key});
8 @override
9 Widget build(BuildContext context) {
10 return MaterialApp(
11 title: 'MaxPrep',
12 theme: ThemeData(useMaterial3: true),
13 home: const LibraryScreen(),
14 );
15 }
16}
17
18class LibraryScreen extends StatelessWidget {
19 const LibraryScreen({super.key});
20 @override
21 Widget build(BuildContext context) {
22 return Scaffold(
23 appBar: AppBar(title: const Text('Library')),
24 body: FutureBuilder(
25 future: Api.books(),
26 builder: (context, snap) => ListView(
27 children: [for (final b in snap.data ?? []) BookTile(b)],
28 ),
29 ),
30 );
31 }
32} // Software shipped
1import { createApp } from 'wilvra';
2import { api, analytics } from './services';
3
4const app = createApp({
5 name: 'MaxPrep',
6 platform: ['ios', 'android', 'web'],
7 theme: { brand: '#0055fe' },
8});
9
10app.route('/library', async () => {
11 const books = await api.get('/books');
12 return render(Library, { books });
13});
14
15app.route('/book/:id', async ({ id }) => {
16 const book = await api.get(`/books/${id}`);
17 return render(Reader, { book });
18});
19
20app.use(auth({ provider: 'google' }));
21app.use(payments({ currency: 'NGN' }));
22
23app.on('ready', () => {
24 analytics.track('launch');
25});
26
27app.on('error', (err) => {
28 logger.report(err);
29});
30
31app.deploy({ region: 'eu-west' });
32export default app; // live
1:root {
2 --brand: #0055fe;
3 --ink: #0a0a0a;
4 --radius: 12px;
5}
6
7.library {
8 display: grid;
9 grid-template-columns: repeat(3, 1fr);
10 gap: 16px;
11}
12
13.book {
14 border-radius: var(--radius);
15 background: var(--brand);
16 transition: transform .3s ease;
17}
18
19.book:hover {
20 transform: translateY(-4px);
21}
22
23.reader {
24 max-width: 680px;
25 margin: 0 auto;
26 line-height: 1.6;
27}
28
29@media (max-width: 600px) {
30 .library { grid-template-columns: 1fr; }
31}
32/* Problems solved */