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 b4c66cfe7e8 [chore](download) withdraw the 4.1.4 binaries; add 
version-choice, upgrade-notes and archive links under the quick download card 
(#4155)
b4c66cfe7e8 is described below

commit b4c66cfe7e8d7bb9cbd22550cd4476216f886689
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Sun Sep 20 11:52:30 2026 +0800

    [chore](download) withdraw the 4.1.4 binaries; add version-choice, 
upgrade-notes and archive links under the quick download card (#4155)
    
    ## Summary
    
    Two changes to `/download/`. The 4.1.4 release notes on `/releases/` are
    **not** touched.
    
    ### 1. Withdraw the Apache Doris 4.1.4 binaries from the download page
    
    - `src/constant/download.data.ts`: drop the 4.1.4 entry from
    `ALL_VERSIONS`, so 4.1.4 disappears from the quick download card, the
    maintained release picker and the archive picker alike.
    `ACTIVE_CORE_BRANCHES` is unchanged; `ACTIVE_HEADS` offers 4.1.3 as
    **Latest** again. (The arm64 row had already been withdrawn in #4133.)
    - `releasenotes/v4.1/release-4.1.4.md`, its zh-CN twin, both `core.md`
    indexes and `sidebarsReleases.json` stay as they are — the release notes
    remain published.
    
    To put 4.1.4 back on the download page later, restore the `ALL_VERSIONS`
    entry from `git show 3e0d5d9adf:src/constant/download.data.ts`.
    
    ### 2. Surface versioning, upgrade notes and the archive under the quick
    download card
    
    The quick download card ended in a single 14px grey sentence that linked
    *release versioning* and *archived*. The archive link was easy to miss,
    and nothing near the download button pointed an upgrading user at the
    per-version upgrade notes.
    
    That sentence becomes a three-tile strip on a hairline at the bottom of
    the card:
    
    | Tile | Links to |
    |---|---|
    | **Which version to choose** — What X.Y.Z means, how Latest differs
    from Stable, and which binary fits your CPU. |
    `/community/release-and-verify/release-versioning` |
    | **Upgrade notes** *(new)* — Per-version precautions to read before
    moving a cluster to a new release. |
    
`/docs/dev/admin-manual/cluster-management/upgrade#per-version-upgrade-notes`
    |
    | **Archived releases** — Older branches receive no further releases of
    any kind, security patches included. | `#archive` (the archive section
    further down the page) |
    
    Each tile is one link: an icon chip, a bold title with an arrow that
    nudges on hover, and a one-line description. The archive tile uses the
    archive zone's drained / ended tones instead of brand green, following
    the page's existing colour rule. Tiles stack into a single column below
    960px.
    
    Files: `src/components/download-form-next/DownloadFormNext.tsx`,
    `download-page.scss`.
    
    ## Validation
    
    - `node --test
    doc-tools/skills/add-release/scripts/validate-release.test.mjs` — 6/6
    passed
    - `validate-release.mjs --component doris-core --version 4.1.3 --series
    4.1 --source-version 4.1.3-rc02 --release-date 2026-07-13 --position
    latest`: all download-data checks pass (4.1.3 is the newest 4.1 patch in
    `ALL_VERSIONS`, all twelve 4.1.3 artifact URLs reachable). The one
    failing check — *v4.1/release-4.1.3 must be the first sidebar item in
    its series* — is expected: 4.1.4 deliberately stays first on the release
    side.
    - Download page rendered with `LANDING_ONLY=true yarn start` at 1280 /
    900 / 390px; hover states and the `#archive` in-page scroll checked in
    headless Chrome
    - `#per-version-upgrade-notes` resolves on the live `docs/dev` upgrade
    page (heading *Per-Version Upgrade Notes*)
    - Scoped `tsc` on the touched component reports only the two
    pre-existing errors (`JSX` namespace, `useRef()`), same as on master
    - `git diff --check` — clean. `yarn build` / `yarn typecheck` were not
    run.
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    ---------
    
    Co-authored-by: morningman <[email protected]>
    Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
---
 .../download-form-next/DownloadFormNext.tsx        |  93 ++++++++++++++-
 .../download-form-next/download-page.scss          | 127 +++++++++++++++++++--
 src/constant/download.data.ts                      |  28 -----
 3 files changed, 207 insertions(+), 41 deletions(-)

diff --git a/src/components/download-form-next/DownloadFormNext.tsx 
b/src/components/download-form-next/DownloadFormNext.tsx
index f7d73b36680..2f5e016328d 100644
--- a/src/components/download-form-next/DownloadFormNext.tsx
+++ b/src/components/download-form-next/DownloadFormNext.tsx
@@ -27,6 +27,7 @@ import { LayoutNext } from 
'@site/src/components/home-next/LayoutNext';
 const KEYS_URL = 'https://downloads.apache.org/doris/KEYS';
 const VERIFY_URL = '/community/release-and-verify/release-verify';
 const VERSIONING_URL = '/community/release-and-verify/release-versioning';
+const UPGRADE_NOTES_URL = 
'/docs/dev/admin-manual/cluster-management/upgrade#per-version-upgrade-notes';
 const SECURITY_URL = '/community/security';
 const ASF_ARCHIVE_URL = 'https://archive.apache.org/dist/doris/';
 
@@ -37,6 +38,58 @@ function releaseNotePath(branch: string, version: string) {
     return `/releases/v${branch}/release-${version}`;
 }
 
+const GUIDE_ICON = { width: 18, height: 18, viewBox: '0 0 18 18', fill: 'none' 
} as const;
+const GUIDE_STROKE = {
+    stroke: 'currentColor',
+    strokeWidth: 1.6,
+    strokeLinecap: 'round',
+    strokeLinejoin: 'round',
+} as const;
+
+/**
+ * What to read next, shown as one strip under the quick download card so the
+ * versioning policy, the per-version upgrade notes and the archive are found
+ * together rather than in a footnote.
+ */
+const GUIDES = [
+    {
+        to: VERSIONING_URL,
+        title: 'Which version to choose',
+        desc: 'What X.Y.Z means, how Latest differs from Stable, and which 
binary fits your CPU.',
+        icon: (
+            <svg {...GUIDE_ICON}>
+                <circle cx="5" cy="4" r="1.8" {...GUIDE_STROKE} />
+                <circle cx="5" cy="14" r="1.8" {...GUIDE_STROKE} />
+                <circle cx="13" cy="5" r="1.8" {...GUIDE_STROKE} />
+                <path d="M5 5.8v6.4M13 6.8c0 3.7-8 1.7-8 5.4" 
{...GUIDE_STROKE} />
+            </svg>
+        ),
+    },
+    {
+        to: UPGRADE_NOTES_URL,
+        title: 'Upgrade notes',
+        desc: 'Per-version precautions to read before moving a cluster to a 
new release.',
+        icon: (
+            <svg {...GUIDE_ICON}>
+                <path d="M9 12.5V3.5M5.5 7 9 3.5 12.5 7" {...GUIDE_STROKE} />
+                <path d="M3.5 11.5v2A1.5 1.5 0 0 0 5 15h8a1.5 1.5 0 0 0 
1.5-1.5v-2" {...GUIDE_STROKE} />
+            </svg>
+        ),
+    },
+    {
+        to: '#archive',
+        title: 'Archived releases',
+        desc: 'Older branches receive no further releases of any kind, 
security patches included.',
+        archive: true,
+        icon: (
+            <svg {...GUIDE_ICON}>
+                <rect x="2.5" y="3.5" width="13" height="3.5" rx="1" 
{...GUIDE_STROKE} />
+                <path d="M4 7v6.5A1.5 1.5 0 0 0 5.5 15h7a1.5 1.5 0 0 0 
1.5-1.5V7M7.5 10.5h3" {...GUIDE_STROKE} />
+            </svg>
+        ),
+    },
+];
+
 export default function DownloadFormNext(): JSX.Element {
     const defaultHead = ACTIVE_HEADS[0];
     const [version, setVersion] = useState<string>(defaultHead?.version ?? '');
@@ -298,11 +351,41 @@ export default function DownloadFormNext(): JSX.Element {
                                 </div>
                             )}
 
-                            <p className="download-next__quick-note">
-                                Apache Doris maintains the two most recent 
minor branches, labelled Latest and Stable —
-                                see <Link to={VERSIONING_URL}>release 
versioning</Link>. Releases from older branches
-                                are <Link to="#archive">archived</Link>.
-                            </p>
+                            <div className="download-next__guides">
+                                {GUIDES.map(guide => (
+                                    <Link
+                                        key={guide.title}
+                                        to={guide.to}
+                                        
className={clsx('download-next__guide', { 'is-archive': guide.archive })}
+                                    >
+                                        <span 
className="download-next__guide-icon" aria-hidden="true">
+                                            {guide.icon}
+                                        </span>
+                                        <span 
className="download-next__guide-body">
+                                            <span 
className="download-next__guide-title">
+                                                {guide.title}
+                                                <svg
+                                                    aria-hidden="true"
+                                                    
xmlns="http://www.w3.org/2000/svg";
+                                                    width="14"
+                                                    height="14"
+                                                    viewBox="0 0 14 14"
+                                                    fill="none"
+                                                >
+                                                    <path
+                                                        d="M2.5 7h9M7.5 3l4 
4-4 4"
+                                                        stroke="currentColor"
+                                                        strokeWidth="1.6"
+                                                        strokeLinecap="round"
+                                                        strokeLinejoin="round"
+                                                    />
+                                                </svg>
+                                            </span>
+                                            <span 
className="download-next__guide-desc">{guide.desc}</span>
+                                        </span>
+                                    </Link>
+                                ))}
+                            </div>
                         </div>
                     </div>
                 </section>
diff --git a/src/components/download-form-next/download-page.scss 
b/src/components/download-form-next/download-page.scss
index 3f71199ecd6..197e7af32ba 100644
--- a/src/components/download-form-next/download-page.scss
+++ b/src/components/download-form-next/download-page.scss
@@ -401,16 +401,103 @@
     font-size: 13px;
 }
 
-.download-next__quick-note {
-    margin: 24px 0 0;
-    text-align: center;
-    color: var(--dl-text-subtle);
-    font-size: 14px;
-    line-height: 1.6;
+// What to read next. Three equal tiles on one hairline, so the versioning
+// policy, the upgrade notes and the archive sit beside the download button
+// instead of in a footnote under it.
+.download-next__guides {
+    display: grid;
+    grid-template-columns: repeat(3, minmax(0, 1fr));
+    gap: 28px 36px;
+    margin-top: 32px;
+    padding-top: 28px;
+    border-top: 1px solid var(--dl-border);
+}
 
-    a {
+.download-next__guide {
+    display: flex;
+    align-items: flex-start;
+    gap: 14px;
+    min-width: 0;
+    color: var(--dl-text);
+    text-decoration: none !important;
+
+    &:hover {
+        color: var(--dl-text);
+    }
+
+    &:hover .download-next__guide-title {
         color: var(--ifm-color-primary);
-        text-decoration: underline;
+    }
+
+    &:hover .download-next__guide-title svg {
+        transform: translateX(3px);
+    }
+
+    &:hover .download-next__guide-icon {
+        background: var(--ifm-color-primary);
+        color: #ffffff;
+    }
+}
+
+.download-next__guide-icon {
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    flex-shrink: 0;
+    width: 38px;
+    height: 38px;
+    border-radius: 8px;
+    background: var(--brand-primary-soft);
+    color: var(--brand-primary-darker);
+    transition:
+        background 0.18s ease,
+        color 0.18s ease;
+}
+
+.download-next__guide-body {
+    display: flex;
+    flex-direction: column;
+    gap: 4px;
+    min-width: 0;
+}
+
+.download-next__guide-title {
+    display: inline-flex;
+    align-items: center;
+    gap: 6px;
+    font-size: 15px;
+    font-weight: 600;
+    line-height: 1.4;
+    color: var(--dl-ink);
+    transition: color 0.18s ease;
+
+    svg {
+        flex-shrink: 0;
+        transition: transform 0.18s ease;
+    }
+}
+
+.download-next__guide-desc {
+    font-size: 13.5px;
+    line-height: 1.55;
+    color: var(--dl-text-muted);
+}
+
+// The archive tile points past the cut where the brand green stops, so it
+// carries the drained tones of that zone rather than the green of this one.
+.download-next__guide.is-archive {
+    .download-next__guide-icon {
+        background: var(--dl-drained-bg);
+        color: var(--dl-drained);
+    }
+
+    &:hover .download-next__guide-title {
+        color: var(--dl-ended);
+    }
+
+    &:hover .download-next__guide-icon {
+        background: var(--dl-ended);
+        color: #ffffff;
     }
 }
 
@@ -855,6 +942,11 @@
         margin-bottom: 0;
     }
 
+    .download-next__guides {
+        grid-template-columns: 1fr;
+        gap: 20px;
+    }
+
     .download-next__archive {
         margin-top: 56px;
         padding: 36px 0 44px;
@@ -941,6 +1033,25 @@
         margin: 6px 0 0;
     }
 
+    .download-next__guides {
+        margin-top: 24px;
+        padding-top: 22px;
+        gap: 18px;
+    }
+
+    .download-next__guide-icon {
+        width: 34px;
+        height: 34px;
+    }
+
+    .download-next__guide-title {
+        font-size: 14.5px;
+    }
+
+    .download-next__guide-desc {
+        font-size: 13px;
+    }
+
     .download-next__section {
         padding: 48px 0 16px;
     }
diff --git a/src/constant/download.data.ts b/src/constant/download.data.ts
index a7229599016..1797a110e9c 100644
--- a/src/constant/download.data.ts
+++ b/src/constant/download.data.ts
@@ -90,34 +90,6 @@ export const ALL_VERSIONS: AllVersionOption[] = [
         label: '4.1',
         value: '4.1',
         children: [
-            {
-                label: '4.1.4',
-                value: '4.1.4',
-                majorVersion: '4.1',
-                items: [
-                    {
-                        label: CPUEnum.X64,
-                        value: CPUEnum.X64,
-                        gz: `${ORIGIN}apache-doris-4.1.4-bin-x64.tar.gz`,
-                        asc: `${ORIGIN}apache-doris-4.1.4-bin-x64.tar.gz.asc`,
-                        sha512: 
`${ORIGIN}apache-doris-4.1.4-bin-x64.tar.gz.sha512`,
-                        source: 
'https://dist.apache.org/repos/dist/release/doris/4.1/4.1.4/',
-                        version: '4.1.4-rc04',
-                    },
-                    {
-                        label: CPUEnum.X64NoAvx2,
-                        value: CPUEnum.X64NoAvx2,
-                        gz: 
`${ORIGIN}apache-doris-4.1.4-bin-x64-noavx2.tar.gz`,
-                        asc: 
`${ORIGIN}apache-doris-4.1.4-bin-x64-noavx2.tar.gz.asc`,
-                        sha512: 
`${ORIGIN}apache-doris-4.1.4-bin-x64-noavx2.tar.gz.sha512`,
-                        source: 
'https://dist.apache.org/repos/dist/release/doris/4.1/4.1.4/',
-                        version: '4.1.4-rc04',
-                    },
-                    // The 4.1.4 arm64 binary was withdrawn because the build 
is
-                    // broken; add the CPUEnum.ARM64 entry back once a fixed
-                    // build is published.
-                ],
-            },
             {
                 label: '4.1.3',
                 value: '4.1.3',


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

Reply via email to