Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -621,3 +621,109 @@ h4{font-size:18px;line-height:1.3}
.mock-lightbox-arrow svg{width:22px;height:22px;}
.mock-lightbox-prev{left:20px;}
.mock-lightbox-next{right:20px;}

/* ================================================================
Vistas nuevas: hero compartido (vn-) y FAQ (faq-)
================================================================ */
/* ---------- Hero compartido por ambas vistas ---------- */
.vn-hero{padding:76px 0 60px;position:relative;overflow:hidden;border-bottom:1px solid var(--line)}
.vn-hero h1{font-size:56px;max-width:17ch;letter-spacing:-.035em;line-height:1.04}
.vn-hero h1 em{color:var(--brand);font-style:normal}
.vn-hero .lead{margin-top:22px;font-size:19px;max-width:64ch}
.vn-hero .eyebrow{margin-bottom:16px}

/* ---------- Barra de herramientas (buscador + filtros) ---------- */
.vn-tools{display:flex;gap:14px;margin-top:32px;flex-wrap:wrap;align-items:center}
.vn-search{position:relative;flex:1 1 300px;max-width:400px}
.vn-search input{width:100%;padding:10px 14px 10px 38px;border:1px solid var(--line-2);border-radius:var(--r);font-family:var(--sans);font-size:14px;background:var(--bg);color:var(--ink)}
.vn-search input::placeholder{color:var(--ink-4)}
.vn-search input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(44,122,255,.14)}
.vn-search .vn-search-ico{position:absolute;left:13px;top:50%;transform:translateY(-50%);width:15px;height:15px;color:var(--ink-4);pointer-events:none}
.vn-chips{display:flex;gap:8px;flex-wrap:wrap}
.vn-chip{font-family:var(--mono);font-size:11.5px;letter-spacing:.03em;padding:7px 12px;border-radius:999px;border:1px solid var(--line);background:var(--surface);color:var(--ink-2);cursor:pointer;transition:background .15s,border-color .15s,color .15s}
.vn-chip:hover{border-color:var(--line-2);color:var(--ink)}
.vn-chip.is-on{background:var(--brand);border-color:var(--brand);color:#fff}
.vn-count{font-family:var(--mono);font-size:11.5px;color:var(--ink-4);margin-left:auto}
.vn-empty{border:1px dashed var(--line-2);border-radius:var(--r-lg);padding:48px 24px;text-align:center;color:var(--ink-3);font-size:14.5px}

/* ============================================================
FAQ
============================================================ */
.faq-layout{display:grid;grid-template-columns:212px 1fr;gap:56px;align-items:start}
.faq-side{position:sticky;top:88px}
.faq-side h5{font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--ink-3);font-weight:500;margin-bottom:12px}
.faq-side a{display:flex;justify-content:space-between;gap:8px;padding:8px 10px;border-radius:var(--r-sm);font-size:13.5px;color:var(--ink-2);transition:background .15s,color .15s}
.faq-side a:hover{background:var(--surface);color:var(--ink)}
.faq-side a.is-active{background:var(--surface);color:var(--ink);font-weight:500}
.faq-side a b{font-family:var(--mono);font-size:11px;font-weight:500;color:var(--ink-4)}
.faq-side-foot{margin-top:24px;padding-top:18px;border-top:1px dashed var(--line);font-size:13px;color:var(--ink-3);line-height:1.5}
.faq-side-foot a{display:inline;padding:0;color:var(--brand-on);text-decoration:underline;text-underline-offset:2px}

.faq-block{margin-bottom:52px;scroll-margin-top:84px}
.faq-block:last-child{margin-bottom:0}
.faq-block-head{padding-bottom:14px;border-bottom:1px solid var(--line)}
.faq-block-head .ey{font-family:var(--mono);font-size:11px;letter-spacing:.07em;color:var(--brand);font-weight:500;margin-bottom:6px}
.faq-block-head h3{font-size:22px;color:var(--ink)}
.faq-block-head p{font-size:14px;color:var(--ink-3);margin-top:6px;max-width:60ch}
.faq-block.c-install .ey{color:var(--datasets-deep)}
.faq-block.c-privacy .ey{color:var(--generative-deep)}
.faq-block.c-extend .ey{color:var(--plugins-deep)}

