aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--locales/en.yml3
-rw-r--r--src/components/ToolCard.vue65
-rw-r--r--src/pages/Home.page.vue104
3 files changed, 74 insertions, 98 deletions
diff --git a/locales/en.yml b/locales/en.yml
index 385e019..3bd750b 100644
--- a/locales/en.yml
+++ b/locales/en.yml
@@ -1,4 +1,5 @@
home:
categories:
newestTools: Newest tools
-
+ allTheTools: All the tools
+ yourFavoriteTools: Your favorite tools
diff --git a/src/components/ToolCard.vue b/src/components/ToolCard.vue
index 00f2246..5442ba5 100644
--- a/src/components/ToolCard.vue
+++ b/src/components/ToolCard.vue
@@ -1,19 +1,16 @@
<script setup lang="ts">
import { useThemeVars } from 'naive-ui';
import FavoriteButton from './FavoriteButton.vue';
-import { useAppTheme } from '@/ui/theme/themes';
import type { Tool } from '@/tools/tools.types';
const props = defineProps<{ tool: Tool & { category: string } }>();
const { tool } = toRefs(props);
const theme = useThemeVars();
-
-const appTheme = useAppTheme();
</script>
<template>
<router-link :to="tool.path">
- <c-card class="tool-card">
+ <c-card class="tool-card" shadow>
<div flex items-center justify-between>
<n-icon class="icon" size="40" :component="tool.icon" />
<div flex items-center gap-8px>
@@ -32,15 +29,14 @@ const appTheme = useAppTheme();
<FavoriteButton :tool="tool" />
</div>
</div>
- <n-h3 class="title">
- <n-ellipsis>{{ tool.name }}</n-ellipsis>
+ <n-h3 class="title" truncate>
+ {{ tool.name }}
</n-h3>
<div class="description">
- <n-ellipsis :line-clamp="2" :tooltip="false" style="min-height: 44.78px">
+ <div line-clamp-2 style="min-height: 44.78px">
{{ tool.description }}
- <br>&nbsp;
- </n-ellipsis>
+ </div>
</div>
</c-card>
</router-link>
@@ -52,16 +48,14 @@ a {
}
.tool-card {
- transition: border-color ease 0.5s;
border-width: 2px !important;
color: transparent;
-
- &:hover {
- border-color: v-bind('appTheme.primary.colorHover');
- }
+ position: relative;
+ border-radius: 15px;
+ border: none;
.icon {
- opacity: 0.6;
+ opacity: 0.4;
color: v-bind('theme.textColorBase');
}
@@ -74,5 +68,46 @@ a {
color: v-bind('theme.textColorBase');
margin: 5px 0;
}
+
+ &::after {
+ --mask-radius: 20em;
+
+ border-radius: 15px;
+ content: '';
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ user-select: none;
+ display: block;
+ height: calc(100% - 4px) ;
+ width: calc(100% - 4px) ;
+ background: #18a05818;
+ top: 0;
+ left: 0;
+ opacity: 1;
+ border: 2px solid transparent;
+ transition: all 0.2s ease-in-out;
+
+ -webkit-mask: radial-gradient(
+ var(--mask-radius) var(--mask-radius) at 45px 45px,
+ #000 1%,
+ transparent 50%
+ );
+
+ mask: radial-gradient(
+ var(--mask-radius) var(--mask-radius) at 45px 45px,
+ #000 1%,
+ transparent 50%
+ );
+
+ will-change: mask;
+ }
+
+ &:hover {
+ &::after {
+ --mask-radius: 50em;
+ border: 2px solid #18a058;
+ }
+ }
}
</style>
diff --git a/src/pages/Home.page.vue b/src/pages/Home.page.vue
index 5c7c3c4..dd2c687 100644
--- a/src/pages/Home.page.vue
+++ b/src/pages/Home.page.vue
@@ -1,99 +1,39 @@
<script setup lang="ts">
-import { Heart } from '@vicons/tabler';
import { useHead } from '@vueuse/head';
-import ColoredCard from '../components/ColoredCard.vue';
-import ToolCard from '../components/ToolCard.vue';
import { useToolStore } from '@/tools/tools.store';
-import { config } from '@/config';
const toolStore = useToolStore();
useHead({ title: 'IT Tools - Handy online tools for developers' });
-const { t } = useI18n();
</script>
<template>
- <div class="home-page">
- <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-gi>
- <ColoredCard title="You like it-tools?" :icon="Heart">
- Give us a star on
- <a
- href="https://github.com/CorentinTh/it-tools"
- rel="noopener"
- target="_blank"
- aria-label="IT-Tools' GitHub repository"
- >GitHub</a>
- or follow us on
- <a
- href="https://twitter.com/ittoolsdottech"
- rel="noopener"
- target="_blank"
- aria-label="IT-Tools' Twitter account"
- >Twitter</a>! Thank you
- <n-icon :component="Heart" />
- </ColoredCard>
- </n-gi>
- </n-grid>
+ <div class="home-page" m-auto mt-50px max-w-1800px>
+ <div my-8 />
- <transition name="height">
- <div v-if="toolStore.favoriteTools.length > 0">
- <n-h3>Your favorite tools</n-h3>
- <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">
- <ToolCard :tool="tool" />
- </n-gi>
- </n-grid>
- </div>
- </transition>
+ <div v-if="toolStore.favoriteTools.length > 0">
+ <div mb-2 mt-6 text-lg font-semibold>
+ {{ $t('home.categories.yourFavoriteTools') }}
+ </div>
+ <div grid-cols="1 sm:2 md:2 lg:3 xl:4" grid gap-12px>
+ <tool-card v-for="tool in toolStore.favoriteTools" :key="tool.name" :tool="tool" />
+ </div>
+ </div>
- <div v-if="toolStore.newTools.length > 0">
- <n-h3>{{ t('home.categories.newestTools') }}</n-h3>
- <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.newTools" :key="tool.name">
- <ToolCard :tool="tool" />
- </n-gi>
- </n-grid>
+ <div v-if="toolStore.newTools.length > 0">
+ <div mb-2 mt-6 text-lg font-semibold>
+ {{ $t('home.categories.newestTools') }}
</div>
+ <div grid-cols="1 sm:2 md:2 lg:3 xl:4" grid gap-12px>
+ <tool-card v-for="tool in toolStore.newTools" :key="tool.name" :tool="tool" />
+ </div>
+ </div>
- <n-h3>All the tools</n-h3>
- <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">
- <transition>
- <ToolCard :tool="tool" />
- </transition>
- </n-gi>
- </n-grid>
+ <div mb-2 mt-6 text-lg font-semibold>
+ {{ $t('home.categories.allTheTools') }}
+ </div>
+ <div grid-cols="1 sm:2 md:2 lg:3 xl:4" grid gap-12px>
+ <tool-card v-for="tool in toolStore.tools" :key="tool.name" :tool="tool" />
</div>
</div>
</template>
-
-<style scoped lang="less">
-.home-page {
- padding-top: 50px;
-}
-
-.n-h3 {
- margin-bottom: 10px;
-}
-
-::v-deep(.n-grid) {
- margin-bottom: 30px;
-}
-
-.height-enter-active,
-.height-leave-active {
- transition: all 0.5s ease-in-out;
- overflow: hidden;
- max-height: 500px;
-}
-
-.height-enter-from,
-.height-leave-to {
- max-height: 42px;
- overflow: hidden;
- opacity: 0;
- margin-bottom: 0;
-}
-</style>