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

Xuanwo pushed a commit to branch xuanwo/website-redesign
in repository https://gitbox.apache.org/repos/asf/opendal.git

commit 8628c070e15c49e039d72545f940b6a129546cd8
Author: Xuanwo <[email protected]>
AuthorDate: Fri May 29 22:03:30 2026 +0800

    feat(website): add adopter logo wall
    
    Add a "Used by" logo wall of real OpenDAL adopters taken from the core
    and binding users lists, ordered by GitHub star count and rendered as
    grayscale org logos (self-hosted under static/img/users/) that colorize
    on hover. The wall shows a responsive count by viewport (4/6/8) and an
    "+ add your logo" link to the users list.
    
    Also show the Java quickstart dependency as a plain Maven coordinate
    instead of a Gradle-specific implementation(...) line.
---
 website/src/components/landing/data.js           |  27 +++++---
 website/src/components/landing/sections.jsx      |  32 +++++++--
 website/src/components/landing/styles.module.css |  82 +++++++++++++++++++----
 website/static/img/users/databend.png            | Bin 0 -> 13146 bytes
 website/static/img/users/dify.png                | Bin 0 -> 7467 bytes
 website/static/img/users/filecodebox.png         | Bin 0 -> 53339 bytes
 website/static/img/users/milvus.png              | Bin 0 -> 15620 bytes
 website/static/img/users/questdb.png             | Bin 0 -> 26479 bytes
 website/static/img/users/risingwave.png          | Bin 0 -> 6252 bytes
 website/static/img/users/sccache.png             | Bin 0 -> 4701 bytes
 website/static/img/users/vector.png              | Bin 0 -> 48196 bytes
 11 files changed, 111 insertions(+), 30 deletions(-)

diff --git a/website/src/components/landing/data.js 
b/website/src/components/landing/data.js
index 78c82c455..dbd7e0588 100644
--- a/website/src/components/landing/data.js
+++ b/website/src/components/landing/data.js
@@ -142,18 +142,25 @@ export const valueProps = [
   },
 ];
 
