update
This commit is contained in:
parent
02b9fd8a53
commit
9de121aabf
20
README.md
20
README.md
@ -1,19 +1,3 @@
|
|||||||
# README
|
# RWKV-Runner
|
||||||
|
|
||||||
## About
|
In development
|
||||||
|
|
||||||
This is the official Wails React-TS template.
|
|
||||||
|
|
||||||
You can configure the project by editing `wails.json`. More information about the project settings can be found
|
|
||||||
here: https://wails.io/docs/reference/project-config
|
|
||||||
|
|
||||||
## Live Development
|
|
||||||
|
|
||||||
To run in live development mode, run `wails dev` in the project directory. This will run a Vite development
|
|
||||||
server that will provide very fast hot reload of your frontend changes. If you want to develop in a browser
|
|
||||||
and have access to your Go methods, there is also a dev server that runs on http://localhost:34115. Connect
|
|
||||||
to this in your browser, and you can call your Go code from devtools.
|
|
||||||
|
|
||||||
## Building
|
|
||||||
|
|
||||||
To build a redistributable, production mode package, use `wails build`.
|
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 102 KiB |
Binary file not shown.
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 147 KiB |
2000
frontend/package-lock.json
generated
2000
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -9,13 +9,20 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@fluentui/react-components": "^9.19.1",
|
||||||
|
"@fluentui/react-icons": "^2.0.201",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0"
|
"react-dom": "^18.2.0",
|
||||||
|
"react-router": "^6.11.0",
|
||||||
|
"react-router-dom": "^6.11.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/react": "^18.0.17",
|
"@types/react": "^18.0.17",
|
||||||
"@types/react-dom": "^18.0.6",
|
"@types/react-dom": "^18.0.6",
|
||||||
"@vitejs/plugin-react": "^2.0.1",
|
"@vitejs/plugin-react": "^2.0.1",
|
||||||
|
"autoprefixer": "^10.4.14",
|
||||||
|
"postcss": "^8.4.23",
|
||||||
|
"tailwindcss": "^3.3.2",
|
||||||
"typescript": "^4.6.4",
|
"typescript": "^4.6.4",
|
||||||
"vite": "^3.0.7"
|
"vite": "^3.0.7"
|
||||||
}
|
}
|
||||||
|
6
frontend/postcss.config.js
Normal file
6
frontend/postcss.config.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
@ -1,28 +1,85 @@
|
|||||||
import {useState} from 'react';
|
// reference: https://github.com/oliverschwendener/electron-fluent-ui
|
||||||
import logo from './assets/images/logo-universal.png';
|
//
|
||||||
import './App.css';
|
// MIT License
|
||||||
import {Greet} from "../wailsjs/go/main/App";
|
//
|
||||||
|
// Copyright (c) 2023 josStorer
|
||||||
|
// Copyright (c) 2023 oliverschwendener
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
|
||||||
function App() {
|
import {FluentProvider, Tab, TabList, webDarkTheme} from '@fluentui/react-components';
|
||||||
const [resultText, setResultText] = useState("Please enter your name below 👇");
|
import {FC, useEffect, useState} from 'react';
|
||||||
const [name, setName] = useState('');
|
import {Route, Routes, useLocation, useNavigate} from 'react-router';
|
||||||
const updateName = (e: any) => setName(e.target.value);
|
import {pages} from './Pages';
|
||||||
const updateResultText = (result: string) => setResultText(result);
|
|
||||||
|
|
||||||
function greet() {
|
const App: FC = () => {
|
||||||
Greet(name).then(updateResultText);
|
const navigate = useNavigate();
|
||||||
}
|
const location = useLocation();
|
||||||
|
|
||||||
return (
|
const [path, setPath] = useState<string>(pages[0].path);
|
||||||
<div id="App">
|
|
||||||
<img src={logo} id="logo" alt="logo"/>
|
const selectTab = (selectedPath: unknown) =>
|
||||||
<div id="result" className="result">{resultText}</div>
|
typeof selectedPath === 'string' ? navigate({pathname: selectedPath}) : null;
|
||||||
<div id="input" className="input-box">
|
|
||||||
<input id="name" className="input" onChange={updateName} autoComplete="off" name="input" type="text"/>
|
useEffect(() => setPath(location.pathname), [location]);
|
||||||
<button className="btn" onClick={greet}>Greet</button>
|
|
||||||
</div>
|
return (
|
||||||
|
<FluentProvider theme={webDarkTheme} className="h-screen">
|
||||||
|
<div className="flex h-full">
|
||||||
|
<div className="flex flex-col w-40 p-2 justify-between">
|
||||||
|
<TabList
|
||||||
|
size="large"
|
||||||
|
appearance="subtle"
|
||||||
|
selectedValue={path}
|
||||||
|
onTabSelect={(_, {value}) => selectTab(value)}
|
||||||
|
vertical
|
||||||
|
>
|
||||||
|
{pages.filter(page=>page.top).map(({label, path, icon}, index) => (
|
||||||
|
<Tab icon={icon} key={`${path}-${index}`} value={path}>
|
||||||
|
{label}
|
||||||
|
</Tab>
|
||||||
|
))}
|
||||||
|
</TabList>
|
||||||
|
<TabList
|
||||||
|
size="large"
|
||||||
|
appearance="subtle"
|
||||||
|
selectedValue={path}
|
||||||
|
onTabSelect={(_, {value}) => selectTab(value)}
|
||||||
|
vertical
|
||||||
|
>
|
||||||
|
{pages.filter(page=>!page.top).map(({label, path, icon}, index) => (
|
||||||
|
<Tab icon={icon} key={`${path}-${index}`} value={path}>
|
||||||
|
{label}
|
||||||
|
</Tab>
|
||||||
|
))}
|
||||||
|
</TabList>
|
||||||
</div>
|
</div>
|
||||||
)
|
<div className="h-full w-full p-2 box-border overflow-y-hidden">
|
||||||
}
|
<Routes>
|
||||||
|
{pages.map(({path, element}, index) => (
|
||||||
|
<Route key={`${path}-${index}`} path={path} element={element}/>
|
||||||
|
))}
|
||||||
|
</Routes>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</FluentProvider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export default App
|
export default App;
|
||||||
|
20
frontend/src/Pages/Configs.tsx
Normal file
20
frontend/src/Pages/Configs.tsx
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import {Checkbox, Input, Text} from '@fluentui/react-components';
|
||||||
|
import { FC } from "react";
|
||||||
|
import { Section } from "./Section";
|
||||||
|
|
||||||
|
export const Configs: FC = () => {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col box-border gap-5 p-2">
|
||||||
|
<Text size={600}>Configs</Text>
|
||||||
|
<Section
|
||||||
|
title="Shapes"
|
||||||
|
content={
|
||||||
|
<div className="flex gap-5">
|
||||||
|
<Input/>
|
||||||
|
<Checkbox label="Temp" shape="circular" />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
101
frontend/src/Pages/Home.tsx
Normal file
101
frontend/src/Pages/Home.tsx
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import {Text, Combobox, CompoundButton, Link, Option} from '@fluentui/react-components';
|
||||||
|
import React, {FC, ReactElement} from 'react';
|
||||||
|
import Banner from '../assets/images/banner.jpg';
|
||||||
|
import {
|
||||||
|
Chat20Regular,
|
||||||
|
DataUsageSettings20Regular,
|
||||||
|
DocumentSettings20Regular,
|
||||||
|
Storage20Regular
|
||||||
|
} from '@fluentui/react-icons';
|
||||||
|
|
||||||
|
type NavCard = {
|
||||||
|
label: string;
|
||||||
|
desc: string;
|
||||||
|
path: string;
|
||||||
|
icon: ReactElement;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const navCards:NavCard[] = [
|
||||||
|
{
|
||||||
|
label: 'Chat',
|
||||||
|
desc: 'Go to chat page',
|
||||||
|
path: '/chat',
|
||||||
|
icon: <Chat20Regular/>
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Configs',
|
||||||
|
desc: 'Manage your configs',
|
||||||
|
path: '/configs',
|
||||||
|
icon: <DocumentSettings20Regular/>
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Models',
|
||||||
|
desc: 'Manage models',
|
||||||
|
path: '/models',
|
||||||
|
icon: <DataUsageSettings20Regular/>
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Train',
|
||||||
|
desc: '',
|
||||||
|
path: '/train',
|
||||||
|
icon: <Storage20Regular/>
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
export const Home: FC = () => {
|
||||||
|
const [selectedConfig, setSelectedConfig] = React.useState('RWKV-3B-4G MEM');
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col justify-between h-full">
|
||||||
|
<img className="rounded-xl select-none" src={Banner}/>
|
||||||
|
<div className="flex flex-col gap-2">
|
||||||
|
<Text size={600} weight="medium">Introduction</Text>
|
||||||
|
<Text size={300}>
|
||||||
|
RWKV is an RNN with Transformer-level LLM performance, which can also be directly trained like a GPT
|
||||||
|
transformer (parallelizable). And it's 100% attention-free. You only need the hidden state at position t to
|
||||||
|
compute the state at position t+1. You can use the "GPT" mode to quickly compute the hidden state for the
|
||||||
|
"RNN" mode.
|
||||||
|
<br/>
|
||||||
|
So it's combining the best of RNN and transformer - great performance, fast inference, saves VRAM, fast
|
||||||
|
training, "infinite" ctx_len, and free sentence embedding (using the final hidden state).
|
||||||
|
</Text>
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-between">
|
||||||
|
{navCards.map(({label, path, icon, desc}, index) => (
|
||||||
|
<CompoundButton className="w-1/5" icon={icon} secondaryContent={desc} key={`${path}-${index}`} value={path}
|
||||||
|
size="large">
|
||||||
|
{label}
|
||||||
|
</CompoundButton>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-between">
|
||||||
|
<div className="flex gap-4 items-end">
|
||||||
|
Version: 1.0.0
|
||||||
|
<Link>Help</Link>
|
||||||
|
</div>
|
||||||
|
<div className="flex gap-3">
|
||||||
|
<Combobox placeholder="Config"
|
||||||
|
value={selectedConfig}
|
||||||
|
onOptionSelect={(_, data) => {
|
||||||
|
if (data.optionValue)
|
||||||
|
setSelectedConfig(data.optionValue);
|
||||||
|
}}>
|
||||||
|
<Option id="item-1" key="item-1">
|
||||||
|
RWKV-3B-4G MEM
|
||||||
|
</Option>
|
||||||
|
<Option id="item-2" key="item-2">
|
||||||
|
Item 2
|
||||||
|
</Option>
|
||||||
|
<Option id="item-3" key="item-3">
|
||||||
|
Item 3
|
||||||
|
</Option>
|
||||||
|
<Option id="item-4" key="item-4">
|
||||||
|
Item 4
|
||||||
|
</Option>
|
||||||
|
</Combobox>
|
||||||
|
<CompoundButton appearance="primary" size="large">Run</CompoundButton>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
11
frontend/src/Pages/Section.tsx
Normal file
11
frontend/src/Pages/Section.tsx
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { FC, ReactElement } from "react";
|
||||||
|
import { SectionTitle } from "./SectionTitle";
|
||||||
|
|
||||||
|
export const Section: FC<{ title: string; content: ReactElement }> = ({ title, content }) => {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col gap-5">
|
||||||
|
<SectionTitle label={title} />
|
||||||
|
{content}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
4
frontend/src/Pages/SectionTitle.tsx
Normal file
4
frontend/src/Pages/SectionTitle.tsx
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import { Text } from "@fluentui/react-components";
|
||||||
|
import { FC } from "react";
|
||||||
|
|
||||||
|
export const SectionTitle: FC<{ label: string }> = ({ label }) => <Text weight="medium">{label}</Text>;
|
69
frontend/src/Pages/index.tsx
Normal file
69
frontend/src/Pages/index.tsx
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import { ReactElement } from "react";
|
||||||
|
import { Configs } from "./Configs";
|
||||||
|
import {
|
||||||
|
Chat20Regular,
|
||||||
|
DataUsageSettings20Regular,
|
||||||
|
DocumentSettings20Regular,
|
||||||
|
Home20Regular, Info20Regular, Settings20Regular, Storage20Regular
|
||||||
|
} from '@fluentui/react-icons';
|
||||||
|
import {Home} from './Home';
|
||||||
|
|
||||||
|
type NavigationItem = {
|
||||||
|
label: string;
|
||||||
|
path: string;
|
||||||
|
icon: ReactElement;
|
||||||
|
element: ReactElement;
|
||||||
|
top: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const pages: NavigationItem[] = [
|
||||||
|
{
|
||||||
|
label: "Home",
|
||||||
|
path: "/",
|
||||||
|
icon:<Home20Regular />,
|
||||||
|
element: <Home />,
|
||||||
|
top: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Chat",
|
||||||
|
path: "/chat",
|
||||||
|
icon:<Chat20Regular />,
|
||||||
|
element: <Configs />,
|
||||||
|
top:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Configs",
|
||||||
|
path: "/configs",
|
||||||
|
icon:<DocumentSettings20Regular />,
|
||||||
|
element: <Configs />,
|
||||||
|
top:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Models",
|
||||||
|
path: "/models",
|
||||||
|
icon:<DataUsageSettings20Regular />,
|
||||||
|
element: <Configs />,
|
||||||
|
top:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Train",
|
||||||
|
path: "/train",
|
||||||
|
icon:<Storage20Regular />,
|
||||||
|
element: <Configs />,
|
||||||
|
top:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Settings",
|
||||||
|
path: "/settings",
|
||||||
|
icon:<Settings20Regular />,
|
||||||
|
element: <Configs />,
|
||||||
|
top:false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "About",
|
||||||
|
path: "/about",
|
||||||
|
icon:<Info20Regular />,
|
||||||
|
element: <Configs />,
|
||||||
|
top:false
|
||||||
|
}
|
||||||
|
];
|
@ -1,93 +0,0 @@
|
|||||||
Copyright 2016 The Nunito Project Authors (contact@sansoxygen.com),
|
|
||||||
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
||||||
This license is copied below, and is also available with a FAQ at:
|
|
||||||
http://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
||||||
-----------------------------------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
||||||
development of collaborative font projects, to support the font creation
|
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
|
||||||
open framework in which fonts may be shared and improved in partnership
|
|
||||||
with others.
|
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
|
||||||
redistributed and/or sold with any software provided that any reserved
|
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
|
||||||
however, cannot be released under any other type of license. The
|
|
||||||
requirement for fonts to remain under this license does not apply
|
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
|
||||||
copyright statement(s).
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
|
||||||
new environment.
|
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
|
||||||
redistributed and/or sold with any software, provided that each copy
|
|
||||||
contains the above copyright notice and this license. These can be
|
|
||||||
included either as stand-alone text files, human-readable headers or
|
|
||||||
in the appropriate machine-readable metadata fields within text or
|
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
|
||||||
presented to the users.
|
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
||||||
Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
|
||||||
must be distributed entirely under this license, and must not be
|
|
||||||
distributed under any other license. The requirement for fonts to
|
|
||||||
remain under this license does not apply to any document created
|
|
||||||
using the Font Software.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This license becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
Binary file not shown.
BIN
frontend/src/assets/images/banner.jpg
Normal file
BIN
frontend/src/assets/images/banner.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 MiB |
Binary file not shown.
Before Width: | Height: | Size: 136 KiB |
@ -2,13 +2,14 @@ import React from 'react'
|
|||||||
import {createRoot} from 'react-dom/client'
|
import {createRoot} from 'react-dom/client'
|
||||||
import './style.css'
|
import './style.css'
|
||||||
import App from './App'
|
import App from './App'
|
||||||
|
import {HashRouter} from 'react-router-dom';
|
||||||
|
|
||||||
const container = document.getElementById('root')
|
const container = document.getElementById('root')
|
||||||
|
|
||||||
const root = createRoot(container!)
|
const root = createRoot(container!)
|
||||||
|
|
||||||
root.render(
|
root.render(
|
||||||
<React.StrictMode>
|
<HashRouter>
|
||||||
<App/>
|
<App/>
|
||||||
</React.StrictMode>
|
</HashRouter>
|
||||||
)
|
)
|
||||||
|
@ -1,26 +1,8 @@
|
|||||||
html {
|
@tailwind base;
|
||||||
background-color: rgba(27, 38, 54, 1);
|
@tailwind components;
|
||||||
text-align: center;
|
@tailwind utilities;
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: white;
|
overflow: hidden;
|
||||||
font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
|
|
||||||
"Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
|
|
||||||
sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "Nunito";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
src: local(""),
|
|
||||||
url("assets/fonts/nunito-v16-latin-regular.woff2") format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
#app {
|
|
||||||
height: 100vh;
|
|
||||||
text-align: center;
|
|
||||||
}
|
}
|
||||||
|
12
frontend/tailwind.config.js
Normal file
12
frontend/tailwind.config.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/** @type {import('tailwindcss').Config} */
|
||||||
|
export default {
|
||||||
|
content: [
|
||||||
|
"./index.html",
|
||||||
|
"./src/**/*.{js,ts,jsx,tsx}",
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
extend: {},
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
}
|
||||||
|
|
2
frontend/wailsjs/go/main/App.d.ts
vendored
2
frontend/wailsjs/go/main/App.d.ts
vendored
@ -1,4 +1,4 @@
|
|||||||
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
// This file is automatically generated. DO NOT EDIT
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
export function Greet(arg1: string): Promise<string>;
|
export function Greet(arg1:string):Promise<string>;
|
||||||
|
@ -3,5 +3,5 @@
|
|||||||
// This file is automatically generated. DO NOT EDIT
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
|
||||||
export function Greet(arg1) {
|
export function Greet(arg1) {
|
||||||
return window['go']['main']['App']['Greet'](arg1);
|
return window['go']['main']['App']['Greet'](arg1);
|
||||||
}
|
}
|
||||||
|
42
frontend/wailsjs/runtime/runtime.d.ts
vendored
42
frontend/wailsjs/runtime/runtime.d.ts
vendored
@ -21,8 +21,8 @@ export interface Size {
|
|||||||
export interface Screen {
|
export interface Screen {
|
||||||
isCurrent: boolean;
|
isCurrent: boolean;
|
||||||
isPrimary: boolean;
|
isPrimary: boolean;
|
||||||
width: number
|
width : number
|
||||||
height: number
|
height : number
|
||||||
}
|
}
|
||||||
|
|
||||||
// Environment information such as platform, buildtype, ...
|
// Environment information such as platform, buildtype, ...
|
||||||
@ -38,19 +38,23 @@ export interface EnvironmentInfo {
|
|||||||
export function EventsEmit(eventName: string, ...data: any): void;
|
export function EventsEmit(eventName: string, ...data: any): void;
|
||||||
|
|
||||||
// [EventsOn](https://wails.io/docs/reference/runtime/events#eventson) sets up a listener for the given event name.
|
// [EventsOn](https://wails.io/docs/reference/runtime/events#eventson) sets up a listener for the given event name.
|
||||||
export function EventsOn(eventName: string, callback: (...data: any) => void): void;
|
export function EventsOn(eventName: string, callback: (...data: any) => void): () => void;
|
||||||
|
|
||||||
// [EventsOnMultiple](https://wails.io/docs/reference/runtime/events#eventsonmultiple)
|
// [EventsOnMultiple](https://wails.io/docs/reference/runtime/events#eventsonmultiple)
|
||||||
// sets up a listener for the given event name, but will only trigger a given number times.
|
// sets up a listener for the given event name, but will only trigger a given number times.
|
||||||
export function EventsOnMultiple(eventName: string, callback: (...data: any) => void, maxCallbacks: number): void;
|
export function EventsOnMultiple(eventName: string, callback: (...data: any) => void, maxCallbacks: number): () => void;
|
||||||
|
|
||||||
// [EventsOnce](https://wails.io/docs/reference/runtime/events#eventsonce)
|
// [EventsOnce](https://wails.io/docs/reference/runtime/events#eventsonce)
|
||||||
// sets up a listener for the given event name, but will only trigger once.
|
// sets up a listener for the given event name, but will only trigger once.
|
||||||
export function EventsOnce(eventName: string, callback: (...data: any) => void): void;
|
export function EventsOnce(eventName: string, callback: (...data: any) => void): () => void;
|
||||||
|
|
||||||
// [EventsOff](https://wails.io/docs/reference/runtime/events#eventsff)
|
// [EventsOff](https://wails.io/docs/reference/runtime/events#eventsoff)
|
||||||
// unregisters the listener for the given event name.
|
// unregisters the listener for the given event name.
|
||||||
export function EventsOff(eventName: string): void;
|
export function EventsOff(eventName: string, ...additionalEventNames: string[]): void;
|
||||||
|
|
||||||
|
// [EventsOffAll](https://wails.io/docs/reference/runtime/events#eventsoffall)
|
||||||
|
// unregisters all listeners.
|
||||||
|
export function EventsOffAll(): void;
|
||||||
|
|
||||||
// [LogPrint](https://wails.io/docs/reference/runtime/log#logprint)
|
// [LogPrint](https://wails.io/docs/reference/runtime/log#logprint)
|
||||||
// logs the given message as a raw message
|
// logs the given message as a raw message
|
||||||
@ -124,6 +128,10 @@ export function WindowFullscreen(): void;
|
|||||||
// Restores the previous window dimensions and position prior to full screen.
|
// Restores the previous window dimensions and position prior to full screen.
|
||||||
export function WindowUnfullscreen(): void;
|
export function WindowUnfullscreen(): void;
|
||||||
|
|
||||||
|
// [WindowIsFullscreen](https://wails.io/docs/reference/runtime/window#windowisfullscreen)
|
||||||
|
// Returns the state of the window, i.e. whether the window is in full screen mode or not.
|
||||||
|
export function WindowIsFullscreen(): Promise<boolean>;
|
||||||
|
|
||||||
// [WindowSetSize](https://wails.io/docs/reference/runtime/window#windowsetsize)
|
// [WindowSetSize](https://wails.io/docs/reference/runtime/window#windowsetsize)
|
||||||
// Sets the width and height of the window.
|
// Sets the width and height of the window.
|
||||||
export function WindowSetSize(width: number, height: number): Promise<Size>;
|
export function WindowSetSize(width: number, height: number): Promise<Size>;
|
||||||
@ -170,6 +178,10 @@ export function WindowToggleMaximise(): void;
|
|||||||
// Restores the window to the dimensions and position prior to maximising.
|
// Restores the window to the dimensions and position prior to maximising.
|
||||||
export function WindowUnmaximise(): void;
|
export function WindowUnmaximise(): void;
|
||||||
|
|
||||||
|
// [WindowIsMaximised](https://wails.io/docs/reference/runtime/window#windowismaximised)
|
||||||
|
// Returns the state of the window, i.e. whether the window is maximised or not.
|
||||||
|
export function WindowIsMaximised(): Promise<boolean>;
|
||||||
|
|
||||||
// [WindowMinimise](https://wails.io/docs/reference/runtime/window#windowminimise)
|
// [WindowMinimise](https://wails.io/docs/reference/runtime/window#windowminimise)
|
||||||
// Minimises the window.
|
// Minimises the window.
|
||||||
export function WindowMinimise(): void;
|
export function WindowMinimise(): void;
|
||||||
@ -178,6 +190,14 @@ export function WindowMinimise(): void;
|
|||||||
// Restores the window to the dimensions and position prior to minimising.
|
// Restores the window to the dimensions and position prior to minimising.
|
||||||
export function WindowUnminimise(): void;
|
export function WindowUnminimise(): void;
|
||||||
|
|
||||||
|
// [WindowIsMinimised](https://wails.io/docs/reference/runtime/window#windowisminimised)
|
||||||
|
// Returns the state of the window, i.e. whether the window is minimised or not.
|
||||||
|
export function WindowIsMinimised(): Promise<boolean>;
|
||||||
|
|
||||||
|
// [WindowIsNormal](https://wails.io/docs/reference/runtime/window#windowisnormal)
|
||||||
|
// Returns the state of the window, i.e. whether the window is normal or not.
|
||||||
|
export function WindowIsNormal(): Promise<boolean>;
|
||||||
|
|
||||||
// [WindowSetBackgroundColour](https://wails.io/docs/reference/runtime/window#windowsetbackgroundcolour)
|
// [WindowSetBackgroundColour](https://wails.io/docs/reference/runtime/window#windowsetbackgroundcolour)
|
||||||
// Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels.
|
// Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels.
|
||||||
export function WindowSetBackgroundColour(R: number, G: number, B: number, A: number): void;
|
export function WindowSetBackgroundColour(R: number, G: number, B: number, A: number): void;
|
||||||
@ -205,3 +225,11 @@ export function Hide(): void;
|
|||||||
// [Show](https://wails.io/docs/reference/runtime/intro#show)
|
// [Show](https://wails.io/docs/reference/runtime/intro#show)
|
||||||
// Shows the application.
|
// Shows the application.
|
||||||
export function Show(): void;
|
export function Show(): void;
|
||||||
|
|
||||||
|
// [ClipboardGetText](https://wails.io/docs/reference/runtime/clipboard#clipboardgettext)
|
||||||
|
// Returns the current text stored on clipboard
|
||||||
|
export function ClipboardGetText(): Promise<string>;
|
||||||
|
|
||||||
|
// [ClipboardSetText](https://wails.io/docs/reference/runtime/clipboard#clipboardsettext)
|
||||||
|
// Sets a text on the clipboard
|
||||||
|
export function ClipboardSetText(text: string): Promise<boolean>;
|
||||||
|
@ -37,19 +37,19 @@ export function LogFatal(message) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function EventsOnMultiple(eventName, callback, maxCallbacks) {
|
export function EventsOnMultiple(eventName, callback, maxCallbacks) {
|
||||||
window.runtime.EventsOnMultiple(eventName, callback, maxCallbacks);
|
return window.runtime.EventsOnMultiple(eventName, callback, maxCallbacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function EventsOn(eventName, callback) {
|
export function EventsOn(eventName, callback) {
|
||||||
EventsOnMultiple(eventName, callback, -1);
|
return EventsOnMultiple(eventName, callback, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function EventsOff(eventName) {
|
export function EventsOff(eventName, ...additionalEventNames) {
|
||||||
return window.runtime.EventsOff(eventName);
|
return window.runtime.EventsOff(eventName, ...additionalEventNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function EventsOnce(eventName, callback) {
|
export function EventsOnce(eventName, callback) {
|
||||||
EventsOnMultiple(eventName, callback, 1);
|
return EventsOnMultiple(eventName, callback, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function EventsEmit(eventName) {
|
export function EventsEmit(eventName) {
|
||||||
@ -97,6 +97,10 @@ export function WindowUnfullscreen() {
|
|||||||
window.runtime.WindowUnfullscreen();
|
window.runtime.WindowUnfullscreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function WindowIsFullscreen() {
|
||||||
|
return window.runtime.WindowIsFullscreen();
|
||||||
|
}
|
||||||
|
|
||||||
export function WindowGetSize() {
|
export function WindowGetSize() {
|
||||||
return window.runtime.WindowGetSize();
|
return window.runtime.WindowGetSize();
|
||||||
}
|
}
|
||||||
@ -141,6 +145,10 @@ export function WindowUnmaximise() {
|
|||||||
window.runtime.WindowUnmaximise();
|
window.runtime.WindowUnmaximise();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function WindowIsMaximised() {
|
||||||
|
return window.runtime.WindowIsMaximised();
|
||||||
|
}
|
||||||
|
|
||||||
export function WindowMinimise() {
|
export function WindowMinimise() {
|
||||||
window.runtime.WindowMinimise();
|
window.runtime.WindowMinimise();
|
||||||
}
|
}
|
||||||
@ -157,6 +165,14 @@ export function ScreenGetAll() {
|
|||||||
return window.runtime.ScreenGetAll();
|
return window.runtime.ScreenGetAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function WindowIsMinimised() {
|
||||||
|
return window.runtime.WindowIsMinimised();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function WindowIsNormal() {
|
||||||
|
return window.runtime.WindowIsNormal();
|
||||||
|
}
|
||||||
|
|
||||||
export function BrowserOpenURL(url) {
|
export function BrowserOpenURL(url) {
|
||||||
window.runtime.BrowserOpenURL(url);
|
window.runtime.BrowserOpenURL(url);
|
||||||
}
|
}
|
||||||
@ -176,3 +192,11 @@ export function Hide() {
|
|||||||
export function Show() {
|
export function Show() {
|
||||||
window.runtime.Show();
|
window.runtime.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function ClipboardGetText() {
|
||||||
|
return window.runtime.ClipboardGetText();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ClipboardSetText(text) {
|
||||||
|
return window.runtime.ClipboardSetText(text);
|
||||||
|
}
|
8
go.mod
8
go.mod
@ -1,4 +1,4 @@
|
|||||||
module changeme
|
module rwkv-runner
|
||||||
|
|
||||||
go 1.18
|
go 1.18
|
||||||
|
|
||||||
@ -25,9 +25,9 @@ require (
|
|||||||
github.com/wailsapp/mimetype v1.4.1 // indirect
|
github.com/wailsapp/mimetype v1.4.1 // indirect
|
||||||
golang.org/x/crypto v0.1.0 // indirect
|
golang.org/x/crypto v0.1.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
|
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
|
||||||
golang.org/x/net v0.7.0 // indirect
|
golang.org/x/net v0.8.0 // indirect
|
||||||
golang.org/x/sys v0.5.0 // indirect
|
golang.org/x/sys v0.6.0 // indirect
|
||||||
golang.org/x/text v0.7.0 // indirect
|
golang.org/x/text v0.8.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
// replace github.com/wailsapp/wails/v2 v2.4.1 => C:\Users\JosStorer\go\pkg\mod
|
// replace github.com/wailsapp/wails/v2 v2.4.1 => C:\Users\JosStorer\go\pkg\mod
|
||||||
|
12
go.sum
12
go.sum
@ -54,8 +54,8 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw
|
|||||||
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM=
|
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM=
|
||||||
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
|
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
|
||||||
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
|
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
|
||||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -64,12 +64,12 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
|
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
|
||||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
11
main.go
11
main.go
@ -17,14 +17,15 @@ func main() {
|
|||||||
|
|
||||||
// Create application with options
|
// Create application with options
|
||||||
err := wails.Run(&options.App{
|
err := wails.Run(&options.App{
|
||||||
Title: "RWKV-Runner",
|
Title: "RWKV-Runner",
|
||||||
Width: 1024,
|
Width: 1024,
|
||||||
Height: 768,
|
Height: 640,
|
||||||
|
MinWidth: 1024,
|
||||||
|
MinHeight: 640,
|
||||||
AssetServer: &assetserver.Options{
|
AssetServer: &assetserver.Options{
|
||||||
Assets: assets,
|
Assets: assets,
|
||||||
},
|
},
|
||||||
BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1},
|
OnStartup: app.startup,
|
||||||
OnStartup: app.startup,
|
|
||||||
Bind: []interface{}{
|
Bind: []interface{}{
|
||||||
app,
|
app,
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user