Skip to content

Commit b3d55c1

Browse files
authored
Merge pull request #140 from posit-dev/enh-improve-homepage
enh: improve homepage
2 parents 9eb527f + e2e8abe commit b3d55c1

6 files changed

Lines changed: 928 additions & 41 deletions

File tree

great-docs.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ logo:
3939

4040
favicon: assets/favicon.svg
4141

42+
# Hero Section
43+
# ------------
44+
# The large header area on the homepage with logo, name, and tagline.
45+
hero:
46+
enabled: true
47+
tagline: "Documentation sites for Python packages. Three commands. Zero friction."
48+
starfield: true
49+
4250
# Versioned Documentation
4351
# -----------------------
4452
# Publish multiple versions of the site from a single source tree.

great_docs/assets/great-docs.scss

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3963,13 +3963,67 @@ html:not(.theme-loaded) *::after {
39633963
body[data-page="index"] .column-margin {
39643964
grid-column: body-end / page-end !important;
39653965
}
3966+
3967+
/* In dark mode every container gets an opaque --gd-bg-primary background
3968+
that hides the fixed starfield canvas (z-index: -1). On the homepage
3969+
we punch all those layers transparent so the canvas shows through.
3970+
body/html keep their backgrounds — they sit BELOW the canvas in the
3971+
root stacking context and provide the base dark colour where the
3972+
canvas mask fades out. */
3973+
body.gd-homepage.quarto-dark #quarto-content,
3974+
body.gd-homepage.quarto-dark main.content,
3975+
body.gd-homepage.quarto-dark #quarto-document-content,
3976+
body.gd-homepage.quarto-dark .quarto-body-content,
3977+
body.gd-homepage.quarto-dark .page-columns,
3978+
body.gd-homepage.quarto-dark .page-rows-contents,
3979+
body.gd-homepage.quarto-dark .column-body,
3980+
body.gd-homepage.quarto-dark article,
3981+
body.gd-homepage.quarto-dark section {
3982+
background-color: transparent;
3983+
}
39663984
}
39673985

39683986
/* ── Hero Section ─────────────────────────────────────── */
39693987

3988+
/* Prevent horizontal scrollbar from the 100vw starfield canvas */
3989+
.gd-homepage {
3990+
overflow-x: clip;
3991+
}
3992+
39703993
.gd-hero {
39713994
text-align: center;
39723995
padding: 2.5rem 1rem 2rem;
3996+
position: relative;
3997+
overflow: visible;
3998+
}
3999+
4000+
/* Starfield canvas: breaks out of the hero to cover the full viewport width
4001+
and extends above into the navbar area and below into body content.
4002+
Uses fixed positioning relative to the viewport so Quarto's grid layout
4003+
doesn't clip or offset it. */
4004+
#gd-starfield {
4005+
position: fixed;
4006+
top: 0;
4007+
left: 0;
4008+
width: 100vw;
4009+
height: 100vh;
4010+
pointer-events: none; /* let clicks pass through to page content */
4011+
z-index: 0;
4012+
transition: opacity 0.15s ease-out;
4013+
mask-image: linear-gradient(to bottom, black 35%, transparent 85%);
4014+
-webkit-mask-image: linear-gradient(to bottom, black 35%, transparent 85%);
4015+
}
4016+
4017+
/* Re-enable pointer events only on the homepage hero area so the
4018+
dark-mode starfield can track the cursor there. */
4019+
.gd-hero #gd-starfield {
4020+
pointer-events: auto;
4021+
}
4022+
4023+
/* Everything in the hero except the canvas must sit above it */
4024+
.gd-hero > *:not(#gd-starfield) {
4025+
position: relative;
4026+
z-index: 1;
39734027
}
39744028

