# Project set up
The vite options and critical packages used in retain.
- [Vite](https://vitejs.dev/)
- [vue 3](https://vuejs.org/)
- [prettier](https://prettier.io/)
- [vitest](https://vitest.dev/)
- [cypress](https://www.cypress.io/)
- [typescript](https://www.typescriptlang.org/)
- Critical packages
- [pinia](https://pinia.vuejs.org/): state management
- [scss](https://sass-lang.com/): styles
- [vue-router](): routing
- [axios](https://axios-http.com/): requests
# Style guide for vue components
[Script setup](https://vuejs.org/api/sfc-script-setup.html#basic-syntax) should be used in all new Vue single file components
An empty Vue component set up correctly should look like this 99% of the time. (the order of the three main tags doesn't matter)
```vue
<template>
</template>
<script setup lang="ts">
</script>
<style scoped lang="scss">
</style>
```
# CSS
Use [Css Grid](https://css-tricks.com/snippets/css/complete-guide-grid/) for layout and positioning as much as possible [Flex](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) is occasionally acceptable for super simple components. Style and design wise what is chosen isn't super important. In Retain most things are hand made and controlled with a handful of scss variables.
#### Retain's SCSS Variables File
```scss
$cb_primary: hsl(256, 30%, 52%);
$cb_secondary: hsl(189, 81%, 30%);
$cb_tertiary: hsl(224, 70%, 46%);
$cb_link: #3A5B98;
$cb_text: hsl(0, 1%, 25%);
$cb_text_background: hsl(0, 1%, 100%);
$cb_neutral: hsl(0, 0%, 95%);
$gap: 1rem;
$shadow: 0 0 3px 1px grey;
$radius: 3px;
```
#### SCSS variables example
Here is an example of a simple card component using the scss variables
```vue
<template>
<section class="graph_card">
<article class="top">
<h1 class="graph_title">{{ title }}</h1>
<CBButton @click="btnEmit" v-if="button?.exists" variant="primary">{{
button.text
}}</CBButton>
</article>
<slot></slot>
</section>
</template>
<script setup lang="ts">
...
</script>
<style lang="scss" scoped>
.graph_card {
background: $cb_text_background;
padding: $gap;
border-radius: $radius;
box-shadow: $shadow;
display: grid;
grid-template-rows: auto 1fr;
.top {
display: flex;
justify-content: space-between;
.graph_title {
font-size: 1.8rem;
}
}
}
</style>
```