update webstack
This commit is contained in:
4
src/components/README.md
Normal file
4
src/components/README.md
Normal file
@@ -0,0 +1,4 @@
|
||||
Add components that will be imported to Pages and Layouts to this folder.
|
||||
Learn more about components here: https://gridsome.org/docs/components/
|
||||
|
||||
You can delete this file.
|
||||
@@ -0,0 +1,46 @@
|
||||
<template>
|
||||
<div>
|
||||
<nav class="inline-block w-1/4 border-r-2 border-gray-200">
|
||||
<a
|
||||
v-for="(slide, index) in slides"
|
||||
:key="index"
|
||||
:href="`#${index}`"
|
||||
class="mt-1 capitalize group flex items-center px-3 py-2 text-sm leading-5 font-medium hover:text-gray-900 hover:bg-gray-400 focus:outline-none transition ease-in-out duration-150"
|
||||
:class="{
|
||||
'border-r-3 border-blue-500 hover:bg-gray-100':
|
||||
activeIndex === index,
|
||||
}"
|
||||
@click="setActive(index)"
|
||||
>
|
||||
<span class="truncate"> {{ slide.title }} </span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
<div
|
||||
class="content inline-block h-full w-3/4 align-top p-5 transition ease-in-out duration-150"
|
||||
>
|
||||
<div :id="slides[activeIndex]" class="hidden" style="display: block">
|
||||
<p>
|
||||
{{ slides[activeIndex].content }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["slides"],
|
||||
data() {
|
||||
return {
|
||||
activeIndex: 0,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
setActive(index) {
|
||||
this.activeIndex = index;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
17
src/components/blog/BlogComponentBig.vue
Normal file
17
src/components/blog/BlogComponentBig.vue
Normal file
@@ -0,0 +1,17 @@
|
||||
<template>
|
||||
<div class="col-span-2 duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-105 ">
|
||||
<a :href="url" class=" hover:text-threefold-green">
|
||||
<div class="h-full p-6 bg-white rounded border-t-4 border-green-500 shadow">
|
||||
<img :src="imgUrl" :lt="imgAlt" class="w-full md:max-w-xl mx-auto">
|
||||
<h3 class="text-2xl mb-3 font-semibold">{{ title}}</h3>
|
||||
<p class="text-gray-900">{{ description}}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["imgUrl", "imgAlt", "title", "description", "url"],
|
||||
};
|
||||
</script>
|
||||
16
src/components/blog/BlogComponentSmall.vue
Normal file
16
src/components/blog/BlogComponentSmall.vue
Normal file
@@ -0,0 +1,16 @@
|
||||
<template>
|
||||
<a :href="url" class=" hover:text-threefold-green">
|
||||
<div class="w-full px-6 mb-8 duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-105">
|
||||
<div class="h-full md:p-6 bg-white rounded border-t-2 border-b-2 border-green-500 ">
|
||||
<h3 class="text-2xl mb-3 font-semibold">{{ title }}</h3>
|
||||
<p class="text-gray-900">{{ description }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["title", "description", "url"],
|
||||
};
|
||||
</script>
|
||||
45
src/components/blog/BlogOverview.vue
Normal file
45
src/components/blog/BlogOverview.vue
Normal file
@@ -0,0 +1,45 @@
|
||||
<template>
|
||||
<section class="md:py-16 px-4 md:mx-24 mx-12 w-full container">
|
||||
<div class="text-center">
|
||||
<span class="text-green-600 font-semibold">BLOG</span>
|
||||
<h2 class="text-3xl text-center mt-2 mb-12 font-semibold font-heading">Check our latest blog posts</h2>
|
||||
</div>
|
||||
<div v-for="(blog, index) in blogs" :key="blog.id" class="md:grid md:grid-cols-4 grid-cols-1 md:grid-rows-1 md:gap-8 gap-4">
|
||||
<div v-if="index == 0" class="col-span-2 duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-105 ">
|
||||
<a :href="blogs[0].url" class=" hover:text-threefold-green">
|
||||
<div class="h-full p-6 bg-white rounded border-t-4 border-green-500 shadow">
|
||||
<img :src="blog.image" :alt="blog.imgAlt" class="w-full md:max-w-xl mx-auto">
|
||||
<h3 class="text-2xl mb-3 font-semibold">{{ blog.title}}</h3>
|
||||
<p class="text-gray-900">{{ blog.description }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div v-if="index > 1 && index < 4" class="col-span-2">
|
||||
|
||||
<a :href="blog.url" class="w-full hover:text-threefold-green">
|
||||
<div class="w-full px-6 mb-8 duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-105">
|
||||
<div class="h-full md:p-6 bg-white rounded border-t-2 border-green-500 ">
|
||||
<h3 class="text-2xl mb-3 font-semibold">{{ blog.title }}</h3>
|
||||
<p class="text-gray-900">{{ blog.description }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mx-auto text-center my-8">
|
||||
<a href="#">
|
||||
<h3 class="text-xl uppercase text-threefold-green font-semibold hover:underline transition duration-300">Join {{blogs.length}} Blog Subscribers</h3>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
blogs: Array
|
||||
},
|
||||
};
|
||||
</script>
|
||||
11
src/components/custom/Buttons/PostButton.vue
Normal file
11
src/components/custom/Buttons/PostButton.vue
Normal file
@@ -0,0 +1,11 @@
|
||||
<template>
|
||||
<div class="mt-8">
|
||||
<a :href="card.link" class="bg-gray-900 learn-button hover:bg-gray-700 text-gray-100 px-5 py-3 font-semibold rounded">{{ card.button }}</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props:['card']
|
||||
}
|
||||
</script>
|
||||
140
src/components/custom/Cards/PostListItem.vue
Normal file
140
src/components/custom/Cards/PostListItem.vue
Normal file
@@ -0,0 +1,140 @@
|
||||
<template>
|
||||
<div
|
||||
class="flex flex-post px-0 sm:px-4 pb-8 mb-8"
|
||||
v-bind:class="{ 'no-border': !border }"
|
||||
>
|
||||
<g-link :to="path" class="post-card-image-link">
|
||||
<g-image
|
||||
:src="record.image"
|
||||
:alt="record.title"
|
||||
class="post-card-image"
|
||||
></g-image>
|
||||
</g-link>
|
||||
<div>
|
||||
<g-link :to="path">
|
||||
<h2 class="post-card-title mt-3">{{ record.title || record.name }}</h2>
|
||||
<p class="post-card-excerpt">{{ record.excerpt }}</p>
|
||||
<section
|
||||
class="flex flex-wrap post-tags container mx-auto relative py-1"
|
||||
>
|
||||
<g-link
|
||||
v-for="membership in memberships"
|
||||
:key="membership.id"
|
||||
:to="membership.path"
|
||||
class="text-xs bg-transparent hover:text-blue-700 py-1 px-2 mr-1 border hover:border-blue-500 border-gray-600 text-gray-700 rounded-full mb-2"
|
||||
>{{ membership.title }}</g-link
|
||||
>
|
||||
</section>
|
||||
</g-link>
|
||||
|
||||
<div class="w-full post-card-meta pt-2">
|
||||
<div class="avatars">
|
||||
<div class="flex items-center">
|
||||
<div class="flex justify-between items-center">
|
||||
<ul class="list-none flex author-list m-0">
|
||||
<li
|
||||
v-for="author in record.authors"
|
||||
:key="author.id"
|
||||
class="author-list-item"
|
||||
>
|
||||
<g-link :to="author.path" v-tooltip="author.name">
|
||||
<g-image
|
||||
:src="author.image"
|
||||
:alt="author.name"
|
||||
class="w-8 h-8 rounded-full bg-gray-200 border-2 border-white"
|
||||
/>
|
||||
</g-link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col text-xs leading-none uppercase">
|
||||
<p>
|
||||
<g-link :to="path">
|
||||
<time :datetime="record.datetime">{{
|
||||
record.humanTime
|
||||
}}</time>
|
||||
</g-link>
|
||||
</p>
|
||||
<p>
|
||||
<g-link :to="path">
|
||||
<time :datetime="record.datetime">{{
|
||||
record.startDate
|
||||
}}</time>
|
||||
</g-link>
|
||||
{{ record.status }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<section class="post-tags container mx-auto relative py-3" v-if="displaytags()">
|
||||
<g-link
|
||||
v-for="tag in record.tags"
|
||||
:key="tag.id"
|
||||
:to="tag.path"
|
||||
class="text-xs bg-transparent hover:text-blue-700 py-2 px-4 mr-2 border hover:border-blue-500 border-gray-600 text-gray-700 rounded-full"
|
||||
>{{ tag.title }}</g-link
|
||||
>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
|
||||
props: {
|
||||
record: {},
|
||||
showtags: false,
|
||||
pathPrefix: "",
|
||||
border: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
|
||||
computed: {
|
||||
path(){
|
||||
if (this.pathPrefix)
|
||||
return this.pathPrefix + "/" + this.record.id
|
||||
return this.record.path
|
||||
},
|
||||
|
||||
memberships(){
|
||||
var res = []
|
||||
var memberships = this.record.memberships
|
||||
if (!memberships){
|
||||
return []
|
||||
}
|
||||
memberships.forEach(function(membership){
|
||||
if(["foundation", "tech"].includes(membership.title)){
|
||||
res.push(membership)
|
||||
}
|
||||
});
|
||||
return res
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
methods: {
|
||||
displaytags(){
|
||||
return this.showtags
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap");
|
||||
.post-card-excerpt {
|
||||
font-family: "Roboto", sans-serif;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.post-card-image {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
</style>
|
||||
139
src/components/custom/Cards/SearchListItem.vue
Normal file
139
src/components/custom/Cards/SearchListItem.vue
Normal file
@@ -0,0 +1,139 @@
|
||||
<template>
|
||||
<div v-if="card"
|
||||
class="flex search-post px-0 sm:px-4 pb-8 mb-8"
|
||||
v-bind:class="{ 'no-border': !border }"
|
||||
>
|
||||
<g-link :to="record.path" class="post-card-image-link">
|
||||
<g-image
|
||||
:src="record.image"
|
||||
:alt="record.title"
|
||||
class="post-card-image"
|
||||
></g-image>
|
||||
</g-link>
|
||||
<div class="p-5">
|
||||
<g-link :to="record.path">
|
||||
<h2 class="post-card-title mt-3">{{ record.title || record.name }}</h2>
|
||||
<p class="post-card-excerpt">{{ record.excerpt }}</p>
|
||||
<section class="post-tags container mx-auto relative py-1">
|
||||
<g-link
|
||||
v-for="membership in record.memberships"
|
||||
:key="membership.id"
|
||||
:to="membership.path"
|
||||
class="text-xs bg-transparent hover:text-blue-700 py-1 px-2 mr-1 border hover:border-blue-500 border-gray-600 text-gray-700 rounded-full"
|
||||
>{{ membership.title }}</g-link
|
||||
>
|
||||
</section>
|
||||
</g-link>
|
||||
|
||||
<div class="w-full post-card-meta pt-2">
|
||||
<div class="avatars">
|
||||
<div class="flex items-center">
|
||||
<div class="flex justify-between items-center">
|
||||
<ul class="list-none flex author-list m-0">
|
||||
<li
|
||||
v-for="author in record.authors"
|
||||
:key="author.id"
|
||||
class="author-list-item"
|
||||
>
|
||||
<g-link :to="author.path" v-tooltip="author.name">
|
||||
<g-image
|
||||
:src="author.image"
|
||||
:alt="author.name"
|
||||
class="w-8 h-8 rounded-full bg-gray-200 border-2 border-white"
|
||||
/>
|
||||
</g-link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col text-xs leading-none uppercase">
|
||||
<p>
|
||||
<g-link :to="record.path">
|
||||
<time :datetime="record.datetime">{{
|
||||
record.humanTime
|
||||
}}</time>
|
||||
</g-link>
|
||||
</p>
|
||||
<p>
|
||||
<g-link :to="record.path">
|
||||
<time :datetime="record.datetime">{{
|
||||
record.startDate
|
||||
}}</time>
|
||||
</g-link>
|
||||
{{ record.status }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<section class="post-tags container mx-auto relative py-3">
|
||||
<g-link
|
||||
v-for="tag in record.tags"
|
||||
:key="tag.id"
|
||||
:to="tag.path"
|
||||
class="text-xs bg-transparent hover:text-blue-700 py-2 px-4 mr-2 border hover:border-blue-500 border-gray-600 text-gray-700 rounded-full"
|
||||
>{{ tag.title }}</g-link
|
||||
>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else
|
||||
class="flex search-post px-0 sm:px-4 pb-8 mb-8"
|
||||
v-bind:class="{ 'no-border': !border }"
|
||||
>
|
||||
|
||||
<div class="p-5">
|
||||
<g-link :to="record.path">
|
||||
<h2 class="post-card-title mt-3">{{ record.title}}</h2>
|
||||
<p class="post-card-excerpt" v-if="record.excerpt" >{{ record.excerpt.substring(100) }}</p>
|
||||
</g-link>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
props: {
|
||||
record: {},
|
||||
border: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
card(){return this.record.__typename != "MarkdownPage"},
|
||||
|
||||
path(){
|
||||
if (this.pathPrefix)
|
||||
return this.pathPrefix + "/" + this.record.id
|
||||
return this.record.path
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap");
|
||||
.post-card-excerpt {
|
||||
font-family: "Roboto", sans-serif;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.flex-post {
|
||||
flex-direction: row;
|
||||
|
||||
}
|
||||
.search-post{
|
||||
border-bottom-width: 1px;
|
||||
border-bottom-color: #e2e8f0;
|
||||
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.post-card-image {
|
||||
max-width: 400px;
|
||||
height: auto;
|
||||
}
|
||||
</style>
|
||||
38
src/components/custom/Navbar/Getintouch.vue
Normal file
38
src/components/custom/Navbar/Getintouch.vue
Normal file
@@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<div class="bg-white">
|
||||
<div class="max-w-7xl mx-auto py-16 px-4 sm:px-6 lg:py-24 lg:px-8">
|
||||
<div class="grid grid-cols-1 gap-16">
|
||||
<div class="lg:grid lg:grid-cols-3 lg:gap-8">
|
||||
<h2 class="text-4xl mb-6 leading-tight font-semibold font-heading">
|
||||
Get in touch
|
||||
</h2>
|
||||
<div
|
||||
class="mt-8 grid grid-cols-1 gap-12 sm:grid-cols-2 sm:gap-x-8 sm:gap-y-12 lg:mt-0 lg:col-span-2"
|
||||
>
|
||||
<div v-for="(contact, idx) in contacts" :key="idx">
|
||||
<h4 class="text-lg leading-6 font-medium text-gray-700">
|
||||
{{ contact.title }}
|
||||
</h4>
|
||||
<div class="mt-2 text-base leading-6 text-gray-500">
|
||||
<div>
|
||||
{{ contact.mail }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-1">
|
||||
{{ contact.phone }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="border-t-2 border-gray-100"></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["contacts"],
|
||||
};
|
||||
</script>
|
||||
|
||||
304
src/components/custom/Navbar/Navbar.vue
Normal file
304
src/components/custom/Navbar/Navbar.vue
Normal file
@@ -0,0 +1,304 @@
|
||||
<template>
|
||||
<div class="fixed inset-0 h-16 bg-white">
|
||||
<header
|
||||
class="flex items-center justify-between flex-wrap container mx-auto px-4 sm:px-0 py-4 transition-all transition-500"
|
||||
v-bind:class="{
|
||||
'opacity-100': !disableScroll && scrollPosition > headerHeight,
|
||||
'opacity-0': !disableScroll && scrollPosition < headerHeight,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center justify-between px-4 py-3 sm:p-0">
|
||||
<div class="inline-flex items-center flex-shrink-0">
|
||||
<a href="/" class="flex">
|
||||
<img
|
||||
src="/img/TFN_black.svg"
|
||||
class="mr-3 fill-current"
|
||||
width="180"
|
||||
v-if="theme == 'light'"
|
||||
alt=""
|
||||
/>
|
||||
|
||||
<img
|
||||
src="/img/TFN_white.svg"
|
||||
class="mr-3 fill-current"
|
||||
width="180"
|
||||
v-else
|
||||
alt=""
|
||||
/>
|
||||
<!-- <span
|
||||
class="hidden md:block font-semibold text-xl tracking-tight"
|
||||
>{{ $static.metadata.siteName }}</span
|
||||
> -->
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="sm:hidden ml-auto">
|
||||
<button
|
||||
@click="isOpen = !isOpen"
|
||||
type="button"
|
||||
class="block text-gray-500 focus:outline-none"
|
||||
>
|
||||
<svg class="h-6 w-6 fill-current" viewBox="0 0 24 24">
|
||||
<path
|
||||
v-if="isOpen"
|
||||
fill-rule="evenodd"
|
||||
d="M18.278 16.864a1 1 0 0 1-1.414 1.414l-4.829-4.828-4.828 4.828a1 1 0 0 1-1.414-1.414l4.828-4.829-4.828-4.828a1 1 0 0 1 1.414-1.414l4.829 4.828 4.828-4.828a1 1 0 1 1 1.414 1.414l-4.828 4.829 4.828 4.828z"
|
||||
/>
|
||||
<path
|
||||
v-if="!isOpen"
|
||||
fill-rule="evenodd"
|
||||
d="M4 5h16a1 1 0 0 1 0 2H4a1 1 0 1 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="text-gray-400 sm:block md:hidden">
|
||||
<ul class="list-none flex justify-center md:justify-end">
|
||||
<li class="mr-0 sm:mr-6">
|
||||
<theme-switcher v-on="$listeners" :theme="theme" />
|
||||
</li>
|
||||
<li
|
||||
:key="element.name"
|
||||
v-for="(element, index) in navigation.social"
|
||||
class="hover:text-white sm:block"
|
||||
v-bind:class="{
|
||||
'mr-6': index != Object.keys(navigation.social).length - 1,
|
||||
}"
|
||||
>
|
||||
<span class="telegram_icon">
|
||||
<a
|
||||
:href="element.link"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<font-awesome :icon="['fab', element.icon]" />
|
||||
</a>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav
|
||||
:class="isOpen ? 'block' : 'hidden'"
|
||||
class="md:order-2 px-2 pt-2 pb-4 sm:flex sm:p-0 bg-white"
|
||||
>
|
||||
<ul
|
||||
class="list-none sm:flex justify-left uppercase transition-all transition-500"
|
||||
>
|
||||
<li
|
||||
class="py-1"
|
||||
:key="element.name"
|
||||
v-for="(element, index) in navigation.navLinks"
|
||||
:class="{
|
||||
'mr-2': index != Object.keys(navigation.navLinks).length - 1,
|
||||
}"
|
||||
>
|
||||
<div
|
||||
v-if="element.expandable"
|
||||
class="relative"
|
||||
x-data="{ open: false }"
|
||||
>
|
||||
<button
|
||||
@click="setActive(index)"
|
||||
class="flex flex-row items-center w-full md:w-auto md:inline md:mt-0 md:ml-4 animated-link"
|
||||
>
|
||||
<span class="uppercase">{{ element.name }}</span>
|
||||
<svg
|
||||
fill="currentColor"
|
||||
viewBox="0 0 20 20"
|
||||
:class="{
|
||||
'rotate-180': active == index,
|
||||
'rotate-0': !active == index,
|
||||
}"
|
||||
class="inline w-4 h-4 mt-1 ml-1 transition-transform duration-200 transform md:-mt-1"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
||||
clip-rule="evenodd"
|
||||
></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div
|
||||
v-if="active == index"
|
||||
x-show="open"
|
||||
x-transition:enter="transition ease-out duration-100"
|
||||
x-transition:enter-start="transform opacity-0 scale-95"
|
||||
x-transition:enter-end="transform opacity-100 scale-100"
|
||||
x-transition:leave="transition ease-in duration-75"
|
||||
x-transition:leave-start="transform opacity-100 scale-100"
|
||||
x-transition:leave-end="transform opacity-0 scale-95"
|
||||
class="absolute w-full mt-2 origin-top-right rounded-md shadow-lg md:w-48 z-30"
|
||||
>
|
||||
<div
|
||||
v-if="open"
|
||||
class="px-2 py-2 bg-white rounded-md shadow dark:bg-gray-700"
|
||||
>
|
||||
<div v-for="link in element.submenu" :key="link.title">
|
||||
<a
|
||||
v-if="link.external"
|
||||
class="block px-4 py-2 mt-2 text-sm font-semibold bg-transparent rounded-lg dark:bg-transparent dark:hover:bg-gray-600 dark-:focus:bg-gray-600 dark:focus:text-white dark:hover:text-white dark:text-gray-200 md:mt-0 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||
@click="open = false"
|
||||
:href="link.path"
|
||||
target="_blank"
|
||||
>{{ link.title }}</a
|
||||
>
|
||||
<a
|
||||
v-else
|
||||
class="block px-4 py-2 mt-2 text-sm font-semibold bg-transparent rounded-lg dark:bg-transparent dark:hover:bg-gray-600 dark-:focus:bg-gray-600 dark:focus:text-white dark:hover:text-white dark:text-gray-200 md:mt-0 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||
@click="open = false"
|
||||
:href="link.path"
|
||||
>{{ link.title }}</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<g-link
|
||||
v-else-if="element.external"
|
||||
:to="element.link"
|
||||
target="_blank"
|
||||
class="animated-link"
|
||||
>{{ element.name }}</g-link
|
||||
>
|
||||
<g-link v-else :to="element.link" class="animated-link">{{
|
||||
element.name
|
||||
}}</g-link>
|
||||
</li>
|
||||
</ul>
|
||||
<div
|
||||
class="md:hidden inline-flex rounded-full border-2 border-gray-200 w-1/2"
|
||||
>
|
||||
<span class="w-auto flex justify-end items-center p-2">
|
||||
<font-awesome :icon="['fas', 'search']" />
|
||||
</span>
|
||||
<input
|
||||
class="w-full rounded mr-4 bg-white"
|
||||
type="text"
|
||||
placeholder="Search..."
|
||||
v-model="search"
|
||||
@keyup.enter="result"
|
||||
/>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="hidden md:ml-auto md:inline-block md:order-last">
|
||||
<div class="inline-flex rounded-full border-2 border-gray-200 w-1/2">
|
||||
<span class="w-auto flex justify-end items-center p-2">
|
||||
<font-awesome :icon="['fas', 'search']" />
|
||||
</span>
|
||||
<input
|
||||
class="w-full rounded mr-4 bg-white"
|
||||
type="text"
|
||||
placeholder="Search..."
|
||||
v-model="search"
|
||||
@keyup.enter="result"
|
||||
/>
|
||||
</div>
|
||||
<ul class="list-none inline-flex justify-center md:justify-end">
|
||||
<li class="mr-0 sm:mr-6">
|
||||
<ThemeSwitcher v-on="$listeners" :theme="theme" />
|
||||
</li>
|
||||
<li
|
||||
:key="element.name"
|
||||
v-for="(element, index) in navigation.social"
|
||||
class="sm:block"
|
||||
v-bind:class="{
|
||||
'mr-6': index != Object.keys(navigation.social).length - 1,
|
||||
}"
|
||||
>
|
||||
<span class="telegram_icon">
|
||||
<a :href="element.link" target="_blank" rel="noopener noreferrer">
|
||||
<font-awesome :icon="['fab', element.icon]" />
|
||||
</a>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/*
|
||||
* I'm a lazy guy, so i used this script
|
||||
* https://codepen.io/ninaregli/pen/OjeMLP
|
||||
* to calculate the current scroll position
|
||||
*
|
||||
* Will be used to add/remove the additional
|
||||
* css classes to show the sticky navbar
|
||||
*/
|
||||
|
||||
import ThemeSwitcher from "~/components/custom/ThemeSwitcher.vue";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ThemeSwitcher,
|
||||
},
|
||||
props: {
|
||||
disableScroll: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
theme: {
|
||||
type: String,
|
||||
},
|
||||
navigation: {
|
||||
type: Object,
|
||||
},
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
scrollPosition: null,
|
||||
headerHeight: 0,
|
||||
isOpen: false,
|
||||
search: "",
|
||||
open: false,
|
||||
active: null,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
updateScroll() {
|
||||
this.scrollPosition = window.scrollY;
|
||||
},
|
||||
setHeaderHeight(height) {
|
||||
this.headerHeight = height;
|
||||
},
|
||||
result() {
|
||||
window.location.href = `/search?query=${this.search}`;
|
||||
},
|
||||
setActive(index) {
|
||||
this.active = index;
|
||||
this.open = !this.open;
|
||||
},
|
||||
close(e) {
|
||||
if (!this.$el.contains(e.target)) {
|
||||
this.open = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
mounted() {
|
||||
if (!this.disableScroll) {
|
||||
var height = document.getElementById("header").clientHeight;
|
||||
this.setHeaderHeight(height);
|
||||
window.addEventListener("scroll", this.updateScroll);
|
||||
}
|
||||
document.addEventListener("click", this.close);
|
||||
},
|
||||
beforeDestroy() {
|
||||
document.removeEventListener("click", this.close);
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style scoped>
|
||||
input:focus,
|
||||
button:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.inset-0 {
|
||||
z-index: 999;
|
||||
}
|
||||
</style>
|
||||
49
src/components/custom/Navbar/VerticalNav.vue
Normal file
49
src/components/custom/Navbar/VerticalNav.vue
Normal file
@@ -0,0 +1,49 @@
|
||||
<template>
|
||||
<div class="my-12">
|
||||
<nav class="inline-block w-1/4 border-r-2 border-gray-200">
|
||||
<a
|
||||
v-for="(slide, index) in slides"
|
||||
:key="index"
|
||||
:href="`#${index}`"
|
||||
class="mt-1 capitalize group flex items-center px-3 py-2 text-sm leading-5 font-medium hover:text-gray-900 focus:outline-none border-blue-500 hover:bg-gray-100 transition ease-in-out duration-150"
|
||||
:class="{
|
||||
'border-r-3 border-blue-500 hover:bg-gray-100': activeIndex === index,
|
||||
}"
|
||||
@click="setActive(index)"
|
||||
>
|
||||
<span> {{ slide.title }} </span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
<div
|
||||
class="content inline-block h-full w-3/4 align-top p-5 transition ease-in-out duration-150"
|
||||
>
|
||||
<div :id="slides[activeIndex]" class="hidden" style="display: block">
|
||||
<g-image
|
||||
v-if="slides[activeIndex].image"
|
||||
:src="
|
||||
require(`!!assets-loader!@images/sliders/${slides[activeIndex].image}`)
|
||||
"
|
||||
:alt="slides[activeIndex].title"
|
||||
/>
|
||||
<p>{{ slides[activeIndex].excerpt }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["slides"],
|
||||
data() {
|
||||
return {
|
||||
activeIndex: 0,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
setActive(index) {
|
||||
this.activeIndex = index;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
285
src/components/custom/NewsFilterHeader.vue
Normal file
285
src/components/custom/NewsFilterHeader.vue
Normal file
@@ -0,0 +1,285 @@
|
||||
<template>
|
||||
<div class="fixed top-16 left-0 z-50 mb-5 h-16 bg-gray-100 w-full">
|
||||
<header
|
||||
class="flex items-center justify-between flex-wrap container mx-auto px-4 py-1 sm:px-0 transition-all transition-500"
|
||||
>
|
||||
<div class="flex items-center justify-between px-4 py-2 sm:p-0">
|
||||
<div class="sm:hidden ml-auto">
|
||||
<button
|
||||
@click="isOpen = !isOpen"
|
||||
type="button"
|
||||
class="block text-gray-500 focus:outline-none"
|
||||
>
|
||||
<svg class="h-6 w-6 fill-current" viewBox="0 0 24 24">
|
||||
<path
|
||||
v-if="isOpen"
|
||||
fill-rule="evenodd"
|
||||
d="M18.278 16.864a1 1 0 0 1-1.414 1.414l-4.829-4.828-4.828 4.828a1 1 0 0 1-1.414-1.414l4.828-4.829-4.828-4.828a1 1 0 0 1 1.414-1.414l4.829 4.828 4.828-4.828a1 1 0 1 1 1.414 1.414l-4.828 4.829 4.828 4.828z"
|
||||
/>
|
||||
<path
|
||||
v-if="!isOpen"
|
||||
fill-rule="evenodd"
|
||||
d="M4 5h16a1 1 0 0 1 0 2H4a1 1 0 1 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2z"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="inline-flex items-center flex-shrink-0">
|
||||
<span class="flex text-xl p-3 capitalize tracking-tight">filter</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sm:block md:hidden">
|
||||
<ul class="list-none inline-flex justify-center md:justify-end">
|
||||
<li class="py-1 mx-5 cursor-pointer" @click="resetAll()">Reset</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<nav
|
||||
:class="isOpen ? 'flex' : 'hidden'"
|
||||
class="inline-flex md:order-2 sm:w-28 px-2 pt-2 pb-4 sm:flex sm:p-0 bg-gray-100"
|
||||
>
|
||||
<ul
|
||||
class="list-none sm:flex justify-left capitalize transition-all transition-500"
|
||||
>
|
||||
<!-- Topics -->
|
||||
<li class="py-1 mx-5">
|
||||
<div class="relative" x-data="{ open: false }">
|
||||
<button
|
||||
@click="setActive(0)"
|
||||
class="flex flex-row items-center w-full md:w-auto md:inline md:mt-0 md:ml-4 animated-link"
|
||||
>
|
||||
<span class="capitalize">{{ topic }}</span>
|
||||
<svg
|
||||
fill="currentColor"
|
||||
viewBox="0 0 20 20"
|
||||
:class="{
|
||||
'rotate-180': active == 0,
|
||||
'rotate-0': !active == 0,
|
||||
}"
|
||||
class="inline w-4 h-4 mt-1 ml-1 transition-transform duration-200 transform md:-mt-1"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
||||
clip-rule="evenodd"
|
||||
></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div
|
||||
v-if="active == 0"
|
||||
x-show="open"
|
||||
x-transition:enter="transition ease-out duration-100"
|
||||
x-transition:enter-start="transform opacity-0 scale-95"
|
||||
x-transition:enter-end="transform opacity-100 scale-100"
|
||||
x-transition:leave="transition ease-in duration-75"
|
||||
x-transition:leave-start="transform opacity-100 scale-100"
|
||||
x-transition:leave-end="transform opacity-0 scale-95"
|
||||
class="absolute w-full mt-2 origin-top-right rounded-md shadow-lg md:w-48 z-30"
|
||||
>
|
||||
<div
|
||||
v-if="open"
|
||||
class="w-64 max-h-10 px-2 py-2 bg-white rounded-md shadow dark:bg-gray-700"
|
||||
>
|
||||
<a
|
||||
v-for="topic in topics"
|
||||
:key="topic"
|
||||
class="cursor-pointer block px-4 py-2 mt-2 text-sm font-semibold bg-transparent rounded-lg dark:bg-transparent dark:hover:bg-gray-600 dark-:focus:bg-gray-600 dark:focus:text-white dark:hover:text-white dark:text-gray-200 md:mt-0 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||
@click.self="
|
||||
setTopic(topic);
|
||||
open = false;
|
||||
"
|
||||
>{{ topic }}</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<!-- Years -->
|
||||
<li class="py-1 mx-5">
|
||||
<div class="relative" x-data="{ open: false }">
|
||||
<button
|
||||
@click="setActive(1)"
|
||||
class="flex flex-row items-center w-full md:w-auto md:inline md:mt-0 md:ml-4 animated-link"
|
||||
>
|
||||
<span class="capitalize">{{ year }}</span>
|
||||
<svg
|
||||
fill="currentColor"
|
||||
viewBox="0 0 20 20"
|
||||
:class="{
|
||||
'rotate-180': active == 1,
|
||||
'rotate-0': !active == 1,
|
||||
}"
|
||||
class="inline w-4 h-4 mt-1 ml-1 transition-transform duration-200 transform md:-mt-1"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
||||
clip-rule="evenodd"
|
||||
></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div
|
||||
v-if="active == 1"
|
||||
x-show="open"
|
||||
x-transition:enter="transition ease-out duration-100"
|
||||
x-transition:enter-start="transform opacity-0 scale-95"
|
||||
x-transition:enter-end="transform opacity-100 scale-100"
|
||||
x-transition:leave="transition ease-in duration-75"
|
||||
x-transition:leave-start="transform opacity-100 scale-100"
|
||||
x-transition:leave-end="transform opacity-0 scale-95"
|
||||
class="absolute w-full mt-2 origin-top-right rounded-md shadow-lg md:w-48 z-30"
|
||||
>
|
||||
<div
|
||||
v-if="open"
|
||||
class="w-64 px-2 py-2 bg-white rounded-md shadow dark:bg-gray-700"
|
||||
>
|
||||
<a
|
||||
v-for="year in years"
|
||||
:key="year"
|
||||
class="cursor-pointer block px-4 py-2 mt-2 text-sm font-semibold bg-transparent rounded-lg dark:bg-transparent dark:hover:bg-gray-600 dark-:focus:bg-gray-600 dark:focus:text-white dark:hover:text-white dark:text-gray-200 md:mt-0 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||
@click.self="
|
||||
setYear(year);
|
||||
open = false;
|
||||
"
|
||||
>{{ year }}</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<!-- Months -->
|
||||
<li class="py-1 mx-5">
|
||||
<div class="relative" x-data="{ open: false }">
|
||||
<button
|
||||
@click="setActive(2)"
|
||||
class="flex flex-row items-center w-full md:w-auto md:inline md:mt-0 md:ml-4 animated-link"
|
||||
>
|
||||
<span class="capitalize">{{ month }}</span>
|
||||
<svg
|
||||
fill="currentColor"
|
||||
viewBox="0 0 20 20"
|
||||
:class="{
|
||||
'rotate-180': active == 2,
|
||||
'rotate-0': !active == 2,
|
||||
}"
|
||||
class="inline w-4 h-4 mt-1 ml-1 transition-transform duration-200 transform md:-mt-1"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
||||
clip-rule="evenodd"
|
||||
></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div
|
||||
v-if="active == 2"
|
||||
x-show="open"
|
||||
x-transition:enter="transition ease-out duration-100"
|
||||
x-transition:enter-start="transform opacity-0 scale-95"
|
||||
x-transition:enter-end="transform opacity-100 scale-100"
|
||||
x-transition:leave="transition ease-in duration-75"
|
||||
x-transition:leave-start="transform opacity-100 scale-100"
|
||||
x-transition:leave-end="transform opacity-0 scale-95"
|
||||
class="absolute w-full mt-2 origin-top-right rounded-md shadow-lg md:w-48 z-30"
|
||||
>
|
||||
<div
|
||||
v-if="open"
|
||||
class="w-64 overflow-y-auto h-40 px-2 py-2 bg-white rounded-md shadow dark:bg-gray-700"
|
||||
>
|
||||
<a
|
||||
v-for="month in months"
|
||||
:key="month"
|
||||
class="cursor-pointer block px-4 py-2 mt-2 text-sm font-semibold bg-transparent rounded-lg dark:bg-transparent dark:hover:bg-gray-600 dark-:focus:bg-gray-600 dark:focus:text-white dark:hover:text-white dark:text-gray-200 md:mt-0 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||
@click.self="
|
||||
setMonth(month);
|
||||
open = false;
|
||||
"
|
||||
>{{ month }}</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="hidden md:ml-auto md:inline-block md:order-last">
|
||||
<ul class="list-none inline-flex justify-center md:justify-end">
|
||||
<li class="py-1 mx-5 cursor-pointer" @click="resetAll()">Reset</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/*
|
||||
* I'm a lazy guy, so i used this script
|
||||
* https://codepen.io/ninaregli/pen/OjeMLP
|
||||
* to calculate the current scroll position
|
||||
*
|
||||
* Will be used to add/remove the additional
|
||||
* css classes to show the sticky navbar
|
||||
*/
|
||||
|
||||
export default {
|
||||
props: ["topics", "years", "months"],
|
||||
data: function () {
|
||||
return {
|
||||
isOpen: false,
|
||||
open: false,
|
||||
active: null,
|
||||
listArchive: false,
|
||||
topic: "All Topics",
|
||||
year: "All Years",
|
||||
month: "All Months",
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
setActive(index) {
|
||||
this.active = index;
|
||||
this.open = !this.open;
|
||||
},
|
||||
setTopic(event) {
|
||||
this.$emit("selectedTopic", event);
|
||||
this.topic = event;
|
||||
},
|
||||
setYear(event) {
|
||||
this.$emit("selectedYear", event);
|
||||
this.year = event;
|
||||
},
|
||||
setMonth(event) {
|
||||
this.$emit("selectedMonth", event);
|
||||
this.month = event;
|
||||
},
|
||||
resetAll() {
|
||||
this.$emit("resetAll", true);
|
||||
this.topic = "All Topics";
|
||||
this.year = "All Year";
|
||||
this.month = "All Months";
|
||||
},
|
||||
close(e) {
|
||||
if (!this.$el.contains(e.target)) {
|
||||
this.open = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
mounted() {
|
||||
document.addEventListener("click", this.close);
|
||||
},
|
||||
beforeDestroy() {
|
||||
document.removeEventListener("click", this.close);
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.top-16 {
|
||||
top: 4rem;
|
||||
}
|
||||
</style>
|
||||
86
src/components/custom/Pagination.vue
Normal file
86
src/components/custom/Pagination.vue
Normal file
@@ -0,0 +1,86 @@
|
||||
<template>
|
||||
<ul class="flex pl-0 list-none rounded my-2">
|
||||
|
||||
<li class="w-10 relative block text-center py-2 leading-tight bg-white border border-gray-300 text-black ml-0 mr-1 rounded hover:bg-gray-300" v-if="!isFirstPage(currentPage, totalPages)">
|
||||
<g-link :to="previousPage(currentPage,totalPages)" class="page-link" tabindex="-1" >«</g-link>
|
||||
</li>
|
||||
|
||||
<li
|
||||
v-for="page in pages" :key="page.name"
|
||||
v-bind:class="[isCurrentPage(currentPage, page.name) ? 'border-l-2 border-l-black' : '']"
|
||||
class="w-10 relative block py-2 text-center leading-tight bg-white border border-gray-300 text-black rounded hover:bg-gray-300 ml-1 mr-1">
|
||||
<g-link
|
||||
:to="page.link"
|
||||
class="page-link"
|
||||
:aria-label="page.name"
|
||||
:aria-current="page.name"
|
||||
>{{page.name}}</g-link>
|
||||
</li>
|
||||
|
||||
<li class="w-10 relative block py-2 text-center leading-tight bg-white border border-gray-300 text-black ml-1 rounded hover:bg-gray-300" v-if="!isLastPage(currentPage, totalPages)">
|
||||
<g-link :to="nextPage(currentPage,totalPages)" class="page-link" tabindex="-1" >»</g-link>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
baseUrl: String,
|
||||
currentPage: Number,
|
||||
totalPages: Number,
|
||||
maxVisibleButtons: {
|
||||
type: Number,
|
||||
required: false,
|
||||
default: 3
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
isFirstPage(currentPage, totalPages) {
|
||||
return currentPage == 1;
|
||||
},
|
||||
isLastPage(currentPage, totalPages) {
|
||||
return currentPage == totalPages;
|
||||
},
|
||||
isCurrentPage(currentPage, pageElement) {
|
||||
return currentPage == pageElement;
|
||||
},
|
||||
nextPage(currentPage, totalPages) {
|
||||
return `${this.baseUrl}/${currentPage + 1}`;
|
||||
},
|
||||
previousPage(currentPage, totalPages) {
|
||||
return currentPage === 2
|
||||
? `${this.baseUrl}/`
|
||||
: `${this.baseUrl}/${currentPage - 1}`;
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
startPage() {
|
||||
if (this.currentPage === 1) {
|
||||
return 1;
|
||||
}
|
||||
if (this.currentPage === this.totalPages) {
|
||||
return this.currentPage - 1;
|
||||
}
|
||||
return this.currentPage - 1;
|
||||
},
|
||||
pages() {
|
||||
const range = [];
|
||||
for (
|
||||
let i = this.startPage;
|
||||
i <=
|
||||
Math.min(this.startPage + this.maxVisibleButtons - 1, this.totalPages);
|
||||
i += 1
|
||||
) {
|
||||
range.push({
|
||||
name: i,
|
||||
isDisabled: i === this.currentPage,
|
||||
link: i === 1 ? `${this.baseUrl}/` : `${this.baseUrl}/${i}`
|
||||
});
|
||||
}
|
||||
return range;
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
122
src/components/custom/TagFilterHeader.vue
Normal file
122
src/components/custom/TagFilterHeader.vue
Normal file
@@ -0,0 +1,122 @@
|
||||
<template>
|
||||
<div class="fixed top-16 left-0 z-50 mb-5 h-16 bg-gray-100 w-full">
|
||||
<header
|
||||
class="flex items-center flex-wrap container mx-auto pt-1 pb-0 sm:px-0 transition-all transition-500"
|
||||
>
|
||||
<div class="flex items-center justify-between px-4 sm:p-0">
|
||||
<div class="inline-flex items-center flex-shrink-0">
|
||||
<span class="flex text-xl p-3 capitalize tracking-tight"
|
||||
>filter:</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav
|
||||
class="inline-flex md:order-2 px-2 pt-2 pb-4 sm:flex sm:p-0 bg-transparent"
|
||||
>
|
||||
<ul
|
||||
class="list-none sm:flex justify-left capitalize transition-all transition-500"
|
||||
>
|
||||
<!-- Tags -->
|
||||
<li class="pt-2 mx-5">
|
||||
<div class="relative" x-data="{ open: false }">
|
||||
<button
|
||||
@click="setActive(0)"
|
||||
class="flex flex-row items-center w-full md:w-auto md:inline md:mt-0 md:ml-4 animated-link"
|
||||
>
|
||||
<span class="capitalize">{{ selected }}</span>
|
||||
<svg
|
||||
fill="currentColor"
|
||||
viewBox="0 0 20 20"
|
||||
:class="{
|
||||
'rotate-180': active == 0,
|
||||
'rotate-0': !active == 0,
|
||||
}"
|
||||
class="inline w-4 h-4 mt-1 ml-1 transition-transform duration-200 transform md:-mt-1"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
||||
clip-rule="evenodd"
|
||||
></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div
|
||||
v-if="active == 0"
|
||||
x-show="open"
|
||||
x-transition:enter="transition ease-out duration-100"
|
||||
x-transition:enter-start="transform opacity-0 scale-95"
|
||||
x-transition:enter-end="transform opacity-100 scale-100"
|
||||
x-transition:leave="transition ease-in duration-75"
|
||||
x-transition:leave-start="transform opacity-100 scale-100"
|
||||
x-transition:leave-end="transform opacity-0 scale-95"
|
||||
class="absolute w-full mt-2 origin-top-right rounded-md shadow-lg md:w-48 z-30"
|
||||
>
|
||||
<div
|
||||
v-if="open"
|
||||
class="w-64 max-h-10 px-2 py-2 bg-white rounded-md shadow dark:bg-gray-700"
|
||||
>
|
||||
<a
|
||||
v-for="tag in tags"
|
||||
:key="tag.path"
|
||||
class="cursor-pointer block px-4 py-2 mt-2 text-sm font-semibold bg-transparent rounded-lg dark:bg-transparent dark:hover:bg-gray-600 dark-:focus:bg-gray-600 dark:focus:text-white dark:hover:text-white dark:text-gray-200 md:mt-0 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline"
|
||||
:href="tag.path"
|
||||
@click.self="open = false"
|
||||
>{{ tag.title }}</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/*
|
||||
* I'm a lazy guy, so i used this script
|
||||
* https://codepen.io/ninaregli/pen/OjeMLP
|
||||
* to calculate the current scroll position
|
||||
*
|
||||
* Will be used to add/remove the additional
|
||||
* css classes to show the sticky navbar
|
||||
*/
|
||||
|
||||
export default {
|
||||
props: ["tags", "selected"],
|
||||
data() {
|
||||
return {
|
||||
tag: "All",
|
||||
isOpen: false,
|
||||
open: false,
|
||||
active: null,
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
setActive(index) {
|
||||
this.active = index;
|
||||
this.open = !this.open;
|
||||
},
|
||||
close(e) {
|
||||
if (!this.$el.contains(e.target)) {
|
||||
this.open = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
document.addEventListener("click", this.close);
|
||||
},
|
||||
beforeDestroy() {
|
||||
document.removeEventListener("click", this.close);
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.top-16 {
|
||||
top: 4rem;
|
||||
}
|
||||
</style>
|
||||
44
src/components/custom/ThemeSwitcher.vue
Normal file
44
src/components/custom/ThemeSwitcher.vue
Normal file
@@ -0,0 +1,44 @@
|
||||
<template>
|
||||
<a role="button" @click.prevent="toggleTheme()"
|
||||
:aria-label="'Toggle ' + nextTheme"
|
||||
:title="'Toggle ' + nextTheme"
|
||||
class="toggle-theme"
|
||||
>
|
||||
|
||||
<font-awesome :icon="['fas', 'sun']" class="mr-3" v-if="theme === 'dark'"></font-awesome>
|
||||
<font-awesome :icon="['fas', 'moon']" class="mr-3" v-if="theme === 'light'"></font-awesome>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
let themes = ['light', 'dark']
|
||||
|
||||
export default {
|
||||
props: {
|
||||
theme: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
|
||||
computed: {
|
||||
nextTheme() {
|
||||
const currentIndex = themes.indexOf(this.theme)
|
||||
const nextIndex = (currentIndex + 1) % themes.length
|
||||
return themes[nextIndex]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
toggleTheme() {
|
||||
const currentIndex = themes.indexOf(this.theme);
|
||||
const nextIndex = (currentIndex + 1) % themes.length;
|
||||
window.__setPreferredTheme(themes[nextIndex])
|
||||
|
||||
this.$emit('setTheme', themes[nextIndex])
|
||||
}
|
||||
},
|
||||
async mounted() {
|
||||
// set default
|
||||
if (typeof window.__theme !== 'undefined') this.$emit('setTheme', window.__theme)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
23
src/components/custom/sections/CallToAction.vue
Normal file
23
src/components/custom/sections/CallToAction.vue
Normal file
@@ -0,0 +1,23 @@
|
||||
<template>
|
||||
<section class="py-12 px-4 text-center">
|
||||
<div class="w-full max-w-2xl mx-auto">
|
||||
<h2 class="text-5xl leading-tight font-semibold font-heading">
|
||||
{{ cta.title }}
|
||||
</h2>
|
||||
<p class="mt-6 mb-8 text-gray-600 leading-relaxed">
|
||||
{{ cta.excerpt }}
|
||||
</p>
|
||||
<g-link
|
||||
class="bg-gray-900 learn-button hover:bg-gray-700 text-gray-100 px-5 py-3 mr-3 font-semibold rounded shadow"
|
||||
:to="cta.link"
|
||||
>{{ cta.button }}</g-link
|
||||
>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["cta"],
|
||||
};
|
||||
</script>
|
||||
44
src/components/custom/sections/Comparison.vue
Normal file
44
src/components/custom/sections/Comparison.vue
Normal file
@@ -0,0 +1,44 @@
|
||||
<template>
|
||||
<section class="py-12 px-4 text-center">
|
||||
<h2 class="text-4xl mb-2 leading-tight font-semibold font-heading">
|
||||
{{ main.title }}
|
||||
</h2>
|
||||
<p class="text-gray-600">{{ main.description }}</p>
|
||||
<div class="flex flex-wrap items-center -mx-8 mt-12 mb-2">
|
||||
<div
|
||||
class="lg:w-1/3 px-8 mb-8"
|
||||
v-for="(section, index) in sections"
|
||||
:key="index"
|
||||
>
|
||||
<img
|
||||
class="w-1/2 mx-auto mb-8 h-32"
|
||||
:src="section.svg.src"
|
||||
:alt="section.title"
|
||||
/>
|
||||
<h3 class="text-2xl mb-4 font-semibold font-heading">
|
||||
<span
|
||||
class="inline-flex items-center justify-center h-12 w-12 mr-2 border rounded-full"
|
||||
>{{ index + 1 }}</span
|
||||
>
|
||||
<span>{{ section.title }}</span>
|
||||
</h3>
|
||||
<p class="text-gray-600">
|
||||
{{ section.excerpt }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<g-link
|
||||
class="bg-gray-900 learn-button hover:bg-gray-700 text-gray-100 px-5 py-3 mr-3 font-semibold rounded shadow"
|
||||
:to="main.link"
|
||||
>{{ main.button }}</g-link
|
||||
>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["main", "sections"],
|
||||
};
|
||||
</script>
|
||||
38
src/components/custom/sections/Features.vue
Normal file
38
src/components/custom/sections/Features.vue
Normal file
@@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<section class="py-12 px-4">
|
||||
<h2 class="text-3xl text-center mb-12 font-semibold font-heading">
|
||||
{{ main.title }}
|
||||
</h2>
|
||||
<div class="flex flex-wrap -mx-4 mb-6">
|
||||
<div
|
||||
v-for="feature in features"
|
||||
:key="feature.id"
|
||||
class="lg:w-1/4 px-4 mb-6"
|
||||
>
|
||||
<g-image class="w-10 h-10" :src="feature.svg.src"></g-image>
|
||||
<h3 class="text-xl my-3 font-semibold font-heading">
|
||||
{{ feature.title }}
|
||||
</h3>
|
||||
<p class="text-sm text-gray-600 leading-relaxed">
|
||||
{{ feature.excerpt }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<g-link
|
||||
class="bg-gray-900 learn-button hover:bg-gray-700 text-gray-100 px-5 py-3 mr-3 font-semibold rounded shadow"
|
||||
:to="main.link"
|
||||
>{{ main.btn }}</g-link
|
||||
>
|
||||
<p class="text-sm text-gray-400 mt-5">
|
||||
{{ main.excerpt }}
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["main", "features"]
|
||||
};
|
||||
</script>
|
||||
37
src/components/custom/sections/HowItWorks.vue
Normal file
37
src/components/custom/sections/HowItWorks.vue
Normal file
@@ -0,0 +1,37 @@
|
||||
<template>
|
||||
<section class="py-12 px-4">
|
||||
<div class="flex flex-wrap items-center text-center lg:text-left -mx-2">
|
||||
<div class="lg:w-1/2 px-2">
|
||||
<g-image
|
||||
class="g-image g-image--lazy g-image--loading"
|
||||
:src="main.image.src"
|
||||
:alt="main.title"
|
||||
></g-image>
|
||||
</div>
|
||||
<div class="lg:w-1/2 px-2 lg:pl-16 mt-10 lg:mt-0">
|
||||
<h2 class="text-4xl px-4 mb-4 leading-tight font-semibold font-heading">
|
||||
{{ main.title }}
|
||||
</h2>
|
||||
<div
|
||||
class="p-4 mb-4"
|
||||
:class="{ 'rounded shadow-md': index % 2 !== 0 }"
|
||||
v-for="(howItWorkSec, index) in HIWData"
|
||||
:key="index"
|
||||
>
|
||||
<h3 class="text-2xl mb-2 font-semibold font-heading">
|
||||
{{ howItWorkSec.title }}
|
||||
</h3>
|
||||
<p class="text-gray-600 leading-relaxed">
|
||||
{{ howItWorkSec.excerpt }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["HIWData", "main"],
|
||||
};
|
||||
</script>
|
||||
62
src/components/custom/sections/Roadmap.vue
Normal file
62
src/components/custom/sections/Roadmap.vue
Normal file
@@ -0,0 +1,62 @@
|
||||
<template>
|
||||
<!-- component -->
|
||||
<div class="container bg-gray-200 mx-auto w-full h-full">
|
||||
<div class="relative wrap overflow-hidden p-10 h-full">
|
||||
<div
|
||||
class="border-2-2 absolute border-opacity-20 border-gray-700 h-full border"
|
||||
style="left: 50%"
|
||||
></div>
|
||||
<div
|
||||
v-for="(post, index) in roadmap"
|
||||
:key="index"
|
||||
class="mb-8 flex justify-between items-center w-full"
|
||||
:class="{
|
||||
'flex-row-reverse left-timeline': index % 2 !== 0,
|
||||
'right-timeline': index % 2 == 0,
|
||||
}"
|
||||
>
|
||||
<div class="order-1 w-5/12"></div>
|
||||
<div
|
||||
class="z-20 flex items-center order-1 bg-gray-800 shadow-xl w-8 h-8 rounded-full"
|
||||
>
|
||||
<h1 class="mx-auto font-semibold text-lg text-white">
|
||||
{{ index + 1 }}
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="order-1 rounded-lg shadow-xl w-5/12 px-6 py-4"
|
||||
:class="{
|
||||
'bg-red-400': index % 2 !== 0,
|
||||
'bg-gray-400': index % 2 == 0,
|
||||
}"
|
||||
>
|
||||
<h3
|
||||
class="mb-3 font-bold text-xl"
|
||||
:class="{
|
||||
'text-white': index % 2 !== 0,
|
||||
'text-gray-800': index % 2 == 0,
|
||||
}"
|
||||
>
|
||||
{{ post.title }}
|
||||
</h3>
|
||||
<p
|
||||
class="text-sm leading-snug tracking-wide text-opacity-100"
|
||||
:class="{
|
||||
'text-white': index % 2 !== 0,
|
||||
'text-gray-800': index % 2 == 0,
|
||||
}"
|
||||
>
|
||||
{{ post.excerpt }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["roadmap"],
|
||||
};
|
||||
</script>
|
||||
28
src/components/custom/sections/SignUp.vue
Normal file
28
src/components/custom/sections/SignUp.vue
Normal file
@@ -0,0 +1,28 @@
|
||||
<template>
|
||||
<section class="py-8 px-4">
|
||||
<div class="flex flex-wrap items-center -mx-4">
|
||||
<div class="w-full lg:w-4/6 px-4 mb-8 lg:mb-0 text-center lg:text-left">
|
||||
<h2 class="text-xl font-semibold font-heading">
|
||||
{{ signup.title }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="w-full lg:w-2/6 px-4 text-center">
|
||||
<g-link
|
||||
class="bg-gray-900 learn-button hover:bg-gray-700 text-gray-100 px-5 py-3 mr-3 font-semibold rounded shadow"
|
||||
:to="signup.link1"
|
||||
>{{ signup.button1 }}</g-link
|
||||
><g-link
|
||||
class="text-gray-900 bg-transparent hover:underline"
|
||||
:to="signup.link2"
|
||||
>{{ signup.button2 }}</g-link
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["signup"],
|
||||
};
|
||||
</script>
|
||||
32
src/components/custom/sections/header/HeaderSection.vue
Normal file
32
src/components/custom/sections/header/HeaderSection.vue
Normal file
@@ -0,0 +1,32 @@
|
||||
<template>
|
||||
<section class="py-12 px-4 text-center">
|
||||
<div class="w-full max-w-2xl mx-auto">
|
||||
<span class="text-sm font-semibold">{{ header.title }}</span>
|
||||
<h2 class="text-5xl mt-2 mb-6 leading-tight font-semibold font-heading">
|
||||
{{ header.subtitle }}
|
||||
</h2>
|
||||
<p class="mb-8 text-gray-600 leading-relaxed">
|
||||
{{ header.excerpt }}
|
||||
</p>
|
||||
<div>
|
||||
<g-link
|
||||
class="bg-gray-900 learn-button hover:bg-gray-700 text-gray-100 px-5 py-3 mr-3 font-semibold rounded shadow"
|
||||
v-if="header.btn1"
|
||||
:to="header.link1"
|
||||
>{{ header.btn1 }}</g-link
|
||||
><g-link
|
||||
class="text-gray-900 bg-transparent hover:underline"
|
||||
v-if="header.btn2"
|
||||
:to="header.link2"
|
||||
>{{ header.btn2 }}</g-link
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["header"],
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,52 @@
|
||||
<template>
|
||||
<div class="bg-white">
|
||||
<div class="max-w-screen-xl mx-auto py-16">
|
||||
<div
|
||||
class="brandpanel rounded-lg shadow-xl overflow-hidden lg:grid lg:grid-cols-2 lg:gap-4"
|
||||
>
|
||||
<div
|
||||
class="pt-10 pb-12 px-6 sm:pt-16 sm:px-16 lg:py-16 lg:pr-0 xl:py-20 xl:px-20"
|
||||
>
|
||||
<div class="lg:self-center">
|
||||
<h2
|
||||
class="text-3xl leading-9 font-extrabold text-white sm:text-3xl sm:leading-10"
|
||||
>
|
||||
<span class="block">{{ brand.title }}</span>
|
||||
<span class="block" v-if="brand.subtitle">{{
|
||||
brand.subtitle
|
||||
}}</span>
|
||||
</h2>
|
||||
<p class="mt-4 text-lg leading-6 text-white">
|
||||
{{ brand.excerpt }}
|
||||
</p>
|
||||
<g-link
|
||||
:to="brand.sourceUrl"
|
||||
class="mt-8 bg-white border border-transparent rounded-md shadow px-6 py-3 inline-flex items-center text-base leading-6 font-medium text-gray-900 hover:text-indigo-500 hover:bg-gray-50 transition duration-150 ease-in-out"
|
||||
>{{ brand.btnTxt }}</g-link
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relative pb-3/5 -mt-6 md:pb-1/2">
|
||||
<g-image
|
||||
class="absolute brandpanel inset-0 w-full h-full transform translate-x-6 translate-y-6 rounded-md object-cover object-left-top sm:translate-x-16 lg:translate-y-20"
|
||||
:src="image"
|
||||
:alt="brand.title"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["brand"],
|
||||
computed: {
|
||||
image() {
|
||||
return this.brand.image.src
|
||||
? this.brand.image.src
|
||||
: require(`!!assets-loader!@images/brandPanel/${this.brand.image}`);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
280
src/components/marketing/sections/cta-sections/Footer.vue
Normal file
280
src/components/marketing/sections/cta-sections/Footer.vue
Normal file
@@ -0,0 +1,280 @@
|
||||
<!--
|
||||
Tailwind UI components require Tailwind CSS v1.8 and the @tailwindcss/ui plugin.
|
||||
Read the documentation to get started: https://tailwindui.com/documentation
|
||||
-->
|
||||
<template>
|
||||
<footer class="bg-white">
|
||||
<div class="max-w-screen-xl mx-auto py-12 px-4 sm:px-6 lg:py-16 lg:px-8">
|
||||
<div class="xl:grid xl:grid-cols-3 xl:gap-8">
|
||||
<div class="space-y-8 xl:col-span-1">
|
||||
<img
|
||||
class="h-10"
|
||||
src="/img/tf_icon_black.svg"
|
||||
alt="Company name"
|
||||
v-if="theme == 'light'"
|
||||
/>
|
||||
|
||||
<img
|
||||
class="h-10"
|
||||
src="/img/tf_icon_white.svg"
|
||||
alt="Company name"
|
||||
v-else
|
||||
/>
|
||||
|
||||
<p class="text-gray-500 text-base leading-6">
|
||||
{{ record.description }}
|
||||
</p>
|
||||
<div class="flex space-x-6">
|
||||
<a
|
||||
v-if="record.facebook != '#'"
|
||||
:href="record.facebook"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
>
|
||||
<span class="sr-only">Facebook</span>
|
||||
<svg
|
||||
class="h-6 w-6"
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.878v-6.987h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.988C18.343 21.128 22 16.991 22 12z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
<a
|
||||
v-if="record.instagram != '#'"
|
||||
:href="record.instagram"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
>
|
||||
<span class="sr-only">Instagram</span>
|
||||
<svg
|
||||
class="h-6 w-6"
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.047-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
<a
|
||||
v-if="record.twitter != '#'"
|
||||
:href="record.twitter"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
>
|
||||
<span class="sr-only">Twitter</span>
|
||||
<svg
|
||||
class="h-6 w-6"
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
<a
|
||||
v-if="record.github != '#'"
|
||||
:href="record.github"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
>
|
||||
<span class="sr-only">GitHub</span>
|
||||
<svg
|
||||
class="h-6 w-6"
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
<a
|
||||
v-if="record.dribbble != '#'"
|
||||
:href="record.dribbble"
|
||||
class="text-gray-400 hover:text-gray-500"
|
||||
>
|
||||
<span class="sr-only">Dribbble</span>
|
||||
<svg
|
||||
class="h-6 w-6"
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10c5.51 0 10-4.48 10-10S17.51 2 12 2zm6.605 4.61a8.502 8.502 0 011.93 5.314c-.281-.054-3.101-.629-5.943-.271-.065-.141-.12-.293-.184-.445a25.416 25.416 0 00-.564-1.236c3.145-1.28 4.577-3.124 4.761-3.362zM12 3.475c2.17 0 4.154.813 5.662 2.148-.152.216-1.443 1.941-4.48 3.08-1.399-2.57-2.95-4.675-3.189-5A8.687 8.687 0 0112 3.475zm-3.633.803a53.896 53.896 0 013.167 4.935c-3.992 1.063-7.517 1.04-7.896 1.04a8.581 8.581 0 014.729-5.975zM3.453 12.01v-.26c.37.01 4.512.065 8.775-1.215.25.477.477.965.694 1.453-.109.033-.228.065-.336.098-4.404 1.42-6.747 5.303-6.942 5.629a8.522 8.522 0 01-2.19-5.705zM12 20.547a8.482 8.482 0 01-5.239-1.8c.152-.315 1.888-3.656 6.703-5.337.022-.01.033-.01.054-.022a35.318 35.318 0 011.823 6.475 8.4 8.4 0 01-3.341.684zm4.761-1.465c-.086-.52-.542-3.015-1.659-6.084 2.679-.423 5.022.271 5.314.369a8.468 8.468 0 01-3.655 5.715z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="mt-12 grid md:grid-cols-4 sm:grid-cols-2 xl:mt-0 xl:col-span-2"
|
||||
>
|
||||
<!-- class="mt-12 grid grid-cols-2 gap-8 xl:mt-0 xl:col-span-2" -->
|
||||
|
||||
<div
|
||||
v-for="footerLink in record.items"
|
||||
:key="footerLink.title"
|
||||
class="md:grid md:grid-cols-3"
|
||||
>
|
||||
<div>
|
||||
<h4
|
||||
class="text-sm leading-5 font-semibold text-gray-400 tracking-wider uppercase"
|
||||
>
|
||||
{{ footerLink.title }}
|
||||
</h4>
|
||||
<ul class="mt-4 space-y-4">
|
||||
<li v-for="item in footerLink.links" :key="item.name">
|
||||
<a
|
||||
v-if="item.link.includes('http')"
|
||||
target="_blank"
|
||||
:href="item.link"
|
||||
class="text-base leading-6 text-gray-500 hover:text-gray-900"
|
||||
>
|
||||
{{ item.name }}
|
||||
</a>
|
||||
|
||||
<a
|
||||
v-else
|
||||
:href="item.link"
|
||||
class="text-base leading-6 text-gray-500 hover:text-gray-900"
|
||||
>
|
||||
{{ item.name }}
|
||||
</a>
|
||||
</li>
|
||||
<!-- <li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Analytics
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Commerce
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Insights
|
||||
</a>
|
||||
</li> -->
|
||||
</ul>
|
||||
</div>
|
||||
<!-- <div class="mt-12 md:mt-0">
|
||||
<h4 class="text-sm leading-5 font-semibold text-gray-400 tracking-wider uppercase">
|
||||
Support
|
||||
</h4>
|
||||
<ul class="mt-4 space-y-4">
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Pricing
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Documentation
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Guides
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
API Status
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div> -->
|
||||
</div>
|
||||
<!-- <div class="md:grid md:grid-cols-2 md:gap-8">
|
||||
<div>
|
||||
<h4 class="text-sm leading-5 font-semibold text-gray-400 tracking-wider uppercase">
|
||||
Company
|
||||
</h4>
|
||||
<ul class="mt-4 space-y-4">
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Blog
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Jobs
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Press
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Partners
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="mt-12 md:mt-0">
|
||||
<h4 class="text-sm leading-5 font-semibold text-gray-400 tracking-wider uppercase">
|
||||
Legal
|
||||
</h4>
|
||||
<ul class="mt-4 space-y-4">
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Claim
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Privacy
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-base leading-6 text-gray-500 hover:text-gray-900">
|
||||
Terms
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-12 border-t border-gray-200 pt-8">
|
||||
<p class="text-base leading-6 text-gray-400 xl:text-center">
|
||||
© 2020 Workflow, Inc. All rights reserved.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["record", "theme"],
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
</style>
|
||||
34
src/components/marketing/sections/cta-sections/Header.vue
Normal file
34
src/components/marketing/sections/cta-sections/Header.vue
Normal file
@@ -0,0 +1,34 @@
|
||||
<template>
|
||||
<section class="py-12 px-4">
|
||||
<div class="flex flex-wrap items-center text-center lg:text-left -mx-2">
|
||||
<div class="lg:w-1/2 px-2 lg:pr-10 mt-10 lg:mt-0 order-1 lg:order-none">
|
||||
<h2 class="text-4xl mb-6 leading-tight font-semibold font-heading">
|
||||
{{ title }}
|
||||
</h2>
|
||||
<p class="mb-8 text-gray-700 leading-relaxed">{{ excerpt }}</p>
|
||||
<div v-if="button">
|
||||
<a
|
||||
class="inline-block py-4 px-8 mr-6 leading-none text-white bg-gray-900 hover:bg-gray-700 font-semibold rounded shadow"
|
||||
:href="link"
|
||||
>{{ button }}</a
|
||||
>
|
||||
<!-- <a class="text-gray-600 hover:underline" href="#">Learn more</a> -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="lg:w-1/2 px-2"><img :src="img" :alt="altImg" /></div>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["title", "excerpt", "altImg", "image", "button", "link"],
|
||||
computed: {
|
||||
img: function () {
|
||||
if (!this.image) return "";
|
||||
if (this.image.src) return this.image.src;
|
||||
return this.image;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
34
src/components/marketing/sections/cta-sections/NewCard.vue
Normal file
34
src/components/marketing/sections/cta-sections/NewCard.vue
Normal file
@@ -0,0 +1,34 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="lg:py-12 lg:flex lg:justify-center flex flex-col">
|
||||
<div class="bg-white lg:mx-8 lg:flex lg:max-w-5xl lg:shadow-lg lg:rounded-lg">
|
||||
<div class="lg:w-1/2">
|
||||
<div class="h-64 bg-cover lg:rounded-lg lg:h-full" :style="img"></div>
|
||||
</div>
|
||||
<div class="py-12 px-6 max-w-xl lg:max-w-5xl lg:w-1/2">
|
||||
<h2 class="text-3xl text-gray-700 font-bold">{{ card.title }}</h2>
|
||||
<p class="mt-4 text-gray-700">{{ card.excerpt }}</p>
|
||||
<div class="mt-8" v-if="card.link">
|
||||
<a :href="card.link" class="bg-gray-900 learn-button hover:bg-gray-700 text-gray-100 px-5 py-3 font-semibold rounded">{{ card.button }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
computed: {
|
||||
img: function(){
|
||||
if(this.card.image.src)
|
||||
return "background-image:url(" + this.card.image.src + ")"
|
||||
return this.card.image
|
||||
}
|
||||
},
|
||||
|
||||
props: ["card"],
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,51 @@
|
||||
<template>
|
||||
<div>
|
||||
<div
|
||||
class="bannerFondo bg-green-800 bg-left-top bg-auto bg-repeat-x"
|
||||
style="background-image: url(./img/continuartl_4.png)"
|
||||
></div>
|
||||
|
||||
<div class="-mt-64">
|
||||
<div class="w-full text-center">
|
||||
<p class="text-sm tracking-widest text-white">{{ main.subtitle }}</p>
|
||||
<h1 class="font-bold text-5xl text-white">{{ main.title }}</h1>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-4 sm:grid-cols-3">
|
||||
<div
|
||||
v-for="(product, idx) in products"
|
||||
:key="idx"
|
||||
class="p-2 sm:p-10 text-center cursor-pointer"
|
||||
>
|
||||
<div
|
||||
class="py-16 max-w-sm rounded overflow-hidden shadow-lg hover:bg-white transition duration-500 bg-white"
|
||||
>
|
||||
<div class="space-y-10">
|
||||
<i class="fa fa-spa" style="font-size: 48px"></i>
|
||||
|
||||
<div class="px-6 py-4">
|
||||
<div class="space-y-5">
|
||||
<div class="font-bold text-xl mb-2">{{ product.title }}</div>
|
||||
<p class="text-gray-700 text-base">{{ product.excerpt }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["products", "main"],
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.bannerFondo {
|
||||
height: 400px;
|
||||
}
|
||||
</style>
|
||||
27
src/components/marketing/sections/cta-sections/home_card.vue
Normal file
27
src/components/marketing/sections/cta-sections/home_card.vue
Normal file
@@ -0,0 +1,27 @@
|
||||
<template>
|
||||
<section class="py-0 my-10 px-0 shadow-xl bg-white ">
|
||||
<div class="flex flex-wrap items-center -mx-8">
|
||||
<div class="w-1/3 pl-8">
|
||||
<img class="object-cover" :src="img" :alt="imgAlt"/>
|
||||
</div>
|
||||
<div class="w-2/3 px-20 text-left">
|
||||
<h2 class="text-4xl font-semibold font-tf-secondary">{{ header }}</h2>
|
||||
<p class="mt-6 mb-8 text-gray-400 leading-relaxed">{{ subtitle }} <br> can benifit everyone on the planet.</p>
|
||||
<div class="flex ml-52 duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-105">
|
||||
<a href="#">
|
||||
<svg class="fill-current text-green-600 h-11 w-11 " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 430.04 315.72"><title>Arrows</title><path class="cls-1" d="M46.17,96.56l84.05,0a18.74,18.74,0,0,1,19.7,9.16L274.84,244.54a14.64,14.64,0,0,1,3.74,11,14.24,14.24,0,0,1-3.74,8.19L149.26,402.36a17.41,17.41,0,0,1-19.78,9.14l-83.7.5c-.48-.14-8.05-2.47-10.24-10.14a15.37,15.37,0,0,1,2.22-12.61L159,254.1,36.28,116.58c-.28-.65-3-7.18.79-13.43A14.9,14.9,0,0,1,46.17,96.56Z" transform="translate(-35 -96.28)"/><path class="cls-1" d="M232.57,96.56l84.05,0a18.74,18.74,0,0,1,19.7,9.16L461.24,244.54a14.69,14.69,0,0,1,3.73,11,14.25,14.25,0,0,1-3.73,8.19L335.65,402.36a17.39,17.39,0,0,1-19.77,9.14l-83.71.5c-.47-.14-8-2.47-10.23-10.14a15.37,15.37,0,0,1,2.22-12.61L345.39,254.1,222.68,116.58c-.28-.65-3-7.18.79-13.43A14.9,14.9,0,0,1,232.57,96.56Z" transform="translate(-35 -96.28)"/></svg>
|
||||
</a><a class="inline-block text-green-600 hover:underline py-2 ml-6 uppercase text-right font-bold" href="#">{{ link_text }}</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["header", "subtitle","link_text","img","imgAlt"],
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,29 @@
|
||||
<template>
|
||||
<section class="pt-8 px-4 text-center">
|
||||
<div class="max-w-2xl mx-auto mb-8">
|
||||
<h2 class="text-4xl leading-tight mb-6 font-semibold font-heading">Our Partners</h2>
|
||||
<p class="text-gray-400 leading-relaxed"></p>
|
||||
</div>
|
||||
<div class="flex flex-wrap -mx-8">
|
||||
<div v-for="(logo ,idx) in logos" :key="idx" class="w-1/2 md:w-1/6 px-8 mb-8">
|
||||
<img :src="logo.image.src" alt />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["logos"],
|
||||
computed: {
|
||||
img: function() {
|
||||
if (!this.image) return "";
|
||||
if (this.image.src) return this.image.src;
|
||||
return this.image;
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<template>
|
||||
<section class="py-12 px-4 text-center">
|
||||
<h2 class="text-4xl mb-2 leading-tight font-semibold font-heading">THREEFOLD TEAM</h2>
|
||||
|
||||
<p class="max-w-xl mx-auto mb-12 text-gray-400">The heartbeat behind the ThreeFold Movement.</p>
|
||||
<div class="flex max-w-lg mb-12 mx-auto text-center border-b-2">
|
||||
|
||||
<div v-for="(filter, index) in filters" :key="filter" class="w-1/3 pb-2">
|
||||
<button v-if="index == 0" class="w-1/3 pb-2 border-b-4 border-indigo-600">{{ filter }}</button>
|
||||
<button v-if="index != 0" class="hover:text-indigo-600">{{ filter }}</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="flex flex-wrap -mx-4">
|
||||
|
||||
<div v-for="person in people" :key="person.id" class="w-1/2 lg:w-1/4 p-4">
|
||||
<img class="w-1/2 mx-auto mb-4 rounded-full" :src="person.img" :alt="person.imgAlt">
|
||||
<h3 class="text-xl mb-1 font-semibold font-heading font-semibold">{{ person.name }}</h3>
|
||||
<span>{{ person.title }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
people: Array,
|
||||
filters: Array
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,27 @@
|
||||
<template>
|
||||
<div class="py-12 bg-white">
|
||||
|
||||
<div class="max-w-xl mx-auto px-4 sm:px-6 lg:max-w-screen-xl lg:px-8">
|
||||
<h2 class="text-gray-500">Next Events</h2>
|
||||
<div class="lg:grid lg:grid-cols-2 lg:gap-8">
|
||||
<a href="#">
|
||||
<div class="mt-5 px-10 mt-10 py-4 border-l-2 border-gray-200">
|
||||
<a href="#"><h3 class="leading-6 font-medium text-gray-700 hover:text-blue-500">{{ title1 }}</h3></a>
|
||||
<p class="mt-2 text-lg leading-6 text-gray-400">
|
||||
{{ subtitle1 }}
|
||||
</p>
|
||||
<p class="leading-6 font-medium text-gray-600">{{ date }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["title1", "subtitle1","date"],
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,36 @@
|
||||
<template>
|
||||
<div class="bg-white">
|
||||
<div class="max-w-screen-xl mx-auto py-12 px-4 sm:px-6 lg:py-16 lg:px-8">
|
||||
<p
|
||||
class="text-center text-base leading-6 font-semibold uppercase text-gray-600 tracking-wider"
|
||||
>
|
||||
{{ news.excerpt }}
|
||||
</p>
|
||||
<div class="mt-6 grid grid-cols-2 gap-0.5 md:grid-cols-3 lg:mt-8">
|
||||
<g-link
|
||||
v-for="partner in news.partners"
|
||||
:key="partner.id"
|
||||
:to="partner.path"
|
||||
target="_blank"
|
||||
class="col-span-1 flex justify-center py-8 px-8 m-1 bg-gray-100"
|
||||
>
|
||||
<!-- <img
|
||||
class="max-h-12"
|
||||
:src="require(`!!assets-loader!@images/${partner.logo}`)"
|
||||
/> -->
|
||||
|
||||
<img
|
||||
class="max-h-12"
|
||||
:src="partner.logo"
|
||||
/>
|
||||
</g-link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["news"],
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,103 @@
|
||||
<template>
|
||||
<div class="bg-white">
|
||||
<div class="max-w-screen-xl mx-auto py-24 px-4 sm:px-6 lg:px-8">
|
||||
<div class="sm:flex sm:flex-col sm:align-center">
|
||||
<h1
|
||||
class="text-5xl leading-none font-extrabold text-gray-900 sm:text-center"
|
||||
>
|
||||
{{ main.title }}
|
||||
</h1>
|
||||
<p class="mt-5 text-xl leading-7 text-gray-500 sm:text-center">
|
||||
{{ main.excerpt }}
|
||||
</p>
|
||||
<div
|
||||
class="relative self-center mt-6 bg-gray-100 rounded-lg p-0.5 flex sm:mt-8"
|
||||
>
|
||||
<button
|
||||
type="button"
|
||||
class="relative w-1/2 bg-white border-gray-200 rounded-md shadow-sm py-2 text-sm leading-5 font-medium text-gray-700 whitespace-no-wrap hover:text-gray-500 focus:outline-none focus:border-blue-300 focus:shadow-outline-blue focus:z-10 active:bg-gray-50 active:text-gray-800 transition ease-in-out duration-150 sm:w-auto sm:px-8"
|
||||
>
|
||||
{{ main.button1 }}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="relative w-1/2 border border-transparent rounded-md py-2 text-sm leading-5 font-medium text-gray-700 whitespace-no-wrap hover:text-gray-500 focus:outline-none focus:border-blue-300 focus:shadow-outline-blue focus:z-10 active:bg-gray-50 active:text-gray-800 transition ease-in-out duration-150 sm:w-auto sm:px-8"
|
||||
>
|
||||
{{ main.button2 }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="mt-12 space-y-4 sm:mt-16 sm:space-y-0 sm:grid sm:grid-cols-2 sm:gap-6 lg:max-w-4xl lg:mx-auto xl:max-w-none xl:mx-0 xl:grid-cols-4"
|
||||
>
|
||||
<div
|
||||
v-for="(plan, index) in pricingPlans"
|
||||
:key="index"
|
||||
class="border border-gray-200 rounded-lg shadow-sm divide-y divide-gray-200"
|
||||
>
|
||||
<div class="p-6">
|
||||
<h2 class="text-lg leading-6 font-medium text-gray-900">
|
||||
{{ plan.title }}
|
||||
</h2>
|
||||
<p class="mt-4 text-sm leading-5 text-gray-500">
|
||||
{{ plan.excerpt }}
|
||||
</p>
|
||||
<p class="mt-8">
|
||||
<span class="text-4xl leading-10 font-extrabold text-gray-900">{{
|
||||
plan.price
|
||||
}}</span>
|
||||
<span class="text-base leading-6 font-medium text-gray-500"
|
||||
>/{{ plan.duration }}</span
|
||||
>
|
||||
</p>
|
||||
<g-link
|
||||
type="button"
|
||||
:to="plan.link"
|
||||
class="mt-8 w-full text-center bg-gray-800 border border-gray-800 rounded-md py-2 text-sm leading-5 font-semibold text-white hover:bg-gray-700 focus:outline-none focus:shadow-outline-gray transition duration-150 ease-in-out"
|
||||
>
|
||||
{{ plan.button }}
|
||||
</g-link>
|
||||
</div>
|
||||
<div class="pt-6 pb-8 px-6">
|
||||
<h3
|
||||
class="text-xs leading-4 font-medium text-gray-900 tracking-wide uppercase"
|
||||
>
|
||||
{{ plan.includeTitle }}
|
||||
</h3>
|
||||
<ul class="mt-6 space-y-4">
|
||||
<li
|
||||
class="flex space-x-3"
|
||||
v-for="option in plan.options"
|
||||
:key="option.id"
|
||||
>
|
||||
<!-- Heroicon name: check -->
|
||||
<svg
|
||||
class="flex-shrink-0 h-5 w-5 text-green-500"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span class="text-sm leading-5 text-gray-500">{{
|
||||
option
|
||||
}}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["main", "pricingPlans"],
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,343 @@
|
||||
<template>
|
||||
<div class="bg-white">
|
||||
<div
|
||||
class="max-w-screen-xl mx-auto bg-white py-16 sm:py-24 sm:px-6 lg:px-8"
|
||||
>
|
||||
<!-- xs to lg -->
|
||||
<div class="max-w-2xl mx-auto lg:hidden">
|
||||
<table class="mt-8 w-full" v-for="plan in plans" :key="plan.id">
|
||||
<caption
|
||||
class="bg-gray-100 border-t border-gray-200 py-3 px-4 text-sm leading-5 font-medium text-gray-900 text-left"
|
||||
>
|
||||
{{
|
||||
plan.title
|
||||
}}
|
||||
</caption>
|
||||
|
||||
<tbody
|
||||
class="divide-y divide-gray-200"
|
||||
v-for="plan in plan.rows"
|
||||
:key="plan.id"
|
||||
>
|
||||
<tr class="border-t border-gray-200">
|
||||
<th
|
||||
class="py-5 px-4 text-sm leading-5 font-normal text-gray-500 text-left"
|
||||
scope="row"
|
||||
>
|
||||
{{ plan.title }}
|
||||
</th>
|
||||
<td class="py-5 pr-4" v-if="plan.firstCol == 'include'">
|
||||
<!-- Heroicon name: check -->
|
||||
<svg
|
||||
class="ml-auto h-5 w-5 text-green-500"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sr-only">Yes</span>
|
||||
</td>
|
||||
<td class="py-5 pr-4" v-else-if="plan.firstCol == 'none'">
|
||||
<!-- Heroicon name: minus -->
|
||||
<svg
|
||||
class="ml-auto h-5 w-5 text-gray-400"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sr-only">No</span>
|
||||
</td>
|
||||
<td class="py-5 pr-4" v-else>
|
||||
<span
|
||||
class="block text-sm leading-5 text-gray-700 text-right"
|
||||
>{{ plan.firstCol }}</span
|
||||
>
|
||||
</td>
|
||||
|
||||
<td class="py-5 pr-4" v-if="plan.secCol == 'include'">
|
||||
<!-- Heroicon name: check -->
|
||||
<svg
|
||||
class="ml-auto h-5 w-5 text-green-500"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sr-only">Yes</span>
|
||||
</td>
|
||||
<td class="py-5 pr-4" v-else-if="plan.secCol == 'none'">
|
||||
<!-- Heroicon name: minus -->
|
||||
<svg
|
||||
class="ml-auto h-5 w-5 text-gray-400"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sr-only">No</span>
|
||||
</td>
|
||||
<td class="py-5 pr-4" v-else>
|
||||
<span
|
||||
class="block text-sm leading-5 text-gray-700 text-right"
|
||||
>{{ plan.secCol }}</span
|
||||
>
|
||||
</td>
|
||||
|
||||
<td class="py-5 pr-4" v-if="plan.thirdCol == 'include'">
|
||||
<!-- Heroicon name: check -->
|
||||
<svg
|
||||
class="ml-auto h-5 w-5 text-green-500"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sr-only">Yes</span>
|
||||
</td>
|
||||
<td class="py-5 pr-4" v-else-if="plan.thirdCol == 'none'">
|
||||
<!-- Heroicon name: minus -->
|
||||
<svg
|
||||
class="ml-auto h-5 w-5 text-gray-400"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sr-only">No</span>
|
||||
</td>
|
||||
<td class="py-5 pr-4" v-else>
|
||||
<span
|
||||
class="block text-sm leading-5 text-gray-700 text-right"
|
||||
>{{ plan.thirdCol }}</span
|
||||
>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- lg+ -->
|
||||
<div class="hidden lg:block">
|
||||
<table class="w-full h-px table-fixed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th
|
||||
class="pb-4 px-6 text-sm leading-5 font-medium text-gray-900 text-left"
|
||||
scope="col"
|
||||
>
|
||||
<span class="sr-only">Feature by</span>
|
||||
<span>Plans</span>
|
||||
</th>
|
||||
|
||||
<th
|
||||
class="w-1/4 pb-4 px-6 text-lg leading-6 font-medium text-gray-900 text-left"
|
||||
scope="col"
|
||||
>
|
||||
Basic
|
||||
</th>
|
||||
|
||||
<th
|
||||
class="w-1/4 pb-4 px-6 text-lg leading-6 font-medium text-gray-900 text-left"
|
||||
scope="col"
|
||||
>
|
||||
Essential
|
||||
</th>
|
||||
|
||||
<th
|
||||
class="w-1/4 pb-4 px-6 text-lg leading-6 font-medium text-gray-900 text-left"
|
||||
scope="col"
|
||||
>
|
||||
Premium
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody
|
||||
class="border-t border-gray-200 divide-y divide-gray-200"
|
||||
v-for="plan in plans"
|
||||
:key="plan.id"
|
||||
>
|
||||
<tr>
|
||||
<th
|
||||
class="bg-gray-100 py-3 pl-6 text-sm leading-5 font-medium text-gray-900 text-left"
|
||||
colspan="4"
|
||||
scope="colgroup"
|
||||
>
|
||||
{{ plan.title }}
|
||||
</th>
|
||||
</tr>
|
||||
|
||||
<tr v-for="plan in plan.rows" :key="plan.id">
|
||||
<th
|
||||
class="py-5 px-6 text-sm leading-5 font-normal text-gray-500 text-left"
|
||||
scope="row"
|
||||
>
|
||||
{{ plan.title }}
|
||||
</th>
|
||||
<td class="py-5 px-6" v-if="plan.firstCol == 'include'">
|
||||
<!-- Heroicon name: check -->
|
||||
<svg
|
||||
class="h-5 w-5 text-green-500"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</td>
|
||||
<td class="py-5 px-6" v-else-if="plan.firstCol == 'none'">
|
||||
<!-- Heroicon name: minus -->
|
||||
<svg
|
||||
class="h-5 w-5 text-gray-400"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</td>
|
||||
<td class="py-5 px-6" v-else>
|
||||
<span class="block text-sm leading-5 text-gray-700">{{
|
||||
plan.firstCol
|
||||
}}</span>
|
||||
</td>
|
||||
<td class="py-5 px-6" v-if="plan.secCol == 'include'">
|
||||
<!-- Heroicon name: check -->
|
||||
<svg
|
||||
class="h-5 w-5 text-green-500"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sr-only">Included in Essential</span>
|
||||
</td>
|
||||
|
||||
<td class="py-5 px-6" v-else-if="plan.secCol == 'none'">
|
||||
<!-- Heroicon name: minus -->
|
||||
<svg
|
||||
class="h-5 w-5 text-gray-400"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</td>
|
||||
|
||||
<td class="py-5 px-6" v-else>
|
||||
<span class="block text-sm leading-5 text-gray-700">{{
|
||||
plan.secCol
|
||||
}}</span>
|
||||
</td>
|
||||
|
||||
<td class="py-5 px-6" v-if="plan.thirdCol == 'include'">
|
||||
<!-- Heroicon name: check -->
|
||||
<svg
|
||||
class="h-5 w-5 text-green-500"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sr-only">Included in Premium</span>
|
||||
</td>
|
||||
|
||||
<td class="py-5 px-6" v-else-if="plan.thirdCol == 'none'">
|
||||
<svg
|
||||
class="h-5 w-5 text-gray-400"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</td>
|
||||
|
||||
<td class="py-5 px-6" v-else>
|
||||
<span class="block text-sm leading-5 text-gray-700">{{
|
||||
plan.thirdCol
|
||||
}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["plans"],
|
||||
};
|
||||
</script>
|
||||
24
src/components/vacationcard/VacationCard.vue
Normal file
24
src/components/vacationcard/VacationCard.vue
Normal file
@@ -0,0 +1,24 @@
|
||||
<template>
|
||||
<div>
|
||||
<img class="rounded" :src="img" :alt="imgAlt" />
|
||||
<div class="mt-2">
|
||||
<div>
|
||||
<div class="text-xs text-gray-600 uppercase font-bold">
|
||||
{{ eyebrow }}
|
||||
</div>
|
||||
<div class="font-bold text-gray-700 leading-snug">
|
||||
<a :href="url" class="hover:underline">{{ title }}</a>
|
||||
</div>
|
||||
<div class="mt-2 text-sm text-gray-600">{{ pricing }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- TODO: how do I get markdown in here? -->
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ["img", "imgAlt", "eyebrow", "title", "pricing", "url"],
|
||||
};
|
||||
</script>
|
||||
Reference in New Issue
Block a user