From e8679f92defed0ff4b8ba6613b2d1b08553ad8f1 Mon Sep 17 00:00:00 2001 From: iliya Date: Mon, 12 Oct 2026 23:00:34 +0300 Subject: [PATCH 01/10] fix(landing): improve responsive hero and plugin discovery --- landing/assets/styles/registry.scss | 117 +++++++---- landing/components/registry/HeroDemoVideo.vue | 31 +++ landing/components/registry/RegistryHero.vue | 104 +++++----- landing/locales/ar.json | 3 +- landing/locales/en.json | 3 +- landing/locales/es.json | 3 +- landing/locales/fr.json | 3 +- landing/locales/hi.json | 3 +- landing/locales/pt.json | 3 +- landing/locales/ru.json | 3 +- landing/locales/uk.json | 3 +- landing/locales/zh.json | 3 +- landing/nuxt.config.ts | 2 + landing/plugins/scroll-reveal.client.ts | 6 +- landing/tests/browser/hero-layout.spec.ts | 181 ++++++++++++++++++ 15 files changed, 369 insertions(+), 99 deletions(-) create mode 100644 landing/components/registry/HeroDemoVideo.vue create mode 100644 landing/tests/browser/hero-layout.spec.ts diff --git a/landing/assets/styles/registry.scss b/landing/assets/styles/registry.scss index 14a441700..92d727aeb 100644 --- a/landing/assets/styles/registry.scss +++ b/landing/assets/styles/registry.scss @@ -324,11 +324,52 @@ img { .hero__plugin-count { font-variant-numeric: tabular-nums; } -.hero__demo { +.hero__install { position: relative; isolation: isolate; } +.hero-demo-video { + width: min(100%, 320px); + margin: 0 auto 12px; + aspect-ratio: 16 / 9; + position: relative; + overflow: hidden; + border: 1px solid var(--line-strong); + border-radius: 12px; + background: var(--surface-solid); + box-shadow: 0 12px 32px rgba(0, 0, 0, 0.18); +} +.hero-demo-video img, +.hero-demo-video iframe { + width: 100%; + height: 100%; + display: block; + border: 0; + object-fit: cover; +} +.hero-demo-video button { + position: absolute; + inset: 0; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + border: 0; + color: #fff; + background: rgba(4, 7, 15, 0.34); + cursor: pointer; + font-weight: 750; +} +.hero-demo-video button svg { + width: 30px; + height: 30px; + padding: 6px; + border-radius: 50%; + background: rgba(4, 7, 15, 0.82); +} + .hero__window { position: relative; z-index: 1; @@ -369,11 +410,17 @@ img { .hero-quick-start__step { padding: 15px 0; display: grid; - grid-template-columns: 28px 112px minmax(0, 1fr); - gap: 12px; - align-items: center; + grid-template-columns: minmax(0, 1fr); + gap: 8px; + align-items: stretch; border-bottom: 1px solid var(--line); } +.hero-quick-start__caption { + min-width: 0; + display: flex; + align-items: center; + gap: 10px; +} .hero-quick-start__number { width: 26px; height: 26px; @@ -393,6 +440,9 @@ img { .hero-quick-start__label small { display: block; } +.hero-quick-start__label { + min-width: 0; +} .hero-quick-start__label strong { color: var(--text); font-size: 0.75rem; @@ -403,6 +453,7 @@ img { font-size: 0.6rem; } .hero-quick-start__step .app-multiselect__trigger { + width: 100%; min-height: 48px; padding-inline: 12px; } @@ -412,6 +463,11 @@ img { .hero-quick-start__step .command-snippet { min-width: 0; } +.hero-quick-start__step .command-snippet--inline pre { + overflow-x: visible; + white-space: pre-wrap; + overflow-wrap: break-word; +} .hero-quick-start__command { min-width: 0; } @@ -431,22 +487,6 @@ img { .hero-quick-start__more-install:focus-visible { color: var(--cyan); } -.hero-quick-start__footer { - padding: 13px 0 0 152px; - display: grid; - gap: 6px; -} -.hero-quick-start__footer p { - margin: 0; - color: var(--subtle); - font-size: 0.62rem; -} -.hero-quick-start__footer span { - margin-right: 5px; - color: var(--green); - font-size: 0.75rem; - font-weight: 900; -} .preview-banner { padding: 9px 20px; border-bottom: 1px solid color-mix(in srgb, var(--coral) 55%, var(--line)); @@ -686,12 +726,16 @@ img { margin: 0; padding: 0; display: grid; - grid-template-columns: repeat(11, minmax(0, 1fr)); + grid-template-columns: repeat(14, minmax(0, 1fr)); list-style: none; } .client-strip li { + grid-column: span 2; min-width: 0; } +.client-strip li:nth-child(n + 8) { + transform: translateX(50%); +} .client-strip li > a { min-height: 72px; @@ -735,11 +779,9 @@ img { line-height: 1.2; } .client-strip__copy strong { - overflow: hidden; color: var(--text); font-size: 0.62rem; - text-overflow: ellipsis; - white-space: nowrap; + overflow-wrap: anywhere; } .client-strip__copy small { color: var(--subtle); @@ -1801,7 +1843,7 @@ img { gap: 10px; } .plugin-card__identity--with-ribbon { - padding-right: 102px; + padding-right: 92px; } .plugin-card__identity-copy { min-width: 0; @@ -1871,8 +1913,8 @@ img { position: absolute; top: 14px; right: 14px; - min-width: 104px; - padding: 6px 9px 6px 11px; + min-width: fit-content; + padding: 5px 8px; border: 1px solid color-mix(in srgb, var(--primary) 45%, var(--line)); border-radius: 999px; color: var(--primary-bright); @@ -1888,6 +1930,7 @@ img { letter-spacing: 0.045em; text-align: center; text-transform: none; + white-space: nowrap; } .plugin-card__ribbon::after { content: none; @@ -2772,7 +2815,7 @@ img { margin: 25px auto 0; } .client-strip { - grid-template-columns: repeat(6, minmax(0, 1fr)); + grid-template-columns: repeat(14, minmax(0, 1fr)); } .plugin-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); @@ -2854,15 +2897,6 @@ img { .hero-quick-start__header { align-items: flex-start; } - .hero-quick-start__step { - grid-template-columns: 28px minmax(0, 1fr); - } - .hero-quick-start__step > :last-child { - grid-column: 1 / -1; - } - .hero-quick-start__footer { - padding-left: 0; - } .hero-quick-start__step .app-multiselect__trigger { width: 100%; } @@ -2894,6 +2928,15 @@ img { .client-strip { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .client-strip li { + grid-column: auto; + } + .client-strip li:nth-child(n + 8) { + transform: none; + } + .client-strip li:last-child { + grid-column: 2; + } .client-strip li > a { min-height: 66px; } diff --git a/landing/components/registry/HeroDemoVideo.vue b/landing/components/registry/HeroDemoVideo.vue new file mode 100644 index 000000000..5671be6fe --- /dev/null +++ b/landing/components/registry/HeroDemoVideo.vue @@ -0,0 +1,31 @@ + + +