mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-05-08 07:11:03 -04:00
Merge branch 'main' into main
This commit is contained in:
commit
dfc4d2ea28
16 changed files with 126 additions and 73 deletions
10
.github/workflows/docker-nightly-release.yml
vendored
10
.github/workflows/docker-nightly-release.yml
vendored
|
@ -57,26 +57,26 @@ jobs:
|
||||||
uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
|
uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v2
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@v4
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: ./Dockerfile
|
file: ./Dockerfile
|
||||||
|
|
10
.github/workflows/releases.yml
vendored
10
.github/workflows/releases.yml
vendored
|
@ -16,26 +16,26 @@ jobs:
|
||||||
uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
|
uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v2
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@v4
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: ./Dockerfile
|
file: ./Dockerfile
|
||||||
|
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
||||||
18.18.0
|
18.18.2
|
||||||
|
|
|
@ -1,4 +1,51 @@
|
||||||
home:
|
home:
|
||||||
categories:
|
categories:
|
||||||
newestTools: Newest tools
|
newestTools: Newest tools
|
||||||
|
favoriteTools: 'Your favorite tools'
|
||||||
|
allTools: 'All the tools'
|
||||||
|
subtitle: 'Handy tools for developers'
|
||||||
|
toggleMenu: 'Toggle menu'
|
||||||
|
home: Home
|
||||||
|
uiLib: 'UI Lib'
|
||||||
|
buyMeACoffee: 'Buy me a coffee'
|
||||||
|
follow:
|
||||||
|
title: 'You like it-tools?'
|
||||||
|
p1: 'Give us a star on'
|
||||||
|
githubRepository: 'IT-Tools GitHub repository'
|
||||||
|
p2: 'or follow us on'
|
||||||
|
twitterAccount: 'IT-Tools Twitter account'
|
||||||
|
thankYou: 'Thank you !'
|
||||||
|
nav:
|
||||||
|
github: 'GitHub repository'
|
||||||
|
githubRepository: 'IT-Tools GitHub repository'
|
||||||
|
twitter: 'Twitter account'
|
||||||
|
twitterAccount: 'IT Tools Twitter account'
|
||||||
|
about: 'About IT-Tools'
|
||||||
|
aboutLabel: 'About'
|
||||||
|
darkMode: 'Dark mode'
|
||||||
|
lightMode: 'Light mode'
|
||||||
|
mode: 'Toggle dark/light mode'
|
||||||
|
about:
|
||||||
|
h1: 'About IT-Tools'
|
||||||
|
h1p1: 'This wonderful website, made with ❤ by'
|
||||||
|
h1p2: ', aggregates useful tools for developer and people working in IT. If you find it useful, please feel free to share it to people you think may find it useful too and don''''t forget to bookmark it in your shortcut bar!'
|
||||||
|
h1p3: 'IT Tools is open-source (under the MIT license) and free, and will always be, but it costs me money to host and renew the domain name. If you want to support my work, and encourage me to add more tools, please consider supporting by'
|
||||||
|
h1p4: 'sponsoring me'
|
||||||
|
h2: Technologies
|
||||||
|
h2p1: 'IT Tools is made in Vue.js (Vue 3) with the the Naive UI component library and is hosted and continuously deployed by Vercel. Third-party open-source libraries are used in some tools, you may find the complete list in the'
|
||||||
|
h2p2: 'file of the repository.'
|
||||||
|
h3: 'Found a bug? A tool is missing?'
|
||||||
|
h3p1: 'If you need a tool that is currently not present here, and you think can be useful, you are welcome to submit a feature request in the'
|
||||||
|
h3p2: 'issues section'
|
||||||
|
h3p3: 'in the GitHub repository.'
|
||||||
|
h3p4: 'And if you found a bug, or something doesn''''t work as expected, please file a bug report in the'
|
||||||
|
h3p5: 'issues section'
|
||||||
|
h3p6: 'in the GitHub repository.'
|
||||||
|
404:
|
||||||
|
notFound: '404 Not Found'
|
||||||
|
sorry: 'Sorry, this page does not seem to exist'
|
||||||
|
maybe: 'Maybe the cache is doing tricky things, try force-refreshing?'
|
||||||
|
backHome: 'Back home'
|
||||||
|
toolCard:
|
||||||
|
new: New
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@it-tools/bip39": "^0.0.4",
|
"@it-tools/bip39": "^0.0.4",
|
||||||
"@it-tools/oggen": "^1.3.0",
|
"@it-tools/oggen": "^1.3.0",
|
||||||
"@sindresorhus/slugify": "^2.2.0",
|
"@sindresorhus/slugify": "^2.2.1",
|
||||||
"@tiptap/pm": "^2.1.6",
|
"@tiptap/pm": "^2.1.6",
|
||||||
"@tiptap/starter-kit": "^2.1.6",
|
"@tiptap/starter-kit": "^2.1.6",
|
||||||
"@tiptap/vue-3": "^2.0.3",
|
"@tiptap/vue-3": "^2.0.3",
|
||||||
|
|
8
pnpm-lock.yaml
generated
8
pnpm-lock.yaml
generated
|
@ -12,8 +12,8 @@ dependencies:
|
||||||
specifier: ^1.3.0
|
specifier: ^1.3.0
|
||||||
version: 1.3.0
|
version: 1.3.0
|
||||||
'@sindresorhus/slugify':
|
'@sindresorhus/slugify':
|
||||||
specifier: ^2.2.0
|
specifier: ^2.2.1
|
||||||
version: 2.2.0
|
version: 2.2.1
|
||||||
'@tiptap/pm':
|
'@tiptap/pm':
|
||||||
specifier: ^2.1.6
|
specifier: ^2.1.6
|
||||||
version: 2.1.6
|
version: 2.1.6
|
||||||
|
@ -2523,8 +2523,8 @@ packages:
|
||||||
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
|
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@sindresorhus/slugify@2.2.0:
|
/@sindresorhus/slugify@2.2.1:
|
||||||
resolution: {integrity: sha512-9Vybc/qX8Kj6pxJaapjkFbiUJPk7MAkCh/GFCxIBnnsuYCFPIXKvnLidG8xlepht3i24L5XemUmGtrJ3UWrl6w==}
|
resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@sindresorhus/transliterate': 1.6.0
|
'@sindresorhus/transliterate': 1.6.0
|
||||||
|
|
|
@ -7,39 +7,39 @@ const { isDarkTheme } = toRefs(styleStore);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<c-tooltip tooltip="Github repository" position="bottom">
|
<c-tooltip :tooltip="$t('home.nav.github')" position="bottom">
|
||||||
<c-button
|
<c-button
|
||||||
circle
|
circle
|
||||||
variant="text"
|
variant="text"
|
||||||
href="https://github.com/CorentinTh/it-tools"
|
href="https://github.com/CorentinTh/it-tools"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label="IT-Tools' GitHub repository"
|
:aria-label="$t('home.nav.githubRepository')"
|
||||||
>
|
>
|
||||||
<n-icon size="25" :component="BrandGithub" />
|
<n-icon size="25" :component="BrandGithub" />
|
||||||
</c-button>
|
</c-button>
|
||||||
</c-tooltip>
|
</c-tooltip>
|
||||||
|
|
||||||
<c-tooltip tooltip="Twitter account" position="bottom">
|
<c-tooltip :tooltip="$t('home.nav.twitter')" position="bottom">
|
||||||
<c-button
|
<c-button
|
||||||
circle
|
circle
|
||||||
variant="text"
|
variant="text"
|
||||||
href="https://twitter.com/ittoolsdottech"
|
href="https://twitter.com/ittoolsdottech"
|
||||||
rel="noopener"
|
rel="noopener"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
aria-label="IT Tools' Twitter account"
|
:aria-label="$t('home.nav.twitterAccount')"
|
||||||
>
|
>
|
||||||
<n-icon size="25" :component="BrandTwitter" />
|
<n-icon size="25" :component="BrandTwitter" />
|
||||||
</c-button>
|
</c-button>
|
||||||
</c-tooltip>
|
</c-tooltip>
|
||||||
|
|
||||||
<c-tooltip tooltip="About IT-Tools" position="bottom">
|
<c-tooltip :tooltip="$t('home.nav.about')" position="bottom">
|
||||||
<c-button circle variant="text" to="/about" aria-label="About">
|
<c-button circle variant="text" to="/about" :aria-label="$t('home.nav.aboutLabel')">
|
||||||
<n-icon size="25" :component="InfoCircle" />
|
<n-icon size="25" :component="InfoCircle" />
|
||||||
</c-button>
|
</c-button>
|
||||||
</c-tooltip>
|
</c-tooltip>
|
||||||
<c-tooltip :tooltip="isDarkTheme ? 'Light mode' : 'Dark mode'" position="bottom">
|
<c-tooltip :tooltip="isDarkTheme ? $t('home.nav.lightMode') : $t('home.nav.darkMode')" position="bottom">
|
||||||
<c-button circle variant="text" aria-label="Toggle dark/light mode" @click="() => styleStore.toggleDark()">
|
<c-button circle variant="text" :aria-label="$t('home.nav.mode')" @click="() => styleStore.toggleDark()">
|
||||||
<n-icon v-if="isDarkTheme" size="25" :component="Sun" />
|
<n-icon v-if="isDarkTheme" size="25" :component="Sun" />
|
||||||
<n-icon v-else size="25" :component="Moon" />
|
<n-icon v-else size="25" :component="Moon" />
|
||||||
</c-button>
|
</c-button>
|
||||||
|
|
|
@ -26,7 +26,7 @@ const appTheme = useAppTheme();
|
||||||
:bordered="false"
|
:bordered="false"
|
||||||
:color="{ color: theme.primaryColor, textColor: theme.tagColor }"
|
:color="{ color: theme.primaryColor, textColor: theme.tagColor }"
|
||||||
>
|
>
|
||||||
New
|
{{ $t('toolCard.new') }}
|
||||||
</n-tag>
|
</n-tag>
|
||||||
|
|
||||||
<FavoriteButton :tool="tool" />
|
<FavoriteButton :tool="tool" />
|
||||||
|
|
|
@ -41,7 +41,7 @@ const tools = computed<ToolCategory[]>(() => [
|
||||||
</div>
|
</div>
|
||||||
<div class="divider" />
|
<div class="divider" />
|
||||||
<div class="subtitle">
|
<div class="subtitle">
|
||||||
Handy tools for developers
|
{{ $t('home.subtitle') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
|
@ -88,20 +88,20 @@ const tools = computed<ToolCategory[]>(() => [
|
||||||
<c-button
|
<c-button
|
||||||
circle
|
circle
|
||||||
variant="text"
|
variant="text"
|
||||||
aria-label="Toggle menu"
|
:aria-label="$t('home.toggleMenu')"
|
||||||
@click="styleStore.isMenuCollapsed = !styleStore.isMenuCollapsed"
|
@click="styleStore.isMenuCollapsed = !styleStore.isMenuCollapsed"
|
||||||
>
|
>
|
||||||
<NIcon size="25" :component="Menu2" />
|
<NIcon size="25" :component="Menu2" />
|
||||||
</c-button>
|
</c-button>
|
||||||
|
|
||||||
<c-tooltip tooltip="Home" position="bottom">
|
<c-tooltip tooltip="Home" position="bottom">
|
||||||
<c-button to="/" circle variant="text" aria-label="Home">
|
<c-button to="/" circle variant="text" :aria-label="$t('home.home')">
|
||||||
<NIcon size="25" :component="Home2" />
|
<NIcon size="25" :component="Home2" />
|
||||||
</c-button>
|
</c-button>
|
||||||
</c-tooltip>
|
</c-tooltip>
|
||||||
|
|
||||||
<c-tooltip tooltip="UI Lib" position="bottom">
|
<c-tooltip tooltip="UI Lib" position="bottom">
|
||||||
<c-button v-if="config.app.env === 'development'" to="/c-lib" circle variant="text" aria-label="UI Lib">
|
<c-button v-if="config.app.env === 'development'" to="/c-lib" circle variant="text" :aria-label="$t('home.uiLib')">
|
||||||
<icon-mdi:brush-variant text-20px />
|
<icon-mdi:brush-variant text-20px />
|
||||||
</c-button>
|
</c-button>
|
||||||
</c-tooltip>
|
</c-tooltip>
|
||||||
|
@ -122,7 +122,7 @@ const tools = computed<ToolCategory[]>(() => [
|
||||||
:bordered="false"
|
:bordered="false"
|
||||||
@click="() => tracker.trackEvent({ eventName: 'Support button clicked' })"
|
@click="() => tracker.trackEvent({ eventName: 'Support button clicked' })"
|
||||||
>
|
>
|
||||||
Buy me a coffee
|
{{ $t('home.buyMeACoffee') }}
|
||||||
<NIcon v-if="!styleStore.isSmallScreen" :component="Heart" ml-2 />
|
<NIcon v-if="!styleStore.isSmallScreen" :component="Heart" ml-2 />
|
||||||
</c-button>
|
</c-button>
|
||||||
</c-tooltip>
|
</c-tooltip>
|
||||||
|
|
|
@ -11,17 +11,17 @@ useHead({ title: 'Page not found - IT Tools' });
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<h1 m-0 mt-3>
|
<h1 m-0 mt-3>
|
||||||
404 Not Found
|
{{ $t('404.notFound') }}
|
||||||
</h1>
|
</h1>
|
||||||
<div mt-4 op-60>
|
<div mt-4 op-60>
|
||||||
Sorry, this page does not seem to exist
|
{{ $t('404.sorry') }}
|
||||||
</div>
|
</div>
|
||||||
<div mb-8 op-60>
|
<div mb-8 op-60>
|
||||||
Maybe the cache is doing tricky things, try force-refreshing?
|
{{ $t('404.maybe') }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<c-button to="/">
|
<c-button to="/">
|
||||||
Back home
|
{{ $t('404.backHome') }}
|
||||||
</c-button>
|
</c-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -8,62 +8,56 @@ const { tracker } = useTracker();
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div mx-auto mt-50px max-w-600px>
|
<div mx-auto mt-50px max-w-600px>
|
||||||
<h1>About IT-Tools</h1>
|
<h1>{{ $t('about.h1') }}</h1>
|
||||||
<p text-justify>
|
<p text-justify>
|
||||||
This wonderful website, made with ❤ by
|
{{ $t('about.h1p1') }}
|
||||||
<c-link href="https://github.com/CorentinTh" target="_blank" rel="noopener">
|
<c-link href="https://github.com/CorentinTh" target="_blank" rel="noopener">
|
||||||
Corentin Thomasset
|
Corentin Thomasset
|
||||||
</c-link>,
|
</c-link>{{ $t('about.h1p2') }}
|
||||||
aggregates useful tools for developer and people working in IT. If you find it useful, please feel free to share
|
|
||||||
it to people you think may find it useful too and don't forget to bookmark it in your shortcut bar!
|
|
||||||
</p>
|
</p>
|
||||||
<p text-justify>
|
<p text-justify>
|
||||||
IT Tools is open-source (under the MIT license) and free, and will always be, but it costs me money to host and
|
{{ $t('about.h1p3') }}
|
||||||
renew the domain name. If you want to support my work, and encourage me to add more tools, please consider
|
|
||||||
supporting by
|
|
||||||
<c-link
|
<c-link
|
||||||
href="https://www.buymeacoffee.com/cthmsst"
|
href="https://www.buymeacoffee.com/cthmsst"
|
||||||
rel="noopener"
|
rel="noopener"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
@click="() => tracker.trackEvent({ eventName: 'Support button clicked' })"
|
@click="() => tracker.trackEvent({ eventName: 'Support button clicked' })"
|
||||||
>
|
>
|
||||||
sponsoring me
|
{{ $t('about.h1p4') }}
|
||||||
</c-link>.
|
</c-link>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>Technologies</h2>
|
<h2>{{ $t('about.h2') }}</h2>
|
||||||
<p text-justify>
|
<p text-justify>
|
||||||
IT Tools is made in Vue.js (Vue 3) with the the Naive UI component library and is hosted and continuously deployed
|
{{ $t('about.h2p1') }}
|
||||||
by Vercel. Third-party open-source libraries are used in some tools, you may find the complete list in the
|
|
||||||
<c-link href="https://github.com/CorentinTh/it-tools/blob/main/package.json" rel="noopener" target="_blank">
|
<c-link href="https://github.com/CorentinTh/it-tools/blob/main/package.json" rel="noopener" target="_blank">
|
||||||
package.json
|
package.json
|
||||||
</c-link>
|
</c-link>
|
||||||
file of the repository.
|
{{ $t('about.h2p2') }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>Found a bug? A tool is missing?</h2>
|
<h2>{{ $t('about.h3') }}</h2>
|
||||||
<p text-justify>
|
<p text-justify>
|
||||||
If you need a tool that is currently not present here, and you think can be useful, you are welcome to submit a
|
{{ $t('about.h3p1') }}
|
||||||
feature request in the
|
|
||||||
<c-link
|
<c-link
|
||||||
href="https://github.com/CorentinTh/it-tools/issues/new/choose"
|
href="https://github.com/CorentinTh/it-tools/issues/new/choose"
|
||||||
rel="noopener"
|
rel="noopener"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
issues section
|
{{ $t('about.h3p2') }}
|
||||||
</c-link>
|
</c-link>
|
||||||
in the GitHub repository.
|
{{ $t('about.h3p3') }}
|
||||||
</p>
|
</p>
|
||||||
<p text-justify>
|
<p text-justify>
|
||||||
And if you found a bug, or something doesn't work as expected, please file a bug report in the
|
{{ $t('about.h3p4') }}
|
||||||
<c-link
|
<c-link
|
||||||
href="https://github.com/CorentinTh/it-tools/issues/new/choose"
|
href="https://github.com/CorentinTh/it-tools/issues/new/choose"
|
||||||
rel="noopener"
|
rel="noopener"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
issues section
|
{{ $t('about.h3p5') }}
|
||||||
</c-link>
|
</c-link>
|
||||||
in the GitHub repository.
|
{{ $t('about.h3p6') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -17,21 +17,21 @@ const { t } = useI18n();
|
||||||
<div class="grid-wrapper">
|
<div class="grid-wrapper">
|
||||||
<n-grid v-if="config.showBanner" x-gap="12" y-gap="12" cols="1 400:2 800:3 1200:4 2000:8">
|
<n-grid v-if="config.showBanner" x-gap="12" y-gap="12" cols="1 400:2 800:3 1200:4 2000:8">
|
||||||
<n-gi>
|
<n-gi>
|
||||||
<ColoredCard title="You like it-tools?" :icon="Heart">
|
<ColoredCard :title="$t('home.follow.title')" :icon="Heart">
|
||||||
Give us a star on
|
{{ $t('home.follow.p1') }}
|
||||||
<a
|
<a
|
||||||
href="https://github.com/CorentinTh/it-tools"
|
href="https://github.com/CorentinTh/it-tools"
|
||||||
rel="noopener"
|
rel="noopener"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
aria-label="IT-Tools' GitHub repository"
|
:aria-label="$t('home.follow.githubRepository')"
|
||||||
>GitHub</a>
|
>GitHub</a>
|
||||||
or follow us on
|
{{ $t('home.follow.p2') }}
|
||||||
<a
|
<a
|
||||||
href="https://twitter.com/ittoolsdottech"
|
href="https://twitter.com/ittoolsdottech"
|
||||||
rel="noopener"
|
rel="noopener"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
aria-label="IT-Tools' Twitter account"
|
:aria-label="$t('home.follow.twitterAccount')"
|
||||||
>Twitter</a>! Thank you
|
>Twitter</a>{{ $t('home.follow.thankYou') }}
|
||||||
<n-icon :component="Heart" />
|
<n-icon :component="Heart" />
|
||||||
</ColoredCard>
|
</ColoredCard>
|
||||||
</n-gi>
|
</n-gi>
|
||||||
|
@ -39,7 +39,7 @@ const { t } = useI18n();
|
||||||
|
|
||||||
<transition name="height">
|
<transition name="height">
|
||||||
<div v-if="toolStore.favoriteTools.length > 0">
|
<div v-if="toolStore.favoriteTools.length > 0">
|
||||||
<n-h3>Your favorite tools</n-h3>
|
<n-h3>{{ $t('home.categories.favoriteTools') }}</n-h3>
|
||||||
<n-grid x-gap="12" y-gap="12" cols="1 400:2 800:3 1200:4 2000:8">
|
<n-grid x-gap="12" y-gap="12" cols="1 400:2 800:3 1200:4 2000:8">
|
||||||
<n-gi v-for="tool in toolStore.favoriteTools" :key="tool.name">
|
<n-gi v-for="tool in toolStore.favoriteTools" :key="tool.name">
|
||||||
<ToolCard :tool="tool" />
|
<ToolCard :tool="tool" />
|
||||||
|
@ -57,7 +57,7 @@ const { t } = useI18n();
|
||||||
</n-grid>
|
</n-grid>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<n-h3>All the tools</n-h3>
|
<n-h3>{{ $t('home.categories.allTools') }}</n-h3>
|
||||||
<n-grid x-gap="12" y-gap="12" cols="1 400:2 800:3 1200:4 2000:8">
|
<n-grid x-gap="12" y-gap="12" cols="1 400:2 800:3 1200:4 2000:8">
|
||||||
<n-gi v-for="tool in toolStore.tools" :key="tool.name">
|
<n-gi v-for="tool in toolStore.tools" :key="tool.name">
|
||||||
<transition>
|
<transition>
|
||||||
|
|
|
@ -29,3 +29,9 @@ export const i18nPlugin: Plugin = {
|
||||||
app.use(i18n);
|
app.use(i18n);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const translate = function (localeKey: string) {
|
||||||
|
// @ts-expect-error global
|
||||||
|
const hasKey = i18n.global.te(localeKey, i18n.global.locale);
|
||||||
|
return hasKey ? i18n.global.t(localeKey) : localeKey;
|
||||||
|
};
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import { ArrowsShuffle } from '@vicons/tabler';
|
import { ArrowsShuffle } from '@vicons/tabler';
|
||||||
import { defineTool } from '../tool';
|
import { defineTool } from '../tool';
|
||||||
|
import { translate } from '@/plugins/i18n.plugin';
|
||||||
|
|
||||||
export const tool = defineTool({
|
export const tool = defineTool({
|
||||||
name: 'Token generator',
|
name: translate('tools.token-generator.title'),
|
||||||
path: '/token-generator',
|
path: '/token-generator',
|
||||||
description:
|
description: translate('tools.token-generator.description'),
|
||||||
'Generate random string with the chars you want: uppercase or lowercase letters, numbers and/or symbols.',
|
|
||||||
keywords: ['token', 'random', 'string', 'alphanumeric', 'symbols', 'number', 'letters', 'lowercase', 'uppercase'],
|
keywords: ['token', 'random', 'string', 'alphanumeric', 'symbols', 'number', 'letters', 'lowercase', 'uppercase'],
|
||||||
component: () => import('./token-generator.tool.vue'),
|
component: () => import('./token-generator.tool.vue'),
|
||||||
icon: ArrowsShuffle,
|
icon: ArrowsShuffle,
|
||||||
|
|
|
@ -7,3 +7,9 @@ tools:
|
||||||
lowercase: Lowercase (abc...)
|
lowercase: Lowercase (abc...)
|
||||||
numbers: Numbers (123...)
|
numbers: Numbers (123...)
|
||||||
symbols: Symbols (!-;...)
|
symbols: Symbols (!-;...)
|
||||||
|
length: Length
|
||||||
|
tokenPlaceholder: 'The token...'
|
||||||
|
copied: Token copied to the clipboard
|
||||||
|
button:
|
||||||
|
copy: Copy
|
||||||
|
refresh: Refresh
|
|
@ -21,7 +21,7 @@ const [token, refreshToken] = computedRefreshable(() =>
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
const { copy } = useCopy({ source: token, text: 'Token copied to the clipboard' });
|
const { copy } = useCopy({ source: token, text: t('tools.token-generator.copied') });
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -51,14 +51,14 @@ const { copy } = useCopy({ source: token, text: 'Token copied to the clipboard'
|
||||||
</div>
|
</div>
|
||||||
</n-form>
|
</n-form>
|
||||||
|
|
||||||
<n-form-item :label="`Length (${length})`" label-placement="left">
|
<n-form-item :label="`${t('tools.token-generator.length')} (${length})`" label-placement="left">
|
||||||
<n-slider v-model:value="length" :step="1" :min="1" :max="512" />
|
<n-slider v-model:value="length" :step="1" :min="1" :max="512" />
|
||||||
</n-form-item>
|
</n-form-item>
|
||||||
|
|
||||||
<c-input-text
|
<c-input-text
|
||||||
v-model:value="token"
|
v-model:value="token"
|
||||||
multiline
|
multiline
|
||||||
placeholder="The token..."
|
:placeholder="t('tools.token-generator.tokenPlaceholder')"
|
||||||
readonly
|
readonly
|
||||||
rows="3"
|
rows="3"
|
||||||
autosize
|
autosize
|
||||||
|
@ -67,10 +67,10 @@ const { copy } = useCopy({ source: token, text: 'Token copied to the clipboard'
|
||||||
|
|
||||||
<div mt-5 flex justify-center gap-3>
|
<div mt-5 flex justify-center gap-3>
|
||||||
<c-button @click="copy()">
|
<c-button @click="copy()">
|
||||||
Copy
|
{{ t('tools.token-generator.button.copy') }}
|
||||||
</c-button>
|
</c-button>
|
||||||
<c-button @click="refreshToken">
|
<c-button @click="refreshToken">
|
||||||
Refresh
|
{{ t('tools.token-generator.button.refresh') }}
|
||||||
</c-button>
|
</c-button>
|
||||||
</div>
|
</div>
|
||||||
</c-card>
|
</c-card>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue