├── .editorconfig ├── .eslintrc.js ├── .github └── workflows │ ├── chrome-e2e.yaml │ ├── netlify-dev-deploy.yaml │ └── netlify-prod-deploy.yaml ├── .gitignore ├── README.md ├── assets ├── README.md ├── css │ └── tailwind.css └── images │ ├── background │ ├── circle_background.svg │ ├── final_edited.svg │ ├── landing_bg.svg │ ├── reactangle_background.svg │ ├── square_background.svg │ └── triangle_background.svg │ ├── distro │ ├── alpine.svg │ ├── arch.svg │ ├── debian.svg │ ├── fedora.svg │ ├── kali.svg │ ├── kde_logo.svg │ ├── lxde.svg │ ├── lxqt.svg │ ├── manjaro.svg │ ├── mate.svg │ ├── ubuntu.svg │ ├── void.svg │ └── xfce.svg │ ├── icons │ ├── check.svg │ ├── github.svg │ └── play-store.svg │ ├── logo_new_semi_fhd_dark.png │ ├── modded_os_feature.png │ ├── screenshots │ └── andronix-commands-app-ss.png │ └── wm │ ├── Awesome_logo.svg │ ├── I3_window_manager_logo.svg │ └── openbox_logo.svg ├── components ├── base │ ├── counterComponent.vue │ ├── ctaCard.vue │ ├── primaryIconButton.vue │ └── primaryTextButton.vue ├── global │ ├── footer.vue │ ├── heading.vue │ ├── navBar.vue │ ├── overlay.vue │ └── sideBar.vue ├── landing.vue ├── landing │ ├── deLogoGrid.vue │ ├── distroLogoGrid.vue │ ├── feature.vue │ ├── featureCard.vue │ ├── landingHeader.vue │ ├── productComponent.vue │ └── wmLogoGrid.vue ├── pricingCard.vue ├── steps │ └── stepsCard.vue ├── teamCard.vue └── testimonial │ ├── testimonialCard.vue │ └── testimonialModdedOsCard.vue ├── cypress.json ├── jsconfig.json ├── layouts ├── default.vue └── error.vue ├── lib └── checkout │ ├── checkoutHelper.js │ └── productHelper.js ├── middleware ├── README.md └── redirect.js ├── netlify.toml ├── nuxt.config.js ├── package.json ├── pages ├── README.md ├── about.vue ├── auth │ ├── login.vue │ └── register.vue ├── checkout │ ├── buy │ │ └── _product_id.vue │ ├── failure │ │ └── _reason │ │ │ └── _order_id.vue │ └── success │ │ └── _order_id.vue ├── contact.vue ├── help.vue ├── index.vue ├── legal │ ├── privacy-policy.vue │ ├── refund-policy.vue │ └── terms-conditions.vue ├── policies.vue ├── pricing.vue ├── products │ ├── commands.vue │ ├── modded-os.vue │ └── premium.vue ├── tutorials │ └── termux.vue └── user │ └── profile.vue ├── plugins ├── animxyz.js ├── firebase.js ├── formulate.js ├── hamburger.js ├── tippyjs.js ├── toasts.js └── viewer.js ├── static ├── data │ ├── features │ │ ├── andronix-features.json │ │ ├── commands-feature.json │ │ ├── modded-os-features.json │ │ └── premium-features.json │ ├── menu │ │ └── main-drawer-menu.json │ ├── misc │ │ ├── andronix-steps.json │ │ ├── command-steps.json │ │ ├── contact.json │ │ ├── country.json │ │ ├── modded-os-metric.json │ │ ├── premium-metric.json │ │ ├── products.json │ │ ├── state.json │ │ └── teams.json │ ├── pricing │ │ ├── modded-os-products.json │ │ └── product-details.json │ ├── products │ │ └── modded-os-info.json │ └── testimonials │ │ ├── main-testimonials.json │ │ ├── modded-os-testimonials.json │ │ └── premium-testimonials.json ├── distros │ └── details.json ├── favicon.ico ├── seo │ └── meta-head.json └── static_images │ ├── default_dp.svg │ └── distro │ ├── arch.svg │ ├── debian.svg │ ├── kali.svg │ ├── manjaro.svg │ └── ubuntu.svg ├── store ├── auth.js ├── checkout.js ├── drawer.js └── misc.js ├── tailwind.config.js ├── test └── e2e │ ├── fixtures │ ├── coupon-failure.json │ ├── coupon-success.json │ └── pricing.json │ ├── integration │ ├── auth.spec.js │ ├── checkout.spec.js │ └── general.spec.js │ ├── plugins │ └── index.js │ └── support │ ├── commands.js │ └── index.js ├── tsconfig.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | node: true 6 | }, 7 | extends: [ 8 | '@nuxtjs/eslint-config-typescript', 9 | 'plugins:nuxt/recommended' 10 | ], 11 | plugins: [ 12 | ], 13 | // add your custom rules here 14 | rules: {} 15 | } 16 | -------------------------------------------------------------------------------- /.github/workflows/chrome-e2e.yaml: -------------------------------------------------------------------------------- 1 | name: Chrome E2E CI 2 | on: 3 | push: 4 | branches: 5 | - dev 6 | 7 | jobs: 8 | test: 9 | runs-on: ubuntu-latest 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | containers: [ 1, 2, 3 ] 14 | name: E2E on Chrome 15 | steps: 16 | - name: Checking out code ⚡ 17 | uses: actions/checkout@v2 18 | 19 | - name: Setting up NodeJS 📐 20 | uses: actions/setup-node@v1 21 | with: 22 | node-version: '14.x' 23 | 24 | - name: Caching Dependencies 💾 25 | uses: actions/cache@v1 26 | with: 27 | path: ~/.npm 28 | key: ${{ runner.os }}-node-v2-${{ hashFiles('**/yarn-lock.json') }} 29 | restore-keys: | 30 | ${{ runner.os }}-node- 31 | 32 | - name: Building 🏗 33 | run: | 34 | npm install -g yarn 35 | yarn install --frozen-lockfile 36 | yarn install 37 | 38 | 39 | - name: E2E Testing 🤖 40 | uses: cypress-io/github-action@v2 41 | env: 42 | CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} 43 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 44 | with: 45 | record: true 46 | start: yarn run dev 47 | parallel: true 48 | browser: chrome 49 | wait-on-timeout: 180 50 | wait-on: 'http://localhost:3000' 51 | 52 | - name: Uploading Screenshots ☁ 53 | uses: actions/upload-artifact@v1 54 | if: failure() 55 | with: 56 | name: cypress-screenshots 57 | path: cypress/screenshots 58 | 59 | - name: Uploading Videos ☁ 60 | uses: actions/upload-artifact@v1 61 | if: always() 62 | with: 63 | name: cypress-videos 64 | path: cypress/videos 65 | -------------------------------------------------------------------------------- /.github/workflows/netlify-dev-deploy.yaml: -------------------------------------------------------------------------------- 1 | name: Dev Deploy 2 | on: 3 | push: 4 | branches: 5 | - dev 6 | pull_request: 7 | branches: 8 | - master 9 | jobs: 10 | deploy: 11 | runs-on: ubuntu-latest 12 | name: Build 13 | steps: 14 | - name: Checking out code ⚡ 15 | uses: actions/checkout@v2 16 | 17 | - name: Setting up NodeJS 📐 18 | uses: actions/setup-node@v1 19 | with: 20 | node-version: '14.x' 21 | 22 | - name: Caching Dependencies 💾 23 | uses: actions/cache@v1 24 | with: 25 | path: ~/.npm 26 | key: ${{ runner.os }}-node-${{ hashFiles('**/yarn-lock.json') }} 27 | restore-keys: | 28 | ${{ runner.os }}-node- 29 | 30 | - name: Building 🏗 31 | run: | 32 | npm install -g yarn 33 | yarn install --frozen-lockfile 34 | yarn install 35 | yarn run generate 36 | 37 | - name: Deploy to Netlify ✅ 38 | uses: nwtgck/actions-netlify@v1.1 39 | with: 40 | publish-dir: './dist' 41 | production-branch: master 42 | github-token: ${{ secrets.GITHUB_TOKEN }} 43 | deploy-message: "Deploy from GitHub Actions" 44 | production-deploy: false 45 | env: 46 | NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} 47 | NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} 48 | -------------------------------------------------------------------------------- /.github/workflows/netlify-prod-deploy.yaml: -------------------------------------------------------------------------------- 1 | name: Production Deploy 2 | on: 3 | push: 4 | branches: 5 | - master 6 | jobs: 7 | deploy: 8 | runs-on: ubuntu-latest 9 | name: Build 10 | steps: 11 | - name: Checking out code ⚡ 12 | uses: actions/checkout@v2 13 | 14 | - name: Setting up NodeJS 📐 15 | uses: actions/setup-node@v1 16 | with: 17 | node-version: '14.x' 18 | 19 | - name: Caching Dependencies 💾 20 | uses: actions/cache@v1 21 | with: 22 | path: ~/.npm 23 | key: ${{ runner.os }}-node-${{ hashFiles('**/yarn-lock.json') }} 24 | restore-keys: | 25 | ${{ runner.os }}-node- 26 | 27 | - name: Building 🏗 28 | run: | 29 | npm install -g yarn 30 | yarn install --frozen-lockfile 31 | yarn install 32 | yarn run generate 33 | 34 | - name: Deploy to Netlify ✅ 35 | uses: nwtgck/actions-netlify@v1.1 36 | with: 37 | publish-dir: './dist' 38 | production-branch: master 39 | github-token: ${{ secrets.GITHUB_TOKEN }} 40 | deploy-message: "Deploy from GitHub Actions" 41 | production-deploy: true 42 | env: 43 | NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} 44 | NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugins (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | /logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | 41 | # TypeScript v1 declaration files 42 | typings/ 43 | 44 | # Optional npm cache directory 45 | .npm 46 | 47 | # Optional eslint cache 48 | .eslintcache 49 | 50 | # Optional REPL history 51 | .node_repl_history 52 | 53 | # Output of 'npm pack' 54 | *.tgz 55 | 56 | # Yarn Integrity file 57 | .yarn-integrity 58 | 59 | # dotenv environment variables file 60 | .env 61 | 62 | # parcel-bundler cache (https://parceljs.org/) 63 | .cache 64 | 65 | # next.js build output 66 | .next 67 | 68 | # nuxt.js build output 69 | .nuxt 70 | 71 | # Nuxt generate 72 | dist 73 | 74 | # vuepress build output 75 | .vuepress/dist 76 | 77 | # Serverless directories 78 | .serverless 79 | 80 | # IDE / Editor 81 | .idea 82 | 83 | # Service worker 84 | sw.* 85 | 86 | # macOS 87 | .DS_Store 88 | 89 | # Vim swap files 90 | *.swp 91 | 92 | cypress/ 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | andronix-internal-api 3 |

4 | 5 |

