├── .eslintrc ├── .github └── workflows │ └── typescript.yml ├── .gitignore ├── README.md ├── __.babelrc ├── components ├── .DS_Store ├── ability.tsx ├── about.tsx ├── actions.tsx ├── base-size.tsx ├── collection-panel.tsx ├── dial │ ├── index.tsx │ └── row.tsx ├── fonts │ ├── .DS_Store │ ├── ships.tsx │ └── xwing.tsx ├── format-error.tsx ├── format.tsx ├── formatted-text.tsx ├── grants.tsx ├── import.tsx ├── layout.tsx ├── limit-error.tsx ├── logo.tsx ├── modal.tsx ├── notification.tsx ├── pilot.tsx ├── popover │ ├── pilot.tsx │ ├── ship.tsx │ └── upgrade.tsx ├── save-panel.tsx ├── saved-squadrons-panel.tsx ├── search │ ├── index.tsx │ └── input.tsx ├── select-tags.tsx ├── ship-stats.tsx ├── ship-type.tsx ├── slim │ ├── pilot.tsx │ ├── ship.tsx │ └── upgrade.tsx ├── tag.tsx ├── unit.tsx └── upgrade.tsx ├── helpers ├── clipboard.ts ├── collection.ts ├── colors.ts ├── convert.ts ├── cost.ts ├── edit.ts ├── export.ts ├── images.ts ├── import.ts ├── loading.ts ├── misc.ts ├── names.ts ├── popover.ts ├── request.ts ├── select.ts └── types.ts ├── next-env.d.ts ├── next.config.js ├── nodemon.json ├── package.json ├── pages ├── _app.tsx ├── api │ ├── auth │ │ └── [...nextauth].ts │ ├── link.ts │ ├── standard.ts │ └── xws.ts ├── blog │ └── [id].tsx ├── index.tsx ├── plot.tsx ├── print.tsx └── privacy.tsx ├── postcss.config.js ├── public ├── .well-known │ └── apple-app-site-association ├── android-chrome-192x192.png ├── android-chrome-256x256.png ├── apple-touch-icon.png ├── browserconfig.xml ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── mstile-150x150.png ├── safari-pinned-tab.svg ├── site.webmanifest └── static │ ├── css │ └── tailwind.css │ ├── fonts │ ├── xwing-miniatures-ships.ttf │ └── xwing-miniatures.ttf │ ├── images │ ├── 1_1.png │ ├── 1_2.png │ ├── 1_3.png │ └── 1_4.png │ └── plot_data.json ├── scripts ├── apple-gen-secret.mjs └── post-install.js ├── tailwind.config.js ├── tsconfig.json ├── tsconfig.server.json ├── tsconfig.tsbuildinfo ├── yarn-error.log └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "eslint:recommended", 4 | "plugin:react/recommended" 5 | ], 6 | "parser": "babel-eslint", 7 | "plugins": [ 8 | "react", 9 | "prettier", 10 | "react-hooks" 11 | ], 12 | "parserOptions": { 13 | "ecmaFeatures": { 14 | "jsx": true 15 | }, 16 | "sourceType": "module" 17 | }, 18 | "rules": { 19 | "prettier/prettier": [ 20 | "error", 21 | { 22 | "trailingComma": "es5", 23 | "singleQuote": true 24 | } 25 | ], 26 | "react/display-name": 0, 27 | "no-unused-vars": 2, 28 | "react/jsx-uses-vars": [ 29 | "error" 30 | ], 31 | "react/sort-comp": 0, 32 | "react/jsx-filename-extension": [ 33 | 1, 34 | { 35 | "extensions": [ 36 | ".js", 37 | ".jsx" 38 | ] 39 | } 40 | ], 41 | "react/no-unused-prop-types": 0, 42 | "no-undef": 0, 43 | "react-hooks/rules-of-hooks": "error", 44 | "react-hooks/exhaustive-deps": "warn" 45 | } 46 | } -------------------------------------------------------------------------------- /.github/workflows/typescript.yml: -------------------------------------------------------------------------------- 1 | name: Typescript 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | strategy: 11 | matrix: 12 | node-version: [8.x, 10.x, 12.x] 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Use Node.js ${{ matrix.node-version }} 17 | uses: actions/setup-node@v1 18 | with: 19 | node-version: ${{ matrix.node-version }} 20 | - run: npm install 21 | - run: npm test 22 | env: 23 | CI: true 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | build/ 4 | .env 5 | .next/ 6 | 7 | # VSCODE 8 | .vscode/ 9 | 10 | # MACOS 11 | .DS_Store 12 | 13 | .vercel 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Launch Bay Next 2 |  3 | =============== 4 | Another squad builder...? 5 | 6 | Well, I've had the Launch Bay Next mobile app available since the release of X-Wing Second Edition and a bit further down the path I found out that I could reuse most of my components from the app (written in React Native) to be used on the web! 7 | 8 | Said and done, I did a quick conversion of some key components and this is it... 9 | 10 | It's not even close on par feature-wise with the mobile app, but most features will probably be available here also (at some point). 11 | 12 | 13 | Building 14 | ======== 15 | 16 | 1. Install [Node](https://nodejs.org) 17 | 2. Install [Yarn](https://legacy.yarnpkg.com/en/docs/install) 18 | 3. `yarn install` to install all dependencies 19 | 4. `yarn dev` to get the app running 20 | 21 | 22 | Credits 23 | ------- 24 | [X-Wing Miniatures](https://www.fantasyflightgames.com/en/products/x-wing-second-edition/) is made by [Fantasy Flight Games](http://www.fantasyflightgames.com). 25 | -------------------------------------------------------------------------------- /__.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["next/babel"], 3 | "plugins": [ 4 | [ 5 | "module-resolver", 6 | { 7 | "root": ["./"], 8 | "alias": { 9 | "@actions": "./actions", 10 | "@api": "./api", 11 | "@components": "./components", 12 | "@lib": "./lib", 13 | "@reducers": "./reducers", 14 | "@store": "./store" 15 | }, 16 | "extensions": [".js", ".jsx", ".json", ".ts", ".tsx"] 17 | } 18 | ] 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /components/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrelind/launch-bay-next-web/1f83a30c8cfb82fd68dc697c0eebb9caece8bfac/components/.DS_Store -------------------------------------------------------------------------------- /components/ability.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import FormattedText from './formatted-text'; 3 | 4 | type Props = { 5 | ability: { name: string; text: string }; 6 | }; 7 | 8 | export const AbilityComponent = ({ ability }: Props) => { 9 | return ( 10 |
47 | Please consider donating, either via{' '} 48 | Patreon or{' '} 49 | PayPal 50 |
51 |52 | Want to help out? 53 |
91 | This builder is unofficial and is not affiliated with Fantasy Flight 92 | Games, Lucasfilm Ltd., or Disney. 93 |
94 | Privacy Policy 95 |{localTitle}
62 |{localMessage}
63 |217 | {s.name} 218 | {s.points} 219 |
220 |221 | {joinedPilots} 222 |
223 |