-// Real adopters, drawn from the project vision. Rendered as a wordmark wall.
-export const adopters = [
-  { name: "Databend", href: "https://github.com/databendlabs/databend"; },
-  { name: "RisingWave", href: "https://github.com/risingwavelabs/risingwave"; },
-  { name: "GreptimeDB", href: "https://github.com/GreptimeTeam/greptimedb"; },
-  { name: "Apache Iceberg Rust", href: 
"https://github.com/apache/iceberg-rust"; },
-  { name: "Vector", href: "https://github.com/vectordotdev/vector"; },
-  { name: "sccache", href: "https://github.com/mozilla/sccache"; },
-  { name: "Pants", href: "https://github.com/pantsbuild/pants"; },
-  { name: "Shuttle", href: "https://github.com/shuttle-hq/shuttle"; },
+// Real adopters from the project's users lists (core + bindings), ordered by
+// GitHub star count (highest first). Logos are the projects' GitHub org
+// avatars, self-hosted under static/img/users/. Refresh with scripts as the
+// ecosystem grows. The logo wall shows a responsive subset by viewport width.
+export const usedBy = [
+  { name: "Dify", icon: "/img/users/dify.png", href: 
"https://github.com/langgenius/dify"; },
+  { name: "Milvus", icon: "/img/users/milvus.png", href: 
"https://github.com/milvus-io/milvus"; },
+  { name: "Vector", icon: "/img/users/vector.png", href: 
"https://github.com/vectordotdev/vector"; },
+  { name: "QuestDB", icon: "/img/users/questdb.png", href: 
"https://github.com/questdb/questdb"; },
+  { name: "Databend", icon: "/img/users/databend.png", href: 
"https://github.com/databendlabs/databend"; },
+  { name: "RisingWave", icon: "/img/users/risingwave.png", href: 
"https://github.com/risingwavelabs/risingwave"; },
+  { name: "FileCodeBox", icon: "/img/users/filecodebox.png", href: 
"https://github.com/vastsa/FileCodeBox"; },
+  { name: "sccache", icon: "/img/users/sccache.png", href: 
"https://github.com/mozilla/sccache"; },
 ];
 
+// Where people add their own project (PR to the users list).
+export const USERS_LIST_URL =
+  "https://github.com/apache/opendal/blob/main/core/users.md";;
+
 // Curated, icon-backed slice of the 50+ supported services, grouped by family.
 export const serviceGroups = [
   {
diff --git a/website/src/components/landing/sections.jsx 
b/website/src/components/landing/sections.jsx
index f553ca2f7..c506c1d49 100644
--- a/website/src/components/landing/sections.jsx
+++ b/website/src/components/landing/sections.jsx
@@ -29,7 +29,8 @@ import {
   heroStats,
   codeSamples,
   valueProps,
-  adopters,
+  usedBy,
+  USERS_LIST_URL,
   serviceGroups,
   bindings,
   layers,
@@ -99,16 +100,33 @@ export function Hero() {
 }
 
 export function UsedBy() {
+  const { withBaseUrl } = useBaseUrlUtils();
   return (
     <section className={styles.usedBy}>
       <div className="odl-container">
-        <div className={styles.usedByLabel}>
-          <span className="odl-eyebrow">Trusted in production by</span>
+        <div className={styles.usedByHead}>
+          <span className="odl-eyebrow">Used by</span>
+          <Link className={styles.addLogo} to={USERS_LIST_URL}>
+            + add your logo
+          </Link>
         </div>
-        <div className={styles.usedByTrack}>
-          {adopters.map((a) => (
-            <Link key={a.name} className={styles.adopter} to={a.href}>
-              {a.name}
+        <div className={styles.logoWall}>
+          {usedBy.map((u) => (
+            <Link
+              key={u.name}
+              className={styles.logoItem}
+              to={u.href}
+              title={u.name}
+            >
+              <img
+                className={styles.logoMark}
+                src={withBaseUrl(u.icon)}
+                alt=""
+                width="24"
+                height="24"
+                loading="lazy"
+              />
+              <span className={styles.logoName}>{u.name}</span>
             </Link>
           ))}
         </div>
diff --git a/website/src/components/landing/styles.module.css 
b/website/src/components/landing/styles.module.css
index edf7b5d05..d50ef2ee0 100644
--- a/website/src/components/landing/styles.module.css
+++ b/website/src/components/landing/styles.module.css
@@ -277,29 +277,85 @@
   padding-block: clamp(2.25rem, 1.5rem + 3vw, 3.25rem);
   border-top: 1px solid var(--odl-border);
 }
-.usedByLabel {
-  text-align: center;
-  margin-bottom: var(--odl-space-5);
+/* Top row: "Used by" eyebrow (left) + "+ add your logo" (right) over a rule */
+.usedByHead {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: var(--odl-space-4);
+  padding-bottom: var(--odl-space-4);
+  border-bottom: 1px solid var(--odl-border);
 }
-.usedByTrack {
+.addLogo {
+  font-family: var(--odl-font-mono);
+  font-size: var(--odl-text-xs);
+  letter-spacing: 0.04em;
+  color: var(--odl-fg-subtle);
+  text-decoration: none;
+  white-space: nowrap;
+  transition: color var(--odl-dur) var(--odl-ease);
+}
+.addLogo:hover {
+  color: var(--odl-accent);
+  text-decoration: none;
+}
+/* Logo wall: grayscale adopter logos that color on hover. Logos are sorted by
+   GitHub stars; the count shown adapts to viewport width via the nth-child
+   rules below (4 → 6 → 8). */
+.logoWall {
   display: flex;
   flex-wrap: wrap;
   align-items: center;
-  justify-content: center;
-  gap: var(--odl-space-4) var(--odl-space-7);
+  justify-content: space-between;
+  gap: var(--odl-space-5) var(--odl-space-6);
+  margin-top: var(--odl-space-6);
 }
-.adopter {
+.logoItem {
+  display: inline-flex;
+  align-items: center;
+  gap: var(--odl-space-3);
+  text-decoration: none;
+  filter: grayscale(1);
+  opacity: 0.62;
+  transition: opacity var(--odl-dur) var(--odl-ease),
+    filter var(--odl-dur) var(--odl-ease);
+}
+.logoItem:hover {
+  filter: grayscale(0);
+  opacity: 1;
+  text-decoration: none;
+}
+.logoMark {
+  width: 26px;
+  height: 26px;
+  object-fit: contain;
+  border-radius: var(--odl-radius-sm);
+  flex: none;
+}
+.logoName {
   font-family: var(--odl-font-mono);
-  font-size: var(--odl-text-md);
+  font-size: var(--odl-text-sm);
   font-weight: 500;
   color: var(--odl-fg-muted);
-  text-decoration: none;
-  transition: color var(--odl-dur) var(--odl-ease);
   white-space: nowrap;
 }
-.adopter:hover {
-  color: var(--odl-fg-strong);
-  text-decoration: none;
+
+/* Responsive count: 4 on mobile, 6 on tablet, 8 on desktop. */
+.logoItem:nth-child(n + 5) {
+  display: none;
+}
+@media (min-width: 600px) {
+  .logoItem:nth-child(n + 5) {
+    display: inline-flex;
+  }
+  .logoItem:nth-child(n + 7) {
+    display: none;
+  }
+}
+@media (min-width: 980px) {
+  .logoItem:nth-child(n + 7) {
+    display: inline-flex;
+  }
 }
 
 /* ===== Value props ====================================================== */
diff --git a/website/static/img/users/databend.png 
b/website/static/img/users/databend.png
new file mode 100644
index 000000000..27fface5c
Binary files /dev/null and b/website/static/img/users/databend.png differ
diff --git a/website/static/img/users/dify.png 
b/website/static/img/users/dify.png
new file mode 100644
index 000000000..d08be7198
Binary files /dev/null and b/website/static/img/users/dify.png differ
diff --git a/website/static/img/users/filecodebox.png 
b/website/static/img/users/filecodebox.png
new file mode 100644
index 000000000..ba251b3d8
Binary files /dev/null and b/website/static/img/users/filecodebox.png differ
diff --git a/website/static/img/users/milvus.png 
b/website/static/img/users/milvus.png
new file mode 100644
index 000000000..8e3e38be8
Binary files /dev/null and b/website/static/img/users/milvus.png differ
diff --git a/website/static/img/users/questdb.png 
b/website/static/img/users/questdb.png
new file mode 100644
index 000000000..1ae55a66a
Binary files /dev/null and b/website/static/img/users/questdb.png differ
diff --git a/website/static/img/users/risingwave.png 
b/website/static/img/users/risingwave.png
new file mode 100644
index 000000000..aed6574ee
Binary files /dev/null and b/website/static/img/users/risingwave.png differ
diff --git a/website/static/img/users/sccache.png 
b/website/static/img/users/sccache.png
new file mode 100644
index 000000000..070e3df52
Binary files /dev/null and b/website/static/img/users/sccache.png differ
diff --git a/website/static/img/users/vector.png 
b/website/static/img/users/vector.png
new file mode 100644
index 000000000..8420ae221
Binary files /dev/null and b/website/static/img/users/vector.png differ

Reply via email to