This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git


The following commit(s) were added to refs/heads/master by this push:
     new 73460a68c5d [feature] Add Doris Summit 26 promotion (#4007)
73460a68c5d is described below

commit 73460a68c5d4c01abff75b3a40b686ee1624d04c
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Wed Jul 22 19:37:03 2026 +0800

    [feature] Add Doris Summit 26 promotion (#4007)
    
    ## Summary
    
    - add a Doris Summit 26 navbar action that opens the official event site
    in a new tab
    - add responsive mobile presentation, subtle shimmer motion, and
    reduced-motion support
    - add a Doris Summit 26 section below Join Slack in the community nudge,
    while keeping the docs issue section last on documentation pages
    - update mobile sticky offsets and the Ask Me modal clearance for the
    taller navbar
    
    ## Validation
    
    - `node --test
    src/components/home-next/SlackCommunityNudge.logic.test.js`
    - `git diff --check`
    - full build not run
    
    ---------
    
    Co-authored-by: morningman <[email protected]>
---
 src/components/home-next/NavbarNext.scss          | 214 ++++++++++++++++------
 src/components/home-next/NavbarNext.tsx           |  10 +
 src/components/home-next/SlackCommunityNudge.scss |  29 ++-
 src/components/home-next/SlackCommunityNudge.tsx  |  37 +++-
 src/theme/DocItem/Layout/styles.module.css        |   8 +-
 static/js/custom-script.js                        |  10 +-
 6 files changed, 240 insertions(+), 68 deletions(-)

diff --git a/src/components/home-next/NavbarNext.scss 
b/src/components/home-next/NavbarNext.scss
index dbfc93c5dab..58b711c40b9 100644
--- a/src/components/home-next/NavbarNext.scss
+++ b/src/components/home-next/NavbarNext.scss
@@ -9,6 +9,7 @@
     --nb-cream-light: #FAF6EE;
     --nb-yellow: #FFD23F;
     --nb-ink: #0F1A14;
+    --nb-summit-cyan: #00F0FF;
 
     position: sticky;
     top: var(--home-next-banner-height, 0px);
@@ -261,6 +262,60 @@
         }
     }
 
+    &__summit {
+        position: relative;
+        isolation: isolate;
+        display: inline-flex;
+        align-items: center;
+        justify-content: center;
+        box-sizing: border-box;
+        height: 32px;
+        overflow: hidden;
+        padding: 0 14px;
+        border: 1px solid rgba(17, 166, 121, 0.55);
+        border-radius: 4px;
+        background: rgba(17, 166, 121, 0.18);
+        color: var(--nb-cream-light) !important;
+        text-decoration: none !important;
+        white-space: nowrap;
+        @include type.mono-text(12px, 700, 1.2, 0.02em);
+        animation: navbar-next-summit-breathe 2.8s ease-in-out infinite;
+        transition: border-color 0.2s, background-color 0.2s, box-shadow 0.2s, 
color 0.2s, transform 0.2s;
+
+        span {
+            position: relative;
+            z-index: 1;
+        }
+
+        &::after {
+            content: '';
+            position: absolute;
+            z-index: 0;
+            top: -2px;
+            bottom: -2px;
+            left: -45%;
+            width: 32%;
+            transform: skewX(-18deg);
+            background: linear-gradient(90deg, transparent, rgba(0, 240, 255, 
0.62), transparent);
+            animation: navbar-next-summit-sweep 3.6s ease-in-out infinite;
+            will-change: transform;
+            pointer-events: none;
+        }
+
+        &:hover {
+            border-color: rgba(17, 166, 121, 0.85);
+            background: rgba(17, 166, 121, 0.28);
+            color: var(--nb-cream-light) !important;
+            text-decoration: none !important;
+            transform: translateY(-1px);
+        }
+
+        &:focus-visible {
+            outline: 2px solid rgba(17, 166, 121, 0.85);
+            outline-offset: 2px;
+        }
+    }
+
     &__star-link {
         display: inline-flex;
         align-items: center;
@@ -440,6 +495,20 @@
             padding: 0.5rem 0.55rem;
             font-size: 12px;
         }
+
+        // The extra Summit action needs more horizontal room than the old
+        // action group, so switch to the menu before controls can collide.
+        &__nav {
+            display: none;
+        }
+
+        &__menu-button {
+            display: inline-flex;
+        }
+
+        &--mobile-open &__mobile-panel {
+            display: block;
+        }
     }
 }
 
@@ -450,16 +519,66 @@
             gap: 14px;
         }
 
