mirror of https://github.com/aotds/aotds-docks.git
71 changed files with 997 additions and 935 deletions
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
const path = require("path"); |
||||
const preprocess = require("svelte-preprocess"); |
||||
|
||||
module.exports = { |
||||
staticDirs: ["../static", "../pictures"], |
||||
stories: [ |
||||
"../src/**/*.stories.mdx", |
||||
"../src/**/*.stories.svelte", |
||||
"../src/**/stories.svelte", |
||||
], |
||||
addons: [ |
||||
"@storybook/addon-links", |
||||
"@storybook/addon-essentials", |
||||
"@storybook/addon-svelte-csf", |
||||
], |
||||
framework: "@storybook/svelte", |
||||
svelteOptions: { |
||||
preprocess: preprocess(), |
||||
}, |
||||
webpackFinal: async (config) => { |
||||
return { |
||||
...config, |
||||
resolve: { |
||||
...config.resolve, |
||||
alias: { |
||||
...config.resolve?.alias, |
||||
$app: path.resolve("./fake/app"), |
||||
"\\$lib": path.resolve(__dirname, "../src/lib/"), |
||||
$lib: path.resolve(__dirname, "../src/lib/"), |
||||
}, |
||||
}, |
||||
}; |
||||
}, |
||||
}; |
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
import "$lib/style/index.js"; |
||||
|
||||
export const parameters = { |
||||
actions: { argTypesRegex: "^on[A-Z].*" }, |
||||
controls: { |
||||
matchers: { |
||||
color: /(background|color)$/i, |
||||
date: /Date$/, |
||||
}, |
||||
}, |
||||
}; |
@ -1,3 +1,3 @@
@@ -1,3 +1,3 @@
|
||||
import Theme from '@vitebook/theme-default'; |
||||
import Theme from "@vitebook/theme-default"; |
||||
|
||||
export default Theme; |
||||
|
@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
|
||||
<Carrier /> |
||||
|
||||
<script> |
||||
import Carrier from "./index.svelte"; |
||||
|
||||
const props = { |
||||
bays: 3, |
||||
squadrons: [ |
||||
{ id: 1, type: "standard", ftl: false, nbr_fighters: 6 }, |
||||
{ id: 2, type: "fast", ftl: false, nbr_fighters: 6 }, |
||||
{ id: 3, type: "none", ftl: false, nbr_fighters: 6 }, |
||||
], |
||||
}; |
||||
</script> |
@ -1,20 +1,20 @@
@@ -1,20 +1,20 @@
|
||||
import { action } from '@storybook/addon-actions'; |
||||
import { action } from "@storybook/addon-actions"; |
||||
|
||||
import Carrier from './index.svelte'; |
||||
import Carrier from "./index.svelte"; |
||||
|
||||
export default { |
||||
title: 'Carrier', |
||||
title: "Carrier", |
||||
}; |
||||
|
||||
export const basic = () => ({ |
||||
Component: Carrier, |
||||
props: { |
||||
bays: 3, |
||||
squadrons: [ |
||||
{ id: 1, type: "standard", ftl: false, nbr_fighters: 6 }, |
||||
{ id: 2, type: "fast", ftl: false, nbr_fighters: 6 }, |
||||
{ id: 3, type: "none", ftl: false, nbr_fighters: 6 }, |
||||
], |
||||
ship_change: action('ship_change'), |
||||
}, |
||||
}) |
||||
Component: Carrier, |
||||
props: { |
||||
bays: 3, |
||||
squadrons: [ |
||||
{ id: 1, type: "standard", ftl: false, nbr_fighters: 6 }, |
||||
{ id: 2, type: "fast", ftl: false, nbr_fighters: 6 }, |
||||
{ id: 3, type: "none", ftl: false, nbr_fighters: 6 }, |
||||
], |
||||
ship_change: action("ship_change"), |
||||
}, |
||||
}); |
||||
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
||||
<Cost cost={12}/> |
||||
<Cost cost={12} /> |
||||
|
||||
<script> |
||||
import Cost from './Cost.svelte'; |
||||
import Cost from "./Cost.svelte"; |
||||
</script> |
||||
|
@ -1,21 +1,29 @@
@@ -1,21 +1,29 @@
|
||||
<div class="mass">{ mass }</div> |
||||
<div class="cost">{ cost }</div> |
||||
<div class="mass">{mass}</div> |
||||
<div class="cost">{cost}</div> |
||||
|
||||
<script> |
||||
export let mass; |
||||
export let cost; |
||||
|
||||
</script> |
||||
|
||||
<style> |
||||
.cost { grid-column: 3; } |
||||
.mass { grid-column: 2; } |
||||
.cost { |
||||
grid-column: 3; |
||||
} |
||||
.mass { |
||||
grid-column: 2; |
||||
} |
||||
img { |
||||
width: 0.75em; |
||||
} |
||||
.cost:after { content: '\00A4'; margin-left: 0.5em; } |
||||
.mass:after { content: url("/mass.svg"); width: 0.75em; display: |
||||
inline-block; margin-left: 0.5em; } |
||||
|
||||
|
||||
.cost:after { |
||||
content: "\00A4"; |
||||
margin-left: 0.5em; |
||||
} |
||||
.mass:after { |
||||
content: url("/mass.svg"); |
||||
width: 0.75em; |
||||
display: inline-block; |
||||
margin-left: 0.5em; |
||||
} |
||||
</style> |
||||
|
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
<Meta |
||||
title="Engine" |
||||
component={Engine} |
||||
argTypes={{ |
||||
rating: { type: "number", defaultValue: 6 }, |
||||
advanced: { type: "boolean", defaultValue: false }, |
||||
reqs: { type: "object", defaultValue: { cost: 6, mass: 3 } }, |
||||
}} |
||||
/> |
||||
|
||||
<Story name="Primary" args={{}} /> |
||||
|
||||
<Template let:args> |
||||
<div style="width: 50em"> |
||||
<Engine {...args} /> |
||||
</div> |
||||
</Template> |
||||
|
||||
<script> |
||||
import { Meta, Template, Story } from "@storybook/addon-svelte-csf"; |
||||
import { action } from "@storybook/addon-actions"; |
||||
|
||||
import { setContext } from "svelte"; |
||||
|
||||
import Engine from "./index.svelte"; |
||||
|
||||
setContext("ship", { |
||||
dispatch: (type, detail) => action(type)(detail), |
||||
}); |
||||
|
||||
let advanced = false; |
||||
let rating = 0; |
||||
</script> |
@ -1,40 +1,39 @@
@@ -1,40 +1,39 @@
|
||||
<ShipItem {cost} {mass}> |
||||
|
||||
<div> |
||||
<Field label="thrust rating"> |
||||
<input type="number" bind:value={ rating } |
||||
min="0" max="20" step="1" /> |
||||
</Field> |
||||
|
||||
<label><input type="checkbox" bind:checked={advanced} /> advanced</label> |
||||
</div> |
||||
|
||||
<ShipItem {...reqs}> |
||||
<div> |
||||
<Field label="thrust rating"> |
||||
<input type="number" bind:value={rating} min="0" max="20" step="1" /> |
||||
</Field> |
||||
|
||||
<label><input type="checkbox" bind:checked={advanced} /> advanced</label> |
||||
</div> |
||||
</ShipItem> |
||||
|
||||
|
||||
<script> |
||||
import { createEventDispatcher } from 'svelte'; |
||||
|
||||
import Field from '$lib/components/Field/index.svelte'; |
||||
import ShipItem from '$lib/components/ShipItem/index.svelte'; |
||||
|
||||
export let cost; |
||||
export let mass; |
||||
export let advanced = false; |
||||
export let rating = 0; |
||||
import { getContext } from "svelte"; |
||||
import Field from "$lib/components/Field/index.svelte"; |
||||
import ShipItem from "$lib/components/ShipItem/index.svelte"; |
||||
|
||||
const dispatch = createEventDispatcher(); |
||||
export let reqs = {}; |
||||
export let advanced = false; |
||||
export let rating = 0; |
||||
|
||||
console.log(advanced); |
||||
$: dispatch( 'change_engine', { rating, advanced } ); |
||||
const ship = getContext("ship") || { |
||||
dispatch: (...args) => console.log(args), |
||||
}; |
||||
|
||||
$: ship.dispatch("setEngine", { rating, advanced }); |
||||
</script> |
||||
|
||||
<style> |
||||
div { |
||||
div { |
||||
display: flex; |
||||
align-items: end; |
||||
} |
||||
label { margin-left: 2em; } |
||||
input[type="number"] { width: 5em; } |
||||
} |
||||
label { |
||||
font-family: var(--main-font-family); |
||||
margin-left: 2em; |
||||
} |
||||
input[type="number"] { |
||||
width: 5em; |
||||
} |
||||
</style> |
||||
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
||||
<Field label="the label" /> |
||||
|
||||
<script> |
||||
import Field from './index.svelte'; |
||||
import Field from "./index.svelte"; |
||||
</script> |
||||
|
@ -1,29 +1,32 @@
@@ -1,29 +1,32 @@
|
||||
<div> |
||||
{#if label} |
||||
<label>{label}</label> |
||||
{/if} |
||||
<slot> |
||||
<input type="text" {placeholder} {value} on:change /> |
||||
</slot> |
||||
{#if label} |
||||
<label>{label}</label> |
||||
{/if} |
||||
<slot> |
||||
<input type="text" {placeholder} {value} on:change /> |
||||
</slot> |
||||
</div> |
||||
|
||||
<script> |
||||
export let label = ""; |
||||
export let value = ""; |
||||
export let placeholder; |
||||
export let label = ""; |
||||
export let value = ""; |
||||
export let placeholder; |
||||
</script> |
||||
|
||||
<style> |
||||
div { |
||||
font-family: var(--main-font-family); |
||||
} |
||||
div > :global(*) { |
||||
margin-left: 1em; |
||||
} |
||||
div > label { |
||||
margin-left: 0em; |
||||
} |
||||
label { |
||||
label { |
||||
font-size: var(--font-scale-8); |
||||
font-weight: lighter; |
||||
font-family: Dosis; |
||||
color: var(--indigo-dye); |
||||
} |
||||
color: var(--indigo-dye); |
||||
} |
||||
</style> |
||||
|
@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
|
||||
import Component from './index.svelte'; |
||||
import BasicStory from './BasicStory.svelte'; |
||||
import Component from "./index.svelte"; |
||||
import BasicStory from "./BasicStory.svelte"; |
||||
|
||||
import '../../../public/global.css'; |
||||
import "../../../public/global.css"; |
||||
|
||||
export default { |
||||
title: 'Field' |
||||
title: "Field", |
||||
}; |
||||
|
||||
export const basic = () => ({ |
||||
Component: BasicStory, |
||||
Component: BasicStory, |
||||
}); |
||||
|
@ -1,35 +1,34 @@
@@ -1,35 +1,34 @@
|
||||
<script> |
||||
import { createEventDispatcher } from 'svelte'; |
||||
|
||||
import ShipItem from '../ShipItem/index.svelte'; |
||||
import Field from '../Field/index.svelte'; |
||||
<ShipItem {mass} {cost}> |
||||
<Field label="FTL drive"> |
||||
{#each types as t (t)} |
||||
<label |
||||
><input type="radio" bind:group={type} value={t} on:change={change} /> |
||||
{t} |
||||
</label> |
||||
{/each} |
||||
</Field> |
||||
</ShipItem> |
||||
|
||||
export let type = 'none'; |
||||
export let cost = 0; |
||||
export let mass = 0; |
||||
<script> |
||||
import { createEventDispatcher } from "svelte"; |
||||
|
||||
const dispatch = createEventDispatcher(); |
||||
import ShipItem from "../ShipItem/index.svelte"; |
||||
import Field from "../Field/index.svelte"; |
||||
|
||||
const change = () => dispatch( 'change_ftl', type ); |
||||
export let type = "none"; |
||||
export let cost = 0; |
||||
export let mass = 0; |
||||
|
||||
const types = [ 'none', 'standard', 'advanced' ]; |
||||
const dispatch = createEventDispatcher(); |
||||
|
||||
const change = () => dispatch("change_ftl", type); |
||||
|
||||
const types = ["none", "standard", "advanced"]; |
||||
</script> |
||||
|
||||
<ShipItem {mass} {cost}> |
||||
<Field label="FTL drive"> |
||||
|
||||
{#each types as t (t)} |
||||
<label><input type="radio" bind:group={type} value={t} |
||||
on:change={change} /> {t} </label> |
||||
{/each} |
||||
</Field> |
||||
</ShipItem> |
||||
|
||||
<style> |
||||
label { |
||||
label { |
||||
display: inline; |
||||
margin-right: 1em; |
||||
} |
||||
} |
||||
</style> |
||||
|
@ -1,13 +1,13 @@
@@ -1,13 +1,13 @@
|
||||
export default { |
||||
title: 'FTL Drive' |
||||
title: "FTL Drive", |
||||
}; |
||||
|
||||
import Component from '.'; |
||||
import shipStore from '../../stores/ship.js'; |
||||
import Component from "."; |
||||
import shipStore from "../../stores/ship.js"; |
||||
|
||||
export const basic = () => ({ |
||||
Component, |
||||
props: { |
||||
ship: shipStore() |
||||
} |
||||
Component, |
||||
props: { |
||||
ship: shipStore(), |
||||
}, |
||||
}); |
||||
|
@ -1,24 +1,22 @@
@@ -1,24 +1,22 @@
|
||||
<Field label={ `layer ${layer}` }> |
||||
<input type="number" min="0" bind:value={rating} /> |
||||
<Field label={`layer ${layer}`}> |
||||
<input type="number" min="0" bind:value={rating} /> |
||||
</Field> |
||||
|
||||
|
||||
<script> |
||||
import { getContext} from 'svelte'; |
||||
|
||||
import Field from '$lib/components/Field/index.svelte'; |
||||
import { getContext } from "svelte"; |
||||
|
||||
export let layer = 1; |
||||
export let rating = 0; |
||||
import Field from "$lib/components/Field/index.svelte"; |
||||
|
||||
const ship = getContext('ship'); |
||||
export let layer = 1; |
||||
export let rating = 0; |
||||
|
||||
$: ship?.dispatch_action( 'set_armour_layer', {layer,rating} ); |
||||
const ship = getContext("ship"); |
||||
|
||||
$: ship?.dispatch_action("set_armour_layer", { layer, rating }); |
||||
</script> |
||||
|
||||
<style> |
||||
input { |
||||
width: 5em; |
||||
} |
||||
</style> |
||||
</style> |
||||
|
@ -1,56 +1,48 @@
@@ -1,56 +1,48 @@
|
||||
<ShipItem {cost} {mass} > |
||||
|
||||
<div> |
||||
|
||||
<div class="nbr_layers"> |
||||
<Field label="armour layers"> |
||||
<input type="number" min="0" bind:value={nbr_layers} /> |
||||
</Field> |
||||
</div> |
||||
|
||||
<div class="layers"> |
||||
{#each armour as layer ( layer.layer )} |
||||
<Layer {...layer} on:ship_change/> |
||||
{/each} |
||||
</div> |
||||
|
||||
|
||||
</div> |
||||
|
||||
<ShipItem {cost} {mass}> |
||||
<div> |
||||
<div class="nbr_layers"> |
||||
<Field label="armour layers"> |
||||
<input type="number" min="0" bind:value={nbr_layers} /> |
||||
</Field> |
||||
</div> |
||||
|
||||
<div class="layers"> |
||||
{#each armour as layer (layer.layer)} |
||||
<Layer {...layer} on:ship_change /> |
||||
{/each} |
||||
</div> |
||||
</div> |
||||
</ShipItem> |
||||
|
||||
<script> |
||||
import { createEventDispatcher} from 'svelte'; |
||||
|
||||
import ShipItem from '$lib/components/ShipItem/index.svelte'; |
||||
import Field from '$lib/components/Field/index.svelte'; |
||||
import Layer from './Layer/index.svelte'; |
||||
import dux from '$lib/dux/structure/armour'; |
||||
import _ from 'lodash'; |
||||
import { createEventDispatcher } from "svelte"; |
||||
|
||||
export let armour = []; |
||||
export let cost = 0; |
||||
export let mass = 0; |
||||
import ShipItem from "$lib/components/ShipItem/index.svelte"; |
||||
import Field from "$lib/components/Field/index.svelte"; |
||||
import Layer from "./Layer/index.svelte"; |
||||
import dux from "$lib/dux/structure/armour"; |
||||
import _ from "lodash"; |
||||
|
||||
$: cost = _.sum( _.map( armour, 'cost' ) ); |
||||
$: mass = _.sum( _.map( armour, 'mass' ) ); |
||||
export let armour = []; |
||||
export let cost = 0; |
||||
export let mass = 0; |
||||
|
||||
let nbr_layers = armour.length; |
||||
$: cost = _.sum(_.map(armour, "cost")); |
||||
$: mass = _.sum(_.map(armour, "mass")); |
||||
|
||||
const dispatch = createEventDispatcher(); |
||||
let nbr_layers = armour.length; |
||||
|
||||
$: dispatch( 'ship_change', dux.actions.set_armour_nbr_layers(nbr_layers) ); |
||||
const dispatch = createEventDispatcher(); |
||||
|
||||
$: dispatch("ship_change", dux.actions.set_armour_nbr_layers(nbr_layers)); |
||||
</script> |
||||
|
||||
<style> |
||||
.layers { |
||||
display: flex; |
||||
|
||||
} |
||||
|
||||
input { |
||||
width: 5em; |
||||
} |
||||
.layers { |
||||
display: flex; |
||||
} |
||||
|
||||
input { |
||||
width: 5em; |
||||
} |
||||
</style> |
||||
|
@ -1,18 +1,18 @@
@@ -1,18 +1,18 @@
|
||||
import Armour from './index.svelte'; |
||||
import Armour from "./index.svelte"; |
||||
|
||||
export default { |
||||
title: "Armour", |
||||
title: "Armour", |
||||
}; |
||||
|
||||
export const basic = () => ({ |
||||
Component: Armour, |
||||
props: { |
||||
armour: [ |
||||
{ layer: 1, rating: 12, cost: 1, mass: 2 }, |
||||
{ layer: 2, rating: 12, cost: 1, mass: 2 }, |
||||
] |
||||
}, |
||||
on: { |
||||
ship_change: ({detail}) => console.log(detail) |
||||
} |
||||
Component: Armour, |
||||
props: { |
||||
armour: [ |
||||
{ layer: 1, rating: 12, cost: 1, mass: 2 }, |
||||
{ layer: 2, rating: 12, cost: 1, mass: 2 }, |
||||
], |
||||
}, |
||||
on: { |
||||
ship_change: ({ detail }) => console.log(detail), |
||||
}, |
||||
}); |
||||
|
@ -1,38 +1,41 @@
@@ -1,38 +1,41 @@
|
||||
<ShipItem {cost} {mass}> |
||||
<Field label="streamlining"> |
||||
<div> |
||||
<label> |
||||
<input type="radio" bind:group={type} value="none" /> |
||||
none</label> |
||||
<label> |
||||
|
||||
<input type="radio" bind:group={type} value="partial" /> |
||||
partial</label> |
||||
<label> |
||||
<input type="radio" bind:group={type} value="full" /> |
||||
full</label> |
||||
<div> |
||||
<label> |
||||
<input type="radio" bind:group={type} value="none" /> |
||||
none</label |
||||
> |
||||
<label> |
||||
<input type="radio" bind:group={type} value="partial" /> |
||||
partial</label |
||||
> |
||||
<label> |
||||
<input type="radio" bind:group={type} value="full" /> |
||||
full</label |
||||
> |
||||
</div> |
||||
</Field> |
||||
</ShipItem> |
||||
|
||||
<script> |
||||
import ShipItem from '$lib/components/ShipItem/index.svelte'; |
||||
import Field from '$lib/components/Field/index.svelte'; |
||||
<script> |
||||
import ShipItem from "$lib/components/ShipItem/index.svelte"; |
||||
import Field from "$lib/components/Field/index.svelte"; |
||||
|
||||
import {getContext } from 'svelte'; |
||||
import { getContext } from "svelte"; |
||||
|
||||
export let type = 'none'; |
||||
export let type = "none"; |
||||
export let cost = 0; |
||||
export let mass = 0; |
||||
export let ship = getContext('ship'); |
||||
|
||||
$: ship?.dispatch_action( 'set_streamlining', type); |
||||
export let ship = getContext("ship"); |
||||
|
||||
</script> |
||||
$: ship?.dispatch_action("set_streamlining", type); |
||||
</script> |
||||
|
||||
<style> |
||||
div { display: flex } |
||||
<style> |
||||
div { |
||||
display: flex; |
||||
} |
||||
label { |
||||
margin-left: 1em; |
||||
} |
||||
</style> |
||||
</style> |
||||
|
@ -1,51 +1,51 @@
@@ -1,51 +1,51 @@
|
||||
<Section label="hull"> |
||||
|
||||
<ShipItem {cost} {mass} > |
||||
<ShipItem {cost} {mass}> |
||||
<Field label="integrity"> |
||||
<input |
||||
bind:value={rating} |
||||
type="number" {min} {max} /> |
||||
<input bind:value={rating} type="number" {min} {max} /> |
||||
</Field> |
||||
</ShipItem> |
||||
|
||||
</ShipItem> |
||||
|
||||
<Screens {...screens} on:set_screens /> |
||||
<Screens {...screens} on:set_screens /> |
||||
|
||||
<Armour {armour} on:ship_change /> |
||||
<Armour {armour} on:ship_change /> |
||||
|
||||
<Cargo {...cargo} on:set_cargo /> |
||||
<Cargo {...cargo} on:set_cargo /> |
||||
|
||||
<Streamlining {...streamlining} /> |
||||
<Streamlining {...streamlining} /> |
||||
</Section> |
||||
|
||||
<script> |
||||
import { createEventDispatcher } from 'svelte'; |
||||
|
||||
import Section from '../Section/index.svelte'; |
||||
import Field from '../Field/index.svelte'; |
||||
import ShipItem from '../ShipItem/index.svelte'; |
||||
import Screens from './Screens/index.svelte'; |
||||
import Armour from './Armour/index.svelte'; |
||||
import Cargo from './Cargo/index.svelte'; |
||||
import Streamlining from './Streamlining/index.svelte'; |
||||
|
||||
export let cost, mass, ship_mass, rating, screens, armour = ( |
||||
0, 0, 10, 1, [], [] |
||||
); |
||||
import { createEventDispatcher } from "svelte"; |
||||
|
||||
import Section from "../Section/index.svelte"; |
||||
import Field from "../Field/index.svelte"; |
||||
import ShipItem from "../ShipItem/index.svelte"; |
||||
import Screens from "./Screens/index.svelte"; |
||||
import Armour from "./Armour/index.svelte"; |
||||
import Cargo from "./Cargo/index.svelte"; |
||||
import Streamlining from "./Streamlining/index.svelte"; |
||||
|
||||
export let cost, |
||||
mass, |
||||
ship_mass, |
||||
rating, |
||||
screens, |
||||
armour = (0, 0, 10, 1, [], []); |
||||
|
||||
export let cargo = {}; |
||||
export let streamlining = {}; |
||||
|
||||
let min, max; |
||||
let min, max; |
||||
$: min = Math.ceil(ship_mass / 10); |
||||
$: max = ship_mass; |
||||
|
||||
const dispatch = createEventDispatcher(); |
||||
|
||||
$: dispatch( 'change_hull', { rating } ); |
||||
const dispatch = createEventDispatcher(); |
||||
|
||||
$: dispatch("change_hull", { rating }); |
||||
</script> |
||||
|
||||
<style> |
||||
input { width: 5em; } |
||||
input { |
||||
width: 5em; |
||||
} |
||||
</style> |
||||
|
@ -1,23 +1,23 @@
@@ -1,23 +1,23 @@
|
||||
import Component from '.'; |
||||
import Component from "."; |
||||
|
||||
export default { |
||||
title: "printouts/hull/integrity" |
||||
title: "printouts/hull/integrity", |
||||
}; |
||||
|
||||
export const basic = () => ({ |
||||
Component, |
||||
props: { |
||||
ship_mass: 50, |
||||
rating: 14, |
||||
advanced: false, |
||||
} |
||||
Component, |
||||
props: { |
||||
ship_mass: 50, |
||||
rating: 14, |
||||
advanced: false, |
||||
}, |
||||
}); |
||||
|
||||
export const advanced = () => ({ |
||||
Component, |
||||
props: { |
||||
ship_mass: 50, |
||||
rating: 14, |
||||
advanced: true, |
||||
} |
||||
Component, |
||||
props: { |
||||
ship_mass: 50, |
||||
rating: 14, |
||||
advanced: true, |
||||
}, |
||||
}); |
||||
|