add accordtion
@@ -1,7 +1,6 @@
|
|||||||
// @ts-check
|
// @ts-check
|
||||||
import { defineConfig } from 'astro/config'
|
import { defineConfig } from 'astro/config'
|
||||||
|
|
||||||
import react from '@astrojs/react'
|
|
||||||
import tailwindcss from '@tailwindcss/vite'
|
import tailwindcss from '@tailwindcss/vite'
|
||||||
import partytown from '@astrojs/partytown'
|
import partytown from '@astrojs/partytown'
|
||||||
import sitemap from '@astrojs/sitemap'
|
import sitemap from '@astrojs/sitemap'
|
||||||
@@ -12,7 +11,6 @@ import icon from 'astro-icon'
|
|||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
site: 'https://eduseg.com.br',
|
site: 'https://eduseg.com.br',
|
||||||
integrations: [
|
integrations: [
|
||||||
react(),
|
|
||||||
sitemap(),
|
sitemap(),
|
||||||
icon(),
|
icon(),
|
||||||
alpinejs(),
|
alpinejs(),
|
||||||
|
|||||||
856
superpage/package-lock.json
generated
@@ -11,24 +11,14 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/alpinejs": "^0.4.6",
|
"@astrojs/alpinejs": "^0.4.6",
|
||||||
"@astrojs/partytown": "^2.1.4",
|
"@astrojs/partytown": "^2.1.4",
|
||||||
"@astrojs/react": "^4.2.1",
|
|
||||||
"@astrojs/sitemap": "^3.3.0",
|
"@astrojs/sitemap": "^3.3.0",
|
||||||
"@fontsource/roboto": "^5.2.5",
|
"@fontsource/roboto": "^5.2.5",
|
||||||
"@headlessui/react": "^2.2.1",
|
|
||||||
"@heroicons/react": "^2.2.0",
|
|
||||||
"@tailwindcss/vite": "^4.0.13",
|
"@tailwindcss/vite": "^4.0.13",
|
||||||
"@tanstack/react-query": "^5.68.0",
|
|
||||||
"@types/alpinejs": "^3.13.11",
|
"@types/alpinejs": "^3.13.11",
|
||||||
"@types/react": "^19.0.10",
|
|
||||||
"@types/react-dom": "^19.0.4",
|
|
||||||
"alpinejs": "^3.14.9",
|
"alpinejs": "^3.14.9",
|
||||||
"astro": "^5.7.2",
|
"astro": "^5.7.2",
|
||||||
"astro-icon": "^1.1.5",
|
"astro-icon": "^1.1.5",
|
||||||
"axios": "^1.8.3",
|
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"react": "^19.0.0",
|
|
||||||
"react-dom": "^19.0.0",
|
|
||||||
"react-hook-form": "^7.54.2",
|
|
||||||
"tailwindcss": "^4.0.13"
|
"tailwindcss": "^4.0.13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
---
|
---
|
||||||
import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/24/solid'
|
import { Icon } from 'astro-icon/components'
|
||||||
|
|
||||||
const { items = [] } = Astro.props
|
const { items = [] } = Astro.props
|
||||||
---
|
---
|
||||||
|
|
||||||
<div id="carousel" class="relative">
|
<div id="carousel" class="relative">
|
||||||
<button id="prev" class="inset-y-0 left-0 px-1.5 bg-white/10 absolute cursor-pointer lg:hidden z-10">
|
<button id="prev" class="inset-y-0 left-0 px-1.5 bg-white/10 absolute cursor-pointer lg:hidden z-1">
|
||||||
<ChevronLeftIcon className="w-6" />
|
<Icon name="chevron-left" class="size-6" />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button id="next" class="inset-y-0 right-0 px-1.5 bg-white/10 absolute cursor-pointer lg:hidden z-10">
|
<button id="next" class="inset-y-0 right-0 px-1.5 bg-white/10 absolute cursor-pointer lg:hidden z-1">
|
||||||
<ChevronRightIcon className="w-6" />
|
<Icon name="chevron-right" class="size-6" />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -18,7 +18,7 @@ const { items = [] } = Astro.props
|
|||||||
>
|
>
|
||||||
{
|
{
|
||||||
items.map((Component, idx) => (
|
items.map((Component, idx) => (
|
||||||
<div class="snap-center flex-shrink-0 max-lg:w-full flex justify-center itens-center z-0">
|
<div class="snap-center flex-shrink-0 max-lg:w-full flex justify-center itens-center">
|
||||||
<Component class="size-48 lg:size-38 fill-white" id={`slide${idx + 1}`} />
|
<Component class="size-48 lg:size-38 fill-white" id={`slide${idx + 1}`} />
|
||||||
</div>
|
</div>
|
||||||
))
|
))
|
||||||
@@ -31,7 +31,7 @@ const { items = [] } = Astro.props
|
|||||||
const slides = carousel.querySelectorAll('.snap-center')
|
const slides = carousel.querySelectorAll('.snap-center')
|
||||||
let currentIndex = 0
|
let currentIndex = 0
|
||||||
|
|
||||||
const scrollToSlide = (index) => {
|
const scrollToSlide = (index: number) => {
|
||||||
if (index >= 0 && index < slides.length) {
|
if (index >= 0 && index < slides.length) {
|
||||||
slides[index].scrollIntoView({
|
slides[index].scrollIntoView({
|
||||||
behavior: 'smooth',
|
behavior: 'smooth',
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import Container from './Container.astro'
|
|||||||
---
|
---
|
||||||
|
|
||||||
<nav
|
<nav
|
||||||
class="bg-lime-400 sticky top-0 z-20 py-3 drop-shadow shadow-sm"
|
class="bg-lime-400 sticky top-0 z-10 py-3 drop-shadow shadow-sm"
|
||||||
x-data="{ open: false }"
|
x-data="{ open: false }"
|
||||||
x-on:keydown.esc.prevent.stop="open = false"
|
x-on:keydown.esc.prevent.stop="open = false"
|
||||||
>
|
>
|
||||||
|
|||||||
3
superpage/src/icons/check-badge.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
||||||
|
<path fill-rule="evenodd" d="M8.603 3.799A4.49 4.49 0 0 1 12 2.25c1.357 0 2.573.6 3.397 1.549a4.49 4.49 0 0 1 3.498 1.307 4.491 4.491 0 0 1 1.307 3.497A4.49 4.49 0 0 1 21.75 12a4.49 4.49 0 0 1-1.549 3.397 4.491 4.491 0 0 1-1.307 3.497 4.491 4.491 0 0 1-3.497 1.307A4.49 4.49 0 0 1 12 21.75a4.49 4.49 0 0 1-3.397-1.549 4.49 4.49 0 0 1-3.498-1.306 4.491 4.491 0 0 1-1.307-3.498A4.49 4.49 0 0 1 2.25 12c0-1.357.6-2.573 1.549-3.397a4.49 4.49 0 0 1 1.307-3.497 4.49 4.49 0 0 1 3.497-1.307Zm7.007 6.387a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 724 B |
3
superpage/src/icons/chevron-left.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 19.5 8.25 12l7.5-7.5" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 211 B |
3
superpage/src/icons/chevron-right.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 209 B |
3
superpage/src/icons/clock.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 232 B |
3
superpage/src/icons/lock-closed.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H6.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25Z" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 359 B |
3
superpage/src/icons/star.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
||||||
|
<path fill-rule="evenodd" d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.006 5.404.434c1.164.093 1.636 1.545.749 2.305l-4.117 3.527 1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354 7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273-4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.434 2.082-5.005Z" clip-rule="evenodd" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 431 B |
@@ -1,8 +1,4 @@
|
|||||||
---
|
---
|
||||||
export interface Props {
|
|
||||||
title: string
|
|
||||||
}
|
|
||||||
|
|
||||||
import '@fontsource/roboto'
|
import '@fontsource/roboto'
|
||||||
import '~/styles/app.css'
|
import '~/styles/app.css'
|
||||||
import Logo from '~/components/logos/Eduseg.astro'
|
import Logo from '~/components/logos/Eduseg.astro'
|
||||||
@@ -13,7 +9,6 @@ import { Icon } from 'astro-icon/components'
|
|||||||
import { getCollection } from 'astro:content'
|
import { getCollection } from 'astro:content'
|
||||||
const courses = await getCollection('courses', ({ data }) => data.draft != true)
|
const courses = await getCollection('courses', ({ data }) => data.draft != true)
|
||||||
|
|
||||||
const { ...props } = Astro.props
|
|
||||||
const year = new Date().getFullYear()
|
const year = new Date().getFullYear()
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
---
|
---
|
||||||
import { Picture } from 'astro:assets'
|
import { Picture } from 'astro:assets'
|
||||||
import { Faq } from '~/components/Faq'
|
|
||||||
import { StarIcon, ClockIcon } from '@heroicons/react/24/outline'
|
|
||||||
import { CheckBadgeIcon, LockClosedIcon } from '@heroicons/react/24/solid'
|
|
||||||
import { Icon } from 'astro-icon/components'
|
import { Icon } from 'astro-icon/components'
|
||||||
import Layout from '~/layouts/Layout.astro'
|
import Layout from '~/layouts/Layout.astro'
|
||||||
import Container from '~/components/Container.astro'
|
import Container from '~/components/Container.astro'
|
||||||
@@ -13,9 +10,9 @@ import Natura from '~/components/logos/Natura.astro'
|
|||||||
import Nissan from '~/components/logos/Nissan.astro'
|
import Nissan from '~/components/logos/Nissan.astro'
|
||||||
import Manserv from '~/components/logos/Manserv.astro'
|
import Manserv from '~/components/logos/Manserv.astro'
|
||||||
|
|
||||||
import placeholder from '~/assets/placeholder.png'
|
import placeholder from './_assets/placeholder.png'
|
||||||
import mulherdenegocios from '~/assets/mulher-de-negocios.png'
|
import mulherdenegocios from './_assets/mulher-de-negocios.png'
|
||||||
import homemdenegocios from '~/assets/homem-de-negocios.png'
|
import homemdenegocios from './_assets/homem-de-negocios.png'
|
||||||
|
|
||||||
import { getCollection, getEntry } from 'astro:content'
|
import { getCollection, getEntry } from 'astro:content'
|
||||||
|
|
||||||
@@ -42,7 +39,7 @@ const trainer = data.course?.trainer ? await getEntry(data.course?.trainer) : nu
|
|||||||
</Fragment>
|
</Fragment>
|
||||||
|
|
||||||
<Layout>
|
<Layout>
|
||||||
<div class="space-y-6 lg:space-y-24">
|
<section class="space-y-6 lg:space-y-24">
|
||||||
<Container class="lg:flex items-center justify-start gap-6 max-lg:pt-6">
|
<Container class="lg:flex items-center justify-start gap-6 max-lg:pt-6">
|
||||||
<Picture
|
<Picture
|
||||||
src={data?.img ? data.img : placeholder}
|
src={data?.img ? data.img : placeholder}
|
||||||
@@ -66,12 +63,12 @@ const trainer = data.course?.trainer ? await getEntry(data.course?.trainer) : nu
|
|||||||
</p>
|
</p>
|
||||||
<ul class="lg:flex gap-3">
|
<ul class="lg:flex gap-3">
|
||||||
<li class="flex gap-1">
|
<li class="flex gap-1">
|
||||||
<ClockIcon className="w-5" />
|
<Icon name="clock" class="size-5" />
|
||||||
<span>Carga horária de {data.course.hours} horas</span>
|
<span>Carga horária de {data.course.hours} horas</span>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="flex gap-1">
|
<li class="flex gap-1">
|
||||||
<CheckBadgeIcon className="w-5 fill-blue-400" />
|
<Icon name="check-badge" class="size-5 text-blue-400" />
|
||||||
<span>
|
<span>
|
||||||
Certificado com assinatura digital
|
Certificado com assinatura digital
|
||||||
<a href="#certificado" class="text-blue-400 *:hover:underline">
|
<a href="#certificado" class="text-blue-400 *:hover:underline">
|
||||||
@@ -90,25 +87,25 @@ const trainer = data.course?.trainer ? await getEntry(data.course?.trainer) : nu
|
|||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
href="http://bit.ly/3RlROu6"
|
href="http://bit.ly/3RlROu6"
|
||||||
class="flex flex-col hover:outline rounded outline-offset-3"
|
class="flex flex-col hover:outline rounded outline-offset-2"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
<div class="flex items-center gap-1">
|
<div class="flex items-center gap-1">
|
||||||
<span class="font-bold">4.7</span>
|
<span class="font-bold">4.7</span>
|
||||||
<ul class="flex">
|
<ul class="flex">
|
||||||
<li>
|
<li>
|
||||||
<StarIcon className="w-4 text-yellow-500 fill-yellow-500" />
|
<Icon name="star" class="size-4 text-yellow-500" />
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<StarIcon className="w-4 text-yellow-500 fill-yellow-500" />
|
<Icon name="star" class="size-4 text-yellow-500" />
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<StarIcon className="w-4 text-yellow-500 fill-yellow-500" />
|
<Icon name="star" class="size-4 text-yellow-500" />
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<StarIcon className="w-4 text-yellow-500 fill-yellow-500" />
|
<Icon name="star" class="size-4 text-yellow-500" />
|
||||||
</li>
|
</li>
|
||||||
<li><StarIcon className="w-4" /></li>
|
<li><Icon name="star" class="size-4 text-gray-500" /></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<span>66 avaliações no Google</span>
|
<span>66 avaliações no Google</span>
|
||||||
@@ -170,6 +167,7 @@ const trainer = data.course?.trainer ? await getEntry(data.course?.trainer) : nu
|
|||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
|
||||||
|
<!-- Course Modules -->
|
||||||
<Container id="modulos" class="grid gap-2.5 lg:grid-cols-3 lg:gap-5 2xl:w-3/6">
|
<Container id="modulos" class="grid gap-2.5 lg:grid-cols-3 lg:gap-5 2xl:w-3/6">
|
||||||
<div class="space-y-2.5">
|
<div class="space-y-2.5">
|
||||||
<h4 class="text-pretty text-4xl lg:text-5xl">Módulos deste curso</h4>
|
<h4 class="text-pretty text-4xl lg:text-5xl">Módulos deste curso</h4>
|
||||||
@@ -179,10 +177,35 @@ const trainer = data.course?.trainer ? await getEntry(data.course?.trainer) : nu
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="lg:col-span-2 flex flex-col gap-1.5">
|
<div class="lg:col-span-2 flex flex-col gap-1.5">
|
||||||
<Faq topics={data.course.modules} client:load />
|
{
|
||||||
|
data.course.modules.map((summary) => (
|
||||||
|
<details class="bg-white/10 rounded-lg w-full px-5 py-3 open:bg-white/15 open:[&_svg]:-rotate-180">
|
||||||
|
<summary class="cursor-pointer flex items-center justify-between">
|
||||||
|
<span>{summary}</span>
|
||||||
|
<Icon
|
||||||
|
name="chevron"
|
||||||
|
class="size-4 fill-white/60 group-data-[hover]:fill-white/50 shrink-0"
|
||||||
|
/>
|
||||||
|
</summary>
|
||||||
|
<div class="text-sm/6 text-white/70 space-y-2 mt-2">
|
||||||
|
<p>
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet neque id
|
||||||
|
libero semper vulputate a ut ex. Pellentesque semper ultrices mi in efficitur.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Nulla sit amet quam eu neque convallis volutpat. Pellentesque eu commodo sem.
|
||||||
|
Suspendisse ac lobortis massa, ac mattis mauris. Integer malesuada bibendum ante,
|
||||||
|
sed consequat augue convallis et.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
))
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
<!-- Course Modules End -->
|
||||||
|
|
||||||
|
<!-- Trainer -->
|
||||||
{
|
{
|
||||||
trainer && (
|
trainer && (
|
||||||
<Container>
|
<Container>
|
||||||
@@ -219,12 +242,14 @@ const trainer = data.course?.trainer ? await getEntry(data.course?.trainer) : nu
|
|||||||
</Container>
|
</Container>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
<!-- Trainer End -->
|
||||||
|
|
||||||
|
<!-- Cert -->
|
||||||
<Container id="certificado">
|
<Container id="certificado">
|
||||||
<div
|
<div
|
||||||
class="text-black bg-linear-to-t from-lime-600 to-lime-400 border border-lime-400 p-5 lg:py-36 rounded-2xl relative overflow-hidden"
|
class="text-black bg-linear-to-t from-lime-600 to-lime-400 border border-lime-400 p-5 lg:py-36 rounded-2xl relative overflow-hidden"
|
||||||
>
|
>
|
||||||
<LockClosedIcon className="w-96 absolute -right-16 -bottom-16 text-black/10 max-lg:hidden" />
|
<Icon name="lock-closed" class="w-96 absolute -right-16 -bottom-16 text-black/10 max-lg:hidden" />
|
||||||
|
|
||||||
<div class="lg:w-8/12 2xl:w-6/14 mx-auto space-y-5">
|
<div class="lg:w-8/12 2xl:w-6/14 mx-auto space-y-5">
|
||||||
<h6 class="text-4xl lg:text-6xl/14 lg:font-black">
|
<h6 class="text-4xl lg:text-6xl/14 lg:font-black">
|
||||||
@@ -238,7 +263,6 @@ const trainer = data.course?.trainer ? await getEntry(data.course?.trainer) : nu
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
<!-- Cert End -->
|
||||||
<!-- <Form client:load /> -->
|
</section>
|
||||||
</div>
|
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 300 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
@@ -15,7 +15,9 @@ export async function getStaticPaths() {
|
|||||||
const { post } = Astro.props
|
const { post } = Astro.props
|
||||||
---
|
---
|
||||||
|
|
||||||
<title slot="head">{post.title.rendered}</title>
|
<Fragment slot="head">
|
||||||
|
<title>{post.title.rendered}</title>
|
||||||
|
</Fragment>
|
||||||
|
|
||||||
<Layout>
|
<Layout>
|
||||||
<Container>
|
<Container>
|
||||||
|
|||||||