39754029
/* When a column-margin sidebar is present, Quarto adds page-full to <main>
@@ -4047,6 +4101,217 @@ html[data-bs-theme="dark"] .navbar-logo.dark-content { display: inline !importa
40474101
margin-top: 0.5rem !important;
40484102
}
40494103

4104+
/* ── CTA Cards ("Go Further" section) ─────────────────── */
4105+
4106+
.gd-cta-grid {
4107+
display: grid;
4108+
grid-template-columns: repeat(3, 1fr);
4109+
gap: 1.25rem;
4110+
margin: 1.5rem 0 2rem;
4111+
}
4112+
4113+
.gd-cta-card {
4114+
display: flex;
4115+
flex-direction: column;
4116+
align-items: flex-start;
4117+
padding: 1.5rem;
4118+
border-radius: 12px;
4119+
border: 1px solid rgba(0, 0, 0, 0.08);
4120+
background: linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(248, 249, 250, 0.7));
4121+
text-decoration: none !important;
4122+
color: inherit !important;
4123+
transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
4124+
position: relative;
4125+
overflow: hidden;
4126+
4127+
&:hover {
4128+
transform: translateY(-3px);
4129+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
4130+
border-color: rgba(0, 0, 0, 0.15);
4131+
}
4132+
4133+
&:hover .gd-cta-arrow {
4134+
transform: translateX(4px);
4135+
opacity: 1;
4136+
}
4137+
}
4138+
4139+
.gd-cta-icon {
4140+
font-size: 2rem;
4141+
margin-bottom: 0.75rem;
4142+
line-height: 1;
4143+
}
4144+
4145+
.gd-cta-title {
4146+
font-size: 1.15rem;
4147+
font-weight: 600;
4148+
margin-bottom: 0.4rem;
4149+
line-height: 1.3;
4150+
}
4151+
4152+
.gd-cta-desc {
4153+
font-size: 0.9rem;
4154+
line-height: 1.5;
4155+
color: #6c757d;
4156+
flex-grow: 1;
4157+
}
4158+
4159+
.gd-cta-arrow {
4160+
font-size: 1.25rem;
4161+
margin-top: 0.75rem;
4162+
opacity: 0.4;
4163+
transition: transform 0.2s ease, opacity 0.2s ease;
4164+
font-weight: 600;
4165+
}
4166+
4167+
/* Dark mode CTA cards */
4168+
body.quarto-dark .gd-cta-card {
4169+
border-color: rgba(255, 255, 255, 0.1);
4170+
background: linear-gradient(135deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.02));
4171+
4172+
&:hover {
4173+
border-color: rgba(255, 255, 255, 0.2);
4174+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
4175+
}
4176+
}
4177+
4178+
body.quarto-dark .gd-cta-desc {
4179+
color: #adb5bd;
4180+
}
4181+
4182+
@media (max-width: 768px) {
4183+
.gd-cta-grid {
4184+
grid-template-columns: 1fr;
4185+
gap: 1rem;
4186+
}
4187+
}
4188+
4189+
/* ── Feature Wall ("And So Much More") ────────────────── */
4190+
4191+
.gd-feature-wall {
4192+
margin: 3rem 0 2rem;
4193+
hyphens: auto;
4194+
-webkit-hyphens: auto;
4195+
overflow-wrap: break-word;
4196+
}
4197+
4198+
.gd-fw-heading {
4199+
text-align: center;
4200+
font-weight: 700;
4201+
margin-bottom: 1.5rem;
4202+
letter-spacing: -0.01em;
4203+
}
4204+
4205+
.gd-fw-large,
4206+
.gd-fw-medium,
4207+
.gd-fw-small {
4208+
text-align: justify;
4209+
text-justify: inter-word;
4210+
}
4211+
4212+
.gd-fw-large {
4213+
font-size: 1.65rem;
4214+
line-height: 1.45;
4215+
margin-bottom: 0.6rem;
4216+
letter-spacing: -0.01em;
4217+
}
4218+
4219+
.gd-fw-medium {
4220+
font-size: 1.15rem;
4221+
line-height: 1.55;
4222+
margin-bottom: 0.5rem;
4223+
}
4224+
4225+
.gd-fw-small {
4226+
font-size: 0.88rem;
4227+
line-height: 1.65;
4228+
}
4229+
4230+
/* Dim the middle-dot separators slightly */
4231+
.gd-feature-wall b {
4232+
font-weight: 650;
4233+
}
4234+
4235+
@media (max-width: 768px) {
4236+
.gd-fw-large {
4237+
font-size: 1.35rem;
4238+
}
4239+
.gd-fw-medium {
4240+
font-size: 1.05rem;
4241+
}
4242+
.gd-fw-small {
4243+
font-size: 0.82rem;
4244+
}
4245+
}
4246+
4247+
/* ── Feature Wall Closing ─────────────────────────────── */
4248+
4249+
.gd-fw-rule {
4250+
border: none;
4251+
height: 2px;
4252+
margin: 3rem auto 2rem;
4253+
max-width: 30rem;
4254+
background: linear-gradient(
4255+
90deg,
4256+
transparent,
4257+
var(--gd-accent, #6366f1) 25%,
4258+
var(--gd-accent-secondary, #a855f7) 50%,
4259+
var(--gd-accent, #6366f1) 75%,
4260+
transparent
4261+
);
4262+
background-size: 200% 100%;
4263+
animation: gd-rule-shimmer 4s ease-in-out infinite;
4264+
opacity: 0.7;
4265+
}
4266+
4267+
@keyframes gd-rule-shimmer {
4268+
0% { background-position: 100% 0; }
4269+
50% { background-position: 0% 0; }
4270+
100% { background-position: 100% 0; }
4271+
}
4272+
4273+
.gd-fw-closing {
4274+
text-align: center;
4275+
padding: 0 1.5rem 2.5rem;
4276+
max-width: 38rem;
4277+
margin: 0 auto;
4278+
position: relative;
4279+
z-index: 1;
4280+
}
4281+
4282+
.gd-fw-closing p {
4283+
font-size: 1.05rem;
4284+
line-height: 1.7;
4285+
color: #6b7280;
4286+
margin: 0;
4287+
}
4288+
4289+
body.quarto-dark .gd-fw-closing p {
4290+
color: #9ca3af;
4291+
}
4292+
4293+
.gd-fw-closing a {
4294+
color: var(--gd-accent, #6366f1);
4295+
text-decoration: none;
4296+
font-weight: 600;
4297+
border-bottom: 1px solid transparent;
4298+
transition: border-color 0.2s ease;
4299+
}
4300+
4301+
.gd-fw-closing a:hover {
4302+
border-bottom-color: var(--gd-accent, #6366f1);
4303+
}
4304+
4305+
@media (max-width: 768px) {
4306+
.gd-fw-rule {
4307+
max-width: 80%;
4308+
margin: 2rem auto 1.5rem;
4309+
}
4310+
.gd-fw-closing p {
4311+
font-size: 0.95rem;
4312+
}
4313+
}
4314+
40504315
/* ── Hero Responsive ──────────────────────────────────── */
40514316

40524317
@media (max-width: 768px) {

0 commit comments

Comments
 (0)