From 11c4264c2a6bdfcfd5d76e8ef537153e11d4b581 Mon Sep 17 00:00:00 2001 From: CodeDoctorDE Date: Tue, 9 May 2023 12:59:00 +0200 Subject: [PATCH] Add docs --- CODE_OF_CONDUCT.md | 128 +++++++++ CONTRIBUTING.md | 70 +++++ README.md | 1 - app/pubspec.lock | 32 +-- app/pubspec.yaml | 6 +- docs/community/branding.md | 17 ++ docs/community/changelog.md | 13 + docs/community/code-of-conduct.md | 13 + docs/community/contributing.md | 13 + docs/community/downloads/_category_.json | 3 + docs/community/downloads/android.md | 43 +++ docs/community/downloads/build-your-own.md | 15 + docs/community/downloads/download.md | 49 ++++ docs/community/downloads/linux.md | 76 ++++++ docs/community/downloads/macos.md | 15 + docs/community/downloads/post-windows.md | 35 +++ docs/community/downloads/selfhosting.md | 27 ++ docs/community/downloads/thank-you.md | 22 ++ docs/community/downloads/web.md | 31 +++ docs/community/downloads/windows.md | 52 ++++ docs/community/faq.md | 8 + docs/community/intro.md | 25 ++ docs/community/nightly.md | 18 ++ docs/community/privacypolicy.md | 71 +++++ docs/community/versions.md | 13 + docs/docusaurus.config.js | 301 ++++++++++++++------- docs/package.json | 2 +- docs/redirects.js | 1 + docs/sidebarsCommunity.js | 46 ++++ docs/src/components/DownloadButton.tsx | 15 + docs/src/components/EmbedPlayground.tsx | 35 +++ docs/src/components/HomepageFeatures.tsx | 78 ++++++ docs/static/img/smart-screen-more-info.png | Bin 0 -> 12384 bytes docs/static/img/smart-screen.png | Bin 0 -> 10058 bytes docs/tsconfig.json | 12 + docs/yarn.lock | 58 ++-- 36 files changed, 1192 insertions(+), 152 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/community/branding.md create mode 100644 docs/community/changelog.md create mode 100644 docs/community/code-of-conduct.md create mode 100644 docs/community/contributing.md create mode 100644 docs/community/downloads/_category_.json create mode 100644 docs/community/downloads/android.md create mode 100644 docs/community/downloads/build-your-own.md create mode 100644 docs/community/downloads/download.md create mode 100644 docs/community/downloads/linux.md create mode 100644 docs/community/downloads/macos.md create mode 100644 docs/community/downloads/post-windows.md create mode 100644 docs/community/downloads/selfhosting.md create mode 100644 docs/community/downloads/thank-you.md create mode 100644 docs/community/downloads/web.md create mode 100644 docs/community/downloads/windows.md create mode 100644 docs/community/faq.md create mode 100644 docs/community/intro.md create mode 100644 docs/community/nightly.md create mode 100644 docs/community/privacypolicy.md create mode 100644 docs/community/versions.md create mode 100644 docs/redirects.js create mode 100644 docs/sidebarsCommunity.js create mode 100644 docs/src/components/DownloadButton.tsx create mode 100644 docs/src/components/EmbedPlayground.tsx create mode 100644 docs/src/components/HomepageFeatures.tsx create mode 100644 docs/static/img/smart-screen-more-info.png create mode 100644 docs/static/img/smart-screen.png create mode 100644 docs/tsconfig.json diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ee0cc10 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +codeofconduct@linwood.dev. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..bc55285 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,70 @@ +# Contribution guide + +There are many ways to contribute to this project. +Thanks to everyone who has contributed! +If you have any questions, please contact me at . + +There is a matrix server for this project [here](https://linwood.dev/matrix) and a discord server [here](https://discord.linwood.dev). + +Please follow the [Code of Conduct](https://docs.qeck.linwood.dev/code-of-conduct). + +## Give feedback + +The best way to give feedback is to open an issue on GitHub. +Please report any bug you find [here](https://github.com/LinwoodDev/Qeck/issues/new?assignees=CodeDoctorDE&labels=bug%2Ctriage&template=bug_report.yml&title=%5BBug%5D%3A+). + +If you have a feature that you would like to see added, please open an issue [here](https://github.com/LinwoodDev/Qeck/issues/new?assignees=CodeDoctorDE&labels=enhancement%2Ctriage&template=feature_request.yml&title=%5BFeature+request%5D%3A+). + +## Test nightly builds + +Nightly builds are not production ready and need to be tested. +Please report any bugs in the github issues section. + +Read more about it [here](https://docs.qeck.linwood.dev/nightly). + +## Write documentation + +Documentation is important for users to understand the program and its features. +The documentation is written in markdown, a simple markup language. It can be found in the `docs` folder. + +To start, please install yarn (). + +Get started by running: + +```bash +cd docs +yarn install +yarn start +``` + +All stable documentation can be found in the `versioned_docs` folder. + +Fork the project and create a pull request to add your documentation to the `develop` branch. + +## Translate + +Crowdin is a service that allows you to translate the documentation and the app. +Click [here](https://translate.linwood.dev/qeck) to see the project and start translating. +If you have a new language to add, please contact me. + +## Code + +This project is written in [Dart](https://dart.dev/) and was built with [Flutter](https://flutter.dev/). +The app source code can be found in the `app` folder. + +Please install the dependencies first: + +- libsecret-1-dev +- libjsoncpp-dev + +To get started, run: + +```bash +cd app +flutter pub get +flutter run +``` + +All subdirectories are documented in the `app/README.md` file. + +Fork the project and create a pull request to add your code to the `develop` branch. diff --git a/README.md b/README.md index 4f558c1..0f24c34 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Linwood Qeck -[![Powered by Flame](https://img.shields.io/badge/Powered%20by-%F0%9F%94%A5%20Flame-orange.svg?style=for-the-badge)](https://flame-engine.org) [![GitHub](https://img.shields.io/github/license/LinwoodCloud/Qeck?style=for-the-badge&color=orange)](LICENSE) *Please note that this project is in development!* diff --git a/app/pubspec.lock b/app/pubspec.lock index 3cce3c0..3ed4ee6 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -225,14 +225,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" - flame: - dependency: "direct main" - description: - name: flame - sha256: c38e1be5827aa839c166c6ed08a2733bb4523bf153d8c670739c20c842fa1844 - url: "https://pub.dev" - source: hosted - version: "1.7.3" flex_color_scheme: dependency: "direct main" description: @@ -470,14 +462,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" - ordered_set: - dependency: transitive - description: - name: ordered_set - sha256: "3fedcc9121b3ba24c0a84f32da2989c42e36c159b73feadbc2f402dc55966b81" - url: "https://pub.dev" - source: hosted - version: "5.0.1" package_config: dependency: transitive description: @@ -514,10 +498,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 + sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.0.15" path_provider_android: dependency: transitive description: @@ -530,10 +514,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183 + sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" path_provider_linux: dependency: transitive description: @@ -651,10 +635,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "858aaa72d8f61637d64e776aca82e1c67e6d9ee07979123c5d17115031c1b13b" + sha256: "16d3fb6b3692ad244a695c0183fca18cf81fd4b821664394a781de42386bf022" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" shared_preferences_android: dependency: transitive description: @@ -667,10 +651,10 @@ packages: dependency: transitive description: name: shared_preferences_foundation - sha256: "0c1c16c56c9708aa9c361541a6f0e5cc6fc12a3232d866a687a7b7db30032b07" + sha256: e014107bb79d6d3297196f4f2d0db54b5d1f85b8ea8ff63b8e8b391a02700feb url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_linux: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 86f1ac9..a78504a 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -27,7 +27,7 @@ dependencies: intl: ^0.17.0 flutter_localized_locales: ^2.0.4 # Engine - flame: ^1.7.3 + #flame: ^1.7.3 # UI phosphor_flutter: git: @@ -41,7 +41,7 @@ dependencies: flex_color_scheme: ^7.0.5 window_manager: ^0.3.2 # Database - shared_preferences: ^2.1.0 + shared_preferences: ^2.1.1 # Generation barcode: ^2.2.3 # Internal @@ -51,7 +51,7 @@ dependencies: # Information http: ^0.13.6 package_info_plus: ^3.1.2 - path_provider: ^2.0.14 + path_provider: ^2.0.15 go_router: ^7.0.0 json_annotation: ^4.8.1 dynamic_color: ^1.6.3 diff --git a/docs/community/branding.md b/docs/community/branding.md new file mode 100644 index 0000000..65c08bc --- /dev/null +++ b/docs/community/branding.md @@ -0,0 +1,17 @@ +--- +title: Branding +--- + +These assets are licensed under the [CC-BY-4.0](https://github.com/LinwoodDev/Qeck/blob/develop/BRANDING_LICENSE). + +## Fonts + +* `Roboto` + +## Screenshots + +> Used in the firefox responsive design mode + +* Phone: Galaxy S20 Ultra +* 7-inch tablet: Nexus 7 +* 10-inch tablet: Nexus 10 diff --git a/docs/community/changelog.md b/docs/community/changelog.md new file mode 100644 index 0000000..653a330 --- /dev/null +++ b/docs/community/changelog.md @@ -0,0 +1,13 @@ +--- +title: Changelog +hide_title: true +sidebar_label: Changelog +--- + +```mdx-code-block +import Changelog, {toc as ChangelogTOC} from "@site/../CHANGELOG.md" + + + +export const toc = ChangelogTOC; +``` diff --git a/docs/community/code-of-conduct.md b/docs/community/code-of-conduct.md new file mode 100644 index 0000000..1483f8e --- /dev/null +++ b/docs/community/code-of-conduct.md @@ -0,0 +1,13 @@ +--- +title: Code of conduct +hide_title: true +sidebar_label: Code of conduct +--- + +```mdx-code-block +import CodeOfConduct, {toc as CodeOfConductTOC} from "@site/../CODE_OF_CONDUCT.md" + + + +export const toc = CodeOfConductTOC; +``` diff --git a/docs/community/contributing.md b/docs/community/contributing.md new file mode 100644 index 0000000..df0eab9 --- /dev/null +++ b/docs/community/contributing.md @@ -0,0 +1,13 @@ +--- +title: "Contributing" +hide_title: true +sidebar_label: "Contributing" +--- + +```mdx-code-block +import Contributing, {toc as ContributingTOC} from "@site/../CONTRIBUTING.md" + + + +export const toc = ContributingTOC; +``` diff --git a/docs/community/downloads/_category_.json b/docs/community/downloads/_category_.json new file mode 100644 index 0000000..183fe25 --- /dev/null +++ b/docs/community/downloads/_category_.json @@ -0,0 +1,3 @@ +{ + "label": "Downloads" +} \ No newline at end of file diff --git a/docs/community/downloads/android.md b/docs/community/downloads/android.md new file mode 100644 index 0000000..6790f9c --- /dev/null +++ b/docs/community/downloads/android.md @@ -0,0 +1,43 @@ +--- +title: "Android" +sidebar_position: 4 +--- + +```mdx-code-block +import DownloadButton from '@site/src/components/DownloadButton.tsx'; +``` + +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) + +## Minimum system requirements + +* Android 5.0 (API level 21) or higher. + +## Binaries + +
+ + Stable + + + Nightly + +
+ +Read more about the nightly version of Qeck [here](/nightly). + +## Stores + + + +## The beta program on play store + +Click on [this link](https://play.google.com/apps/testing/dev.linwood.qeck) to register for the [nightly](/nightly) version of the app. Please note that this version can have bugs. The play store version will automatically be updated when a new nightly version is released. diff --git a/docs/community/downloads/build-your-own.md b/docs/community/downloads/build-your-own.md new file mode 100644 index 0000000..e0fedc1 --- /dev/null +++ b/docs/community/downloads/build-your-own.md @@ -0,0 +1,15 @@ +--- +title: "Build your own" +sidebar_position: 1 +--- + +1. Install git and flutter (beta) +2. Clone the repository +3. Navigate to the app directory +4. Use the flutter tool to compile the application + * `flutter build apk` + * `flutter build appbundle` + * `flutter build web` + * `flutter build linux` + * `flutter build windows` +5. The compiled files are in the build directory diff --git a/docs/community/downloads/download.md b/docs/community/downloads/download.md new file mode 100644 index 0000000..1eed86b --- /dev/null +++ b/docs/community/downloads/download.md @@ -0,0 +1,49 @@ +--- +slug: "/downloads" +sidebar_position: 0 +title: Downloads +--- + +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) + +## Choose your platform + + + + +## Useful links + +- [Changelog](changelog) +- [Older releases](https://github.com/LinwoodDev/qeck/releases) +- [Latest release](https://github.com/LinwoodDev/qeck/releases/latest) +- [Support](https://discord.linwood.dev) \ No newline at end of file diff --git a/docs/community/downloads/linux.md b/docs/community/downloads/linux.md new file mode 100644 index 0000000..ca21986 --- /dev/null +++ b/docs/community/downloads/linux.md @@ -0,0 +1,76 @@ +--- +title: "Linux" +sidebar_position: 3 +--- + +```mdx-code-block +import DownloadButton from '@site/src/components/DownloadButton.tsx'; +``` + +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) + +:::note + +Please use the flatpak version if possible. +Otherwise you need to install `libsecret-1-dev` and `libjsoncpp-dev`. + +::: + +## Binaries + +
+
+ +
    +
  • + + Portable + +
  • +
  • + + DEB + +
  • +
  • + + AppImage + +
  • +