6 | 7 | 8 | 9 |

10 | 11 | ## What is this? ⚡ 12 | This is the repository of the official website for [Andronix App](https://git.andronix.app). This combines billing for the digital products that Andronix offers and Andronix Commands. 13 | 14 | > Andronix Commands will be added soon to this repo. It currently resides on [here](https://web.andronix.app) and is build with just VueJS and Tailwind. 15 | 16 | ## What is the Tech-Stack? 📐 17 | 18 | This website/web-app is built using [NuxtJS](https://nuxtjs.org) and [Tailwind](https://tailwindcss.com). Deployed on [Netlify](https://netlify.com) and uses [GitHub Actions](https://github.com/features/actions) for the app pipeline. 19 | 20 | ### - Testing 🤖 21 | We use [Cypress](https://cypress.io) for our E2E automated tests. Our unit and integration tests are done through [Mocha](https://mochajs.org) and [Chai](https://www.chaijs.com). 22 | 23 | ## Developer Notes 24 | 25 | ### How to run it locally? 🏠 26 | Clone the project and assuming that you have NodeJS installed on your machine already, run - 27 | ``` bash 28 | # yarn 29 | yarn run dev # for the development server. 30 | yarn run generate # for the production build. 31 | 32 | # npm 33 | npm run dev # for the development server. 34 | npm run generate # for the production build. 35 | ``` 36 | 37 | ### How do I contribute? 🏗 38 | If you want to improve something or maybe add something new, you can just send a pull request and if that's something that we would like to add/change, we'll be more than happy to merge it. 39 | -------------------------------------------------------------------------------- /assets/README.md: -------------------------------------------------------------------------------- 1 | # ASSETS 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your un-compiled assets such as LESS, SASS, or JavaScript. 6 | 7 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#webpacked). 8 | -------------------------------------------------------------------------------- /assets/css/tailwind.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;500;600;700;800&display=swap'); 2 | /*@import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,700;0,800;1,400;1,600&display=swap');*/ 3 | 4 | @tailwind base; 5 | @tailwind components; 6 | @tailwind utilities; 7 | 8 | 9 | @layer components { 10 | 11 | .deco-heading { 12 | @apply font-extrabold text-center text-primary-500 text-lg md:text-xl lg:text-2xl 13 | } 14 | 15 | .heading { 16 | @apply font-extrabold text-center text-5xl md:text-6xl lg:text-7xl text-white text-center 17 | } 18 | 19 | .heading-2 { 20 | @apply font-bold text-center text-3xl md:text-4xl text-white text-center 21 | } 22 | 23 | .sub-heading { 24 | @apply font-medium text-center text-base md:text-lg text-center text-gray-400 25 | } 26 | 27 | .input { 28 | @apply appearance-none block w-full py-3 px-4 leading-tight bg-card_background text-gray-100 focus:bg-card_background_accent border font-sans border-gray-800 focus:border-primary-500 rounded focus:outline-none 29 | } 30 | 31 | .button-1 { 32 | @apply rounded px-8 py-3 bg-primary-500 text-white font-extrabold text-lg text-center transition transform hover:scale-105 hover:bg-primary-600 duration-100 cursor-pointer 33 | } 34 | 35 | .button-2 { 36 | @apply rounded px-8 py-2 bg-primary-500 text-white font-extrabold text-lg text-center 37 | } 38 | 39 | .section-gap { 40 | @apply mt-48 px-12 md:px-24 lg:mx-24 41 | } 42 | 43 | /* INPUT */ 44 | .formulate-input-class { 45 | @apply rounded border border-gray-700 text-white text-sm box-border w-full px-3 py-2 w-full bg-card_background focus:border-primary-500 outline-none leading-none 46 | } 47 | 48 | .formulate-label-class { 49 | @apply text-white text-sm font-bold mb-4 50 | } 51 | 52 | .formulate-placeholder-class { 53 | @apply text-sm mb-4 text-gray-700 54 | } 55 | 56 | .formulate-error-class { 57 | @apply text-xs mt-0.5 text-red-600 58 | } 59 | 60 | .formulate-help-class { 61 | @apply text-xs mt-0.5 text-gray-500 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /assets/images/background/circle_background.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/background/landing_bg.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/background/reactangle_background.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/background/square_background.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/background/triangle_background.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/distro/alpine.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/distro/arch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/distro/debian.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/distro/fedora.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/distro/kali.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/distro/kde_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/distro/lxde.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/distro/lxqt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/distro/manjaro.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/distro/mate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 20 | 21 | -------------------------------------------------------------------------------- /assets/images/distro/ubuntu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/distro/void.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /assets/images/distro/xfce.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/icons/check.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/icons/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/icons/play-store.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/logo_new_semi_fhd_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndronixApp/andronix-website-base/032af4f6270b1e1124df6b734d0b577fc305d183/assets/images/logo_new_semi_fhd_dark.png -------------------------------------------------------------------------------- /assets/images/modded_os_feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndronixApp/andronix-website-base/032af4f6270b1e1124df6b734d0b577fc305d183/assets/images/modded_os_feature.png -------------------------------------------------------------------------------- /assets/images/screenshots/andronix-commands-app-ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndronixApp/andronix-website-base/032af4f6270b1e1124df6b734d0b577fc305d183/assets/images/screenshots/andronix-commands-app-ss.png -------------------------------------------------------------------------------- /assets/images/wm/Awesome_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 15 | 17 | image/svg+xml 18 | 20 | 21 | 22 | 23 | 24 | 26 | 30 | 31 | -------------------------------------------------------------------------------- /assets/images/wm/I3_window_manager_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/wm/openbox_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/base/counterComponent.vue: -------------------------------------------------------------------------------- 1 | 17 | 38 | 39 | 42 | -------------------------------------------------------------------------------- /components/base/ctaCard.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 73 | 74 | 77 | -------------------------------------------------------------------------------- /components/base/primaryIconButton.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 31 | 32 | 35 | -------------------------------------------------------------------------------- /components/base/primaryTextButton.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 46 | 47 | 50 | -------------------------------------------------------------------------------- /components/global/heading.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 34 | 35 | 38 | -------------------------------------------------------------------------------- /components/global/navBar.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 40 | 76 | 77 | 80 | -------------------------------------------------------------------------------- /components/global/overlay.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 16 | -------------------------------------------------------------------------------- /components/global/sideBar.vue: -------------------------------------------------------------------------------- 1 | 109 | 110 | 138 | 139 | 142 | -------------------------------------------------------------------------------- /components/landing.vue: -------------------------------------------------------------------------------- 1 | 74 | 75 | 87 | 88 | 90 | -------------------------------------------------------------------------------- /components/landing/deLogoGrid.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 29 | 30 | 33 | -------------------------------------------------------------------------------- /components/landing/distroLogoGrid.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 42 | 43 | 45 | -------------------------------------------------------------------------------- /components/landing/feature.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | 14 | 17 | -------------------------------------------------------------------------------- /components/landing/featureCard.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 61 | 62 | 65 | -------------------------------------------------------------------------------- /components/landing/landingHeader.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 43 | 44 | 47 | -------------------------------------------------------------------------------- /components/landing/productComponent.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 76 | 77 | 80 | -------------------------------------------------------------------------------- /components/landing/wmLogoGrid.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 28 | 29 | 32 | -------------------------------------------------------------------------------- /components/pricingCard.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 90 | 91 | 94 | -------------------------------------------------------------------------------- /components/steps/stepsCard.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 46 | 47 | 50 | -------------------------------------------------------------------------------- /components/teamCard.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 50 | 51 | 54 | -------------------------------------------------------------------------------- /components/testimonial/testimonialCard.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 54 | 55 | 58 | -------------------------------------------------------------------------------- /components/testimonial/testimonialModdedOsCard.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | 37 | 38 | 41 | -------------------------------------------------------------------------------- /cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseUrl": "http://localhost:3000", 3 | "fixturesFolder": "test/e2e/fixtures", 4 | "integrationFolder": "test/e2e/integration", 5 | "pluginsFile": "test/e2e/plugins/index.js", 6 | "supportFile": "test/e2e/support/index.js", 7 | "projectId": "bt5suj", 8 | "pageLoadTimeout": 60000, 9 | "firefoxGcInterval": { 10 | "runMode": null, 11 | "openMode": null 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "~/*": ["./*"], 6 | "@/*": ["./*"], 7 | "~~/*": ["./*"], 8 | "@@/*": ["./*"] 9 | } 10 | }, 11 | "exclude": ["node_modules", ".nuxt", "dist"] 12 | } 13 | -------------------------------------------------------------------------------- /layouts/default.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 44 | 45 | 46 | 58 | 59 | -------------------------------------------------------------------------------- /layouts/error.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 31 | 32 | 35 | -------------------------------------------------------------------------------- /lib/checkout/checkoutHelper.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | const fetchPricing = async (productId, axios) => { 4 | try { 5 | return await axios.get(`/gen/pricing/?product_id=${productId}`) 6 | } catch (e) { 7 | console.log(e) 8 | } 9 | } 10 | 11 | import countryList from '~/static/data/misc/country.json' 12 | import { getProductNameWithId } from '~/lib/checkout/productHelper' 13 | 14 | export const getCountryName = (countryID) => { 15 | return countryList[countryID] 16 | } 17 | 18 | export const ProductIdArray = [ 19 | 'premium', 20 | 'ubuntu_xfce', 21 | 'ubuntu_kde', 22 | 'debian_xfce', 23 | 'manjaro_xfce', 24 | ] 25 | 26 | export const getPrices = async (productId, axios) => { 27 | let res = await fetchPricing(productId, axios) 28 | let productPrice = (parseInt(res.data.price) / 100).toFixed(2) 29 | return { 30 | price: `$ ${productPrice.toString()}`, 31 | name: getProductNameWithId(productId) 32 | } 33 | } 34 | 35 | export const generateOrderId = async (data, axios) => { 36 | console.log({ data }) 37 | try { 38 | const result = await axios.get('/rzp/generate', { 39 | params: data 40 | } 41 | ) 42 | return result.data.order_id 43 | } catch (e) { 44 | console.log(e) 45 | return '' 46 | } 47 | } 48 | 49 | export const verifyPurchase = async (data, axios) => { 50 | console.log(data) 51 | try { 52 | const result = await axios.get('/rzp/verify', { 53 | params: data 54 | } 55 | ) 56 | return result.data.is_verified 57 | } catch (e) { 58 | console.log(e) 59 | return false 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/checkout/productHelper.js: -------------------------------------------------------------------------------- 1 | export const getProductNameWithId = (id) => { 2 | switch (id) { 3 | case 'premium': 4 | return 'Andronix Premium' 5 | case 'ubuntu_xfce': 6 | return 'Ubuntu XFCE' 7 | case 'ubuntu_kde': 8 | return 'Ubuntu KDE' 9 | case 'manjaro_xfce': 10 | return 'Manjaro XFCE' 11 | case 'debian_xfce': 12 | return 'Debian XFCE' 13 | } 14 | } 15 | 16 | export const getBetterStatus = async (axios) => { 17 | try { 18 | const result = await axios.get('/better-status') 19 | console.log({status_data: result.data.response}) 20 | return result.data.response 21 | } catch (e) { 22 | console.log(e) 23 | return false 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /middleware/README.md: -------------------------------------------------------------------------------- 1 | # MIDDLEWARE 2 | 3 | **This directory is not required, you can delete it if you don't want to use it.** 4 | 5 | This directory contains your application middleware. 6 | Middleware let you define custom functions that can be run before rendering either a page or a group of pages. 7 | 8 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing#middleware). 9 | -------------------------------------------------------------------------------- /middleware/redirect.js: -------------------------------------------------------------------------------- 1 | export default function ({route, redirect}) { 2 | 3 | let path = route.fullPath 4 | /*removing any extra "/"*/ 5 | if (path.endsWith("/")) 6 | path = path.slice(0, path.length - 1) 7 | 8 | console.log("Redirecting the older link to the new version ✅") 9 | 10 | switch (path) { 11 | case "/commands": 12 | return redirect('/products/commands') 13 | case "/premium": 14 | return redirect('/products/premium') 15 | case "/premium-support": 16 | return redirect('/products/premium') 17 | case "/modded-os": 18 | return redirect('/products/modded-os') 19 | case "/refund-policy": 20 | return redirect('/legal/refund-policy') 21 | case "/privacy-policy": 22 | return redirect('/legal/privacy-policy') 23 | case "/terms-conditions": 24 | return redirect('/legal/terms-conditions') 25 | case "/restore-purchases/": 26 | return redirect('/') 27 | case "/modded-os-gallery": 28 | return redirect('/products/modded-os') 29 | case "/termux": 30 | return redirect('https://github.com/AndronixApp/termux-releases/releases/download/0.118/com.termux_118.apk') 31 | case "/vnc": 32 | return redirect('https://play.google.com/store/apps/details?id=com.realvnc.viewer.android&hl=en&gl=US&pli=1') 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndronixApp/andronix-website-base/032af4f6270b1e1124df6b734d0b577fc305d183/netlify.toml -------------------------------------------------------------------------------- /nuxt.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | router: { 3 | middleware: 'redirect' 4 | }, 5 | generate: { 6 | fallback: true 7 | }, 8 | vue: { 9 | config: { 10 | silent: true 11 | } 12 | }, 13 | target: 'static', 14 | // Global page headers (https://go.nuxtjs.dev/config-head) 15 | head: { 16 | script: [ 17 | { 18 | scr: 'https://checkout.razorpay.com/v1/checkout.js' 19 | } 20 | ], 21 | title: 'Andronix App', 22 | meta: [ 23 | {charset: 'utf-8'}, 24 | { 25 | name: 'viewport', 26 | content: 'width=device-width, initial-scale=1' 27 | }, 28 | { 29 | hid: 'description', 30 | name: 'description', 31 | content: '' 32 | } 33 | ], 34 | link: [ 35 | { 36 | rel: 'icon', 37 | type: 'image/x-icon', 38 | href: '/favicon.ico' 39 | } 40 | ] 41 | }, 42 | 43 | // Global CSS (https://go.nuxtjs.dev/config-css) 44 | css: [], 45 | 46 | // Plugins to run before rendering page (https://go.nuxtjs.dev/config-plugins) 47 | plugins: [ 48 | '~/plugins/formulate.js', 49 | '~/plugins/tippyjs.js', 50 | '~/plugins/toasts.js', 51 | { 52 | src: '~/plugins/animxyz.js', 53 | mode: 'client' 54 | }, 55 | { 56 | src: '~/plugins/viewer.js', 57 | }, 58 | '~/plugins/firebase.js', 59 | ], 60 | 61 | // Auto import components (https://go.nuxtjs.dev/config-components) 62 | components: true, 63 | 64 | // Modules for dev and build (recommended) (https://go.nuxtjs.dev/config-modules) 65 | buildModules: [ 66 | // https://go.nuxtjs.dev/typescript 67 | '@nuxt/typescript-build', 68 | // https://go.nuxtjs.dev/tailwindcss 69 | '@nuxtjs/tailwindcss', 70 | ], 71 | 72 | // Modules (https://go.nuxtjs.dev/config-modules) 73 | modules: [ 74 | ['@nuxtjs/sentry', { 75 | dsn: 'https://25a36cb298bf4a9faf84ef539fe4bb20@o524509.ingest.sentry.io/5637050', 76 | config: {}, // Additional config 77 | }], 78 | [ 79 | 'nuxt-social-meta', 80 | { 81 | url: 'https://next.andronix.app', 82 | title: 'Andronix App', 83 | site_name: 'Andronix App', 84 | description: 'Install Linux distributions like Ubuntu, Debian, Manjaro and more on your un-rooted Android device.', 85 | img: 'Link to image in static folder', 86 | locale: 'en_US', 87 | twitter: '@AndronixApp', 88 | twitter_card: 'summary_large_image', 89 | themeColor: '#FF8B25', 90 | }, 91 | ], 92 | ['@nuxtjs/robots', { 93 | UserAgent: '*', 94 | Disallow: '/user' 95 | }], 96 | /* ['@nuxtjs/sitemap', { 97 | hostname: 'https://', 98 | gzip: true, 99 | exclude: [ 100 | '/user/!**', 101 | ] 102 | }],*/ 103 | 'vue-scrollto/nuxt', 104 | // https://go.nuxtjs.dev/axios 105 | '@nuxtjs/axios', 106 | ['@nuxtjs/recaptcha', { 107 | hideBadge: true, 108 | siteKey: '6LdFXUgaAAAAALL5FTDtMLppqC7yq4f0veevt_ad', 109 | version: 2, 110 | }] 111 | ], 112 | 113 | // Axios module configuration (https://go.nuxtjs.dev/config-axios) 114 | axios: { 115 | baseURL: 'https://commerce.andronix.xyz/v1' 116 | // baseURL: 'http://localhost:3030/v1' 117 | }, 118 | 119 | // Build Configuration (https://go.nuxtjs.dev/config-build) 120 | build: {}, 121 | 122 | publicRuntimeConfig: {}, 123 | privateRuntimeConfig: { 124 | testAccountEmail: process.env.TEST_ACCOUNT_EMAIL, 125 | testAccountPassword: process.env.TEST_ACCOUNT_PASSWORD 126 | } 127 | } 128 | 129 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "andronix-website-base", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "nuxt-ts", 7 | "build": "nuxt-ts build", 8 | "start": "nuxt-ts start", 9 | "generate": "nuxt-ts generate", 10 | "lint:js": "eslint --ext .js,.vue --ignore-path .gitignore .", 11 | "lint": "yarn run lint:js", 12 | "e2e": "cypress run", 13 | "e2e:open": "cypress open" 14 | }, 15 | "dependencies": { 16 | "@animxyz/core": "0.6.6", 17 | "@animxyz/vue": "0.6.6", 18 | "@braid/vue-formulate": "^2.5.0", 19 | "@nuxt/typescript-runtime": "^2.0.0", 20 | "@nuxtjs/axios": "^5.13.0", 21 | "@nuxtjs/firebase": "^7.3.0", 22 | "@nuxtjs/recaptcha": "^0.6.2", 23 | "@nuxtjs/robots": "^2.4.2", 24 | "@nuxtjs/sentry": "^5.0.1", 25 | "@nuxtjs/sitemap": "^2.4.0", 26 | "@tailwindcss/line-clamp": "^0.2.0", 27 | "@tailwindcss/typography": "^0.4.0", 28 | "autoprefixer": "^9.8.6", 29 | "axios": "^0.21.1", 30 | "core-js": "^3.6.5", 31 | "firebase": "^8.2.1", 32 | "nuxt": "^2.14.12", 33 | "nuxt-social-meta": "^0.0.5", 34 | "postcss": "^7.0.35", 35 | "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.0.2", 36 | "v-viewer": "^1.5.1", 37 | "vue-loading-overlay": "^3.4.2", 38 | "vue-scrollto": "^2.20.0", 39 | "vue-tippy": "^4.7.2", 40 | "vue-toast-notification": "^0.6.0" 41 | }, 42 | "devDependencies": { 43 | "@nuxt/types": "^2.14.5", 44 | "@nuxt/typescript-build": "^2.0.3", 45 | "@nuxtjs/eslint-config": "^3.1.0", 46 | "@nuxtjs/eslint-config-typescript": "^3.0.0", 47 | "@nuxtjs/eslint-module": "^2.0.0", 48 | "@nuxtjs/tailwindcss": "^3.4.2", 49 | "@types/jest": "^26.0.20", 50 | "babel-eslint": "^10.1.0", 51 | "chance": "^1.1.7", 52 | "cypress": "6.7.0", 53 | "eslint": "^7.8.1", 54 | "eslint-plugin-nuxt": "^1.0.0" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /pages/README.md: -------------------------------------------------------------------------------- 1 | # PAGES 2 | 3 | This directory contains your Application Views and Routes. 4 | The framework reads all the `*.vue` files inside this directory and creates the router of your application. 5 | 6 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing). 7 | -------------------------------------------------------------------------------- /pages/checkout/failure/_reason/_order_id.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 68 | 69 | 72 | -------------------------------------------------------------------------------- /pages/checkout/success/_order_id.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 65 | 66 | 69 | -------------------------------------------------------------------------------- /pages/contact.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 45 | 46 | 49 | -------------------------------------------------------------------------------- /pages/help.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | 85 | 86 | 88 | -------------------------------------------------------------------------------- /pages/legal/refund-policy.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 57 | 58 | 61 | -------------------------------------------------------------------------------- /pages/policies.vue: -------------------------------------------------------------------------------- 1 | 83 | 84 | 92 | 93 | 96 | -------------------------------------------------------------------------------- /pages/pricing.vue: -------------------------------------------------------------------------------- 1 | 77 | 78 | 167 | 168 | 170 | -------------------------------------------------------------------------------- /pages/products/premium.vue: -------------------------------------------------------------------------------- 1 | 129 | 130 | 164 | 165 | 167 | -------------------------------------------------------------------------------- /pages/tutorials/termux.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 48 | 49 | 52 | -------------------------------------------------------------------------------- /pages/user/profile.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | 148 | 149 | 152 | -------------------------------------------------------------------------------- /plugins/animxyz.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueAnimXYZ from '@animxyz/vue' 3 | import '@animxyz/core' // Import css here if you haven't elsewhere 4 | 5 | Vue.use(VueAnimXYZ) 6 | -------------------------------------------------------------------------------- /plugins/firebase.js: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase' 2 | 3 | let app 4 | const config = { 5 | apiKey: 'AIzaSyBvHOXLIFJZZsFdVCjxP3XLP_tw6n5BdW8', 6 | authDomain: 'andronix-techriz.firebaseapp.com', 7 | databaseURL: 'https://andronix-techriz.firebaseio.com', 8 | projectId: 'andronix-techriz', 9 | storageBucket: 'andronix-techriz.appspot.com', 10 | messagingSenderId: '83697300023', 11 | appId: '1:83697300023:web:1e5962e3c087affb9a45b2', 12 | measurementId: 'G-J4235J74QY' 13 | } 14 | 15 | app = firebase.apps.length 16 | ? firebase.app() 17 | : firebase.initializeApp(config) 18 | 19 | /*/!* Inint firebase analytics *!/ 20 | firebase.analytics.isSupported().then((isSupported) => { 21 | if (isSupported) { 22 | app.analytics() 23 | */ 24 | 25 | export const firestore = app.firestore() 26 | export const database = app.database() 27 | export const functions = app.functions() 28 | export const auth = app.auth() 29 | -------------------------------------------------------------------------------- /plugins/formulate.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueFormulate from '@braid/vue-formulate' 3 | 4 | Vue.use(VueFormulate) 5 | -------------------------------------------------------------------------------- /plugins/hamburger.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import * as TastyBurgerButton from 'vue-tasty-burgers'; 3 | 4 | Vue.use(TastyBurgerButton); 5 | -------------------------------------------------------------------------------- /plugins/tippyjs.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import VueTippy, { TippyComponent } from "vue-tippy"; 3 | import "tippy.js/themes/translucent.css"; 4 | 5 | Vue.use(VueTippy); 6 | Vue.component("tippy", TippyComponent); 7 | -------------------------------------------------------------------------------- /plugins/toasts.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueToast from 'vue-toast-notification' 3 | // Import one of the available themes 4 | //import 'vue-toast-notification/dist/theme-default.css'; 5 | import 'vue-toast-notification/dist/theme-sugar.css' 6 | 7 | Vue.use(VueToast, { 8 | position: 'bottom' 9 | }) 10 | -------------------------------------------------------------------------------- /plugins/viewer.js: -------------------------------------------------------------------------------- 1 | import 'viewerjs/dist/viewer.css' 2 | import Viewer from 'v-viewer' 3 | import Vue from 'vue' 4 | Vue.use(Viewer) 5 | -------------------------------------------------------------------------------- /static/data/features/andronix-features.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "title": "Run Linux", 5 | "sub_title": "Run distributions like Ubuntu, Manjaro, Kali and a lot more with all major desktop environments.", 6 | "icon": "", 7 | "color": "bg-primary-400" 8 | }, 9 | { 10 | "title": "Sync Commands", 11 | "sub_title": "Sync your commands from the app and access them from anywhere in the world with our web app.", 12 | "icon": "", 13 | "color": "bg-blue-400" 14 | }, 15 | { 16 | "title": "Software Support", 17 | "sub_title": "You can use almost all the major software and tools that support ARM-based processors.", 18 | "icon": "", 19 | "color": "bg-purple-400" 20 | }, 21 | { 22 | "title": "Community Support", 23 | "sub_title": "No need to roam around for help anymore. Join our support platforms and get solutions to your issues", 24 | "icon": "", 25 | "color": "bg-green-400" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /static/data/features/commands-feature.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "title": "Android App", 5 | "sub_title": "Andronix Commands is well integrated within the official Andronix App.", 6 | "icon": "\n \n", 7 | "color": "bg-primary-400" 8 | }, 9 | { 10 | "title": "Web App", 11 | "sub_title": "Use Andronix Commands on any machine within your favourite browser.", 12 | "icon": "\n \n", 13 | "color": "bg-blue-400" 14 | }, 15 | { 16 | "title": "CLI", 17 | "sub_title": "Terminal person? Get your commands all color-coded with the Andronix Commands CLI.", 18 | "icon": "\n \n", 19 | "color": "bg-purple-400" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /static/data/features/modded-os-features.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "title": "Optimized", 5 | "sub_title": "We optimize Modded OS to run smoothly on Android devices.", 6 | "icon": "", 7 | "color": "bg-primary-400" 8 | }, 9 | { 10 | "title": "Do More, Worry Less", 11 | "sub_title": "These distributions are pre-confirgured and just work out of the box.", 12 | "icon": "", 13 | "color": "bg-blue-400" 14 | }, 15 | { 16 | "title": "Pre-install Software", 17 | "sub_title": "Modded OS ships with software like VS Code, Chromium, Firefox etc.", 18 | "icon": "", 19 | "color": "bg-purple-400" 20 | }, 21 | { 22 | "title": "Made Pretty", 23 | "sub_title": "Modded OS are pre-themed with cherry-picked themes and icons to look beautiful.", 24 | "icon": "", 25 | "color": "bg-green-400" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /static/data/features/premium-features.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "title": "Discounts", 5 | "sub_title": "Get up to a whopping 25% discount on purchasing any Modded OS when you're a premium supporter. **", 6 | "icon": "\n \n", 7 | "color": "bg-primary-400" 8 | }, 9 | { 10 | "title": "Andronix Commands", 11 | "sub_title": "Manage all your terminal commands in one place. You get access to our web-app, the in-app integration and even a CLI.", 12 | "icon": "\n \n", 13 | "color": "bg-blue-400" 14 | }, 15 | { 16 | "title": "Offline", 17 | "sub_title": "Download your favourite Linux Distro offline. You can store these locally on your devices.", 18 | "icon": "\n \n", 19 | "color": "bg-purple-400" 20 | }, 21 | { 22 | "title": "Support Us", 23 | "sub_title": "You help us sustain the project and constantly update the distribution and the related parts.", 24 | "icon": "\n \n", 25 | "color": "bg-green-400" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /static/data/menu/main-drawer-menu.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu": [ 3 | { 4 | "title": "Premium", 5 | "id": "drawer_main_premium", 6 | "icon": "\n \n", 7 | "color": "text-green-400", 8 | "to": "/products/premium" 9 | }, 10 | { 11 | "title": "Modded OS", 12 | "id": "drawer_main_modded_os", 13 | "icon": "\n \n \n", 14 | "color": "text-purple-400", 15 | "to": "/products/modded-os" 16 | }, 17 | { 18 | "title": "Documentation", 19 | "id": "drawer_main_docs", 20 | "icon": "\n \n", 21 | "color": "text-primary-400", 22 | "to": "https://docs.andronix.app" 23 | }, 24 | { 25 | "title": "Pricing", 26 | "id": "drawer_main_pricing", 27 | "icon": "\n \n \n", 28 | "color": "text-teal-400", 29 | "to": "/pricing" 30 | }, 31 | { 32 | "title": "Get Help", 33 | "id": "drawer_main_help", 34 | "icon": "\n \n", 35 | "color": "text-blue-400", 36 | "to": "/help" 37 | }, 38 | { 39 | "title": "Andronix Commands", 40 | "id": "drawer_main_command", 41 | "icon": "\n \n", 42 | "color": "text-indigo-400", 43 | "to": "/products/commands" 44 | }, 45 | { 46 | "title": "About Us", 47 | "id": "drawer_main_about", 48 | "icon": "\n \n", 49 | "color": "text-pink-400", 50 | "to": "/about" 51 | }, 52 | { 53 | "title": "Contact Us", 54 | "id": "drawer_main_contact", 55 | "icon": "", 56 | "color": "text-cyan-400", 57 | "to": "/contact" 58 | } 59 | ] 60 | } 61 | -------------------------------------------------------------------------------- /static/data/misc/andronix-steps.json: -------------------------------------------------------------------------------- 1 | { 2 | "steps": [ 3 | { 4 | "title": "Copy", 5 | "sub_title": "Just copy and paste a command from Andronix into Termux.", 6 | "icon": "", 7 | "color": "bg-red-400", 8 | "step": 1 9 | }, 10 | { 11 | "title": "Configure", 12 | "sub_title": "Wait for the download to complete & setup the distro.", 13 | "icon": "", 14 | "color": "bg-pink-400", 15 | "step": 2 16 | }, 17 | { 18 | "title": "Connect", 19 | "sub_title": "Connect any display to the VNC server running on your phone.", 20 | "icon": "", 21 | "color": "bg-indigo-400", 22 | "step": 3 23 | }, 24 | { 25 | "title": "Done!", 26 | "sub_title": "Enjoy your distro on any screen you like within your network!", 27 | "icon": "", 28 | "color": "bg-green-400", 29 | "step": 4 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /static/data/misc/command-steps.json: -------------------------------------------------------------------------------- 1 | { 2 | "steps": [ 3 | { 4 | "title": "Add", 5 | "sub_title": "Provide the command and a description for it.", 6 | "icon": "\n \n", 7 | "color": "bg-red-400", 8 | "step": 1 9 | }, 10 | { 11 | "title": "Colorize", 12 | "sub_title": "Select a color for the command and save it.", 13 | "icon": "\n \n", 14 | "color": "bg-pink-400", 15 | "step": 2 16 | }, 17 | { 18 | "title": "Saved", 19 | "sub_title": "The command is now saved successfully.", 20 | "icon": "\n \n", 21 | "color": "bg-indigo-400", 22 | "step": 3 23 | }, 24 | { 25 | "title": "Get it back!", 26 | "sub_title": "You can now access it anywhere in the world.", 27 | "icon": "\n \n", 28 | "color": "bg-green-400", 29 | "step": 4 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /static/data/misc/contact.json: -------------------------------------------------------------------------------- 1 | { 2 | "platforms": [ 3 | { 4 | "param": "Email", 5 | "value": "Reach out to us at support@andronix.app", 6 | "icon": "\n \n", 7 | "color": "bg-blue-400", 8 | "link": "mailto:support@andronix.app", 9 | "ctaText": "Reach out!" 10 | }, 11 | { 12 | "param": "Discord", 13 | "value": "Get help from our 8500+ community members.", 14 | "icon": "\n \n", 15 | "color": "bg-green-400", 16 | "link": "https://chat.andronix.app", 17 | "ctaText": "Chat with us!" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /static/data/misc/country.json: -------------------------------------------------------------------------------- 1 | { 2 | "1": "Afghanistan", 3 | "2": "Albania", 4 | "3": "Algeria", 5 | "4": "American Samoa", 6 | "5": "Andorra", 7 | "6": "Angola", 8 | "7": "Anguilla", 9 | "8": "Antarctica", 10 | "9": "Antigua And Barbuda", 11 | "10": "Argentina", 12 | "11": "Armenia", 13 | "12": "Aruba", 14 | "13": "Australia", 15 | "14": "Austria", 16 | "15": "Azerbaijan", 17 | "16": "Bahamas The", 18 | "17": "Bahrain", 19 | "18": "Bangladesh", 20 | "19": "Barbados", 21 | "20": "Belarus", 22 | "21": "Belgium", 23 | "22": "Belize", 24 | "23": "Benin", 25 | "24": "Bermuda", 26 | "25": "Bhutan", 27 | "26": "Bolivia", 28 | "27": "Bosnia and Herzegovina", 29 | "28": "Botswana", 30 | "29": "Bouvet Island", 31 | "30": "Brazil", 32 | "31": "British Indian Ocean Territory", 33 | "32": "Brunei", 34 | "33": "Bulgaria", 35 | "34": "Burkina Faso", 36 | "35": "Burundi", 37 | "36": "Cambodia", 38 | "37": "Cameroon", 39 | "38": "Canada", 40 | "39": "Cape Verde", 41 | "40": "Cayman Islands", 42 | "41": "Central African Republic", 43 | "42": "Chad", 44 | "43": "Chile", 45 | "44": "China", 46 | "45": "Christmas Island", 47 | "46": "Cocos (Keeling) Islands", 48 | "47": "Colombia", 49 | "48": "Comoros", 50 | "49": "Congo", 51 | "50": "Congo The Democratic Republic Of The", 52 | "51": "Cook Islands", 53 | "52": "Costa Rica", 54 | "53": "Cote D''Ivoire (Ivory Coast)", 55 | "54": "Croatia (Hrvatska)", 56 | "55": "Cuba", 57 | "56": "Cyprus", 58 | "57": "Czech Republic", 59 | "58": "Denmark", 60 | "59": "Djibouti", 61 | "60": "Dominica", 62 | "61": "Dominican Republic", 63 | "62": "East Timor", 64 | "63": "Ecuador", 65 | "64": "Egypt", 66 | "65": "El Salvador", 67 | "66": "Equatorial Guinea", 68 | "67": "Eritrea", 69 | "68": "Estonia", 70 | "69": "Ethiopia", 71 | "70": "External Territories of Australia", 72 | "71": "Falkland Islands", 73 | "72": "Faroe Islands", 74 | "73": "Fiji Islands", 75 | "74": "Finland", 76 | "75": "France", 77 | "76": "French Guiana", 78 | "77": "French Polynesia", 79 | "78": "French Southern Territories", 80 | "79": "Gabon", 81 | "80": "Gambia The", 82 | "81": "Georgia", 83 | "82": "Germany", 84 | "83": "Ghana", 85 | "84": "Gibraltar", 86 | "85": "Greece", 87 | "86": "Greenland", 88 | "87": "Grenada", 89 | "88": "Guadeloupe", 90 | "89": "Guam", 91 | "90": "Guatemala", 92 | "91": "Guernsey and Alderney", 93 | "92": "Guinea", 94 | "93": "Guinea-Bissau", 95 | "94": "Guyana", 96 | "95": "Haiti", 97 | "96": "Heard and McDonald Islands", 98 | "97": "Honduras", 99 | "98": "Hong Kong S.A.R.", 100 | "99": "Hungary", 101 | "100": "Iceland", 102 | "101": "India", 103 | "102": "Indonesia", 104 | "103": "Iran", 105 | "104": "Iraq", 106 | "105": "Ireland", 107 | "106": "Israel", 108 | "107": "Italy", 109 | "108": "Jamaica", 110 | "109": "Japan", 111 | "110": "Jersey", 112 | "111": "Jordan", 113 | "112": "Kazakhstan", 114 | "113": "Kenya", 115 | "114": "Kiribati", 116 | "115": "Korea North", 117 | "116": "Korea South", 118 | "117": "Kuwait", 119 | "118": "Kyrgyzstan", 120 | "119": "Laos", 121 | "120": "Latvia", 122 | "121": "Lebanon", 123 | "122": "Lesotho", 124 | "123": "Liberia", 125 | "124": "Libya", 126 | "125": "Liechtenstein", 127 | "126": "Lithuania", 128 | "127": "Luxembourg", 129 | "128": "Macau S.A.R.", 130 | "129": "Macedonia", 131 | "130": "Madagascar", 132 | "131": "Malawi", 133 | "132": "Malaysia", 134 | "133": "Maldives", 135 | "134": "Mali", 136 | "135": "Malta", 137 | "136": "Man (Isle of)", 138 | "137": "Marshall Islands", 139 | "138": "Martinique", 140 | "139": "Mauritania", 141 | "140": "Mauritius", 142 | "141": "Mayotte", 143 | "142": "Mexico", 144 | "143": "Micronesia", 145 | "144": "Moldova", 146 | "145": "Monaco", 147 | "146": "Mongolia", 148 | "147": "Montserrat", 149 | "148": "Morocco", 150 | "149": "Mozambique", 151 | "150": "Myanmar", 152 | "151": "Namibia", 153 | "152": "Nauru", 154 | "153": "Nepal", 155 | "154": "Netherlands Antilles", 156 | "155": "Netherlands The", 157 | "156": "New Caledonia", 158 | "157": "New Zealand", 159 | "158": "Nicaragua", 160 | "159": "Niger", 161 | "160": "Nigeria", 162 | "161": "Niue", 163 | "162": "Norfolk Island", 164 | "163": "Northern Mariana Islands", 165 | "164": "Norway", 166 | "165": "Oman", 167 | "166": "Pakistan", 168 | "167": "Palau", 169 | "168": "Palestinian Territory Occupied", 170 | "169": "Panama", 171 | "170": "Papua new Guinea", 172 | "171": "Paraguay", 173 | "172": "Peru", 174 | "173": "Philippines", 175 | "174": "Pitcairn Island", 176 | "175": "Poland", 177 | "176": "Portugal", 178 | "177": "Puerto Rico", 179 | "178": "Qatar", 180 | "179": "Reunion", 181 | "180": "Romania", 182 | "181": "Russia", 183 | "182": "Rwanda", 184 | "183": "Saint Helena", 185 | "184": "Saint Kitts And Nevis", 186 | "185": "Saint Lucia", 187 | "186": "Saint Pierre and Miquelon", 188 | "187": "Saint Vincent And The Grenadines", 189 | "188": "Samoa", 190 | "189": "San Marino", 191 | "190": "Sao Tome and Principe", 192 | "191": "Saudi Arabia", 193 | "192": "Senegal", 194 | "193": "Serbia", 195 | "194": "Seychelles", 196 | "195": "Sierra Leone", 197 | "196": "Singapore", 198 | "197": "Slovakia", 199 | "198": "Slovenia", 200 | "199": "Smaller Territories of the UK", 201 | "200": "Solomon Islands", 202 | "201": "Somalia", 203 | "202": "South Africa", 204 | "203": "South Georgia", 205 | "204": "South Sudan", 206 | "205": "Spain", 207 | "206": "Sri Lanka", 208 | "207": "Sudan", 209 | "208": "Suriname", 210 | "209": "Svalbard And Jan Mayen Islands", 211 | "210": "Swaziland", 212 | "211": "Sweden", 213 | "212": "Switzerland", 214 | "213": "Syria", 215 | "214": "Taiwan", 216 | "215": "Tajikistan", 217 | "216": "Tanzania", 218 | "217": "Thailand", 219 | "218": "Togo", 220 | "219": "Tokelau", 221 | "220": "Tonga", 222 | "221": "Trinidad And Tobago", 223 | "222": "Tunisia", 224 | "223": "Turkey", 225 | "224": "Turkmenistan", 226 | "225": "Turks And Caicos Islands", 227 | "226": "Tuvalu", 228 | "227": "Uganda", 229 | "228": "Ukraine", 230 | "229": "United Arab Emirates", 231 | "230": "United Kingdom", 232 | "231": "United States", 233 | "232": "United States Minor Outlying Islands", 234 | "233": "Uruguay", 235 | "234": "Uzbekistan", 236 | "235": "Vanuatu", 237 | "236": "Vatican City State (Holy See)", 238 | "237": "Venezuela", 239 | "238": "Vietnam", 240 | "239": "Virgin Islands (British)", 241 | "240": "Virgin Islands (US)", 242 | "241": "Wallis And Futuna Islands", 243 | "242": "Western Sahara", 244 | "243": "Yemen", 245 | "244": "Yugoslavia", 246 | "245": "Zambia", 247 | "246": "Zimbabwe" 248 | } 249 | -------------------------------------------------------------------------------- /static/data/misc/modded-os-metric.json: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": [ 3 | { 4 | "param": "Downloads", 5 | "value": "450,000 +", 6 | "icon": "", 7 | "color": "text-primary-400" 8 | }, 9 | { 10 | "param": "Purchases", 11 | "value": "70000 +", 12 | "icon": "", 13 | "color": "text-blue-400" 14 | }, 15 | { 16 | "param": "Bandwidth", 17 | "value": "750 TB +", 18 | "icon": "\n \n", 19 | "color": "text-purple-400" 20 | }, 21 | { 22 | "param": "Community", 23 | "value": "35000 +", 24 | "icon": "", 25 | "color": "text-green-400" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /static/data/misc/premium-metric.json: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": [ 3 | { 4 | "param": "Offline", 5 | "value": "10,000 +", 6 | "icon": "", 7 | "color": "text-primary-400" 8 | }, 9 | { 10 | "param": "Purchases", 11 | "value": "40,000 +", 12 | "icon": "", 13 | "color": "text-blue-400" 14 | }, 15 | { 16 | "param": "Commands", 17 | "value": "7500+ Users", 18 | "icon": "\n \n", 19 | "color": "text-purple-400" 20 | }, 21 | { 22 | "param": "Community", 23 | "value": "35000 +", 24 | "icon": "", 25 | "color": "text-green-400" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /static/data/misc/products.json: -------------------------------------------------------------------------------- 1 | { 2 | "products": [ 3 | { 4 | "isPaid": true, 5 | "product": "Andronix Modded OS", 6 | "link": "/products/modded-os", 7 | "description": "Modded OS is optimized, beautified and super stable distros customized by us. We carefully choose what goes into these and cherry pick the best features for you." 8 | }, 9 | { 10 | "isPaid": true, 11 | "link": "/products/premium", 12 | "product": "Andronix Premium", 13 | "description": "Andronix Premium acts as an extention to the Andronix app. It add features like Offline Distribution Installation, Andronix Commands and much more." 14 | }, 15 | { 16 | "isPaid": true, 17 | "link": "/products/commands", 18 | "product": "Andronix Commands", 19 | "description": "Andronix commands helps your keep all your notes and essential commands always synced across all your devices." 20 | }, 21 | { 22 | "isPaid": false, 23 | "link": "https://next.docs.andronix.app", 24 | "product": "Andronix UnModded OS", 25 | "description": "Variety of distros and desktop environment free of cost with community support channels if you are ever stuck with an issue." 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /static/data/misc/teams.json: -------------------------------------------------------------------------------- 1 | { 2 | "dev": [ 3 | { 4 | "name": "Prakhar Shukla", 5 | "position": "Developer", 6 | "quote": "I work on developing the Android app, the backend, the web related stuff, app pipelines and testing.", 7 | "photo_url": "https://i.ibb.co/hVVMj3F/prakhar-avataar.png" 8 | }, 9 | { 10 | "name": "Anurag Verma", 11 | "position": "Linux Backend", 12 | "quote": "I work on porting the Linux distributions, installation process, testing and support management.", 13 | "photo_url": "https://i.ibb.co/BCTHfFq/anu-avatar.png" 14 | } 15 | ], 16 | "support": [ 17 | { 18 | "name": "@Kaan", 19 | "position": "Discord Chief Moderator", 20 | "quote": "I'm the moderator at the Andronix Discord server, where you'll see a small but friendly and helpful community willing to assist you.", 21 | "photo_url": "https://i.ibb.co/KK3YPZd/avatar.png" 22 | }, 23 | { 24 | "name": "@./start-blendy.sh", 25 | "position": "Discord", 26 | "quote": "Andronix is a must have for any power user of their android device, it can replace the now defunct Linux on Dex.", 27 | "photo_url": "https://cdn.discordapp.com/avatars/386375356866887680/100de051e2f188661fba52e5c64a1341.png" 28 | } 29 | ], 30 | "specials": [ 31 | { 32 | "name": "Dylan", 33 | "position": "Super Member", 34 | "quote": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur eveniet ipsum iure libero magni nisi!", 35 | "photo_url": "https://avataaars.io/?avatarStyle=Circle&topType=ShortHairDreads01&accessoriesType=Round&hairColor=Red&facialHairType=BeardMedium&facialHairColor=Auburn&clotheType=CollarSweater&clotheColor=PastelRed&eyeType=Squint&eyebrowType=RaisedExcitedNatural&mouthType=Grimace&skinColor=Black" 36 | }, 37 | { 38 | "name": "Node", 39 | "position": "Discord Support", 40 | "quote": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequuntur eveniet ipsum iure libero magni nisi!", 41 | "photo_url": "https://avataaars.io/?avatarStyle=Circle&topType=LongHairStraightStrand&accessoriesType=Prescription01&hatColor=PastelGreen&hairColor=Brown&facialHairType=BeardMagestic&facialHairColor=Red&clotheType=GraphicShirt&clotheColor=Blue01&graphicType=Skull&eyeType=Wink&eyebrowType=UnibrowNatural&mouthType=Disbelief&skinColor=Brown" 42 | } 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /static/data/pricing/modded-os-products.json: -------------------------------------------------------------------------------- 1 | { 2 | "modded-os": [ 3 | { 4 | "name": "Ubuntu XFCE", 5 | "color_text": "text-primary-400", 6 | "color_bg": "bg-primary-400", 7 | "logo_text": "UX", 8 | "description": "If you're looking for a stable distro with some reasonable customization options which is also the world's most popular distribution, look no further than Ubuntu.", 9 | "id": "ubuntu_xfce" 10 | }, 11 | { 12 | "name": "Debian XFCE", 13 | "logo_text": "DX", 14 | "color_text": "text-pink-400", 15 | "color_bg": "bg-pink-400", 16 | "description": "Debian Linux is considered one of the most stable Linux distributions out there. Therefore, you can entirely rely on Debian for the stability and performance you might need for your day-to-day tasks.", 17 | "id": "debian_xfce" 18 | }, 19 | { 20 | "name": "Manjaro XFCE", 21 | "logo_text": "MX", 22 | "color_text": "text-green-400", 23 | "color_bg": "bg-green-400", 24 | "description": "Manjaro is a distribution based on Arch Linux but has a separate official repository that contains more stable packages than Arch Linux's. You can't go wrong with Pacman and Manjaro.", 25 | "id": "manjaro_xfce" 26 | }, 27 | { 28 | "name": "Ubuntu KDE", 29 | "logo_text": "UK", 30 | "color_text": "text-blue-400", 31 | "color_bg": "bg-blue-400", 32 | "description": "Ubuntu again being one of the reliable distributions of there but the star of the show is the beautiful KDE desktop environment. From smooth animations to just a better UX overall, KDE has got you covered with everything.", 33 | "id": "ubuntu_kde" 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /static/data/pricing/product-details.json: -------------------------------------------------------------------------------- 1 | { 2 | "products": [ 3 | { 4 | "id": "modded_os", 5 | "css_id": "pricing_table_modded_os_button", 6 | "heading": "Modded OS", 7 | "deco_heading": "ANDRONIX", 8 | "price": "Loading...", 9 | "slashedPrice": "$ 6.99", 10 | "color": "bg-purple-600", 11 | "features": [ 12 | "Optimized distribution for performance.", 13 | "Pre-install Software like VS Code, Chromium, Firefox.", 14 | "Pre-themed with themes and icons.", 15 | "More Stable and reliable than standard distributions." 16 | ] 17 | }, 18 | { 19 | "id": "premium", 20 | "heading": "Premium", 21 | "css_id": "pricing_table_premium", 22 | "deco_heading": "ANDRONIX", 23 | "price": "Loading...", 24 | "slashedPrice": "$ 4.99", 25 | "color": "bg-primary-600", 26 | "features": [ 27 | "Discounts on Modded OS", 28 | "Andronix Commands", 29 | "Offline Installation", 30 | "Internal Integration", 31 | "You help sustain the project" 32 | ] 33 | } 34 | ], 35 | "bundles": [ 36 | { 37 | "id": "modded_os_bundle_premium", 38 | "heading": "Modded OS Bundle & Premium", 39 | "deco_heading": "ANDRONIX", 40 | "price": "Loading...", 41 | "slashedPrice": "$ 28.99", 42 | "color": "bg-green-600", 43 | "features": [ 44 | "Discounts on Modded OS", 45 | "Andronix Commands", 46 | "Offline Installation", 47 | "Internal Integration", 48 | "You help sustain the project" 49 | ] 50 | }, 51 | { 52 | "id": "modded_os_bundle", 53 | "heading": "Modded OS Bundle", 54 | "deco_heading": "ANDRONIX", 55 | "price": "Loading...", 56 | "slashedPrice": "$ 6.99", 57 | "color": "bg-blue-600", 58 | "features": [ 59 | "Discounts on Modded OS", 60 | "Andronix Commands", 61 | "Offline Installation", 62 | "Internal Integration", 63 | "You help sustain the project" 64 | ] 65 | } 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /static/data/products/modded-os-info.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": [ 3 | { 4 | "features": [ 5 | "Pre-installed apps like VS-Code, Firefox and Chromium", 6 | "Themed and icon pack pre-applied.", 7 | "Mitigated most of the significant errors.", 8 | "More performant than standard Andronix distributions.formant than normal Andronix distros." 9 | ], 10 | "name": "Ubuntu XFCE", 11 | "logo_text": "UX", 12 | "id": "ubuntu_xfce", 13 | "color": "primary-400", 14 | "description": "If you're looking for a stable distro with some reasonable customization options which is also the world's most popular distribution, look no further than Ubuntu.", 15 | "version": "20.04", 16 | "stability": 100 17 | }, 18 | { 19 | "name": "Manjaro XFCE", 20 | "color": "green-400", 21 | "logo_text": "MX", 22 | "features": [ 23 | "Pre-installed apps like VS-Code, Firefox and Chromium", 24 | "Themed and icon pack pre-applied.", 25 | "Mitigated most of the significant errors.", 26 | "More performant than standard Andronix distributions.formant than normal Andronix distros." 27 | ], 28 | "id": "manjaro_xfce", 29 | "description": "Manjaro is a distribution based on Arch Linux but has a separate official repository that contains more stable packages than Arch Linux's. You can't go wrong with Pacman and Manjaro.", 30 | "version": "19.00", 31 | "stability": 80 32 | }, 33 | { 34 | "name": "Debian XFCE", 35 | "color": "pink-400", 36 | "logo_text": "DX", 37 | "features": [ 38 | "Pre-installed apps like VS-Code, Firefox and Chromium", 39 | "Themed and icon pack pre-applied.", 40 | "Mitigated most of the significant errors.", 41 | "More performant than standard Andronix distributions.formant than normal Andronix distros." 42 | ], 43 | "id": "debian_xfce", 44 | "description": "Debian Linux is considered one of the most stable Linux distributions out there. Therefore, you can entirely rely on Debian for the stability and performance you might need for your day-to-day tasks.", 45 | "version": "10.00", 46 | "stability": 100 47 | }, 48 | { 49 | "name": "Ubuntu KDE", 50 | "color": "blue-400", 51 | "features": [ 52 | "Pre-installed apps like VS-Code, Firefox and Chromium", 53 | "Themed and icon pack pre-applied.", 54 | "Mitigated most of the significant errors.", 55 | "More performant than standard Andronix distributions.formant than normal Andronix distros." 56 | ], 57 | "id": "ubuntu_kde", 58 | "logo_text": "UK", 59 | "description": "Ubuntu again being one of the reliable distributions of there but the star of the show is the beautiful KDE desktop environment. From smooth animations to just a better UX overall, KDE has got you covered with everything.", 60 | "version": "19.04", 61 | "stability": 90 62 | } 63 | ] 64 | } 65 | -------------------------------------------------------------------------------- /static/data/testimonials/main-testimonials.json: -------------------------------------------------------------------------------- 1 | { 2 | "testimonials": [ 3 | { 4 | "tilt": "-rotate-3", 5 | "bg_gradient": "bg-gradient-to-r from-violet to-primary-500", 6 | "quote": "When I started this project it helped me a lot to be able to use a Linux distribution on my phone, so I could access the desktop software that I needed so much, I never thought this was possible.", 7 | "name": "Cristián", 8 | "platform": "Twitter", 9 | "icon": " " 10 | }, 11 | { 12 | "tilt": "rotate-2", 13 | "bg_gradient": "bg-gradient-to-r from-blue-700 to-blue-400", 14 | "quote": "I always said Andronix have a great support team! It always answer every question! Other apps don't have such support, it answering for uhm... 9,999,999 days.", 15 | "name": "Kelp", 16 | "platform": "Discord", 17 | "icon": "\n \n " 18 | }, 19 | { 20 | "tilt": "-rotate-3", 21 | "bg_gradient": "bg-gradient-to-r from-purple-700 to-pink-900", 22 | "quote": "The best among the options I tried to install GNULinux systems. I have a Lenovo Yoga Tab 3 plus, and a wireless keyboard / mousepad, I use it for daily functions, LibreOffice and Firefox mostly. Good way to have a reasonably functional desktop tablet.", 23 | "name": "Carlos Gamez", 24 | "platform": "Google Play Store", 25 | "icon": " \n \n " 26 | }, 27 | { 28 | "tilt": "rotate-3", 29 | "bg_gradient": "bg-gradient-to-r from-yellow-600 to-red-600", 30 | "quote": "For anyone who's used Linux on DeX and is upset they cancelled it, I found an excellent replacement on the play store called Andronix. I've been using it the past few days now and I'm very happy with it!", 31 | "name": "Phoenix Bird", 32 | "platform": "Reddit", 33 | "icon": "\n \n " 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /static/data/testimonials/modded-os-testimonials.json: -------------------------------------------------------------------------------- 1 | { 2 | "testimonials": [ 3 | { 4 | "name": "Ted Haines", 5 | "quote": "Hello Everyone Thanks for making Andronix it's helping million of people's like me who don't have access to a PC.", 6 | "title": "Helping millions around the globe.", 7 | "icon": "Google Play icon" 8 | }, 9 | { 10 | "name": "Isaak Lane", 11 | "quote": "Modded OS is a fantastic prepackaged proot for you that's well worth the $2. Daddy-Andronix did a good job.", 12 | "title": "Fantastic prepackaged PRoot", 13 | "icon": "" 14 | }, 15 | { 16 | "name": "Ellen Kelly", 17 | "quote": "Modded OS help me run Linux on my monitor from my phone. What a great job guys, extremely impressed, Kudos!!", 18 | "title": "Bigger screen, better controls.", 19 | "icon": "Discord icon" 20 | }, 21 | { 22 | "name": "Donald Willis", 23 | "quote": "Well worth the small price. They go a long and using them everyday made me realise how much power my phone holds.", 24 | "title": "Well worth the small price.", 25 | "icon": "Discord icon" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /static/data/testimonials/premium-testimonials.json: -------------------------------------------------------------------------------- 1 | { 2 | "testimonials": [ 3 | { 4 | "name": "Theresina R.", 5 | "quote": "Andronix Premium has completely surpassed our expectations.", 6 | "title": "Surpassed expectations...", 7 | "icon": "" 8 | }, 9 | { 10 | "name": "Isabeau V.", 11 | "quote": "I don't always clop, but when I do, it's because of Andronix Premium. Nice work on your Andronix Premium.", 12 | "title": "Nice work!", 13 | "icon": "" 14 | }, 15 | { 16 | "name": "Bambie U.", 17 | "quote": "I love Andronix Premium. Nice work on your Andronix Premium.", 18 | "title": "I love it!", 19 | "icon": "" 20 | }, 21 | { 22 | "name": "Shaw P.", 23 | "quote": "Thank you for making it painless, pleasant and most of all hassle free!", 24 | "title": "Exactly what I needed...", 25 | "icon": "" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /static/distros/details.json: -------------------------------------------------------------------------------- 1 | { 2 | "ubuntu": { 3 | "name": "Ubuntu", 4 | "origin": "Canonical", 5 | "imageSrc": "/static_images/distro/ubuntu.svg", 6 | "version": "20.04 & 19.04" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndronixApp/andronix-website-base/032af4f6270b1e1124df6b734d0b577fc305d183/static/favicon.ico -------------------------------------------------------------------------------- /static/seo/meta-head.json: -------------------------------------------------------------------------------- 1 | { 2 | "home-page": { 3 | "title": "Andronix App", 4 | "hid": "andronix-app", 5 | "name": "Home Page", 6 | "content": "Install your favourite Linux distro in a few clicks on your un-rooted Android devices." 7 | }, 8 | "modded-os": { 9 | "title": "Modded OS", 10 | "hid": "andronix-modded-os", 11 | "name": "Modded OS", 12 | "content": "Run a super stable and fast Linux distribution like Ubuntu or Debian, right on your Android device." 13 | }, 14 | "premium": { 15 | "title": "Andronix Premium", 16 | "hid": "andronix-premium", 17 | "name": "Premium", 18 | "content": "Andronix Premium gives you so much for so little. Andronix Commands, offline access and so much more." 19 | }, 20 | "commands": { 21 | "title": "Andronix Commands", 22 | "hid": "andronix-commands", 23 | "name": "Commands", 24 | "content": "Andronix Commands is your one-stop solution for managing your terminal commands. Boost your terminal productivity now!" 25 | }, 26 | "about": { 27 | "title": "About Us", 28 | "hid": "about-us", 29 | "name": "About", 30 | "content": "Learn about us, our team and the people that support us." 31 | }, 32 | "pricing": { 33 | "title": "Pricing", 34 | "hid": "pricing", 35 | "name": "Pricing", 36 | "content": "Pricing for the digital purchases that Andronix offers. One-time and cheaper than your coffee." 37 | }, 38 | "help": { 39 | "title": "Get Help", 40 | "hid": "get-help", 41 | "name": "Help", 42 | "content": "Stuck somewhere? Our community channels are here to help you. Join us on Discord or the Andronix Forum." 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /static/static_images/distro/arch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/static_images/distro/debian.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/static_images/distro/kali.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/static_images/distro/manjaro.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/static_images/distro/ubuntu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /store/auth.js: -------------------------------------------------------------------------------- 1 | import { auth } from '~/plugins/firebase' 2 | import firebase from 'firebase' 3 | 4 | export const state = () => ({ 5 | isUserLoggedIn: false, 6 | user: { 7 | email: '', 8 | uid: '', 9 | photo_url: '', 10 | name: '', 11 | } 12 | }) 13 | 14 | export const mutations = { 15 | SET_USER_INFO (state, userData) { 16 | state.isUserLoggedIn = !!userData 17 | if (userData) { 18 | state.user = { 19 | email: userData.email, 20 | uid: userData.uid, 21 | photo_url: userData.photo_url, 22 | name: userData.name 23 | } 24 | } else { 25 | state.user = { 26 | email: '', 27 | uid: '', 28 | photo_url: '', 29 | name: '' 30 | } 31 | } 32 | }, 33 | SET_LOGGED_IN_STATE (state, isLoggedIn) { 34 | return state.user.uid === '' || null 35 | } 36 | } 37 | export const getters = { 38 | isUserLoggedIn: (state) => { 39 | return state.isUserLoggedIn 40 | }, 41 | getUserData: (state) => { 42 | return { 43 | photo_url: state.user.photo_url, 44 | email: state.user.email, 45 | name: state.user.name, 46 | uid: state.user.uid 47 | } 48 | }, 49 | getEmail: (state) => { 50 | return state.user.email 51 | } 52 | } 53 | 54 | export const actions = { 55 | loginUserWithEmailPassword ({ commit }, 56 | { 57 | email, 58 | password 59 | }, 60 | ) { 61 | return new Promise(async (resolve, reject) => { 62 | try { 63 | const user = await auth.signInWithEmailAndPassword(email, password) 64 | let firebaseUser = user.user 65 | if (firebaseUser) { 66 | commit('SET_USER_INFO', getUserData(user)) 67 | resolve() 68 | } else { 69 | commit('SET_USER_INFO', null) 70 | reject('Error occurred while registering. Try again later.') 71 | } 72 | } catch (e) { 73 | if (e.code === 'auth/auth/user-not-found') { 74 | reject('This email is not registered with us. Please try again.') 75 | } else if (e.code === 'auth/wrong-password') { 76 | reject('Incorrect details, please try again.') 77 | } else if (e.code === 'auth/user-disabled') { 78 | reject('Account disable. Please contact us.') 79 | } else { 80 | reject('Error occurred while logging in. Try again later.') 81 | } 82 | } 83 | } 84 | ) 85 | }, 86 | 87 | registerUserWithEmailPassword ({ commit }, 88 | { 89 | email, 90 | password 91 | }, 92 | ) { 93 | return new Promise(async (resolve, reject) => { 94 | try { 95 | const user = await auth.createUserWithEmailAndPassword(email, password) 96 | let firebaseUser = user.user 97 | if (firebaseUser) { 98 | commit('SET_USER_INFO', getUserData(user)) 99 | resolve() 100 | } else { 101 | commit('SET_USER_INFO', null) 102 | reject('Error occurred while registering. Try again later.') 103 | } 104 | } catch (e) { 105 | if (e.code === 'auth/email-already-in-use') { 106 | reject('Email is already registered.') 107 | } else if (e.code === 'auth/weak-password') { 108 | reject('Weak password. Please try again with a stronger one.') 109 | } else { 110 | reject('Error occurred while registering. Try again later.') 111 | } 112 | } 113 | } 114 | ) 115 | }, 116 | logoutUser ({ commit }) { 117 | auth.signOut().then(() => { 118 | commit('SET_LOGGED_IN_STATE', false) 119 | return commit('SET_USER_INFO', null) 120 | }).catch((e) => { 121 | console.log(e) 122 | }) 123 | } 124 | , 125 | loginWithGoogle ({ commit }) { 126 | return new Promise(async (resolve, reject) => { 127 | try { 128 | let provider = new firebase.auth.GoogleAuthProvider() 129 | let user = await auth.signInWithPopup(provider) 130 | let firebaseUser = user.user 131 | if (firebaseUser) { 132 | commit('SET_USER_INFO', getUserData(user)) 133 | resolve() 134 | } else { 135 | commit('SET_USER_INFO', null) 136 | reject('Error occurred while registering. Try again later.') 137 | } 138 | } catch (e) { 139 | if (e.code === 'auth/account-exists-with-different-credential') { 140 | reject('User is not registered with Google sign-in but with other methods.') 141 | } else if (e.code === 'auth/cancelled-popup-request') { 142 | reject('You are generating too many requests.') 143 | } else if (e.code === 'auth/popup-blocked') { 144 | reject('Your browser is blocking pop up. Please disable it.') 145 | } else if (e.code === 'auth/popup-closed-by-user') { 146 | reject('Sign in pop-up closed. Please try again.') 147 | } else { 148 | reject('Error occurred while registering. Try again later.') 149 | } 150 | } 151 | } 152 | ) 153 | } 154 | } 155 | 156 | const getUserData = (user) => { 157 | let firebaseUser = user.user 158 | if (firebaseUser) { 159 | let { 160 | email, 161 | uid, 162 | photoURL, 163 | displayName 164 | } = firebaseUser 165 | return { 166 | email, 167 | uid, 168 | name: displayName, 169 | photo_url: photoURL 170 | } 171 | } else { 172 | return {} 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /store/checkout.js: -------------------------------------------------------------------------------- 1 | export const state = () => ({ 2 | is_billing_active: false, 3 | selected_product_id: '', 4 | user_billing_data: { 5 | country: '', 6 | email: '', 7 | first_name: '', 8 | last_name: '', 9 | address: '', 10 | postal_code: '', 11 | state: '', 12 | } 13 | }) 14 | 15 | export const mutations = { 16 | SET_BILLING_STATE (state, isActive) { 17 | state.is_billing_active = isActive 18 | }, 19 | SET_SELECTED_PRODUCT_ID (state, id) { 20 | state.selected_product_id = id 21 | }, 22 | SET_USER_BILLING_DATA (state, data) { 23 | state.user_billing_data = data 24 | } 25 | } 26 | export const getters = { 27 | getSelectedProductId (state) { 28 | return state.selected_product_id 29 | }, 30 | getUserBillingData (state) { 31 | return state.user_billing_data 32 | }, 33 | getBillingState (state) { 34 | return state.is_billing_active 35 | } 36 | } 37 | 38 | export const actions = { 39 | setBillingState ({ commit }, billingState) { 40 | return commit('SET_BILLING_STATE', billingState) 41 | }, 42 | setSelectedProductId ({ commit }, id) { 43 | return commit('SET_SELECTED_PRODUCT_ID', id) 44 | }, 45 | setUserBillingData ({ commit }, data) { 46 | return commit('SET_USER_BILLING_DATA', data) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /store/drawer.js: -------------------------------------------------------------------------------- 1 | export const state = () => ({ 2 | isDrawerOpen: false 3 | }) 4 | 5 | export const mutations = { 6 | toggleDrawer (state, forced) { 7 | if (forced === undefined) { 8 | state.isDrawerOpen = !state.isDrawerOpen 9 | } else { 10 | state.isDrawerOpen = forced 11 | } 12 | } 13 | } 14 | 15 | export const getters = { 16 | getDrawerState (state) { 17 | return state.isDrawerOpen 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /store/misc.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndronixApp/andronix-website-base/032af4f6270b1e1124df6b734d0b577fc305d183/store/misc.js -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const colors = require('tailwindcss/colors') 2 | module.exports = { 3 | plugins: [ 4 | require('@tailwindcss/line-clamp'), 5 | require('@tailwindcss/typography'), 6 | ], 7 | purge: { 8 | options: { 9 | safelist: [ 10 | '-rotate-3', 'rotate-2', '-rotate-3', 'rotate-3', 'from-violet', 'to-primary-500', 'bg-gradient-to-r', 'from-blue-700', 'to-blue-400', 'from-purple-700', 'to-pink-900', 'from-yellow-600', 'to-red-600', 11 | 'bg-primary-400', 'bg-purple-600', 'text-teal-400', 'bg-blue-400', 'bg-purple-400', 'bg-green-400', 'bg-indigo-400', 'bg-pink-400', 'bg-yellow-400', 'bg-red-400', 'w-10', 'w-6', 'stroke-current', 12 | 'text-primary-400', 'text-blue-400', 'text-purple-400', 'text-green-400', 'text-indigo-400', 'text-pink-400', 'text-red-400' 13 | , 'text-pink-400', 'text-indigo-400', 'text-blue-400', 'text-teal-400', 'text-primary-400', 'text-purple-400', 'text-green-400', 'text-cyan-400' 14 | ] 15 | } 16 | }, 17 | theme: { 18 | extend: { 19 | screens: { 20 | 'xxs': {'max': '350px'}, 21 | }, 22 | colors: { 23 | trueGray: colors.trueGray, 24 | cyan: colors.cyan, 25 | teal: { 26 | 100: '#CCFBF1', 27 | 200: '#99F6E4', 28 | 300: '#5EEAD4', 29 | 400: '#2DD4BF', 30 | 500: '#14B8A6', 31 | 600: '#0D9488', 32 | 700: '#0F766E', 33 | }, 34 | primary: { 35 | 100: '#ffc592', 36 | 200: '#ffb97c', 37 | 300: '#ffae66', 38 | 400: '#ffa251', 39 | 500: '#ff973b', 40 | 600: '#ff8b25', 41 | 700: '#e67d21', 42 | 800: '#cc6f1e', 43 | }, 44 | gradient1: '#fc4a1a', 45 | gradient2: '#f7b733', 46 | gradient3: '#F27121', 47 | background: '#0c112b', 48 | background2: '#1e214a', 49 | violet: '#801354', 50 | violet2: '#9B0ABF', 51 | card_background: '#303653', 52 | card_background_accent: '#454a64', 53 | card_background_dark: '#070a1a', 54 | card_background2: '#3E3F64' 55 | }, 56 | backgroundImage: () => ({ 57 | 'landing-pattern': 'url(\'~assets/images/background/landing_bg.svg\')', 58 | 'final-pattern': 'url(\'~assets/images/background/final_edited.svg\')', 59 | 'triangle-pattern': 'url(\'~assets/images/background/triangle_background.svg\')', 60 | 'circle-pattern': 'url(\'~assets/images/background/circle_background.svg\')', 61 | 'rect-pattern': 'url(\'~assets/images/background/square_background.svg\')', 62 | }), 63 | fontFamily: { 64 | 'sans': ['Manrope'], 65 | 'head': ['Manrope'] 66 | } 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /test/e2e/fixtures/coupon-failure.json: -------------------------------------------------------------------------------- 1 | { 2 | "isValid": false 3 | } 4 | -------------------------------------------------------------------------------- /test/e2e/fixtures/coupon-success.json: -------------------------------------------------------------------------------- 1 | { 2 | "isValid": true, 3 | "pricing": { 4 | "manjaro_xfce": 160, 5 | "premium": 160, 6 | "debian_xfce": 160, 7 | "ubuntu_kde": 160, 8 | "ubuntu_xfce": 160 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /test/e2e/fixtures/pricing.json: -------------------------------------------------------------------------------- 1 | { 2 | "price": 200 3 | } 4 | -------------------------------------------------------------------------------- /test/e2e/integration/auth.spec.js: -------------------------------------------------------------------------------- 1 | describe('Authentication Tests', () => { 2 | beforeEach(() => { 3 | cy.visit('/') 4 | /* Waiting when nuxt actually builds the page */ 5 | cy.wait(7000) 6 | cy.get('#nav_hamburger').click() 7 | cy.wait(5000) 8 | cy.get('body').then(($body) => { 9 | return !!$body.find('#drawer_logout_button').length 10 | }) 11 | .then((isLoggedIn) => { 12 | if (isLoggedIn) { 13 | cy.get('#drawer_logout_button').click() 14 | } 15 | }) 16 | }) 17 | 18 | it('should disable submit unless the input is correct', function () { 19 | cy.visit('/auth/login') 20 | cy.get('#login_email_input').type('hello') 21 | cy.get('#login_password_input').type('hello') 22 | cy.get('#login_submit_button').should('be.disabled') 23 | 24 | cy.get('#login_email_input').type('hello@hello.hello') 25 | cy.get('#login_password_input').type('helloo') 26 | cy.get('#login_submit_button').should('be.enabled') 27 | }) 28 | 29 | it('account details and logout button should not be visible when unauthenticated', function () { 30 | cy.visit('/auth/login') 31 | cy.wait(2000) 32 | cy.get('#nav_hamburger').click() 33 | cy.wait(2000) 34 | cy.get('#drawer_account').should('not.exist') 35 | cy.get('#drawer_logout_button').should('not.exist') 36 | 37 | cy.get('#drawer_account_action').should('exist') 38 | }) 39 | 40 | it('should create an error toast', () => { 41 | cy.visit('/auth/login') 42 | cy.get('#login_email_input').type('ok@ok.ok') 43 | cy.get('#login_password_input').type('okokok') 44 | cy.get('#login_submit_button').click() 45 | 46 | cy.intercept('POST', '/identitytoolkit/v3' 47 | ).as('loginRequest') 48 | 49 | cy.wait('@loginRequest') 50 | 51 | cy.get('.v-toast__text').first().should('have.text', 'Error occurred while logging in. Try again later.') 52 | }) 53 | 54 | it('should successfully login with email/password', () => { 55 | cy.login('cypress@test.io', 'ioioio') 56 | cy.location().should((loc) => { 57 | expect(loc.pathname).to.eq('/') 58 | }) 59 | }) 60 | 61 | it('drawer should contain account info after authentication', function () { 62 | cy.login('cypress@test.io', 'ioioio') 63 | cy.get('#drawer_account').should('exist') 64 | cy.get('#drawer_logout_button').should('exist') 65 | }) 66 | 67 | }) 68 | 69 | -------------------------------------------------------------------------------- /test/e2e/integration/general.spec.js: -------------------------------------------------------------------------------- 1 | describe('Drawer Tests', () => { 2 | it('hamburger should open drawer', () => { 3 | cy.visit('/') 4 | /* Waiting when nuxt actually builds the page */ 5 | cy.wait(7000) 6 | cy.get('#nav_hamburger').click() 7 | cy.get('#drawer_main').should('have.class', 'translate-x-0') 8 | }) 9 | 10 | it('should redirect to premium page', () => { 11 | cy.visit('/') 12 | cy.wait(2000) 13 | cy.get('#nav_hamburger').click() 14 | cy.wait(100) 15 | cy.get('#drawer_main_premium').click() 16 | cy.url().should('include', '/products/premium') 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /test/e2e/plugins/index.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = (on, config) => { 3 | // `on` is used to hook into various events Cypress emits 4 | // `config` is the resolved Cypress config 5 | } 6 | -------------------------------------------------------------------------------- /test/e2e/support/commands.js: -------------------------------------------------------------------------------- 1 | 2 | Cypress.Commands.add('login', (email, password) => { 3 | cy.visit('/auth/login') 4 | cy.get('#login_email_input').type(email) 5 | cy.get('#login_password_input').type(password) 6 | cy.get('#login_submit_button').click() 7 | 8 | cy.intercept('POST', '/identitytoolkit/v3' 9 | ).as('loginRequest') 10 | cy.wait('@loginRequest') 11 | 12 | cy.get('#nav_hamburger').click() 13 | cy.wait(1000) 14 | }) 15 | 16 | Cypress.Commands.add('fill_out_form', () => { 17 | 18 | cy.get('#checkout_first_name_input').type(chance.first()) 19 | cy.get('#checkout_first_last_input').type(chance.last()) 20 | cy.get('#checkout_email_input').should('be.disabled') 21 | cy.get('#checkout_postal_code_input').type(chance.postcode()) 22 | cy.get('#checkout_address_input').type(chance.address()) 23 | cy.get('#checkout_country_input').select('India') 24 | cy.get('#checkout_state_input').select('Uttar Pradesh') 25 | }) 26 | 27 | Cypress.Commands.add('stub_pricing_request', () => { 28 | 29 | }) 30 | -------------------------------------------------------------------------------- /test/e2e/support/index.js: -------------------------------------------------------------------------------- 1 | import './commands' 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2018", 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "lib": [ 7 | "ESNext", 8 | "ESNext.AsyncIterable", 9 | "DOM" 10 | ], 11 | "esModuleInterop": true, 12 | "allowJs": true, 13 | "sourceMap": true, 14 | "strict": true, 15 | "noEmit": true, 16 | "experimentalDecorators": true, 17 | "baseUrl": ".", 18 | "paths": { 19 | "~/*": [ 20 | "./*" 21 | ], 22 | "@/*": [ 23 | "./*" 24 | ] 25 | }, 26 | "types": [ 27 | "@types/node", 28 | "@nuxt/types" 29 | ] 30 | }, 31 | "exclude": [ 32 | "node_modules", 33 | ".nuxt", 34 | "dist" 35 | ] 36 | } 37 | --------------------------------------------------------------------------------