-        &__nav {
-            display: none;
+    }
+}
+
+// Tablet and phone layouts keep the utility controls on row 1, then give
+// Summit and Ask Me a dedicated full-width row each.
+@media (max-width: 768px) {
+    .navbar-next {
+        &.navbar {
+            height: auto;
+            min-height: 64px;
+        }
+
+        &__inner {
+            flex-wrap: wrap;
+            height: auto;
+            column-gap: 5px;
+            row-gap: 0;
+            align-items: center;
+        }
+
+        &__logo {
+            height: 64px;
+        }
+
+        // Expose the action children to the wrapping navbar layout.
+        &__actions {
+            display: contents;
+        }
+
+        &__star-link {
+            margin-left: auto;
         }
 
         &__menu-button {
-            display: inline-flex;
+            margin-left: 0;
         }
 
-        &--mobile-open &__mobile-panel {
-            display: block;
+        &__summit,
+        &__ask-ai {
+            flex: 0 0 100%;
+            width: 100%;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            height: 38px;
+            margin-left: 0;
+            margin-bottom: 10px;
+            padding: 0 12px;
+        }
+
+        &__summit {
+            order: 9;
+        }
+
+        &__ask-ai {
+            order: 10;
+        }
+
+        &__mobile-panel {
+            max-height: calc(100vh - 160px);
         }
     }
 }
@@ -501,28 +620,12 @@
     }
 }
 
-// On narrow phones (≤480px): row 1 = Logo (left) + Star + Download + ☰ 
(right, as a group),
-// row 2 = Ask AI full-width centered.
-// Only minimal padding trimming — no font-size or height overrides.
+// On narrow phones, trim row-1 spacing while preserving the two full-width
+// campaign rows established at the 768px breakpoint.
 @media (max-width: 480px) {
     .navbar-next {
-        &.navbar {
-            height: auto;
-            min-height: 64px;
-        }
-
         &__inner {
-            flex-wrap: wrap;
-            height: auto;
             padding: 0 10px;
-            column-gap: 5px;
-            row-gap: 0;
-            align-items: center;
-        }
-
-        // Logo link spans the full row-1 height; image slightly smaller to 
reclaim space.
-        &__logo {
-            height: 64px;
         }
 
         &__logo img {
@@ -532,37 +635,6 @@
         // Trim star-link horizontal padding (only change needed to make 
everything fit).
         &__star-link {
             padding: 0 8px 0 6px;
-            // Right-anchor the Star+Download+☰ group. Since `__actions` 
collapses
-            // to `display: contents` below, Star is the first member of the
-            // right-side group and inherits the auto-margin job from 
__actions.
-            margin-left: auto;
-        }
-
-        // Collapse `__actions` so its children (Ask Me, Star, Download) become
-        // flex children of `__inner` directly. This lets Ask Me wrap to its 
own
-        // full-width second row via `flex: 0 0 100%; order: 10` below — which
-        // is impossible while it's nested inside a non-wrapping flex 
container.
-        &__actions {
-            display: contents;
-        }
-
-        // Hamburger follows actions naturally — no extra margin needed.
-        &__menu-button {
-            margin-left: 0;
-        }
-
-        // Ask Me: full-width second row, icon + text centered both axes.
-        &__ask-ai {
-            order: 10;
-            flex: 0 0 100%;
-            width: 100%;
-            display: flex;
-            justify-content: center;
-            align-items: center;
-            height: 38px;
-            margin-left: 0;
-            margin-bottom: 10px;
-            padding: 0 12px;
         }
     }
 }
@@ -575,3 +647,37 @@
         }
     }
 }
+
+@keyframes navbar-next-summit-breathe {
+    0%,
+    100% {
+        scale: 1;
+    }
+
+    50% {
+        scale: 1.018;
+    }
+}
+
+@keyframes navbar-next-summit-sweep {
+    0%,
+    45% {
+        transform: translateX(0) skewX(-18deg);
+    }
+
+    75%,
+    100% {
+        transform: translateX(520%) skewX(-18deg);
+    }
+}
+
+@media (prefers-reduced-motion: reduce) {
+    .navbar-next__summit,
+    .navbar-next__summit::after {
+        animation: none;
+    }
+
+    .navbar-next__summit:hover {
+        transform: none;
+    }
+}
diff --git a/src/components/home-next/NavbarNext.tsx 
b/src/components/home-next/NavbarNext.tsx
index 95dd70cf37d..ad658a03cd1 100644
--- a/src/components/home-next/NavbarNext.tsx
+++ b/src/components/home-next/NavbarNext.tsx
@@ -8,6 +8,7 @@ import './NavbarNext.scss';
 
 const GITHUB_REPO = 'apache/doris';
 const STAR_DISPLAY = `${STAR_COUNT}k`;