+
+
+ +
    +
  • + + Portable + +
  • +
  • + + DEB + +
  • +
  • + + AppImage + +
  • +
+
+
+ +Read more about the nightly version of Qeck [here](/nightly). + +## Stores + + diff --git a/docs/community/downloads/macos.md b/docs/community/downloads/macos.md new file mode 100644 index 0000000..78950e7 --- /dev/null +++ b/docs/community/downloads/macos.md @@ -0,0 +1,15 @@ +--- +title: "MacOS" +sidebar_position: 5 +--- + +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) + +## Links + + diff --git a/docs/community/downloads/post-windows.md b/docs/community/downloads/post-windows.md new file mode 100644 index 0000000..34ccace --- /dev/null +++ b/docs/community/downloads/post-windows.md @@ -0,0 +1,35 @@ +--- +title: Thank you for downloading +hide_title: true +hide_table_of_contents: true +slug: "/downloads/post-windows" +--- + +
+ +# Thank you for downloading + + + +## Windows SmartScreen + + +Windows warns users when installing software without a certificate. + +![Smart screen](/img/smart-screen.png) + +To install the app, you need to click on "More info". + +![Smart screen more info](/img/smart-screen-more-info.png) + +Then, click on "Run anyway". + +
diff --git a/docs/community/downloads/selfhosting.md b/docs/community/downloads/selfhosting.md new file mode 100644 index 0000000..8373d8c --- /dev/null +++ b/docs/community/downloads/selfhosting.md @@ -0,0 +1,27 @@ +--- +title: "Selfhosting" +sidebar_position: 5 +--- + +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) + +It is very easy to host your own qeck web server. + +## Simple server + +Install flutter and build the app using: + +```bash +cd app +flutter pub get +flutter build web +``` + +All the files are in the `app/build/web` directory. + +## Docker + +Clone the repository and build the `Dockerfile` using: `docker build -t linwood-qeck`. +Start the server using: `docker run -p 8080:8080 -d linwood-qeck`. + diff --git a/docs/community/downloads/thank-you.md b/docs/community/downloads/thank-you.md new file mode 100644 index 0000000..51cd23c --- /dev/null +++ b/docs/community/downloads/thank-you.md @@ -0,0 +1,22 @@ +--- +title: Thank you for downloading +hide_title: true +hide_table_of_contents: true +slug: "/downloads/thank-you" +--- + +
+ +# Thank you for downloading + + + +
diff --git a/docs/community/downloads/web.md b/docs/community/downloads/web.md new file mode 100644 index 0000000..caf52bd --- /dev/null +++ b/docs/community/downloads/web.md @@ -0,0 +1,31 @@ +--- +title: "Web" +sidebar_position: 5 +--- + +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) + +:::note + +This is a progressive web application. You can install it on your browser and use it offline. +All data is stored in your browser. + +::: + + +## Links + + + +## Versions + +The main and the preview (develop) versions of Qeck are not the same as the stable and nightly versions. +They are not directly associated with a release. They are updated as soon as a new commit is pushed to the repository. diff --git a/docs/community/downloads/windows.md b/docs/community/downloads/windows.md new file mode 100644 index 0000000..f4de0d5 --- /dev/null +++ b/docs/community/downloads/windows.md @@ -0,0 +1,52 @@ +--- +title: "Windows" +sidebar_position: 2 +--- + +```mdx-code-block +import DownloadButton from '@site/src/components/DownloadButton.tsx'; +``` + +![Stable release version](https://img.shields.io/badge/dynamic/yaml?color=c4840d&label=Stable&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fstable%2Fapp%2Fpubspec.yaml&style=for-the-badge) +![Nightly release version](https://img.shields.io/badge/dynamic/yaml?color=f7d28c&label=Nightly&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2FLinwoodDev%2Fqeck%2Fnightly%2Fapp%2Fpubspec.yaml&style=for-the-badge) + +## Minimum system requirements + +* Windows 10 or higher. + +## Binaries + +
+
+ +
    +
  • + + Setup + +
  • +
  • + + Portable + +
  • +