.faq-item{border-bottom:1px solid var(--line)}
.faq-item summary{list-style:none;cursor:pointer;display:flex;gap:14px;align-items:flex-start;padding:17px 0;font-size:16px;font-weight:500;color:var(--ink);line-height:1.35;transition:color .15s}
.faq-item summary::-webkit-details-marker{display:none}
.faq-item summary:hover{color:var(--brand-on)}
.faq-item summary:focus-visible{outline:2px solid var(--brand);outline-offset:3px;border-radius:var(--r-sm)}
.faq-sign{flex:0 0 auto;width:20px;height:20px;margin-top:3px;border-radius:6px;border:1px solid var(--line-2);display:grid;place-items:center;color:var(--ink-3);transition:transform .2s,background .15s,border-color .15s,color .15s}
.faq-sign svg{width:10px;height:10px}
.faq-item[open] .faq-sign{background:var(--brand);border-color:var(--brand);color:#fff;transform:rotate(45deg)}
.faq-q{flex:1}
.faq-answer{padding:0 0 22px 34px;color:var(--ink-2);font-size:15px;line-height:1.6;max-width:74ch}
.faq-answer p+p{margin-top:12px}
.faq-answer ul{margin:12px 0 0;padding-left:18px}
.faq-answer li{margin-bottom:7px}
.faq-answer strong{color:var(--ink);font-weight:500}
.faq-answer a{color:var(--brand-on);text-decoration:underline;text-underline-offset:2px}
.faq-answer code{font-family:var(--mono);background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:4px;padding:1px 6px;font-size:12.5px}

/* pasos por sistema operativo dentro de una respuesta */
.faq-os{margin-top:16px;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:var(--bg)}
.faq-os+.faq-os{margin-top:14px}
.faq-os-head{display:flex;align-items:center;gap:9px;padding:10px 14px;background:var(--surface);border-bottom:1px solid var(--line);font-family:var(--mono);font-size:11px;letter-spacing:.07em;color:var(--ink-2);font-weight:500}
.faq-os-head svg{width:14px;height:14px;flex-shrink:0;color:var(--ink-2)}
.faq-os ol{margin:0;padding:14px 16px 14px 32px}
.faq-os li{margin-bottom:9px;font-size:14.5px;line-height:1.5;padding-left:2px}
.faq-os li:last-child{margin-bottom:0}
.faq-os li::marker{font-family:var(--mono);font-size:12px;color:var(--ink-4)}
.faq-note{margin-top:16px;padding:12px 14px;border-radius:var(--r);background:var(--datasets-soft);border:1px solid #f6cdb2;color:var(--datasets-deep);font-size:13.5px;line-height:1.5}

/* CTA final del FAQ */
.faq-cta{background:var(--ink-bg);color:var(--ink-text);border-radius:var(--r-xl);padding:48px;display:grid;grid-template-columns:1.1fr .9fr;gap:48px;align-items:center;margin-top:8px}
.faq-cta h2{color:var(--ink-text);font-size:32px}
.faq-cta h2 .blue{color:var(--brand-light)}
.faq-cta p{color:var(--ink-text-2);margin-top:14px;font-size:15.5px;line-height:1.55;max-width:46ch}
.faq-cta-links{display:grid;gap:10px}
.faq-cta-link{display:flex;align-items:center;gap:14px;padding:14px 16px;border:1px solid var(--ink-line);border-radius:var(--r);transition:border-color .15s,background .15s}
.faq-cta-link:hover{border-color:var(--brand);background:rgba(44,122,255,.08)}
.faq-cta-link .t{font-size:14.5px;color:var(--ink-text)}
.faq-cta-link .t span{display:block;font-size:12.5px;color:var(--ink-text-2);margin-top:2px}
.faq-cta-link svg{width:16px;height:16px;flex-shrink:0;color:var(--brand-light)}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

@media (max-width:980px){
.vn-hero{padding:56px 0 44px}
.vn-hero h1{font-size:42px}
.vn-hero .lead{font-size:17px}
.faq-layout{grid-template-columns:1fr;gap:32px}
.faq-side{position:static}
.faq-side nav{display:flex;gap:8px;overflow-x:auto;padding-bottom:6px}
.faq-side nav a{white-space:nowrap;border:1px solid var(--line);border-radius:999px}
.faq-side-foot{display:none}
.faq-cta{grid-template-columns:1fr;gap:28px;padding:32px}
}
@media (max-width:640px){
.vn-hero h1{font-size:34px}
.faq-answer{padding-left:0}
.faq-cta{padding:24px}
.vn-count{margin-left:0;width:100%}
}
11 changes: 11 additions & 0 deletions app/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ import footerPT from "../public/locales/pt/footer.json"
import footerDE from "../public/locales/de/footer.json"
import footerZH from "../public/locales/zh/footer.json"

import faqEN from "../public/locales/en/faq.json"
import faqES from "../public/locales/es/faq.json"
import faqPT from "../public/locales/pt/faq.json"
import faqDE from "../public/locales/de/faq.json"
import faqZH from "../public/locales/zh/faq.json"

i18n
.use(initReactI18next)
.init({
Expand All @@ -70,6 +76,7 @@ i18n
community: communityES,
about: aboutES,
footer: footerES,
faq: faqES,
},
en: {
navbar: navbarEN,
Expand All @@ -81,6 +88,7 @@ i18n
community: communityEN,
about: aboutEN,
footer: footerEN,
faq: faqEN,
},
pt: {
navbar: navbarPT,
Expand All @@ -92,6 +100,7 @@ i18n
community: communityPT,
about: aboutPT,
footer: footerPT,
faq: faqPT,
},
de: {
navbar: navbarDE,
Expand All @@ -103,6 +112,7 @@ i18n
community: communityDE,
about: aboutDE,
footer: footerDE,
faq: faqDE,
},
zh: {
navbar: navbarZH,
Expand All @@ -114,6 +124,7 @@ i18n
community: communityZH,
about: aboutZH,
footer: footerZH,
faq: faqZH,
},
},
supportedLngs: ["es", "en", "pt", "de", "zh"],
Expand Down
3 changes: 3 additions & 0 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ import { DownloadRoute } from '@/components/community/routes/DownloadRoute'
import { PluginsRoute } from '@/components/community/routes/PluginsRoute'
import { CommunityRoute } from '@/components/community/routes/CommunityRoute'
import { AboutRoute } from '@/components/community/routes/AboutRoute'
import { FaqRoute } from '@/components/community/routes/FaqRoute'
import i18n from '@/app/i18n'

function getRouteFromHash(hash: string): { route: string; isSubAnchor: boolean } {
const rawHash = (hash || '#home').replace(/^#/, '') || 'home'
if (rawHash.startsWith('faq-')) return { route: 'faq', isSubAnchor: true }
const isSubAnchor = rawHash === 'first-pr' || rawHash.startsWith('guide-')
return { route: isSubAnchor ? 'contribute' : rawHash, isSubAnchor }
}
Expand Down Expand Up @@ -81,6 +83,7 @@ export default function Page() {
{route === 'download' && <DownloadRoute />}
{route === 'plugins' && <PluginsRoute />}
{route === 'community' && <CommunityRoute />}
{route === 'faq' && <FaqRoute />}
{route === 'about' && <AboutRoute />}
<Footer />
</>
Expand Down
3 changes: 3 additions & 0 deletions components/community/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ export function Footer() {
<li>
<a href="#contribute">{t('ft.cont')}</a>
</li>
<li>
<a href="#faq">{t('ft.faq')}</a>
</li>
<li>
<a
href="https://github.com/DashAISoftware/dashAI/blob/production/CHANGELOG.rst"
Expand Down
3 changes: 2 additions & 1 deletion components/community/Navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import '@/app/i18n'
import { useStats } from '@/lib/useStats'

type Lang = 'es' | 'en' | 'pt' | 'de' | 'zh'
type Route = 'home' | 'models' | 'plugins' | 'contribute' | 'download' | 'community' | 'about'
type Route = 'home' | 'models' | 'plugins' | 'contribute' | 'download' | 'community' | 'faq' | 'about'


const NAV_LINKS: { key: Route; i18nKey: string }[] = [
Expand All @@ -16,6 +16,7 @@ const NAV_LINKS: { key: Route; i18nKey: string }[] = [
{ key: 'contribute', i18nKey: 'nav.contribute' },
{ key: 'community', i18nKey: 'nav.community' },
{ key: 'plugins', i18nKey: 'nav.plugins' },
{ key: 'faq', i18nKey: 'nav.faq' },
{ key: 'about', i18nKey: 'nav.about' },
]

Expand Down
Loading
Loading