+const DORIS_SUMMIT_URL = 'https://apache-doris-summit.org/';
 
 interface DropdownItem {
     label: string;
@@ -181,6 +182,15 @@ export function NavbarNext(): JSX.Element {
                 </div>
 
                 <div className="navbar-next__actions">
+                    <a
+                        href={DORIS_SUMMIT_URL}
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        className="navbar-next__summit"
+                        aria-label="Visit Doris Summit 2026 (opens in a new 
tab)"
+                    >
+                        <span>Doris Summit 26</span>
+                    </a>
                     <button
                         type="button"
                         id="navbar-ask-ai-btn"
diff --git a/src/components/home-next/SlackCommunityNudge.scss 
b/src/components/home-next/SlackCommunityNudge.scss
index 5d8dd000ae6..55c227551f2 100644
--- a/src/components/home-next/SlackCommunityNudge.scss
+++ b/src/components/home-next/SlackCommunityNudge.scss
@@ -185,7 +185,8 @@
             outline-offset: 3px;
         }
 
-        &--feedback {
+        &--feedback,
+        &--summit {
             min-height: 36px;
             border-color: rgba(6, 128, 95, 0.32);
             background: rgba(255, 255, 255, 0.56);
@@ -201,6 +202,28 @@
         }
     }
 
+    &__summit {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        gap: 12px;
+        margin-top: 16px;
+        padding-top: 14px;
+        border-top: 1px solid rgba(6, 128, 95, 0.16);
+    }
+
+    &__summit-title {
+        margin: 0 0 4px;
+        color: var(--sn-ink);
+        @include type.mono-text(14px, 800, 1.25, 0);
+    }
+
+    &__summit-meta {
+        margin: 0;
+        color: rgba(15, 26, 20, 0.68);
+        @include type.sans-text(12.5px, 400, 1.35);
+    }
+
     &__docs-feedback {
         margin-top: 16px;
         padding-top: 14px;
@@ -323,6 +346,10 @@
             font-size: 12.5px;
         }
 