+
+
+ +
    +
  • + + Setup + +
  • +
  • + + Portable + +
  • +
+
+
+ +Read more about the nightly version of Qeck [here](/nightly). diff --git a/docs/community/faq.md b/docs/community/faq.md new file mode 100644 index 0000000..a713c50 --- /dev/null +++ b/docs/community/faq.md @@ -0,0 +1,8 @@ +--- +id: "faq" +slug: "/faq" +title: "Frequently Asked Questions" +sidebar_label: "FAQ" +--- + +Here are some frequently asked questions. diff --git a/docs/community/intro.md b/docs/community/intro.md new file mode 100644 index 0000000..3b58b54 --- /dev/null +++ b/docs/community/intro.md @@ -0,0 +1,25 @@ +--- +id: "community" +slug: "/community" +sidebar_label: "Home" +sidebar_position: 0 +title: "Community" +--- + +Welcome to the community section. + +## Acknowledgements + +A special thanks goes to: + +* for providing this useful crossplatform ui framework +* for all this useful desktop window features +* for an easy-to-use static react documentation framework + +All other licenses can you found in the settings. + +## Useful links + +* [GitHub](https://github.com/LinwoodDev/Qeck) +* [Discord](https://go.linwood.dev/discord) +* [Matrix](https://go.linwood.dev/matrix) diff --git a/docs/community/nightly.md b/docs/community/nightly.md new file mode 100644 index 0000000..d1e9645 --- /dev/null +++ b/docs/community/nightly.md @@ -0,0 +1,18 @@ +--- +title: "Nightly Builds" +slug: "/nightly" +--- + +:::warning + +Do not use the nightly version of Qeck for production. + +::: + +Nightly builds are designed to give you the option to test the latest version and get the newest features +and give feedback. + +## Get the builds + +Go to the download pages of your platform. +All nightly builds get also published as pre-release on github. diff --git a/docs/community/privacypolicy.md b/docs/community/privacypolicy.md new file mode 100644 index 0000000..1be53e3 --- /dev/null +++ b/docs/community/privacypolicy.md @@ -0,0 +1,71 @@ +--- +title: "Privacy Policy" +slug: /privacypolicy +--- + +This is the privacy policy of the app. Please read it carefully. +Click [here](https://go.linwood.dev/privacypolicy) to read the privacy policy of the website. + +CodeDoctor built the Qeck app as an Open Source app. This SERVICE is provided by CodeDoctor at no cost and is intended for use as is. + +This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. + +If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the +Service. I will not use or share your information with anyone except as described in this Privacy Policy. + +The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Qeck unless otherwise defined in this Privacy Policy. + +**Information Collection and Use** + +For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and +is not collected by me in any way. + +The app does use third party services that may collect information used to identify you. + +Link to privacy policy of third party service providers used by the app + +* [Google Play Services](https://www.google.com/policies/privacy/) + +**Cookies** + +Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's +internal memory. + +This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option +to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service. + +**Service Providers** + +I may employ third-party companies and individuals due to the following reasons: + +* To facilitate our Service; +* To provide the Service on our behalf; +* To perform Service-related services; or +* To assist us in analyzing how our Service is used. + +I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated +not to disclose or use the information for any other purpose. + +**Security** + +I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, +or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security. + +**Links to Other Sites** + +This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly +advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services. + +**Changes to This Privacy Policy** + +I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this +page. + +This policy is effective as of 2021-02-07 + +**Contact Us** + +If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at contact@linwood.dev. + +This privacy policy page was created at [privacypolicytemplate.net](https://privacypolicytemplate.net) and modified/generated +by [App Privacy Policy Generator](https://app-privacy-policy-generator.nisrulz.com/) diff --git a/docs/community/versions.md b/docs/community/versions.md new file mode 100644 index 0000000..4a87b62 --- /dev/null +++ b/docs/community/versions.md @@ -0,0 +1,13 @@ +--- +title: Versions +hide_title: true +sidebar_label: Versions +--- + +```mdx-code-block +import Security, {toc as SecurityTOC} from "@site/../SECURITY.md" + + + +export const toc = SecurityTOC; +``` diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 0535857..a87a295 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,109 +1,222 @@ -const lightCodeTheme = require('prism-react-renderer/themes/github'); -const darkCodeTheme = require('prism-react-renderer/themes/dracula'); +const redirects = require('./redirects.js'); /** @type {import('@docusaurus/types').DocusaurusConfig} */ module.exports = { - title: 'My Site', - tagline: 'Dinosaurs are cool', - url: 'https://your-docusaurus-test-site.com', - baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - favicon: 'img/favicon.ico', - organizationName: 'facebook', // Usually your GitHub org/user name. - projectName: 'docusaurus', // Usually your repo name. - themeConfig: { - navbar: { - title: 'My Site', - logo: { - alt: 'My Site Logo', - src: 'img/logo.svg', - }, - items: [ - { - type: 'doc', - docId: 'intro', - position: 'left', - label: 'Tutorial', + title: 'Linwood Qeck', + tagline: 'Play games without internet with your friends ', + url: 'https://docs.qeck.linwood.dev', + baseUrl: '/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + favicon: 'img/favicon.ico', + organizationName: 'LinwoodDev', // Usually your GitHub org/user name. + projectName: 'Qeck', // Usually your repo name. + themeConfig: { + colorMode: { + defaultMode: 'dark', + disableSwitch: false, + respectPrefersColorScheme: true, }, - {to: '/blog', label: 'Blog', position: 'left'}, - { - href: 'https://github.com/facebook/docusaurus', - label: 'GitHub', - position: 'right', - }, - ], - }, - footer: { - style: 'dark', - links: [ - { - title: 'Docs', - items: [ - { - label: 'Tutorial', - to: '/docs/intro', + navbar: { + title: 'Qeck', + logo: { + alt: 'Qeck Logo', + src: 'img/logo.svg', }, - ], + items: [ + { + type: 'doc', + docId: 'intro', + position: 'left', + label: 'Tutorial', + }, + { + to: 'downloads', + label: 'Downloads', + position: 'left' + }, + { + type: 'doc', + docId: 'community', + docsPluginId: 'community', + position: 'left', + label: 'Community', + }, + { + type: 'dropdown', + label: 'More', + position: 'left', + items: [ + { + label: 'Matrix', + href: 'https://linwood.dev/matrix', + }, + { + label: 'Discord', + href: 'https://discord.linwood.dev', + }, + { + label: 'GitHub', + href: 'https://github.com/LinwoodDev/Qeck', + }, + { + label: 'Blog', + href: 'https://linwood.dev/blog' + }, + { + label: 'Crowdin', + href: 'https://go.linwood.dev/qeck/crowdin' + }, + { + label: 'Twitter', + href: 'https://twitter.com/LinwoodDev', + }, + { + label: 'License', + href: 'https://go.linwood.dev/qeck/license', + } + ], + }, + { + type: 'docsVersionDropdown', + position: 'right', + dropdownItemsBefore: [], + dropdownItemsAfter: [{ to: '/versions', label: 'All versions' }], + dropdownActiveClassDisabled: true + }, + { + type: 'localeDropdown', + position: 'right', + } + ], }, - { - title: 'Community', - items: [ - { - label: 'Stack Overflow', - href: 'https://stackoverflow.com/questions/tagged/docusaurus', + footer: { + style: 'dark', + links: [ + { + title: 'Community', + items: [ + { + label: 'Discord', + href: 'https://discord.linwood.dev', + }, + { + label: 'Twitter', + href: 'https://twitter.com/LinwoodDev', + }, + { + label: 'Contribution guide', + href: 'https://github.com/LinwoodDev/Qeck/blob/develop/CONTRIBUTING.md', + }, + { + html: ` + + Deploys by Netlify + + `, + }, + ], + }, + { + title: 'Source code', + items: [ + { + label: 'App', + href: 'https://github.com/LinwoodDev/Qeck/tree/develop/app', + }, + { + label: 'Docs', + href: 'https://github.com/LinwoodDev/Qeck/tree/develop/docs', + } + ], + }, + { + title: 'Legal', + items: [ + { + label: 'Imprint', + href: 'https://go.linwood.dev/imprint', + }, + { + label: 'Privacy Policy of the app', + href: '/privacypolicy', + }, + { + label: 'Privacy Policy of the website', + href: 'https://go.linwood.dev/privacypolicy', + }, + ], + } + ], + logo: { + alt: 'Linwood Logo', + src: 'https://raw.githubusercontent.com/LinwoodDev/website/main/public/Linwood.png', + width: 100, + href: 'https://linwood.dev', }, + copyright: `Copyright © ${new Date().getFullYear()} LinwoodDev.`, + }, + }, + presets: [ + [ + '@docusaurus/preset-classic', { - label: 'Discord', - href: 'https://discordapp.com/invite/docusaurus', + docs: { + sidebarPath: require.resolve('./sidebars.js'), + // Please change this to your repo. + editUrl: + 'https://github.com/LinwoodDev/Qeck/edit/develop/docs/', + }, + blog: false, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, }, + ], + ], + plugins: [ + [ + '@docusaurus/plugin-content-docs', { - label: 'Twitter', - href: 'https://twitter.com/docusaurus', + id: 'community', + path: 'community', + routeBasePath: '/', + sidebarPath: require.resolve('./sidebarsCommunity.js') }, - ], - }, - { - title: 'More', - items: [ + ], + [ + '@docusaurus/plugin-client-redirects', { - label: 'Blog', - to: '/blog', + redirects: redirects }, + ], + [ + '@docusaurus/plugin-pwa', { - label: 'GitHub', - href: 'https://github.com/facebook/docusaurus', + offlineModeActivationStrategies: [ + 'appInstalled', + 'standalone', + 'queryString', + ], + pwaHead: [ + { + tagName: 'link', + rel: 'icon', + href: '/img/logo.png', + }, + { + tagName: 'link', + rel: 'manifest', + href: '/manifest.json', // your PWA manifest + }, + { + tagName: 'meta', + name: 'theme-color', + content: '#f2b138', + }, + ], }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, - }, - prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, - }, - }, - presets: [ - [ - '@docusaurus/preset-classic', - { - docs: { - sidebarPath: require.resolve('./sidebars.js'), - // Please change this to your repo. - editUrl: - 'https://github.com/facebook/docusaurus/edit/master/website/', - }, - blog: { - showReadingTime: true, - // Please change this to your repo. - editUrl: - 'https://github.com/facebook/docusaurus/edit/master/website/blog/', - }, - theme: { - customCss: require.resolve('./src/css/custom.css'), - }, - }, - ], - ], -}; + ], + // Other tweaks + ] +}; \ No newline at end of file diff --git a/docs/package.json b/docs/package.json index 1fd81cd..c10da1b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,5 +1,5 @@ { - "name": "butterfly-docs", + "name": "qeck-docs", "version": "0.0.0", "private": true, "scripts": { diff --git a/docs/redirects.js b/docs/redirects.js new file mode 100644 index 0000000..e0a30c5 --- /dev/null +++ b/docs/redirects.js @@ -0,0 +1 @@ +module.exports = []; diff --git a/docs/sidebarsCommunity.js b/docs/sidebarsCommunity.js new file mode 100644 index 0000000..bcb2272 --- /dev/null +++ b/docs/sidebarsCommunity.js @@ -0,0 +1,46 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +module.exports = { + // By default, Docusaurus generates a sidebar from the docs folder structure + sidebar: [ + 'community', + 'branding', + 'changelog', + 'contributing', + 'code-of-conduct', + 'faq', + 'versions', + 'nightly', + 'privacypolicy', + { + type: 'link', + href: 'https://discord.linwood.dev', + label: 'Discord' + }, + { + type: 'link', + href: 'https://github.com/LinwoodDev/Qeck', + label: 'GitHub' + } + ], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + { + type: 'category', + label: 'Tutorial', + items: ['hello'], + }, + ], + */ +}; \ No newline at end of file diff --git a/docs/src/components/DownloadButton.tsx b/docs/src/components/DownloadButton.tsx new file mode 100644 index 0000000..b13b926 --- /dev/null +++ b/docs/src/components/DownloadButton.tsx @@ -0,0 +1,15 @@ +import React from 'react' + + +export default function DownloadButton({className, href, children, after}) { + function onClick() { + // Open thank you page after download + console.log('Downloading...') + setTimeout(() => { + window.location.href = after ?? "/downloads/thank-you"; + }, 500); + } + return ( + {children} + ); +} \ No newline at end of file diff --git a/docs/src/components/EmbedPlayground.tsx b/docs/src/components/EmbedPlayground.tsx new file mode 100644 index 0000000..f3a9431 --- /dev/null +++ b/docs/src/components/EmbedPlayground.tsx @@ -0,0 +1,35 @@ +import React, { useState } from 'react' + +export default function EmbedPlayground() { + const [host, setHost] = useState("https://qeck.linwood.dev") + const [save, setSave] = useState(true) + const [editable, setEditable] = useState(true) + const [language, setLanguage] = useState("system") + const url = `${host}/embed?save=${save}&editable=${editable}&language=${language}`; + return ( +
+
+ + setHost(e.target.value)} /> +
+ + +
+ + setLanguage(e.target.value)} /> +
+

