mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-04-20 23:06:14 -04:00
feat: first tool base
This commit is contained in:
parent
b0e232bc77
commit
02dafd6a2f
15 changed files with 326 additions and 168 deletions
|
@ -10,6 +10,8 @@ module.exports = {
|
||||||
],
|
],
|
||||||
// add your custom rules here
|
// add your custom rules here
|
||||||
rules: {
|
rules: {
|
||||||
'space-before-function-paren': 'off'
|
'space-before-function-paren': 'off',
|
||||||
|
'object-curly-spacing': 'off',
|
||||||
|
'no-undef': 'off' // will be catch by the tsc compiler
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,3 +2,4 @@
|
||||||
//
|
//
|
||||||
// The variables you want to modify
|
// The variables you want to modify
|
||||||
// $font-size-root: 20px;
|
// $font-size-root: 20px;
|
||||||
|
|
||||||
|
|
30
components/Tool.vue
Normal file
30
components/Tool.vue
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import {Component, Vue} from 'nuxt-property-decorator'
|
||||||
|
import ToolWrapper from '~/components/ToolWrapper.vue';
|
||||||
|
|
||||||
|
interface ToolConfig {
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export {ToolConfig}
|
||||||
|
|
||||||
|
@Component({components: {ToolWrapper}})
|
||||||
|
export default class Tool extends Vue {
|
||||||
|
public isTool = true;
|
||||||
|
public config: ToolConfig = {
|
||||||
|
title: 'Tool',
|
||||||
|
description: 'Tool description'
|
||||||
|
}
|
||||||
|
|
||||||
|
public head() {
|
||||||
|
const {title, description} = this.config
|
||||||
|
|
||||||
|
return {
|
||||||
|
title,
|
||||||
|
description
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
61
components/ToolWrapper.vue
Normal file
61
components/ToolWrapper.vue
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
<template>
|
||||||
|
<div class="tool-wrapper">
|
||||||
|
<v-row no-gutters justify="center" align="center">
|
||||||
|
<v-col cols="12" lg="6">
|
||||||
|
<div class="tool-wrapper-info">
|
||||||
|
<h1>{{ config.title }}</h1>
|
||||||
|
<div class="spacer"></div>
|
||||||
|
<div class="description">{{ config.description }}</div>
|
||||||
|
</div>
|
||||||
|
<v-card flat>
|
||||||
|
<v-card-text class="pa-10">
|
||||||
|
<slot></slot>
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import {Component, Prop, Vue} from 'nuxt-property-decorator'
|
||||||
|
import {ToolConfig} from '~/components/Tool.vue'
|
||||||
|
|
||||||
|
@Component
|
||||||
|
export default class ToolWrapper extends Vue {
|
||||||
|
@Prop() config!: ToolConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="less">
|
||||||
|
.tool-wrapper {
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.tool-wrapper-info{
|
||||||
|
padding: 50px 0 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category {
|
||||||
|
color: #546167;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 50px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spacer{
|
||||||
|
width: 130px;
|
||||||
|
height: 1px;
|
||||||
|
background-color: var(--v-primary-base);
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
color: #829097;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,11 +2,21 @@
|
||||||
<v-app dark>
|
<v-app dark>
|
||||||
<v-navigation-drawer
|
<v-navigation-drawer
|
||||||
v-model="drawer"
|
v-model="drawer"
|
||||||
:mini-variant="miniVariant"
|
|
||||||
:clipped="clipped"
|
|
||||||
fixed
|
fixed
|
||||||
app
|
app
|
||||||
>
|
>
|
||||||
|
<div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis corporis cumque dolore esse eveniet
|
||||||
|
exercitationem explicabo ipsa libero necessitatibus numquam optio pariatur, perferendis placeat porro ullam vel
|
||||||
|
velit voluptas voluptates?
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320">
|
||||||
|
<path fill="#eee" fill-opacity="1"
|
||||||
|
d="M0,160L26.7,133.3C53.3,107,107,53,160,58.7C213.3,64,267,128,320,176C373.3,224,427,256,480,250.7C533.3,245,587,203,640,186.7C693.3,171,747,181,800,186.7C853.3,192,907,192,960,186.7C1013.3,181,1067,171,1120,176C1173.3,181,1227,203,1280,192C1333.3,181,1387,139,1413,117.3L1440,96L1440,0L1413.3,0C1386.7,0,1333,0,1280,0C1226.7,0,1173,0,1120,0C1066.7,0,1013,0,960,0C906.7,0,853,0,800,0C746.7,0,693,0,640,0C586.7,0,533,0,480,0C426.7,0,373,0,320,0C266.7,0,213,0,160,0C106.7,0,53,0,27,0L0,0Z"></path>
|
||||||
|
<path fill="#05e677" fill-opacity="1"
|
||||||
|
d="M0,224L26.7,218.7C53.3,213,107,203,160,213.3C213.3,224,267,256,320,266.7C373.3,277,427,267,480,256C533.3,245,587,235,640,208C693.3,181,747,139,800,106.7C853.3,75,907,53,960,69.3C1013.3,85,1067,139,1120,181.3C1173.3,224,1227,256,1280,266.7C1333.3,277,1387,267,1413,261.3L1440,256L1440,0L1413.3,0C1386.7,0,1333,0,1280,0C1226.7,0,1173,0,1120,0C1066.7,0,1013,0,960,0C906.7,0,853,0,800,0C746.7,0,693,0,640,0C586.7,0,533,0,480,0C426.7,0,373,0,320,0C266.7,0,213,0,160,0C106.7,0,53,0,27,0L0,0Z"></path>
|
||||||
|
</svg>
|
||||||
|
|
||||||
<v-list>
|
<v-list>
|
||||||
<v-list-item
|
<v-list-item
|
||||||
v-for="(item, i) in items"
|
v-for="(item, i) in items"
|
||||||
|
@ -14,80 +24,87 @@
|
||||||
:to="item.to"
|
:to="item.to"
|
||||||
router
|
router
|
||||||
exact
|
exact
|
||||||
|
dense
|
||||||
>
|
>
|
||||||
<v-list-item-action>
|
<v-list-item-action>
|
||||||
<v-icon>{{ item.icon }}</v-icon>
|
<v-icon>{{ item.icon }}</v-icon>
|
||||||
</v-list-item-action>
|
</v-list-item-action>
|
||||||
<v-list-item-content>
|
<v-list-item-content>
|
||||||
<v-list-item-title v-text="item.title" />
|
<v-list-item-title v-text="item.title"/>
|
||||||
</v-list-item-content>
|
</v-list-item-content>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-navigation-drawer>
|
</v-navigation-drawer>
|
||||||
<v-app-bar :clipped-left="clipped" fixed app>
|
|
||||||
<v-app-bar-nav-icon @click.stop="drawer = !drawer" />
|
<v-app-bar
|
||||||
<v-btn icon @click.stop="miniVariant = !miniVariant">
|
app
|
||||||
<v-icon>mdi-{{ `chevron-${miniVariant ? 'right' : 'left'}` }}</v-icon>
|
flat
|
||||||
</v-btn>
|
height="60px"
|
||||||
<v-btn icon @click.stop="clipped = !clipped">
|
>
|
||||||
<v-icon>mdi-application</v-icon>
|
<v-app-bar-nav-icon @click.stop="drawer = !drawer"/>
|
||||||
</v-btn>
|
<v-toolbar-title v-text="title"/>
|
||||||
<v-btn icon @click.stop="fixed = !fixed">
|
<v-spacer/>
|
||||||
<v-icon>mdi-minus</v-icon>
|
|
||||||
</v-btn>
|
|
||||||
<v-toolbar-title v-text="title" />
|
|
||||||
<v-spacer />
|
|
||||||
<v-btn icon @click.stop="rightDrawer = !rightDrawer">
|
|
||||||
<v-icon>mdi-menu</v-icon>
|
|
||||||
</v-btn>
|
|
||||||
</v-app-bar>
|
</v-app-bar>
|
||||||
|
|
||||||
<v-main>
|
<v-main>
|
||||||
<v-container>
|
<v-container>
|
||||||
<nuxt />
|
<nuxt/>
|
||||||
</v-container>
|
</v-container>
|
||||||
</v-main>
|
</v-main>
|
||||||
<v-navigation-drawer v-model="rightDrawer" :right="right" temporary fixed>
|
<!-- <v-footer app>-->
|
||||||
<v-list>
|
<!-- <span>© {{ new Date().getFullYear() }}</span>-->
|
||||||
<v-list-item @click.native="right = !right">
|
<!-- </v-footer>-->
|
||||||
<v-list-item-action>
|
|
||||||
<v-icon light>
|
|
||||||
mdi-repeat
|
|
||||||
</v-icon>
|
|
||||||
</v-list-item-action>
|
|
||||||
<v-list-item-title>Switch drawer (click me)</v-list-item-title>
|
|
||||||
</v-list-item>
|
|
||||||
</v-list>
|
|
||||||
</v-navigation-drawer>
|
|
||||||
<v-footer :absolute="!fixed" app>
|
|
||||||
<span>© {{ new Date().getFullYear() }}</span>
|
|
||||||
</v-footer>
|
|
||||||
</v-app>
|
</v-app>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script lang="ts">
|
||||||
export default {
|
import {Component, Vue} from 'nuxt-property-decorator';
|
||||||
data() {
|
|
||||||
return {
|
@Component
|
||||||
clipped: false,
|
export default class DefaultLayout extends Vue {
|
||||||
drawer: false,
|
title = 'IT - Tools'
|
||||||
fixed: false,
|
drawer = false
|
||||||
items: [
|
items = [
|
||||||
{
|
{
|
||||||
icon: 'mdi-apps',
|
icon: 'mdi-apps',
|
||||||
title: 'Welcome',
|
title: 'Welcome',
|
||||||
to: '/'
|
to: '/'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
icon: 'mdi-apps',
|
||||||
|
title: 'Token generator',
|
||||||
|
to: '/crypto/TokenGenerator'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
icon: 'mdi-chart-bubble',
|
icon: 'mdi-chart-bubble',
|
||||||
title: 'Inspire',
|
title: 'Inspire',
|
||||||
to: '/inspire'
|
to: '/inspire'
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
miniVariant: false,
|
|
||||||
right: true,
|
created() {
|
||||||
rightDrawer: false,
|
|
||||||
title: 'Vuetify.js'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="less">
|
||||||
|
|
||||||
|
.v-application {
|
||||||
|
background-color: var(--v-background-base, #121212) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme--dark {
|
||||||
|
.v-card,
|
||||||
|
.v-footer,
|
||||||
|
.v-navigation-drawer,
|
||||||
|
.v-app-bar.v-toolbar.v-sheet {
|
||||||
|
background-color: var(--v-foreground-base, #121212) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-footer,
|
||||||
|
.v-app-bar.v-toolbar.v-sheet {
|
||||||
|
background-color: var(--v-toolbar-base, #121212) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
18
mixins/copyable.ts
Normal file
18
mixins/copyable.ts
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
const copyToClipboard = (text: string) => {
|
||||||
|
const input = document.createElement('textarea')
|
||||||
|
input.innerHTML = text
|
||||||
|
document.body.appendChild(input)
|
||||||
|
input.select()
|
||||||
|
const result = document.execCommand('copy')
|
||||||
|
document.body.removeChild(input)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
export const copyable = {
|
||||||
|
methods: {
|
||||||
|
copy(text: string, toastText = 'Copied to clipboard !') {
|
||||||
|
copyToClipboard(text)
|
||||||
|
this.$toast.success(toastText)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
import colors from 'vuetify/es5/util/colors'
|
import colors from 'vuetify/es5/util/colors'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
// Disable server-side rendering (https://go.nuxtjs.dev/ssr-mode)
|
// Enable server-side rendering (https://go.nuxtjs.dev/ssr-mode)
|
||||||
ssr: false,
|
ssr: true,
|
||||||
|
|
||||||
// Target (https://go.nuxtjs.dev/config-target)
|
// Target (https://go.nuxtjs.dev/config-target)
|
||||||
target: 'static',
|
target: 'static',
|
||||||
|
@ -50,17 +50,22 @@ export default {
|
||||||
// Vuetify module configuration (https://go.nuxtjs.dev/config-vuetify)
|
// Vuetify module configuration (https://go.nuxtjs.dev/config-vuetify)
|
||||||
vuetify: {
|
vuetify: {
|
||||||
customVariables: ['~/assets/variables.scss'],
|
customVariables: ['~/assets/variables.scss'],
|
||||||
|
treeShake: true,
|
||||||
theme: {
|
theme: {
|
||||||
dark: true,
|
dark: true,
|
||||||
|
options: { customProperties: true },
|
||||||
themes: {
|
themes: {
|
||||||
dark: {
|
dark: {
|
||||||
primary: colors.blue.darken2,
|
primary: '#05e677',
|
||||||
accent: colors.grey.darken3,
|
accent: colors.grey.darken3,
|
||||||
secondary: colors.amber.darken3,
|
secondary: colors.amber.darken3,
|
||||||
info: colors.teal.lighten1,
|
info: colors.teal.lighten1,
|
||||||
warning: colors.amber.base,
|
warning: colors.amber.base,
|
||||||
error: colors.deepOrange.accent4,
|
error: colors.deepOrange.accent4,
|
||||||
success: colors.green.accent3
|
success: colors.green.accent3,
|
||||||
|
background: '#324148',
|
||||||
|
foreground: '#28353b',
|
||||||
|
toolbar: '#243137'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
41
package-lock.json
generated
41
package-lock.json
generated
|
@ -3968,9 +3968,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"axios": {
|
"axios": {
|
||||||
"version": "0.21.0",
|
"version": "0.21.1",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
||||||
"integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==",
|
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"follow-redirects": "^1.10.0"
|
"follow-redirects": "^1.10.0"
|
||||||
}
|
}
|
||||||
|
@ -11612,6 +11612,18 @@
|
||||||
"@nuxt/webpack": "2.14.12"
|
"@nuxt/webpack": "2.14.12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nuxt-property-decorator": {
|
||||||
|
"version": "2.9.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/nuxt-property-decorator/-/nuxt-property-decorator-2.9.1.tgz",
|
||||||
|
"integrity": "sha512-dE2GrrGKZMhv0dHAr+Lmj+JOQfjIouINgF58QNRDFNOZXMJrXxKO5zGqvCRwmx3hxqqwht7TXHdz9w1AnvL2IA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"vue-class-component": "^7.2.6",
|
||||||
|
"vue-property-decorator": "^9.0.0",
|
||||||
|
"vuex-class": "^0.3.2",
|
||||||
|
"vuex-module-decorators": "^1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nwsapi": {
|
"nwsapi": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
|
||||||
|
@ -15823,6 +15835,12 @@
|
||||||
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
|
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
|
||||||
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
|
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
|
||||||
},
|
},
|
||||||
|
"vue-class-component": {
|
||||||
|
"version": "7.2.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-7.2.6.tgz",
|
||||||
|
"integrity": "sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"vue-client-only": {
|
"vue-client-only": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/vue-client-only/-/vue-client-only-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/vue-client-only/-/vue-client-only-2.0.0.tgz",
|
||||||
|
@ -16071,11 +16089,28 @@
|
||||||
"loader-utils": "^1.2.0"
|
"loader-utils": "^1.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"vuetify-toast-snackbar": {
|
||||||
|
"version": "0.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/vuetify-toast-snackbar/-/vuetify-toast-snackbar-0.6.1.tgz",
|
||||||
|
"integrity": "sha512-F2bLPMXiw7qQgX68adSu0zQrMTKODN5JAzCP8AP/HGhz/Bz1z24QbvYcX0fyHnG/yP6PAPkpMCXsLQSq6HV0Ag=="
|
||||||
|
},
|
||||||
"vuex": {
|
"vuex": {
|
||||||
"version": "3.6.0",
|
"version": "3.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.0.tgz",
|
||||||
"integrity": "sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ=="
|
"integrity": "sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ=="
|
||||||
},
|
},
|
||||||
|
"vuex-class": {
|
||||||
|
"version": "0.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/vuex-class/-/vuex-class-0.3.2.tgz",
|
||||||
|
"integrity": "sha512-m0w7/FMsNcwJgunJeM+wcNaHzK2KX1K1rw2WUQf7Q16ndXHo7pflRyOV/E8795JO/7fstyjH3EgqBI4h4n4qXQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"vuex-module-decorators": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/vuex-module-decorators/-/vuex-module-decorators-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-FLWZsXV5XAtl/bcKUyQFpnSBtpc3wK/7zSdy9oKbyp71mZd4ut5y2zSd219wWW9OG7WUOlVwac4rXFFDVnq7ug==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"w3c-hr-time": {
|
"w3c-hr-time": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
|
||||||
|
|
|
@ -16,7 +16,8 @@
|
||||||
"@nuxtjs/axios": "^5.12.2",
|
"@nuxtjs/axios": "^5.12.2",
|
||||||
"@nuxtjs/pwa": "^3.0.2",
|
"@nuxtjs/pwa": "^3.0.2",
|
||||||
"core-js": "^3.6.5",
|
"core-js": "^3.6.5",
|
||||||
"nuxt": "^2.14.6"
|
"nuxt": "^2.14.6",
|
||||||
|
"vuetify-toast-snackbar": "^0.6.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nuxt/types": "^2.14.6",
|
"@nuxt/types": "^2.14.6",
|
||||||
|
@ -36,8 +37,8 @@
|
||||||
"jest": "^26.5.0",
|
"jest": "^26.5.0",
|
||||||
"less": "^4.0.0",
|
"less": "^4.0.0",
|
||||||
"less-loader": "^7.1.0",
|
"less-loader": "^7.1.0",
|
||||||
|
"nuxt-property-decorator": "^2.9.1",
|
||||||
"ts-jest": "^26.4.1",
|
"ts-jest": "^26.4.1",
|
||||||
"vue-jest": "^3.0.4",
|
"vue-jest": "^3.0.4"
|
||||||
"vue-property-decorator": "^9.1.2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
79
pages/crypto/TokenGenerator.vue
Normal file
79
pages/crypto/TokenGenerator.vue
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
<template>
|
||||||
|
<ToolWrapper :config="config">
|
||||||
|
<v-row no-gutters>
|
||||||
|
<v-col lg="6" md="12">
|
||||||
|
<v-switch v-model="withLowercase" label="Lowercase (abc...)" />
|
||||||
|
<v-switch v-model="withUppercase" label="Uppercase (ABC...)" />
|
||||||
|
</v-col>
|
||||||
|
<v-col lg="6" md="12">
|
||||||
|
<v-switch v-model="withNumbers" label="Numbers (123...)" />
|
||||||
|
<v-switch v-model="withSpecials" label="Specials (#]-...)" />
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
|
<v-slider v-model="length" :label="`Length (${length})`" min="1" max="256" />
|
||||||
|
|
||||||
|
<v-textarea v-model="token" outlined />
|
||||||
|
|
||||||
|
<div class="text-center">
|
||||||
|
<v-btn depressed class="mr-4" @click="refreshToken()">
|
||||||
|
Refresh
|
||||||
|
</v-btn>
|
||||||
|
<!-- <v-btn @click="copyToken()" depressed>Copy token</v-btn>-->
|
||||||
|
</div>
|
||||||
|
</ToolWrapper>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import {Component} from 'nuxt-property-decorator'
|
||||||
|
import Tool, {ToolConfig} from '~/components/Tool.vue'
|
||||||
|
|
||||||
|
const shuffle = (s: string) => s.split('').sort(() => 0.5 - Math.random()).join('')
|
||||||
|
const lowercase = 'abcdefghijklmopqrstuvwxyz'
|
||||||
|
const uppercase = 'ABCDEFGHIJKLMOPQRSTUVWXYZ'
|
||||||
|
const numbers = '0123456789'
|
||||||
|
const specials = '.,;:!?./-"\'#{([-|\\@)]=}*+'
|
||||||
|
|
||||||
|
@Component
|
||||||
|
export default class TokenGenerator extends Tool {
|
||||||
|
config: ToolConfig = {
|
||||||
|
title: 'Token generator',
|
||||||
|
description: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus distinctio dolor dolorum eaque eligendi, facilis impedit laboriosam odit placeat.'
|
||||||
|
}
|
||||||
|
|
||||||
|
withNumbers = true;
|
||||||
|
withLowercase = true;
|
||||||
|
withUppercase = true;
|
||||||
|
withSpecials = false;
|
||||||
|
length = 64;
|
||||||
|
refreshBool = true;
|
||||||
|
|
||||||
|
refreshToken() {
|
||||||
|
this.refreshBool = !this.refreshBool
|
||||||
|
}
|
||||||
|
|
||||||
|
get token() {
|
||||||
|
if (this.refreshBool) { (() => {})() } // To force recomputation
|
||||||
|
|
||||||
|
let result = ''
|
||||||
|
if (this.withLowercase) {
|
||||||
|
result += lowercase
|
||||||
|
}
|
||||||
|
if (this.withUppercase) {
|
||||||
|
result += uppercase
|
||||||
|
}
|
||||||
|
if (this.withNumbers) {
|
||||||
|
result += numbers
|
||||||
|
}
|
||||||
|
if (this.withSpecials) {
|
||||||
|
result += specials
|
||||||
|
}
|
||||||
|
|
||||||
|
return shuffle(result.repeat(this.length)).substring(0, this.length)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
|
@ -1,78 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<v-row justify="center" align="center">
|
<v-row justify="center" align="center">
|
||||||
<v-col cols="12" sm="8" md="6">
|
<v-col cols="12" sm="12" md="8">
|
||||||
<div class="text-center"/>
|
<h1>Yolo</h1>
|
||||||
<v-card>
|
|
||||||
<v-card-title class="headline">
|
|
||||||
Welcome to the Vuetify + Nuxt.js template
|
|
||||||
</v-card-title>
|
|
||||||
<v-card-text>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Vuetify is a progressive Material Design component framework for
|
|
||||||
Vue.js. It was designed to empower developers to create amazing
|
|
||||||
applications.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
For more information on Vuetify, check out the
|
|
||||||
<a
|
|
||||||
href="https://vuetifyjs.com"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>
|
|
||||||
documentation </a>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
If you have questions, please join the official
|
|
||||||
<a
|
|
||||||
href="https://chat.vuetifyjs.com/"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
title="chat"
|
|
||||||
>
|
|
||||||
discord </a>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Find a bug? Report it on the github
|
|
||||||
<a
|
|
||||||
href="https://github.com/vuetifyjs/vuetify/issues"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
title="contribute"
|
|
||||||
>
|
|
||||||
issue board </a>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Thank you for developing with Vuetify and I look forward to bringing
|
|
||||||
more exciting features in the future.
|
|
||||||
</p>
|
|
||||||
<div class="text-xs-right">
|
|
||||||
<em><small>— John Leider</small></em>
|
|
||||||
</div>
|
|
||||||
<hr class="my-3">
|
|
||||||
<a
|
|
||||||
href="https://nuxtjs.org/"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>
|
|
||||||
Nuxt Documentation
|
|
||||||
</a>
|
|
||||||
<br>
|
|
||||||
<a
|
|
||||||
href="https://github.com/nuxt/nuxt.js"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>
|
|
||||||
Nuxt GitHub
|
|
||||||
</a>
|
|
||||||
</v-card-text>
|
|
||||||
<v-card-actions>
|
|
||||||
<v-spacer/>
|
|
||||||
<v-btn color="primary" nuxt to="/inspire">
|
|
||||||
Continue
|
|
||||||
</v-btn>
|
|
||||||
</v-card-actions>
|
|
||||||
</v-card>
|
|
||||||
</v-col>
|
</v-col>
|
||||||
</v-row>
|
</v-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
<template>
|
|
||||||
<v-row>
|
|
||||||
<v-col class="text-center">
|
|
||||||
<img src="/v.png" alt="Vuetify.js" class="mb-5">
|
|
||||||
<blockquote class="blockquote">
|
|
||||||
“First, solve the problem. Then, write the code.”
|
|
||||||
<footer>
|
|
||||||
<small>
|
|
||||||
<em>—John Johnson</em>
|
|
||||||
</small>
|
|
||||||
</footer>
|
|
||||||
</blockquote>
|
|
||||||
</v-col>
|
|
||||||
</v-row>
|
|
||||||
</template>
|
|
|
@ -1,11 +0,0 @@
|
||||||
# STATIC
|
|
||||||
|
|
||||||
**This directory is not required, you can delete it if you don't want to use it.**
|
|
||||||
|
|
||||||
This directory contains your static files.
|
|
||||||
Each file inside this directory is mapped to `/`.
|
|
||||||
Thus you'd want to delete this README.md before deploying to production.
|
|
||||||
|
|
||||||
Example: `/static/robots.txt` is mapped as `/robots.txt`.
|
|
||||||
|
|
||||||
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#static).
|
|
4
static/humans.txt
Normal file
4
static/humans.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/* TEAM */
|
||||||
|
Developer: Corentin Thomasset
|
||||||
|
Site: https://github.com/CorentinTh
|
||||||
|
Twitter: @cthmsst
|
2
static/robots.txt
Normal file
2
static/robots.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
User-agent: *
|
||||||
|
Disallow:
|
Loading…
Add table
Add a link
Reference in a new issue