+        &__summit {
+            align-items: flex-start;
+        }
+
         &__benefits {
             gap: 6px;
             margin-bottom: 13px;
diff --git a/src/components/home-next/SlackCommunityNudge.tsx 
b/src/components/home-next/SlackCommunityNudge.tsx
index 4af2a0ecf3a..22a9102aa5a 100644
--- a/src/components/home-next/SlackCommunityNudge.tsx
+++ b/src/components/home-next/SlackCommunityNudge.tsx
@@ -11,6 +11,7 @@ import {
 import './SlackCommunityNudge.scss';
 
 const SLACK_URL = 'https://doris.apache.org/slack';
+const DORIS_SUMMIT_URL = 'https://apache-doris-summit.org/';
 const DOCS_FEEDBACK_URL = 'https://github.com/apache/doris-website/issues/364';
 const STORAGE_KEY = 'doris-home-slack-nudge-dismissed';
 const ECOSYSTEM_TARGET_ID = 'home-next-ecosystem';
@@ -220,16 +221,16 @@ export function SlackCommunityNudge(): JSX.Element {
         <aside
             className={`slack-community-nudge${isOpen ? ' 
slack-community-nudge--open' : ''}`}
             aria-label={showDocsFeedback
-                ? 'Apache Doris community and documentation resources'
-                : 'Apache Doris Slack community invitation'}
+                ? 'Apache Doris community, Summit, and documentation resources'
+                : 'Apache Doris community and Summit resources'}
         >
             <div className="slack-community-nudge__bubble" 
aria-hidden={!isOpen}>
                 <button
                     type="button"
                     className="slack-community-nudge__close"
                     aria-label={showDocsFeedback
-                        ? 'Dismiss community and documentation prompt'
-                        : 'Dismiss Slack invitation'}
+                        ? 'Dismiss community, Summit, and documentation prompt'
+                        : 'Dismiss community and Summit prompt'}
                     onClick={dismissAutoPrompt}
                     tabIndex={isOpen ? undefined : -1}
                 >
@@ -262,6 +263,30 @@ export function SlackCommunityNudge(): JSX.Element {
                     <SlackGlyph />
                     Join Slack
                 </a>
+                <section
+                    className="slack-community-nudge__summit"
+                    aria-labelledby="slack-community-nudge-summit-title"
+                >
+                    <div>
+                        <p id="slack-community-nudge-summit-title" 
className="slack-community-nudge__summit-title">
+                            Doris Summit 26
+                        </p>
+                        <p className="slack-community-nudge__summit-meta">
+                            October 21–22 · Virtual event
+                        </p>
+                    </div>
+                    <a
+                        className="slack-community-nudge__cta 
slack-community-nudge__cta--summit"
+                        href={DORIS_SUMMIT_URL}
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        onClick={dismissAutoPrompt}
+                        tabIndex={isOpen ? undefined : -1}
+                    >
+                        Explore Summit
+                        <span aria-hidden="true">↗</span>
+                    </a>
+                </section>
                 {showDocsFeedback && (
                     <section
                         className="slack-community-nudge__docs-feedback"
@@ -297,8 +322,8 @@ export function SlackCommunityNudge(): JSX.Element {
                 ref={mascotRef}
                 aria-expanded={isOpen}
                 aria-label={showDocsFeedback
-                    ? `${isOpen ? 'Hide' : 'Open'} community and documentation 
resources`
-                    : `${isOpen ? 'Hide' : 'Open'} Slack invitation`}
+                    ? `${isOpen ? 'Hide' : 'Open'} community, Summit, and 
documentation resources`
+                    : `${isOpen ? 'Hide' : 'Open'} community and Summit 
resources`}
                 onClick={() => setIsOpen(open => !open)}
             >
                 <img
diff --git a/src/theme/DocItem/Layout/styles.module.css 
b/src/theme/DocItem/Layout/styles.module.css
index e4b1d8fe267..49a67db70ae 100644
--- a/src/theme/DocItem/Layout/styles.module.css
+++ b/src/theme/DocItem/Layout/styles.module.css
@@ -31,8 +31,8 @@
 
 /* Freeze the search/locale/menu toolbar + breadcrumb at the top on mobile
    so they remain reachable while scrolling. Sits just below the sticky
-   green NavbarNext (64px tall; ~112px when Ask AI wraps to a second row
-   at ≤480px). z-index stays under the navbar (300) but above content. */
+   green NavbarNext (64px tall; 160px when Summit and Ask Me wrap to their
+   own rows at ≤768px). z-index stays under the navbar (300) but above 
content. */
 @media (max-width: 996px) {
   .mobileStickyHeader {
     position: sticky;
@@ -51,8 +51,8 @@
   }
 }
 
-@media (max-width: 480px) {
+@media (max-width: 768px) {
   .mobileStickyHeader {
-    top: 112px;
+    top: 160px;
   }
 }
diff --git a/static/js/custom-script.js b/static/js/custom-script.js
index f98227d45e5..a89d8790168 100644
--- a/static/js/custom-script.js
+++ b/static/js/custom-script.js
@@ -11,7 +11,7 @@
     y.parentNode.insertBefore(t, y);
 })(window, document, 'clarity', 'script', 'kfyqejiz0g');
 
-// Position the Kapa Ask Me modal below the sticky NavbarNext (64px tall).
+// Position the Kapa Ask Me modal below the sticky NavbarNext.
 // Kapa renders inside a Shadow DOM on `#kapa-widget-container`, so light-DOM
 // CSS can't reach it. We inject a <style> into the shadow root and re-inject
 // if Kapa rebuilds it.
@@ -22,8 +22,8 @@
 // `align-items: center` once content exceeds the viewport.
 (function centerKapaModal() {
     var STYLE_ID = 'doris-kapa-center-modal';
-    // Top padding clears the 64px sticky NavbarNext + 16px gap so the modal
-    // header is never tucked under the navbar when content fills the screen.
+    // Top padding clears the sticky NavbarNext + 16px gap so the modal header
+    // is never tucked under the navbar when content fills the screen.
     var CSS_TEXT =
         '.mantine-Modal-inner{' +
         'align-items:flex-start !important;' +
@@ -46,6 +46,10 @@
         'flex:1 1 auto !important;' +
         'min-height:0 !important;' +
         'overflow-y:auto !important;' +
+        '}' +
+        '@media(max-width:768px){' +
+        '.mantine-Modal-inner{padding-top:176px !important;}' +
+        '.mantine-Modal-content{max-height:calc(100vh - 176px - 2rem) 
!important;}' +
         '}';
 
     function inject() {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to