Preview

+ +
+ + +
+
+ ) +} \ No newline at end of file diff --git a/docs/src/components/HomepageFeatures.tsx b/docs/src/components/HomepageFeatures.tsx new file mode 100644 index 0000000..ab4a2b3 --- /dev/null +++ b/docs/src/components/HomepageFeatures.tsx @@ -0,0 +1,78 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './HomepageFeatures.module.css'; +import Translate from '@docusaurus/Translate'; + +const FeatureList = [ + { + title: (Cross platform), + Svg: require('../../static/img/undraw_progressive_app_m-9-ms.svg').default, + description: ( + + You can use the app on your phone, tablet, laptop, or desktop. + The app is available on Linux, Android, and Windows. + You can also use the app on the web. + + ), + }, + { + title: (Simple and intuitive), + Svg: require('../../static/img/undraw_innovative_b409.svg').default, + description: ( + + Every tool is on the right place. + Open the app and start drawing. + Change your tools by clicking on it. + + ), + }, + { + title: (Customizable), + Svg: require('../../static/img/undraw_options_re_9vxh.svg').default, + description: ( + + Change everything to your needs. + Choose your custom color, create a palette and add your pages to the paper. + The paper has an infinite size, perfect for your ideas and notes. + + ), + }, + { + title: (Choose where your data is stored), + Svg: require('../../static/img/undraw_sweet_home_dkhr.svg').default, + description: ( + + You can choose to store your data locally or in your favorite cloud (webdav). + You can also export your data to a file and import it again. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/docs/static/img/smart-screen-more-info.png b/docs/static/img/smart-screen-more-info.png new file mode 100644 index 0000000000000000000000000000000000000000..267641a08ec709030e31656bfefcd240c43f21a1 GIT binary patch literal 12384 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/smart-screen.png b/docs/static/img/smart-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..169b605b74d5c2a0aeafc1351abaf820fc208cbf GIT binary patch literal 10058 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