Refactoring Repository architecture + POC svelte
Only the interface is in state of work, there is no logic actually.
31
.gitignore
vendored
@ -1,6 +1,25 @@
|
||||
/node_modules/
|
||||
/.vs/
|
||||
/.vscode/
|
||||
/target/
|
||||
/logs/
|
||||
/dist/
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
build
|
||||
dist
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
.svelte-kit
|
9
.prettierrc
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"printWidth": 120,
|
||||
"singleQuote": false,
|
||||
"trailingComma": "es5",
|
||||
"jsxSingleQuote": false,
|
||||
"svelteSortOrder": "styles-scripts-markup",
|
||||
"svelteStrictMode": true,
|
||||
"svelteAllowShorthand": false
|
||||
}
|
3
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"recommendations": ["svelte.svelte-vscode"]
|
||||
}
|
77
README.md
@ -13,23 +13,23 @@
|
||||
|
||||
## Features
|
||||
|
||||
* 🔒 Full account management.
|
||||
* Add multiple accounts and easily switch between them.
|
||||
* Microsoft (OAuth 2.0) + Mojang (Yggdrasil) authentication fully supported.
|
||||
* Credentials are never stored and transmitted directly to Mojang.
|
||||
* 📂 Efficient asset management.
|
||||
* Receive client updates as soon as we release them.
|
||||
* Files are validated before launch. Corrupt or incorrect files will be redownloaded.
|
||||
* ☕ **Automatic Java validation.**
|
||||
* If you have an incompatible version of Java installed, we'll install the right one *for you*.
|
||||
* You do not need to have Java installed to run the launcher.
|
||||
* 📰 News feed natively built into the launcher.
|
||||
* ⚙️ Intuitive settings management, including a Java control panel.
|
||||
* Supports all of our servers.
|
||||
* Switch between server configurations with ease.
|
||||
* View the player count of the selected server.
|
||||
* Automatic updates. That's right, the launcher updates itself.
|
||||
* View the status of Mojang's services.
|
||||
- 🔒 Full account management.
|
||||
- Add multiple accounts and easily switch between them.
|
||||
- Microsoft (OAuth 2.0) + Mojang (Yggdrasil) authentication fully supported.
|
||||
- Credentials are never stored and transmitted directly to Mojang.
|
||||
- 📂 Efficient asset management.
|
||||
- Receive client updates as soon as we release them.
|
||||
- Files are validated before launch. Corrupt or incorrect files will be redownloaded.
|
||||
- ☕ **Automatic Java validation.**
|
||||
- If you have an incompatible version of Java installed, we'll install the right one _for you_.
|
||||
- You do not need to have Java installed to run the launcher.
|
||||
- 📰 News feed natively built into the launcher.
|
||||
- ⚙️ Intuitive settings management, including a Java control panel.
|
||||
- Supports all of our servers.
|
||||
- Switch between server configurations with ease.
|
||||
- View the player count of the selected server.
|
||||
- Automatic updates. That's right, the launcher updates itself.
|
||||
- View the status of Mojang's services.
|
||||
|
||||
This is not an exhaustive list. Download and install the launcher to gauge all it can do!
|
||||
|
||||
@ -46,18 +46,19 @@ You can download from [GitHub Releases](https://github.com/dscalzi/HeliosLaunche
|
||||
[](https://github.com/dscalzi/HeliosLauncher/releases/latest)
|
||||
|
||||
#### Latest Pre-Release
|
||||
|
||||
[](https://github.com/dscalzi/HeliosLauncher/releases)
|
||||
|
||||
**Supported Platforms**
|
||||
|
||||
If you download from the [Releases](https://github.com/dscalzi/HeliosLauncher/releases) tab, select the installer for your system.
|
||||
|
||||
| Platform | File |
|
||||
| -------- | ---- |
|
||||
| Windows x64 | `Helios-Launcher-setup-VERSION.exe` |
|
||||
| macOS x64 | `Helios-Launcher-setup-VERSION-x64.dmg` |
|
||||
| Platform | File |
|
||||
| ----------- | ----------------------------------------- |
|
||||
| Windows x64 | `Helios-Launcher-setup-VERSION.exe` |
|
||||
| macOS x64 | `Helios-Launcher-setup-VERSION-x64.dmg` |
|
||||
| macOS arm64 | `Helios-Launcher-setup-VERSION-arm64.dmg` |
|
||||
| Linux x64 | `Helios-Launcher-setup-VERSION.AppImage` |
|
||||
| Linux x64 | `Helios-Launcher-setup-VERSION.AppImage` |
|
||||
|
||||
## Console
|
||||
|
||||
@ -75,7 +76,6 @@ If you want to export the console output, simply right click anywhere on the con
|
||||
|
||||

|
||||
|
||||
|
||||
## Development
|
||||
|
||||
This section details the setup of a basic developmentment environment.
|
||||
@ -84,7 +84,7 @@ This section details the setup of a basic developmentment environment.
|
||||
|
||||
**System Requirements**
|
||||
|
||||
* [Node.js][nodejs] v18
|
||||
- [Node.js][nodejs] v18
|
||||
|
||||
---
|
||||
|
||||
@ -114,6 +114,8 @@ To build for your current platform.
|
||||
> npm run dist
|
||||
```
|
||||
|
||||
# To Implement
|
||||
|
||||
Build for a specific platform.
|
||||
|
||||
| Platform | Command |
|
||||
@ -126,6 +128,8 @@ Builds for macOS may not work on Windows/Linux and vice-versa.
|
||||
|
||||
---
|
||||
|
||||
# To Implement
|
||||
|
||||
### Visual Studio Code
|
||||
|
||||
All development of the launcher should be done using [Visual Studio Code][vscode].
|
||||
@ -187,9 +191,9 @@ For instructions on setting up Microsoft Authentication, see https://github.com/
|
||||
|
||||
## Resources
|
||||
|
||||
* [Wiki][wiki]
|
||||
* [Nebula (Create Distribution.json)][nebula]
|
||||
* [v2 Rewrite Branch (Inactive)][v2branch]
|
||||
- [Wiki][wiki]
|
||||
- [Nebula (Create Distribution.json)][nebula]
|
||||
- [v2 Rewrite Branch (Inactive)][v2branch]
|
||||
|
||||
The best way to contact the developers is on Discord.
|
||||
|
||||
@ -199,13 +203,12 @@ The best way to contact the developers is on Discord.
|
||||
|
||||
### See you ingame.
|
||||
|
||||
|
||||
[nodejs]: https://nodejs.org/en/ 'Node.js'
|
||||
[vscode]: https://code.visualstudio.com/ 'Visual Studio Code'
|
||||
[mainprocess]: https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes 'Main Process'
|
||||
[rendererprocess]: https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes 'Renderer Process'
|
||||
[chromedebugger]: https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome 'Debugger for Chrome'
|
||||
[discord]: https://discord.gg/zNWUXdt 'Discord'
|
||||
[wiki]: https://github.com/dscalzi/HeliosLauncher/wiki 'wiki'
|
||||
[nebula]: https://github.com/dscalzi/Nebula 'dscalzi/Nebula'
|
||||
[v2branch]: https://github.com/dscalzi/HeliosLauncher/tree/ts-refactor 'v2 branch'
|
||||
[nodejs]: https://nodejs.org/en/ "Node.js"
|
||||
[vscode]: https://code.visualstudio.com/ "Visual Studio Code"
|
||||
[mainprocess]: https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes "Main Process"
|
||||
[rendererprocess]: https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes "Renderer Process"
|
||||
[chromedebugger]: https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome "Debugger for Chrome"
|
||||
[discord]: https://discord.gg/zNWUXdt "Discord"
|
||||
[wiki]: https://github.com/dscalzi/HeliosLauncher/wiki "wiki"
|
||||
[nebula]: https://github.com/dscalzi/Nebula "dscalzi/Nebula"
|
||||
[v2branch]: https://github.com/dscalzi/HeliosLauncher/tree/ts-refactor "v2 branch"
|
||||
|
28
electron-builder.json
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"productName": "Minecraft Launcher",
|
||||
"appId": "electron.minecraft.launcher",
|
||||
"copyright": "Copyright © 2023 ${author}",
|
||||
|
||||
"win": {
|
||||
"target": ["nsis"]
|
||||
},
|
||||
"mac": {
|
||||
"target": ["dmg"],
|
||||
"category": "productivity",
|
||||
"type": "distribution",
|
||||
"hardenedRuntime": "true"
|
||||
},
|
||||
"linux": {
|
||||
"target": ["AppImage", "snap"],
|
||||
"category": "productivity"
|
||||
},
|
||||
"files": ["./build/**/*", "./node_modules/**/*", "./package.json"],
|
||||
"publish": [
|
||||
{
|
||||
"provider": "github",
|
||||
"owner": "Daniel Scalzi",
|
||||
"contributers": ["Shadowner"],
|
||||
"repo": "minecraftLauncher"
|
||||
}
|
||||
]
|
||||
}
|
3
electron.prod.tsconfig.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"extends": "./src/electron/tsconfig.prod.json"
|
||||
}
|
3
electron.tsconfig.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"extends": "./src/electron/tsconfig.json"
|
||||
}
|
165
eslint.electron.json
Normal file
@ -0,0 +1,165 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": false,
|
||||
"es6": true,
|
||||
"node": true
|
||||
},
|
||||
"extends": [
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:@typescript-eslint/recommended-requiring-type-checking",
|
||||
"prettier"
|
||||
],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"project": "tsconfig.electron.json",
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": ["eslint-plugin-jsdoc", "eslint-plugin-prefer-arrow", "@typescript-eslint"],
|
||||
"rules": {
|
||||
"@typescript-eslint/adjacent-overload-signatures": "error",
|
||||
"@typescript-eslint/array-type": [
|
||||
"error",
|
||||
{
|
||||
"default": "array"
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/ban-types": [
|
||||
"error",
|
||||
{
|
||||
"types": {
|
||||
"Object": {
|
||||
"message": "Avoid using the `Object` type. Did you mean `object`?"
|
||||
},
|
||||
"Function": {
|
||||
"message": "Avoid using the `Function` type. Prefer a specific function type, like `() => void`."
|
||||
},
|
||||
"Boolean": {
|
||||
"message": "Avoid using the `Boolean` type. Did you mean `boolean`?"
|
||||
},
|
||||
"Number": {
|
||||
"message": "Avoid using the `Number` type. Did you mean `number`?"
|
||||
},
|
||||
"String": {
|
||||
"message": "Avoid using the `String` type. Did you mean `string`?"
|
||||
},
|
||||
"Symbol": {
|
||||
"message": "Avoid using the `Symbol` type. Did you mean `symbol`?"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/consistent-type-assertions": "error",
|
||||
"@typescript-eslint/dot-notation": "error",
|
||||
"@typescript-eslint/indent": "off",
|
||||
"@typescript-eslint/member-delimiter-style": [
|
||||
"off",
|
||||
{
|
||||
"multiline": {
|
||||
"delimiter": "none",
|
||||
"requireLast": true
|
||||
},
|
||||
"singleline": {
|
||||
"delimiter": "semi",
|
||||
"requireLast": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/naming-convention": "error",
|
||||
"@typescript-eslint/no-empty-function": "error",
|
||||
"@typescript-eslint/no-empty-interface": "error",
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"@typescript-eslint/no-misused-new": "error",
|
||||
"@typescript-eslint/no-namespace": "error",
|
||||
"@typescript-eslint/no-parameter-properties": "off",
|
||||
"@typescript-eslint/no-unused-expressions": "error",
|
||||
"@typescript-eslint/no-use-before-define": "off",
|
||||
"@typescript-eslint/no-var-requires": "error",
|
||||
"@typescript-eslint/prefer-for-of": "error",
|
||||
"@typescript-eslint/prefer-function-type": "error",
|
||||
"@typescript-eslint/prefer-namespace-keyword": "error",
|
||||
"@typescript-eslint/quotes": "off",
|
||||
"@typescript-eslint/semi": ["off", null],
|
||||
"@typescript-eslint/triple-slash-reference": [
|
||||
"error",
|
||||
{
|
||||
"path": "always",
|
||||
"types": "prefer-import",
|
||||
"lib": "always"
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/type-annotation-spacing": "off",
|
||||
"@typescript-eslint/unified-signatures": "error",
|
||||
"arrow-parens": ["off", "always"],
|
||||
"brace-style": ["off", "off"],
|
||||
"comma-dangle": "off",
|
||||
"complexity": "off",
|
||||
"constructor-super": "error",
|
||||
"eol-last": "off",
|
||||
"eqeqeq": ["error", "smart"],
|
||||
"guard-for-in": "error",
|
||||
"id-blacklist": [
|
||||
"error",
|
||||
"any",
|
||||
"Number",
|
||||
"number",
|
||||
"String",
|
||||
"string",
|
||||
"Boolean",
|
||||
"boolean",
|
||||
"Undefined",
|
||||
"undefined"
|
||||
],
|
||||
"id-match": "error",
|
||||
"jsdoc/check-alignment": "error",
|
||||
"jsdoc/check-indentation": "error",
|
||||
"jsdoc/newline-after-description": "error",
|
||||
"linebreak-style": "off",
|
||||
"max-classes-per-file": ["error", 1],
|
||||
"max-len": "off",
|
||||
"new-parens": "off",
|
||||
"newline-per-chained-call": "off",
|
||||
"no-bitwise": "error",
|
||||
"no-caller": "error",
|
||||
"no-cond-assign": "error",
|
||||
"no-console": "error",
|
||||
"no-debugger": "error",
|
||||
"no-empty": "error",
|
||||
"no-eval": "error",
|
||||
"no-extra-semi": "off",
|
||||
"no-fallthrough": "off",
|
||||
"no-invalid-this": "off",
|
||||
"no-irregular-whitespace": "off",
|
||||
"no-multiple-empty-lines": "off",
|
||||
"no-new-wrappers": "error",
|
||||
"no-shadow": [
|
||||
"error",
|
||||
{
|
||||
"hoist": "all"
|
||||
}
|
||||
],
|
||||
"no-throw-literal": "error",
|
||||
"no-trailing-spaces": "off",
|
||||
"no-undef-init": "error",
|
||||
"no-underscore-dangle": "error",
|
||||
"no-unsafe-finally": "error",
|
||||
"no-unused-labels": "error",
|
||||
"no-var": "error",
|
||||
"object-shorthand": "error",
|
||||
"one-var": ["error", "never"],
|
||||
"prefer-arrow/prefer-arrow-functions": "error",
|
||||
"prefer-const": "error",
|
||||
"quote-props": "off",
|
||||
"radix": "error",
|
||||
"space-before-function-paren": "off",
|
||||
"space-in-parens": ["off", "never"],
|
||||
"spaced-comment": [
|
||||
"error",
|
||||
"always",
|
||||
{
|
||||
"markers": ["/"]
|
||||
}
|
||||
],
|
||||
"use-isnan": "error",
|
||||
"valid-typeof": "off"
|
||||
}
|
||||
}
|
166
eslint.svelte.json
Normal file
@ -0,0 +1,166 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es2021": true,
|
||||
"node": true
|
||||
},
|
||||
"extends": [
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:@typescript-eslint/recommended-requiring-type-checking",
|
||||
"prettier"
|
||||
],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"project": "tsconfig.svelte.json",
|
||||
"ecmaVersion": 2021,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": ["eslint-plugin-jsdoc", "eslint-plugin-prefer-arrow", "@typescript-eslint"],
|
||||
"rules": {
|
||||
"@typescript-eslint/adjacent-overload-signatures": "error",
|
||||
"@typescript-eslint/array-type": [
|
||||
"error",
|
||||
{
|
||||
"default": "array"
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/ban-types": [
|
||||
"error",
|
||||
{
|
||||
"types": {
|
||||
"Object": {
|
||||
"message": "Avoid using the `Object` type. Did you mean `object`?"
|
||||
},
|
||||
"Function": {
|
||||
"message": "Avoid using the `Function` type. Prefer a specific function type, like `() => void`."
|
||||
},
|
||||
"Boolean": {
|
||||
"message": "Avoid using the `Boolean` type. Did you mean `boolean`?"
|
||||
},
|
||||
"Number": {
|
||||
"message": "Avoid using the `Number` type. Did you mean `number`?"
|
||||
},
|
||||
"String": {
|
||||
"message": "Avoid using the `String` type. Did you mean `string`?"
|
||||
},
|
||||
"Symbol": {
|
||||
"message": "Avoid using the `Symbol` type. Did you mean `symbol`?"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/consistent-type-assertions": "error",
|
||||
"@typescript-eslint/dot-notation": "error",
|
||||
"@typescript-eslint/indent": "off",
|
||||
"@typescript-eslint/member-delimiter-style": [
|
||||
"off",
|
||||
{
|
||||
"multiline": {
|
||||
"delimiter": "none",
|
||||
"requireLast": true
|
||||
},
|
||||
"singleline": {
|
||||
"delimiter": "semi",
|
||||
"requireLast": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/naming-convention": "error",
|
||||
"@typescript-eslint/no-empty-function": "error",
|
||||
"@typescript-eslint/no-empty-interface": "error",
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"@typescript-eslint/no-misused-new": "error",
|
||||
"@typescript-eslint/no-namespace": "error",
|
||||
"@typescript-eslint/no-parameter-properties": "off",
|
||||
"@typescript-eslint/no-unused-expressions": "error",
|
||||
"@typescript-eslint/no-use-before-define": "off",
|
||||
"@typescript-eslint/no-var-requires": "error",
|
||||
"@typescript-eslint/prefer-for-of": "error",
|
||||
"@typescript-eslint/prefer-function-type": "error",
|
||||
"@typescript-eslint/prefer-namespace-keyword": "error",
|
||||
"@typescript-eslint/quotes": "off",
|
||||
"@typescript-eslint/semi": ["off", null],
|
||||
"@typescript-eslint/triple-slash-reference": [
|
||||
"error",
|
||||
{
|
||||
"path": "always",
|
||||
"types": "prefer-import",
|
||||
"lib": "always"
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/type-annotation-spacing": "off",
|
||||
"@typescript-eslint/unified-signatures": "error",
|
||||
"arrow-parens": ["off", "always"],
|
||||
"brace-style": ["off", "off"],
|
||||
"comma-dangle": "off",
|
||||
"complexity": "off",
|
||||
"constructor-super": "error",
|
||||
"eol-last": "off",
|
||||
"eqeqeq": ["error", "smart"],
|
||||
"guard-for-in": "error",
|
||||
"id-blacklist": [
|
||||
"error",
|
||||
"any",
|
||||
"Number",
|
||||
"number",
|
||||
"String",
|
||||
"string",
|
||||
"Boolean",
|
||||
"boolean",
|
||||
"Undefined",
|
||||
"undefined"
|
||||
],
|
||||
"id-match": "error",
|
||||
"jsdoc/check-alignment": "error",
|
||||
"jsdoc/check-indentation": "error",
|
||||
"jsdoc/newline-after-description": "error",
|
||||
"linebreak-style": "off",
|
||||
"max-classes-per-file": ["error", 1],
|
||||
"max-len": "off",
|
||||
"new-parens": "off",
|
||||
"newline-per-chained-call": "off",
|
||||
"no-bitwise": "error",
|
||||
"no-caller": "error",
|
||||
"no-cond-assign": "error",
|
||||
"no-console": "error",
|
||||
"no-debugger": "error",
|
||||
"no-empty": "error",
|
||||
"no-eval": "error",
|
||||
"no-extra-semi": "off",
|
||||
"no-fallthrough": "off",
|
||||
"no-invalid-this": "off",
|
||||
"no-irregular-whitespace": "off",
|
||||
"no-multiple-empty-lines": "off",
|
||||
"no-new-wrappers": "error",
|
||||
"no-shadow": [
|
||||
"error",
|
||||
{
|
||||
"hoist": "all"
|
||||
}
|
||||
],
|
||||
"no-throw-literal": "error",
|
||||
"no-trailing-spaces": "off",
|
||||
"no-undef-init": "error",
|
||||
"no-underscore-dangle": "error",
|
||||
"no-unsafe-finally": "error",
|
||||
"no-unused-labels": "error",
|
||||
"no-var": "error",
|
||||
"object-shorthand": "error",
|
||||
"one-var": ["error", "never"],
|
||||
"prefer-arrow/prefer-arrow-functions": "error",
|
||||
"prefer-const": "error",
|
||||
"quote-props": "off",
|
||||
"radix": "error",
|
||||
"space-before-function-paren": "off",
|
||||
"space-in-parens": ["off", "never"],
|
||||
"spaced-comment": [
|
||||
"error",
|
||||
"always",
|
||||
{
|
||||
"markers": ["/"]
|
||||
}
|
||||
],
|
||||
"use-isnan": "error",
|
||||
"valid-typeof": "off"
|
||||
}
|
||||
}
|
5
nodemon.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"watch": ["build/electron"],
|
||||
"exec": "npm run start:electron:run",
|
||||
"ext": "js, cjs, json, ts, proto, css, png, jpeg, jpg, ico"
|
||||
}
|
114
package.json
@ -1,59 +1,73 @@
|
||||
{
|
||||
"name": "helioslauncher",
|
||||
"version": "1.9.0",
|
||||
"productName": "Helios Launcher",
|
||||
"description": "Modded Minecraft Launcher",
|
||||
"author": "Daniel Scalzi (https://github.com/dscalzi/)",
|
||||
"license": "UNLICENSED",
|
||||
"homepage": "https://github.com/dscalzi/HeliosLauncher",
|
||||
"bugs": {
|
||||
"url": "https://github.com/dscalzi/HeliosLauncher/issues"
|
||||
},
|
||||
"name": "launcher-minecraft",
|
||||
"private": true,
|
||||
"main": "index.js",
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"author": {
|
||||
"name": "Shadonwer"
|
||||
},
|
||||
"main": "./build/electron/main.cjs",
|
||||
"scripts": {
|
||||
"start": "electron .",
|
||||
"dist": "electron-builder build",
|
||||
"dist:win": "npm run dist -- -w",
|
||||
"dist:mac": "npm run dist -- -m",
|
||||
"dist:linux": "npm run dist -- -l",
|
||||
"lint": "eslint --config .eslintrc.json ."
|
||||
},
|
||||
"engines": {
|
||||
"node": "18.x.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"@electron/remote": "^2.0.8",
|
||||
"@types/adm-zip": "^0.5.0",
|
||||
"@types/ejs": "^3.1.2",
|
||||
"@types/node": "^18.14.6",
|
||||
"@types/request": "^2.48.8",
|
||||
"adm-zip": "^0.5.9",
|
||||
"async": "^3.2.4",
|
||||
"discord-rpc-patch": "^4.0.1",
|
||||
"ejs": "^3.1.8",
|
||||
"ejs-electron": "^2.1.1",
|
||||
"electron-updater": "^5.3.0",
|
||||
"fs-extra": "^11.1.0",
|
||||
"github-syntax-dark": "^0.5.0",
|
||||
"got": "^11.8.5",
|
||||
"helios-core": "~0.1.2",
|
||||
"jquery": "^3.6.1",
|
||||
"node-disk-info": "^1.3.0",
|
||||
"node-fetch": "^3.3.0",
|
||||
"node-stream-zip": "^1.15.0",
|
||||
"request": "^2.88.2",
|
||||
"semver": "^7.3.8",
|
||||
"tar-fs": "^2.1.1",
|
||||
"winreg": "^1.2.4"
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"____________________________Developpment__________________________________": "",
|
||||
"start": "cross-env NODE_ENV=dev npm-run-all -p -r start:electron start:frontend:dev",
|
||||
"start:electron": "npm-run-all -p build:electron:dev:watch start:electron:dev",
|
||||
"start:electron:dev": "npm-run-all -s build:electron:dev start:electron:nodemon",
|
||||
"start:electron:run": "electron .",
|
||||
"start:electron:nodemon": "nodemon",
|
||||
"start:frontend:dev": "vite",
|
||||
"build:electron:dev": "tsc --p ./electron.tsconfig.json",
|
||||
"build:electron:dev:watch": "tsc -w --p ./electron.tsconfig.json",
|
||||
"_____________________________Distribution______________________________": "",
|
||||
"build:electron:prod": "cross-env NODE_ENV=production tsc --p ./electron.prod.tsconfig.json",
|
||||
"build:frontend": "npm-run-all -s build:frontend:vite build:frontend:post",
|
||||
"build:frontend:vite": "vite build",
|
||||
"build:frontend:post": "node ./scripts/postfrontbuild.cjs",
|
||||
"prepack": "npm-run-all build:electron:prod build:frontend",
|
||||
"pack": "electron-builder --config ./electron-builder.json",
|
||||
"dist": "cross-env CSC_IDENTITY_AUTO_DISCOVERY=false npm run pack",
|
||||
"________________________________Util__________________________________": "",
|
||||
"preview": "vite preview",
|
||||
"format": "prettier --write \"src/**/**/*\" --write \"scripts/**/**/*\"",
|
||||
"lint:electron": "eslint -c eslint.electron.json --ext .cjs,.cts ./src/electron",
|
||||
"lint:svelte": "eslint -c eslint.svelte.json --ext .js,.ts ./src/frontend",
|
||||
"lint": "npm-run-all -s -c lint:electron lint:svelte",
|
||||
"check": "svelte-check --tsconfig ./svelte.tsconfig.json"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "^23.0.0",
|
||||
"@sveltejs/adapter-auto": "^2.0.0",
|
||||
"@sveltejs/kit": "^1.11.0",
|
||||
"@sveltejs/vite-plugin-svelte": "^2.0.2",
|
||||
"@tsconfig/svelte": "^3.0.0",
|
||||
"@types/html-minifier": "^4.0.2",
|
||||
"@typescript-eslint/eslint-plugin": "^5.54.1",
|
||||
"@typescript-eslint/parser": "^5.54.1",
|
||||
"autoprefixer": "^10.4.14",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^23.1.3",
|
||||
"electron-builder": "^23.6.0",
|
||||
"eslint": "^8.34.0"
|
||||
"eslint": "^8.36.0",
|
||||
"eslint-config-prettier": "^8.7.0",
|
||||
"eslint-plugin-jsdoc": "^40.0.1",
|
||||
"eslint-plugin-prefer-arrow": "^1.2.3",
|
||||
"html-minifier": "^4.0.0",
|
||||
"nodemon": "^2.0.21",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"postcss": "^8.4.21",
|
||||
"prettier": "^2.8.4",
|
||||
"prettier-plugin-svelte": "^2.9.0",
|
||||
"svelte": "^3.55.1",
|
||||
"svelte-check": "^2.10.3",
|
||||
"tailwindcss": "^3.2.7",
|
||||
"tslib": "^2.5.0",
|
||||
"typescript": "^4.9.3",
|
||||
"vite": "^4.1.0",
|
||||
"vite-plugin-electron": "^0.11.1",
|
||||
"vite-plugin-electron-renderer": "^0.12.1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/dscalzi/HeliosLauncher.git"
|
||||
"dependencies": {
|
||||
"electron-log": "^5.0.0-beta.16",
|
||||
"electron-store": "^8.1.0",
|
||||
"electron-updater": "^5.3.0"
|
||||
}
|
||||
}
|
||||
|
6
postcss.config.cjs
Normal file
@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
BIN
public/assets/fonts/Avenir-Black.ttf
Normal file
BIN
public/assets/fonts/Avenir-BlackOblique.ttf
Normal file
BIN
public/assets/fonts/Avenir-Book.ttf
Normal file
BIN
public/assets/fonts/Avenir-BookOblique.ttf
Normal file
BIN
public/assets/fonts/Avenir-Heavy.ttf
Normal file
BIN
public/assets/fonts/Avenir-HeavyOblique.ttf
Normal file
BIN
public/assets/fonts/Avenir-Light.ttf
Normal file
BIN
public/assets/fonts/Avenir-LightOblique.ttf
Normal file
BIN
public/assets/fonts/Avenir-Medium.ttf
Normal file
BIN
public/assets/fonts/Avenir-MediumOblique.ttf
Normal file
BIN
public/assets/fonts/Avenir-Oblique.ttf
Normal file
BIN
public/assets/fonts/Avenir-Roman.ttf
Normal file
BIN
public/assets/fonts/ringbearer.ttf
Normal file
BIN
public/assets/images/LoadingSeal.png
Normal file
After Width: | Height: | Size: 244 KiB |
BIN
public/assets/images/LoadingText.png
Normal file
After Width: | Height: | Size: 124 KiB |
BIN
public/assets/images/SealCircle.ico
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
public/assets/images/SealCircle.png
Normal file
After Width: | Height: | Size: 142 KiB |
BIN
public/assets/images/backgrounds/0.jpg
Normal file
After Width: | Height: | Size: 160 KiB |
BIN
public/assets/images/backgrounds/1.jpg
Normal file
After Width: | Height: | Size: 181 KiB |
BIN
public/assets/images/backgrounds/2.jpg
Normal file
After Width: | Height: | Size: 502 KiB |
BIN
public/assets/images/backgrounds/3.jpg
Normal file
After Width: | Height: | Size: 1.0 MiB |
BIN
public/assets/images/backgrounds/4.jpg
Normal file
After Width: | Height: | Size: 268 KiB |
BIN
public/assets/images/backgrounds/5.jpg
Normal file
After Width: | Height: | Size: 456 KiB |
BIN
public/assets/images/backgrounds/6.jpg
Normal file
After Width: | Height: | Size: 2.6 MiB |
BIN
public/assets/images/backgrounds/7.jpg
Normal file
After Width: | Height: | Size: 5.0 MiB |
7
public/assets/images/icons/arrow.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24.87 13.97">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;stroke:#FFF;stroke-width:2px;}</style>
|
||||
</defs>
|
||||
<title>arrow</title>
|
||||
<polyline class="cls-1" points="0.71 13.26 12.56 1.41 24.16 13.02"/>
|
||||
</svg>
|
After Width: | Height: | Size: 298 B |
10
public/assets/images/icons/discord.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}</style>
|
||||
<clipPath id="clip-path"><rect class="cls-1" x="36.42" y="44.23" width="68.52" height="48.96"/></clipPath>
|
||||
</defs>
|
||||
<title>discord</title>
|
||||
<g class="cls-2">
|
||||
<path d="M81.23,78.48a6.14,6.14,0,1,1,6.14-6.14,6.14,6.14,0,0,1-6.14,6.14M60,78.48a6.14,6.14,0,1,1,6.14-6.14A6.14,6.14,0,0,1,60,78.48M104.41,73c-.92-7.7-8.24-22.9-8.24-22.9A43,43,0,0,0,88,45.59a17.88,17.88,0,0,0-8.38-1.27l-.13,1.06a23.52,23.52,0,0,1,5.8,1.95,87.59,87.59,0,0,1,8.17,4.87s-10.32-5.63-22.27-5.63a51.32,51.32,0,0,0-23.2,5.63,87.84,87.84,0,0,1,8.17-4.87,23.57,23.57,0,0,1,5.8-1.95l-.13-1.06a17.88,17.88,0,0,0-8.38,1.27,42.84,42.84,0,0,0-8.21,4.56S37.87,65.35,37,73s-.37,11.54-.37,11.54,4.22,5.68,9.9,7.14,7.7,1.47,7.7,1.47l3.75-4.68a21.22,21.22,0,0,1-4.65-2A24.47,24.47,0,0,1,47.93,82S61.16,88.4,70.68,88.4c10,0,22.75-6.44,22.75-6.44a24.56,24.56,0,0,1-5.35,4.56,21.22,21.22,0,0,1-4.65,2l3.75,4.68s2,0,7.7-1.47,9.89-7.14,9.89-7.14.55-3.85-.37-11.54"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
9
public/assets/images/icons/instagram.svg
Normal file
@ -0,0 +1,9 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="504px" height="504px" viewBox="0 0 5040 5040" preserveAspectRatio="xMidYMid meet">
|
||||
<g id="layer101" fill="#000000" stroke="none">
|
||||
<path d="M1390 5024 c-163 -9 -239 -19 -315 -38 -281 -70 -477 -177 -660 -361 -184 -184 -292 -380 -361 -660 -43 -171 -53 -456 -53 -1445 0 -989 10 -1274 53 -1445 69 -280 177 -476 361 -660 184 -184 380 -292 660 -361 171 -43 456 -53 1445 -53 989 0 1274 10 1445 53 280 69 476 177 660 361 184 184 292 380 361 660 43 171 53 456 53 1445 0 989 -10 1274 -53 1445 -69 280 -177 476 -361 660 -184 184 -380 292 -660 361 -174 44 -454 53 -1470 52 -599 0 -960 -5 -1105 -14z m2230 -473 c58 -6 141 -18 185 -27 397 -78 638 -318 719 -714 37 -183 41 -309 41 -1290 0 -981 -4 -1107 -41 -1290 -81 -395 -319 -633 -714 -714 -183 -37 -309 -41 -1290 -41 -981 0 -1107 4 -1290 41 -397 81 -636 322 -714 719 -33 166 -38 296 -43 1100 -5 796 3 1203 27 1380 67 489 338 758 830 825 47 7 162 15 255 20 250 12 1907 4 2035 -9z"/>
|
||||
<path d="M2355 3819 c-307 -42 -561 -172 -780 -400 -244 -253 -359 -543 -359 -899 0 -361 116 -648 367 -907 262 -269 563 -397 937 -397 374 0 675 128 937 397 251 259 367 546 367 907 0 361 -116 648 -367 907 -197 203 -422 326 -690 378 -101 20 -317 27 -412 14z m400 -509 c275 -88 470 -284 557 -560 20 -65 23 -95 23 -230 0 -135 -3 -165 -23 -230 -88 -278 -284 -474 -562 -562 -65 -20 -95 -23 -230 -23 -135 0 -165 3 -230 23 -278 88 -474 284 -562 562 -20 65 -23 95 -23 230 0 135 3 165 23 230 73 230 219 403 427 507 134 67 212 83 390 79 111 -3 155 -8 210 -26z"/>
|
||||
<path d="M3750 1473 c-29 -11 -66 -38 -106 -77 -70 -71 -94 -126 -94 -221 0 -95 24 -150 94 -221 72 -71 126 -94 225 -94 168 0 311 143 311 311 0 99 -23 154 -94 225 -43 42 -76 66 -110 77 -61 21 -166 21 -226 0z"/>
|
||||
</g>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
11
public/assets/images/icons/link.svg
Normal file
@ -0,0 +1,11 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}</style>
|
||||
<clipPath id="clip-path"><rect class="cls-1" x="29.3" y="52.62" width="82.77" height="34.15"/></clipPath>
|
||||
</defs>
|
||||
<title>link</title>
|
||||
<g class="cls-2">
|
||||
<path d="M75.37,65.51a3.85,3.85,0,0,0-1.73.42,8.22,8.22,0,0,1,.94,3.76A8.36,8.36,0,0,1,66.23,78H46.37a8.35,8.35,0,1,1,0-16.7h9.18a21.51,21.51,0,0,1,6.65-8.72H46.37a17.07,17.07,0,1,0,0,34.15H66.23A17,17,0,0,0,82.77,65.51Z"/>
|
||||
<path d="M66,73.88a3.85,3.85,0,0,0,1.73-.42,8.22,8.22,0,0,1-.94-3.76,8.36,8.36,0,0,1,8.35-8.35H95A8.35,8.35,0,1,1,95,78H85.8a21.51,21.51,0,0,1-6.65,8.72H95a17.07,17.07,0,0,0,0-34.15H75.13A17,17,0,0,0,58.59,73.88Z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 875 B |
12
public/assets/images/icons/lock.svg
Normal file
@ -0,0 +1,12 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}.cls-3{fill:#231f20;}</style>
|
||||
<clipPath id="clip-path">
|
||||
<rect class="cls-1" x="44.02" y="34.21" width="51.96" height="68.48"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<title>Lock</title>
|
||||
<g class="cls-2">
|
||||
<path class="cls-3" d="M86.16,54a16.38,16.38,0,1,0-32,0H44V102.7H96V54Zm-25.9-3.39a9.89,9.89,0,1,1,19.77,0A9.78,9.78,0,0,1,79.39,54H60.89A9.78,9.78,0,0,1,60.26,50.59ZM70,96.2a6.5,6.5,0,0,1-6.5-6.5,6.39,6.39,0,0,1,3.1-5.4V67h6.5V84.11a6.42,6.42,0,0,1,3.39,5.6A6.5,6.5,0,0,1,70,96.2Z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 756 B |
7
public/assets/images/icons/microsoft.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23 23">
|
||||
<path fill="#f3f3f3" d="M0 0h23v23H0z" />
|
||||
<path fill="#f35325" d="M1 1h10v10H1z" />
|
||||
<path fill="#81bc06" d="M12 1h10v10H12z" />
|
||||
<path fill="#05a6f0" d="M1 12h10v10H1z" />
|
||||
<path fill="#ffba08" d="M12 12h10v10H12z" />
|
||||
</svg>
|
After Width: | Height: | Size: 303 B |
5
public/assets/images/icons/mojang.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 9.677 9.667">
|
||||
<path d="M-26.332-12.098h2.715c-1.357.18-2.574 1.23-2.715 2.633z" fill="#fff" />
|
||||
<path d="M2.598.022h7.07L9.665 7c-.003 1.334-1.113 2.46-2.402 2.654H0V2.542C.134 1.2 1.3.195 2.598.022z" fill="#db2331" />
|
||||
<path d="M1.54 2.844c.314-.76 1.31-.46 1.954-.528.785-.083 1.503.272 2.1.758l.164-.9c.327.345.587.756.964 1.052.28.254.655-.342.86-.013.42.864.408 1.86.54 2.795l-.788-.373C6.9 4.17 5.126 3.052 3.656 3.685c-1.294.592-1.156 2.65.06 3.255 1.354.703 2.953.51 4.405.292-.07.42-.34.87-.834.816l-4.95.002c-.5.055-.886-.413-.838-.89l.04-4.315z" fill="#fff" />
|
||||
</svg>
|
After Width: | Height: | Size: 664 B |
14
public/assets/images/icons/news.svg
Normal file
@ -0,0 +1,14 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:#231f20;}.cls-2,.cls-3{fill:none;stroke-miterlimit:10;stroke-width:6px;}.cls-2{stroke:#231f20;}.cls-3{stroke:#000;}</style>
|
||||
</defs>
|
||||
<title>News</title>
|
||||
<rect class="cls-1" x="31.77" y="32.96" width="33.79" height="20.76"/>
|
||||
<path class="cls-2" d="M115.36,113.8H27.18a6.67,6.67,0,0,1-6.67-6.67V19.27H108.2V107.1a6.71,6.71,0,0,0,6.71,6.7h0a6.71,6.71,0,0,0,6.71-6.71v-75H108.15"/>
|
||||
<line class="cls-3" x1="73.75" y1="36.18" x2="97.14" y2="36.18"/>
|
||||
<line class="cls-3" x1="73.75" y1="50.22" x2="97.14" y2="50.22"/>
|
||||
<line class="cls-3" x1="31.66" y1="64.25" x2="97.14" y2="64.25"/>
|
||||
<line class="cls-3" x1="31.66" y1="78.28" x2="97.14" y2="78.28"/>
|
||||
<line class="cls-3" x1="31.66" y1="92.31" x2="97.14" y2="92.31"/>
|
||||
<line class="cls-3" x1="31.66" y1="92.31" x2="97.14" y2="92.31"/>
|
||||
</svg>
|
After Width: | Height: | Size: 959 B |
10
public/assets/images/icons/profile.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}</style>
|
||||
<clipPath id="clip-path"><rect class="cls-1" x="45.51" y="44.33" width="55.14" height="59.33"/></clipPath>
|
||||
</defs>
|
||||
<title>Profile</title>
|
||||
<g class="cls-2">
|
||||
<path d="M86.77,58.12A13.79,13.79,0,1,0,73,71.91,13.79,13.79,0,0,0,86.77,58.12M97,103.67a3.41,3.41,0,0,0,3.39-3.84,27.57,27.57,0,0,0-54.61,0,3.41,3.41,0,0,0,3.39,3.84Z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 602 B |
10
public/assets/images/icons/settings.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}</style>
|
||||
<clipPath id="clip-path"><rect class="cls-1" x="45.65" y="42.62" width="49.58" height="52.43"/></clipPath>
|
||||
</defs>
|
||||
<title>settings</title>
|
||||
<g class="cls-2">
|
||||
<path d="M70.44,75a6.19,6.19,0,1,1,5.84-6.18A6,6,0,0,1,70.44,75M91.67,63.71h-5A18.4,18.4,0,0,0,85.19,60l3.48-3.68a3.93,3.93,0,0,0,0-5.32l-1.4-1.48a3.43,3.43,0,0,0-5,0l-3.48,3.68A16.34,16.34,0,0,0,75,51.59V46.38a3.68,3.68,0,0,0-3.56-3.76h-2a3.68,3.68,0,0,0-3.56,3.76v5.21a16.23,16.23,0,0,0-3.77,1.64l-3.48-3.68a3.43,3.43,0,0,0-5,0L52.21,51a3.93,3.93,0,0,0,0,5.32L55.69,60a18.21,18.21,0,0,0-1.48,3.67h-5a3.67,3.67,0,0,0-3.56,3.76v2.1a3.68,3.68,0,0,0,3.56,3.76h4.84a18.46,18.46,0,0,0,1.64,4.3l-3.48,3.68a3.93,3.93,0,0,0,0,5.32l1.4,1.48a3.43,3.43,0,0,0,5,0l3.48-3.68a16.36,16.36,0,0,0,3.77,1.64v5.21a3.67,3.67,0,0,0,3.56,3.76h2A3.67,3.67,0,0,0,75,91.29V86.08a16.48,16.48,0,0,0,3.77-1.64l3.48,3.68a3.43,3.43,0,0,0,5,0l1.4-1.48a3.93,3.93,0,0,0,0-5.32l-3.48-3.68a18.45,18.45,0,0,0,1.63-4.3h4.85a3.68,3.68,0,0,0,3.56-3.76v-2.1a3.67,3.67,0,0,0-3.56-3.76"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
13
public/assets/images/icons/sevenstar.svg
Normal file
@ -0,0 +1,13 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 107.45 104.74">
|
||||
<defs>
|
||||
<style>.cls-1{fill:#1a171b;}</style>
|
||||
</defs>
|
||||
<title>Seven Pointed Star</title>
|
||||
<polygon class="cls-1" points="43.83 52.37 48.83 14.03 53.83 52.37 43.83 52.37"/>
|
||||
<polygon class="cls-1" points="45.71 56.28 18.85 28.47 51.95 48.46 45.71 56.28"/>
|
||||
<polygon class="cls-1" points="49.94 57.25 11.45 60.9 47.72 47.5 49.94 57.25"/>
|
||||
<polygon class="cls-1" points="53.34 54.54 32.19 86.92 44.33 50.2 53.34 54.54"/>
|
||||
<polygon class="cls-1" points="53.34 50.2 65.47 86.92 44.33 54.54 53.34 50.2"/>
|
||||
<polygon class="cls-1" points="49.94 47.5 86.21 60.91 47.72 57.25 49.94 47.5"/>
|
||||
<polygon class="cls-1" points="45.71 48.46 78.81 28.47 51.95 56.28 45.71 48.46"/>
|
||||
</svg>
|
After Width: | Height: | Size: 809 B |
14
public/assets/images/icons/sevenstar_circle.svg
Normal file
@ -0,0 +1,14 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 107.45 104.74">
|
||||
<defs>
|
||||
<style>.cls-1{fill:#1a171b;}.cls-2{fill:none;stroke:#1a171b;stroke-miterlimit:10;}</style>
|
||||
</defs>
|
||||
<title>Seven Pointed Star with Circle</title>
|
||||
<polygon class="cls-1" points="43.83 52.37 48.83 14.03 53.83 52.37 43.83 52.37"/>
|
||||
<polygon class="cls-1" points="45.71 56.28 18.85 28.47 51.95 48.46 45.71 56.28"/>
|
||||
<polygon class="cls-1" points="49.94 57.25 11.45 60.9 47.72 47.5 49.94 57.25"/>
|
||||
<polygon class="cls-1" points="53.34 54.54 32.19 86.92 44.33 50.2 53.34 54.54"/>
|
||||
<polygon class="cls-1" points="53.34 50.2 65.47 86.92 44.33 54.54 53.34 50.2"/>
|
||||
<polygon class="cls-1" points="49.94 47.5 86.21 60.91 47.72 57.25 49.94 47.5"/>
|
||||
<polygon class="cls-1" points="45.71 48.46 78.81 28.47 51.95 56.28 45.71 48.46"/>
|
||||
<circle class="cls-2" cx="48.83" cy="52.37" r="38"/>
|
||||
</svg>
|
After Width: | Height: | Size: 932 B |
8
public/assets/images/icons/sevenstar_circle_extended.svg
Normal file
@ -0,0 +1,8 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 107.45 104.74">
|
||||
<defs>
|
||||
<style>.cls-1{fill:#1a171b;}.cls-2{fill:none;stroke:#1a171b;stroke-miterlimit:10;}</style>
|
||||
</defs>
|
||||
<title>Seven Pointed Star Extended with Circle</title>
|
||||
<path class="cls-1" d="M100.93,65.54C89,62,68.18,55.65,63.54,52.13c2.7-5.23,18.8-19.2,28-27.55C81.36,31.74,63.74,43.87,58.09,45.3c-2.41-5.37-3.61-26.52-4.37-39-.77,12.46-2,33.64-4.36,39-5.7-1.46-23.3-13.57-33.49-20.72,9.26,8.37,25.39,22.36,28,27.55C39.21,55.68,18.47,62,6.52,65.55c12.32-2,33.63-6.06,39.34-4.9-.16,5.87-8.41,26.16-13.11,37.69,6.1-10.89,16.52-30.16,21-33.9,4.5,3.79,14.93,23.09,21,34C70,86.84,61.73,66.48,61.59,60.65,67.36,59.49,88.64,63.52,100.93,65.54Z"/>
|
||||
<circle class="cls-2" cx="53.73" cy="53.9" r="38"/>
|
||||
</svg>
|
After Width: | Height: | Size: 822 B |
15
public/assets/images/icons/sevenstar_circle_hole.svg
Normal file
@ -0,0 +1,15 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 107.45 104.74">
|
||||
<defs>
|
||||
<style>.cls-1{fill:#1a171b;}.cls-2{fill:none;stroke:#1a171b;stroke-miterlimit:10;}.cls-3{fill:#fff;}</style>
|
||||
</defs>
|
||||
<title>Seven Pointed Star with Circle and Hole</title>
|
||||
<polygon class="cls-1" points="43.83 52.37 48.83 14.03 53.83 52.37 43.83 52.37"/>
|
||||
<polygon class="cls-1" points="45.71 56.28 18.85 28.47 51.95 48.46 45.71 56.28"/>
|
||||
<polygon class="cls-1" points="49.94 57.25 11.45 60.9 47.72 47.5 49.94 57.25"/>
|
||||
<polygon class="cls-1" points="53.34 54.54 32.19 86.92 44.33 50.2 53.34 54.54"/>
|
||||
<polygon class="cls-1" points="53.34 50.2 65.47 86.92 44.33 54.54 53.34 50.2"/>
|
||||
<polygon class="cls-1" points="49.94 47.5 86.21 60.91 47.72 57.25 49.94 47.5"/>
|
||||
<polygon class="cls-1" points="45.71 48.46 78.81 28.47 51.95 56.28 45.71 48.46"/>
|
||||
<circle class="cls-2" cx="48.83" cy="52.37" r="38"/>
|
||||
<circle class="cls-3" cx="48.83" cy="52.37" r="4.56"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1018 B |
@ -0,0 +1,9 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 107.45 104.74">
|
||||
<defs>
|
||||
<style>.cls-1{fill:#1a171b;}.cls-2{fill:none;stroke:#1a171b;stroke-miterlimit:10;}.cls-3{fill:#fff;}</style>
|
||||
</defs>
|
||||
<title>Seven Pointed Star Extended with Circle and Hole</title>
|
||||
<path class="cls-1" d="M100.93,65.54C89,62,68.18,55.65,63.54,52.13c2.7-5.23,18.8-19.2,28-27.55C81.36,31.74,63.74,43.87,58.09,45.3c-2.41-5.37-3.61-26.52-4.37-39-.77,12.46-2,33.64-4.36,39-5.7-1.46-23.3-13.57-33.49-20.72,9.26,8.37,25.39,22.36,28,27.55C39.21,55.68,18.47,62,6.52,65.55c12.32-2,33.63-6.06,39.34-4.9-.16,5.87-8.41,26.16-13.11,37.69,6.1-10.89,16.52-30.16,21-33.9,4.5,3.79,14.93,23.09,21,34C70,86.84,61.73,66.48,61.59,60.65,67.36,59.49,88.64,63.52,100.93,65.54Z"/>
|
||||
<circle class="cls-2" cx="53.73" cy="53.9" r="38"/>
|
||||
<circle class="cls-3" cx="53.73" cy="53.9" r="4.56"/>
|
||||
</svg>
|
After Width: | Height: | Size: 907 B |
7
public/assets/images/icons/sevenstar_extended.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 107.45 104.74">
|
||||
<defs>
|
||||
<style>.cls-1{fill:#1a171b;}</style>
|
||||
</defs>
|
||||
<title>Seven Pointed Star Extended</title>
|
||||
<path class="cls-1" d="M100.93,65.54C89,62,68.18,55.65,63.54,52.13c2.7-5.23,18.8-19.2,28-27.55C81.36,31.74,63.74,43.87,58.09,45.3c-2.41-5.37-3.61-26.52-4.37-39-.77,12.46-2,33.64-4.36,39-5.7-1.46-23.3-13.57-33.49-20.72,9.26,8.37,25.39,22.36,28,27.55C39.21,55.68,18.47,62,6.52,65.55c12.32-2,33.63-6.06,39.34-4.9-.16,5.87-8.41,26.16-13.11,37.69,6.1-10.89,16.52-30.16,21-33.9,4.5,3.79,14.93,23.09,21,34C70,86.84,61.73,66.48,61.59,60.65,67.36,59.49,88.64,63.52,100.93,65.54Z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 700 B |
13
public/assets/images/icons/twitter.svg
Normal file
After Width: | Height: | Size: 9.8 KiB |
10
public/assets/images/icons/youtube.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}</style>
|
||||
<clipPath id="clip-path"><rect class="cls-1" x="38.29" y="45.86" width="70.16" height="48.48"/></clipPath>
|
||||
</defs>
|
||||
<title>youtube</title>
|
||||
<g class="cls-2">
|
||||
<path d="M84.8,69.52,65.88,79.76V59.27Zm23.65.59c0-5.14-.79-17.63-3.94-20.57S99,45.86,73.37,45.86s-28,.73-31.14,3.68S38.29,65,38.29,70.11s.79,17.63,3.94,20.57,5.52,3.68,31.14,3.68,28-.74,31.14-3.68,3.94-15.42,3.94-20.57"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 654 B |
BIN
public/assets/images/minecraft.icns
Normal file
37
scripts/postfrontbuild.cjs
Normal file
@ -0,0 +1,37 @@
|
||||
const fs = require("fs-extra");
|
||||
const HTMLMinifier = require("html-minifier");
|
||||
const { join } = require("path");
|
||||
|
||||
const basePath = join(__dirname, "..", "build", "frontend");
|
||||
const htmlFile = fs.readFileSync(join(basePath, "src", "frontend", "index.html"), "utf-8");
|
||||
fs.rm(join(basePath, "src"), { recursive: true });
|
||||
|
||||
const unminifiedCorrected = htmlFile
|
||||
.replace(
|
||||
`<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src http://localhost:*; connect-src ws://localhost:*">`,
|
||||
`<meta http-equiv="Content-Security-Policy" content="default-src 'self'">`
|
||||
)
|
||||
.replaceAll("../../", "./");
|
||||
|
||||
unminifiedCorrected;
|
||||
|
||||
const minifierOptions = {
|
||||
preserveLineBreaks: false,
|
||||
collapseWhitespace: true,
|
||||
collapseInlineTagWhitespace: true,
|
||||
minifyURLs: true,
|
||||
minifyJS: true,
|
||||
minifyCSS: true,
|
||||
removeComments: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeEmptyAttributes: true,
|
||||
removeEmptyElements: true,
|
||||
removeRedundantAttributes: true,
|
||||
removeScriptTypeAttributes: true,
|
||||
removeStyleLinkTypeAttributes: true,
|
||||
useShortDoctype: true,
|
||||
quoteCharacter: "'",
|
||||
};
|
||||
|
||||
const minified = HTMLMinifier.minify(unminifiedCorrected, minifierOptions);
|
||||
fs.writeFileSync(join(basePath, "index.html"), minified);
|
178
src/electron/main.cts
Normal file
@ -0,0 +1,178 @@
|
||||
import {
|
||||
app,
|
||||
BrowserWindow,
|
||||
ipcMain,
|
||||
Notification,
|
||||
// nativeImage
|
||||
} from "electron";
|
||||
import { join } from "path";
|
||||
import { parse } from "url";
|
||||
import { autoUpdater } from "electron-updater";
|
||||
|
||||
import logger from "./utils/logger.cjs";
|
||||
import settings from "./utils/settings.cjs";
|
||||
|
||||
const isProd = process.env.NODE_ENV === "production" || app.isPackaged;
|
||||
console.log("isprod: ", isProd)
|
||||
logger.info("App starting...");
|
||||
settings.set("check", true);
|
||||
logger.info("Checking if settings store works correctly.");
|
||||
logger.info(settings.get("check") ? "Settings store works correctly." : "Settings store has a problem.");
|
||||
|
||||
let mainWindow: BrowserWindow | null;
|
||||
let notification: Notification | null;
|
||||
|
||||
const createWindow = () => {
|
||||
mainWindow = new BrowserWindow({
|
||||
width: 980,
|
||||
height: 552,
|
||||
frame: false,
|
||||
webPreferences: {
|
||||
// preload: join(__dirname, 'app', 'assets', 'js', 'preloader.js'),
|
||||
// devTools: isProd ? false : true,
|
||||
devTools: true,
|
||||
|
||||
// Make that false some day.
|
||||
nodeIntegration: true,
|
||||
contextIsolation: false
|
||||
},
|
||||
backgroundColor: '#171614'
|
||||
});
|
||||
|
||||
if (!isProd) {
|
||||
mainWindow.loadURL("http://localhost:5173/src/frontend/").catch((err) => {
|
||||
logger.error(JSON.stringify(err));
|
||||
app.quit();
|
||||
});
|
||||
} else {
|
||||
mainWindow.loadFile(join(__dirname, "..", "frontend", "index.html")).catch((err) => {
|
||||
logger.error(JSON.stringify(err));
|
||||
app.quit();
|
||||
});
|
||||
}
|
||||
// mainWindow.removeMenu();
|
||||
|
||||
mainWindow.resizable = true;
|
||||
mainWindow.webContents.openDevTools();
|
||||
|
||||
if (!isProd) mainWindow.webContents.openDevTools();
|
||||
|
||||
mainWindow.on("closed", () => {
|
||||
mainWindow = null;
|
||||
});
|
||||
};
|
||||
|
||||
app.on("ready", createWindow);
|
||||
|
||||
// those two events are completely optional to subscrbe to, but that's a common way to get the
|
||||
// user experience people expect to have on macOS: do not quit the application directly
|
||||
// after the user close the last window, instead wait for Command + Q (or equivalent).
|
||||
app.on("window-all-closed", () => {
|
||||
if (process.platform !== "darwin") app.quit();
|
||||
});
|
||||
|
||||
app.on("activate", () => {
|
||||
if (mainWindow === null) createWindow();
|
||||
});
|
||||
|
||||
app.on("web-contents-created", (e, contents) => {
|
||||
logger.info(e);
|
||||
// Security of webviews
|
||||
contents.on("will-attach-webview", (event, webPreferences, params) => {
|
||||
logger.info(event, params);
|
||||
// Strip away preload scripts if unused or verify their location is legitimate
|
||||
delete webPreferences.preload;
|
||||
|
||||
// Disable Node.js integration
|
||||
webPreferences.nodeIntegration = false;
|
||||
|
||||
// Verify URL being loaded
|
||||
// if (!params.src.startsWith(`file://${join(__dirname)}`)) {
|
||||
// event.preventDefault(); // We do not open anything now
|
||||
// }
|
||||
});
|
||||
|
||||
contents.on("will-navigate", (event, navigationUrl) => {
|
||||
const parsedURL = parse(navigationUrl);
|
||||
// In dev mode allow Hot Module Replacement
|
||||
if (parsedURL.host !== "localhost:5173" && !isProd) {
|
||||
logger.warn("Stopped attempt to open: " + navigationUrl);
|
||||
event.preventDefault();
|
||||
} else if (isProd) {
|
||||
// logger.warn("Stopped attempt to open: " + navigationUrl);
|
||||
// event.preventDefault();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
if (isProd)
|
||||
autoUpdater.checkForUpdates().catch((err) => {
|
||||
logger.error(JSON.stringify(err));
|
||||
});
|
||||
|
||||
autoUpdater.logger = logger;
|
||||
|
||||
autoUpdater.on("update-available", () => {
|
||||
notification = new Notification({
|
||||
title: "Jean-eude",
|
||||
body: "Updates are available. Click to download.",
|
||||
silent: true,
|
||||
// icon: nativeImage.createFromPath(join(__dirname, "..", "assets", "icon.png"),
|
||||
});
|
||||
notification.show();
|
||||
notification.on("click", () => {
|
||||
autoUpdater.downloadUpdate().catch((err) => {
|
||||
logger.error(JSON.stringify(err));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
autoUpdater.on("update-not-available", () => {
|
||||
notification = new Notification({
|
||||
title: "Electron-Svelte-Typescript",
|
||||
body: "Your software is up to date.",
|
||||
silent: true,
|
||||
// icon: nativeImage.createFromPath(join(__dirname, "..", "assets", "icon.png"),
|
||||
});
|
||||
notification.show();
|
||||
});
|
||||
|
||||
autoUpdater.on("update-downloaded", () => {
|
||||
notification = new Notification({
|
||||
title: "Electron-Svelte-Typescript",
|
||||
body: "The updates are ready. Click to quit and install.",
|
||||
silent: true,
|
||||
// icon: nativeImage.createFromPath(join(__dirname, "..", "assets", "icon.png"),
|
||||
});
|
||||
notification.show();
|
||||
notification.on("click", () => {
|
||||
autoUpdater.quitAndInstall();
|
||||
});
|
||||
});
|
||||
|
||||
autoUpdater.on("error", (err) => {
|
||||
notification = new Notification({
|
||||
title: "Electron-Svelte-Typescript",
|
||||
body: JSON.stringify(err),
|
||||
// icon: nativeImage.createFromPath(join(__dirname, "..", "assets", "icon.png"),
|
||||
});
|
||||
notification.show();
|
||||
});
|
||||
|
||||
ipcMain.on("quit", () => {
|
||||
mainWindow?.close();
|
||||
app.quit();
|
||||
})
|
||||
|
||||
|
||||
ipcMain.on("focus:main", () => {
|
||||
if (!mainWindow?.isMaximized()) {
|
||||
mainWindow?.maximize();
|
||||
return;
|
||||
}
|
||||
mainWindow?.unmaximize();
|
||||
})
|
||||
|
||||
ipcMain.on("reduce:main", () => {
|
||||
mainWindow?.minimize();
|
||||
})
|
28
src/electron/tsconfig.json
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"compileOnSave": true,
|
||||
"compilerOptions": {
|
||||
"outDir": "../../build/electron",
|
||||
"target": "es2020",
|
||||
"module": "commonjs",
|
||||
"sourceMap": true,
|
||||
"stripInternal": true,
|
||||
"lib": ["es2020", "esnext", "dom"],
|
||||
"moduleResolution": "node",
|
||||
"noImplicitAny": true,
|
||||
"strictNullChecks": true,
|
||||
"strictFunctionTypes": true,
|
||||
"noImplicitThis": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noEmitOnError": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"esModuleInterop": true,
|
||||
"isolatedModules": true
|
||||
},
|
||||
"include": ["."],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
28
src/electron/tsconfig.prod.json
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"compileOnSave": true,
|
||||
"compilerOptions": {
|
||||
"outDir": "../../build/electron",
|
||||
"target": "es2020",
|
||||
"module": "commonjs",
|
||||
"sourceMap": false,
|
||||
"stripInternal": true,
|
||||
"lib": ["es2020", "esnext", "dom"],
|
||||
"moduleResolution": "node",
|
||||
"noImplicitAny": true,
|
||||
"strictNullChecks": true,
|
||||
"strictFunctionTypes": true,
|
||||
"noImplicitThis": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noEmitOnError": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"esModuleInterop": true,
|
||||
"isolatedModules": true
|
||||
},
|
||||
"include": ["."],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
10
src/electron/utils/logger.cts
Normal file
@ -0,0 +1,10 @@
|
||||
import * as log from "electron-log";
|
||||
|
||||
// const isDevMode = process.execPath.match(/[\\/]electron/);
|
||||
const isProd = process.env.NODE_ENV === "production" || !/[\\/]electron/.exec(process.execPath); // !process.execPath.match(/[\\/]electron/);
|
||||
|
||||
const logger = log;
|
||||
logger.transports.file.level = isProd ? "info" : "silly";
|
||||
logger.transports.console.level = isProd ? false : "silly";
|
||||
|
||||
export default logger;
|
13
src/electron/utils/settings.cts
Normal file
@ -0,0 +1,13 @@
|
||||
import ElectronStore from "electron-store";
|
||||
|
||||
interface ISettings {
|
||||
check: boolean;
|
||||
}
|
||||
|
||||
const settings = new ElectronStore<ISettings>({
|
||||
defaults: {
|
||||
check: false,
|
||||
},
|
||||
});
|
||||
|
||||
export default settings;
|
123
src/frontend/App.svelte
Normal file
@ -0,0 +1,123 @@
|
||||
<style>
|
||||
main {
|
||||
height: calc(100% - 22px);
|
||||
background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0) 100%);
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Loading container, placed above everything. */
|
||||
#loadingContainer {
|
||||
position: absolute;
|
||||
z-index: 400;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: calc(100% - 22px);
|
||||
background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0) 100%);
|
||||
}
|
||||
|
||||
/* Loading content container. */
|
||||
#loadingContent {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/* Spinner container. */
|
||||
#loadSpinnerContainer {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/* Stationary image for the spinner. */
|
||||
#loadCenterImage {
|
||||
position: absolute;
|
||||
width: 277px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/* Rotating image for the spinner. */
|
||||
#loadSpinnerImage {
|
||||
width: 280px;
|
||||
height: auto;
|
||||
z-index: 400;
|
||||
}
|
||||
|
||||
/* Rotating animation for the spinner. */
|
||||
@keyframes rotating {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
/* Class which is applied when the spinner image is spinning. */
|
||||
.rotating {
|
||||
animation: rotating 10s linear infinite;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script lang="ts">
|
||||
import { SvelteComponent, SvelteComponentTyped } from "svelte";
|
||||
import { fade } from "svelte/transition";
|
||||
|
||||
import { currentView, mainReady } from "./store/AppStore";
|
||||
import { PossibleViewState } from "./types/PossibleAppState.js";
|
||||
import Frame from "./views/Frame.svelte";
|
||||
import Landing from "./views/Landing.svelte";
|
||||
import Login from "./views/Login.svelte";
|
||||
import LoginOptions from "./views/LoginOptions.svelte";
|
||||
import Overlay from "./views/Overlay.svelte";
|
||||
import Settings from "./views/Settings.svelte";
|
||||
import WaitingMicrosoft from "./views/WaitingMicrosoft.svelte";
|
||||
import Welcome from "./views/Welcome.svelte";
|
||||
|
||||
const views = [Welcome, Login, WaitingMicrosoft, LoginOptions, Settings, Landing];
|
||||
let isPreloading = false;
|
||||
|
||||
setTimeout(() => {
|
||||
currentView.set(PossibleViewState.Welcome);
|
||||
}, 1000);
|
||||
|
||||
currentView.subscribe((value) => {
|
||||
if (value == PossibleViewState.Loading) {
|
||||
isPreloading = true;
|
||||
return;
|
||||
}
|
||||
if (isPreloading) isPreloading = false;
|
||||
});
|
||||
|
||||
mainReady.set(true);
|
||||
document.body.style.backgroundImage = `url('./assets/images/backgrounds/${Math.floor(Math.random() * 7)}.jpg')`;
|
||||
document.body.style.backgroundSize = "cover";
|
||||
document.body.style.backgroundRepeat = "no-repeat";
|
||||
</script>
|
||||
|
||||
<Frame />
|
||||
{#if views[$currentView]}
|
||||
<main>
|
||||
<svelte:component this="{views[$currentView]}" />
|
||||
</main>
|
||||
{/if}
|
||||
<Overlay />
|
||||
|
||||
{#if isPreloading}
|
||||
<div id="loadingContainer" out:fade>
|
||||
<div id="loadingContent">
|
||||
<div id="loadSpinnerContainer">
|
||||
<img id="loadCenterImage" src="./assets/images/LoadingSeal.png" alt="Preload" />
|
||||
<img id="loadSpinnerImage" class="rotating" src="./assets/images/LoadingText.png" alt="Preload" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
0
src/frontend/app.css
Normal file
129
src/frontend/assets/css/github-dark.css
Normal file
@ -0,0 +1,129 @@
|
||||
/*!
|
||||
* GitHub Dark v0.5.0
|
||||
* Copyright (c) 2012 - 2017 GitHub, Inc.
|
||||
* Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE)
|
||||
*/
|
||||
|
||||
.pl-c /* comment, punctuation.definition.comment, string.comment */ {
|
||||
color: #959da5;
|
||||
}
|
||||
|
||||
.pl-c1 /* constant, entity.name.constant, variable.other.constant, variable.language, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.quote, markup.raw, meta.diff.header */,
|
||||
.pl-s .pl-v /* string variable */ {
|
||||
color: #c8e1ff;
|
||||
}
|
||||
|
||||
.pl-e /* entity */,
|
||||
.pl-en /* entity.name */ {
|
||||
color: #b392f0;
|
||||
}
|
||||
|
||||
.pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */,
|
||||
.pl-s .pl-s1 /* string source */ {
|
||||
color: #f6f8fa;
|
||||
}
|
||||
|
||||
.pl-ent /* entity.name.tag */ {
|
||||
color: #7bcc72;
|
||||
}
|
||||
|
||||
.pl-k /* keyword, storage, storage.type */ {
|
||||
color: #ea4a5a;
|
||||
}
|
||||
|
||||
.pl-s /* string */,
|
||||
.pl-pds /* punctuation.definition.string, source.regexp, string.regexp.character-class */,
|
||||
.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */,
|
||||
.pl-sr /* string.regexp */,
|
||||
.pl-sr .pl-cce /* string.regexp constant.character.escape */,
|
||||
.pl-sr .pl-sre /* string.regexp source.ruby.embedded */,
|
||||
.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ {
|
||||
color: #79b8ff;
|
||||
}
|
||||
|
||||
.pl-v /* variable */,
|
||||
.pl-ml /* markup.list, sublimelinter.mark.warning */ {
|
||||
color: #fb8532;
|
||||
}
|
||||
|
||||
.pl-bu /* invalid.broken, invalid.deprecated, invalid.unimplemented, message.error, brackethighlighter.unmatched, sublimelinter.mark.error */ {
|
||||
color: #d73a49;
|
||||
}
|
||||
|
||||
.pl-ii /* invalid.illegal */ {
|
||||
color: #fafbfc;
|
||||
background-color: #d73a49;
|
||||
}
|
||||
|
||||
.pl-c2 /* carriage-return */ {
|
||||
color: #fafbfc;
|
||||
background-color: #d73a49;
|
||||
}
|
||||
|
||||
.pl-c2::before /* carriage-return */ {
|
||||
content: "^M";
|
||||
}
|
||||
|
||||
.pl-sr .pl-cce /* string.regexp constant.character.escape */ {
|
||||
font-weight: bold;
|
||||
color: #7bcc72;
|
||||
}
|
||||
|
||||
.pl-mh /* markup.heading */,
|
||||
.pl-mh .pl-en /* markup.heading entity.name */,
|
||||
.pl-ms /* meta.separator */ {
|
||||
font-weight: bold;
|
||||
color: #0366d6;
|
||||
}
|
||||
|
||||
.pl-mi /* markup.italic */ {
|
||||
font-style: italic;
|
||||
color: #f6f8fa;
|
||||
}
|
||||
|
||||
.pl-mb /* markup.bold */ {
|
||||
font-weight: bold;
|
||||
color: #f6f8fa;
|
||||
}
|
||||
|
||||
.pl-md /* markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted */ {
|
||||
color: #b31d28;
|
||||
background-color: #ffeef0;
|
||||
}
|
||||
|
||||
.pl-mi1 /* markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted */ {
|
||||
color: #176f2c;
|
||||
background-color: #f0fff4;
|
||||
}
|
||||
|
||||
.pl-mc /* markup.changed, punctuation.definition.changed */ {
|
||||
color: #b08800;
|
||||
background-color: #fffdef;
|
||||
}
|
||||
|
||||
.pl-mi2 /* markup.ignored, markup.untracked */ {
|
||||
color: #2f363d;
|
||||
background-color: #959da5;
|
||||
}
|
||||
|
||||
.pl-mdr /* meta.diff.range */ {
|
||||
font-weight: bold;
|
||||
color: #b392f0;
|
||||
}
|
||||
|
||||
.pl-mo /* meta.output */ {
|
||||
color: #0366d6;
|
||||
}
|
||||
|
||||
.pl-ba /* brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote */ {
|
||||
color: #ffeef0;
|
||||
}
|
||||
|
||||
.pl-sg /* sublimelinter.gutter-mark */ {
|
||||
color: #6a737d;
|
||||
}
|
||||
|
||||
.pl-corl /* constant.other.reference.link, string.other.link */ {
|
||||
text-decoration: underline;
|
||||
color: #79b8ff;
|
||||
}
|
43
src/frontend/assets/css/global.css
Normal file
@ -0,0 +1,43 @@
|
||||
/* Github Code Highlighting. */
|
||||
@import "./github-dark.css";
|
||||
@import "./launcher.css";
|
||||
|
||||
@font-face {
|
||||
font-family: "Avenir Book";
|
||||
src: url("../fonts/Avenir-Book.ttf");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Avenir Medium";
|
||||
src: url("../fonts/Avenir-Medium.ttf");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Ringbearer";
|
||||
src: url("../fonts/Ringbearer.ttf");
|
||||
}
|
||||
|
||||
/* Reset body, html, and div presets. */
|
||||
body,
|
||||
html,
|
||||
div {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
/* Reset p presets. */
|
||||
p {
|
||||
-webkit-margin-before: 0em;
|
||||
-webkit-margin-after: 0em;
|
||||
}
|
||||
|
||||
/* Set default font and color. */
|
||||
body,
|
||||
button {
|
||||
font-family: "Avenir Book";
|
||||
color: white;
|
||||
}
|
||||
|
||||
body {
|
||||
background-image: url("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2ODApLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAPwBwAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A8VooopDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/9k=");
|
||||
}
|
3971
src/frontend/assets/css/launcher.css
Normal file
BIN
src/frontend/assets/fonts/Avenir-Black.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-BlackOblique.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-Book.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-BookOblique.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-Heavy.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-HeavyOblique.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-Light.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-LightOblique.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-Medium.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-MediumOblique.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-Oblique.ttf
Normal file
BIN
src/frontend/assets/fonts/Avenir-Roman.ttf
Normal file
BIN
src/frontend/assets/fonts/ringbearer.ttf
Normal file
BIN
src/frontend/assets/images/LoadingSeal.png
Normal file
After Width: | Height: | Size: 244 KiB |
BIN
src/frontend/assets/images/LoadingText.png
Normal file
After Width: | Height: | Size: 124 KiB |
BIN
src/frontend/assets/images/SealCircle.ico
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
src/frontend/assets/images/SealCircle.png
Normal file
After Width: | Height: | Size: 142 KiB |
BIN
src/frontend/assets/images/backgrounds/0.jpg
Normal file
After Width: | Height: | Size: 160 KiB |
BIN
src/frontend/assets/images/backgrounds/1.jpg
Normal file
After Width: | Height: | Size: 181 KiB |
BIN
src/frontend/assets/images/backgrounds/2.jpg
Normal file
After Width: | Height: | Size: 502 KiB |
BIN
src/frontend/assets/images/backgrounds/3.jpg
Normal file
After Width: | Height: | Size: 1.0 MiB |
BIN
src/frontend/assets/images/backgrounds/4.jpg
Normal file
After Width: | Height: | Size: 268 KiB |
BIN
src/frontend/assets/images/backgrounds/5.jpg
Normal file
After Width: | Height: | Size: 456 KiB |
BIN
src/frontend/assets/images/backgrounds/6.jpg
Normal file
After Width: | Height: | Size: 2.6 MiB |
BIN
src/frontend/assets/images/backgrounds/7.jpg
Normal file
After Width: | Height: | Size: 5.0 MiB |
7
src/frontend/assets/images/icons/arrow.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24.87 13.97">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;stroke:#FFF;stroke-width:2px;}</style>
|
||||
</defs>
|
||||
<title>arrow</title>
|
||||
<polyline class="cls-1" points="0.71 13.26 12.56 1.41 24.16 13.02"/>
|
||||
</svg>
|
After Width: | Height: | Size: 298 B |
10
src/frontend/assets/images/icons/discord.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}</style>
|
||||
<clipPath id="clip-path"><rect class="cls-1" x="36.42" y="44.23" width="68.52" height="48.96"/></clipPath>
|
||||
</defs>
|
||||
<title>discord</title>
|
||||
<g class="cls-2">
|
||||
<path d="M81.23,78.48a6.14,6.14,0,1,1,6.14-6.14,6.14,6.14,0,0,1-6.14,6.14M60,78.48a6.14,6.14,0,1,1,6.14-6.14A6.14,6.14,0,0,1,60,78.48M104.41,73c-.92-7.7-8.24-22.9-8.24-22.9A43,43,0,0,0,88,45.59a17.88,17.88,0,0,0-8.38-1.27l-.13,1.06a23.52,23.52,0,0,1,5.8,1.95,87.59,87.59,0,0,1,8.17,4.87s-10.32-5.63-22.27-5.63a51.32,51.32,0,0,0-23.2,5.63,87.84,87.84,0,0,1,8.17-4.87,23.57,23.57,0,0,1,5.8-1.95l-.13-1.06a17.88,17.88,0,0,0-8.38,1.27,42.84,42.84,0,0,0-8.21,4.56S37.87,65.35,37,73s-.37,11.54-.37,11.54,4.22,5.68,9.9,7.14,7.7,1.47,7.7,1.47l3.75-4.68a21.22,21.22,0,0,1-4.65-2A24.47,24.47,0,0,1,47.93,82S61.16,88.4,70.68,88.4c10,0,22.75-6.44,22.75-6.44a24.56,24.56,0,0,1-5.35,4.56,21.22,21.22,0,0,1-4.65,2l3.75,4.68s2,0,7.7-1.47,9.89-7.14,9.89-7.14.55-3.85-.37-11.54"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
9
src/frontend/assets/images/icons/instagram.svg
Normal file
@ -0,0 +1,9 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="504px" height="504px" viewBox="0 0 5040 5040" preserveAspectRatio="xMidYMid meet">
|
||||
<g id="layer101" fill="#000000" stroke="none">
|
||||
<path d="M1390 5024 c-163 -9 -239 -19 -315 -38 -281 -70 -477 -177 -660 -361 -184 -184 -292 -380 -361 -660 -43 -171 -53 -456 -53 -1445 0 -989 10 -1274 53 -1445 69 -280 177 -476 361 -660 184 -184 380 -292 660 -361 171 -43 456 -53 1445 -53 989 0 1274 10 1445 53 280 69 476 177 660 361 184 184 292 380 361 660 43 171 53 456 53 1445 0 989 -10 1274 -53 1445 -69 280 -177 476 -361 660 -184 184 -380 292 -660 361 -174 44 -454 53 -1470 52 -599 0 -960 -5 -1105 -14z m2230 -473 c58 -6 141 -18 185 -27 397 -78 638 -318 719 -714 37 -183 41 -309 41 -1290 0 -981 -4 -1107 -41 -1290 -81 -395 -319 -633 -714 -714 -183 -37 -309 -41 -1290 -41 -981 0 -1107 4 -1290 41 -397 81 -636 322 -714 719 -33 166 -38 296 -43 1100 -5 796 3 1203 27 1380 67 489 338 758 830 825 47 7 162 15 255 20 250 12 1907 4 2035 -9z"/>
|
||||
<path d="M2355 3819 c-307 -42 -561 -172 -780 -400 -244 -253 -359 -543 -359 -899 0 -361 116 -648 367 -907 262 -269 563 -397 937 -397 374 0 675 128 937 397 251 259 367 546 367 907 0 361 -116 648 -367 907 -197 203 -422 326 -690 378 -101 20 -317 27 -412 14z m400 -509 c275 -88 470 -284 557 -560 20 -65 23 -95 23 -230 0 -135 -3 -165 -23 -230 -88 -278 -284 -474 -562 -562 -65 -20 -95 -23 -230 -23 -135 0 -165 3 -230 23 -278 88 -474 284 -562 562 -20 65 -23 95 -23 230 0 135 3 165 23 230 73 230 219 403 427 507 134 67 212 83 390 79 111 -3 155 -8 210 -26z"/>
|
||||
<path d="M3750 1473 c-29 -11 -66 -38 -106 -77 -70 -71 -94 -126 -94 -221 0 -95 24 -150 94 -221 72 -71 126 -94 225 -94 168 0 311 143 311 311 0 99 -23 154 -94 225 -43 42 -76 66 -110 77 -61 21 -166 21 -226 0z"/>
|
||||
</g>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
11
src/frontend/assets/images/icons/link.svg
Normal file
@ -0,0 +1,11 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}</style>
|
||||
<clipPath id="clip-path"><rect class="cls-1" x="29.3" y="52.62" width="82.77" height="34.15"/></clipPath>
|
||||
</defs>
|
||||
<title>link</title>
|
||||
<g class="cls-2">
|
||||
<path d="M75.37,65.51a3.85,3.85,0,0,0-1.73.42,8.22,8.22,0,0,1,.94,3.76A8.36,8.36,0,0,1,66.23,78H46.37a8.35,8.35,0,1,1,0-16.7h9.18a21.51,21.51,0,0,1,6.65-8.72H46.37a17.07,17.07,0,1,0,0,34.15H66.23A17,17,0,0,0,82.77,65.51Z"/>
|
||||
<path d="M66,73.88a3.85,3.85,0,0,0,1.73-.42,8.22,8.22,0,0,1-.94-3.76,8.36,8.36,0,0,1,8.35-8.35H95A8.35,8.35,0,1,1,95,78H85.8a21.51,21.51,0,0,1-6.65,8.72H95a17.07,17.07,0,0,0,0-34.15H75.13A17,17,0,0,0,58.59,73.88Z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 875 B |
12
src/frontend/assets/images/icons/lock.svg
Normal file
@ -0,0 +1,12 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}.cls-3{fill:#231f20;}</style>
|
||||
<clipPath id="clip-path">
|
||||
<rect class="cls-1" x="44.02" y="34.21" width="51.96" height="68.48"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<title>Lock</title>
|
||||
<g class="cls-2">
|
||||
<path class="cls-3" d="M86.16,54a16.38,16.38,0,1,0-32,0H44V102.7H96V54Zm-25.9-3.39a9.89,9.89,0,1,1,19.77,0A9.78,9.78,0,0,1,79.39,54H60.89A9.78,9.78,0,0,1,60.26,50.59ZM70,96.2a6.5,6.5,0,0,1-6.5-6.5,6.39,6.39,0,0,1,3.1-5.4V67h6.5V84.11a6.42,6.42,0,0,1,3.39,5.6A6.5,6.5,0,0,1,70,96.2Z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 756 B |
7
src/frontend/assets/images/icons/microsoft.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23 23">
|
||||
<path fill="#f3f3f3" d="M0 0h23v23H0z" />
|
||||
<path fill="#f35325" d="M1 1h10v10H1z" />
|
||||
<path fill="#81bc06" d="M12 1h10v10H12z" />
|
||||
<path fill="#05a6f0" d="M1 12h10v10H1z" />
|
||||
<path fill="#ffba08" d="M12 12h10v10H12z" />
|
||||
</svg>
|
After Width: | Height: | Size: 303 B |
5
src/frontend/assets/images/icons/mojang.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 9.677 9.667">
|
||||
<path d="M-26.332-12.098h2.715c-1.357.18-2.574 1.23-2.715 2.633z" fill="#fff" />
|
||||
<path d="M2.598.022h7.07L9.665 7c-.003 1.334-1.113 2.46-2.402 2.654H0V2.542C.134 1.2 1.3.195 2.598.022z" fill="#db2331" />
|
||||
<path d="M1.54 2.844c.314-.76 1.31-.46 1.954-.528.785-.083 1.503.272 2.1.758l.164-.9c.327.345.587.756.964 1.052.28.254.655-.342.86-.013.42.864.408 1.86.54 2.795l-.788-.373C6.9 4.17 5.126 3.052 3.656 3.685c-1.294.592-1.156 2.65.06 3.255 1.354.703 2.953.51 4.405.292-.07.42-.34.87-.834.816l-4.95.002c-.5.055-.886-.413-.838-.89l.04-4.315z" fill="#fff" />
|
||||
</svg>
|
After Width: | Height: | Size: 664 B |
14
src/frontend/assets/images/icons/news.svg
Normal file
@ -0,0 +1,14 @@
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 141.36 137.43">
|
||||
<defs>
|
||||
<style>.cls-1{fill:#231f20;}.cls-2,.cls-3{fill:none;stroke-miterlimit:10;stroke-width:6px;}.cls-2{stroke:#231f20;}.cls-3{stroke:#000;}</style>
|
||||
</defs>
|
||||
<title>News</title>
|
||||
<rect class="cls-1" x="31.77" y="32.96" width="33.79" height="20.76"/>
|
||||
<path class="cls-2" d="M115.36,113.8H27.18a6.67,6.67,0,0,1-6.67-6.67V19.27H108.2V107.1a6.71,6.71,0,0,0,6.71,6.7h0a6.71,6.71,0,0,0,6.71-6.71v-75H108.15"/>
|
||||
<line class="cls-3" x1="73.75" y1="36.18" x2="97.14" y2="36.18"/>
|
||||
<line class="cls-3" x1="73.75" y1="50.22" x2="97.14" y2="50.22"/>
|
||||
<line class="cls-3" x1="31.66" y1="64.25" x2="97.14" y2="64.25"/>
|
||||
<line class="cls-3" x1="31.66" y1="78.28" x2="97.14" y2="78.28"/>
|
||||
<line class="cls-3" x1="31.66" y1="92.31" x2="97.14" y2="92.31"/>
|
||||
<line class="cls-3" x1="31.66" y1="92.31" x2="97.14" y2="92.31"/>
|
||||
</svg>
|
After Width: | Height: | Size: 959 B |